+/* static */
+wxSpinCtrl *wxSpinCtrl::GetSpinForTextCtrl(WXHWND hwndBuddy)
+{
+ wxSpinCtrl *spin = (wxSpinCtrl *)::GetWindowLong((HWND)hwndBuddy,
+ GWL_USERDATA);
+
+ int i = ms_allSpins.Index(spin);
+
+ if ( i == wxNOT_FOUND )
+ return NULL;
+
+ // sanity check
+ wxASSERT_MSG( spin->m_hwndBuddy == hwndBuddy,
+ _T("wxSpinCtrl has incorrect buddy HWND!") );
+
+ return spin;
+}
+
+// process a WM_COMMAND generated by the buddy text control
+bool wxSpinCtrl::ProcessTextCommand(WXWORD cmd, WXWORD WXUNUSED(id))
+{
+ switch (cmd)
+ {
+ 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;
+ }
+
+ // not processed
+ return FALSE;
+}
+
+void wxSpinCtrl::OnChar(wxKeyEvent& event)
+{
+ switch ( event.GetKeyCode() )
+ {
+ case WXK_RETURN:
+ {
+ wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId);
+ InitCommandEvent(event);
+ wxString val = wxGetWindowText(m_hwndBuddy);
+ event.SetString(val);
+ event.SetInt(GetValue());
+ if ( GetEventHandler()->ProcessEvent(event) )
+ return;
+ break;
+ }
+
+ case WXK_TAB:
+ // always produce navigation event - even if we process TAB
+ // ourselves the fact that we got here means that the user code
+ // decided to skip processing of this TAB - probably to let it
+ // do its default job.
+ {
+ wxNavigationKeyEvent eventNav;
+ eventNav.SetDirection(!event.ShiftDown());
+ eventNav.SetWindowChange(event.ControlDown());
+ eventNav.SetEventObject(this);
+
+ if ( GetParent()->GetEventHandler()->ProcessEvent(eventNav) )
+ return;
+ }
+ break;
+ }
+
+ // no, we didn't process it
+ event.Skip();
+}
+
+void wxSpinCtrl::OnSetFocus(wxFocusEvent& event)
+{
+ // when we get focus, give it to our buddy window as it needs it more than
+ // we do
+ ::SetFocus((HWND)m_hwndBuddy);
+
+ event.Skip();
+}
+