X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7f17ac744deb4cb8162d89d487afd1de8b66ce40..50f65637a84135808d0fa246b7f53c6d66889a74:/src/mac/carbon/window.cpp diff --git a/src/mac/carbon/window.cpp b/src/mac/carbon/window.cpp index c84a5c1632..1f588d1a8a 100644 --- a/src/mac/carbon/window.cpp +++ b/src/mac/carbon/window.cpp @@ -9,11 +9,12 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "window.h" #endif -#include "wx/setup.h" +#include "wx/wxprec.h" + #include "wx/menu.h" #include "wx/window.h" #include "wx/dc.h" @@ -44,9 +45,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 @@ -83,7 +81,9 @@ extern wxList wxPendingDelete; BEGIN_EVENT_TABLE(wxWindowMac, wxWindowBase) EVT_NC_PAINT(wxWindowMac::OnNcPaint) EVT_ERASE_BACKGROUND(wxWindowMac::OnEraseBackground) -// TODO EVT_PAINT(wxWindowMac::OnPaint) +#if TARGET_API_MAC_OSX + EVT_PAINT(wxWindowMac::OnPaint) +#endif EVT_SET_FOCUS(wxWindowMac::OnSetFocus) EVT_KILL_FOCUS(wxWindowMac::OnSetFocus) EVT_MOUSE_EVENTS(wxWindowMac::OnMouseEvent) @@ -220,9 +220,9 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl #if 0 // in case we would need a coregraphics compliant background erase first // now usable to track redraws - CGContextRef cgContext = cEvent.GetParameter(kEventParamCGContextRef) ; if ( thisWindow->MacIsUserPane() ) { + CGContextRef cgContext = cEvent.GetParameter(kEventParamCGContextRef) ; static float color = 0.5 ; static channel = 0 ; HIRect bounds; @@ -240,8 +240,18 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl } } #endif - if ( thisWindow->MacDoRedraw( updateRgn , cEvent.GetTicks() ) ) - result = noErr ; + { +#if wxMAC_USE_CORE_GRAPHICS + CGContextRef cgContext = cEvent.GetParameter(kEventParamCGContextRef) ; + thisWindow->MacSetCGContextRef( cgContext ) ; + wxMacCGContextStateSaver sg( cgContext ) ; +#endif + if ( thisWindow->MacDoRedraw( updateRgn , cEvent.GetTicks() ) ) + result = noErr ; +#if wxMAC_USE_CORE_GRAPHICS + thisWindow->MacSetCGContextRef( NULL ) ; +#endif + } if ( allocatedRgn ) DisposeRgn( allocatedRgn ) ; } @@ -408,6 +418,8 @@ pascal OSStatus wxMacWindowEventHandler( EventHandlerCallRef handler , EventRef DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacWindowEventHandler ) +#if !TARGET_API_MAC_OSX + // --------------------------------------------------------------------------- // UserPane events for non OSX builds // --------------------------------------------------------------------------- @@ -519,10 +531,13 @@ ControlUserPaneActivateUPP gControlUserPaneActivateUPP = NULL ; ControlUserPaneFocusUPP gControlUserPaneFocusUPP = NULL ; ControlUserPaneBackgroundUPP gControlUserPaneBackgroundUPP = NULL ; +#endif + // =========================================================================== // implementation // =========================================================================== +#if KEY_wxList_DEPRECATED wxList wxWinMacControlList(wxKEY_INTEGER); wxWindow *wxFindControlFromMacControl(ControlRef inControl ) @@ -547,6 +562,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 ; @@ -655,9 +706,12 @@ void wxWindowMac::Init() m_macBackgroundBrush = wxNullBrush ; m_macIsUserPane = TRUE; - +#if wxMAC_USE_CORE_GRAPHICS + m_cgContextRef = NULL ; +#endif // make sure all proc ptrs are available +#if !TARGET_API_MAC_OSX if ( gControlUserPaneDrawUPP == NULL ) { gControlUserPaneDrawUPP = NewControlUserPaneDrawUPP( wxMacControlUserPaneDrawProc ) ; @@ -669,6 +723,7 @@ void wxWindowMac::Init() gControlUserPaneFocusUPP = NewControlUserPaneFocusUPP( wxMacControlUserPaneFocusProc ) ; gControlUserPaneBackgroundUPP = NewControlUserPaneBackgroundUPP( wxMacControlUserPaneBackgroundProc ) ; } +#endif if ( wxMacLiveScrollbarActionUPP == NULL ) { wxMacLiveScrollbarActionUPP = NewControlActionUPP( wxMacLiveScrollbarActionProc ); @@ -795,6 +850,19 @@ void wxWindowMac::MacInstallEventHandler( WXWidget control ) InstallControlEventHandler( (ControlRef) control , GetwxMacWindowEventHandlerUPP(), GetEventTypeCount(eventList), eventList, this, (EventHandlerRef *)&m_macControlEventHandler); +#if !TARGET_API_MAC_OSX + if ( (ControlRef) control == m_peer->GetControlRef() ) + { + m_peer->SetData(kControlEntireControl,kControlUserPaneDrawProcTag,&gControlUserPaneDrawUPP) ; + m_peer->SetData(kControlEntireControl,kControlUserPaneHitTestProcTag,&gControlUserPaneHitTestUPP) ; + m_peer->SetData(kControlEntireControl,kControlUserPaneTrackingProcTag,&gControlUserPaneTrackingUPP) ; + m_peer->SetData(kControlEntireControl,kControlUserPaneIdleProcTag,&gControlUserPaneIdleUPP) ; + m_peer->SetData(kControlEntireControl,kControlUserPaneKeyDownProcTag,&gControlUserPaneKeyDownUPP) ; + m_peer->SetData(kControlEntireControl,kControlUserPaneActivateProcTag,&gControlUserPaneActivateUPP) ; + m_peer->SetData(kControlEntireControl,kControlUserPaneFocusProcTag,&gControlUserPaneFocusUPP) ; + m_peer->SetData(kControlEntireControl,kControlUserPaneBackgroundProcTag,&gControlUserPaneBackgroundUPP) ; + } +#endif } @@ -810,8 +878,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 ) @@ -834,16 +900,6 @@ bool wxWindowMac::Create(wxWindowMac *parent, wxWindowID id, MacPostControlCreate(pos,size) ; -#if !TARGET_API_MAC_OSX - m_peer->SetData(kControlEntireControl,kControlUserPaneDrawProcTag,&gControlUserPaneDrawUPP) ; - m_peer->SetData(kControlEntireControl,kControlUserPaneHitTestProcTag,&gControlUserPaneHitTestUPP) ; - m_peer->SetData(kControlEntireControl,kControlUserPaneTrackingProcTag,&gControlUserPaneTrackingUPP) ; - m_peer->SetData(kControlEntireControl,kControlUserPaneIdleProcTag,&gControlUserPaneIdleUPP) ; - m_peer->SetData(kControlEntireControl,kControlUserPaneKeyDownProcTag,&gControlUserPaneKeyDownUPP) ; - m_peer->SetData(kControlEntireControl,kControlUserPaneActivateProcTag,&gControlUserPaneActivateUPP) ; - m_peer->SetData(kControlEntireControl,kControlUserPaneFocusProcTag,&gControlUserPaneFocusUPP) ; - m_peer->SetData(kControlEntireControl,kControlUserPaneBackgroundProcTag,&gControlUserPaneBackgroundUPP) ; -#endif } #ifndef __WXUNIVERSAL__ // Don't give scrollbars to wxControls unless they ask for them @@ -860,17 +916,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 ) ; @@ -1351,12 +1422,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 @@ -1379,12 +1450,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 @@ -1411,12 +1482,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 ) ; @@ -1655,9 +1726,13 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height) RectRgn( updateOuter , &rect ) ; DiffRgn( updateOuter , updateInner ,updateOuter ) ; wxPoint parent(0,0); +#if TARGET_API_MAC_OSX + // no offsetting needed when compositing +#else GetParent()->MacWindowToRootWindow( &parent.x , &parent.y ) ; parent -= GetParent()->GetClientAreaOrigin() ; OffsetRgn( updateOuter , -parent.x , -parent.y ) ; +#endif CopyRgn( updateOuter , updateTotal ) ; rect = r ; @@ -1669,7 +1744,7 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height) OffsetRgn( updateOuter , -parent.x , -parent.y ) ; UnionRgn( updateOuter , updateTotal , updateTotal ) ; - GetParent()->m_peer->SetNeedsDisplay( true , updateTotal ) ; + GetParent()->m_peer->SetNeedsDisplay( true , updateTotal ) ; DisposeRgn(updateOuter) ; DisposeRgn(updateInner) ; DisposeRgn(updateTotal) ; @@ -1721,10 +1796,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() ; @@ -1869,11 +1946,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; } @@ -1900,7 +1980,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(); @@ -1916,7 +1996,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(); @@ -1932,7 +2012,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(); @@ -1966,6 +2046,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(); @@ -2154,31 +2237,6 @@ void wxWindowMac::Thaw() #endif } -void wxWindowMac::MacRedrawControl() -{ -/* - if ( *m_peer && MacGetTopLevelWindowRef() && m_peer->IsVisible()) - { -#if TARGET_API_MAC_CARBON - Update() ; -#else - wxClientDC dc(this) ; - wxMacPortSetter helper(&dc) ; - wxMacWindowClipper clipper(this) ; - wxDC::MacSetupBackgroundForCurrentPort( MacGetBackgroundBrush() ) ; - UMADrawControl( *m_peer ) ; -#endif - } -*/ -} - -/* TODO -void wxWindowMac::OnPaint(wxPaintEvent& event) -{ - // why don't we skip that here ? -} -*/ - wxWindowMac *wxGetActiveWindow() { // actually this is a windows-only concept @@ -2271,16 +2329,89 @@ void wxWindowMac::SetScrollPos(int orient, int pos, bool refresh) } } -void wxWindowMac::MacPaintBorders( int left , int top ) +// +// we draw borders and grow boxes, are already set up and clipped in the current port / cgContextRef +// our own window origin is at leftOrigin/rightOrigin +// + +void wxWindowMac::MacPaintBorders( int leftOrigin , int rightOrigin ) { if( IsTopLevel() ) return ; Rect rect ; + bool hasFocus = m_peer->NeedsFocusRect() && m_peer->HasFocus() ; + bool hasBothScrollbars = ( m_hScrollBar && m_hScrollBar->IsShown()) && ( m_vScrollBar && m_vScrollBar->IsShown()) ; + m_peer->GetRect( &rect ) ; InsetRect( &rect, -MacGetLeftBorderSize() , -MacGetTopBorderSize() ) ; - if ( !IsTopLevel() ) +#if wxMAC_USE_CORE_GRAPHICS && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 + if ( HIThemeDrawFrame != 0) + { + Rect srect = rect ; + HIThemeFrameDrawInfo info ; + memset( &info, 0 , sizeof( info ) ) ; + + info.version = 0 ; + info.kind = 0 ; + info.state = IsEnabled() ? kThemeStateActive : kThemeStateInactive ; + info.isFocused = hasFocus ; + bool draw = false ; + + CGContextRef cgContext = (CGContextRef) GetParent()->MacGetCGContextRef() ; + wxASSERT( cgContext ) ; + + if (HasFlag(wxRAISED_BORDER) || HasFlag( wxSUNKEN_BORDER) || HasFlag(wxDOUBLE_BORDER) ) + { + SInt32 border = 0 ; + GetThemeMetric( kThemeMetricEditTextFrameOutset , &border ) ; + InsetRect( &srect , border , border ); + info.kind = kHIThemeFrameTextFieldSquare ; + draw = true ; + } + else if (HasFlag(wxSIMPLE_BORDER)) + { + SInt32 border = 0 ; + GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ; + InsetRect( &srect , border , border ); + info.kind = kHIThemeFrameListBox ; + draw = true ; + } + + if ( draw ) + { + CGRect cgrect = CGRectMake( srect.left , srect.top , srect.right - srect.left , + srect.bottom - srect.top ) ; + HIThemeDrawFrame( &cgrect , &info , cgContext , kHIThemeOrientationNormal ) ; + } + else if ( hasFocus ) + { + srect = rect ; + CGRect cgrect = CGRectMake( srect.left , srect.top , srect.right - srect.left , + srect.bottom - srect.top ) ; + HIThemeDrawFocusRect( &cgrect , true , cgContext , kHIThemeOrientationNormal ) ; + } + + m_peer->GetRect( &rect ) ; + if ( hasBothScrollbars ) + { + srect = rect ; + int size = m_hScrollBar->GetWindowVariant() == wxWINDOW_VARIANT_NORMAL ? 16 : 12 ; + CGRect cgrect = CGRectMake( srect.right - size , srect.bottom - size , size , size ) ; + CGPoint cgpoint = CGPointMake( srect.right - size , srect.bottom - size ) ; + HIThemeGrowBoxDrawInfo info ; + memset( &info, 0 , sizeof( info ) ) ; + info.version = 0 ; + info.state = IsEnabled() ? kThemeStateActive : kThemeStateInactive ; + info.kind = kHIThemeGrowBoxKindNone ; + info.size = kHIThemeGrowBoxSizeNormal ; + info.direction = kThemeGrowRight | kThemeGrowDown ; + HIThemeDrawGrowBox( &cgpoint , &info , cgContext , kHIThemeOrientationNormal ) ; + } + } + else +#endif { wxTopLevelWindowMac* top = MacGetTopLevelWindow(); if (top) @@ -2292,23 +2423,34 @@ void wxWindowMac::MacPaintBorders( int left , int top ) rect.top += pt.y ; rect.bottom += pt.y ; } - } - if (HasFlag(wxRAISED_BORDER) || HasFlag( wxSUNKEN_BORDER) || HasFlag(wxDOUBLE_BORDER) ) - { - Rect srect = rect ; - SInt32 border = 0 ; - GetThemeMetric( kThemeMetricEditTextFrameOutset , &border ) ; - InsetRect( &srect , border , border ); - DrawThemeEditTextFrame(&srect,IsEnabled() ? kThemeStateActive : kThemeStateInactive) ; - } - else if (HasFlag(wxSIMPLE_BORDER)) - { - Rect srect = rect ; - SInt32 border = 0 ; - GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ; - InsetRect( &srect , border , border ); - DrawThemeListBoxFrame(&rect,IsEnabled() ? kThemeStateActive : kThemeStateInactive) ; + if (HasFlag(wxRAISED_BORDER) || HasFlag( wxSUNKEN_BORDER) || HasFlag(wxDOUBLE_BORDER) ) + { + Rect srect = rect ; + SInt32 border = 0 ; + GetThemeMetric( kThemeMetricEditTextFrameOutset , &border ) ; + InsetRect( &srect , border , border ); + DrawThemeEditTextFrame(&srect,IsEnabled() ? kThemeStateActive : kThemeStateInactive) ; + } + else if (HasFlag(wxSIMPLE_BORDER)) + { + Rect srect = rect ; + SInt32 border = 0 ; + GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ; + InsetRect( &srect , border , border ); + DrawThemeListBoxFrame(&rect,IsEnabled() ? kThemeStateActive : kThemeStateInactive) ; + } + + if ( hasFocus ) + { + Rect srect = rect ; + DrawThemeFocusRect( &srect , true ) ; + } + if ( hasBothScrollbars ) + { + // GetThemeStandaloneGrowBoxBounds + //DrawThemeStandaloneNoGrowBox + } } } @@ -2339,8 +2481,8 @@ void wxWindowMac::SetScrollbar(int orient, int pos, int thumbVisible, { if ( !m_hScrollBar->IsShown() ) m_hScrollBar->Show(true) ; - m_hScrollBar->SetScrollbar( pos , thumbVisible , range , thumbVisible , refresh ) ; } + m_hScrollBar->SetScrollbar( pos , thumbVisible , range , thumbVisible , refresh ) ; } } else @@ -2356,8 +2498,8 @@ void wxWindowMac::SetScrollbar(int orient, int pos, int thumbVisible, { if ( !m_vScrollBar->IsShown() ) m_vScrollBar->Show(true) ; - m_vScrollBar->SetScrollbar( pos , thumbVisible , range , thumbVisible , refresh ) ; } + m_vScrollBar->SetScrollbar( pos , thumbVisible , range , thumbVisible , refresh ) ; } } MacRepositionScrollBars() ; @@ -2426,12 +2568,33 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect) SectRect( &scrollrect , &r , &scrollrect ) ; } ScrollRect( &scrollrect , dx , dy , updateRgn ) ; + + // now scroll the former update region as well and add the new update region + + WindowRef rootWindow = (WindowRef) MacGetTopLevelWindowRef() ; + RgnHandle formerUpdateRgn = NewRgn() ; + RgnHandle scrollRgn = NewRgn() ; + RectRgn( scrollRgn , &scrollrect ) ; + GetWindowUpdateRgn( rootWindow , formerUpdateRgn ) ; + Point pt = {0,0} ; + LocalToGlobal( &pt ) ; + OffsetRgn( formerUpdateRgn , -pt.h , -pt.v ) ; + SectRgn( formerUpdateRgn , scrollRgn , formerUpdateRgn ) ; + if ( !EmptyRgn( formerUpdateRgn ) ) + { + MacOffsetRgn( formerUpdateRgn , dx , dy ) ; + SectRgn( formerUpdateRgn , scrollRgn , formerUpdateRgn ) ; + InvalWindowRgn(rootWindow , formerUpdateRgn ) ; + } + InvalWindowRgn(rootWindow , updateRgn ) ; + DisposeRgn( updateRgn ) ; + DisposeRgn( formerUpdateRgn ) ; + DisposeRgn( scrollRgn ) ; } - // ScrollWindowRect( (WindowRef) MacGetTopLevelWindowRef() , &scrollrect , dx , dy , kScrollWindowInvalidate, updateRgn ) ; #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; @@ -2457,36 +2620,36 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect) void wxWindowMac::MacOnScroll(wxScrollEvent &event ) { - if ( event.m_eventObject == m_vScrollBar || event.m_eventObject == m_hScrollBar ) + if ( event.GetEventObject() == m_vScrollBar || event.GetEventObject() == m_hScrollBar ) { wxScrollWinEvent wevent; wevent.SetPosition(event.GetPosition()); wevent.SetOrientation(event.GetOrientation()); - wevent.m_eventObject = this; - - if (event.m_eventType == wxEVT_SCROLL_TOP) - wevent.m_eventType = wxEVT_SCROLLWIN_TOP; - else if (event.m_eventType == wxEVT_SCROLL_BOTTOM) - wevent.m_eventType = wxEVT_SCROLLWIN_BOTTOM; - else if (event.m_eventType == wxEVT_SCROLL_LINEUP) - wevent.m_eventType = wxEVT_SCROLLWIN_LINEUP; - else if (event.m_eventType == wxEVT_SCROLL_LINEDOWN) - wevent.m_eventType = wxEVT_SCROLLWIN_LINEDOWN; - else if (event.m_eventType == wxEVT_SCROLL_PAGEUP) - wevent.m_eventType = wxEVT_SCROLLWIN_PAGEUP; - else if (event.m_eventType == wxEVT_SCROLL_PAGEDOWN) - wevent.m_eventType = wxEVT_SCROLLWIN_PAGEDOWN; - else if (event.m_eventType == wxEVT_SCROLL_THUMBTRACK) - wevent.m_eventType = wxEVT_SCROLLWIN_THUMBTRACK; - else if (event.m_eventType == wxEVT_SCROLL_THUMBRELEASE) - wevent.m_eventType = wxEVT_SCROLLWIN_THUMBRELEASE; + wevent.SetEventObject(this); + + if (event.GetEventType() == wxEVT_SCROLL_TOP) + wevent.SetEventType( wxEVT_SCROLLWIN_TOP ); + else if (event.GetEventType() == wxEVT_SCROLL_BOTTOM) + wevent.SetEventType( wxEVT_SCROLLWIN_BOTTOM ); + else if (event.GetEventType() == wxEVT_SCROLL_LINEUP) + wevent.SetEventType( wxEVT_SCROLLWIN_LINEUP ); + else if (event.GetEventType() == wxEVT_SCROLL_LINEDOWN) + wevent.SetEventType( wxEVT_SCROLLWIN_LINEDOWN ); + else if (event.GetEventType() == wxEVT_SCROLL_PAGEUP) + wevent.SetEventType( wxEVT_SCROLLWIN_PAGEUP ); + else if (event.GetEventType() == wxEVT_SCROLL_PAGEDOWN) + wevent.SetEventType( wxEVT_SCROLLWIN_PAGEDOWN ); + else if (event.GetEventType() == wxEVT_SCROLL_THUMBTRACK) + wevent.SetEventType( wxEVT_SCROLLWIN_THUMBTRACK ); + else if (event.GetEventType() == wxEVT_SCROLL_THUMBRELEASE) + wevent.SetEventType( wxEVT_SCROLLWIN_THUMBRELEASE ); GetEventHandler()->ProcessEvent(wevent); } } // Get the window with the focus -wxWindowMac *wxWindowBase::FindFocus() +wxWindowMac *wxWindowBase::DoFindFocus() { ControlRef control ; GetKeyboardFocus( GetUserFocusWindow() , &control ) ; @@ -2508,6 +2671,7 @@ void wxWindowMac::OnSetFocus(wxFocusEvent& event) if ( MacGetTopLevelWindow() && m_peer->NeedsFocusRect() ) { + #if !wxMAC_USE_CORE_GRAPHICS wxMacWindowStateSaver sv( this ) ; int w , h ; @@ -2539,6 +2703,9 @@ void wxWindowMac::OnSetFocus(wxFocusEvent& event) DisposeRgn(updateOuter) ; DisposeRgn(updateInner) ; } +#else + GetParent()->Refresh() ; +#endif } event.Skip(); @@ -2618,6 +2785,12 @@ wxString wxWindowMac::MacGetToolTipString( wxPoint &pt ) return wxEmptyString ; } +void wxWindowMac::ClearBackground() +{ + Refresh() ; + Update() ; +} + void wxWindowMac::Update() { #if TARGET_API_MAC_OSX @@ -2679,7 +2852,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() ; @@ -2763,8 +2936,10 @@ bool wxWindowMac::MacDoRedraw( WXHRGN updatergnr , long time ) bool handled = false ; Rect updatebounds ; GetRegionBounds( updatergn , &updatebounds ) ; -// wxLogDebug("update for %s bounds %d , %d , %d , %d",typeid(*this).name() , updatebounds.left , updatebounds.top , updatebounds.right , updatebounds.bottom ) ; - if ( !EmptyRgn(updatergn) ) + + // wxLogDebug(wxT("update for %s bounds %d , %d , %d , %d"),wxString(GetClassInfo()->GetClassName()).c_str(), updatebounds.left , updatebounds.top , updatebounds.right , updatebounds.bottom ) ; + + if ( !EmptyRgn(updatergn) ) { RgnHandle newupdate = NewRgn() ; wxSize point = GetClientSize() ; @@ -2774,11 +2949,20 @@ bool wxWindowMac::MacDoRedraw( WXHRGN updatergnr , long time ) // first send an erase event to the entire update area { - wxWindowDC dc(this); - dc.SetClippingRegion(wxRegion(updatergn)); - wxEraseEvent eevent( GetId(), &dc ); + // for the toplevel window this really is the entire area + // for all the others only their client area, otherwise they + // might be drawing with full alpha and eg put blue into + // the grow-box area of a scrolled window (scroll sample) + wxDC* dc ; + if ( IsTopLevel() ) + dc = new wxWindowDC(this); + else + dc = new wxClientDC(this); + dc->SetClippingRegion(wxRegion(updatergn)); + wxEraseEvent eevent( GetId(), dc ); eevent.SetEventObject( this ); GetEventHandler()->ProcessEvent( eevent ); + delete dc ; } // calculate a client-origin version of the update rgn and set m_updateRegion to that @@ -2789,21 +2973,12 @@ bool wxWindowMac::MacDoRedraw( WXHRGN updatergnr , long time ) if ( !m_updateRegion.Empty() ) { // paint the window itself + wxPaintEvent event; - event.m_timeStamp = time ; + event.SetTimestamp(time); event.SetEventObject(this); - handled = GetEventHandler()->ProcessEvent(event); - - // we have to call the default built-in handler, as otherwise our frames will be drawn and immediately erased afterwards - if ( !handled ) - { - if ( wxTheApp->MacGetCurrentEvent() != NULL && wxTheApp->MacGetCurrentEventHandlerCallRef() != NULL ) - { - CallNextEventHandler((EventHandlerCallRef)wxTheApp->MacGetCurrentEventHandlerCallRef() , (EventRef) wxTheApp->MacGetCurrentEvent() ) ; - handled = true ; - } - } - + GetEventHandler()->ProcessEvent(event); + handled = true ; } // now we cannot rely on having its borders drawn by a window itself, as it does not @@ -2812,7 +2987,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; @@ -2820,74 +2995,44 @@ bool wxWindowMac::MacDoRedraw( WXHRGN updatergnr , long time ) if (child->IsTopLevel()) continue; if (!child->IsShown()) continue; + // only draw those in the update region (add a safety margin of 10 pixels for shadow effects + int x,y; child->GetPosition( &x, &y ); int w,h; child->GetSize( &w, &h ); Rect childRect = { y , x , y + h , x + w } ; OffsetRect( &childRect , clientOrigin.x , clientOrigin.y ) ; - if ( child->MacGetTopBorderSize() ) + InsetRect( &childRect , -10 , -10) ; + + if ( RectInRgn( &childRect , updatergn ) ) { - if ( RectInRgn( &childRect , updatergn ) ) + + // paint custom borders + wxNcPaintEvent eventNc( child->GetId() ); + eventNc.SetEventObject( child ); + if ( !child->GetEventHandler()->ProcessEvent( eventNc ) ) { - // paint custom borders - wxNcPaintEvent eventNc( child->GetId() ); - eventNc.SetEventObject( child ); - if ( !child->GetEventHandler()->ProcessEvent( eventNc ) ) +#if wxMAC_USE_CORE_GRAPHICS && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 + if ( HIThemeDrawFrame != 0) + { + child->MacPaintBorders(0,0) ; + } + else +#endif { wxWindowDC dc(this) ; dc.SetClippingRegion(wxRegion(updatergn)); wxMacPortSetter helper(&dc) ; - child->MacPaintBorders( dc.m_macLocalOrigin.x + childRect.left , dc.m_macLocalOrigin.y + childRect.top) ; + child->MacPaintBorders(0,0) ; } } } - if ( child->m_peer->NeedsFocusRect() && child->m_peer->HasFocus() ) - { - wxWindowDC dc(this) ; - dc.SetClippingRegion(wxRegion(updatergn)); - wxMacPortSetter helper(&dc) ; - Rect r = childRect ; - OffsetRect( &r , dc.m_macLocalOrigin.x , dc.m_macLocalOrigin.y ) ; - DrawThemeFocusRect( &r , true ) ; - } } } return handled ; } -void wxWindowMac::MacRedraw( WXHRGN updatergnr , long time, bool erase) -{ - RgnHandle updatergn = (RgnHandle) updatergnr ; - // updatergn is always already clipped to our boundaries - // if we are in compositing mode then it is in relative to the upper left of the control - // if we are in non-compositing, then it is relatvie to the uppder left of the content area - // of the toplevel window - // it is in window coordinates, not in client coordinates - - // ownUpdateRgn is the area that this window has to repaint, it is in window coordinates - RgnHandle ownUpdateRgn = NewRgn() ; - CopyRgn( updatergn , ownUpdateRgn ) ; - - if ( MacGetTopLevelWindow()->MacUsesCompositing() == false ) - { - Rect bounds; - m_peer->GetRectInWindowCoords( &bounds ); - RgnHandle controlRgn = NewRgn(); - RectRgn( controlRgn, &bounds ); - //KO: This sets the ownUpdateRgn to the area of this control that is inside - // the window update region - SectRgn( ownUpdateRgn, controlRgn, ownUpdateRgn ); - DisposeRgn( controlRgn ); - - //KO: convert ownUpdateRgn to local coordinates - OffsetRgn( ownUpdateRgn, -bounds.left, -bounds.top ); - } - - MacDoRedraw( ownUpdateRgn , time ) ; - DisposeRgn( ownUpdateRgn ) ; - -} WXWindow wxWindowMac::MacGetTopLevelWindowRef() const { @@ -2931,13 +3076,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); } } @@ -3035,7 +3180,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(); @@ -3048,7 +3193,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(); @@ -3142,6 +3287,14 @@ void wxWindowMac::OnMouseEvent( wxMouseEvent &event ) } } +void wxWindowMac::OnPaint( wxPaintEvent & event ) +{ + if ( wxTheApp->MacGetCurrentEvent() != NULL && wxTheApp->MacGetCurrentEventHandlerCallRef() != NULL ) + { + CallNextEventHandler((EventHandlerCallRef)wxTheApp->MacGetCurrentEventHandlerCallRef() , (EventRef) wxTheApp->MacGetCurrentEvent() ) ; + } +} + void wxWindowMac::MacHandleControlClick( WXWidget control , wxInt16 controlpart , bool WXUNUSED( mouseStillDown ) ) { }