{
public:
wxComboBoxText( wxComboBox * cb )
- : wxTextCtrl( cb->GetParent(), 1 )
+ : wxTextCtrl( cb , 1 )
{
m_cb = cb;
}
{
public:
wxComboBoxChoice(wxComboBox *cb, int style)
- : wxChoice( cb->GetParent(), 1 )
+ : wxChoice( cb , 1 )
{
m_cb = cb;
}
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);
}
}
if ( !wxControl::Enable(enable) )
return FALSE;
- m_choice->Enable(enable);
-
- if ( m_text != 0 )
- {
- m_text->Enable(enable);
- }
-
return TRUE;
}
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;
}
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 )
}
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;
}
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);
else
m_width = bestsize.right - bestsize.left ;
- m_width += 2 * m_macHorizontalBorder ;
+ m_width += 2 * m_macHorizontalBorder + MacGetLeftBorderSize() + MacGetRightBorderSize() ;
}
if ( m_height == -1 )
{
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 ) ;
}
}
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() ;
}
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 ) ;
Refresh() ;
}
+*/
}
bool wxControl::Show(bool show)
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;
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
#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
m_width = actualWidth ;
m_height = actualHeight ;
+ // update any low-level frame-relative positions
+
+ MacUpdateDimensions() ;
// erase new position
Refresh() ;
if (child == m_vScrollBar) continue;
if (child == m_hScrollBar) continue;
if (child->IsTopLevel()) continue;
+
int x,y;
child->GetPosition( &x, &y );
int w,h;
return FALSE;
- if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) || IsKindOf( CLASSINFO( wxSpinCtrl ) ))
+ if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) /* || IsKindOf( CLASSINFO( wxSpinCtrl ) ) */)
return FALSE ;
WindowRef window = (WindowRef) MacGetRootWindow() ;
{
public:
wxComboBoxText( wxComboBox * cb )
- : wxTextCtrl( cb->GetParent(), 1 )
+ : wxTextCtrl( cb , 1 )
{
m_cb = cb;
}
{
public:
wxComboBoxChoice(wxComboBox *cb, int style)
- : wxChoice( cb->GetParent(), 1 )
+ : wxChoice( cb , 1 )
{
m_cb = cb;
}
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);
}
}
if ( !wxControl::Enable(enable) )
return FALSE;
- m_choice->Enable(enable);
-
- if ( m_text != 0 )
- {
- m_text->Enable(enable);
- }
-
return TRUE;
}
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;
}
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 )
}
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;
}
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);
else
m_width = bestsize.right - bestsize.left ;
- m_width += 2 * m_macHorizontalBorder ;
+ m_width += 2 * m_macHorizontalBorder + MacGetLeftBorderSize() + MacGetRightBorderSize() ;
}
if ( m_height == -1 )
{
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 ) ;
}
}
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() ;
}
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 ) ;
Refresh() ;
}
+*/
}
bool wxControl::Show(bool show)
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;
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
#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
m_width = actualWidth ;
m_height = actualHeight ;
+ // update any low-level frame-relative positions
+
+ MacUpdateDimensions() ;
// erase new position
Refresh() ;
if (child == m_vScrollBar) continue;
if (child == m_hScrollBar) continue;
if (child->IsTopLevel()) continue;
+
int x,y;
child->GetPosition( &x, &y );
int w,h;
return FALSE;
- if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) || IsKindOf( CLASSINFO( wxSpinCtrl ) ))
+ if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) /* || IsKindOf( CLASSINFO( wxSpinCtrl ) ) */)
return FALSE ;
WindowRef window = (WindowRef) MacGetRootWindow() ;