man.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 190 行
ERL
190 行
%% ``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$%%%% ------------------------------------------------------------%% 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 Pageload_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
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?