X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8e44f3caabe53f60a2335a14cf9b57187fe39b1e..64c1effefabacc175cf601ea4118f3b806a1fd65:/src/msw/spinctrl.cpp diff --git a/src/msw/spinctrl.cpp b/src/msw/spinctrl.cpp index 907fb9f882..da8bb856f6 100644 --- a/src/msw/spinctrl.cpp +++ b/src/msw/spinctrl.cpp @@ -13,11 +13,6 @@ // declarations // ============================================================================ -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "spinctrlbase.h" - #pragma implementation "spinctrl.h" -#endif - // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- @@ -45,8 +40,6 @@ #include // 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); } @@ -430,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; } @@ -453,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); } // ---------------------------------------------------------------------------- @@ -569,55 +588,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 +612,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;