X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/71f2fb52d502537fcfa9a110c7ecb59d7f9a5b6b..ee799df7ff8370ca172c7c2fe8306313a7766c7f:/src/mac/carbon/window.cpp diff --git a/src/mac/carbon/window.cpp b/src/mac/carbon/window.cpp index 83c5fba382..692f4ade2a 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,6 +531,8 @@ ControlUserPaneActivateUPP gControlUserPaneActivateUPP = NULL ; ControlUserPaneFocusUPP gControlUserPaneFocusUPP = NULL ; ControlUserPaneBackgroundUPP gControlUserPaneBackgroundUPP = NULL ; +#endif + // =========================================================================== // implementation // =========================================================================== @@ -692,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 ) ; @@ -706,6 +723,7 @@ void wxWindowMac::Init() gControlUserPaneFocusUPP = NewControlUserPaneFocusUPP( wxMacControlUserPaneFocusProc ) ; gControlUserPaneBackgroundUPP = NewControlUserPaneBackgroundUPP( wxMacControlUserPaneBackgroundProc ) ; } +#endif if ( wxMacLiveScrollbarActionUPP == NULL ) { wxMacLiveScrollbarActionUPP = NewControlActionUPP( wxMacLiveScrollbarActionProc ); @@ -895,6 +913,19 @@ 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") ) ; @@ -907,6 +938,7 @@ void wxWindowMac::MacPostControlCreate(const wxPoint& pos, const wxSize& size) 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 ) ; @@ -1387,12 +1419,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 @@ -1415,12 +1447,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 @@ -1447,12 +1479,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 ) ; @@ -1691,9 +1723,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 ; @@ -1705,7 +1741,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) ; @@ -2007,6 +2043,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(); @@ -2195,31 +2234,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 @@ -2312,16 +2326,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) @@ -2333,23 +2420,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 + } } } @@ -2380,8 +2478,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 @@ -2397,8 +2495,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() ; @@ -2467,8 +2565,29 @@ 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 } @@ -2498,29 +2617,29 @@ 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); } @@ -2549,6 +2668,7 @@ void wxWindowMac::OnSetFocus(wxFocusEvent& event) if ( MacGetTopLevelWindow() && m_peer->NeedsFocusRect() ) { + #if !wxMAC_USE_CORE_GRAPHICS wxMacWindowStateSaver sv( this ) ; int w , h ; @@ -2580,6 +2700,9 @@ void wxWindowMac::OnSetFocus(wxFocusEvent& event) DisposeRgn(updateOuter) ; DisposeRgn(updateInner) ; } +#else + GetParent()->Refresh() ; +#endif } event.Skip(); @@ -2659,6 +2782,12 @@ wxString wxWindowMac::MacGetToolTipString( wxPoint &pt ) return wxEmptyString ; } +void wxWindowMac::ClearBackground() +{ + Refresh() ; + Update() ; +} + void wxWindowMac::Update() { #if TARGET_API_MAC_OSX @@ -2720,7 +2849,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() ; @@ -2804,8 +2933,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() ; @@ -2815,11 +2946,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 @@ -2830,21 +2970,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 @@ -2861,74 +2992,46 @@ 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 { +#if !wxMAC_USE_CORE_GRAPHICS 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) ; +#endif } } } - 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 { @@ -2972,13 +3075,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); } } @@ -3183,6 +3286,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 ) ) { }