// Author: Vaclav Slavik
// Modified by:
// Created: 18/03/2002
-// RCS-ID: $Id$
// Copyright: (c) Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
wxArtProviderCache::ConstructHashID(const wxArtID& id,
const wxArtClient& client)
{
- return id + _T('-') + client;
+ return id + wxT('-') + client;
}
const wxArtClient& client,
const wxSize& size)
{
- return ConstructHashID(id, client) + _T('-') +
- wxString::Format(_T("%d-%d"), size.x, size.y);
+ return ConstructHashID(id, client) + wxT('-') +
+ wxString::Format(wxT("%d-%d"), size.x, size.y);
}
// ============================================================================
sm_providers->Insert(provider);
}
-/*static*/ void wxArtProvider::Insert(wxArtProvider *provider)
+/*static*/ void wxArtProvider::PushBack(wxArtProvider *provider)
{
CommonAddingProvider();
sm_providers->Append(provider);
/*static*/ bool wxArtProvider::Pop()
{
- wxCHECK_MSG( sm_providers, false, _T("no wxArtProvider exists") );
- wxCHECK_MSG( !sm_providers->empty(), false, _T("wxArtProviders stack is empty") );
+ wxCHECK_MSG( sm_providers, false, wxT("no wxArtProvider exists") );
+ wxCHECK_MSG( !sm_providers->empty(), false, wxT("wxArtProviders stack is empty") );
delete sm_providers->GetFirst()->GetData();
sm_cache->Clear();
/*static*/ bool wxArtProvider::Remove(wxArtProvider *provider)
{
- wxCHECK_MSG( sm_providers, false, _T("no wxArtProvider exists") );
+ wxCHECK_MSG( sm_providers, false, wxT("no wxArtProvider exists") );
if ( sm_providers->DeleteObject(provider) )
{
while ( !sm_providers->empty() )
delete *sm_providers->begin();
- delete sm_providers;
- sm_providers = NULL;
-
- delete sm_cache;
- sm_cache = NULL;
+ wxDELETE(sm_providers);
+ wxDELETE(sm_cache);
}
}
const wxSize& size)
{
// safety-check against writing client,id,size instead of id,client,size:
- wxASSERT_MSG( client.Last() == _T('C'), _T("invalid 'client' parameter") );
+ wxASSERT_MSG( client.Last() == wxT('C'), wxT("invalid 'client' parameter") );
- wxCHECK_MSG( sm_providers, wxNullBitmap, _T("no wxArtProvider exists") );
+ wxCHECK_MSG( sm_providers, wxNullBitmap, wxT("no wxArtProvider exists") );
wxString hashId = wxArtProviderCache::ConstructHashID(id, client, size);
node; node = node->GetNext())
{
bmp = node->GetData()->CreateBitmap(id, client, size);
- if ( bmp.Ok() )
+ if ( bmp.IsOk() )
+ break;
+ }
+
+ wxSize sizeNeeded = size;
+ if ( !bmp.IsOk() )
+ {
+ // no bitmap created -- as a fallback, try if we can find desired
+ // icon in a bundle
+ wxIconBundle iconBundle = DoGetIconBundle(id, client);
+ if ( iconBundle.IsOk() )
{
-#if wxUSE_IMAGE && (!defined(__WXMSW__) || wxUSE_WXDIB)
- if ( size != wxDefaultSize &&
- (bmp.GetWidth() != size.x || bmp.GetHeight() != size.y) )
+ if ( sizeNeeded == wxDefaultSize )
+ sizeNeeded = GetNativeSizeHint(client);
+
+ wxIcon icon(iconBundle.GetIcon(sizeNeeded));
+ if ( icon.IsOk() )
{
- wxImage img = bmp.ConvertToImage();
- img.Rescale(size.x, size.y);
- bmp = wxBitmap(img);
+ // this icon may be not of the correct size, it will be
+ // rescaled below in such case
+ bmp.CopyFromIcon(icon);
}
-#endif
- break;
}
- // We could try the IconBundles here and convert what we find
- // to a bitmap.
}
- sm_cache->PutBitmap(hashId, bmp);
+
+ // if we didn't get the correct size, resize the bitmap
+#if wxUSE_IMAGE && (!defined(__WXMSW__) || wxUSE_WXDIB)
+ if ( bmp.IsOk() && sizeNeeded != wxDefaultSize )
+ {
+ if ( bmp.GetSize() != sizeNeeded )
+ {
+ wxImage img = bmp.ConvertToImage();
+ img.Rescale(sizeNeeded.x, sizeNeeded.y);
+ bmp = wxBitmap(img);
+ }
}
+#endif // wxUSE_IMAGE
+
+ sm_cache->PutBitmap(hashId, bmp);
+ }
return bmp;
}
-/*static*/ wxIconBundle wxArtProvider::GetIconBundle(const wxArtID& id, const wxArtClient& client)
+/*static*/
+wxIconBundle wxArtProvider::GetIconBundle(const wxArtID& id, const wxArtClient& client)
+{
+ wxIconBundle iconbundle(DoGetIconBundle(id, client));
+
+ if ( iconbundle.IsOk() )
+ {
+ return iconbundle;
+ }
+ else
+ {
+ // fall back to single-icon bundle
+ return wxIconBundle(GetIcon(id, client));
+ }
+}
+
+/*static*/
+wxIconBundle wxArtProvider::DoGetIconBundle(const wxArtID& id, const wxArtClient& client)
{
// safety-check against writing client,id,size instead of id,client,size:
- wxASSERT_MSG( client.Last() == _T('C'), _T("invalid 'client' parameter") );
+ wxASSERT_MSG( client.Last() == wxT('C'), wxT("invalid 'client' parameter") );
- wxCHECK_MSG( sm_providers, wxNullIconBundle, _T("no wxArtProvider exists") );
+ wxCHECK_MSG( sm_providers, wxNullIconBundle, wxT("no wxArtProvider exists") );
wxString hashId = wxArtProviderCache::ConstructHashID(id, client);
const wxArtClient& client,
const wxSize& size)
{
- wxCHECK_MSG( sm_providers, wxNullIcon, _T("no wxArtProvider exists") );
-
- // First look for an appropriate icon bundle - this will give us the best icon
- wxIconBundle iconBundle = GetIconBundle(id, client);
- if ( iconBundle.IsOk() )
- return iconBundle.GetIcon(size);
-
- // If there is no icon bundle then look for a bitmap
wxBitmap bmp = GetBitmap(id, client, size);
- if ( !bmp.Ok() )
+
+ if ( !bmp.IsOk() )
return wxNullIcon;
wxIcon icon;
return icon;
}
-#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__)
- #include <gtk/gtk.h>
- extern GtkIconSize wxArtClientToIconSize(const wxArtClient& client);
-#endif // defined(__WXGTK20__) && !defined(__WXUNIVERSAL__)
+/* static */
+wxArtID wxArtProvider::GetMessageBoxIconId(int flags)
+{
+ switch ( flags & wxICON_MASK )
+ {
+ default:
+ wxFAIL_MSG(wxT("incorrect message box icon flags"));
+ // fall through
+
+ case wxICON_ERROR:
+ return wxART_ERROR;
+
+ case wxICON_INFORMATION:
+ return wxART_INFORMATION;
+
+ case wxICON_WARNING:
+ return wxART_WARNING;
+
+ case wxICON_QUESTION:
+ return wxART_QUESTION;
+ }
+}
/*static*/ wxSize wxArtProvider::GetSizeHint(const wxArtClient& client,
bool platform_dependent)
return node->GetData()->DoGetSizeHint(client);
}
- // else return platform dependent size
-
-#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__)
- // Gtk has specific sizes for each client, see artgtk.cpp
- GtkIconSize gtk_size = wxArtClientToIconSize(client);
- // no size hints for this client
- if (gtk_size == GTK_ICON_SIZE_INVALID)
- return wxDefaultSize;
- gint width, height;
- gtk_icon_size_lookup( gtk_size, &width, &height);
- return wxSize(width, height);
-#else // !GTK+ 2
- // NB: These size hints may have to be adjusted per platform
- if (client == wxART_TOOLBAR)
- return wxSize(16, 15);
- else if (client == wxART_MENU)
- return wxSize(16, 15);
- else if (client == wxART_FRAME_ICON)
- return wxSize(16, 15);
- else if (client == wxART_CMN_DIALOG || client == wxART_MESSAGE_BOX)
- return wxSize(32, 32);
- else if (client == wxART_HELP_BROWSER)
- return wxSize(16, 15);
- else if (client == wxART_BUTTON)
- return wxSize(16, 15);
- else // wxART_OTHER or perhaps a user's client, no specified size
- return wxDefaultSize;
-#endif // GTK+ 2/else
+ return GetNativeSizeHint(client);
+}
+
+#ifndef wxHAS_NATIVE_ART_PROVIDER_IMPL
+/*static*/
+wxSize wxArtProvider::GetNativeSizeHint(const wxArtClient& WXUNUSED(client))
+{
+ // rather than returning some arbitrary value that doesn't make much
+ // sense (as 2.8 used to do), tell the caller that we don't have a clue:
+ return wxDefaultSize;
+}
+
+/*static*/
+void wxArtProvider::InitNativeProvider()
+{
+}
+#endif // !wxHAS_NATIVE_ART_PROVIDER_IMPL
+
+
+/* static */
+bool wxArtProvider::HasNativeProvider()
+{
+#ifdef __WXGTK20__
+ return true;
+#else
+ return false;
+#endif
}
// ----------------------------------------------------------------------------
/* static */ void wxArtProvider::InsertProvider(wxArtProvider *provider)
{
- Insert(provider);
+ PushBack(provider);
}
/* static */ bool wxArtProvider::PopProvider()
#endif // WXWIN_COMPATIBILITY_2_6
+#if WXWIN_COMPATIBILITY_2_8
+/* static */ void wxArtProvider::Insert(wxArtProvider *provider)
+{
+ PushBack(provider);
+}
+#endif // WXWIN_COMPATIBILITY_2_8
+
// ============================================================================
// wxArtProviderModule
// ============================================================================
public:
bool OnInit()
{
- wxArtProvider::InitStdProvider();
+ // The order here is such that the native provider will be used first
+ // and the standard one last as all these default providers add
+ // themselves to the bottom of the stack.
wxArtProvider::InitNativeProvider();
+#if wxUSE_ARTPROVIDER_TANGO
+ wxArtProvider::InitTangoProvider();
+#endif // wxUSE_ARTPROVIDER_TANGO
+#if wxUSE_ARTPROVIDER_STD
+ wxArtProvider::InitStdProvider();
+#endif // wxUSE_ARTPROVIDER_STD
return true;
}
void OnExit()