aboutsummaryrefslogtreecommitdiffstats
path: root/lib/observer/src/observer_tv_wx.erl
diff options
context:
space:
mode:
authorDan Gudmundsson <[email protected]>2011-10-03 14:12:32 +0200
committerDan Gudmundsson <[email protected]>2011-11-08 08:46:08 +0100
commitffcacd111c61019a502a895b1edcfbc1578ddfa7 (patch)
tree5eb16cad1a8406e261f1e0c3f7cf2228e3d36c06 /lib/observer/src/observer_tv_wx.erl
parent41dc04f0b76474596076bdc909760228fffc6a73 (diff)
downloadotp-ffcacd111c61019a502a895b1edcfbc1578ddfa7.tar.gz
otp-ffcacd111c61019a502a895b1edcfbc1578ddfa7.tar.bz2
otp-ffcacd111c61019a502a895b1edcfbc1578ddfa7.zip
[observer] Clean up code
system tab, timer handling and "etop" code More info in system tab, same timer handling in all tabs. Remove dependency off etop process, do the roughly the same functionality on our own.
Diffstat (limited to 'lib/observer/src/observer_tv_wx.erl')
-rw-r--r--lib/observer/src/observer_tv_wx.erl164
1 files changed, 22 insertions, 142 deletions
diff --git a/lib/observer/src/observer_tv_wx.erl b/lib/observer/src/observer_tv_wx.erl
index 10b29cb1b7..230195c9de 100644
--- a/lib/observer/src/observer_tv_wx.erl
+++ b/lib/observer/src/observer_tv_wx.erl
@@ -25,10 +25,6 @@
-export([get_table_list/1]). %% RPC called move to runtime tools?
--export([get_wx_parent/1, interval_dialog/5]).
-
--import(observer_pro_wx, [to_str/1]).
-
-behaviour(wx_object).
-include_lib("wx/include/wx.hrl").
-include("observer_defs.hrl").
@@ -58,8 +54,7 @@
opt=#opt{},
selected,
tabs,
- refr_timer=false,
- refr_intv=30
+ timer
}).
start_link(Notebook, Parent) ->
@@ -97,7 +92,8 @@ init([Notebook, Parent]) ->
wxListCtrl:connect(Grid, size, [{skip, true}]),
wxWindow:setFocus(Grid),
- {Panel, #state{grid=Grid, parent=Parent}}.
+ Timer = observer_lib:start_timer(10),
+ {Panel, #state{grid=Grid, parent=Parent, timer=Timer}}.
handle_event(#wx{id=?ID_REFRESH},
State = #state{node=Node, grid=Grid, opt=Opt}) ->
@@ -164,31 +160,14 @@ handle_event(#wx{id=?ID_TABLE_INFO},
{noreply, State};
R when is_integer(R) ->
Table = lists:nth(Sel+1, Tabs),
- Parent = get_wx_parent(Grid),
- display_table_info(Parent, Node, Type, Table),
+ display_table_info(Grid, Node, Type, Table),
{noreply, State}
end;
handle_event(#wx{id=?ID_REFRESH_INTERVAL},
- State = #state{grid=Grid, refr_timer=Timer0, refr_intv=Intv0}) ->
- Parent = get_wx_parent(Grid),
- case interval_dialog(Parent, Timer0 /= false, Intv0, 10, 5*60) of
- cancel ->
- {noreply, State};
- {true, Intv} ->
- case Timer0 of
- false -> ok;
- _ -> timer:cancel(Timer0)
- end,
- {ok, Timer} = timer:send_interval(Intv * 1000, refresh_interval),
- {noreply, State#state{refr_timer=Timer, refr_intv=Intv}};
- {false, _} ->
- case Timer0 of
- false -> ok;
- _ -> timer:cancel(Timer0)
- end,
- {noreply, State#state{refr_timer=false}}
- end;
+ State = #state{grid=Grid, timer=Timer0}) ->
+ Timer = observer_lib:interval_dialog(Grid, Timer0, 10, 5*60),
+ {noreply, State#state{timer=Timer}};
handle_event(Event, State) ->
io:format("~p:~p, handle event ~p\n", [?MODULE, ?LINE, Event]),
@@ -207,36 +186,22 @@ handle_cast(Event, State) ->
{noreply, State}.
handle_info(refresh_interval, State = #state{node=Node, grid=Grid, opt=Opt}) ->
- io:format("refresh interval ~p~n", [time()]),
Tables = get_tables(Node, Opt),
Tabs = update_grid(Grid, Opt, Tables),
{noreply, State#state{tabs=Tabs}};
-handle_info({active, Node},
- State = #state{parent=Parent, grid=Grid, opt=Opt,
- refr_timer = Refr, refr_intv=Intv}) ->
+handle_info({active, Node}, State = #state{parent=Parent, grid=Grid, opt=Opt,
+ timer=Timer0}) ->
Tables = get_tables(Node, Opt),
Tabs = update_grid(Grid, Opt, Tables),
wxWindow:setFocus(Grid),
create_menus(Parent, Opt),
- Timer = case Refr of
- true ->
- {ok, Ref} = timer:send_interval(Intv*1000, refresh_interval),
- Ref;
- false ->
- false
- end,
- {noreply, State#state{node=Node, tabs=Tabs, refr_timer=Timer}};
-
-handle_info(not_active, State = #state{refr_timer = Timer0}) ->
- Timer = case Timer0 of
- false -> false;
- true -> true;
- Timer0 ->
- timer:cancel(Timer0),
- true
- end,
- {noreply, State#state{refr_timer=Timer}};
+ Timer = observer_lib:start_timer(Timer0),
+ {noreply, State#state{node=Node, tabs=Tabs, timer=Timer}};
+
+handle_info(not_active, State = #state{timer = Timer0}) ->
+ Timer = observer_lib:stop_timer(Timer0),
+ {noreply, State#state{timer=Timer}};
handle_info({node, Node}, State = #state{grid=Grid, opt=Opt}) ->
Tables = get_tables(Node, Opt),
@@ -370,7 +335,8 @@ get_table_list(#opt{type=mnesia, sys_hidden=HideSys}) ->
end,
lists:foldl(Info, [], mnesia:system_info(tables)).
-display_table_info(Parent, Node, Source, Table) ->
+display_table_info(Parent0, Node, Source, Table) ->
+ Parent = observer_lib:get_wx_parent(Parent0),
Title = "Table Info: " ++ atom_to_list(Table#tab.name),
Frame = wxMiniFrame:new(Parent, ?wxID_ANY, Title,
[{style, ?wxCAPTION bor ?wxCLOSE_BOX bor ?wxRESIZE_BORDER}]),
@@ -407,10 +373,10 @@ display_table_info(Parent, Node, Source, Table) ->
| MnesiaSettings ]},
Memory = {"Memory Usage",
[{"Number of objects", Table#tab.size},
- {"Memory allocated", integer_to_list(Table#tab.memory div 1024) ++ "kB"},
+ {"Memory allocated", {bytes, Table#tab.memory}},
{"Compressed", Table#tab.compressed}]},
- Sizer = display_info_wx(Frame, [IdInfo, Settings, Memory]),
+ {_, Sizer, _} = observer_lib:display_info(Frame, [IdInfo,Settings,Memory]),
wxSizer:setSizeHints(Sizer, Frame),
wxFrame:center(Frame),
wxFrame:show(Frame).
@@ -420,44 +386,6 @@ list_to_strings([A]) -> integer_to_list(A);
list_to_strings([A,B]) ->
integer_to_list(A) ++ " ," ++ list_to_strings(B).
-get_wx_parent(Window) ->
- Parent = wxWindow:getParent(Window),
- case wx:is_null(Parent) of
- true -> Window;
- false -> get_wx_parent(Parent)
- end.
-
-display_info_wx(Frame, Info) ->
- Panel = wxPanel:new(Frame),
- wxWindow:setBackgroundColour(Panel, {255,255,255}),
- Sizer = wxBoxSizer:new(?wxVERTICAL),
- wxSizer:addSpacer(Sizer, 5),
- Add = fun(BoxInfo) ->
- Box = create_box(Panel, BoxInfo),
- wxSizer:add(Sizer, Box, [{flag, ?wxEXPAND bor ?wxALL},
- {border, 5}])
- end,
- [Add(I) || I <- Info],
- wxSizer:addSpacer(Sizer, 5),
- wxWindow:setSizerAndFit(Panel, Sizer),
- Sizer.
-
-create_box(Panel, {Title, Info}) ->
- Box = wxStaticBoxSizer:new(?wxHORIZONTAL, Panel, [{label, Title}]),
- Left = wxBoxSizer:new(?wxVERTICAL),
- Right = wxBoxSizer:new(?wxVERTICAL),
- Expand = [{flag, ?wxEXPAND}],
- AddRow = fun({Desc, Value}) ->
- wxSizer:add(Left, wxStaticText:new(Panel, ?wxID_ANY, Desc ++ ":"), Expand),
- wxSizer:add(Right, wxStaticText:new(Panel, ?wxID_ANY, to_str(Value)), Expand)
- end,
- [AddRow(Entry) || Entry <- Info],
- wxSizer:add(Box, Left),
- wxSizer:addSpacer(Box, 10),
- wxSizer:add(Box, Right),
- wxSizer:addSpacer(Box, 30),
- Box.
-
sys_tables() ->
[ac_tab, asn1,
cdv_dump_index_table, cdv_menu_table, cdv_decode_heap_table,
@@ -512,56 +440,8 @@ mnesia_tables() ->
].
handle_error(Foo) ->
- try
- Str = io_lib:format("ERROR: ~s~n",[Foo]),
- display_info(Str)
- catch _:_ ->
- display_info(io_lib:format("ERROR: ~p~n",[Foo]))
- end,
- ok.
-
-display_info(Str) ->
- Dlg = wxMessageDialog:new(wx:null(), Str),
- wxMessageDialog:showModal(Dlg),
- wxMessageDialog:destroy(Dlg),
- ok.
-
-interval_dialog(Parent, Enabled, Value, Min, Max) ->
- Dialog = wxDialog:new(Parent, ?wxID_ANY, "Update Interval",
- [{style, ?wxDEFAULT_DIALOG_STYLE bor
- ?wxRESIZE_BORDER}]),
- Panel = wxPanel:new(Dialog),
- Check = wxCheckBox:new(Panel, ?wxID_ANY, "Periodical refresh"),
- wxCheckBox:setValue(Check, Enabled),
- Style = ?wxSL_HORIZONTAL bor ?wxSL_AUTOTICKS bor ?wxSL_LABELS,
- Slider = wxSlider:new(Panel, ?wxID_ANY, Value, Min, Max,
- [{style, Style}, {size, {200, -1}}]),
- wxWindow:enable(Slider, [{enable, Enabled}]),
- InnerSizer = wxBoxSizer:new(?wxVERTICAL),
- Buttons = wxDialog:createButtonSizer(Dialog, ?wxOK bor ?wxCANCEL),
- Flags = [{flag, ?wxEXPAND bor ?wxALL}, {border, 2}],
- wxSizer:add(InnerSizer, Check, Flags),
- wxSizer:add(InnerSizer, Slider, Flags),
- wxPanel:setSizer(Panel, InnerSizer),
- TopSizer = wxBoxSizer:new(?wxVERTICAL),
- wxSizer:add(TopSizer, Panel, [{flag, ?wxEXPAND bor ?wxALL}, {border, 5}]),
- wxSizer:add(TopSizer, Buttons, [{flag, ?wxEXPAND}]),
- wxWindow:setSizerAndFit(Dialog, TopSizer),
- wxSizer:setSizeHints(TopSizer, Dialog),
- wxCheckBox:connect(Check, command_checkbox_clicked,
- [{callback, fun(#wx{event=#wxCommand{commandInt=Enable0}},_) ->
- Enable = Enable0 > 0,
- wxWindow:enable(Slider, [{enable, Enable}])
- end}]),
- Res = case wxDialog:showModal(Dialog) of
- ?wxID_OK ->
- {wxCheckBox:isChecked(Check), wxSlider:getValue(Slider)};
- ?wxID_CANCEL ->
- cancel
- end,
- wxDialog:destroy(Dialog),
- Res.
-
+ Str = io_lib:format("ERROR: ~s~n",[Foo]),
+ observer_lib:display_info_dialog(Str).
update_grid(Grid, Opt, Tables) ->
wx:batch(fun() -> update_grid2(Grid, Opt, Tables) end).
@@ -582,7 +462,7 @@ update_grid2(Grid, #opt{sort_key=Sort,sort_incr=Dir}, Tables) ->
lists:foreach(fun({_, ignore}) -> ignore;
({Col, Val}) ->
- wxListCtrl:setItem(Grid, Row, Col, to_str(Val))
+ wxListCtrl:setItem(Grid, Row, Col, observer_lib:to_str(Val))
end,
[{0,Name}, {1,Id}, {2,Size}, {3, Memory div 1024},
{4,Owner}, {5,RegName}]),