From 571d2e0f232be3f7220c485c7e72eccfb87f2855 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 23 Sep 2006 20:16:18 +0000 Subject: [PATCH] 1. deprecate redundantly sounding wxArtProvider::FooProvider() to just Foo() 2. wxArtProvider::Remove() now really only removes the provider without deleting it, Delete() does delete it 3. moreover, ~wxArtProvider removes the provider as well so there is almost no need to call Delete() explicitly any more git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41398 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/latex/wx/artprov.tex | 56 ++++++++++++++++------- include/wx/artprov.h | 33 +++++++++++--- samples/artprov/arttest.cpp | 4 +- src/common/artprov.cpp | 88 ++++++++++++++++++++++++++++++++----- src/common/artstd.cpp | 2 +- src/gtk/artgtk.cpp | 2 +- src/univ/theme.cpp | 2 +- src/univ/themes/gtk.cpp | 2 +- src/univ/themes/mono.cpp | 2 +- src/univ/themes/win32.cpp | 2 +- 10 files changed, 150 insertions(+), 43 deletions(-) diff --git a/docs/latex/wx/artprov.tex b/docs/latex/wx/artprov.tex index 690fd24b39..8c2b6d4aaf 100644 --- a/docs/latex/wx/artprov.tex +++ b/docs/latex/wx/artprov.tex @@ -13,7 +13,7 @@ replace standard art with their own version. All that is needed is to derive a class from wxArtProvider, override its \helpref{CreateBitmap}{wxartprovidercreatebitmap} method and register the provider with -\helpref{wxArtProvider::PushProvider}{wxartproviderpushprovider}: +\helpref{wxArtProvider::Push}{wxartproviderpush}: \begin{verbatim} class MyProvider : public wxArtProvider @@ -25,7 +25,7 @@ provider with { ... } }; ... - wxArtProvider::PushProvider(new MyProvider); + wxArtProvider::Push(new MyProvider); \end{verbatim} There's another way of taking advantage of this class: you can use it in your code and use @@ -34,6 +34,7 @@ platform native icons as provided by \helpref{wxArtProvider::GetBitmap}{wxartpro possible as of wxWidgets 2.3.3, the set of wxArtProvider bitmaps is too small). + \membersection{Identifying art resources}\label{artprovideridentifying} Every bitmap is known to wxArtProvider under an unique ID that is used by when @@ -74,8 +75,8 @@ constants in the \helpref{artprov}{sampleartprovider} sample): \item wxART\_MISSING\_IMAGE \end{itemize} -Additionally, any string recognized by custom art providers registered using -\helpref{PushProvider}{wxartproviderpushprovider} may be used. +Additionally, any string recognized by custom art providers registered using +\helpref{Push}{wxartproviderpush} may be used. \wxheading{GTK+ Note} @@ -88,6 +89,7 @@ by GTK+ follow the icons, so wxArtProvider may return {\tt wxNullBitmap} or {\tt wxNullIcon}. Default theme is typically installed in {\tt /usr/share/icons/hicolor}. + \membersection{Clients}\label{artproviderclients} Client is the entity that calls wxArtProvider's GetBitmap or GetIcon @@ -125,6 +127,15 @@ See the \helpref{artprov}{sampleartprovider} sample for an example of wxArtProvi \latexignore{\rtfignore{\wxheading{Members}}} + +\membersection{wxArtProvider::\destruct{wxArtProvider}}\label{wxartproviderdtor} + +\func{}{\destruct{wxArtProvider}}{\void} + +The destructor automatically removes the provider from the provider stack used +by \helpref{GetBitmap}{wxartprovidergetbitmap}. + + \membersection{wxArtProvider::CreateBitmap}\label{wxartprovidercreatebitmap} \func{wxBitmap}{CreateBitmap}{\param{const wxArtID\& }{id}, \param{const wxArtClient\& }{client}, \param{const wxSize\& }{size}} @@ -151,6 +162,14 @@ This is {\bf not} part of wxArtProvider's public API, use \helpref{wxArtProvider::GetIcon}{wxartprovidergeticon} to query wxArtProvider for a resource. + +\membersection{wxArtProvider::Delete}\label{wxartproviderdelete} + +\func{static bool}{Delete}{\param{wxArtProvider* }{provider}} + +Delete the given \arg{provider}. + + \membersection{wxArtProvider::GetBitmap}\label{wxartprovidergetbitmap} \func{static wxBitmap}{GetBitmap}{\param{const wxArtID\& }{id}, \param{const wxArtClient\& }{client = wxART\_OTHER}, \param{const wxSize\& }{size = wxDefaultSize}} @@ -169,6 +188,7 @@ Query registered providers for bitmap with given ID. The bitmap if one of registered providers recognizes the ID or wxNullBitmap otherwise. + \membersection{wxArtProvider::GetIcon}\label{wxartprovidergeticon} \func{static wxIcon}{GetIcon}{\param{const wxArtID\& }{id}, \param{const wxArtClient\& }{client = wxART\_OTHER}, \param{const wxSize\& }{size = wxDefaultSize}} @@ -183,38 +203,42 @@ Returns a suitable size hint for the given {\it wxArtClient}. If otherwise return the size from the topmost wxArtProvider. {\it wxDefaultSize} may be returned if the client doesn't have a specified size, like wxART\_OTHER for example. -\membersection{wxArtProvider::InsertProvider}\label{wxartproviderinsertprovider} -\func{static void}{InsertProvider}{\param{wxArtProvider* }{provider}} +\membersection{wxArtProvider::Insert}\label{wxartproviderinsert} + +\func{static void}{Insert}{\param{wxArtProvider* }{provider}} Register new art provider and add it to the bottom of providers stack (i.e. it will be queried as the last one). \wxheading{See also} -\helpref{PushProvider}{wxartproviderpushprovider} +\helpref{Push}{wxartproviderpush} + -\membersection{wxArtProvider::PopProvider}\label{wxartproviderctor} +\membersection{wxArtProvider::Pop}\label{wxartproviderctor} -\func{static bool}{PopProvider}{\void} +\func{static bool}{Pop}{\void} Remove latest added provider and delete it. -\membersection{wxArtProvider::PushProvider}\label{wxartproviderpushprovider} -\func{static void}{PushProvider}{\param{wxArtProvider* }{provider}} +\membersection{wxArtProvider::Push}\label{wxartproviderpush} + +\func{static void}{Push}{\param{wxArtProvider* }{provider}} Register new art provider and add it to the top of providers stack (i.e. it will be queried as the first provider). \wxheading{See also} -\helpref{InsertProvider}{wxartproviderinsertprovider} +\helpref{Insert}{wxartproviderinsert} + -\membersection{wxArtProvider::RemoveProvider}\label{wxartproviderremoveprovider} +\membersection{wxArtProvider::Remove}\label{wxartproviderremove} -\func{static bool}{RemoveProvider}{\param{wxArtProvider* }{provider}} +\func{static bool}{Remove}{\param{wxArtProvider* }{provider}} -Remove a provider from the stack. The provider must have been added previously -and is {\it not} deleted. +Remove a provider from the stack if it is on it. The provider is {\emph not} +deleted, unlike when using \helpref{Delete()}{wxartproviderdelete}. diff --git a/include/wx/artprov.h b/include/wx/artprov.h index 535d6767fa..61cb8c518d 100644 --- a/include/wx/artprov.h +++ b/include/wx/artprov.h @@ -112,20 +112,27 @@ typedef wxString wxArtID; class WXDLLEXPORT wxArtProvider : public wxObject { public: + // Dtor removes the provider from providers stack if it's still on it + virtual ~wxArtProvider(); + + // Add new provider to the top of providers stack (i.e. the provider will - // be querier first of all). - static void PushProvider(wxArtProvider *provider); + // be queried first of all). + static void Push(wxArtProvider *provider); // Add new provider to the bottom of providers stack (i.e. the provider // will be queried as the last one). - static void InsertProvider(wxArtProvider *provider); + static void Insert(wxArtProvider *provider); // Remove latest added provider and delete it. - static bool PopProvider(); + static bool Pop(); + + // Remove provider from providers stack but don't delete it. + static bool Remove(wxArtProvider *provider); + + // Delete the given provider and remove it from the providers stack. + static bool Delete(wxArtProvider *provider); - // Remove provider. The provider must have been added previously! - // The provider is _not_ deleted. - static bool RemoveProvider(wxArtProvider *provider); // Query the providers for bitmap with given ID and return it. Return // wxNullBitmap if no provider provides it. @@ -143,6 +150,18 @@ public: // the topmost provider if platform_dependent = false static wxSize GetSizeHint(const wxArtClient& client, bool platform_dependent = false); +#if WXWIN_COMPATIBILITY_2_6 + // use the corresponding methods without redundant "Provider" suffix + wxDEPRECATED( static void PushProvider(wxArtProvider *provider) ); + wxDEPRECATED( static void InsertProvider(wxArtProvider *provider) ); + wxDEPRECATED( static bool PopProvider() ); + + // use Delete() if this is what you really need, or just delete the + // provider pointer, do not use Remove() as it does not delete the pointer + // unlike RemoveProvider() which does + wxDEPRECATED( static bool RemoveProvider(wxArtProvider *provider) ); +#endif // WXWIN_COMPATIBILITY_2_6 + protected: friend class wxArtProviderModule; // Initializes default provider diff --git a/samples/artprov/arttest.cpp b/samples/artprov/arttest.cpp index 6d787932dd..9a69a2535f 100644 --- a/samples/artprov/arttest.cpp +++ b/samples/artprov/arttest.cpp @@ -216,7 +216,7 @@ void MyFrame::OnBrowser(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnPlugProvider(wxCommandEvent& event) { if ( event.IsChecked() ) - wxArtProvider::PushProvider(new MyArtProvider); + wxArtProvider::Push(new MyArtProvider); else - wxArtProvider::PopProvider(); + wxArtProvider::Pop(); } diff --git a/src/common/artprov.cpp b/src/common/artprov.cpp index 7661612429..dd5cdb4bd5 100644 --- a/src/common/artprov.cpp +++ b/src/common/artprov.cpp @@ -90,15 +90,28 @@ void wxArtProviderCache::Clear() } -// ---------------------------------------------------------------------------- +// ============================================================================ // wxArtProvider class -// ---------------------------------------------------------------------------- +// ============================================================================ IMPLEMENT_ABSTRACT_CLASS(wxArtProvider, wxObject) wxArtProvidersList *wxArtProvider::sm_providers = NULL; wxArtProviderCache *wxArtProvider::sm_cache = NULL; +// ---------------------------------------------------------------------------- +// wxArtProvider ctors/dtor +// ---------------------------------------------------------------------------- + +wxArtProvider::~wxArtProvider() +{ + Remove(this); +} + +// ---------------------------------------------------------------------------- +// wxArtProvider operations on provider stack +// ---------------------------------------------------------------------------- + /*static*/ void wxArtProvider::CommonAddingProvider() { if ( !sm_providers ) @@ -110,36 +123,34 @@ wxArtProviderCache *wxArtProvider::sm_cache = NULL; sm_cache->Clear(); } -/*static*/ void wxArtProvider::PushProvider(wxArtProvider *provider) +/*static*/ void wxArtProvider::Push(wxArtProvider *provider) { CommonAddingProvider(); sm_providers->Insert(provider); } -/*static*/ void wxArtProvider::InsertProvider(wxArtProvider *provider) +/*static*/ void wxArtProvider::Insert(wxArtProvider *provider) { CommonAddingProvider(); sm_providers->Append(provider); } -/*static*/ bool wxArtProvider::PopProvider() +/*static*/ bool wxArtProvider::Pop() { wxCHECK_MSG( sm_providers, false, _T("no wxArtProvider exists") ); - wxCHECK_MSG( sm_providers->GetCount() > 0, false, _T("wxArtProviders stack is empty") ); + wxCHECK_MSG( !sm_providers->empty(), false, _T("wxArtProviders stack is empty") ); delete sm_providers->GetFirst()->GetData(); - sm_providers->Erase(sm_providers->GetFirst()); sm_cache->Clear(); return true; } -/*static*/ bool wxArtProvider::RemoveProvider(wxArtProvider *provider) +/*static*/ bool wxArtProvider::Remove(wxArtProvider *provider) { wxCHECK_MSG( sm_providers, false, _T("no wxArtProvider exists") ); if ( sm_providers->DeleteObject(provider) ) { - delete provider; sm_cache->Clear(); return true; } @@ -147,13 +158,33 @@ wxArtProviderCache *wxArtProvider::sm_cache = NULL; return false; } +/*static*/ bool wxArtProvider::Delete(wxArtProvider *provider) +{ + // provider will remove itself from the stack in its dtor + delete provider; + + return true; +} + /*static*/ void wxArtProvider::CleanUpProviders() { - WX_CLEAR_LIST(wxArtProvidersList, *sm_providers); - wxDELETE(sm_providers); - wxDELETE(sm_cache); + if ( sm_providers ) + { + while ( !sm_providers->empty() ) + delete *sm_providers->begin(); + + delete sm_providers; + sm_providers = NULL; + + delete sm_cache; + sm_cache = NULL; + } } +// ---------------------------------------------------------------------------- +// wxArtProvider: retrieving bitmaps/icons +// ---------------------------------------------------------------------------- + /*static*/ wxBitmap wxArtProvider::GetBitmap(const wxArtID& id, const wxArtClient& client, const wxSize& size) @@ -253,6 +284,39 @@ wxArtProviderCache *wxArtProvider::sm_cache = NULL; #endif // GTK+ 2/else } +// ---------------------------------------------------------------------------- +// deprecated wxArtProvider methods +// ---------------------------------------------------------------------------- + +#if WXWIN_COMPATIBILITY_2_6 + +/* static */ void wxArtProvider::PushProvider(wxArtProvider *provider) +{ + Push(provider); +} + +/* static */ void wxArtProvider::InsertProvider(wxArtProvider *provider) +{ + Insert(provider); +} + +/* static */ bool wxArtProvider::PopProvider() +{ + return Pop(); +} + +/* static */ bool wxArtProvider::RemoveProvider(wxArtProvider *provider) +{ + // RemoveProvider() used to delete the provider being removed so this is + // not a typo, we must call Delete() and not Remove() here + return Delete(provider); +} + +#endif // WXWIN_COMPATIBILITY_2_6 + +// ============================================================================ +// wxArtProviderModule +// ============================================================================ class wxArtProviderModule: public wxModule { diff --git a/src/common/artstd.cpp b/src/common/artstd.cpp index 314e609089..c3e4fe994b 100644 --- a/src/common/artstd.cpp +++ b/src/common/artstd.cpp @@ -74,7 +74,7 @@ protected: /*static*/ void wxArtProvider::InitStdProvider() { - wxArtProvider::PushProvider(new wxDefaultArtProvider); + wxArtProvider::Push(new wxDefaultArtProvider); } #if !defined(__WXGTK20__) || defined(__WXUNIVERSAL__) diff --git a/src/gtk/artgtk.cpp b/src/gtk/artgtk.cpp index 9d4c51c768..d42c6a69b1 100644 --- a/src/gtk/artgtk.cpp +++ b/src/gtk/artgtk.cpp @@ -54,7 +54,7 @@ protected: /*static*/ void wxArtProvider::InitNativeProvider() { - wxArtProvider::PushProvider(new wxGTK2ArtProvider); + wxArtProvider::Push(new wxGTK2ArtProvider); } // ---------------------------------------------------------------------------- diff --git a/src/univ/theme.cpp b/src/univ/theme.cpp index ec64045d05..2eb31fb1d4 100644 --- a/src/univ/theme.cpp +++ b/src/univ/theme.cpp @@ -137,7 +137,7 @@ wxThemeInfo::wxThemeInfo(Constructor c, // has one wxArtProvider *art = ms_theme->GetArtProvider(); if ( art ) - wxArtProvider::PushProvider(art); + wxArtProvider::Push(art); } return themeOld; diff --git a/src/univ/themes/gtk.cpp b/src/univ/themes/gtk.cpp index 5715566f5b..e0fd1f8fe1 100644 --- a/src/univ/themes/gtk.cpp +++ b/src/univ/themes/gtk.cpp @@ -563,7 +563,7 @@ wxGTKTheme::~wxGTKTheme() { delete m_renderer; delete m_scheme; - wxArtProvider::RemoveProvider(m_artProvider); + delete m_artProvider; } wxRenderer *wxGTKTheme::GetRenderer() diff --git a/src/univ/themes/mono.cpp b/src/univ/themes/mono.cpp index 090b85902f..a4ffd5f06d 100644 --- a/src/univ/themes/mono.cpp +++ b/src/univ/themes/mono.cpp @@ -511,7 +511,7 @@ wxMonoTheme::~wxMonoTheme() { delete m_renderer; delete m_scheme; - wxArtProvider::RemoveProvider(m_artProvider); + delete m_artProvider; } wxRenderer *wxMonoTheme::GetRenderer() diff --git a/src/univ/themes/win32.cpp b/src/univ/themes/win32.cpp index 0e3ffe146f..5aa723165f 100644 --- a/src/univ/themes/win32.cpp +++ b/src/univ/themes/win32.cpp @@ -1069,7 +1069,7 @@ wxWin32Theme::~wxWin32Theme() { delete m_renderer; delete m_scheme; - wxArtProvider::RemoveProvider(m_artProvider); + delete m_artProvider; } wxRenderer *wxWin32Theme::GetRenderer() -- 2.45.2