X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ad8ddd139179075f578c50ae1816d236cf86455d..6d7b547184bfdcdf67790755deb0122050b1d728:/src/msw/spinctrl.cpp diff --git a/src/msw/spinctrl.cpp b/src/msw/spinctrl.cpp index 283d9fe0e3..67083e3f1e 100644 --- a/src/msw/spinctrl.cpp +++ b/src/msw/spinctrl.cpp @@ -1,11 +1,11 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: msw/spinctrl.cpp +// Name: src/msw/spinctrl.cpp // Purpose: wxSpinCtrl class implementation for Win32 // Author: Vadim Zeitlin // Modified by: // Created: 22.07.99 // RCS-ID: $Id$ -// Copyright: (c) Vadim Zeitlin +// Copyright: (c) 1999-2005 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -13,11 +13,6 @@ // declarations // ============================================================================ -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "spinctrlbase.h" - #pragma implementation "spinctrl.h" -#endif - // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- @@ -29,21 +24,22 @@ #pragma hdrstop #endif -#ifndef WX_PRECOMP - #include "wx/wx.h" -#endif - #if wxUSE_SPINCTRL -#if defined(__WIN95__) - #include "wx/spinctrl.h" -#include "wx/msw/private.h" -#if defined(__WIN95__) && !(defined(__GNUWIN32_OLD__) && !defined(__CYGWIN10__)) - #include +#ifndef WX_PRECOMP + #include "wx/event.h" + #include "wx/textctrl.h" #endif +#include "wx/msw/private.h" +#include "wx/msw/wrapcctl.h" + +#if wxUSE_TOOLTIPS + #include "wx/tooltip.h" +#endif // wxUSE_TOOLTIPS + #include // for INT_MIN // ---------------------------------------------------------------------------- @@ -115,11 +111,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() @@ -203,28 +200,14 @@ wxSpinCtrl *wxSpinCtrl::GetSpinForTextCtrl(WXHWND hwndBuddy) // process a WM_COMMAND generated by the buddy text control bool wxSpinCtrl::ProcessTextCommand(WXWORD cmd, WXWORD WXUNUSED(id)) { - switch (cmd) + if ( cmd == EN_CHANGE ) { - case EN_CHANGE: - { - wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, GetId()); - event.SetEventObject(this); - wxString val = wxGetWindowText(m_hwndBuddy); - event.SetString(val); - event.SetInt(GetValue()); - return GetEventHandler()->ProcessEvent(event); - } - case EN_SETFOCUS: - case EN_KILLFOCUS: - { - wxFocusEvent event(cmd == EN_KILLFOCUS ? wxEVT_KILL_FOCUS - : wxEVT_SET_FOCUS, - m_windowId); - event.SetEventObject( this ); - return GetEventHandler()->ProcessEvent(event); - } - default: - break; + wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, GetId()); + event.SetEventObject(this); + wxString val = wxGetWindowText(m_hwndBuddy); + event.SetString(val); + event.SetInt(GetValue()); + return GetEventHandler()->ProcessEvent(event); } // not processed @@ -268,6 +251,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 @@ -392,7 +382,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); } @@ -429,16 +419,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("%d"), 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; } @@ -452,7 +460,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); } // ---------------------------------------------------------------------------- @@ -502,6 +510,18 @@ void wxSpinCtrl::SetFocus() ::SetFocus(GetBuddyHwnd()); } +#if wxUSE_TOOLTIPS + +void wxSpinCtrl::DoSetToolTip(wxToolTip *tip) +{ + wxSpinButton::DoSetToolTip(tip); + + if ( tip ) + tip->Add(m_hwndBuddy); +} + +#endif // wxUSE_TOOLTIPS + // ---------------------------------------------------------------------------- // event processing // ---------------------------------------------------------------------------- @@ -556,16 +576,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 @@ -593,8 +609,4 @@ void wxSpinCtrl::DoGetPosition(int *x, int *y) const wxConstCast(this, wxSpinCtrl)->m_hWnd = hWnd; } -#endif // __WIN95__ - -#endif - // wxUSE_SPINCTRL - +#endif // wxUSE_SPINCTRL