]> git.saurik.com Git - wxWidgets.git/commitdiff
implement wxSpinCtrl::Reparent() to properly reparent both the spin button and the...
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 15 Mar 2008 04:10:43 +0000 (04:10 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 15 Mar 2008 04:10:43 +0000 (04:10 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52543 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/generic/spinctlg.h
include/wx/msw/spinctrl.h
src/generic/spinctlg.cpp
src/msw/spinctrl.cpp

index ecb672e289fc7c1f6b6a3fde8f30c61f11b05a53..75c85fa13617824eac908f39aae48847a1c947c8 100644 (file)
@@ -288,6 +288,7 @@ All (GUI):
 - Added wxWindow::HasFocus().
 - Added wxGLCanvas::IsDisplaySupported().
 - Added wxApp::SetNativeTheme() (Stefan H.).
+- Made wxSpinCtrl::Reparent() in MSW and generic versions (Angelo Mottola)
 
 wxGTK:
 
index 9d4f63f7fe8eefd44b54b8139d4e22bba390f300..e607f6009dfe67827894a8e22b8dd4e5898aca70 100644 (file)
@@ -74,6 +74,7 @@ public:
     // forward these functions to all subcontrols
     virtual bool Enable(bool enable = true);
     virtual bool Show(bool show = true);
+    virtual bool Reparent(wxWindow *newParent);
 
     // get the subcontrols
     wxTextCtrl *GetText() const { return m_text; }
index cf94fe18a3edb9407310cc93d72aa65f9748c368..94f78810a1700e8ddffcb56bb660fcca64285dad 100644 (file)
@@ -73,6 +73,8 @@ public:
     virtual bool Enable(bool enable = true);
     virtual bool Show(bool show = true);
 
+    virtual bool Reparent(wxWindowBase *newParent);
+
     // wxSpinButton doesn't accept focus, but we do
     virtual bool AcceptsFocus() const { return wxWindow::AcceptsFocus(); }
 
index 88de174cfd1cbce078abe74707d9255c062756b9..9103305144532e383d7b4b0a804c476b1a56886f 100644 (file)
@@ -265,6 +265,17 @@ bool wxSpinCtrl::Show(bool show)
     return true;
 }
 
+bool wxSpinCtrl::Reparent(wxWindow *newParent)
+{
+    if ( m_btn )
+    {
+        m_btn->Reparent(newParent);
+        m_text->Reparent(newParent);
+    }
+
+    return true;
+}
+
 // ----------------------------------------------------------------------------
 // value and range access
 // ----------------------------------------------------------------------------
index c5644f4dfcdba04aa8b2f597fe2b6587e07754b5..e5a4577acf519d81798d8491430f4f87054eabe8 100644 (file)
@@ -537,6 +537,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) )