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

View File

@@ -16,13 +16,23 @@
#include "wx/choice.h" #include "wx/choice.h"
#endif //WX_PRECOMP #endif //WX_PRECOMP
#include "wx/cocoa/string.h"
#import <AppKit/NSPopUpButton.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, wxControl)
BEGIN_EVENT_TABLE(wxChoice, wxChoiceBase) BEGIN_EVENT_TABLE(wxChoice, wxChoiceBase)
END_EVENT_TABLE() END_EVENT_TABLE()
// WX_IMPLEMENT_COCOA_OWNER(wxChoice,NSButton,NSControl,NSView) // WX_IMPLEMENT_COCOA_OWNER(wxChoice,NSButton,NSControl,NSView)
void wxChoice::Init()
{
m_sortedStrings = NULL;
}
bool wxChoice::Create(wxWindow *parent, wxWindowID winid, bool wxChoice::Create(wxWindow *parent, wxWindowID winid,
const wxPoint& pos, const wxPoint& pos,
const wxSize& size, const wxSize& size,
@@ -36,8 +46,36 @@ bool wxChoice::Create(wxWindow *parent, wxWindowID winid,
SetNSView([[NSPopUpButton alloc] initWithFrame:MakeDefaultNSRect(size) SetNSView([[NSPopUpButton alloc] initWithFrame:MakeDefaultNSRect(size)
pullsDown: NO]); 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) if(m_parent)
m_parent->CocoaAddChild(this); m_parent->CocoaAddChild(this);
SetInitialFrameRect(pos,size); SetInitialFrameRect(pos,size);
@@ -47,70 +85,140 @@ bool wxChoice::Create(wxWindow *parent, wxWindowID winid,
wxChoice::~wxChoice() 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(); 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() 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 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 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];
} }