aboutsummaryrefslogtreecommitdiffstats
path: root/lib/wx/examples/simple/menu.erl
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
committerErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
commit84adefa331c4159d432d22840663c38f155cd4c1 (patch)
treebff9a9c66adda4df2106dfd0e5c053ab182a12bd /lib/wx/examples/simple/menu.erl
downloadotp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz
otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2
otp-84adefa331c4159d432d22840663c38f155cd4c1.zip
The R13B03 release.OTP_R13B03
Diffstat (limited to 'lib/wx/examples/simple/menu.erl')
-rwxr-xr-xlib/wx/examples/simple/menu.erl607
1 files changed, 607 insertions, 0 deletions
diff --git a/lib/wx/examples/simple/menu.erl b/lib/wx/examples/simple/menu.erl
new file mode 100755
index 0000000000..d573fcf13a
--- /dev/null
+++ b/lib/wx/examples/simple/menu.erl
@@ -0,0 +1,607 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+%%%-------------------------------------------------------------------
+%%% File : menus.erl
+%%% Author : Matthew Harrison <harryhuk at users.sourceforge.net>
+%%% Description : Test of menus
+%%%
+%%% Created : 18 Sep 2008 by Matthew Harrison <harryhuk at users.sourceforge.net>
+%%%-------------------------------------------------------------------
+-module(menu).
+
+-include_lib("wx/include/wx.hrl").
+
+-export([start/0]).
+-compile(export_all).
+
+%%%Lots of IDs to declare!
+-define(menuID_FILE_QUIT, ?wxID_EXIT).
+-define(menuID_FILE_CLEAR_LOG, 100).
+
+-define(menuID_MENUBAR_TOGGLE, 200).
+-define(menuID_MENUBAR_APPEND, 201).
+-define(menuID_MENUBAR_INSERT, 202).
+-define(menuID_MENUBAR_DELETE, 203).
+-define(menuID_MENUBAR_ENABLE, 204).
+-define(menuID_MENUBAR_GET_LABEL, 206).
+-define(menuID_MENUBAR_SET_LABEL, 207).
+-define(menuID_MENUBAR_FIND_MENU, 208).
+
+-define(menuID_MENU_APPEND, 300).
+-define(menuID_MENU_APPEND_SUB, 301).
+-define(menuID_MENU_INSERT, 302).
+-define(menuID_MENU_DELETE, 303).
+-define(menuID_MENU_ENABLE, 304).
+-define(menuID_MENU_CHECK, 305).
+-define(menuID_MENU_GET_LABEL, 306).
+-define(menuID_MENU_SET_LABEL, 307).
+-define(menuID_MENU_GET_INFO, 308).
+-define(menuID_MENU_FIND_ITEM, 309).
+
+-define(menuID_TEST_NORMAL, 400).
+-define(menuID_TEST_CHECK, 401).
+-define(menuID_TEST_RADIO_1, 402).
+-define(menuID_TEST_RADIO_2, 403).
+-define(menuID_TEST_RADIO_3, 404).
+
+-define(menuID_SUBMENU, 450).
+-define(menuID_SUBMENU_NORMAL, 451).
+-define(menuID_SUBMENU_CHECK, 452).
+-define(menuID_SUBMENU_RADIO_1, 453).
+-define(menuID_SUBMENU_RADIO_2, 454).
+-define(menuID_SUBMENU_RADIO_3, 455).
+
+-define(menuID_DUMMY_FIRST, 500).
+-define(menuID_DUMMY_SECOND, 501).
+-define(menuID_DUMMY_THIRD, 502).
+-define(menuID_DUMMY_FOURTH, 503).
+-define(menuID_DUMMY_LAST, 504).
+
+-define(menuID_HELP_ABOUT, ?wxID_ABOUT).
+
+-define(menuID_POPUP_TO_BE_DELETED, 2000).
+-define(menuID_POPUP_TO_BE_GREYED, 2001).
+-define(menuID_POPUP_TO_BE_CHECKED, 2002).
+-define(menuID_POPUP_TO_BE_SUBMENU, 2003).
+
+-define(wID_LOG_TEXT_CTRL, 3000).
+
+-record(state, {dummyMenuCount=0, fileMenu=undefined}).
+
+%%
+%%
+%%
+start() ->
+ Wx = wx:new(),
+ Frame = wx:batch(fun() -> create_frame(Wx) end),
+ wxWindow:show(Frame),
+
+ State = #state{},
+
+ loop(State),
+ ok.
+
+
+%%
+%%
+%%
+create_frame(Wx) ->
+ Frame = wxFrame:new(Wx, -1, "wxErlang menu sample", [{size, {600,400}}]),
+
+ Path = filename:dirname(code:which(?MODULE)),
+ wxFrame:setIcon(Frame, wxIcon:new(filename:join(Path,"sample.xpm"))),
+
+ wxFrame:createStatusBar(Frame,[]),
+ wxFrame:connect(Frame, close_window),
+
+ FileMenu = create_file_menu(),
+ MenuBarMenu = create_menubar_menu(),
+ MenuMenu = create_menu_menu(),
+ TestMenu = create_test_menu(),
+ HelpMenu = create_help_menu(),
+
+ MenuBar = wxMenuBar:new(?wxMB_DOCKABLE),
+
+
+ wxMenuBar:append(MenuBar, FileMenu, "&File"),
+ wxMenuBar:append(MenuBar, MenuBarMenu, "Menu&bar"),
+ wxMenuBar:append(MenuBar, MenuMenu, "&Menu"),
+ wxMenuBar:append(MenuBar, TestMenu, "&Test"),
+ wxMenuBar:append(MenuBar, HelpMenu, "&Help"),
+
+ wxFrame:setMenuBar(Frame, MenuBar),
+
+ LogTextCtrl = wxTextCtrl:new(Frame, ?wID_LOG_TEXT_CTRL,
+ [{value, ""},
+ %{pos, ?wxDefaultPosition},
+ %{size, ?wxDefaultSize},
+ {style, ?wxTE_MULTILINE}]),
+ wxTextCtrl:setEditable(LogTextCtrl, false),
+
+ ok = wxFrame:setStatusText(Frame, "Welcome to wxErlang menu sample",[]),
+
+ ok = wxFrame:connect(Frame, command_menu_selected),
+
+ String = "Brief explanations:~n"
+ "the commands from the \"Menu\" menu append/insert/delete items to/from the last menu.~n"
+ "The commands from \"Menubar\" menu work with the menubar itself.~n~n",
+ %% "Right click the band below to test popup menus.~n",
+ logMessage(Frame, String),
+ Frame.
+
+%%
+%%
+%%
+create_file_menu() ->
+ FileMenu = wxMenu:new(),
+
+ wxMenu:append(FileMenu, wxMenuItem:new([
+ {id, ?menuID_SUBMENU},
+ {subMenu, create_stock_menu()},
+ {text, "&Standard items demo"}
+ ])),
+ ClearLogBitmap = wxBitmap:new("copy.xpm"),
+ ClearLogItem = wxMenuItem:new([
+ {id, ?menuID_FILE_CLEAR_LOG},
+ {text, "Clear &log\tCtrl-L"} %% note mnemonic and accelerator
+ ]),
+ wxMenuItem:setBitmap(ClearLogItem, ClearLogBitmap),
+
+ wxMenu:append(FileMenu, ClearLogItem ),
+ wxMenu:appendSeparator(FileMenu),
+ wxMenu:append(FileMenu, wxMenuItem:new([
+ {id, ?menuID_FILE_QUIT} %,
+ %{text, "E&xit\tAlt-X"}
+ ])),
+ FileMenu.
+
+%%
+%%
+%%
+create_menubar_menu() ->
+ MenuBarMenu = wxMenu:new(),
+ wxMenu:append(MenuBarMenu, wxMenuItem:new([
+ {id, ?menuID_MENUBAR_APPEND},
+ {text, "&Append menu\tCtrl-A"},
+ {help, "Append a menu to the menubar"}
+ ])),
+ wxMenu:append(MenuBarMenu, wxMenuItem:new([
+ {id, ?menuID_MENUBAR_INSERT},
+ {text, "&Insert menu\tCtrl-I"},
+ {help, "Insert a menu into the menubar"}
+ ])),
+ wxMenu:append(MenuBarMenu, wxMenuItem:new([
+ {id, ?menuID_MENUBAR_DELETE},
+ {text, "&Delete menu\tCtrl-D"},
+ {help, "Insert a menu into the menubar"}
+ ])),
+ wxMenu:append(MenuBarMenu, wxMenuItem:new([
+ {id, ?menuID_MENUBAR_TOGGLE},
+ {text, "&Toggle menu\tCtrl-T"},
+ {help, "Toggle the first menu in the menubar"},
+ {kind, ?wxITEM_CHECK}
+ ])),
+ wxMenu:appendSeparator(MenuBarMenu), %% --------------------------
+ wxMenu:append(MenuBarMenu, wxMenuItem:new([
+ {id, ?menuID_MENUBAR_ENABLE},
+ {text, "&Enable menu\tCtrl-E"},
+ {help, "Enable or disable the last menu"},
+ {kind, ?wxITEM_CHECK}
+ ])),
+ wxMenu:appendSeparator(MenuBarMenu), %% --------------------------
+ wxMenu:append(MenuBarMenu, wxMenuItem:new([
+ {id, ?menuID_MENUBAR_GET_LABEL},
+ {text, "&Get menu label\tCtrl-G"},
+ {help, "Get the label of the last menu"}
+ ])),
+ wxMenu:append(MenuBarMenu, wxMenuItem:new([
+ {id, ?menuID_MENUBAR_SET_LABEL},
+ {text, "&Set menu label\tCtrl-S"},
+ {help, "Change the label of the last menu"}
+ ])),
+ wxMenu:appendSeparator(MenuBarMenu), %% --------------------------
+ wxMenu:append(MenuBarMenu, wxMenuItem:new([
+ {id, ?menuID_MENUBAR_FIND_MENU},
+ {text, "&Find menu from label\tCtrl-F"},
+ {help, "Find a menu by searching for its label"}
+ ])),
+ MenuBarMenu.
+
+
+%%
+%%
+%%
+create_submenu_menu() ->
+ SubMenuMenu = wxMenu:new(),
+ wxMenu:append(SubMenuMenu, wxMenuItem:new([
+ {id, ?menuID_SUBMENU_NORMAL},
+ {text, "&Normal submenu item"},
+ {help, "Disabled submenu item"}
+ ])),
+ %% note different way of adding check menu item
+ wxMenu:appendCheckItem(SubMenuMenu,
+ ?menuID_SUBMENU_CHECK,
+ "&Check submenu item",
+ [{help, "Check submenu item"}]),
+ wxMenu:appendRadioItem(SubMenuMenu,
+ ?menuID_SUBMENU_RADIO_1,
+ "Radio item &1",
+ [{help, "Radio item"}]),
+ wxMenu:appendRadioItem(SubMenuMenu,
+ ?menuID_SUBMENU_RADIO_2,
+ "Radio item &2",
+ [{help, "Radio item"}]),
+ wxMenu:appendRadioItem(SubMenuMenu,
+ ?menuID_SUBMENU_RADIO_3,
+ "Radio item &3",
+ [{help, "Radio item"}]),
+ SubMenuMenu.
+
+
+%%
+%%
+%%
+create_menu_menu() ->
+ MenuMenu = wxMenu:new(),
+ wxMenu:append(MenuMenu, wxMenuItem:new([
+ {id, ?menuID_MENU_APPEND},
+ {text, "&Append menu item\tAlt-A"},
+ {help, "Append a menu item to the last menu"}
+ ])),
+ wxMenu:append(MenuMenu, wxMenuItem:new([
+ {id, ?menuID_MENU_APPEND_SUB},
+ {text, "&Append sub menu\tAlt-S"},
+ {help, "Append a sub menu to the last menu"}
+ ])),
+ wxMenu:append(MenuMenu, wxMenuItem:new([
+ {id, ?menuID_MENU_INSERT},
+ {text, "&Insert menu item\tAlt-I"},
+ {help, "Insert a menu item in head of the last menu"}
+ ])),
+ wxMenu:append(MenuMenu, wxMenuItem:new([
+ {id, ?menuID_MENU_DELETE},
+ {text, "&Delete menu item\tAlt-D"},
+ {help, "Delete the last menu item from the last menu"}
+ ])),
+ wxMenu:appendSeparator(MenuMenu), %% --------------------------
+ wxMenu:append(MenuMenu, wxMenuItem:new([
+ {id, ?menuID_MENU_ENABLE},
+ {text, "&Enable menu item\tAlt-E"},
+ {help, "Enable or disable the last menu item"},
+ {kind, ?wxITEM_CHECK}
+ ])),
+ wxMenu:append(MenuMenu, wxMenuItem:new([
+ {id, ?menuID_MENU_CHECK},
+ {text, "&Check menu item\tAlt-C"},
+ {help, "Check or uncheck the last menu item"},
+ {kind, ?wxITEM_CHECK}
+ ])),
+ wxMenu:appendSeparator(MenuMenu), %% --------------------------
+ wxMenu:append(MenuMenu, wxMenuItem:new([
+ {id, ?menuID_MENU_GET_INFO},
+ {text, "Get menu item in&fo\tAlt-F"},
+ {help, "Show the state of the last menu item"}
+ ])),
+ wxMenu:append(MenuMenu, wxMenuItem:new([
+ {id, ?menuID_MENU_SET_LABEL},
+ {text, "&Set menu label\tCtrl-S"},
+ {help, "Change the label of the last menu"}
+ ])),
+ wxMenu:appendSeparator(MenuMenu), %% --------------------------
+ wxMenu:append(MenuMenu, wxMenuItem:new([
+ {id, ?menuID_MENU_FIND_ITEM},
+ {text, "Find menu item from label"},
+ {help, "Find a menu item by searching for its label"}
+ ])),
+ MenuMenu.
+
+
+%%
+%%
+%%
+create_test_menu() ->
+ TestMenu = wxMenu:new(),
+ wxMenu:append(TestMenu, wxMenuItem:new([
+ {id, ?menuID_TEST_NORMAL},
+ {text, "&Normal submenu item"},
+ {help, "Disabled submenu item"}
+ ])),
+ wxMenu:appendSeparator(TestMenu), %% --------------------------
+ %% note different way of adding check menu item
+ wxMenu:appendCheckItem(TestMenu, ?menuID_TEST_CHECK, "&Check item"),
+ wxMenu:appendSeparator(TestMenu), %% --------------------------
+ wxMenu:appendRadioItem(TestMenu, ?menuID_TEST_RADIO_1, "Radio item &1"),
+ wxMenu:appendRadioItem(TestMenu, ?menuID_TEST_RADIO_2, "Radio item &2"),
+ wxMenu:appendRadioItem(TestMenu, ?menuID_TEST_RADIO_3, "Radio item &3"),
+ TestMenu.
+
+%%
+%%
+%%
+create_help_menu() ->
+ HelpMenu = wxMenu:new(),
+ % unlike wxwidgets the stock menu items still need text to be given,
+ % although help text does appear
+ % Note the keybord accelerator
+ wxMenu:append(HelpMenu, wxMenuItem:new([
+ {id, ?menuID_HELP_ABOUT},
+ %{text, "&About\tF1"},
+ {help, "About menu sample"}
+ ])),
+ HelpMenu.
+
+%%
+%%
+%%
+create_stock_menu() ->
+ % unlike wxwidgets the stock menu items still need text to be given,
+ % although help text does appear
+ StockSubMenu = wxMenu:new(),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_ADD }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_APPLY }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_BOLD }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_CANCEL }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_CLEAR }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_CLOSE }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_COPY }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_CUT }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_DELETE }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_FIND }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_REPLACE }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_BACKWARD }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_DOWN }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_FORWARD }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_UP }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_HELP }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_HOME }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_INDENT }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_INDEX }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_ITALIC }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_JUSTIFY_CENTER }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_JUSTIFY_FILL }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_JUSTIFY_LEFT }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_JUSTIFY_RIGHT }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_NEW }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_NO }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_OK }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_OPEN }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_PASTE }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_PREFERENCES }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_PRINT }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_PREVIEW }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_PROPERTIES }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_EXIT }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_REDO }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_REFRESH }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_REMOVE }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_REVERT_TO_SAVED }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_SAVE }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_SAVEAS }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_STOP }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_UNDELETE }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_UNDERLINE }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_UNDO }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_UNINDENT }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_YES }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_ZOOM_100 }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_ZOOM_FIT }])),
+ wxMenu:append(StockSubMenu, wxMenuItem:new([{id, ?wxID_ZOOM_OUT }])),
+
+ StockSubMenu.
+
+create_dummy_menu() ->
+ DummyMenu = wxMenu:new(),
+ wxMenu:append(DummyMenu, ?menuID_DUMMY_FIRST, "&First item\tCtrl-F1"),
+ wxMenu:appendSeparator(DummyMenu), %% --------------------------
+ wxMenu:append(DummyMenu, ?menuID_DUMMY_SECOND, "&Second item\tCtrl-F2"),
+ DummyMenu.
+
+loop(State) ->
+ receive
+ #wx{event=#wxClose{}, obj=Frame} ->
+ io:format("~p Closing window ~n",[self()]),
+ wxWindow:destroy(Frame); %onClose(Frame);
+ #wx{id=?menuID_FILE_QUIT, obj=Frame, event=#wxCommand{type=command_menu_selected}} ->
+ io:format("~p Closing window ~n",[self()]),
+ wxWindow:destroy(Frame); %onClose(Frame);
+
+ #wx{obj=Frame, userData=UserData, event=#wxCommand{type=command_menu_selected}} = Wx->
+ logMessage(Frame, "got wx:~p ud:~p~n", [Wx, UserData]),
+ State1 = onMenuAction(Wx, State),
+ loop(State1);
+ Msg ->
+ io:format("Got ~p ~n", [Msg]),
+ loop(State)
+ after 5000 ->
+ loop(State)
+ end.
+
+
+onMenuAction(#wx{id=?menuID_FILE_CLEAR_LOG, obj=Frame}, #state{} = State) ->
+ wxTextCtrl:clear(findLogger(Frame)),
+ State;
+
+
+onMenuAction(#wx{id=?menuID_MENUBAR_APPEND, obj=Frame}, #state{} = State) ->
+ MenuBar = wxFrame:getMenuBar(Frame),
+ wxMenuBar:append(MenuBar, create_dummy_menu(), "DummyMenu"),
+ State;
+
+onMenuAction(#wx{id=?menuID_MENUBAR_INSERT, obj=Frame}, #state{} = State) ->
+ MenuBar = wxFrame:getMenuBar(Frame),
+ wxMenuBar:insert(MenuBar, 0, create_dummy_menu(), "DummyMenu"),
+ State;
+
+onMenuAction(#wx{id=?menuID_MENUBAR_DELETE, obj=Frame}, #state{} = State) ->
+ MenuBar = wxFrame:getMenuBar(Frame),
+ Count = wxMenuBar:getMenuCount(MenuBar),
+ if
+ (Count > 2) ->
+ wxMenuBar:remove(MenuBar, Count -1);
+ true ->
+ logMessage(Frame, "Cannot delete any more menus~n")
+ end,
+ State;
+
+onMenuAction(#wx{id=?menuID_MENUBAR_TOGGLE, obj=Frame}, #state{fileMenu=FileMenu} = State) ->
+ logMessage(Frame, "onMenubarToggle ~p ~n", [FileMenu]),
+ MenuBar = wxFrame:getMenuBar(Frame),
+ if
+ FileMenu =:= undefined ->
+ Menu = wxMenuBar:remove(MenuBar, 0),
+ State#state{fileMenu=Menu};
+ true ->
+ wxMenuBar:insert(MenuBar, 0, FileMenu, "&File"),
+ State#state{fileMenu=undefined}
+ end;
+
+onMenuAction( #wx{id=?menuID_MENUBAR_ENABLE=Id, obj=Frame}, #state{} = State) ->
+%% logMessage(Frame, "onMenubarEnable ~n"),
+ MenuBar = wxFrame:getMenuBar(Frame),
+ MenuItem = wxMenuBar:findItem(MenuBar, Id),
+ Enable = (not wxMenuItem:isCheckable(MenuItem)) orelse wxMenuItem:isChecked(MenuItem),
+
+ Count = wxMenuBar:getMenuCount(MenuBar),
+ wxMenuBar:enableTop(MenuBar, (Count - 1), Enable),
+ State;
+
+
+onMenuAction( #wx{id=?menuID_MENUBAR_GET_LABEL, obj=Frame}, #state{} = State) ->
+ logMessage(Frame, "onMenubarGetLabel ~n"),
+ MenuBar = wxFrame:getMenuBar(Frame),
+ Count = wxMenuBar:getMenuCount(MenuBar),
+ Label = wxMenuBar:getLabelTop(MenuBar, (Count - 1)),
+ logMessage(Frame, "The label of the last menu item is ~p", [Label]),
+ State;
+
+onMenuAction( #wx{id=?menuID_MENUBAR_SET_LABEL, obj=Frame}, #state{} = State) ->
+%% logMessage(Frame, "onMenubarGetLabel ~n"),
+ MenuBar = wxFrame:getMenuBar(Frame),
+ Count = wxMenuBar:getMenuCount(MenuBar),
+ Label = wxMenuBar:getLabelTop(MenuBar, (Count - 1)),
+ TextDialog = wxTextEntryDialog:new(Frame,
+ "Enter new label: ",
+ [{caption, "Change last menu text"}, {value, Label}]),
+ wxDialog:showModal(TextDialog),
+ NewLabel = wxTextEntryDialog:getValue(TextDialog),
+ wxMenuBar:setLabelTop(MenuBar, (Count - 1), NewLabel),
+ wxDialog:destroy(TextDialog),
+ State;
+
+onMenuAction( #wx{id=?menuID_MENUBAR_FIND_MENU, obj=Frame}, #state{} = State) ->
+%% logMessage(Frame, "onMenubarFindMenu ~n"),
+ MenuBar = wxFrame:getMenuBar(Frame),
+ _Count = wxMenuBar:getMenuCount(MenuBar),
+% Label = wxMenuBar:getLabelTop(MenuBar, (Count - 1)),
+ TextDialog = wxTextEntryDialog:new(Frame,
+ "Enter label to search for: ",
+ [{caption, "Find menu"}]),
+ wxDialog:showModal(TextDialog),
+ Label = wxTextEntryDialog:getValue(TextDialog),
+ Len = string:len(Label),
+ if
+ (Len > 0) ->
+ Index = wxMenuBar:findMenu(MenuBar, Label),
+ if
+ (Index =:= ?wxNOT_FOUND) ->
+ logMessage(Frame, "Warning: No menu with label ~p", [Label]);
+ true ->
+ logMessage(Frame, "Menu ~p has label ~p", [Index, Label])
+ end;
+ true -> true
+ end,
+
+ State;
+
+onMenuAction(#wx{id=?menuID_MENU_APPEND, obj=Frame}, #state{} = State) ->
+ MenuBar = wxFrame:getMenuBar(Frame),
+ Count = wxMenuBar:getMenuCount(MenuBar),
+ Menu = wxMenuBar:getMenu(MenuBar, Count - 1),
+ io:format("MenuBar ~p Menu ~p Count ~p ~n", [MenuBar, Menu, Count]),
+ wxMenu:appendSeparator(Menu),
+ wxMenu:append(Menu, wxMenuItem:new([
+ {id, ?menuID_DUMMY_THIRD},
+ {text, "&Third dummy item\tCtrl-F3"},
+ {kind, ?wxITEM_CHECK}
+ ])),
+
+ State;
+
+onMenuAction(#wx{id=?menuID_MENU_APPEND_SUB, obj=Frame}, #state{} = State) ->
+ MenuBar = wxFrame:getMenuBar(Frame),
+ Count = wxMenuBar:getMenuCount(MenuBar),
+ Menu = wxMenuBar:getMenu(MenuBar, Count - 2),
+ wxMenu:appendSeparator(Menu),
+ wxMenu:append(Menu, wxMenuItem:new([
+ {id, ?menuID_DUMMY_LAST},
+ {text, "&Dummy sub menu"},
+ {help, "Dummy sub menu help"},
+ {subMenu, create_dummy_menu()}
+ ])),
+
+ State;
+
+onMenuAction(#wx{id=Id, obj=Frame}, #state{}=State) when ((Id >= ?menuID_DUMMY_FIRST) and (Id =< ?menuID_DUMMY_LAST)) ->
+ logMessage(Frame, "Dummy item #~p ~n", [Id - ?menuID_DUMMY_FIRST + 1]),
+ State;
+
+onMenuAction( #wx{id=?menuID_HELP_ABOUT=Id, obj=Frame}, #state{} = State) ->
+ showDialog(Id, Frame),
+ State;
+
+onMenuAction( #wx{obj=Frame} = Wx, State) ->
+ logMessage(Frame, "unimplemented menu item event ~p ~n", [Wx]),
+ State.
+
+logMessage(Frame, Msg) ->
+ logMessage(Frame, Msg, []).
+
+logMessage(Frame, Msg, ArgList) ->
+ String = lists:flatten(io_lib:format(Msg, ArgList)),
+
+ wxTextCtrl:appendText(findLogger(Frame), String).
+
+findLogger(Frame) ->
+ LogWin = wxWindow:findWindowById(?wID_LOG_TEXT_CTRL, [{parent, Frame}]),
+ wx:typeCast(LogWin, wxTextCtrl).
+
+
+showDialog(?menuID_HELP_ABOUT, Frame) ->
+ String = lists:flatten(io_lib:format("Welcome to wxErlang 0.97.5.26!~n~n"
+ "This is the minimal wxErlang sample~n"
+ "running under ~p.",
+ [wx_misc:getOsDescription()])),
+ MessageDialog = wxMessageDialog:new(Frame,
+ String,
+ [{style, ?wxOK bor ?wxICON_INFORMATION},
+ {caption, "About wxErlang minimal sample"}]),
+
+ wxDialog:showModal(MessageDialog),
+ wxDialog:destroy(MessageDialog);
+
+showDialog(Id, Frame) ->
+ String = lists:flatten(io_lib:format("Unimplemented Dialog ~p", [Id])),
+ MessageDialog = wxMessageDialog:new(Frame,
+ String,
+ [{style, ?wxOK bor ?wxICON_INFORMATION},
+ {caption, "wxErlang minimal sample"}]),
+
+ wxDialog:showModal(MessageDialog),
+ wxDialog:destroy(MessageDialog).
+