X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0e320a79f187558effb04d92020b470372bbe456..08202189cbf2f78d932f85b9733b69e24f08e58c:/src/os2/gauge.cpp diff --git a/src/os2/gauge.cpp b/src/os2/gauge.cpp index a85fbc498f..9c95081918 100644 --- a/src/os2/gauge.cpp +++ b/src/os2/gauge.cpp @@ -1,95 +1,300 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: gauge.cpp +// Name: src/os2/gauge.cpp // Purpose: wxGauge class -// Author: AUTHOR +// Author: David Webster // Modified by: -// Created: ??/??/98 +// Created: 10/06/99 // RCS-ID: $Id$ -// Copyright: (c) AUTHOR -// Licence: wxWindows licence +// 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 + ); + +IMPLEMENT_DYNAMIC_CLASS(wxGauge, wxGaugeBase) + +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; + + 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"))); - if (parent) parent->AddChild(this); + 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 + // + + 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 + ); -void wxGauge::SetSize(int x, int y, int width, int height, int sizeFlags) + 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