From: Stefan Csomor Date: Fri, 2 Aug 2002 15:46:45 +0000 (+0000) Subject: corrected scrolling problems for controls, switched to separate wxSpinCtrl implementa... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/327788acc5e4915df4e9e97db7fb08a4c4a00cdd?hp=434ec26e8185c9821f22abf6cd6d157e37e74cca corrected scrolling problems for controls, switched to separate wxSpinCtrl implementation, both wxComboBox and wxSpinCtrl now have proper parenting for their members git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16352 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/mac/carbon/combobox.cpp b/src/mac/carbon/combobox.cpp index e67e1d9601..4fa350e709 100644 --- a/src/mac/carbon/combobox.cpp +++ b/src/mac/carbon/combobox.cpp @@ -51,7 +51,7 @@ class wxComboBoxText : public wxTextCtrl { public: wxComboBoxText( wxComboBox * cb ) - : wxTextCtrl( cb->GetParent(), 1 ) + : wxTextCtrl( cb , 1 ) { m_cb = cb; } @@ -81,7 +81,7 @@ class wxComboBoxChoice : public wxChoice { public: wxComboBoxChoice(wxComboBox *cb, int style) - : wxChoice( cb->GetParent(), 1 ) + : wxChoice( cb , 1 ) { m_cb = cb; } @@ -145,13 +145,13 @@ void wxComboBox::DoMoveWindow(int x, int y, int width, int height) { if ( m_text == 0 ) { - m_choice->SetSize(x, y, width, -1); + m_choice->SetSize(0, 0 , width, -1); } else { wxCoord wText = width - POPUPWIDTH; - m_text->SetSize(x, y, wText, height); - m_choice->SetSize(x + wText + MARGIN, y, POPUPWIDTH, -1); + m_text->SetSize(0, 0, wText, height); + m_choice->SetSize(0 + wText + MARGIN, 0, POPUPWIDTH, -1); } } @@ -166,13 +166,6 @@ bool wxComboBox::Enable(bool enable) if ( !wxControl::Enable(enable) ) return FALSE; - m_choice->Enable(enable); - - if ( m_text != 0 ) - { - m_text->Enable(enable); - } - return TRUE; } @@ -181,17 +174,6 @@ bool wxComboBox::Show(bool show) if ( !wxControl::Show(show) ) return FALSE; - // under GTK Show() is called the first time before we are fully - // constructed - if ( m_choice ) - { - m_choice->Show(show); - if ( m_text != 0 ) - { - m_text->Show(show); - } - } - return TRUE; } @@ -224,13 +206,13 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id, Rect bounds ; Str255 title ; - if ( !wxControl::Create(parent, id, pos, size, style, + if ( !wxControl::Create(parent, id, wxDefaultPosition, wxDefaultSize, style , wxDefaultValidator, name) ) { return FALSE; } - m_choice = new wxComboBoxChoice(this, style); + m_choice = new wxComboBoxChoice(this, style ); wxSize csize = size; if ( style & wxCB_READONLY ) @@ -246,21 +228,12 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id, } DoSetSize(pos.x, pos.y, csize.x, csize.y); + for ( int i = 0 ; i < n ; i++ ) { m_choice->DoAppend( choices[ i ] ); } - // have to disable this window to avoid interfering it with message - // processing to the text and the button... but pretend it is enabled to - // make IsEnabled() return TRUE - wxControl::Enable(FALSE); // don't use non virtual Disable() here! - m_isEnabled = TRUE; - - // we don't even need to show this window itself - and not doing it avoids - // that it overwrites the text control - wxControl::Show(FALSE); - return TRUE; } diff --git a/src/mac/carbon/control.cpp b/src/mac/carbon/control.cpp index 945441b4ea..d416ffa799 100644 --- a/src/mac/carbon/control.cpp +++ b/src/mac/carbon/control.cpp @@ -118,7 +118,13 @@ bool wxControl::Create(wxWindow *parent, wxWindowID id, m_macControl = NULL ; m_macHorizontalBorder = 0 ; // additional pixels around the real control m_macVerticalBorder = 0 ; + bool rval = wxWindow::Create(parent, id, pos, size, style, name); + if ( parent ) + { + m_backgroundColour = parent->GetBackgroundColour() ; + m_foregroundColour = parent->GetForegroundColour() ; + } if (rval) { #if wxUSE_VALIDATORS SetValidator(validator); @@ -410,7 +416,7 @@ void wxControl::MacAdjustControlRect() else m_width = bestsize.right - bestsize.left ; - m_width += 2 * m_macHorizontalBorder ; + m_width += 2 * m_macHorizontalBorder + MacGetLeftBorderSize() + MacGetRightBorderSize() ; } if ( m_height == -1 ) { @@ -418,10 +424,10 @@ void wxControl::MacAdjustControlRect() if ( m_height < 10 ) m_height = 13 ; - m_height += 2 * m_macVerticalBorder; + m_height += 2 * m_macVerticalBorder + MacGetTopBorderSize() + MacGetBottomBorderSize() ; } - - UMASizeControl( (ControlHandle) m_macControl , m_width - 2 * m_macHorizontalBorder, m_height - 2 * m_macVerticalBorder ) ; + MacUpdateDimensions() ; +// UMASizeControl( (ControlHandle) m_macControl , m_width - 2 * m_macHorizontalBorder, m_height - 2 * m_macVerticalBorder ) ; } } @@ -433,35 +439,49 @@ WXWidget wxControl::MacGetContainerForEmbedding() return wxWindow::MacGetContainerForEmbedding() ; } -void wxControl::MacSuperChangedPosition() +void wxControl::MacUpdateDimensions() { - if ( (ControlHandle) m_macControl ) - { - Rect contrlRect ; - GetControlBounds( (ControlHandle) m_macControl , &contrlRect ) ; - int former_mac_x = contrlRect.left ; - int former_mac_y = contrlRect.top ; - int mac_x = m_x ; - int mac_y = m_y ; - GetParent()->MacWindowToRootWindow( & mac_x , & mac_y ) ; - - WindowRef rootwindow = (WindowRef) MacGetRootWindow() ; - - if ( mac_x + m_macHorizontalBorder != former_mac_x || - mac_y + m_macVerticalBorder != former_mac_y ) - { - { - Rect inval = { former_mac_y , former_mac_x , former_mac_y + m_height , former_mac_x + m_width } ; - InvalWindowRect( rootwindow , &inval ) ; - } - UMAMoveControl( (ControlHandle) m_macControl , mac_x + m_macHorizontalBorder , mac_y + m_macVerticalBorder ) ; - { - Rect inval = { mac_y , mac_x , mac_y + m_height , mac_x + m_width } ; - InvalWindowRect( rootwindow , &inval ) ; - } - } - } + // actually in the current systems this should never be possible, but later reparenting + // may become a reality + + if ( (ControlHandle) m_macControl == NULL ) + return ; + + if ( GetParent() == NULL ) + return ; + + WindowRef rootwindow = (WindowRef) MacGetRootWindow() ; + if ( rootwindow == NULL ) + return ; + + Rect oldBounds ; + GetControlBounds( (ControlHandle) m_macControl , &oldBounds ) ; + + int new_x = m_x + MacGetLeftBorderSize() + m_macHorizontalBorder ; + int new_y = m_y + MacGetTopBorderSize() + m_macVerticalBorder ; + int new_width = m_width - MacGetLeftBorderSize() - MacGetRightBorderSize() - 2 * m_macHorizontalBorder ; + int new_height = m_height - MacGetTopBorderSize() - MacGetBottomBorderSize() - 2 * m_macVerticalBorder ; + + GetParent()->MacWindowToRootWindow( & new_x , & new_y ) ; + bool doMove = new_x != oldBounds.left || new_y != oldBounds.top ; + bool doResize = ( oldBounds.right - oldBounds.left ) != new_width || (oldBounds.bottom - oldBounds.top ) != new_height ; + if ( doMove || doResize ) + { + InvalWindowRect( rootwindow, &oldBounds ) ; + if ( doMove ) + { + UMAMoveControl( (ControlHandle) m_macControl , new_x , new_y ) ; + } + if ( doResize ) + { + UMASizeControl( (ControlHandle) m_macControl , new_width , new_height ) ; + } + } +} +void wxControl::MacSuperChangedPosition() +{ + MacUpdateDimensions() ; wxWindow::MacSuperChangedPosition() ; } @@ -500,6 +520,10 @@ void wxControl::DoSetSize(int x, int y, int width, int height, int sizeFlags ) { + wxWindow::DoSetSize( x , y ,width , height ,sizeFlags ) ; + return ; +/* + if ( (ControlHandle) m_macControl == NULL ) { wxWindow::DoSetSize( x , y ,width , height ,sizeFlags ) ; @@ -614,6 +638,7 @@ void wxControl::DoSetSize(int x, int y, Refresh() ; } +*/ } bool wxControl::Show(bool show) diff --git a/src/mac/carbon/slider.cpp b/src/mac/carbon/slider.cpp index f76b09fc68..8dcae35279 100644 --- a/src/mac/carbon/slider.cpp +++ b/src/mac/carbon/slider.cpp @@ -327,119 +327,30 @@ void wxSlider::MacHandleControlClick( WXWidget control , wxInt16 controlpart ) void wxSlider::DoSetSize(int x, int y, int width, int height, int sizeFlags) { - Rect oldbounds, newbounds; - int new_x, new_y, new_width, new_height; - int mac_x, mac_y; - - new_x = m_x; - new_y = m_y; - new_width = m_width; - new_height = m_height; - - if (sizeFlags & wxSIZE_ALLOW_MINUS_ONE) - { - new_x = x; - new_y = y; - new_width = width; - new_height = height; - } - else - { - if (x != -1) new_x = x; - if (y != -1) new_y = y; - if (width != -1) new_width = width; - if (height != -1) new_height = height; - } - - if(sizeFlags & wxSIZE_AUTO) - { - wxSize size = GetBestSize(); - if (sizeFlags & wxSIZE_AUTO_WIDTH) - { - if (width == -1) new_width = size.x; - } - if (sizeFlags & wxSIZE_AUTO_HEIGHT) - { - if (height == -1) new_height = size.y; - } - } - - AdjustForParentClientOrigin(new_x, new_y, sizeFlags); - - mac_x = new_x; - mac_y = new_y; - if(GetParent()) { - GetParent()->MacClientToRootWindow(&mac_x, &mac_y); - } - - GetControlBounds( (ControlHandle) m_macControl, &oldbounds); - oldbounds.right = oldbounds.left + m_width; - oldbounds.bottom = oldbounds.top + m_height; - - bool doMove = false; - bool doResize = false; - - if ( mac_x != oldbounds.left || mac_y != oldbounds.top ) - { - doMove = true ; - } - if ( new_width != m_width || new_height != m_height ) - { - doResize = true ; - } - - if ( doMove || doResize ) - { - // Ensure resize is within constraints - if ((m_minWidth != -1) && (new_width < m_minWidth)) { - new_width = m_minWidth; - } - if ((m_minHeight != -1) && (new_height < m_minHeight)) { - new_height = m_minHeight; - } - if ((m_maxWidth != -1) && (new_width > m_maxWidth)) { - new_width = m_maxWidth; - } - if ((m_maxHeight != -1) && (new_height > m_maxHeight)) { - new_height = m_maxHeight; - } - - DoMoveWindow(new_x, new_y, new_width, new_height); - - // Update window at old and new positions - SetRect(&newbounds, m_x, m_y, m_x + m_width, m_y + m_height); - WindowRef rootwindow = (WindowRef) MacGetRootWindow(); - InvalWindowRect( rootwindow , &oldbounds ); - InvalWindowRect( rootwindow , &newbounds ); - - if ( doMove ) - { - wxMoveEvent event(wxPoint(m_x, m_y), m_windowId); - event.SetEventObject(this); - GetEventHandler()->ProcessEvent(event) ; - } - if ( doResize ) - { - wxSizeEvent event(wxSize(m_width, m_height), m_windowId); - event.SetEventObject(this); - GetEventHandler()->ProcessEvent(event); - } - } + wxControl::DoSetSize( x, y , width , height ,sizeFlags ) ; } - void wxSlider::DoMoveWindow(int x, int y, int width, int height) - { - m_x = x; - m_y = y; - m_width = width; - m_height = height; - + void wxSlider::MacUpdateDimensions() +{ + // actually in the current systems this should never be possible, but later reparenting + // may become a reality + + if ( (ControlHandle) m_macControl == NULL ) + return ; + + if ( GetParent() == NULL ) + return ; + + WindowRef rootwindow = (WindowRef) MacGetRootWindow() ; + if ( rootwindow == NULL ) + return ; + int xborder, yborder; int minValWidth, maxValWidth, textwidth, textheight; int sliderBreadth; xborder = yborder = 0; - + if (GetWindowStyle() & wxSL_LABELS) { wxString text; @@ -469,22 +380,45 @@ void wxSlider::MacHandleControlClick( WXWidget control , wxInt16 controlpart ) if(GetWindowStyle() & wxSL_VERTICAL) { m_macMinimumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT, - height - yborder - textheight); + m_height - yborder - textheight); m_macMaximumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT, 0); - m_macValueStatic->Move(0, height - textheight); + m_macValueStatic->Move(0, m_height - textheight); } else { m_macMinimumStatic->Move(0, sliderBreadth + wxSLIDER_BORDERTEXT); - m_macMaximumStatic->Move(width - xborder - maxValWidth / 2, + m_macMaximumStatic->Move(m_width - xborder - maxValWidth / 2, sliderBreadth + wxSLIDER_BORDERTEXT); - m_macValueStatic->Move(width - textwidth, 0); + m_macValueStatic->Move(m_width - textwidth, 0); } } - - if(GetParent()) { - GetParent()->MacClientToRootWindow(&x, &y); - } - UMAMoveControl( (ControlHandle) m_macControl, x, y); - UMASizeControl( (ControlHandle) m_macControl, width - xborder, height - yborder); + + Rect oldBounds ; + GetControlBounds( (ControlHandle) m_macControl , &oldBounds ) ; + + int new_x = m_x + MacGetLeftBorderSize() + m_macHorizontalBorder ; + int new_y = m_y + MacGetTopBorderSize() + m_macVerticalBorder ; + int new_width = m_width - MacGetLeftBorderSize() - MacGetRightBorderSize() - 2 * m_macHorizontalBorder - xborder ; + int new_height = m_height - MacGetTopBorderSize() - MacGetBottomBorderSize() - 2 * m_macVerticalBorder - yborder ; + + GetParent()->MacWindowToRootWindow( & new_x , & new_y ) ; + bool doMove = new_x != oldBounds.left || new_y != oldBounds.top ; + bool doResize = ( oldBounds.right - oldBounds.left ) != new_width || (oldBounds.bottom - oldBounds.top ) != new_height ; + if ( doMove || doResize ) + { + InvalWindowRect( rootwindow, &oldBounds ) ; + if ( doMove ) + { + UMAMoveControl( (ControlHandle) m_macControl , new_x , new_y ) ; + } + if ( doResize ) + { + UMASizeControl( (ControlHandle) m_macControl , new_width , new_height ) ; + } + } +} + + void wxSlider::DoMoveWindow(int x, int y, int width, int height) + { + wxControl::DoMoveWindow(x,y,width,height) ; } \ No newline at end of file diff --git a/src/mac/carbon/spinctrl.cpp b/src/mac/carbon/spinctrl.cpp index 272c0791f3..a083c8a3c5 100644 --- a/src/mac/carbon/spinctrl.cpp +++ b/src/mac/carbon/spinctrl.cpp @@ -14,32 +14,309 @@ #include "wx/defs.h" +#ifndef WX_PRECOMP + #include "wx/textctrl.h" +#endif //WX_PRECOMP + #if wxUSE_SPINCTRL +#include "wx/spinbutt.h" #include "wx/spinctrl.h" -#if 0 -// now using the generic impl -//----------------------------------------------------------------------------- -// wxSpinCtrl -//----------------------------------------------------------------------------- +#include "wx/spinctrl.h" -#if wxUSE_SPINBTN && !defined(__WXMAC__) +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY - IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl,wxControl) -#endif +// the margin between the text control and the spin +static const wxCoord MARGIN = 2; -#else // !wxUSE_SPINBTN +// ---------------------------------------------------------------------------- +// wxSpinCtrlText: text control used by spin control +// ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY - IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl,wxTextCtrl) -#endif +class wxSpinCtrlText : public wxTextCtrl +{ +public: + wxSpinCtrlText(wxSpinCtrl *spin, const wxString& value) + : wxTextCtrl(spin , -1, value) + { + m_spin = spin; + } + +protected: + void OnTextChange(wxCommandEvent& event) + { + int val; + if ( m_spin->GetTextValue(&val) ) + { + m_spin->GetSpinButton()->SetValue(val); + } + + event.Skip(); + } + + bool ProcessEvent(wxEvent &event) + { + // Hand button down events to wxSpinCtrl. Doesn't work. + if (event.GetEventType() == wxEVT_LEFT_DOWN && m_spin->ProcessEvent( event )) + return TRUE; + + return wxTextCtrl::ProcessEvent( event ); + } + +private: + wxSpinCtrl *m_spin; + + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(wxSpinCtrlText, wxTextCtrl) + EVT_TEXT(-1, wxSpinCtrlText::OnTextChange) +END_EVENT_TABLE() + +// ---------------------------------------------------------------------------- +// wxSpinCtrlButton: spin button used by spin control +// ---------------------------------------------------------------------------- + +class wxSpinCtrlButton : public wxSpinButton +{ +public: + wxSpinCtrlButton(wxSpinCtrl *spin, int style) + : wxSpinButton(spin ) + { + m_spin = spin; + + SetWindowStyle(style | wxSP_VERTICAL); + } -#endif // wxUSE_SPINBTN/!wxUSE_SPINBTN +protected: + void OnSpinButton(wxSpinEvent& eventSpin) + { +#if defined(__WXMAC__) || defined(__WXMOTIF__) + m_spin->SetTextValue(eventSpin.GetPosition()); + wxCommandEvent event(wxEVT_COMMAND_SPINCTRL_UPDATED, m_spin->GetId()); + event.SetEventObject(m_spin); + event.SetInt(eventSpin.GetPosition()); + + m_spin->GetEventHandler()->ProcessEvent(event); +#else + m_spin->SetTextValue(eventSpin.GetPosition()); + eventSpin.Skip(); #endif + } + +private: + wxSpinCtrl *m_spin; + + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(wxSpinCtrlButton, wxSpinButton) + EVT_SPIN(-1, wxSpinCtrlButton::OnSpinButton) +END_EVENT_TABLE() + +IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl, wxControl) + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxSpinCtrl creation +// ---------------------------------------------------------------------------- + +void wxSpinCtrl::Init() +{ + m_text = NULL; + m_btn = NULL; +} + +bool wxSpinCtrl::Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + long style, + int min, + int max, + int initial, + const wxString& name) +{ + if ( !wxControl::Create(parent, id, wxDefaultPosition, wxDefaultSize, style, + wxDefaultValidator, name) ) + { + return FALSE; + } + + // the string value overrides the numeric one (for backwards compatibility + // reasons and also because it is simpler to satisfy the string value which + // comes much sooner in the list of arguments and leave the initial + // parameter unspecified) + if ( !value.empty() ) + { + long l; + if ( value.ToLong(&l) ) + initial = l; + } + + wxSize csize = size ; + m_text = new wxSpinCtrlText(this, value); + m_btn = new wxSpinCtrlButton(this, style); + + m_btn->SetRange(min, max); + m_btn->SetValue(initial); + + if ( size.y == -1 ) { + csize.y = m_text->GetSize().y ; + } + DoSetSize(pos.x , pos.y , csize.x, csize.y); + + return TRUE; +} + +wxSpinCtrl::~wxSpinCtrl() +{ + // delete the controls now, don't leave them alive even though they would + // still be eventually deleted by our parent - but it will be too late, the + // user code expects them to be gone now + delete m_text; + m_text = NULL ; + delete m_btn; + m_btn = NULL ; +} + +// ---------------------------------------------------------------------------- +// geometry +// ---------------------------------------------------------------------------- + +wxSize wxSpinCtrl::DoGetBestSize() const +{ + wxSize sizeBtn = m_btn->GetBestSize(), + sizeText = m_text->GetBestSize(); + + return wxSize(sizeBtn.x + sizeText.x + MARGIN, sizeText.y); +} + +void wxSpinCtrl::DoMoveWindow(int x, int y, int width, int height) +{ + wxControl::DoMoveWindow(x, y, width, height); + + // position the subcontrols inside the client area + wxSize sizeBtn = m_btn->GetSize(); + + wxCoord wText = width - sizeBtn.x; + m_text->SetSize(0, 0, wText, height); + m_btn->SetSize(0 + wText + MARGIN, 0, -1, -1); +} + +// ---------------------------------------------------------------------------- +// operations forwarded to the subcontrols +// ---------------------------------------------------------------------------- + +bool wxSpinCtrl::Enable(bool enable) +{ + if ( !wxControl::Enable(enable) ) + return FALSE; + return TRUE; +} + +bool wxSpinCtrl::Show(bool show) +{ + if ( !wxControl::Show(show) ) + return FALSE; + return TRUE; +} + +// ---------------------------------------------------------------------------- +// value and range access +// ---------------------------------------------------------------------------- + +bool wxSpinCtrl::GetTextValue(int *val) const +{ + long l; + if ( !m_text->GetValue().ToLong(&l) ) + { + // not a number at all + return FALSE; + } + + if ( l < GetMin() || l > GetMax() ) + { + // out of range + return FALSE; + } + + *val = l; + + return TRUE; +} + +int wxSpinCtrl::GetValue() const +{ + return m_btn ? m_btn->GetValue() : 0; +} + +int wxSpinCtrl::GetMin() const +{ + return m_btn ? m_btn->GetMin() : 0; +} + +int wxSpinCtrl::GetMax() const +{ + return m_btn ? m_btn->GetMax() : 0; +} + +// ---------------------------------------------------------------------------- +// changing value and range +// ---------------------------------------------------------------------------- + +void wxSpinCtrl::SetTextValue(int val) +{ + wxCHECK_RET( m_text, _T("invalid call to wxSpinCtrl::SetTextValue") ); + + m_text->SetValue(wxString::Format(_T("%d"), val)); + + // select all text + m_text->SetSelection(0, -1); + + // and give focus to the control! + // m_text->SetFocus(); Why???? TODO. +} + +void wxSpinCtrl::SetValue(int val) +{ + wxCHECK_RET( m_btn, _T("invalid call to wxSpinCtrl::SetValue") ); + + SetTextValue(val); + + m_btn->SetValue(val); +} + +void wxSpinCtrl::SetValue(const wxString& text) +{ + wxCHECK_RET( m_text, _T("invalid call to wxSpinCtrl::SetValue") ); + + long val; + if ( text.ToLong(&val) && ((val > INT_MIN) && (val < INT_MAX)) ) + { + SetValue((int)val); + } + else // not a number at all or out of range + { + m_text->SetValue(text); + m_text->SetSelection(0, -1); + } +} + +void wxSpinCtrl::SetRange(int min, int max) +{ + wxCHECK_RET( m_btn, _T("invalid call to wxSpinCtrl::SetRange") ); -#endif // wxUSE_SPINCTRL + m_btn->SetRange(min, max); +} +#endif // wxUSE_SPINCTRL diff --git a/src/mac/carbon/window.cpp b/src/mac/carbon/window.cpp index 868a2c03c5..143edf6c1e 100644 --- a/src/mac/carbon/window.cpp +++ b/src/mac/carbon/window.cpp @@ -594,6 +594,9 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height) m_width = actualWidth ; m_height = actualHeight ; + // update any low-level frame-relative positions + + MacUpdateDimensions() ; // erase new position Refresh() ; @@ -1195,6 +1198,7 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect) if (child == m_vScrollBar) continue; if (child == m_hScrollBar) continue; if (child->IsTopLevel()) continue; + int x,y; child->GetPosition( &x, &y ); int w,h; @@ -1437,7 +1441,7 @@ bool wxWindowMac::MacDispatchMouseEvent(wxMouseEvent& event) return FALSE; - if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) || IsKindOf( CLASSINFO( wxSpinCtrl ) )) + if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) /* || IsKindOf( CLASSINFO( wxSpinCtrl ) ) */) return FALSE ; WindowRef window = (WindowRef) MacGetRootWindow() ; diff --git a/src/mac/combobox.cpp b/src/mac/combobox.cpp index e67e1d9601..4fa350e709 100644 --- a/src/mac/combobox.cpp +++ b/src/mac/combobox.cpp @@ -51,7 +51,7 @@ class wxComboBoxText : public wxTextCtrl { public: wxComboBoxText( wxComboBox * cb ) - : wxTextCtrl( cb->GetParent(), 1 ) + : wxTextCtrl( cb , 1 ) { m_cb = cb; } @@ -81,7 +81,7 @@ class wxComboBoxChoice : public wxChoice { public: wxComboBoxChoice(wxComboBox *cb, int style) - : wxChoice( cb->GetParent(), 1 ) + : wxChoice( cb , 1 ) { m_cb = cb; } @@ -145,13 +145,13 @@ void wxComboBox::DoMoveWindow(int x, int y, int width, int height) { if ( m_text == 0 ) { - m_choice->SetSize(x, y, width, -1); + m_choice->SetSize(0, 0 , width, -1); } else { wxCoord wText = width - POPUPWIDTH; - m_text->SetSize(x, y, wText, height); - m_choice->SetSize(x + wText + MARGIN, y, POPUPWIDTH, -1); + m_text->SetSize(0, 0, wText, height); + m_choice->SetSize(0 + wText + MARGIN, 0, POPUPWIDTH, -1); } } @@ -166,13 +166,6 @@ bool wxComboBox::Enable(bool enable) if ( !wxControl::Enable(enable) ) return FALSE; - m_choice->Enable(enable); - - if ( m_text != 0 ) - { - m_text->Enable(enable); - } - return TRUE; } @@ -181,17 +174,6 @@ bool wxComboBox::Show(bool show) if ( !wxControl::Show(show) ) return FALSE; - // under GTK Show() is called the first time before we are fully - // constructed - if ( m_choice ) - { - m_choice->Show(show); - if ( m_text != 0 ) - { - m_text->Show(show); - } - } - return TRUE; } @@ -224,13 +206,13 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id, Rect bounds ; Str255 title ; - if ( !wxControl::Create(parent, id, pos, size, style, + if ( !wxControl::Create(parent, id, wxDefaultPosition, wxDefaultSize, style , wxDefaultValidator, name) ) { return FALSE; } - m_choice = new wxComboBoxChoice(this, style); + m_choice = new wxComboBoxChoice(this, style ); wxSize csize = size; if ( style & wxCB_READONLY ) @@ -246,21 +228,12 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id, } DoSetSize(pos.x, pos.y, csize.x, csize.y); + for ( int i = 0 ; i < n ; i++ ) { m_choice->DoAppend( choices[ i ] ); } - // have to disable this window to avoid interfering it with message - // processing to the text and the button... but pretend it is enabled to - // make IsEnabled() return TRUE - wxControl::Enable(FALSE); // don't use non virtual Disable() here! - m_isEnabled = TRUE; - - // we don't even need to show this window itself - and not doing it avoids - // that it overwrites the text control - wxControl::Show(FALSE); - return TRUE; } diff --git a/src/mac/control.cpp b/src/mac/control.cpp index 945441b4ea..d416ffa799 100644 --- a/src/mac/control.cpp +++ b/src/mac/control.cpp @@ -118,7 +118,13 @@ bool wxControl::Create(wxWindow *parent, wxWindowID id, m_macControl = NULL ; m_macHorizontalBorder = 0 ; // additional pixels around the real control m_macVerticalBorder = 0 ; + bool rval = wxWindow::Create(parent, id, pos, size, style, name); + if ( parent ) + { + m_backgroundColour = parent->GetBackgroundColour() ; + m_foregroundColour = parent->GetForegroundColour() ; + } if (rval) { #if wxUSE_VALIDATORS SetValidator(validator); @@ -410,7 +416,7 @@ void wxControl::MacAdjustControlRect() else m_width = bestsize.right - bestsize.left ; - m_width += 2 * m_macHorizontalBorder ; + m_width += 2 * m_macHorizontalBorder + MacGetLeftBorderSize() + MacGetRightBorderSize() ; } if ( m_height == -1 ) { @@ -418,10 +424,10 @@ void wxControl::MacAdjustControlRect() if ( m_height < 10 ) m_height = 13 ; - m_height += 2 * m_macVerticalBorder; + m_height += 2 * m_macVerticalBorder + MacGetTopBorderSize() + MacGetBottomBorderSize() ; } - - UMASizeControl( (ControlHandle) m_macControl , m_width - 2 * m_macHorizontalBorder, m_height - 2 * m_macVerticalBorder ) ; + MacUpdateDimensions() ; +// UMASizeControl( (ControlHandle) m_macControl , m_width - 2 * m_macHorizontalBorder, m_height - 2 * m_macVerticalBorder ) ; } } @@ -433,35 +439,49 @@ WXWidget wxControl::MacGetContainerForEmbedding() return wxWindow::MacGetContainerForEmbedding() ; } -void wxControl::MacSuperChangedPosition() +void wxControl::MacUpdateDimensions() { - if ( (ControlHandle) m_macControl ) - { - Rect contrlRect ; - GetControlBounds( (ControlHandle) m_macControl , &contrlRect ) ; - int former_mac_x = contrlRect.left ; - int former_mac_y = contrlRect.top ; - int mac_x = m_x ; - int mac_y = m_y ; - GetParent()->MacWindowToRootWindow( & mac_x , & mac_y ) ; - - WindowRef rootwindow = (WindowRef) MacGetRootWindow() ; - - if ( mac_x + m_macHorizontalBorder != former_mac_x || - mac_y + m_macVerticalBorder != former_mac_y ) - { - { - Rect inval = { former_mac_y , former_mac_x , former_mac_y + m_height , former_mac_x + m_width } ; - InvalWindowRect( rootwindow , &inval ) ; - } - UMAMoveControl( (ControlHandle) m_macControl , mac_x + m_macHorizontalBorder , mac_y + m_macVerticalBorder ) ; - { - Rect inval = { mac_y , mac_x , mac_y + m_height , mac_x + m_width } ; - InvalWindowRect( rootwindow , &inval ) ; - } - } - } + // actually in the current systems this should never be possible, but later reparenting + // may become a reality + + if ( (ControlHandle) m_macControl == NULL ) + return ; + + if ( GetParent() == NULL ) + return ; + + WindowRef rootwindow = (WindowRef) MacGetRootWindow() ; + if ( rootwindow == NULL ) + return ; + + Rect oldBounds ; + GetControlBounds( (ControlHandle) m_macControl , &oldBounds ) ; + + int new_x = m_x + MacGetLeftBorderSize() + m_macHorizontalBorder ; + int new_y = m_y + MacGetTopBorderSize() + m_macVerticalBorder ; + int new_width = m_width - MacGetLeftBorderSize() - MacGetRightBorderSize() - 2 * m_macHorizontalBorder ; + int new_height = m_height - MacGetTopBorderSize() - MacGetBottomBorderSize() - 2 * m_macVerticalBorder ; + + GetParent()->MacWindowToRootWindow( & new_x , & new_y ) ; + bool doMove = new_x != oldBounds.left || new_y != oldBounds.top ; + bool doResize = ( oldBounds.right - oldBounds.left ) != new_width || (oldBounds.bottom - oldBounds.top ) != new_height ; + if ( doMove || doResize ) + { + InvalWindowRect( rootwindow, &oldBounds ) ; + if ( doMove ) + { + UMAMoveControl( (ControlHandle) m_macControl , new_x , new_y ) ; + } + if ( doResize ) + { + UMASizeControl( (ControlHandle) m_macControl , new_width , new_height ) ; + } + } +} +void wxControl::MacSuperChangedPosition() +{ + MacUpdateDimensions() ; wxWindow::MacSuperChangedPosition() ; } @@ -500,6 +520,10 @@ void wxControl::DoSetSize(int x, int y, int width, int height, int sizeFlags ) { + wxWindow::DoSetSize( x , y ,width , height ,sizeFlags ) ; + return ; +/* + if ( (ControlHandle) m_macControl == NULL ) { wxWindow::DoSetSize( x , y ,width , height ,sizeFlags ) ; @@ -614,6 +638,7 @@ void wxControl::DoSetSize(int x, int y, Refresh() ; } +*/ } bool wxControl::Show(bool show) diff --git a/src/mac/slider.cpp b/src/mac/slider.cpp index f76b09fc68..8dcae35279 100644 --- a/src/mac/slider.cpp +++ b/src/mac/slider.cpp @@ -327,119 +327,30 @@ void wxSlider::MacHandleControlClick( WXWidget control , wxInt16 controlpart ) void wxSlider::DoSetSize(int x, int y, int width, int height, int sizeFlags) { - Rect oldbounds, newbounds; - int new_x, new_y, new_width, new_height; - int mac_x, mac_y; - - new_x = m_x; - new_y = m_y; - new_width = m_width; - new_height = m_height; - - if (sizeFlags & wxSIZE_ALLOW_MINUS_ONE) - { - new_x = x; - new_y = y; - new_width = width; - new_height = height; - } - else - { - if (x != -1) new_x = x; - if (y != -1) new_y = y; - if (width != -1) new_width = width; - if (height != -1) new_height = height; - } - - if(sizeFlags & wxSIZE_AUTO) - { - wxSize size = GetBestSize(); - if (sizeFlags & wxSIZE_AUTO_WIDTH) - { - if (width == -1) new_width = size.x; - } - if (sizeFlags & wxSIZE_AUTO_HEIGHT) - { - if (height == -1) new_height = size.y; - } - } - - AdjustForParentClientOrigin(new_x, new_y, sizeFlags); - - mac_x = new_x; - mac_y = new_y; - if(GetParent()) { - GetParent()->MacClientToRootWindow(&mac_x, &mac_y); - } - - GetControlBounds( (ControlHandle) m_macControl, &oldbounds); - oldbounds.right = oldbounds.left + m_width; - oldbounds.bottom = oldbounds.top + m_height; - - bool doMove = false; - bool doResize = false; - - if ( mac_x != oldbounds.left || mac_y != oldbounds.top ) - { - doMove = true ; - } - if ( new_width != m_width || new_height != m_height ) - { - doResize = true ; - } - - if ( doMove || doResize ) - { - // Ensure resize is within constraints - if ((m_minWidth != -1) && (new_width < m_minWidth)) { - new_width = m_minWidth; - } - if ((m_minHeight != -1) && (new_height < m_minHeight)) { - new_height = m_minHeight; - } - if ((m_maxWidth != -1) && (new_width > m_maxWidth)) { - new_width = m_maxWidth; - } - if ((m_maxHeight != -1) && (new_height > m_maxHeight)) { - new_height = m_maxHeight; - } - - DoMoveWindow(new_x, new_y, new_width, new_height); - - // Update window at old and new positions - SetRect(&newbounds, m_x, m_y, m_x + m_width, m_y + m_height); - WindowRef rootwindow = (WindowRef) MacGetRootWindow(); - InvalWindowRect( rootwindow , &oldbounds ); - InvalWindowRect( rootwindow , &newbounds ); - - if ( doMove ) - { - wxMoveEvent event(wxPoint(m_x, m_y), m_windowId); - event.SetEventObject(this); - GetEventHandler()->ProcessEvent(event) ; - } - if ( doResize ) - { - wxSizeEvent event(wxSize(m_width, m_height), m_windowId); - event.SetEventObject(this); - GetEventHandler()->ProcessEvent(event); - } - } + wxControl::DoSetSize( x, y , width , height ,sizeFlags ) ; } - void wxSlider::DoMoveWindow(int x, int y, int width, int height) - { - m_x = x; - m_y = y; - m_width = width; - m_height = height; - + void wxSlider::MacUpdateDimensions() +{ + // actually in the current systems this should never be possible, but later reparenting + // may become a reality + + if ( (ControlHandle) m_macControl == NULL ) + return ; + + if ( GetParent() == NULL ) + return ; + + WindowRef rootwindow = (WindowRef) MacGetRootWindow() ; + if ( rootwindow == NULL ) + return ; + int xborder, yborder; int minValWidth, maxValWidth, textwidth, textheight; int sliderBreadth; xborder = yborder = 0; - + if (GetWindowStyle() & wxSL_LABELS) { wxString text; @@ -469,22 +380,45 @@ void wxSlider::MacHandleControlClick( WXWidget control , wxInt16 controlpart ) if(GetWindowStyle() & wxSL_VERTICAL) { m_macMinimumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT, - height - yborder - textheight); + m_height - yborder - textheight); m_macMaximumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT, 0); - m_macValueStatic->Move(0, height - textheight); + m_macValueStatic->Move(0, m_height - textheight); } else { m_macMinimumStatic->Move(0, sliderBreadth + wxSLIDER_BORDERTEXT); - m_macMaximumStatic->Move(width - xborder - maxValWidth / 2, + m_macMaximumStatic->Move(m_width - xborder - maxValWidth / 2, sliderBreadth + wxSLIDER_BORDERTEXT); - m_macValueStatic->Move(width - textwidth, 0); + m_macValueStatic->Move(m_width - textwidth, 0); } } - - if(GetParent()) { - GetParent()->MacClientToRootWindow(&x, &y); - } - UMAMoveControl( (ControlHandle) m_macControl, x, y); - UMASizeControl( (ControlHandle) m_macControl, width - xborder, height - yborder); + + Rect oldBounds ; + GetControlBounds( (ControlHandle) m_macControl , &oldBounds ) ; + + int new_x = m_x + MacGetLeftBorderSize() + m_macHorizontalBorder ; + int new_y = m_y + MacGetTopBorderSize() + m_macVerticalBorder ; + int new_width = m_width - MacGetLeftBorderSize() - MacGetRightBorderSize() - 2 * m_macHorizontalBorder - xborder ; + int new_height = m_height - MacGetTopBorderSize() - MacGetBottomBorderSize() - 2 * m_macVerticalBorder - yborder ; + + GetParent()->MacWindowToRootWindow( & new_x , & new_y ) ; + bool doMove = new_x != oldBounds.left || new_y != oldBounds.top ; + bool doResize = ( oldBounds.right - oldBounds.left ) != new_width || (oldBounds.bottom - oldBounds.top ) != new_height ; + if ( doMove || doResize ) + { + InvalWindowRect( rootwindow, &oldBounds ) ; + if ( doMove ) + { + UMAMoveControl( (ControlHandle) m_macControl , new_x , new_y ) ; + } + if ( doResize ) + { + UMASizeControl( (ControlHandle) m_macControl , new_width , new_height ) ; + } + } +} + + void wxSlider::DoMoveWindow(int x, int y, int width, int height) + { + wxControl::DoMoveWindow(x,y,width,height) ; } \ No newline at end of file diff --git a/src/mac/spinctrl.cpp b/src/mac/spinctrl.cpp index 272c0791f3..a083c8a3c5 100644 --- a/src/mac/spinctrl.cpp +++ b/src/mac/spinctrl.cpp @@ -14,32 +14,309 @@ #include "wx/defs.h" +#ifndef WX_PRECOMP + #include "wx/textctrl.h" +#endif //WX_PRECOMP + #if wxUSE_SPINCTRL +#include "wx/spinbutt.h" #include "wx/spinctrl.h" -#if 0 -// now using the generic impl -//----------------------------------------------------------------------------- -// wxSpinCtrl -//----------------------------------------------------------------------------- +#include "wx/spinctrl.h" -#if wxUSE_SPINBTN && !defined(__WXMAC__) +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY - IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl,wxControl) -#endif +// the margin between the text control and the spin +static const wxCoord MARGIN = 2; -#else // !wxUSE_SPINBTN +// ---------------------------------------------------------------------------- +// wxSpinCtrlText: text control used by spin control +// ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY - IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl,wxTextCtrl) -#endif +class wxSpinCtrlText : public wxTextCtrl +{ +public: + wxSpinCtrlText(wxSpinCtrl *spin, const wxString& value) + : wxTextCtrl(spin , -1, value) + { + m_spin = spin; + } + +protected: + void OnTextChange(wxCommandEvent& event) + { + int val; + if ( m_spin->GetTextValue(&val) ) + { + m_spin->GetSpinButton()->SetValue(val); + } + + event.Skip(); + } + + bool ProcessEvent(wxEvent &event) + { + // Hand button down events to wxSpinCtrl. Doesn't work. + if (event.GetEventType() == wxEVT_LEFT_DOWN && m_spin->ProcessEvent( event )) + return TRUE; + + return wxTextCtrl::ProcessEvent( event ); + } + +private: + wxSpinCtrl *m_spin; + + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(wxSpinCtrlText, wxTextCtrl) + EVT_TEXT(-1, wxSpinCtrlText::OnTextChange) +END_EVENT_TABLE() + +// ---------------------------------------------------------------------------- +// wxSpinCtrlButton: spin button used by spin control +// ---------------------------------------------------------------------------- + +class wxSpinCtrlButton : public wxSpinButton +{ +public: + wxSpinCtrlButton(wxSpinCtrl *spin, int style) + : wxSpinButton(spin ) + { + m_spin = spin; + + SetWindowStyle(style | wxSP_VERTICAL); + } -#endif // wxUSE_SPINBTN/!wxUSE_SPINBTN +protected: + void OnSpinButton(wxSpinEvent& eventSpin) + { +#if defined(__WXMAC__) || defined(__WXMOTIF__) + m_spin->SetTextValue(eventSpin.GetPosition()); + wxCommandEvent event(wxEVT_COMMAND_SPINCTRL_UPDATED, m_spin->GetId()); + event.SetEventObject(m_spin); + event.SetInt(eventSpin.GetPosition()); + + m_spin->GetEventHandler()->ProcessEvent(event); +#else + m_spin->SetTextValue(eventSpin.GetPosition()); + eventSpin.Skip(); #endif + } + +private: + wxSpinCtrl *m_spin; + + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(wxSpinCtrlButton, wxSpinButton) + EVT_SPIN(-1, wxSpinCtrlButton::OnSpinButton) +END_EVENT_TABLE() + +IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl, wxControl) + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxSpinCtrl creation +// ---------------------------------------------------------------------------- + +void wxSpinCtrl::Init() +{ + m_text = NULL; + m_btn = NULL; +} + +bool wxSpinCtrl::Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + long style, + int min, + int max, + int initial, + const wxString& name) +{ + if ( !wxControl::Create(parent, id, wxDefaultPosition, wxDefaultSize, style, + wxDefaultValidator, name) ) + { + return FALSE; + } + + // the string value overrides the numeric one (for backwards compatibility + // reasons and also because it is simpler to satisfy the string value which + // comes much sooner in the list of arguments and leave the initial + // parameter unspecified) + if ( !value.empty() ) + { + long l; + if ( value.ToLong(&l) ) + initial = l; + } + + wxSize csize = size ; + m_text = new wxSpinCtrlText(this, value); + m_btn = new wxSpinCtrlButton(this, style); + + m_btn->SetRange(min, max); + m_btn->SetValue(initial); + + if ( size.y == -1 ) { + csize.y = m_text->GetSize().y ; + } + DoSetSize(pos.x , pos.y , csize.x, csize.y); + + return TRUE; +} + +wxSpinCtrl::~wxSpinCtrl() +{ + // delete the controls now, don't leave them alive even though they would + // still be eventually deleted by our parent - but it will be too late, the + // user code expects them to be gone now + delete m_text; + m_text = NULL ; + delete m_btn; + m_btn = NULL ; +} + +// ---------------------------------------------------------------------------- +// geometry +// ---------------------------------------------------------------------------- + +wxSize wxSpinCtrl::DoGetBestSize() const +{ + wxSize sizeBtn = m_btn->GetBestSize(), + sizeText = m_text->GetBestSize(); + + return wxSize(sizeBtn.x + sizeText.x + MARGIN, sizeText.y); +} + +void wxSpinCtrl::DoMoveWindow(int x, int y, int width, int height) +{ + wxControl::DoMoveWindow(x, y, width, height); + + // position the subcontrols inside the client area + wxSize sizeBtn = m_btn->GetSize(); + + wxCoord wText = width - sizeBtn.x; + m_text->SetSize(0, 0, wText, height); + m_btn->SetSize(0 + wText + MARGIN, 0, -1, -1); +} + +// ---------------------------------------------------------------------------- +// operations forwarded to the subcontrols +// ---------------------------------------------------------------------------- + +bool wxSpinCtrl::Enable(bool enable) +{ + if ( !wxControl::Enable(enable) ) + return FALSE; + return TRUE; +} + +bool wxSpinCtrl::Show(bool show) +{ + if ( !wxControl::Show(show) ) + return FALSE; + return TRUE; +} + +// ---------------------------------------------------------------------------- +// value and range access +// ---------------------------------------------------------------------------- + +bool wxSpinCtrl::GetTextValue(int *val) const +{ + long l; + if ( !m_text->GetValue().ToLong(&l) ) + { + // not a number at all + return FALSE; + } + + if ( l < GetMin() || l > GetMax() ) + { + // out of range + return FALSE; + } + + *val = l; + + return TRUE; +} + +int wxSpinCtrl::GetValue() const +{ + return m_btn ? m_btn->GetValue() : 0; +} + +int wxSpinCtrl::GetMin() const +{ + return m_btn ? m_btn->GetMin() : 0; +} + +int wxSpinCtrl::GetMax() const +{ + return m_btn ? m_btn->GetMax() : 0; +} + +// ---------------------------------------------------------------------------- +// changing value and range +// ---------------------------------------------------------------------------- + +void wxSpinCtrl::SetTextValue(int val) +{ + wxCHECK_RET( m_text, _T("invalid call to wxSpinCtrl::SetTextValue") ); + + m_text->SetValue(wxString::Format(_T("%d"), val)); + + // select all text + m_text->SetSelection(0, -1); + + // and give focus to the control! + // m_text->SetFocus(); Why???? TODO. +} + +void wxSpinCtrl::SetValue(int val) +{ + wxCHECK_RET( m_btn, _T("invalid call to wxSpinCtrl::SetValue") ); + + SetTextValue(val); + + m_btn->SetValue(val); +} + +void wxSpinCtrl::SetValue(const wxString& text) +{ + wxCHECK_RET( m_text, _T("invalid call to wxSpinCtrl::SetValue") ); + + long val; + if ( text.ToLong(&val) && ((val > INT_MIN) && (val < INT_MAX)) ) + { + SetValue((int)val); + } + else // not a number at all or out of range + { + m_text->SetValue(text); + m_text->SetSelection(0, -1); + } +} + +void wxSpinCtrl::SetRange(int min, int max) +{ + wxCHECK_RET( m_btn, _T("invalid call to wxSpinCtrl::SetRange") ); -#endif // wxUSE_SPINCTRL + m_btn->SetRange(min, max); +} +#endif // wxUSE_SPINCTRL diff --git a/src/mac/window.cpp b/src/mac/window.cpp index 868a2c03c5..143edf6c1e 100644 --- a/src/mac/window.cpp +++ b/src/mac/window.cpp @@ -594,6 +594,9 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height) m_width = actualWidth ; m_height = actualHeight ; + // update any low-level frame-relative positions + + MacUpdateDimensions() ; // erase new position Refresh() ; @@ -1195,6 +1198,7 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect) if (child == m_vScrollBar) continue; if (child == m_hScrollBar) continue; if (child->IsTopLevel()) continue; + int x,y; child->GetPosition( &x, &y ); int w,h; @@ -1437,7 +1441,7 @@ bool wxWindowMac::MacDispatchMouseEvent(wxMouseEvent& event) return FALSE; - if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) || IsKindOf( CLASSINFO( wxSpinCtrl ) )) + if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) /* || IsKindOf( CLASSINFO( wxSpinCtrl ) ) */) return FALSE ; WindowRef window = (WindowRef) MacGetRootWindow() ;