X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2a230426807715c54b6fdcf410e3678ee0dfada6..5e1d513ea393c769cc83e4bc69cec34c3d0a9507:/src/common/iconbndl.cpp?ds=sidebyside diff --git a/src/common/iconbndl.cpp b/src/common/iconbndl.cpp index 676ff07f12..825a6431e6 100644 --- a/src/common/iconbndl.cpp +++ b/src/common/iconbndl.cpp @@ -8,14 +8,6 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -// ============================================================================ -// declarations -// ============================================================================ - -// ---------------------------------------------------------------------------- -// headers -// ---------------------------------------------------------------------------- - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -27,20 +19,19 @@ #ifndef WX_PRECOMP #include "wx/settings.h" - #include "wx/icon.h" #include "wx/log.h" #include "wx/intl.h" #include "wx/bitmap.h" #include "wx/image.h" + #include "wx/stream.h" #endif #include "wx/arrimpl.cpp" - WX_DEFINE_OBJARRAY(wxIconArray) IMPLEMENT_DYNAMIC_CLASS(wxIconBundle, wxGDIObject) -#define M_ICONBUNDLEDATA ((wxIconBundleRefData *)m_refData) +#define M_ICONBUNDLEDATA static_cast(m_refData) // ---------------------------------------------------------------------------- // wxIconBundleRefData @@ -53,10 +44,7 @@ public: virtual bool IsOk() const { return !m_icons.empty(); } -protected: wxIconArray m_icons; - - friend class wxIconBundle; }; // ============================================================================ @@ -64,21 +52,22 @@ protected: // ============================================================================ wxIconBundle::wxIconBundle() - : wxGDIObject() { } -wxIconBundle::wxIconBundle(const wxString& file, long type) +wxIconBundle::wxIconBundle(const wxString& file, wxBitmapType type) : wxGDIObject() { AddIcon(file, type); } -wxIconBundle::wxIconBundle(const wxIconBundle& icon) +#if wxUSE_STREAMS +wxIconBundle::wxIconBundle(wxInputStream& stream, wxBitmapType type) : wxGDIObject() { - Ref(icon); + AddIcon(stream, type); } +#endif // wxUSE_STREAMS wxIconBundle::wxIconBundle(const wxIcon& icon) : wxGDIObject() @@ -93,7 +82,7 @@ wxGDIRefData *wxIconBundle::CreateGDIRefData() const wxGDIRefData *wxIconBundle::CloneGDIRefData(const wxGDIRefData *data) const { - return new wxIconBundleRefData(*wx_static_cast(const wxIconBundleRefData *, data)); + return new wxIconBundleRefData(*static_cast(data)); } void wxIconBundle::DeleteIcons() @@ -101,44 +90,71 @@ void wxIconBundle::DeleteIcons() UnRef(); } -void wxIconBundle::AddIcon(const wxString& file, long type) +namespace { -#ifdef __WXMAC__ - // Deal with standard icons - if ( type == wxBITMAP_TYPE_ICON_RESOURCE ) - { - wxIcon tmp(file, type); - if (tmp.Ok()) - { - AddIcon(tmp); - return; - } - } -#endif // __WXMAC__ +// Adds icon from 'input' to the bundle. Shows 'errorMessage' on failure +// (it must contain "%d", because it is used to report # of image in the file +// that failed to load): +template +void DoAddIcon(wxIconBundle& bundle, + T& input, wxBitmapType type, + const wxString& errorMessage) +{ #if wxUSE_IMAGE && (!defined(__WXMSW__) || wxUSE_WXDIB) wxImage image; - const size_t count = wxImage::GetImageCount( file, type ); + const size_t count = wxImage::GetImageCount(input, type); for ( size_t i = 0; i < count; ++i ) { - if ( !image.LoadFile( file, type, i ) ) + if ( !image.LoadFile(input, type, i) ) { - wxLogError( _("Failed to load image %d from file '%s'."), - i, file.c_str() ); + wxLogError(errorMessage, i); continue; } wxIcon tmp; tmp.CopyFromBitmap(wxBitmap(image)); - AddIcon(tmp); + bundle.AddIcon(tmp); } #else // !wxUSE_IMAGE - wxUnusedVar(file); + wxUnusedVar(input); wxUnusedVar(type); #endif // wxUSE_IMAGE/!wxUSE_IMAGE } +} // anonymous namespace + +void wxIconBundle::AddIcon(const wxString& file, wxBitmapType type) +{ +#ifdef __WXMAC__ + // Deal with standard icons + if ( type == wxBITMAP_TYPE_ICON_RESOURCE ) + { + wxIcon tmp(file, type); + if (tmp.Ok()) + { + AddIcon(tmp); + return; + } + } +#endif // __WXMAC__ + + DoAddIcon + ( + *this, + file, type, + wxString::Format(_("Failed to load image %%d from file '%s'."), file) + ); +} + +#if wxUSE_STREAMS +void wxIconBundle::AddIcon(wxInputStream& stream, wxBitmapType type) +{ + DoAddIcon(*this, stream, type, _("Failed to load image %d from stream.")); +} +#endif // wxUSE_STREAMS + wxIcon wxIconBundle::GetIcon(const wxSize& size) const { const size_t count = GetIconCount(); @@ -181,7 +197,7 @@ wxIcon wxIconBundle::GetIcon(const wxSize& size) const } } -#ifdef __WXMAC__ +#if defined( __WXMAC__ ) && wxOSX_USE_CARBON return wxIcon(iconBest.GetHICON(), size); #else return iconBest; @@ -237,4 +253,3 @@ wxIcon wxIconBundle::GetIconByIndex(size_t n) const return M_ICONBUNDLEDATA->m_icons[n]; } -