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:
@@ -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__
|
||||
|
@@ -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];
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user