X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0e320a79f187558effb04d92020b470372bbe456..e1983ab58804a0e32ab2d832ded0349af1cc0476:/src/os2/scrolbar.cpp diff --git a/src/os2/scrolbar.cpp b/src/os2/scrolbar.cpp index 54df181166..8b88e4078c 100644 --- a/src/os2/scrolbar.cpp +++ b/src/os2/scrolbar.cpp @@ -1,78 +1,313 @@ ///////////////////////////////////////////////////////////////////////////// // Name: scrolbar.cpp // Purpose: wxScrollBar -// 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 "scrolbar.h" +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifndef WX_PRECOMP +#include "wx/defs.h" +#include "wx/utils.h" #endif #include "wx/scrolbar.h" +#include "wx/os2/private.h" -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxScrollBar, wxControl) -#endif - // Scrollbar -bool wxScrollBar::Create(wxWindow *parent, wxWindowID id, - const wxPoint& pos, - const wxSize& size, long style, - const wxValidator& validator, - const wxString& name) +bool wxScrollBar::Create ( + wxWindow* pParent +, wxWindowID vId +, const wxPoint& rPos +, const wxSize& rSize +, long lStyle +#if wxUSE_VALIDATORS +, const wxValidator& rValidator +#endif +, const wxString& rsName +) { - if (!parent) + int nX = rPos.x; + int nY = rPos.y; + int nWidth = rSize.x; + int nHeight = rSize.y; + + if (!pParent) return FALSE; - parent->AddChild(this); - SetName(name); - SetValidator(validator); - - m_windowStyle = style; - - if ( id == -1 ) - m_windowId = (int)NewControlId(); + pParent->AddChild(this); + SetName(rsName); +#if wxUSE_VALIDATORS + SetValidator(rValidator); +#endif + SetBackgroundColour(pParent->GetBackgroundColour()) ; + SetForegroundColour(pParent->GetForegroundColour()) ; + + if (vId == -1L) + m_windowId = (int)NewControlId(); else - m_windowId = id; + m_windowId = vId; + + if (nWidth == -1) + { + if (lStyle & wxHORIZONTAL) + nWidth = 140; + else + nWidth = 14; + } + if (nHeight == -1) + { + if (lStyle & wxVERTICAL) + nHeight = 140; + else + nHeight = 14; + } + + DWORD dwStyle = WS_VISIBLE; + + if (GetWindowStyleFlag() & wxCLIP_SIBLINGS) + dwStyle |= WS_CLIPSIBLINGS; + + DWORD dwDirection = (lStyle & wxHORIZONTAL) ? SBS_HORZ: SBS_VERT; + + HWND hScrollBar = ::WinCreateWindow( (HWND)GetHwndOf(pParent) + ,WC_SCROLLBAR + ,(PSZ)NULL + ,dwDirection | dwStyle + ,0, 0, 0, 0 + ,(HWND)GetHwndOf(pParent) + ,HWND_TOP + ,(HMENU)m_windowId + ,NULL + ,NULL + ); - // TODO create scrollbar + m_nPageSize = 1; + m_nViewSize = 1; + m_nObjectSize = 1; + ::WinSendMsg( hScrollBar + ,SBM_SETSCROLLBAR + ,(MPARAM)0 + ,MPFROM2SHORT(0,1) + ); + ::WinShowWindow( hScrollBar + ,TRUE + ); + SetFont(*wxSMALL_FONT); + + m_hWnd = hScrollBar; + + // + // Subclass again for purposes of dialog editing mode + // + SubclassWin((WXHWND)hScrollBar); + SetSize( nX + ,nY + ,nWidth + ,nHeight + ); return TRUE; -} +} // end of wxScrollBar::Create wxScrollBar::~wxScrollBar() { } -void wxScrollBar::SetThumbPosition(int viewStart) +bool wxScrollBar::OS2OnScroll ( + int nOrientation +, WXWORD wParam +, WXWORD wPos +, WXHWND hControl +) { - // TODO -} + int nPosition; + int nMaxPos; + int nTrackPos = wPos; + int nMinPos; + int nScrollInc; + wxEventType vScrollEvent = wxEVT_NULL; + + MRESULT vRange; + + // + // When we're dragging the scrollbar we can't use pos parameter because it + // is limited to 16 bits + // + if (wParam == SB_SLIDERPOSITION || wParam == SB_SLIDERTRACK) + { + SBCDATA vScrollInfo; + + vScrollInfo.sHilite = SB_SLIDERTRACK; + + ::WinSendMsg((HWND)GetHwnd(), WM_QUERYWINDOWPARAMS, (PVOID)&vScrollInfo, NULL); + + nTrackPos = vScrollInfo.posThumb; + nPosition = vScrollInfo.posFirst; + nMaxPos = vScrollInfo.posLast; + } + else + { + nPosition = (int)(MRESULT)::WinSendMsg((HWND)GetHwnd(), SBM_QUERYPOS, (MPARAM)NULL, (MPARAM)NULL); + vRange = ::WinSendMsg((HWND)GetHwnd(), SBM_QUERYRANGE, (MPARAM)NULL, (MPARAM)NULL); + nMinPos = SHORT1FROMMR(vRange); + nMaxPos = SHORT2FROMMR(vRange); + } + // + // A page size greater than one has the effect of reducing the effective + // range, therefore the range has already been boosted artificially - so + // reduce it again. + // + if (m_nPageSize > 1) + nMaxPos -= (m_nPageSize - 1); + switch (wParam) + { + case SB_LINEUP: + nScrollInc = -1; + vScrollEvent = wxEVT_SCROLL_LINEUP; + break; + + case SB_LINEDOWN: + nScrollInc = 1; + vScrollEvent = wxEVT_SCROLL_LINEDOWN; + break; + + case SB_PAGEUP: + nScrollInc = -GetPageSize(); + vScrollEvent = wxEVT_SCROLL_PAGEUP; + break; + + case SB_PAGEDOWN: + nScrollInc = GetPageSize(); + vScrollEvent = wxEVT_SCROLL_PAGEDOWN; + break; + + case SB_SLIDERTRACK: + nScrollInc = nTrackPos - nPosition; + vScrollEvent = wxEVT_SCROLL_THUMBTRACK; + break; + + case SB_ENDSCROLL: + nScrollInc = 0; + vScrollEvent = wxEVT_SCROLL_ENDSCROLL; + break; + + default: + nScrollInc = 0; + } + if (nScrollInc) + { + nPosition += nScrollInc; + + if (nPosition < 0) + nPosition = 0; + if (nPosition > nMaxPos) + nPosition = nMaxPos; + SetThumbPosition(nPosition); + } + else if ( vScrollEvent != wxEVT_SCROLL_THUMBRELEASE && + vScrollEvent != wxEVT_SCROLL_ENDSCROLL + ) + { + // + // Don't process the event if there is no displacement, + // unless this is a thumb release or end scroll event. + // + return FALSE; + } + + wxScrollEvent vEvent( vScrollEvent + ,m_windowId + ); + + vEvent.SetOrientation(IsVertical() ? wxVERTICAL : wxHORIZONTAL); + vEvent.SetPosition(nPosition); + vEvent.SetEventObject(this); + return GetEventHandler()->ProcessEvent(vEvent); +} // end of wxScrollBar::OS2OnScroll + +void wxScrollBar::SetThumbPosition ( + int nViewStart +) +{ + SBCDATA vInfo; + + memset(&vInfo, '\0', sizeof(SBCDATA)); + vInfo.cb = sizeof(SBCDATA); + vInfo.posThumb = nViewStart; + + ::WinSendMsg((HWND)GetHwnd(), WM_SETWINDOWPARAMS, (MPARAM)&vInfo, (MPARAM)NULL); + ::WinSendMsg((HWND)GetHwnd(), SBM_SETPOS, (MPARAM)nViewStart, (MPARAM)NULL); +} // end of wxScrollBar::SetThumbPosition int wxScrollBar::GetThumbPosition() const { - // TODO - return 0; -} + return((int)(MRESULT)::WinSendMsg((HWND)GetHwnd(), SBM_QUERYPOS, (MPARAM)NULL, (MPARAM)NULL)); +} // end of wxScrollBar::GetThumbPosition -void wxScrollBar::SetScrollbar(int position, int thumbSize, int range, int pageSize, - bool refresh) +void wxScrollBar::SetScrollbar ( + int nPosition +, int nThumbSize +, int nRange +, int nPageSize +, bool bRefresh +) { - m_viewSize = pageSize; - m_pageSize = thumbSize; - m_objectSize = range; + SBCDATA vInfo; + // + // The lRange (number of scroll steps) is the + // object length minus the page size. + // + int nRange1 = wxMax((m_nObjectSize - m_nPageSize), 0); + + m_nViewSize = nPageSize; + m_nPageSize = nThumbSize; + m_nObjectSize = nRange; - // TODO -} + // + // Try to adjust the lRange to cope with page size > 1 + // (see comment for SetPageLength) + // + if (m_nPageSize > 1 ) + { + nRange1 += (m_nPageSize - 1); + } + vInfo.cb = sizeof(SBCDATA); + vInfo.cVisible = m_nPageSize; + vInfo.posFirst = 0; + vInfo.posLast = nRange1; + vInfo.posThumb = nPosition; -void wxScrollBar::Command(wxCommandEvent& event) + ::WinSendMsg((HWND)GetHwnd(), WM_SETWINDOWPARAMS, (MPARAM)&vInfo, (MPARAM)NULL); +} // end of wxScrollBar::SetScrollbar + +WXHBRUSH wxScrollBar::OnCtlColor ( + WXHDC hDC +, WXHWND hWnd +, WXUINT uCtlColor +, WXUINT uMessage +, WXWPARAM wParam +, WXLPARAM lParam +) { - SetThumbPosition(event.m_commandInt); - ProcessCommand(event); -} + // + // Does nothing under OS/2 + // + return 0; +} // end of wxScrollBar::OnCtlColor + +void wxScrollBar::Command ( + wxCommandEvent& rEvent +) +{ + SetThumbPosition(rEvent.m_commandInt); + ProcessCommand(rEvent); +} // end of wxScrollBar::Command