X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9e565667d0f29605c948ad6e742310798e3b2d0d..06a32e049c1bad9249079ad2e91659303424a774:/src/generic/spinctlg.cpp diff --git a/src/generic/spinctlg.cpp b/src/generic/spinctlg.cpp index 52e28ff5f7..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) + // 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; @@ -84,8 +88,16 @@ public: void OnChar( wxKeyEvent &event ) { - if (m_spin) - m_spin->ProcessWindowEvent(event); + if ( !m_spin->ProcessWindowEvent(event) ) + event.Skip(); + } + + void OnTextEvent(wxCommandEvent& event) + { + wxCommandEvent eventCopy(event); + eventCopy.SetEventObject(m_spin); + eventCopy.SetId(m_spin->GetId()); + m_spin->ProcessWindowEvent(eventCopy); } void OnKillFocus(wxFocusEvent& event) @@ -105,6 +117,15 @@ private: BEGIN_EVENT_TABLE(wxSpinCtrlTextGeneric, wxTextCtrl) EVT_CHAR(wxSpinCtrlTextGeneric::OnChar) + // 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() @@ -248,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) @@ -482,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(); } } @@ -514,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; }