]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/spinctrl.cpp
full keyboard access support
[wxWidgets.git] / src / msw / spinctrl.cpp
index 907fb9f882865446d6115335f57d2e718bc9c4fb..dbc1bdd3ff8c9b95b66c475b2fb74950d35cbb85 100644 (file)
 // declarations
 // ============================================================================
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "spinctrlbase.h"
-    #pragma implementation "spinctrl.h"
-#endif
-
 // ----------------------------------------------------------------------------
 // headers
 // ----------------------------------------------------------------------------
@@ -45,8 +40,6 @@
 
 #include <limits.h>         // for INT_MIN
 
-#define USE_DEFERRED_SIZING 1
-
 // ----------------------------------------------------------------------------
 // macros
 // ----------------------------------------------------------------------------
@@ -116,11 +109,12 @@ wxCONSTRUCTOR_6( wxSpinCtrl , wxWindow* , Parent , wxWindowID , Id , wxString ,
 IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl, wxControl)
 #endif
 
+//pmg EVT_KILL_FOCUS
 BEGIN_EVENT_TABLE(wxSpinCtrl, wxSpinButton)
     EVT_CHAR(wxSpinCtrl::OnChar)
 
     EVT_SET_FOCUS(wxSpinCtrl::OnSetFocus)
-
+    EVT_KILL_FOCUS(wxSpinCtrl::OnKillFocus)
     EVT_SPIN(wxID_ANY, wxSpinCtrl::OnSpinChange)
 END_EVENT_TABLE()
 
@@ -269,6 +263,13 @@ void wxSpinCtrl::OnChar(wxKeyEvent& event)
     event.Skip();
 }
 
+void wxSpinCtrl::OnKillFocus(wxFocusEvent& event)
+{
+    // ensure that the value is shown correctly
+    SetValue(GetValue()) ; 
+    event.Skip();
+}
+
 void wxSpinCtrl::OnSetFocus(wxFocusEvent& event)
 {
     // when we get focus, give it to our buddy window as it needs it more than
@@ -393,7 +394,7 @@ bool wxSpinCtrl::Create(wxWindow *parent,
     // associate the text window with the spin button
     (void)::SendMessage(GetHwnd(), UDM_SETBUDDY, (WPARAM)m_hwndBuddy, 0);
 
-    if ( !value.IsEmpty() )
+    if ( !value.empty() )
     {
         SetValue(value);
     }
@@ -437,7 +438,7 @@ int wxSpinCtrl::GetValue() const
     long n;
     if ( (wxSscanf(val, wxT("%lu"), &n) != 1) )
         n = INT_MIN;
-        
+
     if (n < m_min) n = m_min;
     if (n > m_max) n = m_max;
 
@@ -453,7 +454,7 @@ void wxSpinCtrl::SetSelection(long from, long to)
         from = 0;
     }
 
-    ::SendMessage((HWND)m_hwndBuddy, EM_SETSEL, (WPARAM)from, (LPARAM)to);
+    ::SendMessage(GetBuddyHwnd(), EM_SETSEL, (WPARAM)from, (LPARAM)to);
 }
 
 // ----------------------------------------------------------------------------
@@ -569,55 +570,17 @@ void wxSpinCtrl::DoMoveWindow(int x, int y, int width, int height)
         wxLogDebug(_T("not enough space for wxSpinCtrl!"));
     }
 
-    // if our parent had prepared a defer window handle for us, use it (unless
-    // we are a top level window)
-    wxWindowMSW *parent = GetParent();
-    int originalX = x;
-
-#if USE_DEFERRED_SIZING
-    HDWP hdwp = parent && !IsTopLevel() ? (HDWP)parent->m_hDWP : NULL;
-#else
-    HDWP hdwp = 0;
-#endif    
-
     // 1) The buddy window
-    wxMoveWindowDeferred(hdwp, this, GetBuddyHwnd(),
-                     x, y, widthText, height);
+    DoMoveSibling(m_hwndBuddy, x, y, widthText, height);
 
     // 2) The button window
     x += widthText + MARGIN_BETWEEN;
-    wxMoveWindowDeferred(hdwp, this, GetHwnd(),
-                     x, y, widthBtn, height);
-
-    if (hdwp)
-    {
-        // Store the size so we can report it accurately
-        wxExtraWindowData* extraData = (wxExtraWindowData*) m_windowReserved;
-        if (!extraData)
-        {
-            extraData = new wxExtraWindowData;
-            m_windowReserved = (void*) extraData;
-        }
-        extraData->m_pos = wxPoint(originalX, y);
-        extraData->m_size = wxSize(width, height);
-        extraData->m_deferring = true;
-
-        // hdwp must be updated as it may have been changed
-        parent->m_hDWP = (WXHANDLE)hdwp;
-    }
+    wxSpinButton::DoMoveWindow(x, y, widthBtn, height);
 }
 
 // get total size of the control
 void wxSpinCtrl::DoGetSize(int *x, int *y) const
 {
-    wxExtraWindowData* extraData = (wxExtraWindowData*) m_windowReserved;
-    if (extraData && extraData->m_deferring && GetParent() && GetParent()->m_hDWP)
-    {
-        *x = extraData->m_size.x;        
-        *y = extraData->m_size.y;
-        return;
-    }
-    
     RECT spinrect, textrect, ctrlrect;
     GetWindowRect(GetHwnd(), &spinrect);
     GetWindowRect(GetBuddyHwnd(), &textrect);
@@ -631,14 +594,6 @@ void wxSpinCtrl::DoGetSize(int *x, int *y) const
 
 void wxSpinCtrl::DoGetPosition(int *x, int *y) const
 {
-    wxExtraWindowData* extraData = (wxExtraWindowData*) m_windowReserved;
-    if (extraData && extraData->m_deferring && GetParent() && GetParent()->m_hDWP)
-    {
-        *x = extraData->m_pos.x;        
-        *y = extraData->m_pos.y;
-        return;
-    }
-
     // hack: pretend that our HWND is the text control just for a moment
     WXHWND hWnd = GetHWND();
     wxConstCast(this, wxSpinCtrl)->m_hWnd = m_hwndBuddy;