X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5c6eb3a84be918dcfed2496d014549e13af0f0e9..d642db66a5efc82d374b813022c72ba88bc50839:/include/wx/osx/window.h diff --git a/include/wx/osx/window.h b/include/wx/osx/window.h index 14b131e37b..3af0c97038 100644 --- a/include/wx/osx/window.h +++ b/include/wx/osx/window.h @@ -1,5 +1,404 @@ -#ifdef __WXMAC_CLASSIC__ -#include "wx/mac/classic/window.h" -#else -#include "wx/mac/carbon/window.h" +///////////////////////////////////////////////////////////////////////////// +// Name: wx/osx/window.h +// Purpose: wxWindowMac class +// Author: Stefan Csomor +// Modified by: +// Created: 1998-01-01 +// RCS-ID: $Id$ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WINDOW_H_ +#define _WX_WINDOW_H_ + +#include "wx/brush.h" +#include "wx/dc.h" + +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxScrollBar; +class WXDLLIMPEXP_FWD_CORE wxPanel; +class WXDLLIMPEXP_FWD_CORE wxNonOwnedWindow; + +#if wxOSX_USE_CARBON + class WXDLLIMPEXP_FWD_CORE wxMacControl ; + typedef wxMacControl wxOSXWidgetImpl; +#elif wxOSX_USE_COCOA_OR_IPHONE + class WXDLLIMPEXP_FWD_CORE wxWidgetImpl ; + typedef wxWidgetImpl wxOSXWidgetImpl; #endif + + +class WXDLLIMPEXP_CORE wxWindowMac: public wxWindowBase +{ + DECLARE_DYNAMIC_CLASS(wxWindowMac) + + friend class wxDC; + friend class wxPaintDC; + +public: + wxWindowMac(); + + wxWindowMac( wxWindowMac *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr ); + + virtual ~wxWindowMac(); + + bool Create( wxWindowMac *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr ); + + virtual void SendSizeEvent(int flags = 0); + + // implement base class pure virtuals + virtual void SetLabel( const wxString& label ); + virtual wxString GetLabel() const; + + virtual void Raise(); + virtual void Lower(); + + virtual bool Show( bool show = true ); + virtual bool ShowWithEffect(wxShowEffect effect, + unsigned timeout = 0) + { + return OSXShowWithEffect(true, effect, timeout); + } + virtual bool HideWithEffect(wxShowEffect effect, + unsigned timeout = 0) + { + return OSXShowWithEffect(false, effect, timeout); + } + + virtual bool IsShownOnScreen() const; + + virtual void SetFocus(); + + virtual void WarpPointer( int x, int y ); + + virtual void Refresh( bool eraseBackground = true, + const wxRect *rect = NULL ); + + virtual void Update() ; + virtual void ClearBackground(); + + virtual bool SetCursor( const wxCursor &cursor ); + virtual bool SetFont( const wxFont &font ); + virtual bool SetBackgroundColour( const wxColour &colour ); + virtual bool SetForegroundColour( const wxColour &colour ); + + virtual bool SetBackgroundStyle(wxBackgroundStyle style); + + virtual int GetCharHeight() const; + virtual int GetCharWidth() const; + +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 ); + 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 = 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_HOTKEY && wxOSX_USE_COCOA_OR_CARBON + // hot keys (system wide accelerators) + // ----------------------------------- + + virtual bool RegisterHotKey(int hotkeyId, int modifiers, int keycode); + virtual bool UnregisterHotKey(int hotkeyId); +#endif // wxUSE_HOTKEY + +#if wxUSE_DRAG_AND_DROP + virtual void SetDropTarget( wxDropTarget *dropTarget ); +#endif + + // Accept files for dragging + virtual void DragAcceptFiles( bool accept ); + + // implementation from now on + // -------------------------- + + void MacClientToRootWindow( int *x , int *y ) const; + + void MacWindowToRootWindow( int *x , int *y ) const; + + void MacRootWindowToWindow( int *x , int *y ) const; + + virtual wxString MacGetToolTipString( wxPoint &where ); + + // simple accessors + // ---------------- + + virtual WXWidget GetHandle() const; + + virtual bool SetTransparent(wxByte alpha); + virtual bool CanSetTransparent(); + virtual wxByte GetTransparent() const ; + + // event handlers + // -------------- + + void OnMouseEvent( wxMouseEvent &event ); + + void MacOnScroll( wxScrollEvent&event ); + + virtual bool AcceptsFocus() const; + + virtual bool IsDoubleBuffered() const { return true; } + +public: + static long MacRemoveBordersFromStyle( long style ) ; + +public: + // 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; + + virtual void TriggerScrollEvent( wxEventType scrollEvent ) ; + // this should not be overridden in classes above wxWindowMac + // because it is called from its destructor via DeleteChildren + virtual void RemoveChild( wxWindowBase *child ); + + virtual bool MacDoRedraw( long time ) ; + virtual void MacPaintChildrenBorders(); + virtual void MacPaintBorders( int left , int top ) ; + void MacPaintGrowBox(); + + // 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 MacGetWXBorderSize() 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() ; + +#if WXWIN_COMPATIBILITY_2_8 + bool MacIsUserPane(); +#endif + bool MacIsUserPane() const; + + 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) && !((wxWindow*)m_growBox==child) && + wxWindowBase::IsClientAreaChild(child); + } + + void MacPostControlCreate(const wxPoint& pos, const wxSize& size) ; + wxList& GetSubcontrols() { return m_subControls; } + + // 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 ; + + // the 'true' OS level control for this wxWindow + wxOSXWidgetImpl* GetPeer() const; + + // optimization to avoid creating a user pane in wxWindow::Create if we already know + // we will replace it with our own peer + void DontCreatePeer(); + + // return true unless DontCreatePeer() had been called + bool ShouldCreatePeer() const; + + // sets the native implementation wrapper, can replace an existing peer, use peer = NULL to + // release existing peer + void SetPeer(wxOSXWidgetImpl* peer); + + // wraps the already existing peer with the wrapper + void SetWrappingPeer(wxOSXWidgetImpl* wrapper); + +#if wxOSX_USE_COCOA_OR_IPHONE + // the NSView or NSWindow of this window: can be used for both child and + // non-owned windows + // + // this is useful for a few Cocoa function which can work with either views + // or windows indiscriminately, e.g. for setting NSViewAnimationTargetKey + virtual void *OSXGetViewOrWindow() const { return GetHandle(); } +#endif // Cocoa + + void * MacGetCGContextRef() { return m_cgContextRef ; } + void MacSetCGContextRef(void * cg) { m_cgContextRef = cg ; } + + // osx specific event handling common for all osx-ports + + virtual bool OSXHandleClicked( double timestampsec ); + virtual bool OSXHandleKeyEvent( wxKeyEvent& event ); + virtual void OSXSimulateFocusEvents(); + + bool IsNativeWindowWrapper() const { return m_isNativeWindowWrapper; } + + double GetContentScaleFactor() const ; + + // internal response to size events + virtual void MacOnInternalSize() {} + +protected: + // For controls like radio buttons which are genuinely composite + wxList m_subControls; + + // the peer object, allowing for cleaner API support + + 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 ; + + // 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; + wxWindow* m_growBox ; + wxString m_label ; + + bool m_isNativeWindowWrapper; + + // 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 void DoGetTextExtent(const wxString& string, + int *x, int *y, + int *descent = NULL, + int *externalLeading = NULL, + const wxFont *theFont = NULL ) const; + + virtual void DoEnable( bool enable ); +#if wxUSE_MENUS + virtual bool DoPopupMenu( wxMenu *menu, int x, int y ); +#endif + + virtual void DoFreeze(); + virtual void DoThaw(); + + 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; + virtual void DoGetSize( int *width, int *height ) const; + virtual void DoGetClientSize( int *width, int *height ) const; + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); + virtual void DoSetClientSize(int width, int height); + + virtual void DoCaptureMouse(); + virtual void DoReleaseMouse(); + + // move the window to the specified location and resize it: this is called + // 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 DoSetWindowVariant( wxWindowVariant variant ); + +#if wxUSE_TOOLTIPS + virtual void DoSetToolTip( wxToolTip *tip ); +#endif + + // common part of Show/HideWithEffect() + virtual bool OSXShowWithEffect(bool show, + wxShowEffect effect, + unsigned timeout); + +private: + wxOSXWidgetImpl * m_peer ; + // common part of all ctors + void Init(); + + // show/hide scrollbars as needed, common part of SetScrollbar() and + // AlwaysShowScrollbars() + void DoUpdateScrollbarVisibility(); + + wxDECLARE_NO_COPY_CLASS(wxWindowMac); + DECLARE_EVENT_TABLE() +}; + +#endif // _WX_WINDOW_H_