aboutsummaryrefslogtreecommitdiffstats
path: root/lib/gs/examples/man.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gs/examples/man.erl')
-rw-r--r--lib/gs/examples/man.erl192
1 files changed, 192 insertions, 0 deletions
diff --git a/lib/gs/examples/man.erl b/lib/gs/examples/man.erl
new file mode 100644
index 0000000000..a0ffd3364e
--- /dev/null
+++ b/lib/gs/examples/man.erl
@@ -0,0 +1,192 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1996-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%
+%%
+
+%%
+%% ------------------------------------------------------------
+%% Simple Manual Page Browser
+%% ------------------------------------------------------------
+
+-module(man).
+
+-export([start/0,init/0]).
+-export([man_list/0]).
+-export([browser/1,browser_init/2]).
+
+
+start() ->
+ case whereis(man) of
+ undefined ->
+ register(man,Pid=spawn(man,init,[])),
+ Pid;
+ Pid ->
+ Pid
+ end.
+
+
+%% ---- Man Directories -----
+dirManual() ->
+ filename:join([code:root_dir(), "man", "cat3"]).
+
+
+%% ----- init -----
+init() ->
+ S=gs:start(),
+ Width=520,Height=520,
+ gs:create(window,win,S,[{title,"Manual Browser"},
+ {width,Width},{height,Height}]),
+ gs:create(button,quit,win,[{width,60},{label,{text,"Quit"}}]),
+ gs:create(button,select,win,[{x,60},{label,{text,"Select Page"}}]),
+ gs:create(editor,editor,win,[{y,30},{width,Width},{height,Height-30},
+ {hscroll,false},{vscroll,left}]),
+ gs:config(win,[{map,true},{configure,true}]),
+ man_loop(Width,Height).
+
+man_loop(Width0,Height0) ->
+ receive
+ {gs,_Win,configure,_,[Width0,Height0|_]} -> %% already got that size!
+ man_loop(Width0,Height0);
+ {gs,_Win,configure,_,[Width,Height|_]} ->
+ %%io:format("man: width=~w, height=~w ~n",[Width,Height]),
+ gs:config(editor,[{width,Width},{height,Height-30}]),
+ man_loop(Width,Height);
+ {gs,quit,click,_,_} ->
+ %%io:format("man: exiting.~n",[]),
+ exit(normal);
+ {gs,select,click,_,_} ->
+ case browser(man_list()) of
+ cancel -> true;
+ {ok,Page} -> load_page(Page);
+ O -> io:format("man: bad browser result: ~w~n",[O])
+ end,
+ man_loop(Width0,Height0);
+ {gs,_,destroy,_,_} ->
+ exit(normal);
+ X ->
+ io:format("man: got other: ~w~n",[X]),
+ man_loop(Width0,Height0)
+ end.
+
+
+%% ----- man_list ----
+%%
+man_list() ->
+ {ok,FirstList} = file:list_dir(dirManual()),
+ SecondList =
+ mapfilter(fun(File) ->
+ case filename:extension(File) of
+ ".3" ->
+ {true, filename:basename(File, ".3")};
+ _ -> false
+ end
+ end,
+ FirstList),
+ lists:sort(SecondList).
+
+mapfilter(Fun, [H|T]) ->
+ case Fun(H) of
+ {true, Val} ->
+ [Val|mapfilter(Fun, T)];
+ false ->
+ mapfilter(Fun, T)
+ end;
+mapfilter(_Fun, []) ->
+ [].
+
+
+%% ------------------------------------------------------------
+%% Load in the Page
+
+load_page(Page) ->
+ %%io:format("man: load page start ~p.~n",[Page]),
+ Filename = filename:join([dirManual(),Page++".3"]),
+ {ok,Bin}=file:read_file(Filename),
+ _Txt=binary_to_list(Bin),
+ gs:config(editor,{enable,true}),
+ gs:config(editor,{load,Filename}),
+ gs:config(editor,{enable,false}),
+ %%io:format("man: load page done.~n",[]),
+ true.
+
+
+%% ------------------------------------------------------------
+%% Simple Browser
+%% ------------------------------------------------------------
+
+browser(Items) ->
+ Browser=spawn_link(man,browser_init,[self(),Items]),
+ await_reply(Browser).
+
+await_reply(Browser) ->
+ receive
+ {browser,Result} ->
+ Result;
+ {gs,_,destroy,_,_} -> exit(normal);
+ {gs,quit,click,_,_} -> exit(normal);
+ {gs,select,click,_,_} ->
+ Browser ! wake_up,
+ await_reply(Browser)
+ end.
+
+browser_init(Pid,Items) ->
+ process_flag(trap_exit,true),
+ S=gs:start(),
+ Win=gs:window(win,S,[{width,250},{height,270},{title,"Browser"}]),
+ _Lbl=gs:label(Win,[{label,{text,"Select a Manual Page"}},{width,250}]),
+ gs:label(Win,[{width,40},{y,35},{label,{text,"Page:"}}]),
+ Entry=gs:entry(Win,[{y,35},{width,205},{x,40},
+ {keypress,true},{focus,true}]),
+ Lb=gs:listbox(Win,[{x,5},{y,65},{width,160},{height,195},
+ {vscroll,right},{click,true},{doubleclick,true}]),
+ Ok=gs:button(Win,[{label,{text,"OK"}},{width,40},{x,185},{y,175}]),
+ Cancel=gs:button(Win,[{label,{text,"Cancel"}},{x,175},{y,225},{width,65}]),
+ gs:config(Lb,[{items,Items}]),
+ gs:config(Win,{map,true}),
+ browser_loop(Pid,Ok,Cancel,Entry,Lb).
+
+browser_loop(Pid,Ok,Cancel,Entry,Lb) ->
+ receive
+ {gs,Ok,click,_,_} ->
+ Txt=gs:read(Entry,text),
+ Pid ! {browser,{ok,Txt}};
+ {gs,Cancel,click,_,_} ->
+ Pid ! {browser,cancel};
+ {gs,Entry,keypress,_,['Return'|_]} ->
+ Txt=gs:read(Entry,text),
+ Pid ! {browser,{ok,Txt}};
+ {gs,Entry,keypress,_,_} ->
+ browser_loop(Pid,Ok,Cancel,Entry,Lb);
+ {gs,Lb,click,_,[_Idx, Txt| _Rest]} ->
+ gs:config(Entry,{text,Txt}),
+ browser_loop(Pid,Ok,Cancel,Entry,Lb);
+ {gs,Lb,doubleclick,_,[_Idx, Txt| _Rest]} ->
+ Pid ! {browser,{ok,Txt}};
+ {gs,_,destroy,_,_} ->
+ Pid ! {browser,cancel};
+ wake_up ->
+ gs:config(win,[{iconify,false},raise]),
+ browser_loop(Pid,Ok,Cancel,Entry,Lb);
+ {'EXIT',_Man,Why} ->
+ exit(Why);
+ X ->
+ io:format("man: browser got other: ~w.~n",[X]),
+ browser_loop(Pid,Ok,Cancel,Entry,Lb)
+ end.
+
+%% ------------------------------------------------------------
+%% end of man.erl