/////////////////////////////////////////////////////////////////////////////
// Name: spinbutt.cpp
// Purpose: wxSpinButton
-// Author: AUTHOR
+// Author: David Webster
// Modified by:
-// Created: ??/??/98
+// Created: 10/15/99
// RCS-ID: $Id$
-// Copyright: (c) AUTHOR
-// Licence: wxWindows licence
+// Copyright: (c) David Webster
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
-#pragma implementation "spinbutt.h"
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+
+#ifndef WX_PRECOMP
+ #include "wx/wx.h"
#endif
+#if wxUSE_SPINBTN
+
+// Can't resolve reference to CreateUpDownControl in
+// TWIN32, but could probably use normal CreateWindow instead.
+
#include "wx/spinbutt.h"
-#if !USE_SHARED_LIBRARY
-IMPLEMENT_DYNAMIC_CLASS(wxSpinButton, wxControl)
-#endif
+extern void wxAssociateWinWithHandle( HWND hWnd
+ ,wxWindowOS2* pWin
+ );
-wxSpinButton::wxSpinButton()
-{
- m_min = 0;
- m_max = 100;
-}
+IMPLEMENT_DYNAMIC_CLASS(wxSpinEvent, wxNotifyEvent)
-bool wxSpinButton::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
- long style, const wxString& name)
-{
- SetName(name);
+#include "wx/os2/private.h"
- m_windowStyle = style;
+// ============================================================================
+// implementation
+// ============================================================================
- SetParent(parent);
+// ----------------------------------------------------------------------------
+// wxWin macros
+// ----------------------------------------------------------------------------
- m_min = 0;
- m_max = 100;
+IMPLEMENT_DYNAMIC_CLASS(wxSpinButton, wxControl)
- m_windowId = (id == -1) ? NewControlId() : id;
+bool wxSpinButton::Create(
+ wxWindow* pParent
+, wxWindowID vId
+, const wxPoint& rPos
+, const wxSize& rSize
+, long lStyle
+, const wxString& rsName
+)
+{
+ int nX = rPos.x;
+ int nY = rPos.y;
+ int nWidth = rSize.x;
+ int nHeight = rSize.y;
+ SWP vSwp;
- // TODO create spin button
- return FALSE;
-}
+ m_min = 0;
+ m_max = 100;
+ if (vId == -1)
+ m_windowId = NewControlId();
+ else
+ m_windowId = vId;
+ m_backgroundColour = pParent->GetBackgroundColour();
+ m_foregroundColour = pParent->GetForegroundColour();
+ SetName(rsName);
+ SetParent(pParent);
+ m_windowStyle = lStyle;
+
+ //
+ // Get the right size for the control
+ //
+ if (nWidth <= 0 || nHeight <= 0 )
+ {
+ wxSize vSize = DoGetBestSize();
+
+ if (nWidth <= 0 )
+ nWidth = vSize.x;
+ if (nHeight <= 0 )
+ nHeight = vSize.y;
+ }
+ if (nX < 0 )
+ nX = 0;
+ if (nY < 0 )
+ nY = 0;
+
+ long lSstyle = 0L;
+
+ lSstyle = WS_VISIBLE |
+ WS_TABSTOP |
+ SPBS_MASTER | // We use only single field spin buttons
+ SPBS_NUMERICONLY; // We default to numeric data
+
+ if (m_windowStyle & wxCLIP_SIBLINGS )
+ lSstyle |= WS_CLIPSIBLINGS;
+
+ m_hWnd = (WXHWND)::WinCreateWindow( GetWinHwnd(pParent)
+ ,WC_SPINBUTTON
+ ,(PSZ)NULL
+ ,lSstyle
+ ,0L, 0L, 0L, 0L
+ ,GetWinHwnd(pParent)
+ ,HWND_TOP
+ ,(HMENU)vId
+ ,NULL
+ ,NULL
+ );
+ if (m_hWnd == 0)
+ {
+ return FALSE;
+ }
+ SetRange(m_min, m_max);
+ if(pParent)
+ pParent->AddChild((wxSpinButton *)this);
+
+ ::WinQueryWindowPos(m_hWnd, &vSwp);
+ SetXComp(vSwp.x);
+ SetYComp(vSwp.y-5); // compensate for the associated TextControl border
+
+ SetFont(*wxSMALL_FONT);
+ //
+ // For OS/2 we want to hide the text portion so we can substitute an
+ // independent text ctrl in its place.
+ // Therefore we must override any user given width with our best guess.
+ //
+ SetSize( nX - GetXComp()
+ ,nY - GetYComp()
+ ,nWidth
+ ,nHeight
+ );
+ wxAssociateWinWithHandle( m_hWnd
+ ,(wxWindowOS2*)this
+ );
+#if 0
+ // FIXME:
+ // Apparently, this does not work, as it crashes in setvalue/setrange calls
+ // What's it supposed to do anyway?
+ ::WinSetWindowULong(GetHwnd(), QWL_USER, (LONG)this);
+ fnWndProcSpinCtrl = (WXFARPROC)::WinSubclassWindow(m_hWnd, (PFNWP)wxSpinCtrlWndProc);
+#endif
+ return TRUE;
+} // end of wxSpinButton::Create
wxSpinButton::~wxSpinButton()
{
-}
+} // end of wxSpinButton::~wxSpinButton
+
+// ----------------------------------------------------------------------------
+// size calculation
+// ----------------------------------------------------------------------------
+wxSize wxSpinButton::DoGetBestSize() const
+{
+ //
+ // OS/2 PM does not really have system metrics so we'll just set it to
+ // a square based on its height.
+ //
+ RECTL vRect;
+ ::WinQueryWindowRect(GetHwnd(),&vRect);
+ return wxSize(vRect.yTop,vRect.yTop);
+} // end of wxSpinButton::DoGetBestSize
+
+// ----------------------------------------------------------------------------
// Attributes
-////////////////////////////////////////////////////////////////////////////
+// ----------------------------------------------------------------------------
int wxSpinButton::GetValue() const
{
- // TODO
- return 0;
-}
-
-void wxSpinButton::SetValue(int val)
+ long lVal = 0L;
+ char zVal[10];
+
+ ::WinSendMsg( GetHwnd()
+ ,SPBM_QUERYVALUE
+ ,MPFROMP(zVal)
+ ,MPFROM2SHORT( (USHORT)10
+ ,SPBQ_UPDATEIFVALID
+ )
+ );
+ lVal = atol(zVal);
+ return ((int)lVal);
+} // end of wxSpinButton::GetValue
+
+bool wxSpinButton::OS2OnScroll( int WXUNUSED(nOrientation),
+ WXWORD WXUNUSED(wParam),
+ WXWORD wPos,
+ WXHWND hControl )
{
- // TODO
-}
+ wxCHECK_MSG(hControl, false, wxT("scrolling what?") );
-void wxSpinButton::SetRange(int minVal, int maxVal)
-{
- m_min = minVal;
- m_max = maxVal;
- // TODO
-}
+ wxSpinEvent vEvent( wxEVT_SCROLL_THUMBTRACK, m_windowId );
+ int nVal = (int)wPos; // cast is important for negative values!
-// Spin event
-IMPLEMENT_DYNAMIC_CLASS(wxSpinEvent, wxScrollEvent)
+ vEvent.SetPosition(nVal);
+ vEvent.SetEventObject(this);
+ return(GetEventHandler()->ProcessEvent(vEvent));
+} // end of wxSpinButton::OS2OnScroll
-wxSpinEvent::wxSpinEvent(wxEventType commandType, int id):
- wxScrollEvent(commandType, id)
+bool wxSpinButton::OS2Command( WXUINT WXUNUSED(uCmd),
+ WXWORD WXUNUSED(wId) )
+{
+ return false;
+} // end of wxSpinButton::OS2Command
+
+void wxSpinButton::SetRange(
+ int nMinVal
+, int nMaxVal
+)
+{
+ m_min = nMinVal;
+ m_max = nMaxVal;
+
+ ::WinSendMsg( GetHwnd()
+ ,SPBM_SETLIMITS
+ ,MPFROMLONG(nMaxVal)
+ ,MPFROMLONG(nMinVal)
+ );
+} // end of wxSpinButton::SetRange
+
+void wxSpinButton::SetValue(
+ int nValue
+)
{
-}
+ ::WinSendMsg(GetHwnd(), SPBM_SETCURRENTVALUE, MPFROMLONG(nValue), MPARAM(0));
+} // end of wxSpinButton::SetValue
+#endif //wxUSE_SPINBTN