first pass of wxUniv merge - nothing works, most parts don't even compile
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10673 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -24,13 +24,17 @@
|
||||
// For compilers that support precompilation, includes "wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#if wxUSE_MENUS
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/intl.h"
|
||||
#include "wx/log.h"
|
||||
#include "wx/menu.h"
|
||||
#endif
|
||||
|
||||
@@ -53,12 +57,106 @@ WX_DEFINE_LIST(wxMenuItemList);
|
||||
|
||||
wxMenuItemBase::~wxMenuItemBase()
|
||||
{
|
||||
if (m_subMenu)
|
||||
delete m_subMenu;
|
||||
delete m_subMenu;
|
||||
}
|
||||
|
||||
#if wxUSE_ACCEL
|
||||
|
||||
// return wxAcceleratorEntry for the given menu string or NULL if none
|
||||
// specified
|
||||
wxAcceleratorEntry *wxGetAccelFromString(const wxString& label)
|
||||
{
|
||||
// check for accelerators: they are given after '\t'
|
||||
int posTab = label.Find(wxT('\t'));
|
||||
if ( posTab != wxNOT_FOUND ) {
|
||||
// parse the accelerator string
|
||||
int keyCode = 0;
|
||||
int accelFlags = wxACCEL_NORMAL;
|
||||
wxString current;
|
||||
for ( size_t n = (size_t)posTab + 1; n < label.Len(); n++ ) {
|
||||
if ( (label[n] == '+') || (label[n] == '-') ) {
|
||||
if ( current == _("ctrl") )
|
||||
accelFlags |= wxACCEL_CTRL;
|
||||
else if ( current == _("alt") )
|
||||
accelFlags |= wxACCEL_ALT;
|
||||
else if ( current == _("shift") )
|
||||
accelFlags |= wxACCEL_SHIFT;
|
||||
else {
|
||||
wxLogDebug(wxT("Unknown accel modifier: '%s'"),
|
||||
current.c_str());
|
||||
}
|
||||
|
||||
current.Empty();
|
||||
}
|
||||
else {
|
||||
current += wxTolower(label[n]);
|
||||
}
|
||||
}
|
||||
|
||||
if ( current.IsEmpty() ) {
|
||||
wxLogDebug(wxT("No accel key found, accel string ignored."));
|
||||
}
|
||||
else {
|
||||
if ( current.Len() == 1 ) {
|
||||
// it's a letter
|
||||
keyCode = wxToupper(current[0U]);
|
||||
}
|
||||
else {
|
||||
// is it a function key?
|
||||
if ( current[0U] == 'f' && isdigit(current[1U]) &&
|
||||
(current.Len() == 2 ||
|
||||
(current.Len() == 3 && isdigit(current[2U]))) ) {
|
||||
int n;
|
||||
wxSscanf(current.c_str() + 1, wxT("%d"), &n);
|
||||
|
||||
keyCode = WXK_F1 + n - 1;
|
||||
}
|
||||
else {
|
||||
// several special cases
|
||||
current.MakeUpper();
|
||||
if ( current == wxT("DEL") ) {
|
||||
keyCode = WXK_DELETE;
|
||||
}
|
||||
else if ( current == wxT("DELETE") ) {
|
||||
keyCode = WXK_DELETE;
|
||||
}
|
||||
else if ( current == wxT("INS") ) {
|
||||
keyCode = WXK_INSERT;
|
||||
}
|
||||
else if ( current == wxT("INSERT") ) {
|
||||
keyCode = WXK_INSERT;
|
||||
}
|
||||
#if 0
|
||||
else if ( current == wxT("PGUP") ) {
|
||||
keyCode = VK_PRIOR;
|
||||
}
|
||||
else if ( current == wxT("PGDN") ) {
|
||||
keyCode = VK_NEXT;
|
||||
}
|
||||
#endif
|
||||
else
|
||||
{
|
||||
wxLogDebug(wxT("Unrecognized accel key '%s', accel string ignored."),
|
||||
current.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( keyCode ) {
|
||||
// we do have something
|
||||
return new wxAcceleratorEntry(accelFlags, keyCode);
|
||||
}
|
||||
}
|
||||
|
||||
return (wxAcceleratorEntry *)NULL;
|
||||
}
|
||||
|
||||
wxAcceleratorEntry *wxMenuItemBase::GetAccel() const
|
||||
{
|
||||
return wxGetAccelFromString(GetText());
|
||||
}
|
||||
|
||||
void wxMenuItemBase::SetAccel(wxAcceleratorEntry *accel)
|
||||
{
|
||||
wxString text = m_text.BeforeFirst(wxT('\t'));
|
||||
@@ -136,18 +234,35 @@ void wxMenuBase::Init(long style)
|
||||
wxMenuBase::~wxMenuBase()
|
||||
{
|
||||
// nothing to do, wxMenuItemList dtor will delete the menu items.
|
||||
// Actually, in GTK, the submenus have to get deleted first.
|
||||
|
||||
// Actually, in GTK, the submenus have to get deleted first.
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxMenu item adding/removing
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void wxMenuBase::AddSubMenu(wxMenu *submenu)
|
||||
{
|
||||
wxCHECK_RET( submenu, _T("can't add a NULL submenu") );
|
||||
|
||||
if ( m_menuBar )
|
||||
{
|
||||
submenu->Attach(m_menuBar);
|
||||
}
|
||||
|
||||
submenu->SetParent((wxMenu *)this);
|
||||
}
|
||||
|
||||
bool wxMenuBase::DoAppend(wxMenuItem *item)
|
||||
{
|
||||
wxCHECK_MSG( item, FALSE, wxT("invalid item in wxMenu::Append()") );
|
||||
|
||||
m_items.Append(item);
|
||||
if ( item->IsSubMenu() )
|
||||
{
|
||||
AddSubMenu(item->GetSubMenu());
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -177,6 +292,10 @@ bool wxMenuBase::DoInsert(size_t pos, wxMenuItem *item)
|
||||
wxCHECK_MSG( node, FALSE, wxT("invalid index in wxMenu::Insert()") );
|
||||
|
||||
m_items.Insert(node, item);
|
||||
if ( item->IsSubMenu() )
|
||||
{
|
||||
AddSubMenu(item->GetSubMenu());
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -339,7 +458,7 @@ wxMenuItem *wxMenuBase::FindChildItem(int id, size_t *ppos) const
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxMenu helpers
|
||||
// wxMenu helpers used by derived classes
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// Update a menu and all submenus recursively. source is the object that has
|
||||
@@ -385,6 +504,75 @@ void wxMenuBase::UpdateUI(wxEvtHandler* source)
|
||||
}
|
||||
}
|
||||
|
||||
bool wxMenuBase::SendEvent(int id, int checked)
|
||||
{
|
||||
wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, id);
|
||||
event.SetEventObject(this);
|
||||
event.SetInt(checked);
|
||||
|
||||
bool processed = FALSE;
|
||||
|
||||
#if wxUSE_MENU_CALLBACK
|
||||
// Try a callback
|
||||
if (m_callback)
|
||||
{
|
||||
(void)(*(m_callback))(*this, event);
|
||||
processed = TRUE;
|
||||
}
|
||||
#endif // wxUSE_MENU_CALLBACK
|
||||
|
||||
// Try the menu's event handler
|
||||
if ( !processed )
|
||||
{
|
||||
wxEvtHandler *handler = GetEventHandler();
|
||||
if ( handler )
|
||||
processed = handler->ProcessEvent(event);
|
||||
}
|
||||
|
||||
// Try the window the menu was popped up from (and up through the
|
||||
// hierarchy)
|
||||
if ( !processed )
|
||||
{
|
||||
const wxMenuBase *menu = this;
|
||||
while ( menu )
|
||||
{
|
||||
wxWindow *win = menu->GetInvokingWindow();
|
||||
if ( win )
|
||||
{
|
||||
processed = win->GetEventHandler()->ProcessEvent(event);
|
||||
break;
|
||||
}
|
||||
|
||||
menu = menu->GetParent();
|
||||
}
|
||||
}
|
||||
|
||||
return processed;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxMenu attaching/detaching to/from menu bar
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void wxMenuBase::Attach(wxMenuBarBase *menubar)
|
||||
{
|
||||
// use Detach() instead!
|
||||
wxASSERT_MSG( menubar, _T("menu can't be attached to NULL menubar") );
|
||||
|
||||
// use IsAttached() to prevent this from happening
|
||||
wxASSERT_MSG( !m_menuBar, _T("attaching menu twice?") );
|
||||
|
||||
m_menuBar = (wxMenuBar *)menubar;
|
||||
}
|
||||
|
||||
void wxMenuBase::Detach()
|
||||
{
|
||||
// use IsAttached() to prevent this from happening
|
||||
wxASSERT_MSG( m_menuBar, _T("detaching unattached menu?") );
|
||||
|
||||
m_menuBar = NULL;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxMenu functions forwarded to wxMenuItem
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -469,6 +657,9 @@ wxMenuBarBase::wxMenuBarBase()
|
||||
{
|
||||
// we own the menus when we get them
|
||||
m_menus.DeleteContents(TRUE);
|
||||
|
||||
// not attached yet
|
||||
m_menuBarFrame = NULL;
|
||||
}
|
||||
|
||||
wxMenuBarBase::~wxMenuBarBase()
|
||||
@@ -495,6 +686,7 @@ bool wxMenuBarBase::Append(wxMenu *menu, const wxString& WXUNUSED(title))
|
||||
wxCHECK_MSG( menu, FALSE, wxT("can't append NULL menu") );
|
||||
|
||||
m_menus.Append(menu);
|
||||
menu->Attach(this);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -506,7 +698,7 @@ bool wxMenuBarBase::Insert(size_t pos, wxMenu *menu,
|
||||
{
|
||||
return wxMenuBarBase::Append(menu, title);
|
||||
}
|
||||
else
|
||||
else // not at the end
|
||||
{
|
||||
wxCHECK_MSG( menu, FALSE, wxT("can't insert NULL menu") );
|
||||
|
||||
@@ -514,6 +706,7 @@ bool wxMenuBarBase::Insert(size_t pos, wxMenu *menu,
|
||||
wxCHECK_MSG( node, FALSE, wxT("bad index in wxMenuBar::Insert()") );
|
||||
|
||||
m_menus.Insert(node, menu);
|
||||
menu->Attach(this);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -530,6 +723,9 @@ wxMenu *wxMenuBarBase::Replace(size_t pos, wxMenu *menu,
|
||||
wxMenu *menuOld = node->GetData();
|
||||
node->SetData(menu);
|
||||
|
||||
menu->Attach(this);
|
||||
menuOld->Detach();
|
||||
|
||||
return menuOld;
|
||||
}
|
||||
|
||||
@@ -541,6 +737,7 @@ wxMenu *wxMenuBarBase::Remove(size_t pos)
|
||||
node = m_menus.DetachNode(node);
|
||||
wxCHECK( node, NULL ); // unexpected
|
||||
wxMenu *menu = node->GetData();
|
||||
menu->Detach();
|
||||
|
||||
delete node;
|
||||
|
||||
@@ -567,6 +764,58 @@ int wxMenuBarBase::FindMenu(const wxString& title) const
|
||||
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxMenuBar attaching/detaching to/from the frame
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void wxMenuBarBase::Attach(wxFrame *frame)
|
||||
{
|
||||
wxASSERT_MSG( !IsAttached(), wxT("menubar already attached!") );
|
||||
|
||||
m_menuBarFrame = frame;
|
||||
}
|
||||
|
||||
void wxMenuBarBase::Detach()
|
||||
{
|
||||
wxASSERT_MSG( IsAttached(), wxT("detaching unattached menubar") );
|
||||
|
||||
m_menuBarFrame = NULL;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxMenuBar searching for items
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxMenuItem *wxMenuBarBase::FindItem(int id, wxMenu **menu) const
|
||||
{
|
||||
if ( menu )
|
||||
*menu = NULL;
|
||||
|
||||
wxMenuItem *item = NULL;
|
||||
size_t count = GetMenuCount();
|
||||
for ( size_t i = 0; !item && (i < count); i++ )
|
||||
{
|
||||
item = m_menus[i]->FindItem(id, menu);
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
int wxMenuBarBase::FindMenuItem(const wxString& menu, const wxString& item) const
|
||||
{
|
||||
wxString label = wxMenuItem::GetLabelFromText(menu);
|
||||
|
||||
int i = 0;
|
||||
wxMenuList::Node *node;
|
||||
for ( node = m_menus.GetFirst(); node; node = node->GetNext(), i++ )
|
||||
{
|
||||
if ( label == wxMenuItem::GetLabelFromText(GetLabelTop(i)) )
|
||||
return node->GetData()->FindItem(item);
|
||||
}
|
||||
|
||||
return wxNOT_FOUND;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// wxMenuBar functions forwarded to wxMenuItem
|
||||
// ---------------------------------------------------------------------------
|
||||
@@ -646,3 +895,4 @@ wxString wxMenuBarBase::GetHelpString(int id) const
|
||||
return item->GetHelp();
|
||||
}
|
||||
|
||||
#endif // wxUSE_MENUS
|
||||
|
Reference in New Issue
Block a user