]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/scrolbar.cpp
Some change logs
[wxWidgets.git] / src / os2 / scrolbar.cpp
index 54df1811666b81aea8a5c83c27507e8fd2250ee8..8837a464042ae9c8a4e9e944a1230db4d45b2a1c 100644 (file)
 /////////////////////////////////////////////////////////////////////////////
 // Name:        scrolbar.cpp
 // Purpose:     wxScrollBar
 /////////////////////////////////////////////////////////////////////////////
 // Name:        scrolbar.cpp
 // Purpose:     wxScrollBar
-// Author:      AUTHOR
+// Author:      David Webster
 // Modified by:
 // Modified by:
-// Created:     ??/??/98
+// Created:     10/15/99
 // RCS-ID:      $Id$
 // 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"
 #endif
 
 #include "wx/scrolbar.h"
+#include "wx/os2/private.h"
 
 
-#if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxScrollBar, wxControl)
 
 IMPLEMENT_DYNAMIC_CLASS(wxScrollBar, wxControl)
 
-#endif
-
 // Scrollbar
 // 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;
         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
     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;
     return TRUE;
-}
+} // end of wxScrollBar::Create
 
 wxScrollBar::~wxScrollBar()
 {
 }
 
 
 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
 {
 
 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.GetInt());
+    ProcessCommand(rEvent);
+} // end of wxScrollBar::Command