gecko-dev/cmd/winfe/cxwin.h

494 lines
16 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#ifndef __WindowContext_H
// Avoid include redundancy
//
#define __WindowContext_H
// Purpose: Provide an abstract context in a window visible on a screen.
// Comments: Ill named, as the window is actually a view.
// Must be derived from to become useful.
// Revision History:
// 06-25-95 created GAB
//
// Required Includes
//
#include "cxpane.h"
#include "frameglu.h"
#include "xp_core.h"
#include "xp_list.h"
#include "tooltip.h"
class CWinCX : public CPaneCX {
// The view makes a comeback for performance reasons.
// Leave at the top, forces crashers for bad casts in some cases.
private:
CGenericView *m_pGenView;
public:
CGenericView *GetView() { return m_pGenView; }
// Construct, Destruction, Indirect construction
public:
CWinCX(CGenericDoc *pDoc, CFrameGlue *pFrame, CGenericView *pView, MWContextType mwType = MWContextBrowser, ContextType cxType = Window);
~CWinCX();
virtual void DestroyContext();
virtual void Initialize(BOOL bOwnDC, RECT *pRect = NULL, BOOL bInitialPalette = TRUE, BOOL bNewMemDC = TRUE);
// Null frame handling (absence of a frame handling)
public:
static CNullFrame *m_pNullFrame;
static void *m_pExitCookie;
// The view/frame working with this context.
// We own a document (see CDCCX).
// The OLE friend mucks with this.
friend class CInPlaceFrame;
protected:
#ifdef DDRAW
LPDIRECTDRAW m_lpDD; // DirectDraw object
LPDIRECTDRAWSURFACE m_lpDDSPrimary; // DirectDraw primary surface
LPDIRECTDRAWSURFACE m_lpDDSBack; // DirectDraw back surface
LPDIRECTDRAWCLIPPER m_pClipper;
LPDIRECTDRAWCLIPPER m_pOffScreenClipper;
LPDIRECTDRAWPALETTE mg_pPal;
DDSURFACEDESC m_surfDesc;
BOOL m_ScrollWindow;
LTRB m_physicWinRect;
HDC m_offScreenDC;
#endif
CFrameGlue *m_pFrame;
XP_List* imageToolTip;
CNSToolTip *m_ToolTip;
LO_ImageStruct* pLastToolTipImg;
LO_AnchorData* m_pLastToolTipAnchor;
public:
CFrameGlue *GetFrame() const;
void ClearView();
void ClearFrame();
CNSToolTip* CreateToolTip(LO_ImageStruct* pImage, CPoint& point, CL_Layer *layer);
void RelayToolTipEvent(POINT pt, UINT message);
void ClipChildren(CWnd *pWnd, BOOL bSet);
// Palette Access
public:
virtual HPALETTE GetPalette() const;
#ifdef DDRAW
virtual int DisplayPixmap(NI_Pixmap* image, NI_Pixmap* mask, int32 x, int32 y, int32 x_offset, int32 y_offset, int32 width, int32 height, LTRB& Rect);
#endif
// CDC Access
public:
virtual HDC GetDispDC()
{
#ifdef DDRAW
if (m_offScreenDC) return m_offScreenDC;
else return GetContextDC();
#else
return GetContextDC();
#endif
}
#ifdef DDRAW
void CalcWinPos();
int GetWindowsXPos() {return (int)m_physicWinRect.left;}
int GetWindowsYPos() {return (int)m_physicWinRect.top;}
virtual void LockOffscreenSurfDC() { m_lpDDSBack->GetDC(&m_offScreenDC); }
virtual void ReleaseOffscreenSurfDC()
{ if (m_lpDDSBack) m_lpDDSBack->ReleaseDC(m_offScreenDC);}
void ReleaseDrawSurface();
void RestoreAllDrawSurface();
void ScrollWindow(int x, int y);
LPDIRECTDRAWCLIPPER GetClip() {return m_pClipper;}
LPDIRECTDRAWSURFACE GetPrimarySurface() {return m_lpDDSPrimary;}
LPDIRECTDRAWSURFACE GetBackSurface() {return m_lpDDSBack;}
LPDIRECTDRAW GetDrawObj() {return m_lpDD;}
LPDDSURFACEDESC GetSurfDesc() {return &m_surfDesc;}
void SetClipOnDrawSurface(LPDIRECTDRAWSURFACE surface, HRGN hClipRgn);
LPDIRECTDRAWSURFACE CreateOffscreenSurface(RECT& rect);
void CreateAndLockOffscreenSurface(RECT& rect);
void BltToScreen(LTRB& rect, DDBLTFX* fx = NULL);
#endif
void ResetToolTipImg();
// For dialogs
public:
virtual CWnd *GetDialogOwner() const;
// When in layout, we need a special case to detect if we need to reload the document
// if the user resizes the window.
protected:
BOOL m_bIsLayingOut; // Set in LayoutNewDocument and LayoutFinished
public:
BOOL IsLayingOut() const {
return(m_bIsLayingOut);
}
// Can we accept mouse clicks?
BOOL IsClickingEnabled() const;
// Cached mouse hits.
public:
CPoint m_cpLBDClick;
CPoint m_cpLBDown;
CPoint m_cpLBUp;
CPoint m_cpMMove;
CPoint m_cpRBDClick;
CPoint m_cpRBDown;
CPoint m_cpRBUp;
// Mouse state.
public:
enum MouseEvent {
m_None,
m_LBDClick,
m_LBDown,
m_LBUp,
m_MMove,
m_RBDClick,
m_RBDown,
m_RBUp
} m_LastMouseEvent;
UINT m_uMouseFlags;
BOOL m_bLBDown;
BOOL m_bLBUp;
// Timer processing.
public:
BOOL m_bScrollingTimerSet;
BOOL m_bMouseMoveTimerSet;
// Currently selected embedded item, or NULL on none.
public:
LO_EmbedStruct *m_pSelected;
// Last highlighted anchor, NULL if none.
protected:
LO_Element *m_pLastArmedAnchor;
// Window notifications.
// These are pretty much identical to MFC functions names with the added CX
protected:
virtual void AftWMSize(PaneMessage *pMessage);
public:
#ifdef EDITOR
virtual void Scroll(int iBars, UINT uSBCode, UINT uPos, HWND hCtrl, UINT uTimes = 1);
#endif
virtual void OnMoveCX();
virtual void OnDeactivateEmbedCX();
#ifdef LAYERS
virtual BOOL HandleLayerEvent(CL_Layer * pLayer, CL_Event * pEvent);
virtual BOOL HandleEmbedEvent(LO_EmbedStruct *embed, CL_Event * pEvent);
#endif /* LAYERS */
virtual void OnLButtonDblClkCX(UINT uFlags, CPoint cpPoint);
virtual void OnLButtonDownCX(UINT uFlags, CPoint cpPoint);
virtual void OnLButtonUpCX(UINT uFlags, CPoint cpPoint, BOOL &bReturnImmediately);
virtual void OnMouseMoveCX(UINT uFlags, CPoint cpPoint, BOOL &bReturnImmediately);
virtual void OnRButtonDblClkCX(UINT uFlags, CPoint cpPoint);
virtual void OnRButtonDownCX(UINT uFlags, CPoint cpPoint);
virtual void OnRButtonUpCX(UINT uFlags, CPoint cpPoint);
virtual BOOL OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
virtual BOOL OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
#ifdef LAYERS
// These are the per-layer event handlers.
virtual void OnLButtonDblClkForLayerCX(UINT uFlags, CPoint& cpPoint,
XY& xyPoint, CL_Layer *layer);
virtual void OnLButtonDownForLayerCX(UINT uFlags, CPoint& cpPoint,
XY& xyPoint, CL_Layer *layer);
virtual void OnLButtonUpForLayerCX(UINT uFlags, CPoint& cpPoint,
XY& xyPoint, CL_Layer *layer, BOOL &bReturnImmediately);
virtual void OnMouseMoveForLayerCX(UINT uFlags, CPoint& cpPoint,
XY& xyPoint, CL_Layer *layer, BOOL &bReturnImmediately);
virtual BOOL OnRButtonDownForLayerCX(UINT uFlags, CPoint& cpPoint,
XY& xyPoint, CL_Layer *layer);
virtual void OnRButtonDblClkForLayerCX(UINT uFlags, CPoint& cpPoint,
XY& xyPoint, CL_Layer *layer);
virtual void OnRButtonUpForLayerCX(UINT uFlags, CPoint& cpPoint,
XY& xyPoint, CL_Layer *layer);
#endif /* LAYERS */
virtual void OnNcPaintCX();
virtual void OnNcCalcSizeCX(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp);
// This is used to track the window rect between OnSize
// messages. If the actual window rect has not
// changed, then expect that we do not need to
// redraw the view (InValidate/UpdateWindow).
private:
CRect m_crWindowRect;
public:
// Analogous to m_pLastArmedAnchor,
// remember an image we click on
// to do drag n drop to editor
// Public so the view can access it for
// copy-image-to-clipboard
LO_ImageStruct *m_pLastImageObject;
int32 RightMargin() {
return(m_lRightMargin);
}
// URL Retrieval.
public:
virtual int GetUrl(URL_Struct *pUrl, FO_Present_Types iFormatOut, BOOL bReallyLoad = TRUE, BOOL bForceNew = FALSE);
// Progress helpers.
protected:
int32 m_lOldPercent;
public:
int32 QueryProgressPercent();
void StartAnimation();
void StopAnimation();
// #ifdef EDITOR
// Test if screen point, such mouse cursor,
// is within a single selected region.
BOOL PtInSelectedRegion(CPoint cPoint, BOOL bConvertToDocCoordinates = FALSE, CL_Layer *layer = NULL);
BOOL PtInSelectedCell(CPoint &DocPoint, LO_CellStruct *cell,
BOOL &bContinue, LO_Element *start_element,
LO_Element *end_element);
// Flags used during drag/drop
BOOL m_bMouseInSelection;
// Drag current doc URL from the URL Bitmap to whatever
// destination accepts a Bookmark OLE struct or URL text
void DragCurrentURL();
void CopyCurrentURL();
void DragSelection();
// TRUE when we are dragging something from this context
BOOL m_bDragging;
// Browser doesn't need this, but Editor
// does to prevent errant mouse-over message
// which results in wrong cursor for right-button popup menu
BOOL m_bInPopupMenu;
LTRB m_rectSizing;
// Save the time when button goes down to allow
// 1-pixel resizing only if a time threshold
// has been exceeded
time_t m_StartSizingTime;
// Used only in Editor when dragging to select multiple cells
BOOL m_bSelectingCells;
public:
void CancelSizing();
BOOL IsDragging() { return(m_bDragging); }
// Targeted load operations.
public:
CWinCX *DetermineTarget(const char *pTarget);
// Saving what is currently in the frames location bar,
// so we don't go blowing it away.
protected:
CString m_csSaveLocationBarText;
// Funtion to get our view's offset into the frame window.
public:
void GetViewOffsetInFrame(CPoint& cpRetval) const;
// Function to tell the context it is now the active
// context in a frame.
private:
BOOL m_bActiveState;
public:
BOOL IsActive() const {
return(m_bActiveState);
}
void ActivateCX(BOOL bNowActive);
// Modality support.
public:
void GoModal(MWContext *pModalOver);
protected:
CPtrList m_cplModalOver;
// Close callback support.
private:
CPtrList m_cplCloseCallbacks;
CPtrList m_cplCloseCallbackArgs;
public:
void CloseCallback(void (*)(void *), void *);
// Resize and close disabling.
public:
void EnableResize(BOOL bEnable = TRUE);
void EnableClose(BOOL bEnable = TRUE);
// Wether or not our size was determined via chrome.
public:
BOOL m_bSizeIsChrome;
//Z order locking
void SetZOrder(BOOL bZLock = FALSE, BOOL bBottommost = FALSE);
void DisableHotkeys(BOOL bDisable = FALSE);
// Wether or not we attempt to draw a border.
private:
BOOL m_bHasBorder;
public:
void SetBorder(BOOL bBorder) {
m_bHasBorder = bBorder;
}
// How to correclty handle mouse entering element
// regions and reporting this to the backend.
// Note: The element pointers are not valid after relayout -
// must call ClearLastElemen() just before or after a relayout
protected:
BOOL m_bLastOverTextSet;
LO_Element *m_pLastOverElement;
LO_AnchorData *m_pLastOverAnchorData;
LO_Element *m_pStartSelectionCell;
//#ifndef NO_TAB_NAVIGATION
public :
void ClearLastElement() {m_pLastOverElement = NULL; m_pLastOverAnchorData = NULL; m_pStartSelectionCell = NULL;}
int32 getLastFocusAreaIndex();
LO_AnchorData *CWinCX::getLastFocusAnchorPointer();
char *CWinCX::getLastFocusAnchorStr();
LO_TabFocusData * CWinCX::getLastTabFocusData();
LO_Element *CWinCX::getLastTabFocusElement();
int CWinCX::invalidateSegmentedTextElement( LO_TabFocusData *pNextTabFocus, int forward );
void CWinCX::setFormElementTabFocus( LO_Element * pFormElement );
void CWinCX::invalidateElement( LO_Element *pElement );
BOOL CWinCX::setTabFocusNext( int forward ); // try myself and then siblings
BOOL CWinCX::setNextTabFocusInWin( int forward ); // only in myself
BOOL CWinCX::setTabFocusNextChild( MWContext *currentChildContext, int forward ); // as a parent, try other children
BOOL CWinCX::fireTabFocusElement( UINT nChar); // WPARAM vKey );
int CWinCX::setTextTabFocusDrawFlag( LO_TextStruct *pText, uint32 *pFlag );
int CWinCX::getImageDrawFlag(MWContext *context, LO_ImageStruct *pImage, lo_MapAreaRec **ppArea, uint32 *pFlag );
void CWinCX::DisplayFeedback(MWContext *pContext, int iLocation, LO_Element *pElement);
private :
void CWinCX::SetActiveWindow();
void CWinCX::setLastTabFocusElement( LO_TabFocusData *pNextTabFocus, int needSetFocus );
void CWinCX::SetMainFrmTabFocusFlag( int nn );
void CWinCX::ClearMainFrmTabFocusFlag( void );
private :
LO_TabFocusData m_lastTabFocus;
int m_isReEntry_setLastTabFocusElement; // to provent re-entry
BOOL SaveOleDocument();
//#endif /* NO_TAB_NAVIGATION */
public:
LO_AnchorData *GetAreaAnchorData(LO_Element *pElement);
void FireMouseOutEvent(BOOL bClearElement, BOOL bClearAnchor, int32 xVal, int32 yVal,
CL_Layer *layer);
void FireMouseOverEvent(LO_Element *pElement, int32 xVal, int32 yVal,
CL_Layer *layer);
// Misc MFC helpers.
public:
virtual void OpenFile();
virtual BOOL CanOpenFile();
virtual void SaveAs();
virtual BOOL CanSaveAs();
virtual void PrintContext();
virtual void Print();
virtual BOOL CanPrint(BOOL bPreview = FALSE);
virtual void AllFind(MWContext *pSearchContext = NULL);
virtual BOOL CanAllFind();
virtual void FindAgain();
virtual BOOL CanFindAgain() const { return(!theApp.m_csFindString.IsEmpty()); }
virtual BOOL DoFind(CWnd * pWnd, const char * pFindWhat, BOOL bMatchcase,
BOOL bSearchDown, BOOL bAlertOnNotFound);
virtual BOOL CanViewSource();
virtual void ViewSource();
virtual BOOL CanDocumentInfo();
virtual void DocumentInfo();
virtual BOOL CanFrameSource();
virtual void FrameSource();
virtual BOOL CanFrameInfo();
virtual void FrameInfo();
virtual BOOL CanGoHome();
virtual void GoHome();
virtual BOOL CanUploadFile();
virtual void UploadFile();
// Context Overrides
public:
virtual void LayoutNewDocument(MWContext *pContext, URL_Struct *pURL, int32 *pWidth, int32 *pHeight, int32 *pmWidth, int32 *pmHeight);
virtual void FinishedLayout(MWContext *pContext);
virtual void AllConnectionsComplete(MWContext *pContext);
virtual void UpdateStopState(MWContext *pContext);
virtual void SetDocTitle(MWContext *pContext, char *pTitle);
virtual void SetInternetKeyword(const char *keyword);
virtual void ClearView(MWContext *pContext, int iView);
virtual void CreateEmbedWindow(MWContext *pContext, NPEmbeddedApp *pApp);
virtual void SaveEmbedWindow(MWContext *pContext, NPEmbeddedApp *pApp);
virtual void RestoreEmbedWindow(MWContext *pContext, NPEmbeddedApp *pApp);
virtual void DestroyEmbedWindow(MWContext *pContext, NPEmbeddedApp *pApp);
virtual void DisplayJavaApp(MWContext *pContext, int iLocation, LO_JavaAppStruct *java_struct);
#ifdef TRANSPARENT_APPLET
virtual void HandleClippingView(MWContext *pContext, LJAppletData *appletD, int x, int y, int width, int height);
#endif
virtual void HideJavaAppElement(MWContext *pContext, LJAppletData * session_data);
virtual void SetDocDimension(MWContext *pContext, int iLocation, int32 lWidth, int32 lLength);
virtual void SetDocPosition(MWContext *pContext, int iLocation, int32 lX, int32 lY);
virtual void FreeJavaAppElement(MWContext *pContext, LJAppletData *appletD);
virtual void GetJavaAppSize(MWContext *pContext, LO_JavaAppStruct *java_struct, NET_ReloadMethod bReload);
virtual void DisplayText(MWContext *pContext, int iLocation, LO_TextStruct *pText, XP_Bool clear);
virtual void DisplaySubtext(MWContext *pContext, int iLocation, LO_TextStruct *pText, int32 lStartPos, int32 lEndPos, XP_Bool clear);
virtual void SetProgressBarPercent(MWContext *pContext, int32 lPercent);
virtual void Progress(MWContext *pContext, const char *pMessage);
#ifndef MOZ_NGLAYOUT
virtual void DisplayEdge(MWContext *pContext, int iLocation, LO_EdgeStruct *pEdge);
virtual void FreeEdgeElement(MWContext *pContext, LO_EdgeStruct *pEdge);
#endif
virtual void EnableClicking(MWContext *pContext);
// Misc draw helpers
public:
#ifdef EDITOR
virtual void PreWMErasebkgnd(PaneMessage *pMsg);
#endif
// Helper for erasing text structures
BOOL EraseTextBkgnd(HDC pDC, RECT&, LO_TextStruct*);
// Break out code in OnMouseMove handler so it can be used
// during dragging in the Editor
BOOL CheckAndScrollWindow(int32 xVal, int32 yVal, CL_Layer *layer, int32 iBorderThreshhold = 0);
};
// Global variables
//
// Macros
//
// Function declarations
//
#endif // __WindowContext_H