// 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
///////////////////////////////////////////////////////////////////////////////
/*
- 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
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,
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
// ----------------------------------------------------------------------------
class WXDLLEXPORT wxRendererNative
{
public:
- virtual ~wxRendererNative() { } // stop GCC warning
-
// drawing functions
// -----------------
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
// ------------------
// 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();
};
// ----------------------------------------------------------------------------
wxDC& dc,
const wxRect& rect,
int flags = 0)
- { m_rendererNative.DrawSplitterBorder(win, dc, rect); }
+ { m_rendererNative.DrawSplitterBorder(win, dc, rect, flags); }
virtual void DrawSplitterSash(wxWindow *win,
wxDC& dc,
wxCoord position,
wxOrientation orient,
int flags = 0)
- { m_rendererNative.DrawSplitterSash(win, dc, size, position, orient); }
+ { 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 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;