case WM_GETDLGCODE:
// we want to get WXK_RETURN in order to generate the event for it
- return DLGC_WANTCHARS;
+ return DLGC_WANTALLKEYS;
}
return ::CallWindowProc(CASTWNDPROC spin->GetBuddyWndProc(),
// process a WM_COMMAND generated by the buddy text control
bool wxSpinCtrl::ProcessTextCommand(WXWORD cmd, WXWORD WXUNUSED(id))
{
- if ( cmd == EN_CHANGE )
+ if ( (cmd == EN_CHANGE) && (!m_blockEvent ))
{
wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, GetId());
event.SetEventObject(this);
int min, int max, int initial,
const wxString& name)
{
+ m_blockEvent = false;
+
// this should be in ctor/init function but I don't want to add one to 2.8
// to avoid problems with default ctor which can be inlined in the user
// code and so might not get this fix without recompilation
void wxSpinCtrl::SetValue(int val)
{
+ m_blockEvent = true;
+
wxSpinButton::SetValue(val);
// normally setting the value of the spin button is enough as it updates
}
m_oldValue = GetValue();
+
+ m_blockEvent = false;
}
int wxSpinCtrl::GetValue() const
return true;
}
+bool wxSpinCtrl::Reparent(wxWindowBase *newParent)
+{
+ // Reparenting both the updown control and its buddy does not seem to work:
+ // they continue to be connected somehow, but visually there is no feedback
+ // on the buddy edit control. To avoid this problem, we reparent the buddy
+ // window normally, but we recreate the updown control and reassign its
+ // buddy.
+
+ if ( !wxWindowBase::Reparent(newParent) )
+ return false;
+
+ newParent->GetChildren().DeleteObject(this);
+
+ // preserve the old values
+ const wxSize size = GetSize();
+ int value = GetValue();
+ const wxRect btnRect = wxRectFromRECT(wxGetWindowRect(GetHwnd()));
+
+ // destroy the old spin button
+ UnsubclassWin();
+ if ( !::DestroyWindow(GetHwnd()) )
+ wxLogLastError(wxT("DestroyWindow"));
+
+ // create and initialize the new one
+ if ( !wxSpinButton::Create(GetParent(), GetId(),
+ btnRect.GetPosition(), btnRect.GetSize(),
+ GetWindowStyle(), GetName()) )
+ return false;
+
+ SetValue(value);
+ SetRange(m_min, m_max);
+ SetInitialSize(size);
+
+ // associate it with the buddy control again
+ ::SetParent(GetBuddyHwnd(), GetHwndOf(GetParent()));
+ (void)::SendMessage(GetHwnd(), UDM_SETBUDDY, (WPARAM)GetBuddyHwnd(), 0);
+
+ return true;
+}
+
bool wxSpinCtrl::Enable(bool enable)
{
if ( !wxControl::Enable(enable) )