X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8cf73271dd6f442a98e86b559d4a55c37e25b99f..7a04b644092ff91f8f2c6ecdd191e96285d39a1d:/include/wx/mac/carbon/window.h diff --git a/include/wx/mac/carbon/window.h b/include/wx/mac/carbon/window.h index 807e261863..0092b70fc7 100644 --- a/include/wx/mac/carbon/window.h +++ b/include/wx/mac/carbon/window.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: window.h +// Name: include/wx/mac/carbon/window.h // Purpose: wxWindowMac class // Author: Stefan Csomor // Modified by: @@ -12,228 +12,302 @@ #ifndef _WX_WINDOW_H_ #define _WX_WINDOW_H_ -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma interface "window.h" -#endif - #include "wx/brush.h" +#include "wx/dc.h" -// --------------------------------------------------------------------------- -// forward declarations -// --------------------------------------------------------------------------- - -class WXDLLEXPORT wxButton; -class WXDLLEXPORT wxScrollBar; -class WXDLLEXPORT wxTopLevelWindowMac; +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxScrollBar; +class WXDLLIMPEXP_FWD_CORE wxNonOwnedWindow; -// --------------------------------------------------------------------------- -// constants -// --------------------------------------------------------------------------- +class WXDLLIMPEXP_FWD_CORE wxMacControl ; -class WXDLLEXPORT wxWindowMac: public wxWindowBase +class WXDLLIMPEXP_CORE wxWindowMac: public wxWindowBase { DECLARE_DYNAMIC_CLASS(wxWindowMac) - + friend class wxDC; friend class wxPaintDC; - + public: - - wxWindowMac() - : m_macBackgroundBrush() - , m_macVisibleRegion() - , m_x(0), m_y(0), m_width(0), m_height(0) - , m_hScrollBar(NULL), m_vScrollBar(NULL) - , m_label(wxEmptyString) - { Init(); } - - wxWindowMac(wxWindowMac *parent, + wxWindowMac(); + + wxWindowMac( wxWindowMac *parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, - const wxString& name = wxPanelNameStr) - { - Init(); - Create(parent, id, pos, size, style, name); - } + const wxString& name = wxPanelNameStr ); virtual ~wxWindowMac(); - bool Create(wxWindowMac *parent, + bool Create( wxWindowMac *parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, - const wxString& name = wxPanelNameStr); - + const wxString& name = wxPanelNameStr ); // implement base class pure virtuals - virtual void SetTitle( const wxString& title); - virtual wxString GetTitle() const; + virtual void SetLabel( const wxString& label ); + virtual wxString GetLabel() const; virtual void Raise(); virtual void Lower(); - virtual bool Show( bool show = TRUE ); - virtual bool Enable( bool enable = TRUE ); + virtual bool Show( bool show = true ); + + virtual bool IsShownOnScreen() const; virtual void SetFocus(); - virtual void WarpPointer(int x, int y); + virtual void WarpPointer( int x, int y ); + + virtual void Refresh( bool eraseBackground = true, + const wxRect *rect = NULL ); - virtual void Refresh( bool eraseBackground = TRUE, - const wxRect *rect = (const wxRect *) NULL ); + virtual void Update() ; + virtual void ClearBackground(); virtual bool SetCursor( const wxCursor &cursor ); - virtual bool SetFont(const wxFont& font) - { return wxWindowBase::SetFont(font); } + virtual bool SetFont( const wxFont &font ); + virtual bool SetBackgroundColour( const wxColour &colour ); + virtual bool SetForegroundColour( const wxColour &colour ); + virtual int GetCharHeight() const; virtual int GetCharWidth() const; - virtual void GetTextExtent(const wxString& string, + virtual void GetTextExtent( const wxString& string, int *x, int *y, - int *descent = (int *) NULL, - int *externalLeading = (int *) NULL, - const wxFont *theFont = (const wxFont *) NULL) + int *descent = NULL, + int *externalLeading = NULL, + const wxFont *theFont = NULL ) const; - +protected: + virtual void DoEnable( bool enable ); virtual bool DoPopupMenu( wxMenu *menu, int x, int y ); + virtual void DoFreeze(); + virtual void DoThaw(); + +public: virtual void SetScrollbar( int orient, int pos, int thumbVisible, - int range, bool refresh = TRUE ); - virtual void SetScrollPos( int orient, int pos, bool refresh = TRUE ); + int range, bool refresh = true ); + virtual void SetScrollPos( int orient, int pos, bool refresh = true ); virtual int GetScrollPos( int orient ) const; virtual int GetScrollThumb( int orient ) const; virtual int GetScrollRange( int orient ) const; virtual void ScrollWindow( int dx, int dy, const wxRect* rect = (wxRect *) NULL ); + virtual void AlwaysShowScrollbars(bool horz = true, bool vert = true); + virtual bool IsScrollbarAlwaysShown(int orient) const + { + return orient == wxHORIZONTAL ? m_hScrollBarAlwaysShown + : m_vScrollBarAlwaysShown; + } + + virtual bool Reparent( wxWindowBase *newParent ); #if wxUSE_DRAG_AND_DROP virtual void SetDropTarget( wxDropTarget *dropTarget ); -#endif // wxUSE_DRAG_AND_DROP +#endif // Accept files for dragging - virtual void DragAcceptFiles(bool accept); - - // Native resource loading (implemented in src/msw/nativdlg.cpp) - // FIXME: should they really be all virtual? - wxWindowMac* GetWindowChild1(wxWindowID id); - wxWindowMac* GetWindowChild(wxWindowID id); + virtual void DragAcceptFiles( bool accept ); // implementation from now on // -------------------------- - void MacClientToRootWindow( int *x , int *y ) const ; - void MacRootWindowToClient( int *x , int *y ) const ; - void MacWindowToRootWindow( int *x , int *y ) const ; - void MacRootWindowToWindow( int *x , int *y ) const ; - - virtual wxString MacGetToolTipString( wxPoint &where ) ; + void MacClientToRootWindow( int *x , int *y ) const; + void MacRootWindowToClient( int *x , int *y ) const; + + void MacWindowToRootWindow( int *x , int *y ) const; + void MacWindowToRootWindow( short *x , short *y ) const; + + void MacRootWindowToWindow( int *x , int *y ) const; + void MacRootWindowToWindow( short *x , short *y ) const; + + virtual wxString MacGetToolTipString( wxPoint &where ); // simple accessors // ---------------- -// WXHWND GetHWND() const { return m_hWnd; } -// void SetHWND(WXHWND hWnd) { m_hWnd = hWnd; } - virtual WXWidget GetHandle() const { return (WXWidget) NULL ; } + virtual WXWidget GetHandle() const; - bool GetTransparentBackground() const { return m_backgroundTransparent; } - void SetTransparent(bool t = TRUE) { m_backgroundTransparent = t; } + virtual bool SetTransparent(wxByte alpha); + virtual bool CanSetTransparent(); + virtual wxByte GetTransparent() const ; // event handlers // -------------- - void OnSetFocus(wxFocusEvent& event) ; - void OnNcPaint(wxNcPaintEvent& event); - void OnEraseBackground(wxEraseEvent& event); - void OnMouseEvent( wxMouseEvent &event ) ; + void OnPaint( wxPaintEvent& event ); + void OnNcPaint( wxNcPaintEvent& event ); + void OnEraseBackground(wxEraseEvent& event ); + void OnMouseEvent( wxMouseEvent &event ); + + void MacOnScroll( wxScrollEvent&event ); - void MacOnScroll(wxScrollEvent&event ) ; - - bool AcceptsFocus() const ; + virtual bool AcceptsFocus() const; + + virtual bool IsDoubleBuffered() const { return true; } + +public: + static long MacRemoveBordersFromStyle( long style ) ; public: void OnInternalIdle(); - // For implementation purposes - sometimes decorations make the client area - // smaller + // For implementation purposes: + // sometimes decorations make the client area smaller virtual wxPoint GetClientAreaOrigin() const; wxWindowMac *FindItem(long id) const; - wxWindowMac *FindItemByHWND(WXHWND hWnd, bool controlOnly = FALSE) const; + wxWindowMac *FindItemByHWND(WXHWND hWnd, bool controlOnly = false) const; - // Make a Windows extended style from the given wxWindows window style - static WXDWORD MakeExtendedStyle(long style, - bool eliminateBorders = TRUE); - // Determine whether 3D effects are wanted - WXDWORD Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D) const; + virtual void MacHandleControlClick( WXWidget control , wxInt16 controlpart , bool mouseStillDown ) ; + virtual bool MacDoRedraw( void* updatergn , long time ) ; + virtual bool MacCanFocus() const ; - // MSW only: TRUE if this control is part of the main control - virtual bool ContainsHWND(WXHWND WXUNUSED(hWnd)) const { return FALSE; }; + // this should not be overriden in classes above wxWindowMac + // because it is called from its destructor via DeleteChildren + virtual void RemoveChild( wxWindowBase *child ); + virtual void MacPaintBorders( int left , int top ) ; + void MacPaintGrowBox(); - // Setup background and foreground colours correctly - virtual void SetupColours(); + // invalidates the borders and focus area around the control; + // must not be virtual as it will be called during destruction + void MacInvalidateBorders() ; + + WXWindow MacGetTopLevelWindowRef() const ; + wxNonOwnedWindow* MacGetTopLevelWindow() const ; + + virtual long MacGetLeftBorderSize() const ; + virtual long MacGetRightBorderSize() const ; + virtual long MacGetTopBorderSize() const ; + virtual long MacGetBottomBorderSize() const ; + + virtual void MacSuperChangedPosition() ; + + // absolute coordinates of this window's root have changed + virtual void MacTopLevelWindowChangedPosition() ; + + virtual void MacChildAdded() ; + virtual void MacVisibilityChanged() ; + virtual void MacEnabledStateChanged() ; + virtual void MacHiliteChanged() ; + virtual wxInt32 MacControlHit( WXEVENTHANDLERREF handler , WXEVENTREF event ) ; + + bool MacIsReallyEnabled() ; + bool MacIsReallyHilited() ; + + bool MacIsUserPane() { return m_macIsUserPane; } + + virtual bool MacSetupCursor( const wxPoint& pt ) ; + + // return the rectangle that would be visible of this control, + // regardless whether controls are hidden + // only taking into account clipping by parent windows + const wxRect& MacGetClippedClientRect() const ; + const wxRect& MacGetClippedRect() const ; + const wxRect& MacGetClippedRectWithOuterStructure() const ; + + // returns the visible region of this control in window ie non-client coordinates + const wxRegion& MacGetVisibleRegion( bool includeOuterStructures = false ) ; + + // returns true if children have to clipped to the content area + // (e.g., scrolled windows) + bool MacClipChildren() const { return m_clipChildren ; } + void MacSetClipChildren( bool clip ) { m_clipChildren = clip ; } + + // returns true if the grandchildren need to be clipped to the children's content area + // (e.g., splitter windows) + virtual bool MacClipGrandChildren() const { return false ; } + bool MacIsWindowScrollbar( const wxWindow* sb ) const + { return ((wxWindow*)m_hScrollBar == sb || (wxWindow*)m_vScrollBar == sb) ; } + virtual bool IsClientAreaChild(const wxWindow *child) const + { + return !MacIsWindowScrollbar(child) && + wxWindowBase::IsClientAreaChild(child); + } + + virtual void MacInstallEventHandler(WXWidget native) ; + void MacPostControlCreate(const wxPoint& pos, const wxSize& size) ; + wxList& GetSubcontrols() { return m_subControls; } + WXEVENTHANDLERREF MacGetControlEventHandler() { return m_macControlEventHandler ; } + + // translate wxWidgets coords into ones suitable + // to be passed to CreateControl calls + // + // returns true if non-default coords are returned, false otherwise + bool MacGetBoundsForControl(const wxPoint& pos, + const wxSize& size, + int& x, int& y, + int& w, int& h , bool adjustForOrigin ) const ; + + // calculates the real window position and size from the native control + void MacGetPositionAndSizeFromControl(int& x, int& y, + int& w, int& h) const ; + + // gets the inset from every part + virtual void MacGetContentAreaInset( int &left , int &top , int &right , int &bottom ) ; + + // visibly flash the current invalid area: + // useful for debugging in OSX composited (double-buffered) situation + void MacFlashInvalidAreas() ; + + // the 'true' OS level control for this wxWindow + wxMacControl* GetPeer() const { return m_peer ; } + + void * MacGetCGContextRef() { return m_cgContextRef ; } + void MacSetCGContextRef(void * cg) { m_cgContextRef = cg ; } -public: - static bool MacGetWindowFromPoint( const wxPoint &point , wxWindowMac** outWin ) ; - virtual bool MacGetWindowFromPointSub( const wxPoint &point , wxWindowMac** outWin ) ; - virtual void MacRedraw( WXHRGN updatergn , long time , bool erase) ; - virtual bool MacCanFocus() const { return true ; } - - virtual bool MacDispatchMouseEvent(wxMouseEvent& event ) ; - // this should not be overriden in classes above wxWindowMac because it is called from its destructor via DeleteChildren - virtual void RemoveChild( wxWindowBase *child ); - virtual void MacPaintBorders( int left , int top ) ; - WXWindow MacGetRootWindow() const ; - wxTopLevelWindowMac* MacGetTopLevelWindow() const ; - - virtual WXWidget MacGetContainerForEmbedding() ; - - virtual long MacGetLeftBorderSize() const ; - virtual long MacGetRightBorderSize() const ; - virtual long MacGetTopBorderSize() const ; - virtual long MacGetBottomBorderSize() const ; - - static long MacRemoveBordersFromStyle( long style ) ; - virtual void MacSuperChangedPosition() ; - // the absolute coordinates of this item within the toplevel window may have changed - virtual void MacUpdateDimensions() {} - // the absolute coortinates of this window's root have changed - virtual void MacTopLevelWindowChangedPosition() ; - virtual void MacSuperShown( bool show ) ; - virtual void MacSuperEnabled( bool enable ) ; - bool MacIsReallyShown() const ; - virtual void Update() ; - // for compatibility - void MacUpdateImmediately() { Update() ; } - virtual bool MacSetupCursor( const wxPoint& pt ) ; - -// virtual bool MacSetPortDrawingParams( const Point & localOrigin, const Rect & clipRect, WindowRef window , wxWindowMac* rootwin ) ; -// virtual void MacGetPortParams(Point* localOrigin, Rect* clipRect, WindowRef *window , wxWindowMac** rootwin ) ; -// virtual void MacGetPortClientParams(Point* localOrigin, Rect* clipRect, WindowRef *window , wxWindowMac** rootwin) ; - const wxBrush& MacGetBackgroundBrush() ; - const wxRegion& MacGetVisibleRegion( bool respectChildrenAndSiblings = true ) ; - bool MacIsWindowScrollbar( const wxScrollBar* sb ) - { return (m_hScrollBar == sb || m_vScrollBar == sb) ; } - static wxWindowMac* s_lastMouseWindow ; -private: protected: - wxBrush m_macBackgroundBrush ; - wxRegion m_macVisibleRegion ; - int m_x ; - int m_y ; - int m_width ; - int m_height ; - - wxScrollBar* m_hScrollBar ; - wxScrollBar* m_vScrollBar ; - wxString m_label ; - - void MacCreateScrollBars( long style ) ; - void MacRepositionScrollBars() ; - - bool m_backgroundTransparent ; + // For controls like radio buttons which are genuinely composite + wxList m_subControls; + + // the peer object, allowing for cleaner API support + wxMacControl * m_peer ; + + void * m_cgContextRef ; + + // cache the clipped rectangles within the window hierarchy + void MacUpdateClippedRects() const ; + + mutable bool m_cachedClippedRectValid ; + mutable wxRect m_cachedClippedRectWithOuterStructure ; + mutable wxRect m_cachedClippedRect ; + mutable wxRect m_cachedClippedClientRect ; + mutable wxRegion m_cachedClippedRegionWithOuterStructure ; + mutable wxRegion m_cachedClippedRegion ; + mutable wxRegion m_cachedClippedClientRegion ; + + // true if is is not a native control but a wxWindow control + bool m_macIsUserPane ; + + // insets of the mac control from the wx top left corner + wxPoint m_macTopLeftInset ; + wxPoint m_macBottomRightInset ; + wxByte m_macAlpha ; + + wxScrollBar* m_hScrollBar ; + wxScrollBar* m_vScrollBar ; + bool m_hScrollBarAlwaysShown; + bool m_vScrollBarAlwaysShown; + wxString m_label ; + + // set to true if we do a sharp clip at the content area of this window + // must be dynamic as eg a panel normally is not clipping precisely, but if + // it becomes the target window of a scrolled window it has to... + bool m_clipChildren ; + + virtual bool MacIsChildOfClientArea( const wxWindow* child ) const ; + + bool MacHasScrollBarCorner() const; + void MacCreateScrollBars( long style ) ; + void MacRepositionScrollBars() ; + void MacUpdateControlFont() ; // implement the base class pure virtuals + virtual wxSize DoGetBestSize() const; + virtual wxSize DoGetSizeFromClientSize( const wxSize & size ) const; virtual void DoClientToScreen( int *x, int *y ) const; virtual void DoScreenToClient( int *x, int *y ) const; virtual void DoGetPosition( int *x, int *y ) const; @@ -251,19 +325,26 @@ protected: // from both DoSetSize() and DoSetClientSize() and would usually just call // ::MoveWindow() except for composite controls which will want to arrange // themselves inside the given rectangle - virtual void DoMoveWindow(int x, int y, int width, int height); + virtual void DoMoveWindow( int x, int y, int width, int height ); + virtual void DoSetWindowVariant( wxWindowVariant variant ); #if wxUSE_TOOLTIPS virtual void DoSetToolTip( wxToolTip *tip ); -#endif // wxUSE_TOOLTIPS +#endif private: // common part of all ctors void Init(); + // show/hide scrollbars as needed, common part of SetScrollbar() and + // AlwaysShowScrollbars() + void DoUpdateScrollbarVisibility(); + + + WXEVENTHANDLERREF m_macControlEventHandler ; + DECLARE_NO_COPY_CLASS(wxWindowMac) DECLARE_EVENT_TABLE() }; -#endif - // _WX_WINDOW_H_ +#endif // _WX_WINDOW_H_