]> git.saurik.com Git - wxWidgets.git/commitdiff
added wxAppTraits::CreateRenderer() which may be used to customize the renderer
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 28 Jul 2003 10:59:42 +0000 (10:59 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 28 Jul 2003 10:59:42 +0000 (10:59 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22341 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

12 files changed:
include/wx/apptrait.h
include/wx/renderer.h
include/wx/window.h
src/common/appbase.cpp
src/common/appcmn.cpp
src/common/rendcmn.cpp [new file with mode: 0644]
src/generic/renderg.cpp
src/gtk/renderer.cpp
src/gtk1/renderer.cpp
src/mac/carbon/renderer.cpp
src/mac/renderer.cpp
src/msw/renderer.cpp

index edce5bb94515797d1b8c892fa02e9499ca130958..0a169af8f0446b8a34f4395e4fa06fffbe8b07ec 100644 (file)
@@ -19,6 +19,7 @@ class WXDLLEXPORT wxAppTraits;
 #endif // wxUSE_FONTMAP
 class WXDLLEXPORT wxLog;
 class WXDLLEXPORT wxMessageOutput;
+class WXDLLEXPORT wxRendererNative;
 class WXDLLEXPORT wxString;
 
 // ----------------------------------------------------------------------------
@@ -44,6 +45,13 @@ public:
     virtual wxFontMapper *CreateFontMapper() = 0;
 #endif // wxUSE_FONTMAP
 
+    // get the renderer to use for drawing the generic controls (return value
+    // may be NULL in which case the default renderer for the current platform
+    // is used); this is used in GUI only and always returns NULL in console
+    //
+    // NB: returned pointer will be deleted by the caller
+    virtual wxRendererNative *CreateRenderer() = 0;
+
 
     // functions abstracting differences between GUI and console modes
     // ------------------------------------------------------------------------
@@ -123,6 +131,7 @@ public:
 #if wxUSE_FONTMAP
     virtual wxFontMapper *CreateFontMapper();
 #endif // wxUSE_FONTMAP
+    virtual wxRendererNative *CreateRenderer();
 
 #ifdef __WXDEBUG__
     virtual bool ShowAssertDialog(const wxString& msg);
@@ -149,6 +158,7 @@ public:
 #if wxUSE_FONTMAP
     virtual wxFontMapper *CreateFontMapper();
 #endif // wxUSE_FONTMAP
+    virtual wxRendererNative *CreateRenderer();
 
 #ifdef __WXDEBUG__
     virtual bool ShowAssertDialog(const wxString& msg);
index adb2076bc5abaa3e5ab0cd8b964b04fabb00504e..2906de378a045b7c351655d2d883234cf4297871 100644 (file)
@@ -30,6 +30,13 @@ 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
 // ----------------------------------------------------------------------------
@@ -109,6 +116,9 @@ public:
 
     // return the generic implementation of the renderer
     static wxRendererNative& GetGeneric();
+
+    // return the default (native) implementation for this platform
+    static wxRendererNative& GetDefault();
 };
 
 // ----------------------------------------------------------------------------
@@ -159,5 +169,20 @@ protected:
     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_
 
index 2270ca10c3443deae9be1ecee30350358a5c4093..596dadc0a406b9103fd4296adbb47a1adb6f9412 100644 (file)
@@ -831,7 +831,17 @@ public:
     wxSizer *GetSizer() const { return m_windowSizer; }
 
     // Track if this window is a member of a sizer
-    void SetContainingSizer(wxSizer* sizer) { m_containingSizer = sizer; }
+    void SetContainingSizer(wxSizer* sizer)
+    {
+        // adding a window to a sizer twice is going to result in fatal and
+        // hard to debug problems later because when deleting the second
+        // associated wxSizerItem we're going to dereference a dangling
+        // pointer; so try to detect this as early as possible
+        wxASSERT_MSG( !sizer || m_containingSizer != sizer,
+                        _T("Adding a window to the same sizer twice?") );
+
+        m_containingSizer = sizer;
+    }
     wxSizer *GetContainingSizer() const { return m_containingSizer; }
 
     // accessibility
index 261fd0fa2389bea2b1ff962a5219c5e42f6ce08b..fddde79afd73b2d9287b2f99786571c1ae34399a 100644 (file)
@@ -506,6 +506,12 @@ wxFontMapper *wxConsoleAppTraitsBase::CreateFontMapper()
 
 #endif // wxUSE_FONTMAP
 
+wxRendererNative *wxConsoleAppTraitsBase::CreateRenderer()
+{
+    // console applications don't use renderers
+    return NULL;
+}
+
 #ifdef __WXDEBUG__
 bool wxConsoleAppTraitsBase::ShowAssertDialog(const wxString& msg)
 {
index dd1636b598b7126cfc31f1c3bb36d05fd04223e7..3d7af86d6c184253a3e9c9de883047384f371635 100644 (file)
@@ -322,6 +322,12 @@ wxFontMapper *wxGUIAppTraitsBase::CreateFontMapper()
 
 #endif // wxUSE_FONTMAP
 
+wxRendererNative *wxGUIAppTraitsBase::CreateRenderer()
+{
+    // use the default native renderer by default
+    return NULL;
+}
+
 #ifdef __WXDEBUG__
 
 bool wxGUIAppTraitsBase::ShowAssertDialog(const wxString& msg)
diff --git a/src/common/rendcmn.cpp b/src/common/rendcmn.cpp
new file mode 100644 (file)
index 0000000..202ec01
--- /dev/null
@@ -0,0 +1,87 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        common/rendcmn.cpp
+// Purpose:     wxRendererNative common functions
+// Author:      Vadim Zeitlin
+// Modified by:
+// Created:     28.07.03
+// RCS-ID:      $Id$
+// Copyright:   (c) 2003 Vadim Zeitlin <vadim@wxwindows.org>
+// License:     wxWindows license
+///////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#endif //WX_PRECOMP
+
+#include "wx/apptrait.h"
+#include "wx/renderer.h"
+
+#include "wx/ptr_scpd.h"
+
+// ----------------------------------------------------------------------------
+// wxRendererPtr: auto pointer holding the global renderer
+// ----------------------------------------------------------------------------
+
+wxDECLARE_SCOPED_PTR(wxRendererNative, wxRendererPtrBase);
+wxDEFINE_SCOPED_PTR(wxRendererNative, wxRendererPtrBase);
+
+class wxRendererPtr : public wxRendererPtrBase
+{
+public:
+    wxRendererPtr() : wxRendererPtrBase(NULL) { m_initialized = false; }
+
+    // return true if we have a renderer, false otherwise
+    bool IsOk()
+    {
+        if ( !m_initialized )
+        {
+            // only try to create the renderer once
+            m_initialized = true;
+
+            DoInit();
+        }
+
+        return get() != NULL;
+    }
+
+private:
+    void DoInit()
+    {
+        wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
+        if ( traits )
+        {
+            // ask the traits object to create a renderer for us
+            reset(traits->CreateRenderer());
+        }
+    }
+
+    bool m_initialized;
+
+    DECLARE_NO_COPY_CLASS(wxRendererPtr)
+};
+
+// ============================================================================
+// wxRendererNative implementation
+// ============================================================================
+
+/* static */
+wxRendererNative& wxRendererNative::Get()
+{
+    static wxRendererPtr s_renderer;
+
+    return s_renderer.IsOk() ? *s_renderer.get() : GetDefault();
+}
+
index 252bfccc145c9836d03f92a78282dda218c4fc38..15af1286b6e85ef8f59c4c96de952d41dccce287 100644 (file)
@@ -100,17 +100,6 @@ wxRendererNative& wxRendererNative::GetGeneric()
     return s_rendererGeneric;
 }
 
-// some platforms have their own renderers
-#if !defined(__WXMSW__) && !defined(__WXMAC__) && !defined(__WXGTK__)
-
-/* static */
-wxRendererNative& wxRendererNative::Get()
-{
-    return GetGeneric();
-}
-
-#endif // platforms using their own renderers
-
 wxRendererGeneric::wxRendererGeneric()
     : m_penBlack(wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW)),
       m_penDarkGrey(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW)),
index 8c73a876fc8182f37f276af6e4fdf5cca0daad09..dea620908fc9cf90f7a9062de6e63514fb8113c8 100644 (file)
@@ -76,7 +76,7 @@ public:
 // ============================================================================
 
 /* static */
-wxRendererNative& wxRendererNative::Get()
+wxRendererNative& wxRendererNative::GetDefault()
 {
     static wxRendererGTK s_rendererGTK;
 
index 8c73a876fc8182f37f276af6e4fdf5cca0daad09..dea620908fc9cf90f7a9062de6e63514fb8113c8 100644 (file)
@@ -76,7 +76,7 @@ public:
 // ============================================================================
 
 /* static */
-wxRendererNative& wxRendererNative::Get()
+wxRendererNative& wxRendererNative::GetDefault()
 {
     static wxRendererGTK s_rendererGTK;
 
index 734a26e74da34960f6ce182091e888c845738374..075dd59eb09def8f6443bda43c0c27e3e6cc7121 100644 (file)
@@ -118,7 +118,7 @@ static const char *aqua_arrow_down_xpm[] = {
 // ============================================================================
 
 /* static */
-wxRendererNative& wxRendererNative::Get()
+wxRendererNative& wxRendererNative::GetDefault()
 {
     static wxRendererMac s_rendererMac;
 
index 734a26e74da34960f6ce182091e888c845738374..075dd59eb09def8f6443bda43c0c27e3e6cc7121 100644 (file)
@@ -118,7 +118,7 @@ static const char *aqua_arrow_down_xpm[] = {
 // ============================================================================
 
 /* static */
-wxRendererNative& wxRendererNative::Get()
+wxRendererNative& wxRendererNative::GetDefault()
 {
     static wxRendererMac s_rendererMac;
 
index 4c8a59db57d1e85a51ce4ebd8a69e64a56e79638..e71bbf356a1774485f85023ce053945921ed955b 100644 (file)
@@ -48,7 +48,7 @@ private:
 // ============================================================================
 
 /* static */
-wxRendererNative& wxRendererNative::Get()
+wxRendererNative& wxRendererNative::GetDefault()
 {
     static wxRendererMSW s_rendererMSW;