]> git.saurik.com Git - wxWidgets.git/blobdiff - src/cocoa/choice.mm
* When hiding a wxWindow make sure that none of its subviews are the first
[wxWidgets.git] / src / cocoa / choice.mm
index 8f15536bd57fe06ea997b4a726efc88de24127c1..51e6039a4b561807cbdd23888ddee931b99f1d51 100644 (file)
 
 #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
 
@@ -28,7 +29,7 @@
 #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)
@@ -78,7 +79,7 @@ bool wxChoice::Create(wxWindow *parent, wxWindowID winid,
         {
             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))
@@ -107,16 +108,7 @@ wxChoice::~wxChoice()
 {
     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();
+    Clear();
 }
 
 void wxChoice::CocoaNotification_menuDidSendAction(WX_NSNotification notification)
@@ -130,44 +122,37 @@ void wxChoice::CocoaNotification_menuDidSendAction(WX_NSNotification notificatio
     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];
 }
 
-size_t wxChoice::GetCount() const
+unsigned int wxChoice::GetCount() const
 {
-    return (size_t)[(NSPopUpButton*)m_cocoaNSView numberOfItems];
+    return (unsigned int)[(NSPopUpButton*)m_cocoaNSView numberOfItems];
 }
 
-wxString wxChoice::GetString(int n) const
+wxString wxChoice::GetString(unsigned int n) const
 {
     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)];
@@ -185,57 +170,35 @@ int wxChoice::GetSelection() const
     return [(NSPopUpButton*)m_cocoaNSView indexOfSelectedItem];
 }
 
-int wxChoice::DoAppend(const wxString& title)
+int wxChoice::DoInsertItems(const wxArrayStringsAdapter & items,
+                            unsigned int pos,
+                            void **clientData, wxClientDataType type)
 {
-    wxAutoNSAutoreleasePool pool;
     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)
@@ -244,4 +207,4 @@ void wxChoice::SetSelection(int n)
     [(NSPopUpButton*)m_cocoaNSView selectItemAtIndex:n];
 }
 
-#endif
+#endif // wxUSE_CHOICE