X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1970409e33ce5aa182fa40ea499e532fdbf1982d..fc910c50d983d51c3d0706fc759753ecec57bec0:/src/common/artprov.cpp diff --git a/src/common/artprov.cpp b/src/common/artprov.cpp index 793718faab..908af16369 100644 --- a/src/common/artprov.cpp +++ b/src/common/artprov.cpp @@ -108,7 +108,7 @@ void wxArtProviderCache::Clear() wxArtProviderCache::ConstructHashID(const wxArtID& id, const wxArtClient& client) { - return id + _T('-') + client; + return id + wxT('-') + client; } @@ -117,8 +117,8 @@ wxArtProviderCache::ConstructHashID(const wxArtID& id, 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); } // ============================================================================ @@ -160,7 +160,7 @@ wxArtProvider::~wxArtProvider() sm_providers->Insert(provider); } -/*static*/ void wxArtProvider::Insert(wxArtProvider *provider) +/*static*/ void wxArtProvider::PushBack(wxArtProvider *provider) { CommonAddingProvider(); sm_providers->Append(provider); @@ -168,8 +168,8 @@ wxArtProvider::~wxArtProvider() /*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(); @@ -178,7 +178,7 @@ wxArtProvider::~wxArtProvider() /*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) ) { @@ -204,11 +204,8 @@ wxArtProvider::~wxArtProvider() 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); } } @@ -221,9 +218,9 @@ wxArtProvider::~wxArtProvider() 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); @@ -234,34 +231,73 @@ wxArtProvider::~wxArtProvider() 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); @@ -286,16 +322,9 @@ wxArtProvider::~wxArtProvider() 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; @@ -304,40 +333,28 @@ wxArtProvider::~wxArtProvider() } /* static */ -wxIcon wxArtProvider::GetMessageBoxIcon(int flags) +wxArtID wxArtProvider::GetMessageBoxIconId(int flags) { - wxIcon icon; switch ( flags & wxICON_MASK ) { default: - wxFAIL_MSG(_T("incorrect message box icon flags")); + wxFAIL_MSG(wxT("incorrect message box icon flags")); // fall through case wxICON_ERROR: - icon = wxArtProvider::GetIcon(wxART_ERROR, wxART_MESSAGE_BOX); - break; + return wxART_ERROR; case wxICON_INFORMATION: - icon = wxArtProvider::GetIcon(wxART_INFORMATION, wxART_MESSAGE_BOX); - break; + return wxART_INFORMATION; case wxICON_WARNING: - icon = wxArtProvider::GetIcon(wxART_WARNING, wxART_MESSAGE_BOX); - break; + return wxART_WARNING; case wxICON_QUESTION: - icon = wxArtProvider::GetIcon(wxART_QUESTION, wxART_MESSAGE_BOX); - break; + return wxART_QUESTION; } - - return icon; } -#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) - #include - extern GtkIconSize wxArtClientToIconSize(const wxArtClient& client); -#endif // defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) - /*static*/ wxSize wxArtProvider::GetSizeHint(const wxArtClient& client, bool platform_dependent) { @@ -348,34 +365,33 @@ wxIcon wxArtProvider::GetMessageBoxIcon(int flags) 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 } // ---------------------------------------------------------------------------- @@ -391,7 +407,7 @@ wxIcon wxArtProvider::GetMessageBoxIcon(int flags) /* static */ void wxArtProvider::InsertProvider(wxArtProvider *provider) { - Insert(provider); + PushBack(provider); } /* static */ bool wxArtProvider::PopProvider() @@ -408,6 +424,13 @@ wxIcon wxArtProvider::GetMessageBoxIcon(int flags) #endif // WXWIN_COMPATIBILITY_2_6 +#if WXWIN_COMPATIBILITY_2_8 +/* static */ void wxArtProvider::Insert(wxArtProvider *provider) +{ + PushBack(provider); +} +#endif // WXWIN_COMPATIBILITY_2_8 + // ============================================================================ // wxArtProviderModule // ============================================================================ @@ -417,8 +440,16 @@ class wxArtProviderModule: public wxModule 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()