/////////////////////////////////////////////////////////////////////////////
-// Name: cocoa/choice.mm
+// Name: src/cocoa/choice.mm
// Purpose: wxChoice
// Author: David Elliott
// Modified by:
// Created: 2003/03/16
-// RCS-ID: $Id:
+// Id: $Id$
// Copyright: (c) 2003 David Elliott
-// Licence: wxWindows license
+// Licence: wxWidgets licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
+
+#if wxUSE_CHOICE
+
+#include "wx/choice.h"
+
#ifndef WX_PRECOMP
#include "wx/log.h"
#include "wx/app.h"
- #include "wx/choice.h"
+ #include "wx/arrstr.h"
#endif //WX_PRECOMP
#include "wx/cocoa/string.h"
+#include "wx/cocoa/autorelease.h"
#import <AppKit/NSPopUpButton.h>
#import <AppKit/NSMenu.h>
#import <Foundation/NSNotification.h>
#import <Foundation/NSDictionary.h>
-IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControl)
+IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControlWithItems)
BEGIN_EVENT_TABLE(wxChoice, wxChoiceBase)
END_EVENT_TABLE()
// WX_IMPLEMENT_COCOA_OWNER(wxChoice,NSButton,NSControl,NSView)
m_sortedStrings = NULL;
}
+bool wxChoice::Create(wxWindow *parent, wxWindowID winid,
+ const wxPoint& pos,
+ const wxSize& size,
+ const wxArrayString& choices,
+ long style,
+ const wxValidator& validator,
+ const wxString& name)
+{
+ wxCArrayString chs(choices);
+
+ return Create(parent, winid, pos, size, chs.GetCount(), chs.GetStrings(),
+ style, validator, name);
+}
+
bool wxChoice::Create(wxWindow *parent, wxWindowID winid,
const wxPoint& pos,
const wxSize& size,
const wxValidator& validator,
const wxString& name)
{
+ wxAutoNSAutoreleasePool pool;
if(!CreateControl(parent,winid,pos,size,style,validator,name))
return false;
{
m_sortedStrings->Add(choices[i]);
}
- for(size_t i=0; i < m_sortedStrings->GetCount(); i++)
+ for(unsigned int i=0; i < m_sortedStrings->GetCount(); i++)
{
[nsmenu addItemWithTitle:wxNSStringWithWxString(
m_sortedStrings->Item(i))
{
DisassociateNSMenu([(NSPopUpButton*)m_cocoaNSView menu]);
- if(m_sortedStrings)
- m_sortedStrings->Clear();
- delete m_sortedStrings;
-
- if(HasClientObjectData())
- {
- for(size_t i=0; i < m_itemsClientData.GetCount(); i++)
- delete (wxClientData*)m_itemsClientData.Item(i);
- }
- m_itemsClientData.Clear();
-
- CocoaRemoveFromParent();
+ Clear();
}
void wxChoice::CocoaNotification_menuDidSendAction(WX_NSNotification notification)
NSMenuItem *menuitem = [userInfo objectForKey:@"MenuItem"];
int index = [[(NSPopUpButton*)m_cocoaNSView menu] indexOfItem: menuitem];
int selectedItem = [(NSPopUpButton*)m_cocoaNSView indexOfSelectedItem];
- wxLogDebug("menuDidSendAction, index=%d, selectedItem=%d", index, selectedItem);
+ wxLogTrace(wxTRACE_COCOA,wxT("menuDidSendAction, index=%d, selectedItem=%d"), index, selectedItem);
wxCommandEvent event(wxEVT_COMMAND_CHOICE_SELECTED, m_windowId);
event.SetInt(index);
event.SetEventObject(this);
event.SetString(GetStringSelection());
- GetEventHandler()->ProcessEvent(event);
+ HandleWindowEvent(event);
}
-void wxChoice::Clear()
+void wxChoice::DoClear()
{
if(m_sortedStrings)
m_sortedStrings->Clear();
- if(HasClientObjectData())
- {
- for(size_t i=0; i < m_itemsClientData.GetCount(); i++)
- delete (wxClientData*)m_itemsClientData.Item(i);
- }
m_itemsClientData.Clear();
[(NSPopUpButton*)m_cocoaNSView removeAllItems];
}
-void wxChoice::Delete(int n)
+void wxChoice::DoDeleteOneItem(unsigned int n)
{
if(m_sortedStrings)
m_sortedStrings->RemoveAt(n);
- if(HasClientObjectData())
- delete (wxClientData*)m_itemsClientData.Item(n);
m_itemsClientData.RemoveAt(n);
[(NSPopUpButton*)m_cocoaNSView removeItemAtIndex:n];
}
-int wxChoice::GetCount() const
+unsigned int wxChoice::GetCount() const
{
- return [(NSPopUpButton*)m_cocoaNSView numberOfItems];
+ return (unsigned int)[(NSPopUpButton*)m_cocoaNSView numberOfItems];
}
-wxString wxChoice::GetString(int n) const
+wxString wxChoice::GetString(unsigned int n) const
{
- return wxString([[(NSPopUpButton*)m_cocoaNSView itemTitleAtIndex:n] lossyCString]);
+ wxAutoNSAutoreleasePool pool;
+ return wxStringWithNSString([(NSPopUpButton*)m_cocoaNSView itemTitleAtIndex:n]);
}
-void wxChoice::SetString(int n, const wxString& title)
+void wxChoice::SetString(unsigned int n, const wxString& title)
{
NSMenuItem *item = [(NSPopUpButton*)m_cocoaNSView itemAtIndex:n];
[item setTitle:wxNSStringWithWxString(title)];
}
-int wxChoice::FindString(const wxString& title) const
+int wxChoice::FindString(const wxString& title, bool bCase) const
{
+ // FIXME: use wxItemContainerImmutable::FindString for bCase parameter
return [(NSPopUpButton*)m_cocoaNSView indexOfItemWithTitle:
wxNSStringWithWxString(title)];
}
return [(NSPopUpButton*)m_cocoaNSView indexOfSelectedItem];
}
-int wxChoice::DoAppend(const wxString& title)
+int wxChoice::DoInsertItems(const wxArrayStringsAdapter & items,
+ unsigned int pos,
+ void **clientData, wxClientDataType type)
{
NSMenu *nsmenu = [(NSPopUpButton*)m_cocoaNSView menu];
- NSMenuItem *item;
- if(m_sortedStrings)
- {
- int sortedIndex = m_sortedStrings->Add(title);
- item = [nsmenu insertItemWithTitle:
- wxNSStringWithWxString(title)
- action: nil keyEquivalent:@"" atIndex:sortedIndex];
- m_itemsClientData.Insert(NULL, sortedIndex);
- }
- else
+ NSMenuItem *item = NULL;
+
+ unsigned int numItems = items.GetCount();
+ for ( unsigned int i = 0; i < numItems; ++i, ++pos )
{
- item = [nsmenu addItemWithTitle:wxNSStringWithWxString(title)
- action: nil keyEquivalent:@""];
- m_itemsClientData.Add(NULL);
- }
- return [nsmenu indexOfItem:item];
-}
+ const wxString& str = items[i];
+ int idx = m_sortedStrings ? m_sortedStrings->Add(str) : pos;
-int wxChoice::DoInsert(const wxString& title, int pos)
-{
- if(m_sortedStrings)
- return DoAppend(title);
- NSMenu *nsmenu = [(NSPopUpButton*)m_cocoaNSView menu];
- NSMenuItem *item = [nsmenu insertItemWithTitle:wxNSStringWithWxString(title)
- action: nil keyEquivalent:@"" atIndex:pos];
- m_itemsClientData.Insert(NULL, pos);
+ item = [nsmenu insertItemWithTitle:wxNSStringWithWxString(str)
+ action: nil keyEquivalent:@"" atIndex:idx];
+ m_itemsClientData.Insert(NULL, idx);
+ AssignNewItemClientData(idx, clientData, i, type);
+ }
return [nsmenu indexOfItem:item];
}
-void wxChoice::DoSetItemClientData(int n, void *data)
-{
- m_itemsClientData.Item(n) = data;
-}
-
-void* wxChoice::DoGetItemClientData(int n) const
-{
- return m_itemsClientData.Item(n);
-}
-
-void wxChoice::DoSetItemClientObject(int n, wxClientData *data)
+void wxChoice::DoSetItemClientData(unsigned int n, void *data)
{
- m_itemsClientData.Item(n) = data;
+ m_itemsClientData[n] = data;
}
-wxClientData* wxChoice::DoGetItemClientObject(int n) const
+void* wxChoice::DoGetItemClientData(unsigned int n) const
{
- return (wxClientData*)m_itemsClientData.Item(n);
+ return m_itemsClientData[n];
}
void wxChoice::SetSelection(int n)
{
+ wxAutoNSAutoreleasePool pool;
[(NSPopUpButton*)m_cocoaNSView selectItemAtIndex:n];
}
+#endif // wxUSE_CHOICE