%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2008-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(dbg_wx_interpret).
-include_lib("kernel/include/file.hrl").
-include_lib("wx/include/wx.hrl").
%% External exports
-export([start/4]).
%%====================================================================
%% External exports
%%====================================================================
%%--------------------------------------------------------------------
%% start(Win, Pos, Dir, Mode)
%% GS = Graphics system id
%% Dir = string()
%% Pos = {X,Y}
%% Mode = local | global
%%--------------------------------------------------------------------
start(Win, Pos, SDir, Mode) ->
Title = "Interpret Modules",
FD = dbg_wx_filedialog_win:new(Win, -1,
[{message,Title}, {pos,Pos},
{defaultDir,SDir},
{sort, type},
{filter, fun filter_files/2}]),
case wxFileDialog:showModal(FD) of
?wxID_OK ->
Files = dbg_wx_filedialog_win:getFilenames(FD),
Dir = dbg_wx_filedialog_win:getDirectory(FD),
dbg_wx_filedialog_win:destroy(FD),
interpret_all(Dir, Files, Mode, Win, []),
self() ! {dbg_ui_interpret, Dir},
ok;
_ ->
dbg_wx_filedialog_win:destroy(FD),
cancel
end.
filter_files(Dir, Name) ->
case filename:extension(Name) of
".erl" ->
File = filename:join(Dir, Name),
case int:interpretable(File) of
true ->
{"erl src", erl_src, {0,0,0}};
_ ->
{"erl src no dbg", erl_src, {128,128,128}}
end;
".hrl" ->
{"erl hrl", erl_hrl, {128,128,128}};
".beam" ->
{"erl bin", erl_bin, {128,128,128}};
_ ->
{"file", file, {128,128,128}}
end.
%%% Standard file browser variant
%% start(Win, Pos, SDir, Mode) ->
%% Title = "Interpret Dialog",
%% Filter = "*.erl",
%% FD = FileDialog:new(Win, [{message,Title},{pos, Pos},
%% {defaultDir,SDir},
%% {wildCard, Filter},
%% {style,?wxFD_OPEN bor ?wxFD_MULTIPLE}]),
%% case wxFileDialog:showModal(FD) of
%% ?wxID_OK ->
%% Files = wxFileDialog:getFilenames(FD),
%% Dir = wxFileDialog:getDirectory(FD),
%% wxFileDialog:destroy(FD),
%% interpret_all(Dir, Files, Mode, Win),
%% self() ! {dbg_ui_interpret, Dir},
%% ok;
%% _ ->
%% wxFileDialog:destroy(FD),
%% cancel
%% end.
interpret_all(Dir, [File0|Files], Mode, Window, Errors) ->
File = filename:join(Dir, File0),
Res = case Mode of
local -> int:i(File);
global -> int:ni(File)
end,
case Res of
{module, _Mod} ->
interpret_all(Dir, Files, Mode, Window, Errors);
error ->
interpret_all(Dir, Files, Mode, Window, [File0|Errors])
end;
interpret_all(_Dir, [], _Mode, _Window, []) ->
true;
interpret_all(Dir, [], _Mode, Window, Errors) ->
Msg = lists:map(fun(Name) ->
File = filename:join(Dir, Name),
Error = format_error(int:interpretable(File)),
["\n ",Name,": ",Error]
end, Errors),
All = ["Error when interpreting: ", Msg],
dbg_wx_win:confirm(Window, lists:flatten(All)),
true.
format_error({error,no_beam}) -> "No BEAM file";
format_error({error,no_debug_info}) -> "No debug_info in BEAM file";
format_error({error,badarg}) -> "File does not exist";
format_error({error,{app,App}}) ->
"Cannot interpret "++atom_to_list(App)++" modules".