]> git.saurik.com Git - wxWidgets.git/blobdiff - src/cocoa/toolbar.mm
linking fix for wxUSE_VALIDATORS==0
[wxWidgets.git] / src / cocoa / toolbar.mm
index 03b84d6b63ace4e6df73c0cf6661456c52861c06..7d923ed9c284c30fc43528e9a0a489c74245ac46 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     2003/08/17
 // RCS-ID:      $Id$
 // Copyright:   (c) 2003 David Elliott
-// Licence:    wxWindows licence
+// Licence:     wxWidgets licence
 /////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
 #include "wx/wxprec.h"
 
 #if wxUSE_TOOLBAR_NATIVE
+
+#include "wx/toolbar.h"
+
 #ifndef WX_PRECOMP
-    #include "wx/toolbar.h"
     #include "wx/frame.h"
     #include "wx/log.h"
 #endif // WX_PRECOMP
 
 #include <math.h>
 
-DECLARE_WXCOCOA_OBJC_CLASS(NSActionCell);
-
-// ========================================================================
-// wxCocoaNSActionCell
-// ========================================================================
-WX_DECLARE_OBJC_HASHMAP(NSActionCell);
-
-class wxCocoaNSActionCell
-{
-    WX_DECLARE_OBJC_INTERFACE(NSActionCell)
-public:
-    virtual void CocoaTarget_wxNSActionCellAction() {}
-protected:
-    static struct objc_object *sm_cocoaTarget;
-};
-
-// ============================================================================
-// @class wxNSActionCellTarget
-// ============================================================================
-@interface wxNSActionCellTarget : NSObject
-{
-}
-
-- (void)wxNSActionCellAction: (id)sender;
-@end //interface wxNSActionCellTarget
-
-@implementation wxNSActionCellTarget : NSObject
-
-- (void)wxNSActionCellAction: (id)sender
-{
-    wxLogDebug("wxNSActionCellAction");
-    wxCocoaNSActionCell *wxcontrol = wxCocoaNSActionCell::GetFromCocoa(sender);
-    wxCHECK_RET(wxcontrol,"wxNSActionCellAction received but no wxCocoaNSActionCell exists!");
-    wxcontrol->CocoaTarget_wxNSActionCellAction();
-}
-
-@end //implementation wxNSActionCellTarget
-
-// ========================================================================
-// wxCocoaNSActionCell
-// ========================================================================
-struct objc_object *wxCocoaNSActionCell::sm_cocoaTarget = [[wxNSActionCellTarget alloc] init];
-WX_IMPLEMENT_OBJC_INTERFACE(NSActionCell)
-
 // ========================================================================
 // wxToolBarTool
 // ========================================================================
-class wxToolBarTool : public wxToolBarToolBase, protected wxCocoaNSActionCell
+class wxToolBarTool : public wxToolBarToolBase
 {
 public:
     wxToolBarTool(wxToolBar *tbar, int toolid, const wxString& label,
@@ -102,8 +60,8 @@ public:
         CreateButtonCell();
     }
 
-    wxToolBarTool(wxToolBar *tbar, wxControl *control)
-        : wxToolBarToolBase(tbar, control)
+    wxToolBarTool(wxToolBar *tbar, wxControl *control, const wxString& label)
+        : wxToolBarToolBase(tbar, control, label)
     {
         Init();
     }
@@ -139,14 +97,23 @@ void wxToolBarTool::Init()
     m_frameRect = NSZeroRect;
 }
 
+void wxToolBar::CocoaToolClickEnded()
+{
+    wxASSERT(m_mouseDownTool);
+    wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, m_mouseDownTool->GetId());
+    InitCommandEvent(event);
+    Command(event);
+}
+
 wxToolBarTool::~wxToolBarTool()
 {
-    DisassociateNSActionCell(m_cocoaNSButtonCell);
     [m_cocoaNSButtonCell release];
 }
 
 bool wxToolBarTool::CreateButtonCell()
 {
+    wxAutoNSAutoreleasePool pool;
+
     NSImage *nsimage = [m_bmpNormal.GetNSImage(true) retain];
     m_cocoaNSButtonCell = [[NSButtonCell alloc] initTextCell:nil];
     [m_cocoaNSButtonCell setImage:nsimage];
@@ -184,7 +151,6 @@ bool wxToolBarTool::CreateButtonCell()
     [m_cocoaNSButtonCell setBordered:NO];
 //    [m_cocoaNSButtonCell setHighlightsBy:NSContentsCellMask|NSPushInCellMask];
 //    [m_cocoaNSButtonCell setShowsStateBy:NSContentsCellMask|NSPushInCellMask];
-    AssociateNSActionCell(m_cocoaNSButtonCell);
     return true;
 }
 
@@ -205,6 +171,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxControl)
 void wxToolBar::Init()
 {
     m_owningFrame = NULL;
+    m_mouseDownTool = NULL;
 }
 
 wxToolBar::~wxToolBar()
@@ -219,7 +186,13 @@ bool wxToolBar::Create( wxWindow *parent,
                         const wxString& name )
 {
     // Call wxControl::Create so we get a wxNonControlNSControl
-    return wxToolBarBase::Create(parent,winid,pos,size,style,wxDefaultValidator,name);
+    if ( !wxToolBarBase::Create(parent, winid, pos, size, style,
+                                wxDefaultValidator, name) )
+        return false;
+
+    FixupStyle();
+
+    return true;
 }
 
 wxToolBarToolBase *wxToolBar::CreateTool(int toolid,
@@ -235,9 +208,10 @@ wxToolBarToolBase *wxToolBar::CreateTool(int toolid,
                              clientData, shortHelpString, longHelpString);
 }
 
-wxToolBarToolBase *wxToolBar::CreateTool(wxControl *control)
+wxToolBarToolBase *
+wxToolBar::CreateTool(wxControl *control, const wxString& label)
 {
-    return new wxToolBarTool(this, control);
+    return new wxToolBarTool(this, control, label);
 }
 
 void wxToolBar::SetWindowStyleFlag( long style )
@@ -256,6 +230,11 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
     return true;
 }
 
+bool wxToolBar::Cocoa_acceptsFirstMouse(bool &acceptsFirstMouse, WX_NSEvent theEvent)
+{
+    acceptsFirstMouse = true; return true;
+}
+
 bool wxToolBar::Cocoa_drawRect(const NSRect &rect)
 {
     wxToolBarToolsList::compatibility_iterator node;
@@ -288,15 +267,18 @@ bool wxToolBar::Cocoa_mouseDragged(WX_NSEvent theEvent)
         NSButtonCell *buttonCell = m_mouseDownTool->GetNSButtonCell();
         if(buttonCell)
         {
+            [buttonCell retain];
             [buttonCell setHighlighted: YES];
             if([buttonCell trackMouse: theEvent
                 inRect:AddToolPadding(m_mouseDownTool->GetFrameRect()) ofView:m_cocoaNSView
                 untilMouseUp:NO])
             {
+                CocoaToolClickEnded();
                 m_mouseDownTool = NULL;
-                wxLogDebug("Button was clicked after drag!");
+                wxLogTrace(wxTRACE_COCOA,wxT("Button was clicked after drag!"));
             }
             [buttonCell setHighlighted: NO];
+            [buttonCell release];
         }
     }
     return wxToolBarBase::Cocoa_mouseDragged(theEvent);
@@ -310,16 +292,19 @@ bool wxToolBar::Cocoa_mouseDown(WX_NSEvent theEvent)
         NSButtonCell *buttonCell = tool->GetNSButtonCell();
         if(buttonCell)
         {
+            [buttonCell retain];
             m_mouseDownTool = tool;
             [buttonCell setHighlighted: YES];
             if([buttonCell trackMouse: theEvent
                 inRect:AddToolPadding(tool->GetFrameRect()) ofView:m_cocoaNSView
                 untilMouseUp:NO])
             {
+                CocoaToolClickEnded();
                 m_mouseDownTool = NULL;
-                wxLogDebug("Button was clicked!");
+                wxLogTrace(wxTRACE_COCOA,wxT("Button was clicked!"));
             }
             [buttonCell setHighlighted: NO];
+            [buttonCell release];
         }
     }
     return wxToolBarBase::Cocoa_mouseDown(theEvent);
@@ -327,6 +312,8 @@ bool wxToolBar::Cocoa_mouseDown(WX_NSEvent theEvent)
 
 bool wxToolBar::Realize()
 {
+    wxAutoNSAutoreleasePool pool;
+
     wxToolBarToolsList::compatibility_iterator node;
     NSSize totalSize = NSZeroSize;
     // This is for horizontal, TODO: vertical