X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8b573fb839d791af52be6c7edb8d51c4b58962b8..6511d3078ecd1b1673de4a050a5130de971f77ab:/src/mac/carbon/window.cpp diff --git a/src/mac/carbon/window.cpp b/src/mac/carbon/window.cpp index 184148f5f3..8472050465 100644 --- a/src/mac/carbon/window.cpp +++ b/src/mac/carbon/window.cpp @@ -24,7 +24,6 @@ #include "wx/layout.h" #include "wx/dialog.h" #include "wx/scrolbar.h" -#include "wx/scrolwin.h" #include "wx/statbox.h" #include "wx/button.h" #include "wx/settings.h" @@ -37,8 +36,6 @@ #include "wx/log.h" #include "wx/geometry.h" #include "wx/textctrl.h" -#include "wx/laywin.h" -#include "wx/splitter.h" #include "wx/toolbar.h" #include "wx/dc.h" @@ -47,9 +44,6 @@ #include "wx/caret.h" #endif // wxUSE_CARET -#define wxWINDOW_HSCROLL 5998 -#define wxWINDOW_VSCROLL 5997 - #define MAC_SCROLLBAR_SIZE 15 #define MAC_SMALL_SCROLLBAR_SIZE 11 @@ -526,6 +520,7 @@ ControlUserPaneBackgroundUPP gControlUserPaneBackgroundUPP = NULL ; // implementation // =========================================================================== +#if KEY_wxList_DEPRECATED wxList wxWinMacControlList(wxKEY_INTEGER); wxWindow *wxFindControlFromMacControl(ControlRef inControl ) @@ -550,6 +545,42 @@ void wxRemoveMacControlAssociation(wxWindow *control) { wxWinMacControlList.DeleteObject(control); } +#else + +WX_DECLARE_HASH_MAP(ControlRef, wxWindow*, wxPointerHash, wxPointerEqual, MacControlMap); + +static MacControlMap wxWinMacControlList; + +wxWindow *wxFindControlFromMacControl(ControlRef inControl ) +{ + MacControlMap::iterator node = wxWinMacControlList.find(inControl); + + return (node == wxWinMacControlList.end()) ? NULL : node->second; +} + +void wxAssociateControlWithMacControl(ControlRef inControl, wxWindow *control) +{ + // adding NULL ControlRef is (first) surely a result of an error and + // (secondly) breaks native event processing + wxCHECK_RET( inControl != (ControlRef) NULL, wxT("attempt to add a NULL WindowRef to window list") ); + + wxWinMacControlList[inControl] = control; +} + +void wxRemoveMacControlAssociation(wxWindow *control) +{ + // iterate over all the elements in the class + MacControlMap::iterator it; + for ( it = wxWinMacControlList.begin(); it != wxWinMacControlList.end(); ++it ) + { + if ( it->second == control ) + { + wxWinMacControlList.erase(it); + break; + } + } +} +#endif // deprecated wxList // UPP functions ControlActionUPP wxMacLiveScrollbarActionUPP = NULL ; @@ -813,8 +844,6 @@ bool wxWindowMac::Create(wxWindowMac *parent, wxWindowID id, if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) ) return FALSE; - parent->AddChild(this); - m_windowVariant = parent->GetWindowVariant() ; if ( m_macIsUserPane ) @@ -863,17 +892,32 @@ bool wxWindowMac::Create(wxWindowMac *parent, wxWindowID id, return TRUE; } +void wxWindowMac::MacChildAdded() +{ + if ( m_vScrollBar ) + { + m_vScrollBar->Raise() ; + } + if ( m_hScrollBar ) + { + m_hScrollBar->Raise() ; + } + +} + void wxWindowMac::MacPostControlCreate(const wxPoint& pos, const wxSize& size) { wxASSERT_MSG( m_peer != NULL && m_peer->Ok() , wxT("No valid mac control") ) ; m_peer->SetReference( (long) this ) ; + GetParent()->AddChild(this); MacInstallEventHandler( (WXWidget) m_peer->GetControlRef() ); ControlRef container = (ControlRef) GetParent()->GetHandle() ; wxASSERT_MSG( container != NULL , wxT("No valid mac container control") ) ; ::EmbedControl( m_peer->GetControlRef() , container ) ; + GetParent()->MacChildAdded() ; // adjust font, controlsize etc DoSetWindowVariant( m_windowVariant ) ; @@ -1354,12 +1398,12 @@ void wxWindowMac::MacGetContentAreaInset( int &left , int &top , int &right , in if ( m_peer->GetRegion( kControlContentMetaPart , rgn ) == noErr ) { GetRegionBounds( rgn , &content ) ; - DisposeRgn( rgn ) ; } else { m_peer->GetRect( &content ) ; } + DisposeRgn( rgn ) ; Rect structure ; m_peer->GetRect( &structure ) ; #if !TARGET_API_MAC_OSX @@ -1382,12 +1426,12 @@ wxSize wxWindowMac::DoGetSizeFromClientSize( const wxSize & size ) const if ( m_peer->GetRegion( kControlContentMetaPart , rgn ) == noErr ) { GetRegionBounds( rgn , &content ) ; - DisposeRgn( rgn ) ; } else { m_peer->GetRect( &content ) ; } + DisposeRgn( rgn ) ; Rect structure ; m_peer->GetRect( &structure ) ; #if !TARGET_API_MAC_OSX @@ -1414,12 +1458,12 @@ void wxWindowMac::DoGetClientSize(int *x, int *y) const if ( m_peer->GetRegion( kControlContentMetaPart , rgn ) == noErr ) { GetRegionBounds( rgn , &content ) ; - DisposeRgn( rgn ) ; } else { m_peer->GetRect( &content ) ; } + DisposeRgn( rgn ) ; #if !TARGET_API_MAC_OSX Rect structure ; m_peer->GetRect( &structure ) ; @@ -1724,10 +1768,12 @@ wxSize wxWindowMac::DoGetBestSize() const { bestsize.bottom = 16 ; } +#if wxUSE_SPINBTN else if ( IsKindOf( CLASSINFO( wxSpinButton ) ) ) { bestsize.bottom = 24 ; } +#endif // wxUSE_SPINBTN else { // return wxWindowBase::DoGetBestSize() ; @@ -1872,11 +1918,14 @@ bool wxWindowMac::Show(bool show) return FALSE; // TODO use visibilityChanged Carbon Event for OSX - bool former = MacIsReallyShown() ; + if ( m_peer ) + { + bool former = MacIsReallyShown() ; - m_peer->SetVisibility( show , true ) ; - if ( former != MacIsReallyShown() ) - MacPropagateVisibilityChanged() ; + m_peer->SetVisibility( show , true ) ; + if ( former != MacIsReallyShown() ) + MacPropagateVisibilityChanged() ; + } return TRUE; } @@ -1903,7 +1952,7 @@ void wxWindowMac::MacPropagateVisibilityChanged() #if !TARGET_API_MAC_OSX MacVisibilityChanged() ; - wxWindowListNode *node = GetChildren().GetFirst(); + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); while ( node ) { wxWindowMac *child = node->GetData(); @@ -1919,7 +1968,7 @@ void wxWindowMac::MacPropagateEnabledStateChanged( ) #if !TARGET_API_MAC_OSX MacEnabledStateChanged() ; - wxWindowListNode *node = GetChildren().GetFirst(); + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); while ( node ) { wxWindowMac *child = node->GetData(); @@ -1935,7 +1984,7 @@ void wxWindowMac::MacPropagateHiliteChanged( ) #if !TARGET_API_MAC_OSX MacHiliteChanged() ; - wxWindowListNode *node = GetChildren().GetFirst(); + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); while ( node ) { wxWindowMac *child = node->GetData(); @@ -1969,6 +2018,9 @@ void wxWindowMac::MacEnabledStateChanged() bool wxWindowMac::MacIsReallyShown() { // only under OSX the visibility of the TLW is taken into account + if ( m_isBeingDeleted ) + return false ; + #if TARGET_API_MAC_OSX if ( m_peer && m_peer->Ok() ) return m_peer->IsVisible(); @@ -2434,7 +2486,7 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect) #endif } - for (wxWindowListNode *node = GetChildren().GetFirst(); node; node = node->GetNext()) + for (wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); node; node = node->GetNext()) { wxWindowMac *child = node->GetData(); if (child == m_vScrollBar) continue; @@ -2489,7 +2541,7 @@ void wxWindowMac::MacOnScroll(wxScrollEvent &event ) } // Get the window with the focus -wxWindowMac *wxWindowBase::FindFocus() +wxWindowMac *wxWindowBase::DoFindFocus() { ControlRef control ; GetKeyboardFocus( GetUserFocusWindow() , &control ) ; @@ -2624,8 +2676,10 @@ wxString wxWindowMac::MacGetToolTipString( wxPoint &pt ) void wxWindowMac::Update() { #if TARGET_API_MAC_OSX - WindowRef window = (WindowRef)MacGetTopLevelWindowRef() ; + #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 + WindowRef window = (WindowRef)MacGetTopLevelWindowRef() ; + // for composited windows this also triggers a redraw of all // invalid views in the window if( UMAGetSystemVersion() >= 0x1030 ) @@ -2680,7 +2734,7 @@ wxRegion wxWindowMac::MacGetVisibleRegion( bool includeOuterStructures ) Rect r ; RgnHandle visRgn = NewRgn() ; RgnHandle tempRgn = NewRgn() ; - if ( m_peer->IsVisible()) + if ( !m_isBeingDeleted && m_peer->IsVisible()) { m_peer->GetRect( &r ) ; r.left -= MacGetLeftBorderSize() ; @@ -2730,9 +2784,8 @@ wxRegion wxWindowMac::MacGetVisibleRegion( bool includeOuterStructures ) MacRootWindowToWindow( &x , &y ) ; if ( !includeOuterStructures || ( - parent->IsKindOf( CLASSINFO( wxScrolledWindow ) ) || - parent->IsKindOf( CLASSINFO( wxSashLayoutWindow ) ) || - ( parent->GetParent() && parent->GetParent()->IsKindOf( CLASSINFO( wxSplitterWindow ) ) ) + parent->MacClipChildren() || + ( parent->GetParent() && parent->GetParent()->MacClipGrandChildren() ) ) ) { SetRectRgn( tempRgn , @@ -2814,7 +2867,7 @@ bool wxWindowMac::MacDoRedraw( WXHRGN updatergnr , long time ) // in Composited windowing wxPoint clientOrigin = GetClientAreaOrigin() ; - for (wxWindowListNode *node = GetChildren().GetFirst(); node; node = node->GetNext()) + for (wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); node; node = node->GetNext()) { wxWindowMac *child = node->GetData(); if (child == m_vScrollBar) continue; @@ -2933,13 +2986,13 @@ void wxWindowMac::MacCreateScrollBars( long style ) if ( style & wxVSCROLL ) { - m_vScrollBar = new wxScrollBar(this, wxWINDOW_VSCROLL, vPoint, + m_vScrollBar = new wxScrollBar(this, wxID_ANY, vPoint, vSize , wxVERTICAL); } if ( style & wxHSCROLL ) { - m_hScrollBar = new wxScrollBar(this, wxWINDOW_HSCROLL, hPoint, + m_hScrollBar = new wxScrollBar(this, wxID_ANY, hPoint, hSize , wxHORIZONTAL); } } @@ -3037,7 +3090,7 @@ void wxWindowMac::MacSuperChangedPosition() { // only window-absolute structures have to be moved i.e. controls - wxWindowListNode *node = GetChildren().GetFirst(); + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); while ( node ) { wxWindowMac *child = node->GetData(); @@ -3050,7 +3103,7 @@ void wxWindowMac::MacTopLevelWindowChangedPosition() { // only screen-absolute structures have to be moved i.e. glcanvas - wxWindowListNode *node = GetChildren().GetFirst(); + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); while ( node ) { wxWindowMac *child = node->GetData();