/* -*- 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; // 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*); }; // Global variables // // Macros // // Function declarations // #endif // __WindowContext_H