]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/scrolwin.h
Add wxDataViewRendererBase::GetEffectiveAlignment() and use it.
[wxWidgets.git] / include / wx / scrolwin.h
index 89f0953362cf24bb85a3691d81a373a6b7f74ea7..d270554f8e3138ee8434fc38eaeae41492cd29e0 100644 (file)
@@ -4,7 +4,6 @@
 // Author:      Vadim Zeitlin
 // Modified by:
 // Created:     30.08.00
-// RCS-ID:      $Id$
 // Copyright:   (c) 2000 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
@@ -37,6 +36,10 @@ enum wxScrollbarVisibility
 //
 // So we have
 //
+//                          wxAnyScrollHelperBase
+//                                   |
+//                                   |
+//                                  \|/
 //                           wxScrollHelperBase
 //                                   |
 //                                   |
@@ -56,7 +59,50 @@ enum wxScrollbarVisibility
 //
 // ----------------------------------------------------------------------------
 
-class WXDLLIMPEXP_CORE wxScrollHelperBase
+// This class allows reusing some of wxScrollHelperBase functionality in
+// wxVarScrollHelperBase in wx/vscroll.h without duplicating its code.
+class WXDLLIMPEXP_CORE wxAnyScrollHelperBase
+{
+public:
+    wxEXPLICIT wxAnyScrollHelperBase(wxWindow* win);
+
+    // Disable use of keyboard keys for scrolling. By default cursor movement
+    // keys (including Home, End, Page Up and Down) are used to scroll the
+    // window appropriately. If the derived class uses these keys for something
+    // else, e.g. changing the currently selected item, this function can be
+    // used to disable this behaviour as it's not only not necessary then but
+    // can actually be actively harmful if another object forwards a keyboard
+    // event corresponding to one of the above keys to us using
+    // ProcessWindowEvent() because the event will always be processed which
+    // can be undesirable.
+    void DisableKeyboardScrolling() { m_kbdScrollingEnabled = false; }
+
+    // Override this function to draw the graphic (or just process EVT_PAINT)
+    virtual void OnDraw(wxDC& WXUNUSED(dc)) { }
+
+    // change the DC origin according to the scroll position.
+    virtual void DoPrepareDC(wxDC& dc) = 0;
+
+    // Simple accessor for the window that is really being scrolled.
+    wxWindow *GetTargetWindow() const { return m_targetWindow; }
+
+
+    // The methods called from the window event handlers.
+    void HandleOnChar(wxKeyEvent& event);
+    void HandleOnPaint(wxPaintEvent& event);
+
+protected:
+    // the window that receives the scroll events and the window to actually
+    // scroll, respectively
+    wxWindow *m_win,
+             *m_targetWindow;
+
+    // whether cursor keys should scroll the window
+    bool m_kbdScrollingEnabled;
+};
+
+// This is the class containing the guts of (uniform) scrolling logic.
+class WXDLLIMPEXP_CORE wxScrollHelperBase : public wxAnyScrollHelperBase
 {
 public:
     // ctor must be given the associated window
@@ -101,24 +147,20 @@ public:
         DoShowScrollbars(horz, vert);
     }
 
+    // Test whether the specified scrollbar is shown.
+    virtual bool IsScrollbarShown(int orient) const = 0;
+
     // Enable/disable Windows scrolling in either direction. If true, wxWidgets
     // scrolls the canvas and only a bit of the canvas is invalidated; no
     // Clear() is necessary. If false, the whole canvas is invalidated and a
     // Clear() is necessary. Disable for when the scroll increment is used to
     // actually scroll a non-constant distance
+    //
+    // Notice that calling this method with a false argument doesn't disable
+    // scrolling the window in this direction, it just changes the mechanism by
+    // which it is implemented to not use wxWindow::ScrollWindow().
     virtual void EnableScrolling(bool x_scrolling, bool y_scrolling);
 
-    // Disable use of keyboard keys for scrolling. By default cursor movement
-    // keys (including Home, End, Page Up and Down) are used to scroll the
-    // window appropriately. If the derived class uses these keys for something
-    // else, e.g. changing the currently selected item, this function can be
-    // used to disable this behaviour as it's not only not necessary then but
-    // can actually be actively harmful if another object forwards a keyboard
-    // event corresponding to one of the above keys to us using
-    // ProcessWindowEvent() because the event will always be processed which
-    // can be undesirable.
-    void DisableKeyboardScrolling() { m_kbdScrollingEnabled = false; }
-
     // Get the view start
     void GetViewStart(int *x, int *y) const { DoGetViewStart(x, y); }
 
@@ -167,15 +209,10 @@ public:
     // child of it in order to scroll only a portion the area between the
     // scrollbars (spreadsheet: only cell area will move).
     void SetTargetWindow(wxWindow *target);
-    wxWindow *GetTargetWindow() const;
 
     void SetTargetRect(const wxRect& rect) { m_rectToScroll = rect; }
     wxRect GetTargetRect() const { return m_rectToScroll; }
 
-    // Override this function to draw the graphic (or just process EVT_PAINT)
-    virtual void OnDraw(wxDC& WXUNUSED(dc)) { }
-
-    // change the DC origin according to the scroll position.
     virtual void DoPrepareDC(wxDC& dc);
 
     // are we generating the autoscroll events?
@@ -195,8 +232,6 @@ public:
     // the methods to be called from the window event handlers
     void HandleOnScroll(wxScrollWinEvent& event);
     void HandleOnSize(wxSizeEvent& event);
-    void HandleOnPaint(wxPaintEvent& event);
-    void HandleOnChar(wxKeyEvent& event);
     void HandleOnMouseEnter(wxMouseEvent& event);
     void HandleOnMouseLeave(wxMouseEvent& event);
 #if wxUSE_MOUSEWHEEL
@@ -272,13 +307,14 @@ protected:
     double                m_scaleX;
     double                m_scaleY;
 
-    wxWindow             *m_win,
-                         *m_targetWindow;
-
     wxRect                m_rectToScroll;
 
     wxTimer              *m_timerAutoScroll;
 
+    // The number of pixels to scroll in horizontal and vertical directions
+    // respectively.
+    //
+    // If 0, means that the scrolling in the given direction is disabled.
     int                   m_xScrollPixelsPerLine;
     int                   m_yScrollPixelsPerLine;
     int                   m_xScrollPosition;
@@ -291,8 +327,6 @@ protected:
     bool                  m_xScrollingEnabled;
     bool                  m_yScrollingEnabled;
 
-    bool                  m_kbdScrollingEnabled;
-
 #if wxUSE_MOUSEWHEEL
     int m_wheelRotation;
 #endif // wxUSE_MOUSEWHEEL
@@ -308,6 +342,8 @@ protected:
 public:                                                                       \
     virtual void PrepareDC(wxDC& dc) { DoPrepareDC(dc); }                     \
     virtual bool Layout() { return ScrollLayout(); }                          \
+    virtual bool CanScroll(int orient) const                                  \
+        { return IsScrollbarShown(orient); }                                  \
     virtual void DoSetVirtualSize(int x, int y)                               \
         { ScrollDoSetVirtualSize(x, y); }                                     \
     virtual wxSize GetBestVirtualSize() const                                 \
@@ -391,13 +427,19 @@ public:
 #endif
     }
 
+#ifdef __WXMSW__
     // we need to return a special WM_GETDLGCODE value to process just the
     // arrows but let the other navigation characters through
-#ifdef __WXMSW__
     virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
     {
         return FilterMSWWindowProc(nMsg, T::MSWWindowProc(nMsg, wParam, lParam));
     }
+
+    // Take into account the scroll origin.
+    virtual void MSWAdjustBrushOrg(int* xOrg, int* yOrg) const
+    {
+        CalcUnscrolledPosition(*xOrg, *yOrg, xOrg, yOrg);
+    }
 #endif // __WXMSW__
 
     WX_FORWARD_TO_SCROLL_HELPER()