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
This commit is contained in:
Stefan Csomor
2002-08-02 15:46:45 +00:00
parent 434ec26e81
commit 327788acc5
10 changed files with 822 additions and 396 deletions

View File

@@ -51,7 +51,7 @@ class wxComboBoxText : public wxTextCtrl
{ {
public: public:
wxComboBoxText( wxComboBox * cb ) wxComboBoxText( wxComboBox * cb )
: wxTextCtrl( cb->GetParent(), 1 ) : wxTextCtrl( cb , 1 )
{ {
m_cb = cb; m_cb = cb;
} }
@@ -81,7 +81,7 @@ class wxComboBoxChoice : public wxChoice
{ {
public: public:
wxComboBoxChoice(wxComboBox *cb, int style) wxComboBoxChoice(wxComboBox *cb, int style)
: wxChoice( cb->GetParent(), 1 ) : wxChoice( cb , 1 )
{ {
m_cb = cb; m_cb = cb;
} }
@@ -145,13 +145,13 @@ void wxComboBox::DoMoveWindow(int x, int y, int width, int height) {
if ( m_text == 0 ) if ( m_text == 0 )
{ {
m_choice->SetSize(x, y, width, -1); m_choice->SetSize(0, 0 , width, -1);
} }
else else
{ {
wxCoord wText = width - POPUPWIDTH; wxCoord wText = width - POPUPWIDTH;
m_text->SetSize(x, y, wText, height); m_text->SetSize(0, 0, wText, height);
m_choice->SetSize(x + wText + MARGIN, y, POPUPWIDTH, -1); m_choice->SetSize(0 + wText + MARGIN, 0, POPUPWIDTH, -1);
} }
} }
@@ -166,13 +166,6 @@ bool wxComboBox::Enable(bool enable)
if ( !wxControl::Enable(enable) ) if ( !wxControl::Enable(enable) )
return FALSE; return FALSE;
m_choice->Enable(enable);
if ( m_text != 0 )
{
m_text->Enable(enable);
}
return TRUE; return TRUE;
} }
@@ -181,17 +174,6 @@ bool wxComboBox::Show(bool show)
if ( !wxControl::Show(show) ) if ( !wxControl::Show(show) )
return FALSE; 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; return TRUE;
} }
@@ -224,13 +206,13 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
Rect bounds ; Rect bounds ;
Str255 title ; Str255 title ;
if ( !wxControl::Create(parent, id, pos, size, style, if ( !wxControl::Create(parent, id, wxDefaultPosition, wxDefaultSize, style ,
wxDefaultValidator, name) ) wxDefaultValidator, name) )
{ {
return FALSE; return FALSE;
} }
m_choice = new wxComboBoxChoice(this, style); m_choice = new wxComboBoxChoice(this, style );
wxSize csize = size; wxSize csize = size;
if ( style & wxCB_READONLY ) if ( style & wxCB_READONLY )
@@ -246,21 +228,12 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
} }
DoSetSize(pos.x, pos.y, csize.x, csize.y); DoSetSize(pos.x, pos.y, csize.x, csize.y);
for ( int i = 0 ; i < n ; i++ ) for ( int i = 0 ; i < n ; i++ )
{ {
m_choice->DoAppend( choices[ 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; return TRUE;
} }

View File

@@ -118,7 +118,13 @@ bool wxControl::Create(wxWindow *parent, wxWindowID id,
m_macControl = NULL ; m_macControl = NULL ;
m_macHorizontalBorder = 0 ; // additional pixels around the real control m_macHorizontalBorder = 0 ; // additional pixels around the real control
m_macVerticalBorder = 0 ; m_macVerticalBorder = 0 ;
bool rval = wxWindow::Create(parent, id, pos, size, style, name); bool rval = wxWindow::Create(parent, id, pos, size, style, name);
if ( parent )
{
m_backgroundColour = parent->GetBackgroundColour() ;
m_foregroundColour = parent->GetForegroundColour() ;
}
if (rval) { if (rval) {
#if wxUSE_VALIDATORS #if wxUSE_VALIDATORS
SetValidator(validator); SetValidator(validator);
@@ -410,7 +416,7 @@ void wxControl::MacAdjustControlRect()
else else
m_width = bestsize.right - bestsize.left ; 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 == -1 )
{ {
@@ -418,10 +424,10 @@ void wxControl::MacAdjustControlRect()
if ( m_height < 10 ) if ( m_height < 10 )
m_height = 13 ; m_height = 13 ;
m_height += 2 * m_macVerticalBorder; m_height += 2 * m_macVerticalBorder + MacGetTopBorderSize() + MacGetBottomBorderSize() ;
} }
MacUpdateDimensions() ;
UMASizeControl( (ControlHandle) m_macControl , m_width - 2 * m_macHorizontalBorder, m_height - 2 * m_macVerticalBorder ) ; // UMASizeControl( (ControlHandle) m_macControl , m_width - 2 * m_macHorizontalBorder, m_height - 2 * m_macVerticalBorder ) ;
} }
} }
@@ -433,35 +439,49 @@ WXWidget wxControl::MacGetContainerForEmbedding()
return wxWindow::MacGetContainerForEmbedding() ; return wxWindow::MacGetContainerForEmbedding() ;
} }
void wxControl::MacSuperChangedPosition() void wxControl::MacUpdateDimensions()
{ {
if ( (ControlHandle) m_macControl ) // actually in the current systems this should never be possible, but later reparenting
{ // may become a reality
Rect contrlRect ;
GetControlBounds( (ControlHandle) m_macControl , &contrlRect ) ; if ( (ControlHandle) m_macControl == NULL )
int former_mac_x = contrlRect.left ; return ;
int former_mac_y = contrlRect.top ;
int mac_x = m_x ; if ( GetParent() == NULL )
int mac_y = m_y ; return ;
GetParent()->MacWindowToRootWindow( & mac_x , & mac_y ) ;
WindowRef rootwindow = (WindowRef) MacGetRootWindow() ; WindowRef rootwindow = (WindowRef) MacGetRootWindow() ;
if ( rootwindow == NULL )
return ;
if ( mac_x + m_macHorizontalBorder != former_mac_x || Rect oldBounds ;
mac_y + m_macVerticalBorder != former_mac_y ) GetControlBounds( (ControlHandle) m_macControl , &oldBounds ) ;
{
{
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 ) ;
}
}
}
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() ; wxWindow::MacSuperChangedPosition() ;
} }
@@ -500,6 +520,10 @@ void wxControl::DoSetSize(int x, int y,
int width, int height, int width, int height,
int sizeFlags ) int sizeFlags )
{ {
wxWindow::DoSetSize( x , y ,width , height ,sizeFlags ) ;
return ;
/*
if ( (ControlHandle) m_macControl == NULL ) if ( (ControlHandle) m_macControl == NULL )
{ {
wxWindow::DoSetSize( x , y ,width , height ,sizeFlags ) ; wxWindow::DoSetSize( x , y ,width , height ,sizeFlags ) ;
@@ -614,6 +638,7 @@ void wxControl::DoSetSize(int x, int y,
Refresh() ; Refresh() ;
} }
*/
} }
bool wxControl::Show(bool show) bool wxControl::Show(bool show)

View File

@@ -327,112 +327,23 @@ void wxSlider::MacHandleControlClick( WXWidget control , wxInt16 controlpart )
void wxSlider::DoSetSize(int x, int y, int width, int height, int sizeFlags) void wxSlider::DoSetSize(int x, int y, int width, int height, int sizeFlags)
{ {
Rect oldbounds, newbounds; wxControl::DoSetSize( x, y , width , height ,sizeFlags ) ;
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) void wxSlider::MacUpdateDimensions()
{ {
wxSize size = GetBestSize(); // actually in the current systems this should never be possible, but later reparenting
if (sizeFlags & wxSIZE_AUTO_WIDTH) // may become a reality
{
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); if ( (ControlHandle) m_macControl == NULL )
return ;
mac_x = new_x; if ( GetParent() == NULL )
mac_y = new_y; return ;
if(GetParent()) {
GetParent()->MacClientToRootWindow(&mac_x, &mac_y);
}
GetControlBounds( (ControlHandle) m_macControl, &oldbounds); WindowRef rootwindow = (WindowRef) MacGetRootWindow() ;
oldbounds.right = oldbounds.left + m_width; if ( rootwindow == NULL )
oldbounds.bottom = oldbounds.top + m_height; return ;
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);
}
}
}
void wxSlider::DoMoveWindow(int x, int y, int width, int height)
{
m_x = x;
m_y = y;
m_width = width;
m_height = height;
int xborder, yborder; int xborder, yborder;
int minValWidth, maxValWidth, textwidth, textheight; int minValWidth, maxValWidth, textwidth, textheight;
@@ -469,22 +380,45 @@ void wxSlider::MacHandleControlClick( WXWidget control , wxInt16 controlpart )
if(GetWindowStyle() & wxSL_VERTICAL) if(GetWindowStyle() & wxSL_VERTICAL)
{ {
m_macMinimumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT, m_macMinimumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT,
height - yborder - textheight); m_height - yborder - textheight);
m_macMaximumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT, 0); m_macMaximumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT, 0);
m_macValueStatic->Move(0, height - textheight); m_macValueStatic->Move(0, m_height - textheight);
} }
else else
{ {
m_macMinimumStatic->Move(0, sliderBreadth + wxSLIDER_BORDERTEXT); 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); sliderBreadth + wxSLIDER_BORDERTEXT);
m_macValueStatic->Move(width - textwidth, 0); m_macValueStatic->Move(m_width - textwidth, 0);
} }
} }
if(GetParent()) { Rect oldBounds ;
GetParent()->MacClientToRootWindow(&x, &y); 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 ) ;
}
} }
UMAMoveControl( (ControlHandle) m_macControl, x, y); }
UMASizeControl( (ControlHandle) m_macControl, width - xborder, height - yborder);
void wxSlider::DoMoveWindow(int x, int y, int width, int height)
{
wxControl::DoMoveWindow(x,y,width,height) ;
} }

View File

@@ -14,32 +14,309 @@
#include "wx/defs.h" #include "wx/defs.h"
#ifndef WX_PRECOMP
#include "wx/textctrl.h"
#endif //WX_PRECOMP
#if wxUSE_SPINCTRL #if wxUSE_SPINCTRL
#include "wx/spinbutt.h"
#include "wx/spinctrl.h"
#include "wx/spinctrl.h" #include "wx/spinctrl.h"
#if 0 // ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
// now using the generic impl // the margin between the text control and the spin
//----------------------------------------------------------------------------- static const wxCoord MARGIN = 2;
// wxSpinCtrl
//-----------------------------------------------------------------------------
#if wxUSE_SPINBTN && !defined(__WXMAC__) // ----------------------------------------------------------------------------
// wxSpinCtrlText: text control used by spin control
// ----------------------------------------------------------------------------
#if !USE_SHARED_LIBRARY class wxSpinCtrlText : public wxTextCtrl
IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl,wxControl) {
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);
}
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 #endif
}
#else // !wxUSE_SPINBTN private:
wxSpinCtrl *m_spin;
#if !USE_SHARED_LIBRARY DECLARE_EVENT_TABLE()
IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl,wxTextCtrl) };
#endif
#endif // wxUSE_SPINBTN/!wxUSE_SPINBTN BEGIN_EVENT_TABLE(wxSpinCtrlButton, wxSpinButton)
EVT_SPIN(-1, wxSpinCtrlButton::OnSpinButton)
END_EVENT_TABLE()
#endif 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") );
m_btn->SetRange(min, max);
}
#endif // wxUSE_SPINCTRL #endif // wxUSE_SPINCTRL

View File

@@ -594,6 +594,9 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
m_width = actualWidth ; m_width = actualWidth ;
m_height = actualHeight ; m_height = actualHeight ;
// update any low-level frame-relative positions
MacUpdateDimensions() ;
// erase new position // erase new position
Refresh() ; Refresh() ;
@@ -1195,6 +1198,7 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
if (child == m_vScrollBar) continue; if (child == m_vScrollBar) continue;
if (child == m_hScrollBar) continue; if (child == m_hScrollBar) continue;
if (child->IsTopLevel()) continue; if (child->IsTopLevel()) continue;
int x,y; int x,y;
child->GetPosition( &x, &y ); child->GetPosition( &x, &y );
int w,h; int w,h;
@@ -1437,7 +1441,7 @@ bool wxWindowMac::MacDispatchMouseEvent(wxMouseEvent& event)
return FALSE; return FALSE;
if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) || IsKindOf( CLASSINFO( wxSpinCtrl ) )) if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) /* || IsKindOf( CLASSINFO( wxSpinCtrl ) ) */)
return FALSE ; return FALSE ;
WindowRef window = (WindowRef) MacGetRootWindow() ; WindowRef window = (WindowRef) MacGetRootWindow() ;

View File

@@ -51,7 +51,7 @@ class wxComboBoxText : public wxTextCtrl
{ {
public: public:
wxComboBoxText( wxComboBox * cb ) wxComboBoxText( wxComboBox * cb )
: wxTextCtrl( cb->GetParent(), 1 ) : wxTextCtrl( cb , 1 )
{ {
m_cb = cb; m_cb = cb;
} }
@@ -81,7 +81,7 @@ class wxComboBoxChoice : public wxChoice
{ {
public: public:
wxComboBoxChoice(wxComboBox *cb, int style) wxComboBoxChoice(wxComboBox *cb, int style)
: wxChoice( cb->GetParent(), 1 ) : wxChoice( cb , 1 )
{ {
m_cb = cb; m_cb = cb;
} }
@@ -145,13 +145,13 @@ void wxComboBox::DoMoveWindow(int x, int y, int width, int height) {
if ( m_text == 0 ) if ( m_text == 0 )
{ {
m_choice->SetSize(x, y, width, -1); m_choice->SetSize(0, 0 , width, -1);
} }
else else
{ {
wxCoord wText = width - POPUPWIDTH; wxCoord wText = width - POPUPWIDTH;
m_text->SetSize(x, y, wText, height); m_text->SetSize(0, 0, wText, height);
m_choice->SetSize(x + wText + MARGIN, y, POPUPWIDTH, -1); m_choice->SetSize(0 + wText + MARGIN, 0, POPUPWIDTH, -1);
} }
} }
@@ -166,13 +166,6 @@ bool wxComboBox::Enable(bool enable)
if ( !wxControl::Enable(enable) ) if ( !wxControl::Enable(enable) )
return FALSE; return FALSE;
m_choice->Enable(enable);
if ( m_text != 0 )
{
m_text->Enable(enable);
}
return TRUE; return TRUE;
} }
@@ -181,17 +174,6 @@ bool wxComboBox::Show(bool show)
if ( !wxControl::Show(show) ) if ( !wxControl::Show(show) )
return FALSE; 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; return TRUE;
} }
@@ -224,13 +206,13 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
Rect bounds ; Rect bounds ;
Str255 title ; Str255 title ;
if ( !wxControl::Create(parent, id, pos, size, style, if ( !wxControl::Create(parent, id, wxDefaultPosition, wxDefaultSize, style ,
wxDefaultValidator, name) ) wxDefaultValidator, name) )
{ {
return FALSE; return FALSE;
} }
m_choice = new wxComboBoxChoice(this, style); m_choice = new wxComboBoxChoice(this, style );
wxSize csize = size; wxSize csize = size;
if ( style & wxCB_READONLY ) if ( style & wxCB_READONLY )
@@ -246,21 +228,12 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
} }
DoSetSize(pos.x, pos.y, csize.x, csize.y); DoSetSize(pos.x, pos.y, csize.x, csize.y);
for ( int i = 0 ; i < n ; i++ ) for ( int i = 0 ; i < n ; i++ )
{ {
m_choice->DoAppend( choices[ 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; return TRUE;
} }

View File

@@ -118,7 +118,13 @@ bool wxControl::Create(wxWindow *parent, wxWindowID id,
m_macControl = NULL ; m_macControl = NULL ;
m_macHorizontalBorder = 0 ; // additional pixels around the real control m_macHorizontalBorder = 0 ; // additional pixels around the real control
m_macVerticalBorder = 0 ; m_macVerticalBorder = 0 ;
bool rval = wxWindow::Create(parent, id, pos, size, style, name); bool rval = wxWindow::Create(parent, id, pos, size, style, name);
if ( parent )
{
m_backgroundColour = parent->GetBackgroundColour() ;
m_foregroundColour = parent->GetForegroundColour() ;
}
if (rval) { if (rval) {
#if wxUSE_VALIDATORS #if wxUSE_VALIDATORS
SetValidator(validator); SetValidator(validator);
@@ -410,7 +416,7 @@ void wxControl::MacAdjustControlRect()
else else
m_width = bestsize.right - bestsize.left ; 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 == -1 )
{ {
@@ -418,10 +424,10 @@ void wxControl::MacAdjustControlRect()
if ( m_height < 10 ) if ( m_height < 10 )
m_height = 13 ; m_height = 13 ;
m_height += 2 * m_macVerticalBorder; m_height += 2 * m_macVerticalBorder + MacGetTopBorderSize() + MacGetBottomBorderSize() ;
} }
MacUpdateDimensions() ;
UMASizeControl( (ControlHandle) m_macControl , m_width - 2 * m_macHorizontalBorder, m_height - 2 * m_macVerticalBorder ) ; // UMASizeControl( (ControlHandle) m_macControl , m_width - 2 * m_macHorizontalBorder, m_height - 2 * m_macVerticalBorder ) ;
} }
} }
@@ -433,35 +439,49 @@ WXWidget wxControl::MacGetContainerForEmbedding()
return wxWindow::MacGetContainerForEmbedding() ; return wxWindow::MacGetContainerForEmbedding() ;
} }
void wxControl::MacSuperChangedPosition() void wxControl::MacUpdateDimensions()
{ {
if ( (ControlHandle) m_macControl ) // actually in the current systems this should never be possible, but later reparenting
{ // may become a reality
Rect contrlRect ;
GetControlBounds( (ControlHandle) m_macControl , &contrlRect ) ; if ( (ControlHandle) m_macControl == NULL )
int former_mac_x = contrlRect.left ; return ;
int former_mac_y = contrlRect.top ;
int mac_x = m_x ; if ( GetParent() == NULL )
int mac_y = m_y ; return ;
GetParent()->MacWindowToRootWindow( & mac_x , & mac_y ) ;
WindowRef rootwindow = (WindowRef) MacGetRootWindow() ; WindowRef rootwindow = (WindowRef) MacGetRootWindow() ;
if ( rootwindow == NULL )
return ;
if ( mac_x + m_macHorizontalBorder != former_mac_x || Rect oldBounds ;
mac_y + m_macVerticalBorder != former_mac_y ) GetControlBounds( (ControlHandle) m_macControl , &oldBounds ) ;
{
{
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 ) ;
}
}
}
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() ; wxWindow::MacSuperChangedPosition() ;
} }
@@ -500,6 +520,10 @@ void wxControl::DoSetSize(int x, int y,
int width, int height, int width, int height,
int sizeFlags ) int sizeFlags )
{ {
wxWindow::DoSetSize( x , y ,width , height ,sizeFlags ) ;
return ;
/*
if ( (ControlHandle) m_macControl == NULL ) if ( (ControlHandle) m_macControl == NULL )
{ {
wxWindow::DoSetSize( x , y ,width , height ,sizeFlags ) ; wxWindow::DoSetSize( x , y ,width , height ,sizeFlags ) ;
@@ -614,6 +638,7 @@ void wxControl::DoSetSize(int x, int y,
Refresh() ; Refresh() ;
} }
*/
} }
bool wxControl::Show(bool show) bool wxControl::Show(bool show)

View File

@@ -327,112 +327,23 @@ void wxSlider::MacHandleControlClick( WXWidget control , wxInt16 controlpart )
void wxSlider::DoSetSize(int x, int y, int width, int height, int sizeFlags) void wxSlider::DoSetSize(int x, int y, int width, int height, int sizeFlags)
{ {
Rect oldbounds, newbounds; wxControl::DoSetSize( x, y , width , height ,sizeFlags ) ;
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) void wxSlider::MacUpdateDimensions()
{ {
wxSize size = GetBestSize(); // actually in the current systems this should never be possible, but later reparenting
if (sizeFlags & wxSIZE_AUTO_WIDTH) // may become a reality
{
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); if ( (ControlHandle) m_macControl == NULL )
return ;
mac_x = new_x; if ( GetParent() == NULL )
mac_y = new_y; return ;
if(GetParent()) {
GetParent()->MacClientToRootWindow(&mac_x, &mac_y);
}
GetControlBounds( (ControlHandle) m_macControl, &oldbounds); WindowRef rootwindow = (WindowRef) MacGetRootWindow() ;
oldbounds.right = oldbounds.left + m_width; if ( rootwindow == NULL )
oldbounds.bottom = oldbounds.top + m_height; return ;
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);
}
}
}
void wxSlider::DoMoveWindow(int x, int y, int width, int height)
{
m_x = x;
m_y = y;
m_width = width;
m_height = height;
int xborder, yborder; int xborder, yborder;
int minValWidth, maxValWidth, textwidth, textheight; int minValWidth, maxValWidth, textwidth, textheight;
@@ -469,22 +380,45 @@ void wxSlider::MacHandleControlClick( WXWidget control , wxInt16 controlpart )
if(GetWindowStyle() & wxSL_VERTICAL) if(GetWindowStyle() & wxSL_VERTICAL)
{ {
m_macMinimumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT, m_macMinimumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT,
height - yborder - textheight); m_height - yborder - textheight);
m_macMaximumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT, 0); m_macMaximumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT, 0);
m_macValueStatic->Move(0, height - textheight); m_macValueStatic->Move(0, m_height - textheight);
} }
else else
{ {
m_macMinimumStatic->Move(0, sliderBreadth + wxSLIDER_BORDERTEXT); 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); sliderBreadth + wxSLIDER_BORDERTEXT);
m_macValueStatic->Move(width - textwidth, 0); m_macValueStatic->Move(m_width - textwidth, 0);
} }
} }
if(GetParent()) { Rect oldBounds ;
GetParent()->MacClientToRootWindow(&x, &y); 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 ) ;
}
} }
UMAMoveControl( (ControlHandle) m_macControl, x, y); }
UMASizeControl( (ControlHandle) m_macControl, width - xborder, height - yborder);
void wxSlider::DoMoveWindow(int x, int y, int width, int height)
{
wxControl::DoMoveWindow(x,y,width,height) ;
} }

View File

@@ -14,32 +14,309 @@
#include "wx/defs.h" #include "wx/defs.h"
#ifndef WX_PRECOMP
#include "wx/textctrl.h"
#endif //WX_PRECOMP
#if wxUSE_SPINCTRL #if wxUSE_SPINCTRL
#include "wx/spinbutt.h"
#include "wx/spinctrl.h"
#include "wx/spinctrl.h" #include "wx/spinctrl.h"
#if 0 // ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
// now using the generic impl // the margin between the text control and the spin
//----------------------------------------------------------------------------- static const wxCoord MARGIN = 2;
// wxSpinCtrl
//-----------------------------------------------------------------------------
#if wxUSE_SPINBTN && !defined(__WXMAC__) // ----------------------------------------------------------------------------
// wxSpinCtrlText: text control used by spin control
// ----------------------------------------------------------------------------
#if !USE_SHARED_LIBRARY class wxSpinCtrlText : public wxTextCtrl
IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl,wxControl) {
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);
}
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 #endif
}
#else // !wxUSE_SPINBTN private:
wxSpinCtrl *m_spin;
#if !USE_SHARED_LIBRARY DECLARE_EVENT_TABLE()
IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl,wxTextCtrl) };
#endif
#endif // wxUSE_SPINBTN/!wxUSE_SPINBTN BEGIN_EVENT_TABLE(wxSpinCtrlButton, wxSpinButton)
EVT_SPIN(-1, wxSpinCtrlButton::OnSpinButton)
END_EVENT_TABLE()
#endif 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") );
m_btn->SetRange(min, max);
}
#endif // wxUSE_SPINCTRL #endif // wxUSE_SPINCTRL

View File

@@ -594,6 +594,9 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
m_width = actualWidth ; m_width = actualWidth ;
m_height = actualHeight ; m_height = actualHeight ;
// update any low-level frame-relative positions
MacUpdateDimensions() ;
// erase new position // erase new position
Refresh() ; Refresh() ;
@@ -1195,6 +1198,7 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
if (child == m_vScrollBar) continue; if (child == m_vScrollBar) continue;
if (child == m_hScrollBar) continue; if (child == m_hScrollBar) continue;
if (child->IsTopLevel()) continue; if (child->IsTopLevel()) continue;
int x,y; int x,y;
child->GetPosition( &x, &y ); child->GetPosition( &x, &y );
int w,h; int w,h;
@@ -1437,7 +1441,7 @@ bool wxWindowMac::MacDispatchMouseEvent(wxMouseEvent& event)
return FALSE; return FALSE;
if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) || IsKindOf( CLASSINFO( wxSpinCtrl ) )) if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) /* || IsKindOf( CLASSINFO( wxSpinCtrl ) ) */)
return FALSE ; return FALSE ;
WindowRef window = (WindowRef) MacGetRootWindow() ; WindowRef window = (WindowRef) MacGetRootWindow() ;