- 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 ( orient == wxHORIZONTAL )
- {
- if ( m_hScrollBar )
- return m_hScrollBar->GetThumbPosition() ;
- }
- else
- {
- if ( m_vScrollBar )
- return m_vScrollBar->GetThumbPosition() ;
- }
-
- return 0;
-}
-
-// This now returns the whole range, not just the number
-// of positions that we can scroll.
-int wxWindowMac::GetScrollRange(int orient) const
-{
- if ( orient == wxHORIZONTAL )
- {
- if ( m_hScrollBar )
- return m_hScrollBar->GetRange() ;
- }
- else
- {
- if ( m_vScrollBar )
- return m_vScrollBar->GetRange() ;
- }
-
- return 0;
-}
-
-int wxWindowMac::GetScrollThumb(int orient) const
-{
- if ( orient == wxHORIZONTAL )
- {
- if ( m_hScrollBar )
- return m_hScrollBar->GetThumbSize() ;
- }
- else
- {
- if ( m_vScrollBar )
- return m_vScrollBar->GetThumbSize() ;
- }
-
- return 0;
-}
-
-void wxWindowMac::SetScrollPos(int orient, int pos, bool WXUNUSED(refresh))
-{
- if ( orient == wxHORIZONTAL )
- {
- if ( m_hScrollBar )
- m_hScrollBar->SetThumbPosition( pos ) ;
- }
- else
- {
- if ( m_vScrollBar )
- m_vScrollBar->SetThumbPosition( pos ) ;
- }
-}
-
-void
-wxWindowMac::AlwaysShowScrollbars(bool hflag, bool vflag)
-{
- bool needVisibilityUpdate = false;
-
- if ( m_hScrollBarAlwaysShown != hflag )
- {
- m_hScrollBarAlwaysShown = hflag;
- needVisibilityUpdate = true;
- }
-
- if ( m_vScrollBarAlwaysShown != vflag )
- {
- m_vScrollBarAlwaysShown = vflag;
- needVisibilityUpdate = true;
- }
-
- if ( needVisibilityUpdate )
- DoUpdateScrollbarVisibility();
-}
-
-//
-// 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::MacPaintGrowBox()
-{
- if ( IsTopLevel() )
- return ;
-
- if ( MacHasScrollBarCorner() )
- {
- Rect rect ;
-
- CGContextRef cgContext = (CGContextRef) MacGetCGContextRef() ;
- wxASSERT( cgContext ) ;
-
- m_peer->GetRect( &rect ) ;
-
- int size = m_hScrollBar ? m_hScrollBar->GetSize().y : ( m_vScrollBar ? m_vScrollBar->GetSize().x : MAC_SCROLLBAR_SIZE ) ;
- CGRect cgrect = CGRectMake( rect.right - size , rect.bottom - size , size , size ) ;
- CGPoint cgpoint = CGPointMake( rect.right - size , rect.bottom - size ) ;
- CGContextSaveGState( cgContext );
-
- if ( m_backgroundColour.Ok() )
- {
- CGContextSetFillColorWithColor( cgContext, m_backgroundColour.GetCGColor() );
- }
- else
- {
- CGContextSetRGBFillColor( cgContext, (CGFloat) 1.0, (CGFloat)1.0 ,(CGFloat) 1.0 , (CGFloat)1.0 );
- }
- CGContextFillRect( cgContext, cgrect );
- CGContextRestoreGState( cgContext );
- }
-}
-
-void wxWindowMac::MacPaintBorders( int WXUNUSED(leftOrigin) , int WXUNUSED(rightOrigin) )
-{
- if ( IsTopLevel() )
- return ;
-
- Rect rect ;
- bool hasFocus = m_peer->NeedsFocusRect() && m_peer->HasFocus() ;
-
- // back to the surrounding frame rectangle
- m_peer->GetRect( &rect ) ;
- InsetRect( &rect, -1 , -1 ) ;
-
- {
- CGRect cgrect = CGRectMake( rect.left , rect.top , rect.right - rect.left ,
- rect.bottom - rect.top ) ;
-
- HIThemeFrameDrawInfo info ;
- memset( &info, 0 , sizeof(info) ) ;
-
- info.version = 0 ;
- info.kind = 0 ;
- info.state = IsEnabled() ? kThemeStateActive : kThemeStateInactive ;
- info.isFocused = hasFocus ;
-
- CGContextRef cgContext = (CGContextRef) GetParent()->MacGetCGContextRef() ;
- wxASSERT( cgContext ) ;
-
- if ( HasFlag(wxRAISED_BORDER) || HasFlag(wxSUNKEN_BORDER) || HasFlag(wxDOUBLE_BORDER) )
- {
- info.kind = kHIThemeFrameTextFieldSquare ;
- HIThemeDrawFrame( &cgrect , &info , cgContext , kHIThemeOrientationNormal ) ;
- }
- else if ( HasFlag(wxSIMPLE_BORDER) )
- {
- info.kind = kHIThemeFrameListBox ;
- HIThemeDrawFrame( &cgrect , &info , cgContext , kHIThemeOrientationNormal ) ;
- }
- else if ( hasFocus )
- {
- HIThemeDrawFocusRect( &cgrect , true , cgContext , kHIThemeOrientationNormal ) ;
- }
-#if 0 // TODO REMOVE now done in a separate call earlier in drawing the window itself
- m_peer->GetRect( &rect ) ;
- if ( MacHasScrollBarCorner() )
- {
- int variant = (m_hScrollBar == NULL ? m_vScrollBar : m_hScrollBar ) ->GetWindowVariant();
- int size = m_hScrollBar ? m_hScrollBar->GetSize().y : ( m_vScrollBar ? m_vScrollBar->GetSize().x : MAC_SCROLLBAR_SIZE ) ;
- CGRect cgrect = CGRectMake( rect.right - size , rect.bottom - size , size , size ) ;
- CGPoint cgpoint = CGPointMake( rect.right - size , rect.bottom - size ) ;
- HIThemeGrowBoxDrawInfo info ;
- memset( &info, 0, sizeof(info) ) ;
- info.version = 0 ;
- info.state = IsEnabled() ? kThemeStateActive : kThemeStateInactive ;
- info.kind = kHIThemeGrowBoxKindNone ;
- // contrary to the docs ...SizeSmall does not work
- info.size = kHIThemeGrowBoxSizeNormal ;
- info.direction = 0 ;
- HIThemeDrawGrowBox( &cgpoint , &info , cgContext , kHIThemeOrientationNormal ) ;
- }
-#endif
- }
-}
-
-void wxWindowMac::RemoveChild( wxWindowBase *child )
-{
- if ( child == m_hScrollBar )
- m_hScrollBar = NULL ;
- if ( child == m_vScrollBar )
- m_vScrollBar = NULL ;
-
- wxWindowBase::RemoveChild( child ) ;
-}
-
-void wxWindowMac::DoUpdateScrollbarVisibility()
-{
- bool triggerSizeEvent = false;
-
- if ( m_hScrollBar )
- {
- bool showHScrollBar = m_hScrollBarAlwaysShown || m_hScrollBar->IsNeeded();
-
- if ( m_hScrollBar->IsShown() != showHScrollBar )
- {
- m_hScrollBar->Show( showHScrollBar );
- triggerSizeEvent = true;
- }
- }
-
- if ( m_vScrollBar)
- {
- bool showVScrollBar = m_vScrollBarAlwaysShown || m_vScrollBar->IsNeeded();
-
- if ( m_vScrollBar->IsShown() != showVScrollBar )
- {
- m_vScrollBar->Show( showVScrollBar ) ;
- triggerSizeEvent = true;
- }
- }
-
- MacRepositionScrollBars() ;
- if ( triggerSizeEvent )
- {
- wxSizeEvent event(GetSize(), m_windowId);
- event.SetEventObject(this);
- HandleWindowEvent(event);
- }
-}
-
-// New function that will replace some of the above.
-void wxWindowMac::SetScrollbar(int orient, int pos, int thumb,
- int range, bool refresh)
-{
- 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();
-}
-
-// Does a physical scroll
-void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
-{
- if ( dx == 0 && dy == 0 )
- return ;
-
- int width , height ;
- GetClientSize( &width , &height ) ;
-
- {
- // note there currently is a bug in OSX which makes inefficient refreshes in case an entire control
- // area is scrolled, this does not occur if width and height are 2 pixels less,
- // TODO: write optimal workaround
- wxRect scrollrect( MacGetLeftBorderSize() , MacGetTopBorderSize() , width , height ) ;
- if ( rect )
- scrollrect.Intersect( *rect ) ;
-
- if ( m_peer->GetNeedsDisplay() )
- {
- // because HIViewScrollRect does not scroll the already invalidated area we have two options:
- // in case there is already a pending redraw on that area
- // either immediate redraw or full invalidate
-#if 1
- // is the better overall solution, as it does not slow down scrolling
- m_peer->SetNeedsDisplay() ;
-#else
- // this would be the preferred version for fast drawing controls
- HIViewRender(m_peer->GetControlRef()) ;
-#endif
- }
-
- // as the native control might be not a 0/0 wx window coordinates, we have to offset
- scrollrect.Offset( -MacGetLeftBorderSize() , -MacGetTopBorderSize() ) ;
- m_peer->ScrollRect( &scrollrect , dx , dy ) ;
-
-#if 0
- // this would be the preferred version for fast drawing controls
- HIViewRender(m_peer->GetControlRef()) ;
-#endif
- }
-
- wxWindowMac *child;
- int x, y, w, h;
- for (wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); node; node = node->GetNext())
- {
- child = node->GetData();
- if (child == NULL)
- continue;
- if (child == m_vScrollBar)
- continue;
- if (child == m_hScrollBar)
- continue;
- if (child->IsTopLevel())
- continue;
-
- child->GetPosition( &x, &y );
- child->GetSize( &w, &h );
- if (rect)
- {
- wxRect rc( x, y, w, h );
- if (rect->Intersects( rc ))
- child->SetSize( x + dx, y + dy, w, h, wxSIZE_AUTO|wxSIZE_ALLOW_MINUS_ONE );
- }
- else
- {
- child->SetSize( x + dx, y + dy, w, h, wxSIZE_AUTO|wxSIZE_ALLOW_MINUS_ONE );
- }
- }
-}
-
-void wxWindowMac::MacOnScroll( wxScrollEvent &event )
-{
- if ( event.GetEventObject() == m_vScrollBar || event.GetEventObject() == m_hScrollBar )
- {
- wxScrollWinEvent wevent;
- wevent.SetPosition(event.GetPosition());
- wevent.SetOrientation(event.GetOrientation());
- 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 );
-
- HandleWindowEvent(wevent);
- }
-}
-
-// Get the window with the focus
-wxWindowMac *wxWindowBase::DoFindFocus()
-{
- ControlRef control ;
- GetKeyboardFocus( GetUserFocusWindow() , &control ) ;
- return wxFindControlFromMacControl( control ) ;
-}
-
-void wxWindowMac::OnInternalIdle()
-{
- // This calls the UI-update mechanism (querying windows for
- // menu/toolbar/control state information)
- if (wxUpdateUIEvent::CanUpdate(this) && IsShownOnScreen())
- UpdateWindowUI(wxUPDATE_UI_FROMIDLE);
-}
-
-// Raise the window to the top of the Z order
-void wxWindowMac::Raise()
-{
- m_peer->SetZOrder( true , NULL ) ;
-}
-
-// Lower the window to the bottom of the Z order
-void wxWindowMac::Lower()
-{
- m_peer->SetZOrder( false , NULL ) ;
-}
-
-// static wxWindow *gs_lastWhich = NULL;
-
-bool wxWindowMac::MacSetupCursor( const wxPoint& pt )
-{
- // first trigger a set cursor event
-
- wxPoint clientorigin = GetClientAreaOrigin() ;
- wxSize clientsize = GetClientSize() ;
- wxCursor cursor ;
- if ( wxRect2DInt( clientorigin.x , clientorigin.y , clientsize.x , clientsize.y ).Contains( wxPoint2DInt( pt ) ) )
- {
- wxSetCursorEvent event( pt.x , pt.y );
-
- bool processedEvtSetCursor = HandleWindowEvent(event);
- if ( processedEvtSetCursor && event.HasCursor() )
- {
- cursor = event.GetCursor() ;
- }
- else
- {
- // the test for processedEvtSetCursor is here to prevent using m_cursor
- // if the user code caught EVT_SET_CURSOR() and returned nothing from
- // it - this is a way to say that our cursor shouldn't be used for this
- // point
- if ( !processedEvtSetCursor && m_cursor.Ok() )
- cursor = m_cursor ;
-
- if ( !wxIsBusy() && !GetParent() )
- cursor = *wxSTANDARD_CURSOR ;
- }
-
- if ( cursor.Ok() )
- cursor.MacInstall() ;
- }
-
- return cursor.Ok() ;
-}
-
-wxString wxWindowMac::MacGetToolTipString( wxPoint &WXUNUSED(pt) )
-{
-#if wxUSE_TOOLTIPS
- if ( m_tooltip )
- return m_tooltip->GetTip() ;
-#endif
-
- return wxEmptyString ;
-}
-
-void wxWindowMac::ClearBackground()
-{
- Refresh() ;
- Update() ;
-}
-
-void wxWindowMac::Update()
-{
- wxNonOwnedWindow* top = MacGetTopLevelWindow();
- if (top)
- top->MacPerformUpdates() ;
-}
-
-wxNonOwnedWindow* wxWindowMac::MacGetTopLevelWindow() const
-{
- wxNonOwnedWindow* win = NULL ;
- WindowRef window = (WindowRef) MacGetTopLevelWindowRef() ;
- if ( window )
- win = wxFindWinFromMacWindow( window ) ;
-
- return win ;
-}
-
-const wxRect& wxWindowMac::MacGetClippedClientRect() const
-{
- MacUpdateClippedRects() ;
-
- return m_cachedClippedClientRect ;
-}
-
-const wxRect& wxWindowMac::MacGetClippedRect() const
-{
- MacUpdateClippedRects() ;
-
- return m_cachedClippedRect ;
-}
-
-const wxRect&wxWindowMac:: MacGetClippedRectWithOuterStructure() const
-{
- MacUpdateClippedRects() ;
-
- return m_cachedClippedRectWithOuterStructure ;
-}
-
-const wxRegion& wxWindowMac::MacGetVisibleRegion( bool includeOuterStructures )
-{
- static wxRegion emptyrgn ;
-
- if ( !m_isBeingDeleted && IsShownOnScreen() )
- {
- MacUpdateClippedRects() ;
- if ( includeOuterStructures )
- return m_cachedClippedRegionWithOuterStructure ;
- else
- return m_cachedClippedRegion ;
- }
- else
- {
- return emptyrgn ;
- }
-}
-
-void wxWindowMac::MacUpdateClippedRects() const
-{
- if ( m_cachedClippedRectValid )
- return ;
-
- // includeOuterStructures is true if we try to draw somthing like a focus ring etc.
- // also a window dc uses this, in this case we only clip in the hierarchy for hard
- // borders like a scrollwindow, splitter etc otherwise we end up in a paranoia having
- // to add focus borders everywhere
-
- Rect r, rIncludingOuterStructures ;
-
- m_peer->GetRect( &r ) ;
- r.left -= MacGetLeftBorderSize() ;
- r.top -= MacGetTopBorderSize() ;
- r.bottom += MacGetBottomBorderSize() ;
- r.right += MacGetRightBorderSize() ;
-
- r.right -= r.left ;
- r.bottom -= r.top ;
- r.left = 0 ;
- r.top = 0 ;
-
- rIncludingOuterStructures = r ;
- InsetRect( &rIncludingOuterStructures , -4 , -4 ) ;
-
- wxRect cl = GetClientRect() ;
- Rect rClient = { cl.y , cl.x , cl.y + cl.height , cl.x + cl.width } ;
-
- int x , y ;
- wxSize size ;
- const wxWindow* child = this ;
- const wxWindow* parent = NULL ;
-
- while ( !child->IsTopLevel() && ( parent = child->GetParent() ) != NULL )
- {
- if ( parent->MacIsChildOfClientArea(child) )
- {
- size = parent->GetClientSize() ;
- wxPoint origin = parent->GetClientAreaOrigin() ;
- x = origin.x ;
- y = origin.y ;
- }
- else
- {
- // this will be true for scrollbars, toolbars etc.
- size = parent->GetSize() ;
- y = parent->MacGetTopBorderSize() ;
- x = parent->MacGetLeftBorderSize() ;
- size.x -= parent->MacGetLeftBorderSize() + parent->MacGetRightBorderSize() ;
- size.y -= parent->MacGetTopBorderSize() + parent->MacGetBottomBorderSize() ;
- }
-
- parent->MacWindowToRootWindow( &x, &y ) ;
- MacRootWindowToWindow( &x , &y ) ;
-
- Rect rparent = { y , x , y + size.y , x + size.x } ;
-
- // the wxwindow and client rects will always be clipped
- SectRect( &r , &rparent , &r ) ;
- SectRect( &rClient , &rparent , &rClient ) ;
-
- // the structure only at 'hard' borders
- if ( parent->MacClipChildren() ||
- ( parent->GetParent() && parent->GetParent()->MacClipGrandChildren() ) )
- {
- SectRect( &rIncludingOuterStructures , &rparent , &rIncludingOuterStructures ) ;
- }
-
- child = parent ;
- }
-
- m_cachedClippedRect = wxRect( r.left , r.top , r.right - r.left , r.bottom - r.top ) ;
- m_cachedClippedClientRect = wxRect( rClient.left , rClient.top ,
- rClient.right - rClient.left , rClient.bottom - rClient.top ) ;
- m_cachedClippedRectWithOuterStructure = wxRect(
- rIncludingOuterStructures.left , rIncludingOuterStructures.top ,
- rIncludingOuterStructures.right - rIncludingOuterStructures.left ,
- rIncludingOuterStructures.bottom - rIncludingOuterStructures.top ) ;
-
- m_cachedClippedRegionWithOuterStructure = wxRegion( m_cachedClippedRectWithOuterStructure ) ;
- m_cachedClippedRegion = wxRegion( m_cachedClippedRect ) ;
- m_cachedClippedClientRegion = wxRegion( m_cachedClippedClientRect ) ;
-
- m_cachedClippedRectValid = true ;
-}
-
-/*
- This function must not change the updatergn !
- */
-bool wxWindowMac::MacDoRedraw( void* updatergnr , long time )
-{
- bool handled = false ;
- Rect updatebounds ;
- RgnHandle updatergn = (RgnHandle) updatergnr ;
- GetRegionBounds( updatergn , &updatebounds ) ;
-
- // 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() ;
- wxPoint origin = GetClientAreaOrigin() ;
- SetRectRgn( newupdate , origin.x , origin.y , origin.x + point.x , origin.y + point.y ) ;
- SectRgn( newupdate , updatergn , newupdate ) ;
-
- // first send an erase event to the entire update area
- {
- // 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->SetClippingRegion(wxRegion(HIShapeCreateWithQDRgn(updatergn)));
- else
- dc->SetClippingRegion(wxRegion(HIShapeCreateWithQDRgn(newupdate)));
-
- wxEraseEvent eevent( GetId(), dc );
- eevent.SetEventObject( this );
- HandleWindowEvent( eevent );
- delete dc ;
- }
-
- MacPaintGrowBox();
-
- // calculate a client-origin version of the update rgn and set m_updateRegion to that
- OffsetRgn( newupdate , -origin.x , -origin.y ) ;
- m_updateRegion = wxRegion(HIShapeCreateWithQDRgn(newupdate)) ;
- DisposeRgn( newupdate ) ;
-
- if ( !m_updateRegion.Empty() )
- {
- // paint the window itself
-
- wxPaintEvent event;
- event.SetTimestamp(time);
- event.SetEventObject(this);
- HandleWindowEvent(event);
- handled = true ;
- }
-
- // now we cannot rely on having its borders drawn by a window itself, as it does not
- // get the updateRgn wide enough to always do so, so we do it from the parent
- // this would also be the place to draw any custom backgrounds for native controls
- // in Composited windowing
- wxPoint clientOrigin = GetClientAreaOrigin() ;
-
- wxWindowMac *child;
- int x, y, w, h;
- for (wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); node; node = node->GetNext())
- {
- child = node->GetData();
- if (child == NULL)
- continue;
- if (child == m_vScrollBar)
- continue;
- if (child == m_hScrollBar)
- continue;
- 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
-
- child->GetPosition( &x, &y );
- child->GetSize( &w, &h );
- Rect childRect = { y , x , y + h , x + w } ;
- OffsetRect( &childRect , clientOrigin.x , clientOrigin.y ) ;
- InsetRect( &childRect , -10 , -10) ;
-
- if ( RectInRgn( &childRect , updatergn ) )
- {
- // paint custom borders
- wxNcPaintEvent eventNc( child->GetId() );
- eventNc.SetEventObject( child );
- if ( !child->HandleWindowEvent( eventNc ) )
- {
- child->MacPaintBorders(0, 0) ;
- }
- }
- }
- }
-
- return handled ;
-}
-
-
-WXWindow wxWindowMac::MacGetTopLevelWindowRef() const
-{
- wxWindowMac *iter = (wxWindowMac*)this ;
-
- while ( iter )
- {
- if ( iter->IsTopLevel() )
- {
- wxTopLevelWindow* toplevel = wxDynamicCast(iter,wxTopLevelWindow);
- if ( toplevel )
- return toplevel->MacGetWindowRef();
-#if wxUSE_POPUPWIN
- wxPopupWindow* popupwin = wxDynamicCast(iter,wxPopupWindow);
- if ( popupwin )
- return popupwin->MacGetWindowRef();
-#endif
- }
- iter = iter->GetParent() ;
- }
-
- return NULL ;
-}
-
-bool wxWindowMac::MacHasScrollBarCorner() const
-{
- /* Returns whether the scroll bars in a wxScrolledWindow should be
- * shortened. Scroll bars should be shortened if either:
- *
- * - both scroll bars are visible, or
- *
- * - there is a resize box in the parent frame's corner and this
- * window shares the bottom and right edge with the parent
- * frame.
- */
-
- if ( m_hScrollBar == NULL && m_vScrollBar == NULL )
- return false;
-
- if ( ( m_hScrollBar && m_hScrollBar->IsShown() )
- && ( m_vScrollBar && m_vScrollBar->IsShown() ) )
- {
- // Both scroll bars visible
- return true;
- }
- else
- {
- wxPoint thisWindowBottomRight = GetScreenRect().GetBottomRight();
-
- for ( const wxWindow *win = this; win; win = win->GetParent() )
- {
- const wxFrame *frame = wxDynamicCast( win, wxFrame ) ;
- if ( frame )
- {
- if ( frame->GetWindowStyleFlag() & wxRESIZE_BORDER )
- {
- // Parent frame has resize handle
- wxPoint frameBottomRight = frame->GetScreenRect().GetBottomRight();
-
- // Note: allow for some wiggle room here as wxMac's
- // window rect calculations seem to be imprecise
- if ( abs( thisWindowBottomRight.x - frameBottomRight.x ) <= 2
- && abs( thisWindowBottomRight.y - frameBottomRight.y ) <= 2 )
- {
- // Parent frame has resize handle and shares
- // right bottom corner
- return true ;
- }
- else
- {
- // Parent frame has resize handle but doesn't
- // share right bottom corner
- return false ;
- }
- }
- else
- {
- // Parent frame doesn't have resize handle
- return false ;
- }
- }
- }
-
- // No parent frame found
- return false ;
- }
-}
-
-void wxWindowMac::MacCreateScrollBars( long style )
-{
- wxASSERT_MSG( m_vScrollBar == NULL && m_hScrollBar == NULL , wxT("attempt to create window twice") ) ;
-
- if ( style & ( wxVSCROLL | wxHSCROLL ) )
- {
- int scrlsize = MAC_SCROLLBAR_SIZE ;
- if ( GetWindowVariant() == wxWINDOW_VARIANT_SMALL || GetWindowVariant() == wxWINDOW_VARIANT_MINI )
- {
- scrlsize = MAC_SMALL_SCROLLBAR_SIZE ;
- }
-
- int adjust = MacHasScrollBarCorner() ? scrlsize - 1: 0 ;
- int width, height ;
- GetClientSize( &width , &height ) ;
-
- wxPoint vPoint(width - scrlsize, 0) ;
- wxSize vSize(scrlsize, height - adjust) ;
- wxPoint hPoint(0, height - scrlsize) ;
- wxSize hSize(width - adjust, scrlsize) ;
-
- // we have to set the min size to a smaller value, otherwise they cannot get smaller (InitialSize sets MinSize)
- if ( style & wxVSCROLL )
- {
- m_vScrollBar = new wxScrollBar((wxWindow*)this, wxID_ANY, vPoint, vSize , wxVERTICAL);
- m_vScrollBar->SetMinSize( wxDefaultSize );
- }
-
- if ( style & wxHSCROLL )
- {
- m_hScrollBar = new wxScrollBar((wxWindow*)this, wxID_ANY, hPoint, hSize , wxHORIZONTAL);
- m_hScrollBar->SetMinSize( wxDefaultSize );
- }
- }
-
- // because the create does not take into account the client area origin
- // we might have a real position shift
- MacRepositionScrollBars() ;
-}
-
-bool wxWindowMac::MacIsChildOfClientArea( const wxWindow* child ) const
-{
- bool result = ((child == NULL) || ((child != m_hScrollBar) && (child != m_vScrollBar)));
-
- return result ;
-}
-
-void wxWindowMac::MacRepositionScrollBars()
-{
- if ( !m_hScrollBar && !m_vScrollBar )
- return ;
-
- int scrlsize = m_hScrollBar ? m_hScrollBar->GetSize().y : ( m_vScrollBar ? m_vScrollBar->GetSize().x : MAC_SCROLLBAR_SIZE ) ;
- int adjust = MacHasScrollBarCorner() ? scrlsize - 1 : 0 ;
-
- // get real client area
- int width, height ;
- GetSize( &width , &height );
-
- width -= MacGetLeftBorderSize() + MacGetRightBorderSize();
- height -= MacGetTopBorderSize() + MacGetBottomBorderSize();
-
- wxPoint vPoint( width - scrlsize, 0 ) ;
- wxSize vSize( scrlsize, height - adjust ) ;
- wxPoint hPoint( 0 , height - scrlsize ) ;
- wxSize hSize( width - adjust, scrlsize ) ;
-
-#if 0
- int x = 0, y = 0, w, h ;
- GetSize( &w , &h ) ;
-
- MacClientToRootWindow( &x , &y ) ;
- MacClientToRootWindow( &w , &h ) ;
-
- wxWindowMac *iter = (wxWindowMac*)this ;
-
- int totW = 10000 , totH = 10000;
- while ( iter )
- {
- if ( iter->IsTopLevel() )
- {
- iter->GetSize( &totW , &totH ) ;
- break ;
- }
-
- iter = iter->GetParent() ;
- }
-
- if ( x == 0 )
- {
- hPoint.x = -1 ;
- hSize.x += 1 ;
- }
- if ( y == 0 )
- {
- vPoint.y = -1 ;
- vSize.y += 1 ;
- }
-
- if ( w - x >= totW )
- {
- hSize.x += 1 ;
- vPoint.x += 1 ;
- }
- if ( h - y >= totH )
- {
- vSize.y += 1 ;
- hPoint.y += 1 ;
- }
-#endif
-
- if ( m_vScrollBar )
- 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 );
-}
-
-bool wxWindowMac::AcceptsFocus() const
-{
- return MacCanFocus() && wxWindowBase::AcceptsFocus();
-}
-
-void wxWindowMac::MacSuperChangedPosition()
-{
- // only window-absolute structures have to be moved i.e. controls
-
- m_cachedClippedRectValid = false ;
-
- wxWindowMac *child;
- wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
- while ( node )
- {
- child = node->GetData();
- child->MacSuperChangedPosition() ;
-
- node = node->GetNext();
- }
-}
-
-void wxWindowMac::MacTopLevelWindowChangedPosition()
-{
- // only screen-absolute structures have to be moved i.e. glcanvas
-
- wxWindowMac *child;
- wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
- while ( node )
- {
- child = node->GetData();
- child->MacTopLevelWindowChangedPosition() ;
-
- node = node->GetNext();
- }
-}
-
-long wxWindowMac::MacGetLeftBorderSize() const
-{
- if ( IsTopLevel() )
- return 0 ;
-
- SInt32 border = 0 ;
-
- if (HasFlag(wxRAISED_BORDER) || HasFlag( wxSUNKEN_BORDER) || HasFlag(wxDOUBLE_BORDER))
- {
- // this metric is only the 'outset' outside the simple frame rect
- GetThemeMetric( kThemeMetricEditTextFrameOutset , &border ) ;
- border += 1 ;
- }
- else if (HasFlag(wxSIMPLE_BORDER))
- {
- // this metric is only the 'outset' outside the simple frame rect
- GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ;
- border += 1 ;
- }
-
- return border ;
-}
-
-long wxWindowMac::MacGetRightBorderSize() const
-{
- // they are all symmetric in mac themes
- return MacGetLeftBorderSize() ;
-}
-
-long wxWindowMac::MacGetTopBorderSize() const
-{
- // they are all symmetric in mac themes
- return MacGetLeftBorderSize() ;
-}
-
-long wxWindowMac::MacGetBottomBorderSize() const
-{
- // they are all symmetric in mac themes
- return MacGetLeftBorderSize() ;
-}
-
-long wxWindowMac::MacRemoveBordersFromStyle( long style )
-{
- return style & ~wxBORDER_MASK ;
-}
-
-// Find the wxWindowMac at the current mouse position, returning the mouse
-// position.
-wxWindowMac * wxFindWindowAtPointer( wxPoint& pt )
-{
- pt = wxGetMousePosition();
- wxWindowMac* found = wxFindWindowAtPoint(pt);
-
- return found;
-}
-
-// Get the current mouse position.
-wxPoint wxGetMousePosition()
-{
- int x, y;
-
- wxGetMousePosition( &x, &y );
-
- return wxPoint(x, y);
-}
-
-void wxWindowMac::OnMouseEvent( wxMouseEvent &event )
-{
- if ( event.GetEventType() == wxEVT_RIGHT_DOWN )
- {
- // copied from wxGTK : CS
- // VZ: shouldn't we move this to base class then?
-
- // generate a "context menu" event: this is similar to wxEVT_RIGHT_DOWN
- // except that:
- //
- // (a) it's a command event and so is propagated to the parent
- // (b) under MSW it can be generated from kbd too
- // (c) it uses screen coords (because of (a))
- wxContextMenuEvent evtCtx(wxEVT_CONTEXT_MENU,
- this->GetId(),
- this->ClientToScreen(event.GetPosition()));
- evtCtx.SetEventObject(this);
- if ( ! HandleWindowEvent(evtCtx) )
- event.Skip() ;
- }
- else
- {
- event.Skip() ;
- }
-}
-
-void wxWindowMac::OnPaint( wxPaintEvent & WXUNUSED(event) )
-{
- // for native controls: call their native paint method
- if ( !MacIsUserPane() || ( IsTopLevel() && GetBackgroundStyle() == wxBG_STYLE_SYSTEM ) )
- {
- if ( wxTheApp->MacGetCurrentEvent() != NULL && wxTheApp->MacGetCurrentEventHandlerCallRef() != NULL
- && GetBackgroundStyle() != wxBG_STYLE_TRANSPARENT )
- CallNextEventHandler(
- (EventHandlerCallRef)wxTheApp->MacGetCurrentEventHandlerCallRef() ,
- (EventRef) wxTheApp->MacGetCurrentEvent() ) ;
- }
-}
-
-void wxWindowMac::MacHandleControlClick(WXWidget WXUNUSED(control),
- wxInt16 WXUNUSED(controlpart),
- bool WXUNUSED(mouseStillDown))
-{
-}
-
-Rect wxMacGetBoundsForControl( wxWindow* window , const wxPoint& pos , const wxSize &size , bool adjustForOrigin )
-{
- int x, y, w, h ;
-
- window->MacGetBoundsForControl( pos , size , x , y, w, h , adjustForOrigin ) ;
- Rect bounds = { y, x, y + h, x + w };
-
- return bounds ;
-}
-
-wxInt32 wxWindowMac::MacControlHit(WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENTREF WXUNUSED(event) )
-{
- return eventNotHandledErr ;
-}
-
-bool wxWindowMac::Reparent(wxWindowBase *newParentBase)
-{
- wxWindowMac *newParent = (wxWindowMac *)newParentBase;
- if ( !wxWindowBase::Reparent(newParent) )
- return false;
-
- // copied from MacPostControlCreate
- ControlRef container = (ControlRef) GetParent()->GetHandle() ;
-
- wxASSERT_MSG( container != NULL , wxT("No valid mac container control") ) ;
-
- ::EmbedControl( m_peer->GetControlRef() , container ) ;
-
- return true;
-}
-
-bool wxWindowMac::SetTransparent(wxByte alpha)
-{
- SetBackgroundStyle(wxBG_STYLE_TRANSPARENT);
-
- if ( alpha != m_macAlpha )
- {
- m_macAlpha = alpha ;
- Refresh() ;
- }
- return true ;
-}
-
-
-bool wxWindowMac::CanSetTransparent()
-{
- return true ;
-}
-
-wxByte wxWindowMac::GetTransparent() const
-{
- return m_macAlpha ;
-}
-
-bool wxWindowMac::IsShownOnScreen() const
-{
-#if TARGET_API_MAC_OSX
- if ( m_peer && m_peer->Ok() )
- {
- bool peerVis = m_peer->IsVisible();
- bool wxVis = wxWindowBase::IsShownOnScreen();
- if( peerVis != wxVis )
- {
- // CS : put a breakpoint here to investigate differences
- // between native an wx visibilities
- // the only place where I've encountered them until now
- // are the hiding/showing sequences where the vis-changed event is
- // first sent to the innermost control, while wx does things
- // from the outmost control
- wxVis = wxWindowBase::IsShownOnScreen();
- return wxVis;
- }
-
- return m_peer->IsVisible();
- }
-#endif