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;
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)
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()
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)
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();
}
}
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;
}