X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9bd25c86704221bb5cf6cbe56b1b593120902ac7..dec0a353ff73e2c335536a0422428beca7359ee7:/src/generic/spinctlg.cpp diff --git a/src/generic/spinctlg.cpp b/src/generic/spinctlg.cpp index 6887f4eae7..d703bb566b 100644 --- a/src/generic/spinctlg.cpp +++ b/src/generic/spinctlg.cpp @@ -65,7 +65,11 @@ class wxSpinCtrlTextGeneric : public wxTextCtrl public: wxSpinCtrlTextGeneric(wxSpinCtrlGenericBase *spin, const wxString& value, long style=0) : wxTextCtrl(spin->GetParent(), wxID_ANY, value, wxDefaultPosition, wxDefaultSize, - style & (wxALIGN_MASK | wxTE_PROCESS_ENTER)) + // This is tricky: we want to honour any alignment flags + // but not wxALIGN_CENTER_VERTICAL because it's the same + // as wxTE_PASSWORD and we definitely don't want to show + // asterisks in spin control. + style & (wxALIGN_MASK | wxTE_PROCESS_ENTER) & ~wxTE_PASSWORD) { m_spin = spin; @@ -88,10 +92,8 @@ public: event.Skip(); } - void OnTextEnter(wxCommandEvent& event) + void OnTextEvent(wxCommandEvent& event) { - // We need to forward this event to the spin control itself as it's - // supposed to generate it if wxTE_PROCESS_ENTER is used with it. wxCommandEvent eventCopy(event); eventCopy.SetEventObject(m_spin); eventCopy.SetId(m_spin->GetId()); @@ -114,7 +116,15 @@ private: BEGIN_EVENT_TABLE(wxSpinCtrlTextGeneric, wxTextCtrl) EVT_CHAR(wxSpinCtrlTextGeneric::OnChar) - EVT_TEXT_ENTER(wxID_ANY, wxSpinCtrlTextGeneric::OnTextEnter) + + // Forward the text events to wxSpinCtrl itself adjusting them slightly in + // the process. + EVT_TEXT(wxID_ANY, wxSpinCtrlTextGeneric::OnTextEvent) + + // And we need to forward this one too as wxSpinCtrl is supposed to + // generate it if wxTE_PROCESS_ENTER is used with it (and if it isn't, + // we're never going to get EVT_TEXT_ENTER in the first place). + EVT_TEXT_ENTER(wxID_ANY, wxSpinCtrlTextGeneric::OnTextEvent) EVT_KILL_FOCUS(wxSpinCtrlTextGeneric::OnKillFocus) END_EVENT_TABLE() @@ -259,16 +269,40 @@ wxSpinCtrlGenericBase::~wxSpinCtrlGenericBase() wxDELETE(m_spinButton); } +wxWindowList wxSpinCtrlGenericBase::GetCompositeWindowParts() const +{ + wxWindowList parts; + parts.push_back(m_textCtrl); + parts.push_back(m_spinButton); + return parts; +} + // ---------------------------------------------------------------------------- // geometry // ---------------------------------------------------------------------------- wxSize wxSpinCtrlGenericBase::DoGetBestSize() const { - wxSize sizeBtn = m_spinButton->GetBestSize(), - sizeText = m_textCtrl->GetBestSize(); + return DoGetSizeFromTextSize(m_textCtrl->GetBestSize().x, -1); +} + +wxSize wxSpinCtrlGenericBase::DoGetSizeFromTextSize(int xlen, int ylen) const +{ + wxSize sizeBtn = m_spinButton->GetBestSize(); + wxSize totalS( m_textCtrl->GetBestSize() ); + + wxSize tsize(xlen + sizeBtn.x + MARGIN, totalS.y); +#if defined(__WXMSW__) + tsize.IncBy(0.4 * totalS.y + 4, 0); +#elif defined(__WXGTK__) + tsize.IncBy(totalS.y + 10, 0); +#endif // MSW GTK + + // Check if the user requested a non-standard height. + if ( ylen > 0 ) + tsize.IncBy(0, ylen - GetCharHeight()); - return wxSize(sizeBtn.x + sizeText.x + MARGIN, sizeText.y); + return tsize; } void wxSpinCtrlGenericBase::DoMoveWindow(int x, int y, int width, int height) @@ -493,8 +527,7 @@ void wxSpinCtrlGenericBase::SetValue(const wxString& text) else // not a number at all or out of range { m_textCtrl->SetValue(text); - m_textCtrl->SetSelection(0, -1); - m_textCtrl->SetInsertionPointEnd(); + m_textCtrl->SelectAll(); } } @@ -525,7 +558,7 @@ bool wxSpinCtrlGenericBase::DoSetValue(double val) if ( !DoTextToValue(str, &m_value ) ) // wysiwyg for textctrl m_value = val; m_textCtrl->SetValue( str ); - m_textCtrl->SetInsertionPointEnd(); + m_textCtrl->SelectAll(); m_textCtrl->DiscardEdits(); return true; }