]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/taskbar.cpp
wxExecuteData is a struct, not class (warning fix)
[wxWidgets.git] / src / mac / carbon / taskbar.cpp
index 2d78d89fdc2716fdb54d69a00d97583f998f2151..523bd6252466476fe73b9bdb56554b21954f9737 100644 (file)
 #include "wx/menu.h"
 #include "wx/icon.h"
 
-#if 0
-
-#include "wx/frame.h"
-#include "wx/dialog.h"
-
-#endif
-
 //
 //TODO:  Implement  Apple Software Guidelines - show the top window it it's not shown,
 //and force it to be unminimized - and all unminimized windows should be brought to 
 //the front
-//http://developer.apple.com/documentation/MacOSX/Conceptual/AppleSWDesign/MacOSXEnvironment/chapter_6_section_4.html
+//
 //TODO:
 IMPLEMENT_DYNAMIC_CLASS(wxTaskBarIcon, wxEvtHandler)
 
@@ -97,72 +90,86 @@ pascal OSStatus wxDockEventHandler( EventHandlerCallRef inHandlerCallRef,
     }
     
     wxASSERT(eventClass == kEventClassApplication && eventKind == kEventAppGetDockTileMenu);
-       
-       //set the internal event
-       pTB->SetInternalEvent(inEvent);
-       
+                       
        //process the right click event
        wxTaskBarIconEvent evt(wxEVT_TASKBAR_RIGHT_UP,NULL);
        pTB->ProcessEvent(evt);
                
-       //set the internal event
-       pTB->SetInternalEvent(NULL);
+    //create popup menu
+    wxMenu* menu = pTB->DoCreatePopupMenu();
+    
+    OSStatus err = noErr;
+
+    if(menu)
+    {
+        //note to self - a MenuRef IS A MenuHandle
+        MenuRef hMenu = MAC_WXHMENU(menu->GetHMenu());
+
+        //When we call SetEventParameter it will decrement
+        //the reference count of the menu - we need to make
+        //sure it stays around in the wxMenu class here
+        RetainMenu(hMenu);
 
-       return noErr;
+        //set the actual dock menu
+        err = SetEventParameter((EventRef) inEvent, kEventParamMenuRef, 
+                                       typeMenuRef, sizeof(MenuRef), 
+                                        &hMenu);
+        wxASSERT(err == 0);
+    }
+
+       return err;
 }
 
 DEFINE_ONE_SHOT_HANDLER_GETTER( wxDockEventHandler );
 
 wxTaskBarIcon::wxTaskBarIcon(const wxTaskBarIconType& nType)
-    : m_nType(nType), m_pEvent(NULL), m_pMenu(NULL), m_iconAdded(false)
+    : m_nType(nType), m_pEventHandlerRef(NULL), m_pMenu(NULL), m_iconAdded(false)
 {
     //Register the events that will return the dock menu
        EventTypeSpec tbEventList[] = { { kEventClassCommand, kEventProcessCommand },
                                     { kEventClassApplication, kEventAppGetDockTileMenu } };
        
-       OSStatus err = InstallApplicationEventHandler(
+#ifdef __WXDEBUG__
+       OSStatus err =
+#endif
+      InstallApplicationEventHandler(
             GetwxDockEventHandlerUPP(),
             GetEventTypeCount(tbEventList), tbEventList, 
-                       this, NULL);
+                       this, (&(EventHandlerRef&)m_pEventHandlerRef));
                        
        wxASSERT(err == noErr);
 }
+
 wxTaskBarIcon::~wxTaskBarIcon()
 {
-       //TODO:uninstall event handler
+    RemoveEventHandler((EventHandlerRef&)m_pEventHandlerRef);
 }
 
-void wxTaskBarIcon::SetInternalEvent(void* pEvent)
+wxMenu* wxTaskBarIcon::GetCurrentMenu()
 {
-       m_pEvent = pEvent;
+    return m_pMenu;
 }
 
-wxMenu* wxTaskBarIcon::GetCurrentMenu()
+wxMenu* wxTaskBarIcon::DoCreatePopupMenu()
 {
+    if (m_pMenu)
+        delete m_pMenu;
+
+    m_pMenu = CreatePopupMenu();
+    
+    if (m_pMenu)
+        m_pMenu->SetEventHandler(this);
+    
     return m_pMenu;
 }
 
 // Operations:
 bool wxTaskBarIcon::SetIcon(const wxIcon& icon, const wxString& tooltip)
 {
-    #if 0
-    wxASSERT(wxTheApp);
-    wxWindow* pTopWindow = wxTheApp->GetTopWindow();
-    
-    wxASSERT(pTopWindow);
-    
-    if(pTopWindow->IsKindOf(CLASSINFO(wxDialog)))
-        ((wxDialog*)pTopWindow)->SetIcon(icon);
-    else
-    {
-        wxASSERT(pTopWindow->IsKindOf(CLASSINFO(wxFrame)));
-        ((wxFrame*)pTopWindow)->SetIcon(icon);
-    }
-    
-    return true;
-    #else
     //TODO: (IT WORKS!)  Make work without mask - mayby by using a wxDC?
     
+    wxASSERT(icon.GetMask() != NULL);
+    
        CGImageRef pImage;
        //create the icon from the bitmap and mask bitmap contained within
        OSStatus err = CreateCGImageFromPixMaps(
@@ -181,7 +188,6 @@ bool wxTaskBarIcon::SetIcon(const wxIcon& icon, const wxString& tooltip)
         CGImageRelease(pImage);
 
        return m_iconAdded = err == noErr;
-    #endif
 }
        
 bool wxTaskBarIcon::RemoveIcon()
@@ -194,29 +200,15 @@ bool wxTaskBarIcon::RemoveIcon()
        
 bool wxTaskBarIcon::PopupMenu(wxMenu *menu)
 {
-       wxASSERT(m_pEvent != NULL);
-    
     if (m_pMenu)
         delete m_pMenu;
-        
+    
     m_pMenu = menu;
-    menu->SetEventHandler(this);
-
-       //note to self - a MenuRef IS A MenuHandle
-       MenuRef hMenu = MAC_WXHMENU(menu->GetHMenu());
-
-       //When we call SetEventParameter it will decrement
-       //the reference count of the menu - we need to make
-       //sure it stays around in the wxMenu class here
-       RetainMenu(hMenu);
-
-       //set the actual dock menu
-       OSStatus err = SetEventParameter((EventRef) m_pEvent, kEventParamMenuRef, 
-                                       typeMenuRef, sizeof(MenuRef), 
-                                        &hMenu);
-       wxASSERT(err == 0);
-       
-       return err == noErr;
+    
+    wxASSERT(menu);
+    m_pMenu->SetEventHandler(this);
+    
+    return SetApplicationDockTileMenu(MAC_WXHMENU(menu->GetHMenu()));
 }
 
 #endif //wxHAS_TASK_BAR_ICON