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