1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/osx/carbon/toolbar.cpp
4 // Author: Stefan Csomor
7 // RCS-ID: $Id: toolbar.cpp 54954 2008-08-03 11:27:03Z VZ $
8 // Copyright: (c) Stefan Csomor
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #include "wx/wxprec.h"
16 #include "wx/toolbar.h"
23 #include "wx/osx/private.h"
24 #include "wx/geometry.h"
25 #include "wx/sysopt.h"
28 #pragma mark Tool Implementation
30 BEGIN_EVENT_TABLE(wxToolBar, wxToolBarBase)
33 // ----------------------------------------------------------------------------
35 // ----------------------------------------------------------------------------
39 @interface wxUIToolbar : UIToolbar
41 NSMutableArray* mutableBarItems;
44 - (void)clickedAction:(id)sender;
46 - (void)insertTool:(UIBarButtonItem*) item atIndex:(size_t) pos;
48 - (void)removeTool:(size_t) pos;
55 class wxToolBarTool : public wxToolBarToolBase
61 const wxString& label,
62 const wxBitmap& bmpNormal,
63 const wxBitmap& bmpDisabled,
66 const wxString& shortHelp,
67 const wxString& longHelp );
69 wxToolBarTool(wxToolBar *tbar, wxControl *control, const wxString& label);
71 virtual ~wxToolBarTool();
75 wxToolBar *tbar = (wxToolBar*) GetToolBar();
80 shouldToggle = !IsToggled();
81 tbar->ToggleTool( GetId(), shouldToggle );
84 tbar->OnLeftClick( GetId(), IsToggled() );
87 UIBarButtonItem* GetUIBarButtonItem() const {return m_toolbarItem;}
96 UIBarButtonItem* m_toolbarItem;
97 // position in its toolbar, -1 means not inserted
101 WX_DECLARE_HASH_MAP(WX_NSObject, wxToolBarTool*, wxPointerHash, wxPointerEqual, ToolBarToolMap);
102 static ToolBarToolMap wxToolBarToolList;
104 wxToolBarTool::wxToolBarTool(
107 const wxString& label,
108 const wxBitmap& bmpNormal,
109 const wxBitmap& bmpDisabled,
111 wxObject *clientData,
112 const wxString& shortHelp,
113 const wxString& longHelp )
116 tbar, id, label, bmpNormal, bmpDisabled, kind,
117 clientData, shortHelp, longHelp )
120 UIBarButtonItem* bui = [UIBarButtonItem alloc];
121 UIBarButtonItemStyle style = UIBarButtonItemStylePlain;
122 wxUIToolbar* toolbar = (wxUIToolbar*) tbar->GetHandle();
124 if ( id == wxID_SEPARATOR )
126 [bui initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
129 else if ( bmpNormal.Ok() )
131 [bui initWithImage:bmpNormal.GetUIImage() style:UIBarButtonItemStylePlain target:toolbar
132 action:@selector(clickedAction:)];
137 style = UIBarButtonItemStyleDone;
139 style = UIBarButtonItemStyleBordered;
141 [bui initWithTitle:wxCFStringRef(label).AsNSString() style:style target:toolbar
142 action:@selector(clickedAction:)];
146 wxToolBarToolList[bui] = this;
149 wxToolBarTool::wxToolBarTool(wxToolBar *tbar, wxControl *control, const wxString& label)
150 : wxToolBarToolBase(tbar, control, label)
153 UIBarButtonItem* bui = [UIBarButtonItem alloc];
155 [bui initWithCustomView:control->GetHandle() ];
158 wxToolBarToolList[bui] = this;
161 wxToolBarTool::~wxToolBarTool()
167 ToolBarToolMap::iterator it;
168 for ( it = wxToolBarToolList.begin(); it != wxToolBarToolList.end(); ++it )
170 if ( it->second == this )
172 wxToolBarToolList.erase(it);
181 wxToolBarToolBase *wxToolBar::CreateTool(
183 const wxString& label,
184 const wxBitmap& bmpNormal,
185 const wxBitmap& bmpDisabled,
187 wxObject *clientData,
188 const wxString& shortHelp,
189 const wxString& longHelp )
191 return new wxToolBarTool(
192 this, id, label, bmpNormal, bmpDisabled, kind,
193 clientData, shortHelp, longHelp );
197 wxToolBar::CreateTool(wxControl *control, const wxString& label)
199 return new wxToolBarTool(this, control, label);
202 void wxToolBar::Init()
210 // also for the toolbar we have the dual implementation:
211 // only when MacInstallNativeToolbar is called is the native toolbar set as the window toolbar
213 bool wxToolBar::Create(
219 const wxString& name )
221 m_macIsUserPane = false ;
223 if ( !wxToolBarBase::Create( parent, id, pos, size, style, wxDefaultValidator, name ) )
228 CGRect r = CGRectMake( pos.x, pos.y, size.x, size.y) ;
230 wxUIToolbar* toolbar = [[wxUIToolbar alloc] init];
233 switch ( [[UIApplication sharedApplication] statusBarStyle] )
236 case UIStatusBarStyleBlackOpaque:
237 toolbar.barStyle = UIBarStyleBlack;
239 case UIStatusBarStyleBlackTranslucent:
240 toolbar.barStyle = UIBarStyleBlack;
241 toolbar.translucent = YES;
245 toolbar.barStyle = UIBarStyleDefault;
248 m_macToolbar = toolbar;
250 m_peer = new wxWidgetIPhoneImpl( this, toolbar );
251 MacPostControlCreate(pos, size) ;
254 wxToolBar::~wxToolBar()
259 bool wxToolBar::Realize()
261 if ( !wxToolBarBase::Realize() )
268 void wxToolBar::SetToolBitmapSize(const wxSize& size)
270 m_defaultWidth = size.x;
271 m_defaultHeight = size.y;
274 // The button size is bigger than the bitmap size
275 wxSize wxToolBar::GetToolSize() const
277 return wxSize(m_defaultWidth, m_defaultHeight);
280 void wxToolBar::SetRows(int nRows)
282 // avoid resizing the frame uselessly
283 if ( nRows != m_maxRows )
287 void wxToolBar::SetToolNormalBitmap( int id, const wxBitmap& bitmap )
289 wxToolBarTool* tool = static_cast<wxToolBarTool*>(FindById(id));
292 wxCHECK_RET( tool->IsButton(), wxT("Can only set bitmap on button tools."));
294 tool->SetNormalBitmap(bitmap);
298 void wxToolBar::SetToolDisabledBitmap( int id, const wxBitmap& bitmap )
300 wxToolBarTool* tool = static_cast<wxToolBarTool*>(FindById(id));
303 wxCHECK_RET( tool->IsButton(), wxT("Can only set bitmap on button tools."));
305 tool->SetDisabledBitmap(bitmap);
307 // TODO: what to do for this one?
311 wxToolBarToolBase *wxToolBar::FindToolForPosition(wxCoord x, wxCoord y) const
316 void wxToolBar::DoEnableTool(wxToolBarToolBase *t, bool enable)
320 ((wxToolBarTool*)t)->DoEnable( enable );
324 void wxToolBar::DoToggleTool(wxToolBarToolBase *t, bool toggle)
327 wxToolBarTool *tool = (wxToolBarTool *)t;
328 if ( ( tool != NULL ) && tool->IsButton() )
329 tool->UpdateToggleImage( toggle );
333 bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase)
335 wxToolBarTool *tool = static_cast< wxToolBarTool*>(toolBase );
339 wxSize toolSize = GetToolSize();
341 switch (tool->GetStyle())
343 case wxTOOL_STYLE_SEPARATOR:
346 case wxTOOL_STYLE_BUTTON:
349 case wxTOOL_STYLE_CONTROL:
350 // right now there's nothing to do here
357 [(wxUIToolbar*)m_macToolbar insertTool:tool->GetUIBarButtonItem() atIndex:pos];
358 InvalidateBestSize();
364 void wxToolBar::DoSetToggle(wxToolBarToolBase *WXUNUSED(tool), bool WXUNUSED(toggle))
366 wxFAIL_MSG( wxT("not implemented") );
369 bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *toolbase)
371 wxToolBarTool* tool = static_cast< wxToolBarTool*>(toolbase );
373 [(wxUIToolbar*)m_macToolbar removeTool:pos];
378 void wxToolBar::SetWindowStyleFlag( long style )
380 wxToolBarBase::SetWindowStyleFlag( style );
384 @implementation wxUIToolbar
388 if (!(self = [super init]))
391 mutableBarItems = [NSMutableArray arrayWithCapacity:5];
395 - (void)clickedAction:(id)sender
397 ToolBarToolMap::iterator node = wxToolBarToolList.find(sender);
399 if ( node != wxToolBarToolList.end() )
400 node->second->Action();
403 - (void)insertTool:(UIBarButtonItem*) item atIndex:(size_t) pos
405 [mutableBarItems insertObject:item atIndex:pos];
406 [super setItems:mutableBarItems];
409 - (void)removeTool:(size_t) pos
411 [mutableBarItems removeObjectAtIndex:pos];
412 [super setItems:mutableBarItems];
417 #endif // wxUSE_TOOLBAR