Implement wxChoice including sorting and client data

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23411 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Elliott
2003-09-06 00:33:02 +00:00
parent a5e14fbf1a
commit f154ff6018
2 changed files with 139 additions and 23 deletions

View File

@@ -12,12 +12,13 @@
#ifndef __WX_COCOA_CHOICE_H__
#define __WX_COCOA_CHOICE_H__
//#include "wx/cocoa/NSTableView.h"
//#include "wx/cocoa/NSPopUpButton.h"
#include "wx/cocoa/NSMenu.h"
// ========================================================================
// wxChoice
// ========================================================================
class WXDLLEXPORT wxChoice: public wxChoiceBase //, protected wxCocoaNSTableView
class WXDLLEXPORT wxChoice: public wxChoiceBase /*, protected wxCocoaNSPopUpButton */, protected wxCocoaNSMenu
{
DECLARE_DYNAMIC_CLASS(wxChoice)
DECLARE_EVENT_TABLE()
@@ -26,7 +27,7 @@ class WXDLLEXPORT wxChoice: public wxChoiceBase //, protected wxCocoaNSTableView
// initialization
// ------------------------------------------------------------------------
public:
wxChoice() { }
wxChoice() { Init(); }
wxChoice(wxWindow *parent, wxWindowID winid,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
@@ -35,6 +36,7 @@ public:
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxChoiceNameStr)
{
Init();
Create(parent, winid, pos, size, n, choices, style, validator, name);
}
@@ -46,11 +48,14 @@ public:
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxChoiceNameStr);
virtual ~wxChoice();
protected:
void Init();
// ------------------------------------------------------------------------
// Cocoa callbacks
// ------------------------------------------------------------------------
protected:
void CocoaNotification_menuDidSendAction(WX_NSNotification notification);
// ------------------------------------------------------------------------
// Implementation
// ------------------------------------------------------------------------
@@ -69,6 +74,9 @@ public:
virtual void DoSetItemClientObject(int, wxClientData*);
virtual wxClientData* DoGetItemClientObject(int) const;
virtual void SetSelection(int);
protected:
wxSortedArrayString *m_sortedStrings;
wxArrayPtrVoid m_itemsClientData;
};
#endif // __WX_COCOA_CHOICE_H__

View File

@@ -16,13 +16,23 @@
#include "wx/choice.h"
#endif //WX_PRECOMP
#include "wx/cocoa/string.h"
#import <AppKit/NSPopUpButton.h>
#import <AppKit/NSMenu.h>
#import <Foundation/NSNotification.h>
#import <Foundation/NSDictionary.h>
IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControl)
BEGIN_EVENT_TABLE(wxChoice, wxChoiceBase)
END_EVENT_TABLE()
// WX_IMPLEMENT_COCOA_OWNER(wxChoice,NSButton,NSControl,NSView)
void wxChoice::Init()
{
m_sortedStrings = NULL;
}
bool wxChoice::Create(wxWindow *parent, wxWindowID winid,
const wxPoint& pos,
const wxSize& size,
@@ -36,8 +46,36 @@ bool wxChoice::Create(wxWindow *parent, wxWindowID winid,
SetNSView([[NSPopUpButton alloc] initWithFrame:MakeDefaultNSRect(size)
pullsDown: NO]);
[m_cocoaNSView release];
[m_cocoaNSView sizeToFit];
NSMenu *nsmenu = [(NSPopUpButton*)m_cocoaNSView menu];
AssociateNSMenu(nsmenu, OBSERVE_DidSendAction);
if(style&wxCB_SORT)
{
m_sortedStrings = new wxSortedArrayString;
for(int i=0; i<n; i++)
{
m_sortedStrings->Add(choices[i]);
}
for(size_t i=0; i < m_sortedStrings->GetCount(); i++)
{
[nsmenu addItemWithTitle:wxNSStringWithWxString(
m_sortedStrings->Item(i))
action: nil keyEquivalent:@""];
}
}
else
{
for(int i=0; i<n; i++)
{
[nsmenu addItemWithTitle:wxNSStringWithWxString(choices[i])
action: nil keyEquivalent:@""];
}
}
m_itemsClientData.SetCount(n);
[(NSPopUpButton*)m_cocoaNSView sizeToFit];
if(m_parent)
m_parent->CocoaAddChild(this);
SetInitialFrameRect(pos,size);
@@ -47,70 +85,140 @@ bool wxChoice::Create(wxWindow *parent, wxWindowID winid,
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();
CocoaRemoveFromParent();
}
void wxChoice::CocoaNotification_menuDidSendAction(WX_NSNotification notification)
{
NSDictionary *userInfo = [notification userInfo];
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);
wxCommandEvent event(wxEVT_COMMAND_CHOICE_SELECTED, m_windowId);
event.SetInt(index);
event.SetEventObject(this);
event.SetString(GetStringSelection());
GetEventHandler()->ProcessEvent(event);
}
void wxChoice::Clear()
{
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)
void wxChoice::Delete(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
{
return 0;
return [(NSPopUpButton*)m_cocoaNSView numberOfItems];
}
wxString wxChoice::GetString(int) const
wxString wxChoice::GetString(int n) const
{
return wxEmptyString;
return wxString([[(NSPopUpButton*)m_cocoaNSView itemTitleAtIndex:n] lossyCString]);
}
void wxChoice::SetString(int, const wxString&)
void wxChoice::SetString(int n, const wxString& title)
{
NSMenuItem *item = [(NSPopUpButton*)m_cocoaNSView itemAtIndex:n];
[item setTitle:wxNSStringWithWxString(title)];
}
int wxChoice::FindString(const wxString&) const
int wxChoice::FindString(const wxString& title) const
{
return 0;
return [(NSPopUpButton*)m_cocoaNSView indexOfItemWithTitle:
wxNSStringWithWxString(title)];
}
int wxChoice::GetSelection() const
{
return 0;
return [(NSPopUpButton*)m_cocoaNSView indexOfSelectedItem];
}
int wxChoice::DoAppend(const wxString&)
int wxChoice::DoAppend(const wxString& title)
{
return 0;
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
{
item = [nsmenu addItemWithTitle:wxNSStringWithWxString(title)
action: nil keyEquivalent:@""];
m_itemsClientData.Add(NULL);
}
return [nsmenu indexOfItem:item];
}
int wxChoice::DoInsert(const wxString&, int)
int wxChoice::DoInsert(const wxString& title, int pos)
{
return 0;
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);
return [nsmenu indexOfItem:item];
}
void wxChoice::DoSetItemClientData(int, void*)
void wxChoice::DoSetItemClientData(int n, void *data)
{
m_itemsClientData.Item(n) = data;
}
void* wxChoice::DoGetItemClientData(int) const
void* wxChoice::DoGetItemClientData(int n) const
{
return NULL;
return m_itemsClientData.Item(n);
}
void wxChoice::DoSetItemClientObject(int, wxClientData*)
void wxChoice::DoSetItemClientObject(int n, wxClientData *data)
{
m_itemsClientData.Item(n) = data;
}
wxClientData* wxChoice::DoGetItemClientObject(int) const
wxClientData* wxChoice::DoGetItemClientObject(int n) const
{
return NULL;
return (wxClientData*)m_itemsClientData.Item(n);
}
void wxChoice::SetSelection(int)
void wxChoice::SetSelection(int n)
{
[(NSPopUpButton*)m_cocoaNSView selectItemAtIndex:n];
}