aboutsummaryrefslogtreecommitdiffstats
path: root/lib/pman/src/pman_tool.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/pman/src/pman_tool.erl')
-rw-r--r--lib/pman/src/pman_tool.erl145
1 files changed, 145 insertions, 0 deletions
diff --git a/lib/pman/src/pman_tool.erl b/lib/pman/src/pman_tool.erl
new file mode 100644
index 0000000000..1d33fb9764
--- /dev/null
+++ b/lib/pman/src/pman_tool.erl
@@ -0,0 +1,145 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-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(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).