]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/scrolwin.h
add const synonyms for wxGridTableBase::GetNumberRows/Cols(), using const_cast<>...
[wxWidgets.git] / include / wx / scrolwin.h
index 0215586e952b3bba7439ac74820fc6c2c5225ac9..860c65d559bc0f81d9c964dbdc98187fecfe6736 100644 (file)
@@ -204,6 +204,21 @@ protected:
     // delete the event handler we installed
     void DeleteEvtHandler();
 
+    // calls wxScrollHelperEvtHandler::ResetDrawnFlag(), see explanation
+    // in wxScrollHelperEvtHandler::ProcessEvent()
+    void ResetDrawnFlag();
+
+    // helper of AdjustScrollbars(): does the work for the single scrollbar
+    //
+    // notice that the parameters passed by non-const references are modified
+    // by this function
+    void AdjustScrollbar(int orient,
+                         int clientSize,
+                         int virtSize,
+                         int& pixelsPerUnit,
+                         int& scrollUnits,
+                         int& scrollPosition);
+
 
     double                m_scaleX;
     double                m_scaleY;
@@ -233,6 +248,19 @@ protected:
 
     wxScrollHelperEvtHandler *m_handler;
 
+private:
+    // this function should be overridden to return the size available for
+    // m_targetWindow inside m_win of the given size
+    //
+    // the default implementation is only good for m_targetWindow == m_win
+    // case, if we're scrolling a subwindow you must override this method
+    virtual wxSize GetSizeAvailableForScrollTarget(const wxSize& size)
+    {
+        wxASSERT_MSG( m_targetWindow == m_win, "must be overridden" );
+
+        return size;
+    }
+
     DECLARE_NO_COPY_CLASS(wxScrollHelper)
 };
 
@@ -257,53 +285,125 @@ public:                                                                       \
 #endif
 
 // ----------------------------------------------------------------------------
-// wxScrolledWindow: a wxWindow which knows how to scroll
+// wxScrolled<T>: a wxWindow which knows how to scroll
 // ----------------------------------------------------------------------------
 
-class WXDLLIMPEXP_CORE wxScrolledWindow : public wxPanel,
-                                     public wxScrollHelperNative
+// helper class for wxScrolled<T> below
+struct WXDLLIMPEXP_CORE wxScrolledT_Helper
+{
+    static wxSize FilterBestSize(const wxWindow *win,
+                                 const wxScrollHelperNative *helper,
+                                 const wxSize& origBest);
+#ifdef __WXMSW__
+    static WXLRESULT FilterMSWWindowProc(WXUINT nMsg, WXLRESULT origResult);
+#endif
+};
+
+// Scrollable window base on window type T. This used to be wxScrolledWindow,
+// but wxScrolledWindow includes wxControlContainer functionality and that's
+// not always desirable.
+template<class T>
+class WXDLLIMPEXP_CORE wxScrolled : public T,
+                                    public wxScrollHelperNative,
+                                    private wxScrolledT_Helper
 {
 public:
-    wxScrolledWindow() : wxScrollHelperNative(this) { }
-    wxScrolledWindow(wxWindow *parent,
-                     wxWindowID winid = wxID_ANY,
-                     const wxPoint& pos = wxDefaultPosition,
-                     const wxSize& size = wxDefaultSize,
-                     long style = wxScrolledWindowStyle,
-                     const wxString& name = wxPanelNameStr)
+    wxScrolled() : wxScrollHelperNative(this) { }
+    wxScrolled(wxWindow *parent,
+               wxWindowID winid = wxID_ANY,
+               const wxPoint& pos = wxDefaultPosition,
+               const wxSize& size = wxDefaultSize,
+               long style = wxScrolledWindowStyle,
+               const wxString& name = wxPanelNameStr)
         : wxScrollHelperNative(this)
     {
         Create(parent, winid, pos, size, style, name);
     }
 
-    virtual ~wxScrolledWindow();
-
     bool Create(wxWindow *parent,
                 wxWindowID winid,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = wxScrolledWindowStyle,
-                const wxString& name = wxPanelNameStr);
+                const wxString& name = wxPanelNameStr)
+    {
+        m_targetWindow = this;
+
+#ifdef __WXMAC__
+        this->MacSetClipChildren(true);
+#endif
+
+        this->Connect(wxEVT_PAINT, wxPaintEventHandler(wxScrolled::OnPaint));
+
+        // by default, we're scrollable in both directions (but if one of the
+        // styles is specified explicitly, we shouldn't add the other one
+        // automatically)
+        if ( !(style & (wxHSCROLL | wxVSCROLL)) )
+            style |= wxHSCROLL | wxVSCROLL;
+
+        return T::Create(parent, winid, pos, size, style, name);
+    }
 
     // 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);
+    virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
+    {
+        return FilterMSWWindowProc(nMsg, T::MSWWindowProc(nMsg, wParam, lParam));
+    }
 #endif // __WXMSW__
 
     WX_FORWARD_TO_SCROLL_HELPER()
 
 protected:
-    virtual wxSize DoGetBestSize() const;
+    virtual wxSize DoGetBestSize() const
+    {
+        return FilterBestSize(this, this, T::DoGetBestSize());
+    }
 
+private:
     // this is needed for wxEVT_PAINT processing hack described in
     // wxScrollHelperEvtHandler::ProcessEvent()
-    void OnPaint(wxPaintEvent& event);
+    void OnPaint(wxPaintEvent& event)
+    {
+        // the user code didn't really draw the window if we got here, so set
+        // this flag to try to call OnDraw() later
+        ResetDrawnFlag();
+        event.Skip();
+    }
+
+    // VC++ 6 gives warning for the declaration of template member function
+    // without definition
+#if !defined(__VISUALC__) || wxCHECK_VISUALC_VERSION(7)
+    DECLARE_NO_COPY_CLASS(wxScrolled)
+#endif
+};
+
+// VC++ <= 6 requires this; it's unlikely any other specializations would
+// be needed by user code _and_ they were using VC6, so we list only wxWindow
+// (typical use) and wxPanel (wxScrolledWindow use) specializations here
+WXDLLIMPEXP_TEMPLATE_INSTANCE_CORE( wxScrolled<wxPanel> )
+WXDLLIMPEXP_TEMPLATE_INSTANCE_CORE( wxScrolled<wxWindow> )
+
+// for compatibility with existing code, we provide wxScrolledWindow
+// "typedef" for wxScrolled<wxPanel>. It's not a real typedef because we
+// want wxScrolledWindow to show in wxRTTI information (the class is widely
+// used and likelihood of its wxRTTI information being used too is high):
+class WXDLLIMPEXP_CORE wxScrolledWindow : public wxScrolled<wxPanel>
+{
+public:
+    wxScrolledWindow() : wxScrolled<wxPanel>() {}
+    wxScrolledWindow(wxWindow *parent,
+                     wxWindowID winid = wxID_ANY,
+                     const wxPoint& pos = wxDefaultPosition,
+                     const wxSize& size = wxDefaultSize,
+                     long style = wxScrolledWindowStyle,
+                     const wxString& name = wxPanelNameStr)
+        : wxScrolled<wxPanel>(parent, winid, pos, size, style, name) {}
 
-private:
     DECLARE_DYNAMIC_CLASS_NO_COPY(wxScrolledWindow)
-    DECLARE_EVENT_TABLE()
 };
 
-#endif // _WX_SCROLWIN_H_BASE_
+typedef wxScrolled<wxWindow> wxScrolledCanvas;
 
+#endif // _WX_SCROLWIN_H_BASE_