pman_tool.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 145 行
ERL
145 行
%% ``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 via the world wide web 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.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %% $Id$%%-module(pman_tool).%% Listbox selection window-export([select/3]).-record(state, {topwin, frame, listbox}).%% Constants-define(WIN_WIDTH, 350).-define(WIN_HEIGHT, 350).select(Win, Title, Choices) -> Self = self(), Pid = spawn_link(fun() -> init(Self, Win, Title, Choices) end), receive {Pid, Result} -> Result end.init(Pid, Win, Title, Choices) -> %% Create window State = create_window(Win, Title, Choices), gse:map(State#state.topwin), %% enter event loop loop(Pid, Choices, State).loop(Pid, Choices, State) -> receive {gs, _, destroy, _Data, _Args} -> Pid ! {self(), cancelled}; {gs, _, configure, _Data, [W, H|_]} -> gse:resize(State#state.frame, W, H), loop(Pid, Choices, State); {gs, _, click, ok, _Args} -> case gs:read(State#state.listbox, selection) of [] -> Pid ! {self(), cancelled}; Indices -> Selection = selection(Indices, Choices), Pid ! {self(), Selection} end; {gs, _, click, cancel, _Args} -> Pid ! {self(), cancelled}; {gs, Obj, doubleclick, _Data, _Args} -> self() ! {gs, Obj, click, ok, []}, loop(Pid, Choices, State); _GSEvent -> loop(Pid, Choices, State) end.selection(Indices, Choices) -> selection(0, Indices, Choices).selection(I, [I|Is], [{Val,_Str}|Vals]) -> [Val | selection(I+1, Is, Vals)];selection(I, [I|Is], [Val|Vals]) -> [Val | selection(I+1, Is, Vals)];selection(_I, [], _Vals) -> [];selection(I, Is, [_Val|Vals]) -> selection(I+1, Is, Vals). create_window(Win, Title, Choices) -> Font = pman_win:font(Win), %% Top window and a frame that covers it entirely, to allow %% usage of the packer for geometry management. Topwin = gse:window(Win, [{width, ?WIN_WIDTH}, {height,?WIN_HEIGHT}, {configure, true}, {title, Title}]), Frame = gse:frame(Topwin, [{packer_x,[{stretch,1}, {stretch,1}]}, {packer_y,[{stretch,1}, {stretch,5}, {stretch,1}]}]), %% Caption above the list of items CaptionTxt = "Select one or more of the following:", gse:label(Frame, [{pack_x,{1,2}}, {pack_y,{1,1}}, {label,{text,CaptionTxt}}, {font,Font}]), %% List of selectable items Listbox = gse:listbox(Frame, [{pack_x,{1,2}}, {pack_y,{2,2}}, {selectmode,multiple}, {doubleclick, true}, {font,Font}, {items, str_choices(Choices)}]), %% OK and Cancel buttons in a separate frame. F13 = gse:frame(Frame, [{bw,1}, {pack_xy,{{1,2},3}}, {packer_x,[{stretch,1}, {fixed, 60}, {stretch,1}, {fixed, 60}, {stretch,1}]}, {packer_y,[{stretch,1}, {fixed, 30}, {stretch,1}]}]), gse:button(F13, [{pack_xy,{2,2}}, {label,{text,"OK"}}, {font,Font}, {data,ok}]), gse:button(F13, [{pack_xy,{4,2}}, {label,{text,"Cancel"}}, {font,Font}, {data,cancel}]), gse:resize(Frame, ?WIN_WIDTH, ?WIN_HEIGHT), #state{topwin=Topwin, frame=Frame, listbox=Listbox}.str_choices(Choices) -> lists:map( fun({Val, Str}) -> lists:flatten(io_lib:format("~p: ~s", [Val, Str])); (Term) -> lists:flatten(io_lib:format("~p", [Term])) end, Choices).
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?