]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/carbon/icon.cpp
Add association between wxOSX wxTextWidgetImpl and wxTextEntry.
[wxWidgets.git] / src / osx / carbon / icon.cpp
index 704608f33ed209b70c0848f2788a04907daa9892..e156e55a183923bd09f34bd532ecb1781bede9b4 100644 (file)
@@ -11,6 +11,8 @@
 
 #include "wx/wxprec.h"
 
+#if wxOSX_USE_COCOA_OR_CARBON
+
 #include "wx/icon.h"
 
 #ifndef WX_PRECOMP
@@ -165,182 +167,248 @@ void wxIcon::SetHeight( int WXUNUSED(height) )
 {
 }
 
+// Load an icon based on resource name or filel name
+// Return true on success, false otherwise
 bool wxIcon::LoadFile(
     const wxString& filename, wxBitmapType type,
     int desiredWidth, int desiredHeight )
+{
+    if( type == wxBITMAP_TYPE_ICON_RESOURCE )
+    {
+        if( LoadIconFromSystemResource( filename, desiredWidth, desiredHeight ) )
+            return true;
+        else
+            return LoadIconFromBundleResource( filename, desiredWidth, desiredHeight );
+    }
+    else  if( type == wxBITMAP_TYPE_ICON )
+    {
+        return LoadIconFromFile( filename, desiredWidth, desiredHeight );
+    }
+    else
+    {
+        return LoadIconAsBitmap( filename, type, desiredWidth, desiredHeight );
+    }
+}
+
+// Load a well known system icon by its wxWidgets identifier
+// Returns true on success, false otherwise
+bool wxIcon::LoadIconFromSystemResource(const wxString& resourceName, int desiredWidth, int desiredHeight)
 {
     UnRef();
 
-    if ( type == wxBITMAP_TYPE_ICON_RESOURCE )
+    OSType theId = 0 ;
+
+    if ( resourceName == wxT("wxICON_INFORMATION") )
+    {
+        theId = kAlertNoteIcon ;
+    }
+    else if ( resourceName == wxT("wxICON_QUESTION") )
+    {
+        theId = kAlertCautionIcon ;
+    }
+    else if ( resourceName == wxT("wxICON_WARNING") )
+    {
+        theId = kAlertCautionIcon ;
+    }
+    else if ( resourceName == wxT("wxICON_ERROR") )
+    {
+        theId = kAlertStopIcon ;
+    }
+    else if ( resourceName == wxT("wxICON_FOLDER") )
+    {
+        theId = kGenericFolderIcon ;
+    }
+    else if ( resourceName == wxT("wxICON_FOLDER_OPEN") )
+    {
+        theId = kOpenFolderIcon ;
+    }
+    else if ( resourceName == wxT("wxICON_NORMAL_FILE") )
+    {
+        theId = kGenericDocumentIcon ;
+    }
+    else if ( resourceName == wxT("wxICON_EXECUTABLE_FILE") )
+    {
+        theId = kGenericApplicationIcon ;
+    }
+    else if ( resourceName == wxT("wxICON_CDROM") )
+    {
+        theId = kGenericCDROMIcon ;
+    }
+    else if ( resourceName == wxT("wxICON_FLOPPY") )
+    {
+        theId = kGenericFloppyIcon ;
+    }
+    else if ( resourceName == wxT("wxICON_HARDDISK") )
+    {
+        theId = kGenericHardDiskIcon ;
+    }
+    else if ( resourceName == wxT("wxICON_REMOVABLE") )
+    {
+        theId = kGenericRemovableMediaIcon ;
+    }
+    else if ( resourceName == wxT("wxICON_DELETE") )
     {
-        OSType theId = 0 ;
+        theId = kToolbarDeleteIcon ;
+    }
+    else if ( resourceName == wxT("wxICON_GO_BACK") )
+    {
+        theId = kBackwardArrowIcon ;
+    }
+    else if ( resourceName == wxT("wxICON_GO_FORWARD") )
+    {
+        theId = kForwardArrowIcon ;
+    }
+    else if ( resourceName == wxT("wxICON_GO_HOME") )
+    {
+        theId = kToolbarHomeIcon ;
+    }
+    else if ( resourceName == wxT("wxICON_HELP_SETTINGS") )
+    {
+        theId = kGenericFontIcon ;
+    }
+    else if ( resourceName == wxT("wxICON_HELP_PAGE") )
+    {
+        theId = kGenericDocumentIcon ;
+    }
 
-        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 if ( filename == wxT("wxICON_FOLDER") )
-        {
-            theId = kGenericFolderIcon ;
-        }
-        else if ( filename == wxT("wxICON_FOLDER_OPEN") )
-        {
-            theId = kOpenFolderIcon ;
-        }
-        else if ( filename == wxT("wxICON_NORMAL_FILE") )
-        {
-            theId = kGenericDocumentIcon ;
-        }
-        else if ( filename == wxT("wxICON_CDROM") )
-        {
-            theId = kGenericCDROMIcon ;
-        }
-        else if ( filename == wxT("wxICON_FLOPPY") )
-        {
-            theId = kGenericFloppyIcon ;
-        }
-        else if ( filename == wxT("wxICON_HARDDISK") )
-        {
-            theId = kGenericHardDiskIcon ;
-        }
-        else if ( filename == wxT("wxICON_REMOVABLE") )
-        {
-            theId = kGenericRemovableMediaIcon ;
-        }
-        else if ( filename == wxT("wxICON_DELETE") )
-        {
-            theId = kTrashIcon ;
-        }
-        else if ( filename == wxT("wxICON_GO_BACK") )
-        {
-            theId = kBackwardArrowIcon ;
-        }
-        else if ( filename == wxT("wxICON_GO_FORWARD") )
-        {
-            theId = kForwardArrowIcon ;
-        }
-        else if ( filename == wxT("wxICON_GO_HOME") )
-        {
-            theId = kUserFolderIcon ;
-        }
-        else if ( filename == wxT("wxICON_HELP_FOLDER") )
-        {
-            theId = kHelpFolderIcon ;
-        }
-        else if ( filename == wxT("wxICON_HELP_SETTINGS") )
-        {
-            theId = kGenericFontIcon ;
-        }
-        else if ( filename == wxT("wxICON_HELP_PAGE") )
-        {
-            theId = kGenericDocumentIcon ;
-        }
-        else if ( filename == wxT("wxICON_PRINT") )
+    if ( theId != 0 )
+    {
+        IconRef iconRef = NULL ;
+        verify_noerr( GetIconRef( kOnSystemDisk, kSystemIconsCreator, theId, &iconRef ) ) ;
+        if ( iconRef )
         {
-            theId = kPrintMonitorFolderIcon ;
+            m_refData = new wxIconRefData( (WXHICON) iconRef, desiredWidth, desiredHeight ) ;
+            return true ;
         }
-        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);
-                    if ( err != noErr )
-                    {
-                        wxFAIL_MSG("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, desiredWidth, desiredHeight ) ;
-                return true ;
-               }
-        }
+    return false;
+}
+
+// Load an icon of type 'icns' by resource by name
+// The resource must exist in one of the currently accessible bundles
+// (usually this means the application bundle for the current application)
+// Return true on success, false otherwise
+bool wxIcon::LoadIconFromBundleResource(const wxString& resourceName, int desiredWidth, int desiredHeight)
+{
+    UnRef();
 
-        if ( theId != 0 )
+    IconRef iconRef = NULL ;
+
+    // first look in the resource fork
+    if ( iconRef == NULL )
+    {
+        Str255 theName ;
+
+        wxMacStringToPascal( resourceName , theName ) ;
+        Handle resHandle = GetNamedResource( 'icns' , theName ) ;
+        if ( resHandle != 0L )
         {
-            IconRef iconRef = NULL ;
-            verify_noerr( GetIconRef( kOnSystemDisk, kSystemIconsCreator, theId, &iconRef ) ) ;
-            if ( iconRef )
-            {
-                m_refData = new wxIconRefData( (WXHICON) iconRef, desiredWidth, desiredHeight ) ;
+            IconFamilyHandle iconFamily = (IconFamilyHandle) resHandle ;
+            OSStatus err = GetIconRefFromIconFamilyPtr( *iconFamily, GetHandleSize((Handle) iconFamily), &iconRef );
 
-                return true ;
+            if ( err != noErr )
+            {
+                wxFAIL_MSG("Error when constructing icon ref");
             }
+
+            ReleaseResource( resHandle ) ;
         }
+    }
 
-        return false ;
+    if ( iconRef )
+    {
+        m_refData = new wxIconRefData( (WXHICON) iconRef, desiredWidth, desiredHeight );
+        return true;
     }
-    else
+
+   return false;
+}
+
+// Load an icon from an icon file using the underlying OS X API
+// The icon file must be in a format understood by the OS
+// Return true for success, false otherwise
+bool wxIcon::LoadIconFromFile(const wxString& filename, int desiredWidth, int desiredHeight)
+{
+    UnRef();
+
+    OSStatus err;
+    bool result = false;
+
+    // Get a file system reference
+    FSRef fsRef;
+    err = FSPathMakeRef( (const wxUint8*)filename.utf8_str().data(), &fsRef, NULL );
+
+    if( err != noErr )
+        return false;
+
+    // Get a handle on the icon family
+    IconFamilyHandle iconFamily;
+    err = ReadIconFromFSRef( &fsRef, &iconFamily );
+
+    if( err != noErr )
+        return false;
+
+    // Get the icon reference itself
+    IconRef iconRef;
+    err = GetIconRefFromIconFamilyPtr( *iconFamily, GetHandleSize((Handle) iconFamily), &iconRef );
+
+    if( err == noErr )
     {
-        wxBitmapHandler *handler = wxBitmap::FindHandler( type );
+        // If everthing is OK, assign m_refData
+        m_refData = new wxIconRefData( (WXHICON) iconRef, desiredWidth, desiredHeight );
+        result = true;
+    }
 
-        if ( handler )
-        {
-            wxBitmap bmp ;
-            if ( handler->LoadFile( &bmp , filename, type, desiredWidth, desiredHeight ))
-            {
-                CopyFromBitmap( bmp ) ;
+    // Release the iconFamily before returning
+    ReleaseResource( (Handle) iconFamily );
+    return result;
+}
 
-                return true ;
-            }
+// Load an icon from a file using functionality from wxWidgets
+// A suitable bitmap handler (or image handler) must be available
+// Return true on success, false otherwise
+bool wxIcon::LoadIconAsBitmap(const wxString& filename, wxBitmapType type, int desiredWidth, int desiredHeight)
+{
+    UnRef();
 
-            return false ;
-        }
-        else
+    wxBitmapHandler *handler = wxBitmap::FindHandler( type );
+
+    if ( handler )
+    {
+        wxBitmap bmp ;
+        if ( handler->LoadFile( &bmp , filename, type, desiredWidth, desiredHeight ))
         {
+            CopyFromBitmap( bmp ) ;
+            return true ;
+        }
+    }
+
 #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 ) ;
+    else
+    {
+        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 ) ;
+            wxBitmap bmp( loadimage );
+            CopyFromBitmap( bmp ) ;
 
-                return true;
-            }
-#endif
+            return true;
         }
     }
-    return true ;
+#endif
+
+    return false;
 }
 
+
 void wxIcon::CopyFromBitmap( const wxBitmap& bmp )
 {
     UnRef() ;
@@ -357,9 +425,13 @@ bool  wxICONResourceHandler::LoadFile(
     int desiredWidth, int desiredHeight )
 {
     wxIcon icon ;
-    icon.LoadFile( name , wxBITMAP_TYPE_ICON_RESOURCE , desiredWidth , desiredHeight ) ;
-    bitmap->CopyFromIcon( icon ) ;
-
-    return bitmap->Ok() ;
+    if ( icon.LoadFile( name , wxBITMAP_TYPE_ICON_RESOURCE , desiredWidth , desiredHeight ) )
+    {
+        bitmap->CopyFromIcon( icon ) ;
+        return bitmap->Ok() ;
+    }
+    return false;
 }
 
+#endif
+