]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/renderer.h
wxMSWUniv build fix.
[wxWidgets.git] / include / wx / renderer.h
index 76e7a80090af809bc803aa874535b57b3c5131f6..3f6087866572592ddd0c7dca66086698497e2332 100644 (file)
@@ -5,12 +5,12 @@
 // Modified by:
 // Created:     20.07.2003
 // RCS-ID:      $Id$
 // Modified by:
 // Created:     20.07.2003
 // RCS-ID:      $Id$
-// Copyright:   (c) 2003 Vadim Zeitlin <vadim@wxwindows.org>
+// Copyright:   (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org>
 // Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
 /*
 // Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
 /*
-   Renderers are used in wxWindows for two similar but different things:
+   Renderers are used in wxWidgets for two similar but different things:
     (a) wxUniversal uses them to draw everything, i.e. all the control
     (b) all the native ports use them to draw generic controls only
 
     (a) wxUniversal uses them to draw everything, i.e. all the control
     (b) all the native ports use them to draw generic controls only
 
@@ -30,6 +30,13 @@ class WXDLLEXPORT wxWindow;
 
 #include "wx/gdicmn.h" // for wxPoint
 
 
 #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
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // constants
 // ----------------------------------------------------------------------------
@@ -47,6 +54,7 @@ enum
     wxCONTROL_SELECTED   = 0x00000020,  // selected item in e.g. listbox
     wxCONTROL_CHECKED    = 0x00000040,  // (check/radio button) is checked
     wxCONTROL_CHECKABLE  = 0x00000080,  // (menu) item can be checked
     wxCONTROL_SELECTED   = 0x00000020,  // selected item in e.g. listbox
     wxCONTROL_CHECKED    = 0x00000040,  // (check/radio button) is checked
     wxCONTROL_CHECKABLE  = 0x00000080,  // (menu) item can be checked
+    wxCONTROL_UNDETERMINED = wxCONTROL_CHECKABLE, // (check) undetermined state
 
     wxCONTROL_FLAGS_MASK = 0x000000ff,
 
 
     wxCONTROL_FLAGS_MASK = 0x000000ff,
 
@@ -55,6 +63,60 @@ enum
     wxCONTROL_DIRTY      = 0x80000000
 };
 
     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
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // wxRendererNative: abstracts drawing methods needed by the native controls
 // ----------------------------------------------------------------------------
@@ -62,8 +124,6 @@ enum
 class WXDLLEXPORT wxRendererNative
 {
 public:
 class WXDLLEXPORT wxRendererNative
 {
 public:
-    virtual ~wxRendererNative() { } // stop GCC warning
-
     // drawing functions
     // -----------------
 
     // drawing functions
     // -----------------
 
@@ -83,21 +143,39 @@ public:
     // drawn by DrawSash() blends into it well
     virtual void DrawSplitterBorder(wxWindow *win,
                                     wxDC& dc,
     // 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,
 
     // 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;
 
 
+    // draw a combobox dropdown button
+    //
+    // flags may use wxCONTROL_PRESSED and wxCONTROL_CURRENT
+    virtual void DrawComboBoxDropButton(wxWindow *win,
+                                        wxDC& dc,
+                                        const wxRect& rect,
+                                        int flags = 0) = 0;
+
+    // draw a dropdown arrow
+    //
+    // flags may use wxCONTROL_PRESSED and wxCONTROL_CURRENT
+    virtual void DrawDropArrow(wxWindow *win,
+                               wxDC& dc,
+                               const wxRect& rect,
+                               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
 
     // 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 wxPoint GetSplitterSashAndBorder(const wxWindow *win) = 0;
+    virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win) = 0;
 
 
     // pseudo constructors
 
 
     // pseudo constructors
@@ -108,6 +186,37 @@ public:
 
     // return the generic implementation of the renderer
     static wxRendererNative& GetGeneric();
 
     // 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();
 };
 
 // ----------------------------------------------------------------------------
 };
 
 // ----------------------------------------------------------------------------
@@ -138,18 +247,36 @@ public:
 
     virtual void DrawSplitterBorder(wxWindow *win,
                                     wxDC& dc,
 
     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,
 
     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 void DrawComboBoxDropButton(wxWindow *win,
+                                        wxDC& dc,
+                                        const wxRect& rect,
+                                        int flags = 0)
+        { m_rendererNative.DrawComboBoxDropButton(win, dc, rect, flags); }
 
 
-    virtual wxPoint GetSplitterSashAndBorder(const wxWindow *win)
-        { return m_rendererNative.GetSplitterSashAndBorder(win); }
+    virtual void DrawDropArrow(wxWindow *win,
+                               wxDC& dc,
+                               const wxRect& rect,
+                               int flags = 0)
+        { m_rendererNative.DrawDropArrow(win, dc, rect, flags); }
+
+    virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win)
+        { return m_rendererNative.GetSplitterParams(win); }
+
+    virtual wxRendererVersion GetVersion() const
+        { return m_rendererNative.GetVersion(); }
 
 protected:
     wxRendererNative& m_rendererNative;
 
 protected:
     wxRendererNative& m_rendererNative;
@@ -157,5 +284,20 @@ protected:
     DECLARE_NO_COPY_CLASS(wxDelegateRendererNative)
 };
 
     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_
 
 #endif // _WX_RENDERER_H_