X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a07c12126fa9a211e0d5e7585a71a3424825ced2..4ac219f63d40983d417cabc09b2ed29c0f87c376:/src/mac/carbon/window.cpp diff --git a/src/mac/carbon/window.cpp b/src/mac/carbon/window.cpp index 7bf95a6ca3..a821346eef 100644 --- a/src/mac/carbon/window.cpp +++ b/src/mac/carbon/window.cpp @@ -35,6 +35,7 @@ #include "wx/tooltip.h" #include "wx/statusbr.h" #include "wx/menuitem.h" +#include "wx/spinctrl.h" #include "wx/log.h" #if wxUSE_CARET @@ -46,6 +47,10 @@ #define MAC_SCROLLBAR_SIZE 16 #include "wx/mac/uma.h" +#ifndef __DARWIN__ +#include +#include +#endif #if wxUSE_DRAG_AND_DROP #include "wx/dnd.h" @@ -120,6 +125,8 @@ void wxWindowMac::Init() m_hScrollBar = NULL ; m_vScrollBar = NULL ; + + m_label = wxEmptyString; } // Destructor @@ -205,7 +212,7 @@ void wxWindowMac::SetFocus() wxControl* control = wxDynamicCast( gFocusWindow , wxControl ) ; if ( control && control->GetMacControl() ) { - UMASetKeyboardFocus( gFocusWindow->MacGetRootWindow() , control->GetMacControl() , kControlFocusNoPart ) ; + UMASetKeyboardFocus( (WindowRef) gFocusWindow->MacGetRootWindow() , (ControlHandle) control->GetMacControl() , kControlFocusNoPart ) ; control->MacRedrawControl() ; } #endif @@ -230,7 +237,7 @@ void wxWindowMac::SetFocus() wxControl* control = wxDynamicCast( gFocusWindow , wxControl ) ; if ( control && control->GetMacControl() ) { - UMASetKeyboardFocus( gFocusWindow->MacGetRootWindow() , control->GetMacControl() , kControlEditTextPart ) ; + UMASetKeyboardFocus( (WindowRef) gFocusWindow->MacGetRootWindow() , (ControlHandle) control->GetMacControl() , kControlEditTextPart ) ; } #endif wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId); @@ -250,7 +257,7 @@ bool wxWindowMac::Enable(bool enable) return TRUE; } -void wxWindowMac::CaptureMouse() +void wxWindowMac::DoCaptureMouse() { wxTheApp->s_captureWindow = this ; } @@ -260,7 +267,7 @@ wxWindow* wxWindowBase::GetCapture() return wxTheApp->s_captureWindow ; } -void wxWindowMac::ReleaseMouse() +void wxWindowMac::DoReleaseMouse() { wxTheApp->s_captureWindow = NULL ; } @@ -318,8 +325,8 @@ bool wxWindowMac::DoPopupMenu(wxMenu *menu, int x, int y) menu->UpdateUI(); ClientToScreen( &x , &y ) ; - ::InsertMenu( menu->GetHMenu() , -1 ) ; - long menuResult = ::PopUpMenuSelect(menu->GetHMenu() ,y,x, 0) ; + ::InsertMenu( (MenuHandle) menu->GetHMenu() , -1 ) ; + long menuResult = ::PopUpMenuSelect((MenuHandle) menu->GetHMenu() ,y,x, 0) ; menu->MacMenuSelect( this , TickCount() , HiWord(menuResult) , LoWord(menuResult) ) ; ::DeleteMenu( menu->MacGetMenuId() ) ; menu->SetInvokingWindow(NULL); @@ -330,7 +337,7 @@ bool wxWindowMac::DoPopupMenu(wxMenu *menu, int x, int y) void wxWindowMac::DoScreenToClient(int *x, int *y) const { - WindowRef window = MacGetRootWindow() ; + WindowRef window = (WindowRef) MacGetRootWindow() ; Point localwhere = {0,0} ; @@ -346,14 +353,23 @@ void wxWindowMac::DoScreenToClient(int *x, int *y) const if(x) *x = localwhere.h ; if(y) *y = localwhere.v ; - MacRootWindowToClient( x , y ) ; + MacRootWindowToWindow( x , y ) ; + if ( x ) + x -= MacGetLeftBorderSize() ; + if ( y ) + y -= MacGetTopBorderSize() ; } void wxWindowMac::DoClientToScreen(int *x, int *y) const { - WindowRef window = MacGetRootWindow() ; + WindowRef window = (WindowRef) MacGetRootWindow() ; - MacClientToRootWindow( x , y ) ; + if ( x ) + x += MacGetLeftBorderSize() ; + if ( y ) + y += MacGetTopBorderSize() ; + + MacWindowToRootWindow( x , y ) ; Point localwhere = { 0,0 }; if(x) localwhere.h = * x ; @@ -663,14 +679,14 @@ wxPoint wxWindowMac::GetClientAreaOrigin() const return wxPoint(MacGetLeftBorderSize( ) , MacGetTopBorderSize( ) ); } -void wxWindow::SetTitle(const wxString& title) +void wxWindowMac::SetTitle(const wxString& title) { - m_label = title ; + m_label = title ; } -wxString wxWindow::GetTitle() const +wxString wxWindowMac::GetTitle() const { - return m_label ; + return m_label ; } bool wxWindowMac::Show(bool show) @@ -681,7 +697,7 @@ bool wxWindowMac::Show(bool show) MacSuperShown( show ) ; if ( !show ) { - WindowRef window = MacGetRootWindow() ; + WindowRef window = (WindowRef) MacGetRootWindow() ; wxWindowMac* win = wxFindWinFromMacWindow( window ) ; if ( win && !win->m_isBeingDeleted ) Refresh() ; @@ -859,17 +875,17 @@ void wxWindowMac::WarpPointer (int x_pos, int y_pos) const wxBrush& wxWindowMac::MacGetBackgroundBrush() { - if ( m_backgroundColour == wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE) ) + if ( m_backgroundColour == wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE) ) { m_macBackgroundBrush.SetMacTheme( kThemeBrushDocumentWindowBackground ) ; } - else if ( m_backgroundColour == wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE ) ) + else if ( m_backgroundColour == wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE ) ) { // on mac we have the difficult situation, that 3dface gray can be different colours, depending whether // it is on a notebook panel or not, in order to take care of that we walk up the hierarchy until we have // either a non gray background color or a non control window - WindowRef window = MacGetRootWindow() ; + WindowRef window = (WindowRef) MacGetRootWindow() ; wxWindowMac* parent = GetParent() ; while( parent ) @@ -882,8 +898,8 @@ const wxBrush& wxWindowMac::MacGetBackgroundBrush() } { - if ( parent->m_backgroundColour != wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE ) - && parent->m_backgroundColour != wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE) ) + if ( parent->m_backgroundColour != wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE ) + && parent->m_backgroundColour != wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE) ) { // if we have any other colours in the hierarchy m_macBackgroundBrush.SetColour( parent->m_backgroundColour ) ; @@ -902,7 +918,7 @@ const wxBrush& wxWindowMac::MacGetBackgroundBrush() extent.top-- ; extent.right = x + size.x ; extent.bottom = y + size.y ; - m_macBackgroundBrush.SetMacThemeBackground( kThemeBackgroundTabPane , extent ) ; // todo eventually change for inactive + m_macBackgroundBrush.SetMacThemeBackground( kThemeBackgroundTabPane , (WXRECTPTR) &extent ) ; // todo eventually change for inactive break ; } } @@ -932,7 +948,7 @@ void wxWindowMac::OnNcPaint( wxNcPaintEvent& event ) wxWindowDC dc(this) ; wxMacPortSetter helper(&dc) ; - MacPaintBorders( dc.m_macLocalOrigin.h , dc.m_macLocalOrigin.v) ; + MacPaintBorders( dc.m_macLocalOrigin.x , dc.m_macLocalOrigin.y) ; } int wxWindowMac::GetScrollPos(int orient) const @@ -1010,17 +1026,17 @@ void wxWindowMac::MacPaintBorders( int left , int top ) if (HasFlag(wxRAISED_BORDER) || HasFlag( wxSUNKEN_BORDER) || HasFlag(wxDOUBLE_BORDER) ) { #if wxMAC_USE_THEME_BORDER - Rect rect = { top , left , m_height + top , m_width + left } ; - SInt32 border = 0 ; - /* - GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ; - InsetRect( &rect , border , border ); + Rect rect = { top , left , m_height + top , m_width + left } ; + SInt32 border = 0 ; + /* + GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ; + InsetRect( &rect , border , border ); DrawThemeListBoxFrame(&rect,IsEnabled() ? kThemeStateActive : kThemeStateInactive) ; */ DrawThemePrimaryGroup(&rect ,IsEnabled() ? kThemeStateActive : kThemeStateInactive) ; #else - bool sunken = HasFlag( wxSUNKEN_BORDER ) ; + bool sunken = HasFlag( wxSUNKEN_BORDER ) ; RGBForeColor( &face ); MoveTo( left + 0 , top + m_height - 2 ); LineTo( left + 0 , top + 0 ); @@ -1053,12 +1069,22 @@ void wxWindowMac::MacPaintBorders( int left , int top ) } else if (HasFlag(wxSIMPLE_BORDER)) { - Rect rect = { top , left , m_height + top , m_width + left } ; + Rect rect = { top , left , m_height + top , m_width + left } ; RGBForeColor( &black ) ; FrameRect( &rect ) ; } } +void wxWindowMac::RemoveChild( wxWindowBase *child ) +{ + if ( child == m_hScrollBar ) + m_hScrollBar = NULL ; + if ( child == m_vScrollBar ) + m_vScrollBar = NULL ; + + wxWindowBase::RemoveChild( child ) ; +} + // New function that will replace some of the above. void wxWindowMac::SetScrollbar(int orient, int pos, int thumbVisible, int range, bool refresh) @@ -1120,7 +1146,7 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect) SectRect( &scrollrect , &r , &scrollrect ) ; } ScrollRect( &scrollrect , dx , dy , updateRgn ) ; - InvalWindowRgn( MacGetRootWindow() , updateRgn ) ; + InvalWindowRgn( (WindowRef) MacGetRootWindow() , updateRgn ) ; DisposeRgn( updateRgn ) ; } @@ -1309,7 +1335,7 @@ bool wxWindowMac::MacGetWindowFromPointSub( const wxPoint &point , wxWindowMac** return FALSE; } - WindowRef window = MacGetRootWindow() ; + WindowRef window = (WindowRef) MacGetRootWindow() ; wxPoint newPoint( point ) ; @@ -1337,14 +1363,25 @@ bool wxWindowMac::MacGetWindowFromPointSub( const wxPoint &point , wxWindowMac** bool wxWindowMac::MacGetWindowFromPoint( const wxPoint &screenpoint , wxWindowMac** outWin ) { WindowRef window ; + Point pt = { screenpoint.y , screenpoint.x } ; if ( ::FindWindow( pt , &window ) == 3 ) { - wxPoint point( screenpoint ) ; + wxWindowMac* win = wxFindWinFromMacWindow( window ) ; if ( win ) { - point = win->ScreenToClient( point ) ; + // No, this yields the CLIENT are, we need the whole frame. RR. + // point = win->ScreenToClient( point ) ; + + GrafPtr port; + ::GetPort( &port ) ; + ::SetPort( UMAGetWindowPort( window ) ) ; + ::GlobalToLocal( &pt ) ; + ::SetPort( port ) ; + + wxPoint point( pt.h, pt.v ) ; + return win->MacGetWindowFromPointSub( point , outWin ) ; } } @@ -1352,6 +1389,7 @@ bool wxWindowMac::MacGetWindowFromPoint( const wxPoint &screenpoint , wxWindowMa } extern int wxBusyCursorCount ; +static wxWindow *gs_lastWhich = NULL; bool wxWindowMac::MacDispatchMouseEvent(wxMouseEvent& event) { @@ -1360,10 +1398,10 @@ bool wxWindowMac::MacDispatchMouseEvent(wxMouseEvent& event) return FALSE; - if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) ) + if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) || IsKindOf( CLASSINFO( wxSpinCtrl ) )) return FALSE ; - WindowRef window = MacGetRootWindow() ; + WindowRef window = (WindowRef) MacGetRootWindow() ; event.m_x -= m_x; event.m_y -= m_y; @@ -1383,6 +1421,7 @@ bool wxWindowMac::MacDispatchMouseEvent(wxMouseEvent& event) event.m_x = x ; event.m_y = y ; + event.SetEventObject( this ) ; if ( wxBusyCursorCount == 0 ) { @@ -1402,7 +1441,26 @@ bool wxWindowMac::MacDispatchMouseEvent(wxMouseEvent& event) || event.GetEventType() == wxEVT_LEAVE_WINDOW ) wxToolTip::RelayEvent( this , event); #endif // wxUSE_TOOLTIPS + + if (gs_lastWhich != this) + { + gs_lastWhich = this; + + // Double clicks must always occur on the same window + if (event.GetEventType() == wxEVT_LEFT_DCLICK) + event.SetEventType( wxEVT_LEFT_DOWN ); + if (event.GetEventType() == wxEVT_RIGHT_DCLICK) + event.SetEventType( wxEVT_RIGHT_DOWN ); + + // Same for mouse up events + if (event.GetEventType() == wxEVT_LEFT_UP) + return TRUE; + if (event.GetEventType() == wxEVT_RIGHT_UP) + return TRUE; + } + GetEventHandler()->ProcessEvent( event ) ; + return TRUE; } @@ -1419,13 +1477,21 @@ void wxWindowMac::Update() { wxTopLevelWindowMac* win = MacGetTopLevelWindow( ) ; if ( win ) + { win->MacUpdate( 0 ) ; +#if TARGET_API_MAC_CARBON + if ( QDIsPortBuffered( GetWindowPort( (WindowRef) win->MacGetWindowRef() ) ) ) + { + QDFlushPortBuffer( GetWindowPort( (WindowRef) win->MacGetWindowRef() ) , NULL ) ; + } +#endif + } } wxTopLevelWindowMac* wxWindowMac::MacGetTopLevelWindow() const { wxTopLevelWindowMac* win = NULL ; - WindowRef window = MacGetRootWindow() ; + WindowRef window = (WindowRef) MacGetRootWindow() ; if ( window ) { win = wxFindWinFromMacWindow( window ) ; @@ -1510,19 +1576,20 @@ const wxRegion& wxWindowMac::MacGetVisibleRegion() return m_macVisibleRegion ; } -void wxWindowMac::MacRedraw( RgnHandle updatergn , long time, bool erase) +void wxWindowMac::MacRedraw( WXHRGN updatergnr , long time, bool erase) { + RgnHandle updatergn = (RgnHandle) updatergnr ; // updatergn is always already clipped to our boundaries // it is in window coordinates, not in client coordinates - WindowRef window = MacGetRootWindow() ; + WindowRef window = (WindowRef) MacGetRootWindow() ; { // ownUpdateRgn is the area that this window has to repaint, it is in window coordinates RgnHandle ownUpdateRgn = NewRgn() ; CopyRgn( updatergn , ownUpdateRgn ) ; - SectRgn( ownUpdateRgn , MacGetVisibleRegion().GetWXHRGN() , ownUpdateRgn ) ; + SectRgn( ownUpdateRgn , (RgnHandle) MacGetVisibleRegion().GetWXHRGN() , ownUpdateRgn ) ; // newupdate is the update region in client coordinates RgnHandle newupdate = NewRgn() ; @@ -1578,7 +1645,7 @@ void wxWindowMac::MacRedraw( RgnHandle updatergn , long time, bool erase) } -WindowRef wxWindowMac::MacGetRootWindow() const +WXHWND wxWindowMac::MacGetRootWindow() const { wxWindowMac *iter = (wxWindowMac*)this ; @@ -1711,7 +1778,7 @@ bool wxWindowMac::AcceptsFocus() const return MacCanFocus() && wxWindowBase::AcceptsFocus(); } -ControlHandle wxWindowMac::MacGetContainerForEmbedding() +WXWidget wxWindowMac::MacGetContainerForEmbedding() { return GetParent()->MacGetContainerForEmbedding() ; } @@ -1748,23 +1815,23 @@ long wxWindowMac::MacGetLeftBorderSize( ) const if (m_windowStyle & wxRAISED_BORDER || m_windowStyle & wxSUNKEN_BORDER ) { - SInt32 border = 3 ; + SInt32 border = 3 ; #if wxMAC_USE_THEME_BORDER -#if TARGET_CARBON - GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ; +#if TARGET_CARBON + GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ; #endif #endif - return border ; + return border ; } else if ( m_windowStyle &wxDOUBLE_BORDER) { - SInt32 border = 3 ; + SInt32 border = 3 ; #if wxMAC_USE_THEME_BORDER -#if TARGET_CARBON - GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ; +#if TARGET_CARBON + GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ; #endif #endif - return border ; + return border ; } else if (m_windowStyle &wxSIMPLE_BORDER) {