diff options
Diffstat (limited to 'lib/wx/examples/demo/ex_popupMenu.erl')
-rw-r--r-- | lib/wx/examples/demo/ex_popupMenu.erl | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/lib/wx/examples/demo/ex_popupMenu.erl b/lib/wx/examples/demo/ex_popupMenu.erl new file mode 100644 index 0000000000..8774dbef7b --- /dev/null +++ b/lib/wx/examples/demo/ex_popupMenu.erl @@ -0,0 +1,150 @@ +%% +%% %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% + +-module(ex_popupMenu). + +-behaviour(wx_object). + +%% Client API +-export([start/1]). + +%% wx_object callbacks +-export([init/1, terminate/2, code_change/3, + handle_info/2, handle_call/3, handle_event/2]). + +-include_lib("wx/include/wx.hrl"). + +-record(state, + { + parent, + config, + menu + }). + +start(Config) -> + wx_object:start_link(?MODULE, Config, []). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +init(Config) -> + wx:batch(fun() -> do_init(Config) end). + +do_init(Config) -> + Root = proplists:get_value(parent, Config), + Parent = wxPanel:new(Root,[]), + MainSizer = wxBoxSizer:new(?wxVERTICAL), + Box = wxStaticBox:new(Parent, ?wxID_ANY, "Popup Menu"), + Sz = wxStaticBoxSizer:new(Box, ?wxVERTICAL), + Text = wxStaticText:new(Parent, ?wxID_ANY, "Right click to open popup menu", []), + Panel = wxPanel:new(Parent), + wxPanel:connect(Panel, right_up), + Sizer = wxBoxSizer:new(?wxVERTICAL), + wxSizer:add(Sizer, Text, [{border, 20}, {flag, ?wxALL}]), + wxPanel:setSizer(Panel, Sizer), + wxSizer:add(Sz, Panel, [{proportion,1}, {flag, ?wxEXPAND}]), + wxSizer:layout(Sz), + PopupMenu = create_menu(), + wxSizer:add(MainSizer, Sz, [{proportion,1}, {flag, ?wxEXPAND}]), + wxWindow:setSizer(Parent, MainSizer), + {Parent, #state{parent=Parent, config=Config, menu=PopupMenu}}. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Async Events are handled in handle_event as in handle_info +handle_event(#wx{obj = Panel, + event = #wxMouse{type = right_up}}, + State = #state{menu = Menu}) -> + %% Open the popup menu + wxWindow:popupMenu(Panel, Menu), + {noreply, State}; +handle_event(#wx{obj = Menu, id = Id, + event = #wxCommand{type = command_menu_selected}}, + State = #state{}) -> + %% Get the selected item label + Label = wxMenu:getLabel(Menu, Id), + demo:format(State#state.config, "wxMenu clicked ~p\n", [Label]), + {noreply, State}; +handle_event(Ev, State) -> + demo:format(State#state.config, "Unexpected Event ~p\n", [Ev]), + {noreply, State}. + +%% Callbacks handled as normal gen_server callbacks +handle_info(Msg, State) -> + demo:format(State#state.config, "Got Info ~p\n", [Msg]), + {noreply, State}. + +handle_call(Msg, _From, State) -> + demo:format(State#state.config, "Got Call ~p\n", [Msg]), + {reply,{error, nyi}, State}. + +code_change(_, _, State) -> + {stop, ignore, State}. + +terminate(_Reason, #state{menu=Popup}) -> + wxMenu:destroy(Popup), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Local functions +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +create_menu() -> + Menu = wxMenu:new([]), + SubMenu = wxMenu:new([]), + SubMenu2 = wxMenu:new([]), + + wxMenu:append(Menu, ?wxID_UNDO, "Undo", []), + wxMenu:append(Menu, ?wxID_REDO, "Redo", []), + wxMenu:append(Menu, ?wxID_HELP, "Help", []), + wxMenu:appendSeparator(Menu), + wxMenu:appendCheckItem(Menu, ?wxID_ANY, "Check item", []), + wxMenu:appendSeparator(Menu), + wxMenu:appendRadioItem(Menu, ?wxID_ANY, "Radio item 1", []), + wxMenu:appendRadioItem(Menu, ?wxID_ANY, "Radio item 2", []), + wxMenu:appendRadioItem(Menu, ?wxID_ANY, "Radio item 3", []), + wxMenu:appendRadioItem(Menu, ?wxID_ANY, "Radio item 4", []), + + wxMenu:appendSeparator(Menu), + wxMenuItem:enable(wxMenu:append(Menu, ?wxID_ANY, "Disabled", []), [{enable,false}]), + wxMenu:appendSeparator(Menu), + + wxMenu:append(SubMenu, ?wxID_ABOUT, "About", []), + wxMenu:append(SubMenu, ?wxID_ANY, "Sub Item2", []), + wxMenu:append(SubMenu, ?wxID_SAVE, "Save", []), + wxMenu:break(SubMenu), + wxMenu:append(SubMenu, ?wxID_EXIT, "Exit", []), + wxMenu:append(SubMenu, ?wxID_OPEN, "Open", []), + wxMenu:append(SubMenu, ?wxID_NEW, "New", []), + wxMenu:append(Menu, ?wxID_ANY, "Sub menu", SubMenu, []), + + wxMenu:appendCheckItem(SubMenu2, ?wxID_ANY, "Check Item", []), + wxMenu:appendSeparator(SubMenu2), + wxMenu:append(SubMenu2, ?wxID_CLEAR, "Clear", []), + wxMenu:append(SubMenu2, ?wxID_ANY, "Sub Item", []), + + Bitmap = wxArtProvider:getBitmap("wxART_NEW"), + AnotherSubMenu = wxMenuItem:new([{parentMenu, Menu}, + {id, ?wxID_ANY}, + {text, "Another sub menu"}, + {subMenu, SubMenu2}, + {kind, ?wxITEM_NORMAL}]), + wxMenuItem:setBitmap(AnotherSubMenu, Bitmap), + wxMenu:append(Menu, AnotherSubMenu), + + wxMenu:connect(Menu, command_menu_selected), + wxMenu:connect(SubMenu, command_menu_selected), + wxMenu:connect(SubMenu2, command_menu_selected), + Menu. |