]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/gauge.cpp
Fix another crash when conversion fails in Unix PostScript code.
[wxWidgets.git] / src / os2 / gauge.cpp
index a85fbc498ffacbc22cc601acc40b6835be0ffb0a..b007f8b359f9e4a525779e0745006a22932a33e8 100644 (file)
 /////////////////////////////////////////////////////////////////////////////
-// Name:        gauge.cpp
+// Name:        src/os2/gauge.cpp
 // Purpose:     wxGauge class
-// Author:      AUTHOR
+// Author:      David Webster
 // Modified by:
-// Created:     ??/??/98
-// RCS-ID:      $Id$
-// Copyright:   (c) AUTHOR
-// Licence:    wxWindows licence
+// Created:     10/06/99
+// Copyright:   (c) David Webster
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-#pragma implementation "gauge.h"
-#endif
+#include "wx/wxprec.h"
+
+#if wxUSE_GAUGE
 
 #include "wx/gauge.h"
 
-#if !USE_SHARED_LIBRARY
-IMPLEMENT_DYNAMIC_CLASS(wxGauge, wxControl)
+#ifndef WX_PRECOMP
+    #include "wx/utils.h"
+    #include "wx/scrolwin.h"
 #endif
 
-bool wxGauge::Create(wxWindow *parent, wxWindowID id,
-           int range,
-           const wxPoint& pos,
-           const wxSize& size,
-           long style,
-           const wxValidator& validator,
-           const wxString& name)
+#include "wx/os2/private.h"
+
+static WXFARPROC fnWndProcGauge = (WXFARPROC)NULL;
+extern void  wxAssociateWinWithHandle( HWND         hWnd
+                                      ,wxWindowOS2* pWin
+                                     );
+
+MRESULT EXPENTRY wxGaugeWndProc( HWND hWnd,
+                                 UINT uMessage,
+                                 MPARAM wParam,
+                                 MPARAM lParam )
+{
+    wxGauge*                        pGauge = (wxGauge *)::WinQueryWindowULong( hWnd
+                                                                              ,QWL_USER
+                                                                             );
+    HPS hPS;
+    RECTL vRect;
+    RECTL vRect2;
+    RECTL vRect3;
+    double dPixelToRange = 0.0;
+    double dRange = 0.0;
+
+    switch (uMessage )
+    {
+        case WM_PAINT:
+            hPS = ::WinBeginPaint( hWnd
+                                  ,NULLHANDLE
+                                  ,&vRect
+                                 );
+            if(hPS)
+            {
+                ::WinQueryWindowRect(hWnd, &vRect);
+                ::GpiCreateLogColorTable( hPS
+                                         ,0L
+                                         ,LCOLF_CONSECRGB
+                                         ,0L
+                                         ,(LONG)wxTheColourDatabase->m_nSize
+                                         ,(PLONG)wxTheColourDatabase->m_palTable
+                                        );
+                ::GpiCreateLogColorTable( hPS
+                                         ,0L
+                                         ,LCOLF_RGB
+                                         ,0L
+                                         ,0L
+                                         ,NULL
+                                        );
+                //
+                // Draw the guage box
+                //
+                LONG                lColor = 0x00FFFFFF; // White
+                POINTL              vPoint = {vRect.xLeft + 1, vRect.yBottom + 1};
+
+                ::GpiSetColor(hPS, lColor);
+                ::GpiMove(hPS, &vPoint);
+                vPoint.x = vRect.xRight - 1;
+                ::GpiLine(hPS, &vPoint);
+                vPoint.y = vRect.yTop - 1;
+                ::GpiLine(hPS, &vPoint);
+                lColor = 0x000C0C0C; // Darkish Grey to give depth feel
+                ::GpiSetColor(hPS, lColor);
+                vPoint.x = vRect.xLeft + 1;
+                ::GpiLine(hPS, &vPoint);
+                vPoint.y = vRect.yBottom + 1;
+                ::GpiLine(hPS, &vPoint);
+                vRect3.xLeft   = vRect.xLeft + 2;
+                vRect3.xRight  = vRect.xRight - 2;
+                vRect3.yTop    = vRect.yTop - 2;
+                vRect3.yBottom = vRect.yBottom + 2;
+
+                if (pGauge->GetWindowStyleFlag() & wxGA_VERTICAL)
+                {
+                    dRange = (double)(vRect3.yTop - vRect3.yBottom);
+                    dPixelToRange  = dRange/(double)pGauge->GetRange();
+                    vRect2.yTop    = (int)(pGauge->GetValue() * dPixelToRange);
+                    vRect2.yBottom = vRect3.yBottom;
+                    vRect2.xLeft   = vRect3.xLeft;
+                    vRect2.xRight  = vRect3.xRight;
+                    vRect3.yBottom  = vRect2.yTop;
+                    if (vRect3.yBottom <= 1)
+                         vRect3.yBottom = 2;
+                    ::WinFillRect(hPS, &vRect3,  pGauge->GetBackgroundColour().GetPixel());
+                    ::WinFillRect(hPS, &vRect2, pGauge->GetForegroundColour().GetPixel());
+                }
+                else
+                {
+                    dRange = (double)(vRect3.xRight - vRect3.xLeft);
+                    dPixelToRange  = dRange/(double)pGauge->GetRange();
+                    vRect2.yTop    = vRect3.yTop;
+                    vRect2.yBottom = vRect3.yBottom;
+                    vRect2.xLeft   = vRect3.xLeft;
+                    vRect2.xRight  = (int)(pGauge->GetValue() * dPixelToRange);
+                    vRect3.xLeft = vRect2.xRight;
+                    if (vRect3.xLeft <= 1)
+                        vRect3.xLeft = 2;
+                    ::WinFillRect(hPS, &vRect3,  pGauge->GetBackgroundColour().GetPixel());
+                    ::WinFillRect(hPS, &vRect2, pGauge->GetForegroundColour().GetPixel());
+                }
+                ::WinEndPaint(hPS);
+            }
+    }
+    return (fnWndProcGauge( hWnd
+                           ,(ULONG)uMessage
+                           ,(MPARAM)wParam
+                           ,(MPARAM)lParam
+                          )
+           );
+} // end of wxGaugeWndProc
+
+bool wxGauge::Create( wxWindowOS2* pParent,
+                      wxWindowID vId,
+                      int nRange,
+                      const wxPoint& rPos,
+                      const wxSize& rSize,
+                      long lStyle,
+                      const wxValidator& rValidator,
+                      const wxString& rsName )
 {
-    SetName(name);
-    SetValidator(validator);
-    m_rangeMax = range;
-    m_windowStyle = style;
+    int nX       = rPos.x;
+    int nY       = rPos.y;
+    int nWidth   = rSize.x;
+    int nHeight  = rSize.y;
+    long lMsStyle = 0L;
+    SWP vSwp;
 
-    if (parent) parent->AddChild(this);
+    SetName(rsName);
+#if wxUSE_VALIDATORS
+    SetValidator(rValidator);
+#endif
+    if (pParent)
+        pParent->AddChild(this);
+    m_backgroundColour.Set(wxString(wxT("LIGHT GREY")));
+    m_foregroundColour.Set(wxString(wxT("NAVY")));
+
+    m_nRangeMax   = nRange;
+    m_nGaugePos   = 0;
+    m_windowStyle = lStyle;
 
-    if ( id == -1 )
-           m_windowId = (int)NewControlId();
+    if (vId == wxID_ANY)
+        m_windowId = (int)NewControlId();
     else
-           m_windowId = id;
+        m_windowId = vId;
 
+    if (m_windowStyle & wxCLIP_SIBLINGS )
+        lMsStyle |= WS_CLIPSIBLINGS;
 
-    // TODO
-    return FALSE;
-}
+    //
+    // OS/2 will use an edit control for this, since there is not a native gauge
+    // Other choices include using an armless slider but they are more difficult
+    // to control and manipulate
+    //
 
-void wxGauge::SetSize(int x, int y, int width, int height, int sizeFlags)
+    lMsStyle = WS_VISIBLE | ES_MARGIN | ES_LEFT | ES_READONLY;
+    if (m_windowStyle & wxCLIP_SIBLINGS)
+        lMsStyle |= WS_CLIPSIBLINGS;
+
+    m_hWnd = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle
+                                       ,WC_ENTRYFIELD            // Window class
+                                       ,(PSZ)NULL                // Initial Text
+                                       ,(ULONG)lMsStyle          // Style flags
+                                       ,0L, 0L, 0L, 0L           // Origin -- 0 size
+                                       ,(HWND)GetHwndOf(pParent) // owner window handle (same as parent
+                                       ,HWND_TOP                 // initial z position
+                                       ,(HMENU)m_windowId        // Window identifier
+                                       ,NULL                     // Slider control data
+                                       ,NULL                     // no Presentation parameters
+                                      );
+
+    wxAssociateWinWithHandle( m_hWnd
+                             ,(wxWindowOS2*)this
+                            );
+    ::WinSetWindowULong(GetHwnd(), QWL_USER, (LONG)this);
+    fnWndProcGauge = (WXFARPROC)::WinSubclassWindow(m_hWnd, (PFNWP)wxGaugeWndProc);
+    ::WinQueryWindowPos(m_hWnd, &vSwp);
+    SetXComp(vSwp.x);
+    SetYComp(vSwp.y);
+    wxFont*                          pTextFont = new wxFont( 10
+                                                            ,wxMODERN
+                                                            ,wxNORMAL
+                                                            ,wxNORMAL
+                                                           );
+    SetFont(*pTextFont);
+    if (nWidth == -1L)
+        nWidth = 50L;
+    if (nHeight == -1L)
+        nHeight = 28L;
+    SetSize( nX
+            ,nY
+            ,nWidth
+            ,nHeight
+           );
+    m_nWidth  = nWidth;     // Save for GetBestSize
+    m_nHeight = nHeight;
+    ::WinShowWindow((HWND)GetHWND(), TRUE);
+    delete pTextFont;
+    return true;
+} // end of wxGauge::Create
+
+int wxGauge::GetBezelFace() const
 {
-    // TODO
-}
+    return 0;
+} // end of wxGauge::GetBezelFace
 
-void wxGauge::SetShadowWidth(int w)
+int wxGauge::GetRange() const
 {
-    // TODO optional
-}
+    return m_nRangeMax;
+} // end of wxGauge::GetRange
 
-void wxGauge::SetBezelFace(int w)
+int wxGauge::GetShadowWidth() const
 {
-    // TODO optional
-}
+    return 0;
+} // end of wxGauge::GetShadowWidth
 
-void wxGauge::SetRange(int r)
+int wxGauge::GetValue() const
 {
-    m_rangeMax = r;
-    // TODO
-}
+    return m_nGaugePos;
+} // end of wxGauge::GetValue
 
-void wxGauge::SetValue(int pos)
+bool wxGauge::SetBackgroundColour( const wxColour& rColour )
 {
-    m_gaugePos = pos;
-    // TODO
-}
+    if (!wxControl::SetBackgroundColour(rColour))
+        return false;
 
-int wxGauge::GetShadowWidth() const
+    LONG                            lColor = (LONG)rColour.GetPixel();
+
+    ::WinSetPresParam( GetHwnd()
+                      ,PP_BACKGROUNDCOLOR
+                      ,sizeof(LONG)
+                      ,(PVOID)&lColor
+                     );
+    return true;
+} // end of wxGauge::SetBackgroundColour
+
+void wxGauge::SetBezelFace( int WXUNUSED(nWidth) )
 {
-    // TODO optional
-    return 0;
-}
+} // end of wxGauge::SetBezelFace
 
-int wxGauge::GetBezelFace() const
+bool wxGauge::SetForegroundColour( const wxColour& rColour )
 {
-    // TODO optional
-    return 0;
-}
+    if (!wxControl::SetForegroundColour(rColour))
+        return false;
 
-int wxGauge::GetRange() const
+    LONG lColor = (LONG)rColour.GetPixel();
+
+    ::WinSetPresParam( GetHwnd()
+                      ,PP_FOREGROUNDCOLOR
+                      ,sizeof(LONG)
+                      ,(PVOID)&lColor
+                     );
+
+    return true;
+} // end of wxGauge::SetForegroundColour
+
+void wxGauge::SetRange( int nRange )
 {
-    return m_rangeMax;
-}
+    m_nRangeMax = nRange;
+} // end of wxGauge::SetRange
 
-int wxGauge::GetValue() const
+void wxGauge::SetShadowWidth( int WXUNUSED(nWidth) )
+{
+} // end of wxGauge::SetShadowWidth
+
+void wxGauge::SetValue( int nPos )
+{
+    RECT vRect;
+
+    m_nGaugePos = nPos;
+    ::WinQueryWindowRect(GetHwnd(), &vRect);
+    ::WinInvalidateRect(GetHwnd(), &vRect, FALSE);
+} // end of wxGauge::SetValue
+
+wxSize wxGauge::DoGetBestSize() const
 {
-    return m_gaugePos;
+    return wxSize(m_nWidth,m_nHeight);
 }
 
+#endif // wxUSE_GAUGE