%% %% %CopyrightBegin% %% %% Copyright Ericsson AB 2008-2016. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions 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 = [begin File = filename:join(Dir, Name), Error = format_error(int:interpretable(File)), ["\n ",Name,": ",Error] end || Name <- 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".