]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/renderer.h
Added, documented and used wxGridCellChoiceEditor
[wxWidgets.git] / include / wx / renderer.h
index 20c06d29ad971d0d1f8b81cb22edf620fe12b579..e343989a2a137aa154bbcc4e172321a742fde012 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,60 @@ 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 interface version
+struct WXDLLEXPORT wxRendererVersion
+{
+    wxRendererVersion(int version_, int age_) : version(version_), age(age_) { }
+
+    // default copy ctor, assignment operator and dtor are ok
+
+    // the current version and age of wxRendererNative interface: different
+    // versions are incompatible (in both ways) while the ages inside the same
+    // version are upwards compatible, i.e. the version of the renderer must
+    // match the version of the main program exactly while the age may be
+    // highergreater or equal to it
+    //
+    // NB: don't forget to increment age after adding any new virtual function!
+    enum
+    {
+        Current_Version = 1,
+        Current_Age = 5
+    };
+
+
+    // check if the given version is compatible with the current one
+    static bool IsCompatible(const wxRendererVersion& ver)
+    {
+        return ver.version == Current_Version && ver.age >= Current_Age;
+    }
+
+    const int version;
+    const int age;
+};
+
 // ----------------------------------------------------------------------------
 // wxRendererNative: abstracts drawing methods needed by the native controls
 // ----------------------------------------------------------------------------
@@ -80,13 +142,16 @@ public:
     // drawn by DrawSash() blends into it well
     virtual void DrawSplitterBorder(wxWindow *win,
                                     wxDC& dc,
-                                    const wxRect& rect) = 0;
+                                    const wxRect& rect,
+                                    int flags = 0) = 0;
 
     // draw a (vertical) sash
     virtual void DrawSplitterSash(wxWindow *win,
                                   wxDC& dc,
                                   const wxSize& size,
-                                  wxCoord position) = 0;
+                                  wxCoord position,
+                                  wxOrientation orient,
+                                  int flags = 0) = 0;
 
 
     // geometry functions
@@ -94,7 +159,7 @@ public:
 
     // get the splitter parameters: the x field of the returned point is the
     // sash width and the y field is the border width
-    virtual wxPoint GetSplitterSashAndBorder(const wxWindow *win) = 0;
+    virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win) = 0;
 
 
     // pseudo constructors
@@ -105,6 +170,37 @@ 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);
+
+
+    // miscellaneous stuff
+    // -------------------
+
+    // this function is used for version checking: Load() refuses to load any
+    // DLLs implementing an older or incompatible version; it should be
+    // implemented simply by returning wxRendererVersion::Current_XXX values
+    virtual wxRendererVersion GetVersion() const = 0;
+
+    // virtual dtor for any base class
+    virtual ~wxRendererNative();
 };
 
 // ----------------------------------------------------------------------------
@@ -135,22 +231,46 @@ public:
 
     virtual void DrawSplitterBorder(wxWindow *win,
                                     wxDC& dc,
-                                    const wxRect& rect)
-        { m_rendererNative.DrawSplitterBorder(win, dc, rect); }
+                                    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)
-        { m_rendererNative.DrawSplitterSash(win, dc, size, position); }
+                                  wxCoord position,
+                                  wxOrientation orient,
+                                  int flags = 0)
+        { m_rendererNative.DrawSplitterSash(win, dc, size,
+                                            position, orient, flags); }
 
 
-    virtual wxPoint GetSplitterSashAndBorder(const wxWindow *win)
-        { return m_rendererNative.GetSplitterSashAndBorder(win); }
+    virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win)
+        { return m_rendererNative.GetSplitterParams(win); }
+
+    virtual wxRendererVersion GetVersion() const
+        { return m_rendererNative.GetVersion(); }
 
 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_