git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@49034 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
264 lines
5.9 KiB
C++
264 lines
5.9 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: src/mac/carbon/icon.cpp
|
|
// Purpose: wxIcon class
|
|
// Author: Stefan Csomor
|
|
// Modified by:
|
|
// Created: 1998-01-01
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) Stefan Csomor
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "wx/wxprec.h"
|
|
|
|
#include "wx/icon.h"
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/image.h"
|
|
#endif
|
|
|
|
#include "wx/mac/private.h"
|
|
|
|
IMPLEMENT_DYNAMIC_CLASS(wxIcon, wxBitmap)
|
|
|
|
#define M_ICONDATA ((wxIconRefData *)m_refData)
|
|
|
|
|
|
wxIcon::wxIcon()
|
|
{
|
|
}
|
|
|
|
wxIcon::wxIcon( const char bits[], int width, int height )
|
|
{
|
|
wxBitmap bmp( bits, width, height ) ;
|
|
CopyFromBitmap( bmp ) ;
|
|
}
|
|
|
|
wxIcon::wxIcon( const char **bits )
|
|
{
|
|
wxBitmap bmp( bits ) ;
|
|
CopyFromBitmap( bmp ) ;
|
|
}
|
|
|
|
wxIcon::wxIcon( char **bits )
|
|
{
|
|
wxBitmap bmp( bits ) ;
|
|
CopyFromBitmap( bmp ) ;
|
|
}
|
|
|
|
wxIcon::wxIcon(
|
|
const wxString& icon_file, int flags,
|
|
int desiredWidth, int desiredHeight )
|
|
{
|
|
LoadFile( icon_file, (wxBitmapType) flags, desiredWidth, desiredHeight );
|
|
}
|
|
|
|
wxIcon::~wxIcon()
|
|
{
|
|
}
|
|
|
|
WXHICON wxIcon::GetHICON() const
|
|
{
|
|
wxASSERT( Ok() ) ;
|
|
|
|
return (WXHICON) ((wxIconRefData*)m_refData)->GetHICON() ;
|
|
}
|
|
|
|
int wxIcon::GetWidth() const
|
|
{
|
|
wxCHECK_MSG( Ok(), -1, wxT("invalid icon") );
|
|
|
|
return M_ICONDATA->GetWidth();
|
|
}
|
|
|
|
int wxIcon::GetHeight() const
|
|
{
|
|
wxCHECK_MSG( Ok(), -1, wxT("invalid icon") );
|
|
|
|
return M_ICONDATA->GetHeight();
|
|
}
|
|
|
|
int wxIcon::GetDepth() const
|
|
{
|
|
return 32;
|
|
}
|
|
|
|
void wxIcon::SetDepth( int depth )
|
|
{
|
|
}
|
|
|
|
void wxIcon::SetWidth( int width )
|
|
{
|
|
}
|
|
|
|
void wxIcon::SetHeight( int height )
|
|
{
|
|
}
|
|
|
|
bool wxIcon::IsOk() const
|
|
{
|
|
return m_refData != NULL ;
|
|
}
|
|
|
|
bool wxIcon::LoadFile(
|
|
const wxString& filename, wxBitmapType type,
|
|
int desiredWidth, int desiredHeight )
|
|
{
|
|
UnRef();
|
|
|
|
if ( type == wxBITMAP_TYPE_ICON_RESOURCE )
|
|
{
|
|
OSType theId = 0 ;
|
|
|
|
if ( filename == wxT("wxICON_INFORMATION") )
|
|
{
|
|
theId = kAlertNoteIcon ;
|
|
}
|
|
else if ( filename == wxT("wxICON_QUESTION") )
|
|
{
|
|
theId = kAlertCautionIcon ;
|
|
}
|
|
else if ( filename == wxT("wxICON_WARNING") )
|
|
{
|
|
theId = kAlertCautionIcon ;
|
|
}
|
|
else if ( filename == wxT("wxICON_ERROR") )
|
|
{
|
|
theId = kAlertStopIcon ;
|
|
}
|
|
else
|
|
{
|
|
IconRef iconRef = NULL ;
|
|
|
|
// first look in the resource fork
|
|
if ( iconRef == NULL )
|
|
{
|
|
Str255 theName ;
|
|
|
|
wxMacStringToPascal( filename , theName ) ;
|
|
Handle resHandle = GetNamedResource( 'icns' , theName ) ;
|
|
if ( resHandle != 0L )
|
|
{
|
|
IconFamilyHandle iconFamily = (IconFamilyHandle) resHandle ;
|
|
HLock((Handle) iconFamily);
|
|
OSStatus err = GetIconRefFromIconFamilyPtr( *iconFamily, GetHandleSize((Handle) iconFamily), &iconRef );
|
|
HUnlock((Handle) iconFamily);
|
|
wxASSERT_MSG( err == noErr , wxT("Error when constructing icon ref") );
|
|
ReleaseResource( resHandle ) ;
|
|
}
|
|
}
|
|
if ( iconRef == NULL )
|
|
{
|
|
// TODO add other attempts to load it from files etc here
|
|
}
|
|
if ( iconRef )
|
|
{
|
|
m_refData = new wxIconRefData( (WXHICON) iconRef ) ;
|
|
return true ;
|
|
}
|
|
}
|
|
|
|
if ( theId != 0 )
|
|
{
|
|
IconRef iconRef = NULL ;
|
|
verify_noerr( GetIconRef( kOnSystemDisk, kSystemIconsCreator, theId, &iconRef ) ) ;
|
|
if ( iconRef )
|
|
{
|
|
m_refData = new wxIconRefData( (WXHICON) iconRef ) ;
|
|
|
|
return true ;
|
|
}
|
|
}
|
|
|
|
return false ;
|
|
}
|
|
else
|
|
{
|
|
wxBitmapHandler *handler = wxBitmap::FindHandler( type );
|
|
|
|
if ( handler )
|
|
{
|
|
wxBitmap bmp ;
|
|
if ( handler->LoadFile( &bmp , filename, type, desiredWidth, desiredHeight ))
|
|
{
|
|
CopyFromBitmap( bmp ) ;
|
|
|
|
return true ;
|
|
}
|
|
|
|
return false ;
|
|
}
|
|
else
|
|
{
|
|
#if wxUSE_IMAGE
|
|
wxImage loadimage( filename, type );
|
|
if (loadimage.Ok())
|
|
{
|
|
if ( desiredWidth == -1 )
|
|
desiredWidth = loadimage.GetWidth() ;
|
|
if ( desiredHeight == -1 )
|
|
desiredHeight = loadimage.GetHeight() ;
|
|
if ( desiredWidth != loadimage.GetWidth() || desiredHeight != loadimage.GetHeight() )
|
|
loadimage.Rescale( desiredWidth , desiredHeight ) ;
|
|
|
|
wxBitmap bmp( loadimage );
|
|
CopyFromBitmap( bmp ) ;
|
|
|
|
return true;
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
return true ;
|
|
}
|
|
|
|
void wxIcon::CopyFromBitmap( const wxBitmap& bmp )
|
|
{
|
|
UnRef() ;
|
|
|
|
// as the bitmap owns that ref, we have to acquire it as well
|
|
IconRef iconRef = bmp.GetBitmapData()->GetIconRef() ;
|
|
AcquireIconRef( iconRef ) ;
|
|
|
|
m_refData = new wxIconRefData( (WXHICON) iconRef ) ;
|
|
M_ICONDATA->SetWidth( bmp.GetWidth() ) ;
|
|
M_ICONDATA->SetHeight( bmp.GetHeight() ) ;
|
|
}
|
|
|
|
wxIconRefData::wxIconRefData( WXHICON icon )
|
|
{
|
|
m_iconRef = MAC_WXHICON( icon ) ;
|
|
|
|
// Standard sizes
|
|
SetWidth( 32 ) ;
|
|
SetHeight( 32 ) ;
|
|
}
|
|
|
|
void wxIconRefData::Init()
|
|
{
|
|
m_iconRef = NULL ;
|
|
}
|
|
|
|
void wxIconRefData::Free()
|
|
{
|
|
if ( m_iconRef )
|
|
{
|
|
ReleaseIconRef( m_iconRef ) ;
|
|
m_iconRef = NULL ;
|
|
}
|
|
}
|
|
|
|
IMPLEMENT_DYNAMIC_CLASS(wxICONResourceHandler, wxBitmapHandler)
|
|
|
|
bool wxICONResourceHandler::LoadFile(
|
|
wxBitmap *bitmap, const wxString& name, long flags,
|
|
int desiredWidth, int desiredHeight )
|
|
{
|
|
wxIcon icon ;
|
|
icon.LoadFile( name , wxBITMAP_TYPE_ICON_RESOURCE , desiredWidth , desiredHeight ) ;
|
|
bitmap->CopyFromIcon( icon ) ;
|
|
|
|
return bitmap->Ok() ;
|
|
}
|
|
|