aboutsummaryrefslogtreecommitdiffstats
path: root/lib/pman/src/pman_module_info.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/pman/src/pman_module_info.erl')
-rw-r--r--lib/pman/src/pman_module_info.erl131
1 files changed, 131 insertions, 0 deletions
diff --git a/lib/pman/src/pman_module_info.erl b/lib/pman/src/pman_module_info.erl
new file mode 100644
index 0000000000..cfd711a6e1
--- /dev/null
+++ b/lib/pman/src/pman_module_info.erl
@@ -0,0 +1,131 @@
+%%
+%% %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_module_info).
+
+%% Window with module information (View->Module Info...)
+
+%% External exports
+-export([start/1]).
+
+%% Record for keeping the loop state for the
+%% module info process.
+-record(state, {topwin, % GS identifier for top window
+ editor, % GS identifier for editor
+ module, % Name of the viewed module
+ parent}). % Pid of the parent
+
+start(Module) ->
+ Self = self(),
+ spawn_link(fun() -> init(Module, Self) end).
+
+init(Module, Parent) ->
+ process_flag(trap_exit, true),
+
+ GS = gs:start([{kernel,true}]),
+ Font = pman_win:font(GS),
+
+ WinTitle = lists:flatten(io_lib:format("Pman - Module Info: ~p",
+ [Module])),
+ WinOptions = [{title,WinTitle}, {width,550}, {height, 400},
+ {configure,true}, {keypress,true}, {destroy,true}],
+ TopWindow = gse:window(GS, WinOptions),
+
+ %% File menu
+ MenuBar = gse:menubar(TopWindow, []),
+ MBFile = gse:menubutton(MenuBar, [{label,{text," File "}},
+ {font,Font}, {underline, 1}]),
+ MenuFile = gse:menu(MBFile, []),
+
+ gse:named_menuitem('Save buffer', MenuFile,
+ [{label,{text,"Save buffer..."}},
+ {font,Font}, {underline,0}]),
+ gse:named_menuitem('Close', MenuFile,
+ [{label,{text,"Close"}},
+ {font,Font}, {underline,0}]),
+
+ %% Output part of window
+ Editor = gse:editor(TopWindow,
+ [{font,Font},
+ {x,3}, {y,40}, {width,546}, {height,348}]),
+ gse:config(Editor, [{keypress,true},
+ {insert,{'end',pman_win:module_data(Module)}}]),
+ gse:config(Editor, [{enable,false},
+ {vscroll,right}, {hscroll,bottom},
+ {wrap,none}]),
+ gse:map(TopWindow),
+
+ State = #state{topwin=TopWindow, editor=Editor, module=Module,
+ parent=Parent},
+ loop(State).
+
+loop(State) ->
+
+ receive
+ %% Die if the parent dies
+ {'EXIT', Pid, _Reason} when Pid==State#state.parent ->
+ gse:destroy(State#state.topwin);
+
+ %% Ignore other exit signals (from file dialog window)
+ {'EXIT', _Pid, _Reason} ->
+ loop(State);
+
+ %% Window closed
+ {gs, _TopWindow, destroy, [], []} ->
+ ok;
+
+ %% Window resized or moved
+ {gs, _TopWindow, configure ,_Data, [W,H,_X,_Y|_]} ->
+ gs:config(State#state.editor, [{width,W-3}, {height,H-40}]),
+ loop(State);
+
+ %% Close - destroy window and exit process
+ {gs, 'Close', click, _Data, _Args} ->
+ gse:destroy(State#state.topwin),
+ ok;
+
+ %% Save Buffer - make filename and save buffer to file
+ {gs, 'Save buffer', click, _Data, _Args} ->
+ save_buffer(State),
+ loop(State);
+
+ %% Keyboard accelerator commands
+ {gs, _, keypress, [], [c,_,0,1]} -> % 'Close'
+ gse:destroy(State#state.topwin),
+ ok;
+ {gs, _, keypress, [], [s,_,0,1]} -> % 'Save buffer'
+ save_buffer(State),
+ loop(State);
+ {gs, _, keypress, _Data, _Args} ->
+ loop(State)
+ end.
+
+save_buffer(State) ->
+ DefaultFile = atom_to_list(State#state.module) ++ ".module_info",
+ Result = tool_utils:file_dialog([{type,save}, {file,DefaultFile}]),
+ case Result of
+ %% User selected a file, now save the result
+ {ok, File, _Dir} ->
+ gs:config(State#state.editor, {save,File}),
+ Msg = "Module information saved in file\n" ++ File,
+ tool_utils:notify(State#state.topwin, Msg);
+
+ %% File dialog was cancelled in some way.
+ {error, _Reason} ->
+ ignore
+ end.