#endif
#include "wx/brush.h"
+#include "wx/dc.h"
// ---------------------------------------------------------------------------
// forward declarations
class WXDLLEXPORT wxScrollBar;
class WXDLLEXPORT wxTopLevelWindowMac;
+// internal implementation classes
+
+class wxMacControl ;
+
// ---------------------------------------------------------------------------
// constants
// ---------------------------------------------------------------------------
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(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();
virtual void Refresh( bool eraseBackground = TRUE,
const wxRect *rect = (const wxRect *) NULL );
+ virtual void Freeze() ;
+ virtual void Thaw() ;
+
+ 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,
// 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);
-
// 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 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 ;
+#if WXWIN_COMPATIBILITY_2_4
bool GetTransparentBackground() const { return m_backgroundTransparent; }
void SetTransparent(bool t = TRUE) { m_backgroundTransparent = t; }
+#endif
// event handlers
// --------------
void OnSetFocus(wxFocusEvent& event) ;
+ void OnPaint(wxPaintEvent& event);
void OnNcPaint(wxNcPaintEvent& event);
void OnEraseBackground(wxEraseEvent& event);
void OnMouseEvent( wxMouseEvent &event ) ;
wxWindowMac *FindItem(long id) 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;
-
- // MSW only: TRUE if this control is part of the main control
- virtual bool ContainsHWND(WXHWND WXUNUSED(hWnd)) const { return FALSE; };
-
- // Setup background and foreground colours correctly
- virtual void SetupColours();
-
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 void MacHandleControlClick( WXWidget control , wxInt16 controlpart , bool mouseStillDown ) ;
+ virtual bool MacDoRedraw( WXHRGN updatergn , long time ) ;
+ virtual bool MacCanFocus() const ;
- 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 ;
+ virtual void RemoveChild( wxWindowBase *child );
+ virtual void MacPaintBorders( int left , int top ) ;
+ // 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 ;
wxTopLevelWindowMac* MacGetTopLevelWindow() const ;
- virtual WXWidget MacGetContainerForEmbedding() ;
+ virtual long MacGetLeftBorderSize() const ;
+ virtual long MacGetRightBorderSize() const ;
+ virtual long MacGetTopBorderSize() const ;
+ virtual long MacGetBottomBorderSize() const ;
- virtual long MacGetLeftBorderSize() const ;
- virtual long MacGetRightBorderSize() const ;
- virtual long MacGetTopBorderSize() const ;
- virtual long MacGetBottomBorderSize() const ;
+ static long MacRemoveBordersFromStyle( long style ) ;
- static long MacRemoveBordersFromStyle( long style ) ;
- virtual void MacSuperChangedPosition() ;
- // the absolute coordinates of this item within the toplevel window may have changed
- virtual void MacUpdateDimensions() {}
+ virtual void MacSuperChangedPosition() ;
// 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 void MacTopLevelWindowChangedPosition() ;
+
+ virtual void MacChildAdded() ;
+ virtual void MacVisibilityChanged() ;
+ virtual void MacEnabledStateChanged() ;
+ virtual void MacHiliteChanged() ;
+ virtual wxInt32 MacControlHit( WXEVENTHANDLERREF handler , WXEVENTREF event ) ;
+
+ bool MacIsReallyShown() ;
+ bool MacIsReallyEnabled() ;
+ bool MacIsReallyHilited() ;
+
+ bool MacIsUserPane() { return m_macIsUserPane; }
+
+ 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 )
+ virtual void MacSetBackgroundBrush( const wxBrush &brush ) ;
+ const wxBrush& MacGetBackgroundBrush() const { return m_macBackgroundBrush ; }
+
+ // 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 (eg scrolled window)
+ bool MacClipChildren() const { return m_clipChildren ; }
+ void MacSetClipChildren( bool clip ) { m_clipChildren = clip ; }
+ // returns true if the grandchildren have to be clipped to the children's content area (eg
+ // splitter window)
+ virtual bool MacClipGrandChildren() const { return false ; }
+ bool MacIsWindowScrollbar( const wxScrollBar* sb )
{ return (m_hScrollBar == sb || m_vScrollBar == sb) ; }
- static wxWindowMac* s_lastMouseWindow ;
-private:
+
+ wxList& GetSubcontrols() { return m_subControls; }
+ virtual void MacInstallEventHandler(WXWidget native) ;
+ WXEVENTHANDLERREF MacGetControlEventHandler() { return m_macControlEventHandler ; }
+ void MacPostControlCreate(const wxPoint& pos, const wxSize& size) ;
+#ifndef __WXMAC_OSX__
+ virtual void MacControlUserPaneDrawProc(wxInt16 part) ;
+ virtual wxInt16 MacControlUserPaneHitTestProc(wxInt16 x, wxInt16 y) ;
+ virtual wxInt16 MacControlUserPaneTrackingProc(wxInt16 x, wxInt16 y, void* actionProc) ;
+ virtual void MacControlUserPaneIdleProc() ;
+ virtual wxInt16 MacControlUserPaneKeyDownProc(wxInt16 keyCode, wxInt16 charCode, wxInt16 modifiers) ;
+ virtual void MacControlUserPaneActivateProc(bool activating) ;
+ virtual wxInt16 MacControlUserPaneFocusProc(wxInt16 action) ;
+ virtual void MacControlUserPaneBackgroundProc(void* info) ;
+#endif
+ // translate wxWidgets coords into ones suitable to be passed to
+ // the 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 ) ;
+
+ // flash the current invalid area, useful for debugging in OSX double buffered situation
+ void MacFlashInvalidAreas() ;
+
+ // the 'true' OS level control for this wxWindow
+ wxMacControl* GetPeer() const { return m_peer ; }
+#if wxMAC_USE_CORE_GRAPHICS
+ void * MacGetCGContextRef() { return m_cgContextRef ; }
+ void MacSetCGContextRef(void * cg) { m_cgContextRef = cg ; }
+#endif
protected:
- wxBrush m_macBackgroundBrush ;
- wxRegion m_macVisibleRegion ;
- int m_x ;
- int m_y ;
- int m_width ;
- int m_height ;
+ // For controls like radiobuttons which are really composite
+ wxList m_subControls;
+ // number of calls to Freeze() minus number of calls to Thaw()
+ unsigned int m_frozenness;
+ // the peer object, allowing for cleaner API support
+ wxMacControl* m_peer ;
+#if wxMAC_USE_CORE_GRAPHICS
+ void * m_cgContextRef ;
+#endif
+ // 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 ;
+ wxBrush m_macBackgroundBrush ;
+ // topleft inset of the mac control from the wx top left corner
+ wxPoint m_macTopLeftInset ;
+ // bottom right inset of the mac control from the wx bottom right corner
+ wxPoint m_macBottomRightInset ;
- wxScrollBar* m_hScrollBar ;
- wxScrollBar* m_vScrollBar ;
- wxString m_label ;
+ wxScrollBar* m_hScrollBar ;
+ wxScrollBar* m_vScrollBar ;
+ wxString m_label ;
+ // returns 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 ;
- void MacCreateScrollBars( long style ) ;
- void MacRepositionScrollBars() ;
-
+ virtual bool MacIsChildOfClientArea( const wxWindow* child ) const ;
+
+ void MacCreateScrollBars( long style ) ;
+ void MacRepositionScrollBars() ;
+ void MacUpdateControlFont() ;
+
+ void MacPropagateVisibilityChanged() ;
+ void MacPropagateEnabledStateChanged() ;
+ void MacPropagateHiliteChanged() ;
+
+
+#if WXWIN_COMPATIBILITY_2_4
bool m_backgroundTransparent ;
+#endif
// 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;
// ::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 DoSetWindowVariant( wxWindowVariant variant ) ;
+
#if wxUSE_TOOLTIPS
virtual void DoSetToolTip( wxToolTip *tip );
#endif // wxUSE_TOOLTIPS
+private :
+
private:
// common part of all ctors
void Init();
+ WXEVENTHANDLERREF m_macControlEventHandler ;
+
+
DECLARE_NO_COPY_CLASS(wxWindowMac)
DECLARE_EVENT_TABLE()
};