]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/spinctrl.cpp
fix off by 1 error in GetTextRaw() (#4317)
[wxWidgets.git] / src / msw / spinctrl.cpp
index c5644f4dfcdba04aa8b2f597fe2b6587e07754b5..73fb437fc071edef1f39925c6f800dd5746995c2 100644 (file)
@@ -178,7 +178,7 @@ LRESULT APIENTRY _EXPORT wxBuddyTextWndProc(HWND hwnd,
 
         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(),
@@ -205,7 +205,7 @@ wxSpinCtrl *wxSpinCtrl::GetSpinForTextCtrl(WXHWND hwndBuddy)
 // 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);
@@ -301,6 +301,8 @@ bool wxSpinCtrl::Create(wxWindow *parent,
                         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
@@ -462,6 +464,8 @@ void wxSpinCtrl::SetValue(const wxString& text)
 
 void  wxSpinCtrl::SetValue(int val)
 {
+    m_blockEvent = true;
+    
     wxSpinButton::SetValue(val);
 
     // normally setting the value of the spin button is enough as it updates
@@ -477,6 +481,8 @@ void  wxSpinCtrl::SetValue(int val)
     }
 
     m_oldValue = GetValue();
+    
+    m_blockEvent = false;
 }
 
 int wxSpinCtrl::GetValue() const
@@ -537,6 +543,46 @@ bool wxSpinCtrl::Show(bool show)
     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) )