#ifndef _WX_RENDERER_H_
#define _WX_RENDERER_H_
+class WXDLLEXPORT wxDC;
+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
// ----------------------------------------------------------------------------
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
// ----------------------------------------------------------------------------
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
// -------------------
// 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();
};
// ----------------------------------------------------------------------------
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); }
+
+ 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_