]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/spinctrl.cpp
use PROOF_QUALITY in LOGFONT by default
[wxWidgets.git] / src / msw / spinctrl.cpp
index 02319d7e7bc947091aa0327fa7e65fca46d123db..da8bb856f66a7a26563ba0e154f380c038406415 100644 (file)
 // declarations
 // ============================================================================
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "spinctrlbase.h"
-    #pragma implementation "spinctrl.h"
-#endif
-
 // ----------------------------------------------------------------------------
 // headers
 // ----------------------------------------------------------------------------
@@ -114,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()
 
@@ -267,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
@@ -391,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);
     }
@@ -428,16 +431,34 @@ void wxSpinCtrl::SetValue(const wxString& text)
     }
 }
 
+void  wxSpinCtrl::SetValue(int val)
+{
+    wxSpinButton::SetValue(val);
+
+    // normally setting the value of the spin button is enough as it updates
+    // its buddy control automatically ...
+    if ( wxGetWindowText(m_hwndBuddy).empty() )
+    {
+        // ... but sometimes it doesn't, notably when the value is 0 and the
+        // text control is currently empty, the spin button seems to be happy
+        // to leave it like this, while we really want to always show the
+        // current value in the control, so do it manually
+        ::SetWindowText(GetBuddyHwnd(), wxString::Format(_T("%ld"), val));
+    }
+}
+
 int wxSpinCtrl::GetValue() const
 {
     wxString val = wxGetWindowText(m_hwndBuddy);
 
     long n;
-    if ( (wxSscanf(val, wxT("%lu"), &n) != 1) )
+    if ( (wxSscanf(val, wxT("%ld"), &n) != 1) )
         n = INT_MIN;
-        
-    if (n < m_min) n = m_min;
-    if (n > m_max) n = m_max;
+
+    if ( n < m_min )
+        n = m_min;
+    if ( n > m_max )
+        n = m_max;
 
     return n;
 }
@@ -451,7 +472,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);
 }
 
 // ----------------------------------------------------------------------------
@@ -567,16 +588,12 @@ void wxSpinCtrl::DoMoveWindow(int x, int y, int width, int height)
         wxLogDebug(_T("not enough space for wxSpinCtrl!"));
     }
 
-    if ( !::MoveWindow(GetBuddyHwnd(), x, y, widthText, height, TRUE) )
-    {
-        wxLogLastError(wxT("MoveWindow(buddy)"));
-    }
+    // 1) The buddy window
+    DoMoveSibling(m_hwndBuddy, x, y, widthText, height);
 
+    // 2) The button window
     x += widthText + MARGIN_BETWEEN;
-    if ( !::MoveWindow(GetHwnd(), x, y, widthBtn, height, TRUE) )
-    {
-        wxLogLastError(wxT("MoveWindow"));
-    }
+    wxSpinButton::DoMoveWindow(x, y, widthBtn, height);
 }
 
 // get total size of the control