| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: src/generic/imaglist.cpp
- // Purpose:
- // Author: Robert Roebling
- // Copyright: (c) 1998 Robert Roebling
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- // For compilers that support precompilation, includes "wx.h".
- #include "wx/wxprec.h"
- #ifdef __BORLANDC__
- #pragma hdrstop
- #endif
- #if wxUSE_IMAGLIST && !defined(wxHAS_NATIVE_IMAGELIST)
- #include "wx/imaglist.h"
- #ifndef WX_PRECOMP
- #include "wx/dc.h"
- #include "wx/icon.h"
- #include "wx/image.h"
- #endif
- //-----------------------------------------------------------------------------
- // wxImageList
- //-----------------------------------------------------------------------------
- IMPLEMENT_DYNAMIC_CLASS(wxGenericImageList, wxObject)
- IMPLEMENT_DYNAMIC_CLASS(wxImageList, wxGenericImageList)
- wxGenericImageList::wxGenericImageList( int width, int height, bool mask, int initialCount )
- {
- (void)Create(width, height, mask, initialCount);
- }
- wxGenericImageList::~wxGenericImageList()
- {
- (void)RemoveAll();
- }
- int wxGenericImageList::GetImageCount() const
- {
- return m_images.GetCount();
- }
- bool wxGenericImageList::Create( int width, int height, bool WXUNUSED(mask), int WXUNUSED(initialCount) )
- {
- m_width = width;
- m_height = height;
- return Create();
- }
- bool wxGenericImageList::Create()
- {
- return true;
- }
- int wxGenericImageList::Add( const wxBitmap &bitmap )
- {
- wxASSERT_MSG( (bitmap.GetWidth() >= m_width && bitmap.GetHeight() == m_height)
- || (m_width == 0 && m_height == 0),
- wxT("invalid bitmap size in wxImageList: this might work ")
- wxT("on this platform but definitely won't under Windows.") );
- const int index = int(m_images.GetCount());
- if (bitmap.IsKindOf(wxCLASSINFO(wxIcon)))
- {
- m_images.Append( new wxIcon( (const wxIcon&) bitmap ) );
- }
- else
- {
- // Mimic behaviour of Windows ImageList_Add that automatically breaks up the added
- // bitmap into sub-images of the correct size
- if (m_width > 0 && bitmap.GetWidth() > m_width && bitmap.GetHeight() >= m_height)
- {
- int numImages = bitmap.GetWidth() / m_width;
- for (int subIndex = 0; subIndex < numImages; subIndex++)
- {
- wxRect rect(m_width * subIndex, 0, m_width, m_height);
- wxBitmap tmpBmp = bitmap.GetSubBitmap(rect);
- m_images.Append( new wxBitmap(tmpBmp) );
- }
- }
- else
- {
- m_images.Append( new wxBitmap(bitmap) );
- }
- }
- if (m_width == 0 && m_height == 0)
- {
- m_width = bitmap.GetWidth();
- m_height = bitmap.GetHeight();
- }
- return index;
- }
- int wxGenericImageList::Add( const wxBitmap& bitmap, const wxBitmap& mask )
- {
- wxBitmap bmp(bitmap);
- if (mask.IsOk())
- bmp.SetMask(new wxMask(mask));
- return Add(bmp);
- }
- int wxGenericImageList::Add( const wxBitmap& bitmap, const wxColour& maskColour )
- {
- wxImage img = bitmap.ConvertToImage();
- img.SetMaskColour(maskColour.Red(), maskColour.Green(), maskColour.Blue());
- return Add(wxBitmap(img));
- }
- const wxBitmap *wxGenericImageList::GetBitmapPtr( int index ) const
- {
- wxObjectList::compatibility_iterator node = m_images.Item( index );
- wxCHECK_MSG( node, NULL, wxT("wrong index in image list") );
- return (wxBitmap*)node->GetData();
- }
- // Get the bitmap
- wxBitmap wxGenericImageList::GetBitmap(int index) const
- {
- const wxBitmap* bmp = GetBitmapPtr(index);
- if (bmp)
- return *bmp;
- else
- return wxNullBitmap;
- }
- // Get the icon
- wxIcon wxGenericImageList::GetIcon(int index) const
- {
- const wxBitmap* bmp = GetBitmapPtr(index);
- if (bmp)
- {
- wxIcon icon;
- icon.CopyFromBitmap(*bmp);
- return icon;
- }
- else
- return wxNullIcon;
- }
- bool wxGenericImageList::Replace( int index, const wxBitmap &bitmap )
- {
- wxObjectList::compatibility_iterator node = m_images.Item( index );
- wxCHECK_MSG( node, false, wxT("wrong index in image list") );
- wxBitmap* newBitmap = (bitmap.IsKindOf(wxCLASSINFO(wxIcon))) ?
- #if defined(__VISAGECPP__)
- //just can't do this in VisualAge now, with all this new Bitmap-Icon stuff
- //so construct it from a bitmap object until I can figure this nonsense out. (DW)
- new wxBitmap(bitmap)
- #else
- new wxBitmap( (const wxIcon&) bitmap )
- #endif
- : new wxBitmap(bitmap) ;
- if (index == (int) m_images.GetCount() - 1)
- {
- delete node->GetData();
- m_images.Erase( node );
- m_images.Append( newBitmap );
- }
- else
- {
- wxObjectList::compatibility_iterator next = node->GetNext();
- delete node->GetData();
- m_images.Erase( node );
- m_images.Insert( next, newBitmap );
- }
- return true;
- }
- bool wxGenericImageList::Replace( int index, const wxBitmap &bitmap, const wxBitmap &mask )
- {
- wxObjectList::compatibility_iterator node = m_images.Item( index );
- wxCHECK_MSG( node, false, wxT("wrong index in image list") );
- wxBitmap* newBitmap = (bitmap.IsKindOf(wxCLASSINFO(wxIcon))) ?
- #if defined(__VISAGECPP__)
- //just can't do this in VisualAge now, with all this new Bitmap-Icon stuff
- //so construct it from a bitmap object until I can figure this nonsense out. (DW)
- new wxBitmap(bitmap)
- #else
- new wxBitmap( (const wxIcon&) bitmap )
- #endif
- : new wxBitmap(bitmap) ;
- if (index == (int) m_images.GetCount() - 1)
- {
- delete node->GetData();
- m_images.Erase( node );
- m_images.Append( newBitmap );
- }
- else
- {
- wxObjectList::compatibility_iterator next = node->GetNext();
- delete node->GetData();
- m_images.Erase( node );
- m_images.Insert( next, newBitmap );
- }
- if (mask.IsOk())
- newBitmap->SetMask(new wxMask(mask));
- return true;
- }
- bool wxGenericImageList::Remove( int index )
- {
- wxObjectList::compatibility_iterator node = m_images.Item( index );
- wxCHECK_MSG( node, false, wxT("wrong index in image list") );
- delete node->GetData();
- m_images.Erase( node );
- return true;
- }
- bool wxGenericImageList::RemoveAll()
- {
- WX_CLEAR_LIST(wxObjectList, m_images);
- m_images.Clear();
- return true;
- }
- bool wxGenericImageList::GetSize( int index, int &width, int &height ) const
- {
- width = 0;
- height = 0;
- wxObjectList::compatibility_iterator node = m_images.Item( index );
- wxCHECK_MSG( node, false, wxT("wrong index in image list") );
- wxBitmap *bm = (wxBitmap*)node->GetData();
- width = bm->GetWidth();
- height = bm->GetHeight();
- return true;
- }
- bool wxGenericImageList::Draw( int index, wxDC &dc, int x, int y,
- int flags, bool WXUNUSED(solidBackground) )
- {
- wxObjectList::compatibility_iterator node = m_images.Item( index );
- wxCHECK_MSG( node, false, wxT("wrong index in image list") );
- wxBitmap *bm = (wxBitmap*)node->GetData();
- if (bm->IsKindOf(wxCLASSINFO(wxIcon)))
- dc.DrawIcon( * ((wxIcon*) bm), x, y);
- else
- dc.DrawBitmap( *bm, x, y, (flags & wxIMAGELIST_DRAW_TRANSPARENT) > 0 );
- return true;
- }
- #endif // wxUSE_IMAGLIST
|