X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0faf03bf97720044ae71c72beb4f995425ea174d..b5a9b87e1620e52f1f13d2619b4677f2b365c93f:/src/osx/window_osx.cpp diff --git a/src/osx/window_osx.cpp b/src/osx/window_osx.cpp index 4f99e89bc1..42c94ae660 100644 --- a/src/osx/window_osx.cpp +++ b/src/osx/window_osx.cpp @@ -67,9 +67,11 @@ #include "wx/osx/uma.h" #else #include "wx/osx/private.h" +#if wxOSX_USE_COCOA // bring in themeing #include #endif +#endif #define MAC_SCROLLBAR_SIZE 15 #define MAC_SMALL_SCROLLBAR_SIZE 11 @@ -83,8 +85,6 @@ #endif BEGIN_EVENT_TABLE(wxWindowMac, wxWindowBase) - EVT_NC_PAINT(wxWindowMac::OnNcPaint) - EVT_ERASE_BACKGROUND(wxWindowMac::OnEraseBackground) EVT_MOUSE_EVENTS(wxWindowMac::OnMouseEvent) END_EVENT_TABLE() @@ -200,10 +200,6 @@ WXWidget wxWindowMac::GetHandle() const return NULL; } -// -// TODO END move to window_osx.cpp -// - // --------------------------------------------------------------------------- // Utility Routines to move between different coordinate systems // --------------------------------------------------------------------------- @@ -248,7 +244,11 @@ bool wxWindowMac::Create(wxWindowMac *parent, #ifndef __WXUNIVERSAL__ // Don't give scrollbars to wxControls unless they ask for them - if ( (! IsKindOf(CLASSINFO(wxControl)) && ! IsKindOf(CLASSINFO(wxStatusBar))) + if ( (! IsKindOf(CLASSINFO(wxControl)) +#if wxUSE_STATUSBAR + && ! IsKindOf(CLASSINFO(wxStatusBar)) +#endif + ) || (IsKindOf(CLASSINFO(wxControl)) && ((style & wxHSCROLL) || (style & wxVSCROLL)))) { MacCreateScrollBars( style ) ; @@ -263,10 +263,12 @@ bool wxWindowMac::Create(wxWindowMac *parent, void wxWindowMac::MacChildAdded() { +#if wxUSE_SCROLLBAR if ( m_vScrollBar ) m_vScrollBar->Raise() ; if ( m_hScrollBar ) m_hScrollBar->Raise() ; +#endif } void wxWindowMac::MacPostControlCreate(const wxPoint& WXUNUSED(pos), const wxSize& size) @@ -331,7 +333,7 @@ void wxWindowMac::DoSetWindowVariant( wxWindowVariant variant ) break ; default: - wxFAIL_MSG(_T("unexpected window variant")); + wxFAIL_MSG(wxT("unexpected window variant")); break ; } m_peer->SetData(kControlEntireControl, kControlSizeTag, &size ) ; @@ -360,7 +362,7 @@ void wxWindowMac::DoSetWindowVariant( wxWindowVariant variant ) break ; default: - wxFAIL_MSG(_T("unexpected window variant")); + wxFAIL_MSG(wxT("unexpected window variant")); break ; } @@ -409,11 +411,25 @@ bool wxWindowMac::SetBackgroundColour(const wxColour& col ) return true ; } +static bool wxIsWindowOrParentDisabled(wxWindow* w) +{ + while (w && !w->IsTopLevel()) + { + if (!w->IsEnabled()) + return true; + w = w->GetParent(); + } + return false; +} + void wxWindowMac::SetFocus() { if ( !AcceptsFocus() ) return ; + if (wxIsWindowOrParentDisabled((wxWindow*) this)) + return; + wxWindow* former = FindFocus() ; if ( former == this ) return ; @@ -472,8 +488,8 @@ bool wxWindowMac::MacGetBoundsForControl( x = (int)pos.x; y = (int)pos.y; - w = WidthDefault( size.x ); - h = HeightDefault( size.y ); + w = WidthDefault( size.x ); + h = HeightDefault( size.y ); x += MacGetLeftBorderSize() ; y += MacGetTopBorderSize() ; @@ -509,7 +525,7 @@ void wxWindowMac::DoGetSize(int *x, int *y) const void wxWindowMac::DoGetPosition(int *x, int *y) const { int x1, y1; - + m_peer->GetPosition( x1, y1 ) ; // get the wx window position from the native one @@ -638,13 +654,13 @@ wxSize wxWindowMac::DoGetSizeFromClientSize( const wxSize & size ) const int innerwidth, innerheight; int left, top; int outerwidth, outerheight; - + m_peer->GetContentArea( left, top, innerwidth, innerheight ); m_peer->GetSize( outerwidth, outerheight ); - + sizeTotal.x += outerwidth-innerwidth; sizeTotal.y += outerheight-innerheight; - + sizeTotal.x += MacGetLeftBorderSize() + MacGetRightBorderSize() ; sizeTotal.y += MacGetTopBorderSize() + MacGetBottomBorderSize() ; @@ -657,15 +673,16 @@ void wxWindowMac::DoGetClientSize( int *x, int *y ) const int ww, hh; int left, top; - - m_peer->GetContentArea( left, top, ww, hh ); + m_peer->GetContentArea( left, top, ww, hh ); +#if wxUSE_SCROLLBAR if (m_hScrollBar && m_hScrollBar->IsShown() ) hh -= m_hScrollBar->GetSize().y ; if (m_vScrollBar && m_vScrollBar->IsShown() ) ww -= m_vScrollBar->GetSize().x ; +#endif if (x) *x = ww; if (y) @@ -760,7 +777,7 @@ void wxWindowMac::MacInvalidateBorders() // now we know that we have something to do at all int tx,ty,tw,th; - + m_peer->GetSize( tw, th ); m_peer->GetPosition( tx, ty ); @@ -768,7 +785,7 @@ void wxWindowMac::MacInvalidateBorders() wxRect rightupdate( tx+tw, ty, outerBorder, th ); wxRect topupdate( tx-outerBorder, ty-outerBorder, tw + 2 * outerBorder, outerBorder ); wxRect bottomupdate( tx-outerBorder, ty + th, tw + 2 * outerBorder, outerBorder ); - + if (GetParent()) { GetParent()->m_peer->SetNeedsDisplay(&leftupdate); GetParent()->m_peer->SetNeedsDisplay(&rightupdate); @@ -799,6 +816,8 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height) int actualX = x; int actualY = y; +#if 0 + // min and max sizes are only for sizers, not for explicit size setting if ((m_minWidth != -1) && (actualWidth < m_minWidth)) actualWidth = m_minWidth; if ((m_minHeight != -1) && (actualHeight < m_minHeight)) @@ -807,6 +826,7 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height) actualWidth = m_maxWidth; if ((m_maxHeight != -1) && (actualHeight > m_maxHeight)) actualHeight = m_maxHeight; +#endif bool doMove = false, doResize = false ; @@ -832,7 +852,7 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height) MacInvalidateBorders() ; m_cachedClippedRectValid = false ; - + m_peer->Move( bounds.x, bounds.y, bounds.width, bounds.height); wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified @@ -868,7 +888,7 @@ wxSize wxWindowMac::DoGetBestSize() const else { wxRect r ; - + m_peer->GetBestRect(&r); if ( r.GetWidth() == 0 && r.GetHeight() == 0 ) @@ -878,25 +898,30 @@ wxSize wxWindowMac::DoGetBestSize() const r.width = r.height = 16 ; - if ( IsKindOf( CLASSINFO( wxScrollBar ) ) ) + if ( 0 ) + { + } +#if wxUSE_SCROLLBAR + else if ( IsKindOf( CLASSINFO( wxScrollBar ) ) ) { r.height = 16 ; } - #if wxUSE_SPINBTN +#endif +#if wxUSE_SPINBTN else if ( IsKindOf( CLASSINFO( wxSpinButton ) ) ) { r.height = 24 ; } - #endif +#endif else { // return wxWindowBase::DoGetBestSize() ; } } - int bestWidth = r.width + MacGetLeftBorderSize() + + int bestWidth = r.width + MacGetLeftBorderSize() + MacGetRightBorderSize(); - int bestHeight = r.height + MacGetTopBorderSize() + + int bestHeight = r.height + MacGetTopBorderSize() + MacGetBottomBorderSize(); if ( bestHeight < 10 ) bestHeight = 13 ; @@ -1008,9 +1033,14 @@ void wxWindowMac::DoSetClientSize(int clientwidth, int clientheight) void wxWindowMac::SetLabel(const wxString& title) { + if ( title == m_label ) + return; + m_label = title ; - if ( m_peer && m_peer->IsOk() && !(IsKindOf( CLASSINFO(wxButton) ) && GetId() == wxID_HELP) ) + InvalidateBestSize(); + + if ( m_peer && m_peer->IsOk() ) m_peer->SetLabel( wxStripMenuCodes(m_label, wxStrip_Mnemonics), GetFont().GetEncoding() ) ; // do not trigger refreshes upon invisible and possible partly created objects @@ -1090,8 +1120,11 @@ int wxWindowMac::GetCharWidth() const return width; } -void wxWindowMac::GetTextExtent(const wxString& str, int *x, int *y, - int *descent, int *externalLeading, const wxFont *theFont ) const +void wxWindowMac::DoGetTextExtent(const wxString& str, + int *x, int *y, + int *descent, + int *externalLeading, + const wxFont *theFont) const { const wxFont *fontToUse = theFont; wxFont tempFont; @@ -1106,9 +1139,9 @@ void wxWindowMac::GetTextExtent(const wxString& str, int *x, int *y, wxDouble h , d , e , w; ctx->GetTextExtent( str, &w, &h, &d, &e ); - + delete ctx; - + if ( externalLeading ) *externalLeading = (wxCoord)(e+0.5); if ( descent ) @@ -1131,7 +1164,7 @@ void wxWindowMac::Refresh(bool WXUNUSED(eraseBack), const wxRect *rect) if ( !IsShownOnScreen() ) return ; - + m_peer->SetNeedsDisplay( rect ) ; } @@ -1166,41 +1199,9 @@ void wxWindowMac::WarpPointer(int WXUNUSED(x_pos), int WXUNUSED(y_pos)) // We really don't move the mouse programmatically under Mac. } -void wxWindowMac::OnEraseBackground(wxEraseEvent& event) -{ - if ( MacGetTopLevelWindow() == NULL ) - return ; -/* -#if TARGET_API_MAC_OSX - if ( !m_backgroundColour.Ok() || GetBackgroundStyle() == wxBG_STYLE_TRANSPARENT ) - { - } - else -#endif -*/ - if ( GetBackgroundStyle() == wxBG_STYLE_COLOUR ) - { - event.GetDC()->Clear() ; - } - else if ( GetBackgroundStyle() == wxBG_STYLE_CUSTOM ) - { - // don't skip the event here, custom background means that the app - // is drawing it itself in its OnPaint(), so don't draw it at all - // now to avoid flicker - } - else - { - event.Skip() ; - } -} - -void wxWindowMac::OnNcPaint( wxNcPaintEvent& event ) -{ - event.Skip() ; -} - int wxWindowMac::GetScrollPos(int orient) const { +#if wxUSE_SCROLLBAR if ( orient == wxHORIZONTAL ) { if ( m_hScrollBar ) @@ -1211,7 +1212,7 @@ int wxWindowMac::GetScrollPos(int orient) const if ( m_vScrollBar ) return m_vScrollBar->GetThumbPosition() ; } - +#endif return 0; } @@ -1219,6 +1220,7 @@ int wxWindowMac::GetScrollPos(int orient) const // of positions that we can scroll. int wxWindowMac::GetScrollRange(int orient) const { +#if wxUSE_SCROLLBAR if ( orient == wxHORIZONTAL ) { if ( m_hScrollBar ) @@ -1229,12 +1231,13 @@ int wxWindowMac::GetScrollRange(int orient) const if ( m_vScrollBar ) return m_vScrollBar->GetRange() ; } - +#endif return 0; } int wxWindowMac::GetScrollThumb(int orient) const { +#if wxUSE_SCROLLBAR if ( orient == wxHORIZONTAL ) { if ( m_hScrollBar ) @@ -1245,12 +1248,13 @@ int wxWindowMac::GetScrollThumb(int orient) const if ( m_vScrollBar ) return m_vScrollBar->GetThumbSize() ; } - +#endif return 0; } void wxWindowMac::SetScrollPos(int orient, int pos, bool WXUNUSED(refresh)) { +#if wxUSE_SCROLLBAR if ( orient == wxHORIZONTAL ) { if ( m_hScrollBar ) @@ -1261,6 +1265,7 @@ void wxWindowMac::SetScrollPos(int orient, int pos, bool WXUNUSED(refresh)) if ( m_vScrollBar ) m_vScrollBar->SetThumbPosition( pos ) ; } +#endif } void @@ -1294,13 +1299,14 @@ void wxWindowMac::MacPaintGrowBox() if ( IsTopLevel() ) return ; +#if wxUSE_SCROLLBAR if ( MacHasScrollBarCorner() ) { CGContextRef cgContext = (CGContextRef) MacGetCGContextRef() ; wxASSERT( cgContext ) ; int tx,ty,tw,th; - + m_peer->GetSize( tw, th ); m_peer->GetPosition( tx, ty ); @@ -1322,6 +1328,7 @@ void wxWindowMac::MacPaintGrowBox() CGContextFillRect( cgContext, cgrect ); CGContextRestoreGState( cgContext ); } +#endif } void wxWindowMac::MacPaintBorders( int WXUNUSED(leftOrigin) , int WXUNUSED(rightOrigin) ) @@ -1333,7 +1340,7 @@ void wxWindowMac::MacPaintBorders( int WXUNUSED(leftOrigin) , int WXUNUSED(right // back to the surrounding frame rectangle int tx,ty,tw,th; - + m_peer->GetSize( tw, th ); m_peer->GetPosition( tx, ty ); @@ -1371,7 +1378,7 @@ void wxWindowMac::MacPaintBorders( int WXUNUSED(leftOrigin) , int WXUNUSED(right HIThemeDrawFrame( &cgrect , &info , cgContext , kHIThemeOrientationNormal ) ; } } - + if ( hasFocus ) { HIThemeDrawFocusRect( &cgrect , true , cgContext , kHIThemeOrientationNormal ) ; @@ -1382,16 +1389,18 @@ void wxWindowMac::MacPaintBorders( int WXUNUSED(leftOrigin) , int WXUNUSED(right void wxWindowMac::RemoveChild( wxWindowBase *child ) { +#if wxUSE_SCROLLBAR if ( child == m_hScrollBar ) m_hScrollBar = NULL ; if ( child == m_vScrollBar ) m_vScrollBar = NULL ; - +#endif wxWindowBase::RemoveChild( child ) ; } void wxWindowMac::DoUpdateScrollbarVisibility() { +#if wxUSE_SCROLLBAR bool triggerSizeEvent = false; if ( m_hScrollBar ) @@ -1423,18 +1432,21 @@ void wxWindowMac::DoUpdateScrollbarVisibility() event.SetEventObject(this); HandleWindowEvent(event); } +#endif } // New function that will replace some of the above. void wxWindowMac::SetScrollbar(int orient, int pos, int thumb, int range, bool refresh) { +#if wxUSE_SCROLLBAR if ( orient == wxHORIZONTAL && m_hScrollBar ) m_hScrollBar->SetScrollbar(pos, thumb, range, thumb, refresh); else if ( orient == wxVERTICAL && m_vScrollBar ) m_vScrollBar->SetScrollbar(pos, thumb, range, thumb, refresh); DoUpdateScrollbarVisibility(); +#endif } // Does a physical scroll @@ -1463,10 +1475,12 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect) child = node->GetData(); if (child == NULL) continue; +#if wxUSE_SCROLLBAR if (child == m_vScrollBar) continue; if (child == m_hScrollBar) continue; +#endif if (child->IsTopLevel()) continue; @@ -1487,6 +1501,7 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect) void wxWindowMac::MacOnScroll( wxScrollEvent &event ) { +#if wxUSE_SCROLLBAR if ( event.GetEventObject() == m_vScrollBar || event.GetEventObject() == m_hScrollBar ) { wxScrollWinEvent wevent; @@ -1513,18 +1528,12 @@ void wxWindowMac::MacOnScroll( wxScrollEvent &event ) HandleWindowEvent(wevent); } +#endif } -// Get the window with the focus wxWindow *wxWindowBase::DoFindFocus() { -#if wxOSX_USE_CARBON - ControlRef control ; - GetKeyboardFocus( GetUserFocusWindow() , &control ) ; - return wxFindWindowFromWXWidget( (WXWidget) control ) ; -#else - return NULL; -#endif + return wxFindWindowFromWXWidget(wxWidgetImpl::FindFocus()); } void wxWindowMac::OnInternalIdle() @@ -1684,7 +1693,7 @@ void wxWindowMac::MacUpdateClippedRects() const Rect rIncludingOuterStructures ; int tx,ty,tw,th; - + m_peer->GetSize( tw, th ); m_peer->GetPosition( tx, ty ); @@ -1771,37 +1780,61 @@ void wxWindowMac::MacUpdateClippedRects() const bool wxWindowMac::MacDoRedraw( long time ) { bool handled = false ; - + wxRegion formerUpdateRgn = m_updateRegion; wxRegion clientUpdateRgn = formerUpdateRgn; - wxSize sz = GetClientSize() ; - wxPoint origin = GetClientAreaOrigin() ; - - clientUpdateRgn.Intersect(origin.x , origin.y , origin.x + sz.x , origin.y + sz.y); - + const wxRect clientRect = GetClientRect(); + + clientUpdateRgn.Intersect(clientRect); + // first send an erase event to the entire update area + const wxBackgroundStyle bgStyle = GetBackgroundStyle(); + switch ( bgStyle ) { - // 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 = new wxWindowDC(this); - if ( IsTopLevel() ) - dc->SetDeviceClippingRegion(formerUpdateRgn); - else - dc->SetDeviceClippingRegion(clientUpdateRgn); + case wxBG_STYLE_ERASE: + case wxBG_STYLE_SYSTEM: + { + // 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) + wxWindowDC dc(this); + if ( IsTopLevel() ) + dc.SetDeviceClippingRegion(formerUpdateRgn); + else + dc.SetDeviceClippingRegion(clientUpdateRgn); + + if ( bgStyle == wxBG_STYLE_ERASE ) + { + wxEraseEvent eevent( GetId(), &dc ); + eevent.SetEventObject( this ); + if ( ProcessWindowEvent( eevent ) ) + break; + } - wxEraseEvent eevent( GetId(), dc ); - eevent.SetEventObject( this ); - HandleWindowEvent( eevent ); - delete dc ; + if ( UseBgCol() ) + { + dc.SetBackground(GetBackgroundColour()); + dc.Clear(); + } + } + break; + + case wxBG_STYLE_PAINT: + // nothing to do, user-defined EVT_PAINT handler will overwrite the + // entire window client area + break; + + default: + wxFAIL_MSG( "unsupported background style" ); } MacPaintGrowBox(); - // calculate a client-origin version of the update rgn and set m_updateRegion to that - clientUpdateRgn.Offset( -origin.x , -origin.y ); + // calculate a client-origin version of the update rgn and set + // m_updateRegion to that + clientUpdateRgn.Offset(-clientRect.GetPosition()); m_updateRegion = clientUpdateRgn ; if ( !m_updateRegion.Empty() ) @@ -1833,10 +1866,12 @@ void wxWindowMac::MacPaintChildrenBorders() child = node->GetData(); if (child == NULL) continue; +#if wxUSE_SCROLLBAR if (child == m_vScrollBar) continue; if (child == m_hScrollBar) continue; +#endif if (child->IsTopLevel()) continue; if (!child->IsShown()) @@ -1846,7 +1881,7 @@ void wxWindowMac::MacPaintChildrenBorders() child->GetPosition( &x, &y ); child->GetSize( &w, &h ); - + if ( m_updateRegion.Contains(clientOrigin.x+x-10, clientOrigin.y+y-10, w+20, h+20) ) { // paint custom borders @@ -1863,12 +1898,13 @@ void wxWindowMac::MacPaintChildrenBorders() WXWindow wxWindowMac::MacGetTopLevelWindowRef() const { - wxNonOwnedWindow* tlw = MacGetTopLevelWindow(); + wxNonOwnedWindow* tlw = MacGetTopLevelWindow(); return tlw ? tlw->GetWXWindow() : NULL ; } bool wxWindowMac::MacHasScrollBarCorner() const { +#if wxUSE_SCROLLBAR /* Returns whether the scroll bars in a wxScrolledWindow should be * shortened. Scroll bars should be shortened if either: * @@ -1929,10 +1965,14 @@ bool wxWindowMac::MacHasScrollBarCorner() const // No parent frame found return false ; } +#else + return false; +#endif } void wxWindowMac::MacCreateScrollBars( long style ) { +#if wxUSE_SCROLLBAR wxASSERT_MSG( m_vScrollBar == NULL && m_hScrollBar == NULL , wxT("attempt to create window twice") ) ; if ( style & ( wxVSCROLL | wxHSCROLL ) ) @@ -1969,17 +2009,23 @@ void wxWindowMac::MacCreateScrollBars( long style ) // because the create does not take into account the client area origin // we might have a real position shift MacRepositionScrollBars() ; +#endif } bool wxWindowMac::MacIsChildOfClientArea( const wxWindow* child ) const { - bool result = ((child == NULL) || ((child != m_hScrollBar) && (child != m_vScrollBar))); + bool result = ((child == NULL) +#if wxUSE_SCROLLBAR + || ((child != m_hScrollBar) && (child != m_vScrollBar)) +#endif + ); return result ; } void wxWindowMac::MacRepositionScrollBars() { +#if wxUSE_SCROLLBAR if ( !m_hScrollBar && !m_vScrollBar ) return ; @@ -2002,11 +2048,15 @@ void wxWindowMac::MacRepositionScrollBars() m_vScrollBar->SetSize( vPoint.x , vPoint.y, vSize.x, vSize.y , wxSIZE_ALLOW_MINUS_ONE ); if ( m_hScrollBar ) m_hScrollBar->SetSize( hPoint.x , hPoint.y, hSize.x, hSize.y, wxSIZE_ALLOW_MINUS_ONE ); +#endif } bool wxWindowMac::AcceptsFocus() const { - return m_peer->CanFocus() && wxWindowBase::AcceptsFocus(); + if ( MacIsUserPane() ) + return wxWindowBase::AcceptsFocus(); + else + return m_peer->CanFocus(); } void wxWindowMac::MacSuperChangedPosition() @@ -2168,7 +2218,7 @@ wxInt32 wxWindowMac::MacControlHit(WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENT #if wxOSX_USE_COCOA_OR_CARBON if ( OSXHandleClicked( GetEventTime((EventRef)event) ) ) return noErr; - + return eventNotHandledErr ; #else return 0; @@ -2274,7 +2324,7 @@ bool wxWindowMac::OSXHandleKeyEvent( wxKeyEvent& event ) } // -// wxWidgetImpl +// wxWidgetImpl // WX_DECLARE_HASH_MAP(WXWidget, wxWidgetImpl*, wxPointerHash, wxPointerEqual, MacControlMap); @@ -2286,7 +2336,7 @@ wxWindowMac *wxFindWindowFromWXWidget(WXWidget inControl ) wxWidgetImpl* impl = wxWidgetImpl::FindFromWXWidget( inControl ); if ( impl ) return impl->GetWXPeer(); - + return NULL; }