]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/renderer.h
Fix for wxTextCtrl::GetSelection for singel line controls in GTK2 mode
[wxWidgets.git] / include / wx / renderer.h
index 325250d6ee7a9818cc9e79bfdb440dc952b3f2b6..ba5cb2611a17b2c0dc68cbe79a0048c4d6980d9b 100644 (file)
 #define _WX_RENDERER_H_
 
 class WXDLLEXPORT wxDC;
-class WXDLLEXPORT wxRect;
 class WXDLLEXPORT wxWindow;
 
+#include "wx/gdicmn.h" // for wxPoint
+
+// some platforms have their own renderers, others use the generic one
+#if defined(__WXMSW__) || defined(__WXMAC__) || defined(__WXGTK__)
+    #define wxHAS_NATIVE_RENDERER
+#else
+    #undef wxHAS_NATIVE_RENDERER
+#endif
+
 // ----------------------------------------------------------------------------
 // constants
 // ----------------------------------------------------------------------------
@@ -54,6 +62,29 @@ enum
     wxCONTROL_DIRTY      = 0x80000000
 };
 
+// ----------------------------------------------------------------------------
+// helper structs
+// ----------------------------------------------------------------------------
+
+// wxSplitterWindow parameters
+struct WXDLLEXPORT wxSplitterRenderParams
+{
+    // the only way to initialize this struct is by using this ctor
+    wxSplitterRenderParams(wxCoord widthSash_, wxCoord border_, bool isSens_)
+        : widthSash(widthSash_), border(border_), isHotSensitive(isSens_)
+        {
+        }
+
+    // the width of the splitter sash
+    const wxCoord widthSash;
+
+    // the width of the border of the splitter window
+    const wxCoord border;
+
+    // true if the splitter changes its appearance when the mouse is over it
+    const bool isHotSensitive;
+};
+
 // ----------------------------------------------------------------------------
 // wxRendererNative: abstracts drawing methods needed by the native controls
 // ----------------------------------------------------------------------------
@@ -61,6 +92,8 @@ enum
 class WXDLLEXPORT wxRendererNative
 {
 public:
+    virtual ~wxRendererNative() { } // stop GCC warning
+
     // drawing functions
     // -----------------
 
@@ -76,6 +109,29 @@ public:
                                     const wxRect& rect,
                                     int flags = 0) = 0;
 
+    // draw the border for sash window: this border must be such that the sash
+    // drawn by DrawSash() blends into it well
+    virtual void DrawSplitterBorder(wxWindow *win,
+                                    wxDC& dc,
+                                    const wxRect& rect,
+                                    int flags = 0) = 0;
+
+    // draw a (vertical) sash
+    virtual void DrawSplitterSash(wxWindow *win,
+                                  wxDC& dc,
+                                  const wxSize& size,
+                                  wxCoord position,
+                                  wxOrientation orient,
+                                  int flags = 0) = 0;
+
+
+    // geometry functions
+    // ------------------
+
+    // get the splitter parameters: the x field of the returned point is the
+    // sash width and the y field is the border width
+    virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win) = 0;
+
 
     // pseudo constructors
     // -------------------
@@ -85,6 +141,25 @@ public:
 
     // return the generic implementation of the renderer
     static wxRendererNative& GetGeneric();
+
+    // return the default (native) implementation for this platform
+    static wxRendererNative& GetDefault();
+
+
+    // changing the global renderer
+    // ----------------------------
+
+#if wxUSE_DYNLIB_CLASS
+    // load the renderer from the specified DLL, the returned pointer must be
+    // deleted by caller if not NULL when it is not used any more
+    static wxRendererNative *Load(const wxString& name);
+#endif // wxUSE_DYNLIB_CLASS
+
+    // set the renderer to use, passing NULL reverts to using the default
+    // renderer
+    //
+    // return the previous renderer used with Set() or NULL if none
+    static wxRendererNative *Set(wxRendererNative *renderer);
 };
 
 // ----------------------------------------------------------------------------
@@ -106,15 +181,52 @@ public:
                                   const wxRect& rect,
                                   int flags = 0)
         { m_rendererNative.DrawHeaderButton(win, dc, rect, flags); }
+
     virtual void DrawTreeItemButton(wxWindow *win,
                                     wxDC& dc,
                                     const wxRect& rect,
                                     int flags = 0)
         { m_rendererNative.DrawTreeItemButton(win, dc, rect, flags); }
 
+    virtual void DrawSplitterBorder(wxWindow *win,
+                                    wxDC& dc,
+                                    const wxRect& rect,
+                                    int flags = 0)
+        { m_rendererNative.DrawSplitterBorder(win, dc, rect, flags); }
+
+    virtual void DrawSplitterSash(wxWindow *win,
+                                  wxDC& dc,
+                                  const wxSize& size,
+                                  wxCoord position,
+                                  wxOrientation orient,
+                                  int flags = 0)
+        { m_rendererNative.DrawSplitterSash(win, dc, size,
+                                            position, orient, flags); }
+
+
+    virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win)
+        { return m_rendererNative.GetSplitterParams(win); }
+
 protected:
     wxRendererNative& m_rendererNative;
+
+    DECLARE_NO_COPY_CLASS(wxDelegateRendererNative)
 };
 
+// ----------------------------------------------------------------------------
+// inline functions implementation
+// ----------------------------------------------------------------------------
+
+#ifndef wxHAS_NATIVE_RENDERER
+
+// default native renderer is the generic one then
+/* static */ inline
+wxRendererNative& wxRendererNative::GetDefault()
+{
+    return GetGeneric();
+}
+
+#endif // !wxHAS_NATIVE_RENDERER
+
 #endif // _WX_RENDERER_H_