aboutsummaryrefslogtreecommitdiffstats
path: root/lib/tv/src
diff options
context:
space:
mode:
Diffstat (limited to 'lib/tv/src')
-rw-r--r--lib/tv/src/Makefile135
-rw-r--r--lib/tv/src/tv.app.src56
-rw-r--r--lib/tv/src/tv.appup.src18
-rw-r--r--lib/tv/src/tv.erl38
-rw-r--r--lib/tv/src/tv_comm_func.erl77
-rw-r--r--lib/tv/src/tv_db.erl1271
-rw-r--r--lib/tv/src/tv_db_int_def.hrl80
-rw-r--r--lib/tv/src/tv_db_search.erl475
-rw-r--r--lib/tv/src/tv_db_sort.erl141
-rw-r--r--lib/tv/src/tv_ets_rpc.erl140
-rw-r--r--lib/tv/src/tv_etsread.erl770
-rw-r--r--lib/tv/src/tv_info.erl884
-rw-r--r--lib/tv/src/tv_int_def.hrl56
-rw-r--r--lib/tv/src/tv_int_msg.hrl504
-rw-r--r--lib/tv/src/tv_io_lib.erl223
-rw-r--r--lib/tv/src/tv_io_lib_format.erl386
-rw-r--r--lib/tv/src/tv_io_lib_pretty.erl171
-rw-r--r--lib/tv/src/tv_ip.erl242
-rw-r--r--lib/tv/src/tv_main.erl1821
-rw-r--r--lib/tv/src/tv_main.hrl285
-rw-r--r--lib/tv/src/tv_mnesia_rpc.erl106
-rw-r--r--lib/tv/src/tv_new_table.erl666
-rw-r--r--lib/tv/src/tv_nodewin.erl412
-rw-r--r--lib/tv/src/tv_pb.erl663
-rw-r--r--lib/tv/src/tv_pb_funcs.erl1056
-rw-r--r--lib/tv/src/tv_pb_int_def.hrl99
-rw-r--r--lib/tv/src/tv_pc.erl795
-rw-r--r--lib/tv/src/tv_pc_graph_ctrl.erl120
-rw-r--r--lib/tv/src/tv_pc_int_def.hrl62
-rw-r--r--lib/tv/src/tv_pc_menu_handling.erl489
-rw-r--r--lib/tv/src/tv_pd.erl1127
-rw-r--r--lib/tv/src/tv_pd_display.erl1066
-rw-r--r--lib/tv/src/tv_pd_frames.erl482
-rw-r--r--lib/tv/src/tv_pd_int_def.hrl139
-rw-r--r--lib/tv/src/tv_pd_int_msg.hrl433
-rw-r--r--lib/tv/src/tv_pd_scale.erl305
-rw-r--r--lib/tv/src/tv_pg.erl430
-rw-r--r--lib/tv/src/tv_pg_gridfcns.erl1918
-rw-r--r--lib/tv/src/tv_pg_int_def.hrl92
-rw-r--r--lib/tv/src/tv_poll_dialog.erl363
-rw-r--r--lib/tv/src/tv_pw.erl328
-rw-r--r--lib/tv/src/tv_pw_int_def.hrl55
-rw-r--r--lib/tv/src/tv_pw_window.erl277
-rw-r--r--lib/tv/src/tv_rec_edit.erl754
-rw-r--r--lib/tv/src/tv_table_owner.erl122
-rw-r--r--lib/tv/src/tv_utils.erl179
46 files changed, 0 insertions, 20311 deletions
diff --git a/lib/tv/src/Makefile b/lib/tv/src/Makefile
deleted file mode 100644
index 3d680c1eaf..0000000000
--- a/lib/tv/src/Makefile
+++ /dev/null
@@ -1,135 +0,0 @@
-#
-# %CopyrightBegin%
-#
-# Copyright Ericsson AB 1997-2012. 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%
-include $(ERL_TOP)/make/target.mk
-include $(ERL_TOP)/make/$(TARGET)/otp.mk
-
-# ----------------------------------------------------
-# Application version
-# ----------------------------------------------------
-include ../vsn.mk
-VSN=$(TV_VSN)
-
-# ----------------------------------------------------
-# Release directory specification
-# ----------------------------------------------------
-RELSYSDIR = $(RELEASE_PATH)/lib/tv-$(VSN)
-
-# ----------------------------------------------------
-# Common Macros
-# ----------------------------------------------------
-
-MODULES= \
- tv \
- tv_comm_func \
- tv_db \
- tv_db_search \
- tv_db_sort \
- tv_ets_rpc \
- tv_etsread \
- tv_info \
- tv_io_lib \
- tv_io_lib_format \
- tv_io_lib_pretty \
- tv_ip \
- tv_main \
- tv_mnesia_rpc \
- tv_new_table \
- tv_nodewin \
- tv_pb \
- tv_pb_funcs \
- tv_pc \
- tv_pc_graph_ctrl \
- tv_pc_menu_handling \
- tv_pd \
- tv_pd_display \
- tv_pd_frames \
- tv_pd_scale \
- tv_pg \
- tv_pg_gridfcns \
- tv_poll_dialog \
- tv_pw \
- tv_pw_window \
- tv_rec_edit \
- tv_table_owner \
- tv_utils
-
-
-
-HRL_FILES= \
- tv_db_int_def.hrl \
- tv_int_def.hrl \
- tv_int_msg.hrl \
- tv_main.hrl \
- tv_pb_int_def.hrl \
- tv_pc_int_def.hrl \
- tv_pd_int_def.hrl \
- tv_pd_int_msg.hrl \
- tv_pg_int_def.hrl \
- tv_pw_int_def.hrl
-
-ERL_FILES= $(MODULES:%=%.erl)
-
-TARGET_FILES = $(MODULES:%=$(EBIN)/%.$(EMULATOR)) $(APP_TARGET) $(APPUP_TARGET)
-
-APP_FILE = tv.app
-APP_SRC = $(APP_FILE).src
-APP_TARGET = $(EBIN)/$(APP_FILE)
-
-APPUP_FILE = tv.appup
-APPUP_SRC = $(APPUP_FILE).src
-APPUP_TARGET = $(EBIN)/$(APPUP_FILE)
-# ----------------------------------------------------
-# FLAGS
-# ----------------------------------------------------
-ERL_COMPILE_FLAGS += +warn_obsolete_guard
-
-# ----------------------------------------------------
-# Targets
-# ----------------------------------------------------
-
-debug opt: $(TARGET_FILES)
-
-clean:
- rm -f $(TARGET_FILES)
- rm -f errs core *~
-
-$(APP_TARGET): $(APP_SRC) ../vsn.mk
- $(vsn_verbose)sed -e 's;%VSN%;$(VSN);' $< > $@
-
-$(APPUP_TARGET): $(APPUP_SRC) ../vsn.mk
- $(vsn_verbose)sed -e 's;%VSN%;$(VSN);' $< > $@
-
-docs:
-
-# ----------------------------------------------------
-# Special Targets
-# ----------------------------------------------------
-
-# ----------------------------------------------------
-# Release Target
-# ----------------------------------------------------
-include $(ERL_TOP)/make/otp_release_targets.mk
-
-release_spec: opt
- $(INSTALL_DIR) "$(RELSYSDIR)/src"
- $(INSTALL_DATA) $(HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src"
- $(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
-
-release_docs_spec:
-
diff --git a/lib/tv/src/tv.app.src b/lib/tv/src/tv.app.src
deleted file mode 100644
index e76c587868..0000000000
--- a/lib/tv/src/tv.app.src
+++ /dev/null
@@ -1,56 +0,0 @@
-%%
-%% %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%
-{application, tv,
- [{description, "tv Table Visualizer"},
- {vsn, "%VSN%"},
- {modules, [tv,
- tv_comm_func,
- tv_db,
- tv_db_search,
- tv_db_sort,
- tv_ets_rpc,
- tv_etsread,
- tv_info,
- tv_io_lib,
- tv_io_lib_format,
- tv_io_lib_pretty,
- tv_ip,
- tv_main,
- tv_mnesia_rpc,
- tv_new_table,
- tv_nodewin,
- tv_pb,
- tv_pb_funcs,
- tv_pc,
- tv_pc_graph_ctrl,
- tv_pc_menu_handling,
- tv_pd,
- tv_pd_display,
- tv_pd_frames,
- tv_pd_scale,
- tv_pg,
- tv_pg_gridfcns,
- tv_poll_dialog,
- tv_pw,
- tv_pw_window,
- tv_rec_edit,
- tv_table_owner,
- tv_utils
- ]},
- {registered,[tv_table_owner]},
- {applications, [kernel, stdlib, gs]}]}.
diff --git a/lib/tv/src/tv.appup.src b/lib/tv/src/tv.appup.src
deleted file mode 100644
index 0d918b6081..0000000000
--- a/lib/tv/src/tv.appup.src
+++ /dev/null
@@ -1,18 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2001-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%
-{"%VSN%",[],[]}.
diff --git a/lib/tv/src/tv.erl b/lib/tv/src/tv.erl
deleted file mode 100644
index 70bc945c63..0000000000
--- a/lib/tv/src/tv.erl
+++ /dev/null
@@ -1,38 +0,0 @@
-%%
-%% %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(tv).
-
--export([start/0,
- start_browser/6]).
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-start() ->
- tv_main:start().
-
-
-start_browser(Node, LocalNode, TableId, KindOfTable, TableName, ErrMsgMode) ->
- spawn_link(tv_pc, pc, [self(), Node, LocalNode, TableId, KindOfTable, TableName, ErrMsgMode]).
-
-
-
-
-
diff --git a/lib/tv/src/tv_comm_func.erl b/lib/tv/src/tv_comm_func.erl
deleted file mode 100644
index d57960e303..0000000000
--- a/lib/tv/src/tv_comm_func.erl
+++ /dev/null
@@ -1,77 +0,0 @@
-%%
-%% %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(tv_comm_func).
-
-
-
-
--export([max/2,
- min/2
- ]).
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-max(X, Y) when X > Y ->
- X;
-max(_X, Y) ->
- Y.
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-min(X, Y) when X < Y ->
- X;
-min(_X, Y) ->
- Y.
-
-
-
diff --git a/lib/tv/src/tv_db.erl b/lib/tv/src/tv_db.erl
deleted file mode 100644
index 75537418b3..0000000000
--- a/lib/tv/src/tv_db.erl
+++ /dev/null
@@ -1,1271 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. 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%
-%%%*********************************************************************
-%%%
-%%% Description: Module handling the internal database in the table tool.
-%%%
-%%%*********************************************************************
-
--module(tv_db).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([dbs/2]).
-
-
-
--include("tv_int_def.hrl").
--include("tv_int_msg.hrl").
--include("tv_db_int_def.hrl").
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-dbs(Master, ErrMsgMode) ->
- process_flag(trap_exit, true),
- put(error_msg_mode, ErrMsgMode),
- ProcVars = #process_variables{master_pid = Master},
- blocked(ProcVars).
-
-
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-blocked(ProcVars) ->
- receive
- Msg ->
- case Msg of
-
- #dbs_deblock{} ->
- deblock(Msg, ProcVars, false);
-
- {error_msg_mode, Mode} ->
- put(error_msg_mode, Mode),
- blocked(ProcVars);
-
- {'EXIT', Pid, Reason} ->
- MasterPid = ProcVars#process_variables.master_pid,
- exit_signals({Pid, Reason}, MasterPid),
- blocked(ProcVars);
-
- _Other ->
- blocked(ProcVars)
- end
- end.
-
-
-
-
-
-
-
-deblock(Msg, ProcVars, SearchWinCreated) ->
- #dbs_deblock{sender = Sender,
- etsread_pid = EtsreadPid,
- type = Type,
- keypos = KeyPos,
- sublist_length = SublistLength} = Msg,
-
- NewDbData = #db_data{subset_size = SublistLength,
- subset_pos = 1,
- key_no = KeyPos,
- ets_type = Type
- },
- NewProcVars = ProcVars#process_variables{db_data = NewDbData,
- etsread_pid = EtsreadPid},
- Sender ! #dbs_deblock_cfm{sender = self()},
- deblocked_loop(NewProcVars, SearchWinCreated, [], undefined).
-
-
-
-
-
-
-
-
-deblocked_loop(ProcVars, SearchWinCreated, SearchData, RegExp) ->
- receive
- Msg ->
- case Msg of
-
- {gs,entry,keypress,_Data,['Return' | _T]} ->
- NewSearchData = search_object(ProcVars, RegExp),
- deblocked_loop(ProcVars, SearchWinCreated, NewSearchData, RegExp);
-
- {gs,entry,keypress,_Data,['Tab' | _T]} ->
- gs:config(entry, [{select, {0,1000}}]),
- deblocked_loop(ProcVars, SearchWinCreated, SearchData, RegExp);
-
- {gs,entry,keypress,_Data,_Args} ->
- deblocked_loop(ProcVars, SearchWinCreated, SearchData, RegExp);
-
- {gs,expr_term,click,_Data,_Args} ->
- deblocked_loop(ProcVars, SearchWinCreated, SearchData, false);
-
- {gs,expr_regexp,click,_Data,_Args} ->
- deblocked_loop(ProcVars, SearchWinCreated, SearchData, true);
-
- {gs,search,click,_Data,_Args} ->
- NewSearchData = search_object(ProcVars, RegExp),
- deblocked_loop(ProcVars, SearchWinCreated, NewSearchData, RegExp);
-
- {gs,cancel,click,cancel,_Args} ->
- tv_db_search:destroy_window(SearchWinCreated),
- deblocked_loop(ProcVars, false, [], RegExp);
-
- {gs,listbox,click,_LbData,[Idx | _T]} when SearchData =/= [] ->
- tv_db_search:mark_busy(SearchWinCreated),
- {Row,_Obj} = lists:nth(Idx+1, SearchData),
- DbData = ProcVars#process_variables.db_data,
- %% Never allow 'subset_pos' to have zero as value!
- %% No list can begin with the 0:th element!!!
- %% Has to be at least 1!
- NewDbData = DbData#db_data{subset_pos=?COMM_FUNC_FILE:max(1,
- Row),
- subset_size=?ITEMS_TO_DISPLAY},
- NewProcVars = ProcVars#process_variables{db_data=NewDbData},
- send_subset(NewProcVars, undefined, undefined),
- tv_db_search:mark_nonbusy(SearchWinCreated),
- deblocked_loop(NewProcVars, SearchWinCreated, SearchData, RegExp);
-
- {gs,win,configure,_Data,_Args} ->
- tv_db_search:resize_window(SearchWinCreated),
- deblocked_loop(ProcVars, SearchWinCreated, SearchData, RegExp);
-
- {gs,win,destroy,_Data,_Args} ->
- deblocked_loop(ProcVars, false, [], RegExp);
-
-
- #dbs_new_data{data = NewData, keys = ListOfKeys,
- time_to_read_table = ElapsedTimeEtsread} ->
- tv_db_search:reset_window(SearchWinCreated),
- T1 = time(),
- NewProcVars = update_db(NewData, ListOfKeys, ProcVars),
- T2 = time(),
- ElapsedTimeDbs = compute_elapsed_seconds(T1, T2),
- send_subset(NewProcVars, ElapsedTimeEtsread, ElapsedTimeDbs),
- deblocked_loop(NewProcVars, SearchWinCreated, [], RegExp);
-
- #dbs_subset_req{subset_pos = Pos,subset_length = Length} ->
- DbData = ProcVars#process_variables.db_data,
- %% Never allow 'subset_pos' to have zero as value!
- %% No list can begin with the 0:th element!!!
- %% Has to be at least 1!
- NewDbData = DbData#db_data{subset_pos=?COMM_FUNC_FILE:max(1,
- Pos),
- subset_size=Length},
- NewProcVars = ProcVars#process_variables{db_data = NewDbData},
- send_subset(NewProcVars, undefined, undefined),
- deblocked_loop(NewProcVars, SearchWinCreated, SearchData, RegExp);
-
- #dbs_marked_row{row_no = RowNo} ->
- DbData = ProcVars#process_variables.db_data,
- NewDbData = DbData#db_data{requested_row = RowNo},
- NewProcVars = ProcVars#process_variables{db_data = NewDbData},
- deblocked_loop(NewProcVars, SearchWinCreated, SearchData, RegExp);
-
- #dbs_search_req{} ->
- tv_db_search:create_window(SearchWinCreated),
- deblocked_loop(ProcVars, true, SearchData, false);
-
- #dbs_sorting_mode{} ->
- {NewProcVars, NewSearchData} =
- update_sorting_mode(Msg, ProcVars,
- SearchWinCreated, SearchData, RegExp),
- deblocked_loop(NewProcVars, SearchWinCreated, NewSearchData, RegExp);
-
- #dbs_deblock{} ->
- tv_db_search:reset_window(SearchWinCreated),
- deblock(Msg, ProcVars, SearchWinCreated);
-
- #dbs_updated_object{object=Obj,old_object=OldObj,old_color=Color,obj_no=ObjNo} ->
- {Success, NewProcVars} = update_object(Obj, OldObj, Color, ObjNo, ProcVars),
- case Success of
- true ->
- tv_db_search:reset_window(SearchWinCreated),
- send_subset(NewProcVars, undefined, undefined);
- false ->
- done
- end,
- deblocked_loop(NewProcVars, SearchWinCreated, SearchData, RegExp);
-
- #dbs_new_object{object=Obj} ->
- {Success, NewProcVars} = new_object(Obj, ProcVars),
- case Success of
- true ->
- tv_db_search:reset_window(SearchWinCreated),
- send_subset(NewProcVars, undefined, undefined);
- false ->
- done
- end,
- deblocked_loop(NewProcVars, SearchWinCreated, SearchData, RegExp);
-
- #dbs_delete_object{object=Obj, color=Color, obj_no=ObjNo} ->
- {Success, NewProcVars} = delete_object(Obj, Color, ObjNo, ProcVars),
- case Success of
- true ->
- tv_db_search:reset_window(SearchWinCreated),
- send_subset(NewProcVars, undefined, undefined);
- false ->
- done
- end,
- deblocked_loop(NewProcVars, SearchWinCreated, SearchData, RegExp);
-
- #pc_list_info{lists_as_strings=ListAsStr} ->
- NewProcVars = ProcVars#process_variables{lists_as_strings=ListAsStr},
- deblocked_loop(NewProcVars, SearchWinCreated, SearchData, RegExp);
-
- {error_msg_mode, Mode} ->
- put(error_msg_mode, Mode),
- deblocked_loop(ProcVars, SearchWinCreated, SearchData, RegExp);
-
- {'EXIT', Pid, Reason} ->
- MasterPid = ProcVars#process_variables.master_pid,
- exit_signals({Pid, Reason}, MasterPid),
- deblocked_loop(ProcVars, SearchWinCreated, SearchData, RegExp);
-
- _Other ->
- %% io:format("Received message: ~w ~n", [_Other]),
- deblocked_loop(ProcVars, SearchWinCreated, SearchData, RegExp)
- end
- end.
-
-
-
-
-
-
-
-search_object(ProcVars, RegExp) ->
- DbData = ProcVars#process_variables.db_data,
- DbList = dblist2list(DbData#db_data.db),
- ListAsStr = ProcVars#process_variables.lists_as_strings,
- case catch tv_db_search:get_input_and_search(DbList, RegExp, ListAsStr) of
- {'EXIT', _Reason} ->
- tv_db_search:reset_window(true),
- [];
- List ->
- List
- end.
-
-
-
-
-
-
-update_sorting_mode(Msg, ProcVars, SearchWinCreated, OldSearchData, RegExp) ->
- #dbs_sorting_mode{sorting = Sorting,
- reverse = Reverse,
- sort_key_no = SortKeyNo} = Msg,
-
- DbData = ProcVars#process_variables.db_data,
-
- #db_data{db = DbList,
- sorting = OldSorting,
- rev_sorting = OldReverse,
- sort_key_no = OldSortKeyNo} = DbData,
-
-
- NewDbList = sort_db_list(DbList, Sorting, OldSorting, Reverse, OldReverse,
- SortKeyNo, OldSortKeyNo),
-
- NewDbData = DbData#db_data{db = NewDbList,
- sorting = Sorting,
- rev_sorting = Reverse,
- sort_key_no = SortKeyNo
- },
-
- NewProcVars = ProcVars#process_variables{db_data = NewDbData},
- send_subset(NewProcVars, undefined, undefined),
-
- SearchData =
- case Sorting of
- false ->
- OldSearchData;
- OldSorting when Reverse =:= OldReverse,
- SortKeyNo =:= OldSortKeyNo ->
- [];
- OldSorting when Reverse =:= OldReverse,
- OldSortKeyNo =:= undefined->
- [];
- _Other ->
- ListAsStr = ProcVars#process_variables.lists_as_strings,
- case catch tv_db_search:update_search(SearchWinCreated,
- NewDbList, RegExp,
- ListAsStr) of
- {'EXIT', _Reason} ->
- tv_db_search:reset_window(true),
- [];
- List ->
- List
- end
- end,
-
- {NewProcVars, SearchData}.
-
-
-
-
-
-
-
-
-sort_db_list(DbList, Sort, Sort, Rev, Rev, KeyNo, KeyNo) ->
- % Already sorted!
- DbList;
-sort_db_list(DbList, false, _OldSort, _Rev, _OldRev, _KeyNo, _OldKeyNo) ->
- % No sorting, i.e., the old list order suffices!
- DbList;
-sort_db_list(DbList, _Sort, _OldSort, Rev, _OldRev, KeyNo, _OldKeyNo) ->
- tv_db_sort:mergesort(KeyNo, DbList, Rev).
-
-
-
-
-
-
-
-send_subset(ProcVars, EtsreadTime, DbsTime) ->
- #process_variables{master_pid = MasterPid,
- db_data = DbData,
- list_of_keys = ListOfKeys} = ProcVars,
-
- #db_data{subset_size = SubsetSize,
- subset_pos = SubsetPos,
- requested_row = RowNo,
- db_size = DbSize,
- db = DbList,
- max_elem_size = MaxElemSize} = DbData,
-
-
- RowData = get_requested_row_data(RowNo, DbList),
-
- if
- DbSize > 0 ->
- Pos = ?COMM_FUNC_FILE:min(SubsetPos, DbSize),
- % Requested_data may be shorter than requested, but that's OK,
- % pd handles that correctly!
- Subset = lists:sublist(DbList, Pos, SubsetSize),
- MasterPid ! #dbs_subset{sender = self(),
- data = Subset,
- subset_pos = Pos,
- db_length = DbSize,
- list_of_keys = ListOfKeys,
- max_elem_size = MaxElemSize,
- requested_row = RowData,
- required_time_etsread = EtsreadTime,
- required_time_dbs = DbsTime
- };
- true ->
- MasterPid ! #dbs_subset{sender = self(),
- data = [],
- subset_pos = 1,
- db_length = 0,
- list_of_keys = ListOfKeys,
- max_elem_size = MaxElemSize,
- requested_row = RowData,
- required_time_etsread = EtsreadTime,
- required_time_dbs = DbsTime
- }
- end.
-
-
-
-
-
-get_requested_row_data(undefined, _DbList) ->
- [];
-get_requested_row_data(_RowNo, []) ->
- [];
-get_requested_row_data(RowNo, DbList) ->
- case catch lists:nth(RowNo, DbList) of
- {'EXIT', _Reason} ->
- [];
- RowData ->
- [RowData]
- end.
-
-
-
-
-exit_signals(ExitInfo, MasterPid) ->
- case ExitInfo of
- {MasterPid, _Reason} ->
- % When from master, just quit!
- exit(normal);
- _Other ->
- done
- end.
-
-
-
-
-update_db(NewList, ListOfKeys, ProcVars) ->
- DbData = ProcVars#process_variables.db_data,
- #db_data{db = OldDbList,
- max_elem_size = MaxElemSize,
- deleted = DelList,
- ets_type = EtsType,
- sorting = Sorting,
- rev_sorting = RevSorting,
- sort_key_no = SortKeyNo,
- key_no = KeyNo} = DbData,
-
- DbList = update_colors(OldDbList -- DelList),
- OldList = dblist2list(DbList),
- InsOrUpd = (NewList -- OldList),
- DelOrUpd = (OldList -- NewList),
-
- {Inserted, Deleted, Updated} = group_difflists(basetype(EtsType), KeyNo,
- InsOrUpd,
- DelOrUpd),
- DelMarked = mark_deleted(KeyNo, Deleted, DbList),
- Replaced = replace_elements(KeyNo, Updated, DelMarked),
- NewDbList = add_elements(KeyNo, Inserted, Replaced, Sorting, RevSorting,
- SortKeyNo),
-
- NewMaxSize = ?COMM_FUNC_FILE:max(MaxElemSize,
- ?COMM_FUNC_FILE:max(max_size(Replaced),
- max_size(Inserted))),
-
- NewDbData = DbData#db_data{db = NewDbList,
- db_size = length(NewDbList),
- max_elem_size = NewMaxSize,
- deleted = list2dblist(Deleted, ?BLACK)
- },
-
- ProcVars#process_variables{db_data = NewDbData,
- list_of_keys = ListOfKeys
- }.
-
-
-
-
-
-
-update_object(Obj, OldObj, OldColor, ObjNo, ProcVars) ->
- #process_variables{db_data = DbData,
- etsread_pid = EtsreadPid} = ProcVars,
-
- #db_data{key_no = KeyNo} = DbData,
-
- %% Don't update if there are no changes!
- case OldObj of
- Obj when OldColor =/= ?BLACK -> %% Allow deleted objects to be inserted!
- gs:window(dbwin, gs:start(), []),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(dbwin, "TV Notification", ["The object is unchanged!"]);
- haiku ->
- tv_utils:notify(dbwin, "TV Notification",
- ["Stay the patient course,",
- "Of little worth is your ire:",
- "The object's unchanged." ])
- end,
- gs:destroy(dbwin),
- {false, ProcVars};
- _Other ->
- %% Before we try to update the internal database, we have to check to see
- %% whether the ETS/Mnesia update is allowed!
- Result =
- case OldColor of
- ?BLACK ->
- EtsreadPid ! #etsread_new_object{sender = self(),
- object = Obj},
- receive
- #etsread_new_object_cfm{success = Success} ->
- Success
- after
- 60000 ->
- exit(etsread_not_responding)
- end;
- _OtherColor ->
- EtsreadPid ! #etsread_update_object{sender = self(),
- key_no = KeyNo,
- object = Obj,
- old_object = OldObj},
- receive
- #etsread_update_object_cfm{success = Success} ->
- Success
- after
- 60000 ->
- exit(etsread_not_responding)
- end
- end,
- case Result of
- false ->
- gs:window(dbwin, gs:start(), [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(dbwin, "TV Notification",
- ["Couldn't update table!"]);
- haiku ->
- tv_utils:notify(dbwin, "TV Notification",
- ["Three things are certain:",
- "Death, taxes, and lost updates.",
- "Guess which has occurred."])
- end,
- gs:destroy(dbwin),
- {false, ProcVars};
- true ->
- {true, update_object2(Obj, OldObj, OldColor, ObjNo, ProcVars)}
- end
- end.
-
-
-
-
-
-update_object2(Obj, OldObj, OldColor, ObjNo, ProcVars) ->
- #process_variables{db_data = DbData} = ProcVars,
-
- #db_data{db = DbList,
- ets_type = EtsType, %% 'bag', 'set', 'ordered_set' or
- %% 'duplicate_bag'
- max_elem_size = MaxElemSize,
- sorting = Sorting,
- rev_sorting = RevSorting,
- sort_key_no = SortKeyNo,
- key_no = KeyNo} = DbData,
-
- %% Replace the old element...
- Key = element(KeyNo, Obj),
- OldKey = element(KeyNo, OldObj),
- %% If Key == OldKey, the old object shall only be replaced!
- %% Otherwise the updated object shall be treated as a new
- %% object when inserting it in the list!
- %% In that latter case, we also have to check for duplicates!
-
- Fun =
- case basetype(EtsType) of
- set ->
- case Key of
- OldKey ->
- fun({Data,Color}, {Replaced,AccDb}) when element(KeyNo,Data) =/= Key ->
- {Replaced, [{Data,Color} | AccDb]};
- ({_Data,Color}, {Replaced,AccDb}) when not Replaced,
- OldColor =:= ?BLACK,
- Color =:= ?BLACK ->
- {true, [{Obj,?RED1} | AccDb]};
- ({_Data,Color}, {Replaced,AccDb}) when not Replaced,
- OldColor =/= ?BLACK,
- Color =/= ?BLACK ->
- {true, [{Obj,?GREEN1} | AccDb]};
- ({_Data,_Color}, {Replaced,AccDb}) ->
- {Replaced, AccDb}
- end;
- _NewKey ->
- fun({Data,Color}, {Replaced,AccDb}) ->
- ElemKey = element(KeyNo,Data),
- case ElemKey of
- OldKey when not Replaced,
- OldColor =:= ?BLACK,
- Color =:= ?BLACK ->
- {true, [{Obj,?RED1} | AccDb]};
- OldKey when not Replaced,
- OldColor =/= ?BLACK,
- Color =/= ?BLACK ->
- {true, [{Obj,?GREEN1} | AccDb]};
- OldKey ->
- {Replaced, AccDb};
- Key ->
- {Replaced, AccDb};
- _OtherKey ->
- {Replaced, [{Data,Color} | AccDb]}
- end
- end
- end;
-
- bag ->
- case Key of
- OldKey ->
- fun({Data,_Color}, {Replaced,AccDb}) when Data =:= Obj ->
- {Replaced, AccDb};
- ({Data,Color}, {Replaced,AccDb}) when Data =/= OldObj ->
- {Replaced, [{Data,Color} | AccDb]};
- %% Clauses when Data =:= OldObj.
- ({_Data,Color}, {Replaced,AccDb}) when not Replaced,
- OldColor =:= ?BLACK,
- Color =:= ?BLACK ->
- {true, [{Obj,?RED1} | AccDb]};
- ({_Data,Color}, {Replaced,AccDb}) when not Replaced,
- OldColor =/= ?BLACK,
- Color =/= ?BLACK ->
- {true, [{Obj,Color} | AccDb]};
- ({_Data,_Color}, {Replaced,AccDb}) ->
- {Replaced, AccDb}
- end;
- _NewKey ->
- fun({Data,Color}, {Replaced,AccDb}) when Data =:= OldObj,
- not Replaced,
- OldColor =:= ?BLACK,
- Color =:= ?BLACK ->
- {true, [{Obj,?RED1} | AccDb]};
- ({Data,Color}, {Replaced,AccDb}) when Data =:= OldObj,
- not Replaced,
- OldColor =/= ?BLACK,
- Color =/= ?BLACK ->
- {true, [{Obj,?GREEN1} | AccDb]};
- ({Data,_Color}, {Replaced,AccDb}) when Data =:= OldObj ->
- {Replaced, AccDb};
- ({Data,_Color}, {Replaced,AccDb}) when Data =:= Obj ->
- {Replaced, AccDb};
- ({Data,Color}, {Replaced,AccDb}) ->
- {Replaced, [{Data,Color} | AccDb]}
- end
- end;
-
- duplicate_bag ->
- %% Multiple identical objects allowed, meaning that we shall not
- %% remove anything, just replace one element.
- case Key of
- OldKey ->
- fun({Data,Color}, {Replaced,AccDb}) when Data =:= Obj ->
- {Replaced, [{Data,Color} | AccDb]};
- ({Data,Color}, {Replaced,AccDb}) when Data =/= OldObj ->
- {Replaced, [{Data,Color} | AccDb]};
- ({_Data,Color}, {Replaced,AccDb}) when not Replaced,
- OldColor =:= ?BLACK,
- Color =:= ?BLACK ->
- {true, [{Obj,?RED1} | AccDb]};
- ({_Data,Color}, {Replaced,AccDb}) when not Replaced,
- OldColor =/= ?BLACK,
- Color =/= ?BLACK ->
- {true, [{Obj,Color} | AccDb]};
- ({Data,Color}, {Replaced,AccDb}) ->
- {Replaced, [{Data,Color} | AccDb]}
- end;
- _NewKey ->
- fun({Data,Color}, {Replaced,AccDb}) when Data =:= OldObj,
- not Replaced,
- OldColor =:= ?BLACK,
- Color =:= ?BLACK ->
- {true, [{Obj,?RED1} | AccDb]};
- ({Data,Color}, {Replaced,AccDb}) when Data =:= OldObj,
- not Replaced,
- OldColor =/= ?BLACK,
- Color =/= ?BLACK ->
- {true, [{Obj,?GREEN1} | AccDb]};
- ({Data,Color}, {Replaced,AccDb}) when Data =:= OldObj ->
- {Replaced, [{Data,Color} | AccDb]};
- ({Data,Color}, {Replaced,AccDb}) when Data =:= Obj ->
- {Replaced, [{Data,Color} | AccDb]};
- ({Data,Color}, {Replaced,AccDb}) ->
- {Replaced, [{Data,Color} | AccDb]}
- end
- end
- end,
-
- FilterFun = fun(Acc0, L) ->
- lists:foldl(Fun, Acc0, L)
- end,
-
-
- {Repl, TmpList} =
- case split(ObjNo, DbList) of
- {L1, [{OldObj,OldColor} | T]} when OldColor =/= ?BLACK ->
- {true,
- lists:reverse(element(2, FilterFun({true,[]}, L1))) ++
- [{Obj,?GREEN1} | lists:reverse(element(2, FilterFun({true,[]},T)))]};
- {L1, [{OldObj,OldColor} | T]} ->
- {true,
- lists:reverse(element(2, FilterFun({true,[]}, L1))) ++
- [{Obj,?RED1} | lists:reverse(element(2, FilterFun({true,[]}, T)))]};
- {L1, L2} ->
- {R1, NewL1} = FilterFun({false,[]}, L1),
- {R2, NewL2} = FilterFun({false,[]}, L2),
- {R1 or R2, lists:reverse(NewL1) ++ lists:reverse(NewL2)}
- end,
-
- NewDbList =
- case Repl of
- true when not Sorting ->
- TmpList;
- true ->
- tv_db_sort:mergesort(SortKeyNo, TmpList, RevSorting);
- false ->
- TmpList2 =
- case Key of
- OldKey ->
- lists:reverse(element(2, FilterFun({false,[]}, TmpList)));
- _OtherKey ->
- lists:reverse(element(2, FilterFun({true,[]}, TmpList))) ++
- [{Obj,?RED1}]
- end,
- case Sorting of
- false ->
- TmpList2;
- true ->
- tv_db_sort:mergesort(SortKeyNo, TmpList2, RevSorting)
- end
- end,
- NewMaxSize = ?COMM_FUNC_FILE:max(MaxElemSize, max_size([Obj])),
- NewDbData = DbData#db_data{db = NewDbList,
- db_size = length(NewDbList),
- max_elem_size = NewMaxSize
- },
- ProcVars#process_variables{db_data = NewDbData}.
-
-
-
-
-
-delete_object(_Obj, ?BLACK, _ObjNo, ProcVars) ->
- %% Don't delete already deleted objects!!!
- {false, ProcVars};
-delete_object(undefined, undefined, _ObjNo, ProcVars) ->
- {false, ProcVars};
-delete_object(Obj, _ObjColor, ObjNo, ProcVars) ->
- #process_variables{db_data = DbData,
- etsread_pid = EtsreadPid} = ProcVars,
-
- #db_data{db = DbList,
- deleted = OldDeleted} = DbData,
-
- %% Before we try to update the internal database, we have to check to see
- %% whether the ETS/Mnesia update is allowed!
- EtsreadPid ! #etsread_delete_object{sender = self(),
- object = Obj},
- Result =
- receive
- #etsread_delete_object_cfm{success = Success} ->
- Success
- after
- 60000 ->
- exit(etsread_not_responding)
- end,
-
- case Result of
- false ->
- gs:window(dbwin, gs:start(), [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(dbwin, "TV Notification",
- ["Couldn't update table!"]);
- haiku ->
- tv_utils:notify(dbwin, "TV Notification",
- ["Three things are certain:",
- "Death, taxes, and lost updates.",
- "Guess which has occurred."])
- end,
- gs:destroy(dbwin),
- {false, ProcVars};
- true ->
- %% Replace the old element...
- %% Have to beware of duplicate_bag tables,
- %% i.e., the same object may occur more than
- %% once, but we only want to remove it once!
- {Repl, TmpList} =
- case split(ObjNo, DbList) of
- {L1, [{Obj,_Color} | T]} ->
- {true, L1 ++ [{Obj,?BLACK} | T]};
- {L1, L2} ->
- {false, L1 ++ L2}
- end,
- NewDbList =
- case Repl of
- true ->
- TmpList;
- false ->
- Fun = fun({Data,TmpColor},
- {Removed,AccDb}) when Data =/= Obj ->
- {Removed, [{Data,TmpColor} | AccDb]};
- ({_Data,TmpColor},
- {Removed,AccDb}) when not Removed, TmpColor =/= ?BLACK ->
- {true, [{Obj,?BLACK} | AccDb]};
- ({Data,TmpColor},
- {Removed,AccDb}) ->
- {Removed, [{Data,TmpColor} | AccDb]}
- end,
- lists:reverse(element(2, lists:foldl(Fun, {false,[]}, DbList)))
- end,
- NewDbData = DbData#db_data{db = NewDbList,
- db_size = length(NewDbList),
- deleted = [{Obj,?BLACK} | OldDeleted]},
- {true, ProcVars#process_variables{db_data = NewDbData}}
- end.
-
-
-
-
-
-new_object(Obj, ProcVars) ->
- #process_variables{db_data = DbData,
- etsread_pid = EtsreadPid} = ProcVars,
-
- #db_data{db = DbList,
- max_elem_size = MaxElemSize,
- ets_type = EtsType, %% 'bag', 'set' or 'duplicate_bag'
- sorting = Sorting,
- rev_sorting = RevSorting,
- sort_key_no = SortKeyNo,
- key_no = KeyNo} = DbData,
-
- %% Before we try to update the internal database, we have to check to see
- %% whether the ETS/Mnesia update is allowed!
- EtsreadPid ! #etsread_new_object{sender = self(),
- object = Obj},
- Result =
- receive
- #etsread_new_object_cfm{success = Success} ->
- Success
- after
- 60000 ->
- exit(etsread_not_responding)
- end,
-
- case Result of
- false ->
- gs:window(dbwin, gs:start(), [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(dbwin, "TV Notification",
- ["Couldn't update table!"]);
- haiku ->
- tv_utils:notify(dbwin, "TV Notification",
- ["Three things are certain:",
- "Death, taxes, and lost updates.",
- "Guess which has occurred."])
- end,
- gs:destroy(dbwin),
- {false, ProcVars};
- true ->
- Key = element(KeyNo, Obj),
- NewDbList = insert_new_object(EtsType, Key, KeyNo, Obj, DbList, Sorting,
- RevSorting, SortKeyNo),
- NewMaxSize = ?COMM_FUNC_FILE:max(MaxElemSize, max_size([Obj])),
- NewDbData = DbData#db_data{db = NewDbList,
- db_size = length(NewDbList),
- max_elem_size = NewMaxSize
- },
- {true, ProcVars#process_variables{db_data = NewDbData}}
- end.
-
-
-
-
-
-insert_new_object(EtsType,Key,KeyNo,Obj,DbList,Sorting,RevSorting,SortKeyNo) ->
- %% Remove elements from the list that ought not to be there,
- %% according to the table type!
-
- Fun =
- case basetype(EtsType) of
- set ->
- fun({Data,Color}, {Replaced,AccDb}) when element(KeyNo,Data) =/= Key ->
- {Replaced, [{Data,Color} | AccDb]};
- ({Data,Color}, {Replaced,AccDb}) when not Replaced,
- Color =/= ?BLACK,
- Data =/= Obj->
- {true, [{Obj,?GREEN1} | AccDb]};
- ({_Data,Color}, {Replaced,AccDb}) when not Replaced,
- Color =/= ?BLACK ->
- {true, [{Obj,Color} | AccDb]};
- ({_Data,Color}, {Replaced,AccDb}) when not Replaced,
- Color =:= ?BLACK ->
- {true, [{Obj, ?RED1} | AccDb]};
- ({_Data,Color}, {Replaced,AccDb}) when Replaced,
- Color =:= ?BLACK ->
- {false, AccDb};
- ({_Data,_Color}, {Replaced,AccDb}) ->
- {Replaced, AccDb}
- end;
- bag ->
- fun({Data,Color}, {Replaced,AccDb}) when Data =/= Obj ->
- {Replaced, [{Data,Color} | AccDb]};
- ({_Data,Color}, {Replaced,AccDb}) when not Replaced,
- Color =/= ?BLACK ->
- {true, [{Obj,Color} | AccDb]};
- ({_Data,Color}, {Replaced,AccDb}) when Replaced,
- Color =/= ?BLACK ->
- {true, AccDb};
- ({_Data,Color}, {Replaced,AccDb}) when Replaced,
- Color =:= ?BLACK ->
- {true, AccDb};
- ({_Data,Color}, {Replaced,AccDb}) when not Replaced,
- Color =:= ?BLACK ->
- {true, [{Obj, ?RED1} | AccDb]};
- ({_Data,_Color}, {Replaced,AccDb}) ->
- {Replaced, AccDb}
- end;
- duplicate_bag ->
- %% The fun is never called if the type is duplicate_bag,
- %% because all we have to do with new elements is to insert
- %% them (multiple identical objects allowed).
- not_used
- end,
-
- FilterFun = fun(Acc0, L) ->
- lists:foldl(Fun, Acc0, L)
- end,
-
- {_Replaced, TmpDbList} =
- case EtsType of
- duplicate_bag ->
- {false, DbList};
- _OtherType ->
- {R,L} = FilterFun({false,[]}, DbList),
- {R, lists:reverse(L)}
- end,
-
- case Sorting of
- false ->
- TmpDbList ++ [{Obj,?RED1}];
- true ->
- %% The original list is already sorted!
- %% Just merge the two lists together!
- tv_db_sort:merge(SortKeyNo, TmpDbList, [{Obj,?RED1}], RevSorting)
- end.
-
-
-
-
-
-
-max_size([]) ->
- 0;
-max_size(L) ->
- max_size(L, 0).
-
-
-
-max_size([], CurrMax) ->
- CurrMax;
-max_size([H | T], CurrMax) when is_tuple(H) ->
- Size = size(H),
- if
- Size >= CurrMax ->
- max_size(T, Size);
- true ->
- max_size(T, CurrMax)
- end;
-max_size([_H | T], CurrMax) ->
- Size = 1,
- if
- Size >= CurrMax ->
- max_size(T, Size);
- true ->
- max_size(T, CurrMax)
- end.
-
-
-
-
-
-add_elements(_KeyNo, Inserted, List, false, _RevSorting, _SortKeyNo) ->
- % Remember that the order of the original list has to be preserved!
- List ++ list2dblist(Inserted, ?RED1);
-add_elements(_KeyNo, Inserted, List, _Sorting, RevSorting, SortKeyNo) ->
- % The original list is already sorted - sort the new elements, and
- % just merge the two lists together!
- SortedInsertedList = tv_db_sort:mergesort(SortKeyNo,
- list2dblist(Inserted, ?RED1),
- RevSorting),
- tv_db_sort:merge(SortKeyNo, List, SortedInsertedList, RevSorting).
-
-
-
-
-
- %% We assume the list already has been sorted, i.e., since the order won't
- %% be changed by marking an element deleted, we DON'T have to sort the list
- %% once again!
-
-mark_deleted(_KeyNo, [], List) ->
- List;
-mark_deleted(KeyNo, [Data | T], List) ->
- KeyValue = tv_db_sort:get_compare_value(KeyNo, Data),
- NewList = mark_one_element_deleted(KeyNo, KeyValue, Data, List, []),
- mark_deleted(KeyNo, T, NewList).
-
-
-
-
-
-
-
-
-mark_one_element_deleted(_KeyNo, _KeyValue, _Data, [], Acc) ->
- Acc;
-mark_one_element_deleted(KeyNo, {tuple, KeyValue},
- Data, [{DataTuple, Color} | Tail], Acc) ->
- OldKeyValue = tv_db_sort:get_compare_value(KeyNo, DataTuple),
- % Remember that the order of the original list has to be preserved!
- if
- OldKeyValue =:= {tuple, KeyValue} ->
- Acc ++ [{Data, ?BLACK}] ++ Tail;
- true ->
- mark_one_element_deleted(KeyNo, {tuple, KeyValue}, Data, Tail,
- Acc ++ [{DataTuple, Color}])
- end;
-mark_one_element_deleted(KeyNo, _KeyValue, Data, [{DataTuple, Color} | Tail], Acc) ->
- if
- Data =:= DataTuple ->
- Acc ++ [{Data, ?BLACK}] ++ Tail;
- true ->
- mark_one_element_deleted(KeyNo, _KeyValue, Data, Tail,
- Acc ++ [{DataTuple, Color}])
- end.
-
-
-
-
-
-
-
- %% We assume the list already has been sorted, i.e., since the order won't
- %% be changed by marking an element updated, we DON'T have to sort the list
- %% once again!
-
-replace_elements(_KeyNo, [], List) ->
- List;
-replace_elements(KeyNo, [Data | T], List) ->
- KeyValue = tv_db_sort:get_compare_value(KeyNo, Data),
- NewList = replace_one_element(KeyNo, KeyValue, Data, List, []),
- replace_elements(KeyNo, T, NewList).
-
-
-
-
-
-
-
-replace_one_element(_KeyNo, _Key, _Data, [], Acc) ->
- Acc;
-replace_one_element(KeyNo, {tuple, Key1}, Data, [{DataTuple, Color} | Tail], Acc) ->
- Key2 = tv_db_sort:get_compare_value(KeyNo, DataTuple),
- % Remember that the order of the original list has to be preserved!
- if
- Key2 =:= {tuple, Key1} ->
- Acc ++ [{Data, ?GREEN1}] ++ Tail;
- true ->
- replace_one_element(KeyNo, {tuple, Key1}, Data, Tail,
- Acc ++ [{DataTuple, Color}])
- end;
-replace_one_element(_KeyNo, _KeyValue, _Data, [{DataTuple, Color} | Tail], Acc) ->
- % Can't replace an element with no key!
- Acc ++ [{DataTuple, Color} | Tail].
-
-
-
-
-
-
-
-
-group_difflists(bag, _KeyNo, Inserted, Deleted) ->
- %% Since the ETS table is of bag type, no element can be updated, i.e.,
- %% it can only be deleted and re-inserted, otherwise a new element will be added.
- {Inserted, Deleted, []};
-group_difflists(duplicate_bag, _KeyNo, Inserted, Deleted) ->
- %% Since the ETS table is of duplicate_bag type, no element can be updated, i.e.,
- %% it can only be deleted and re-inserted, otherwise a new element will be added.
- {Inserted, Deleted, []};
-group_difflists(set, _KeyNo, [], Deleted) ->
- %% Updated elements have to be present in both lists, i.e., if one list is empty,
- %% the other contains no updated elements - they are either inserted or deleted!
- {[], Deleted, []};
-group_difflists(set, _KeyNo, Inserted, []) ->
- {Inserted, [], []};
-group_difflists(set, KeyNo, InsOrUpd, DelOrUpd) ->
- match_difflists(KeyNo, InsOrUpd, DelOrUpd, [], []).
-
-
-
-
-
-
-match_difflists(_KeyNo, [], Deleted, Inserted, Updated) ->
- {Inserted, Deleted, Updated};
-match_difflists(KeyNo, [Data | T], DelOrUpd, InsAcc, UpdAcc) ->
- % This function is only called in case of a 'set' ETS table.
- % 'Set' type of ETS table means there are unique keys. If two elements in
- % InsOrUpd and DelOrUpd have the same key, that element has been updated,
- % and is added to the Updated list, and removed from the original two lists.
- % After the two lists have been traversed in this way, the remaining elements
- % in DelOrUpd forms the new Deleted list (analogous for InsOrUpd).
- % If we want to improve the performance, we could check which list is the
- % shortest, since the traversing time depends on this.
- Key = element(KeyNo, Data),
- case searchdelete(Key, KeyNo, DelOrUpd) of
- {true, NewDelOrUpd} ->
- match_difflists(KeyNo, T, NewDelOrUpd, InsAcc, [Data | UpdAcc]);
- {false, SameDelOrUpd} ->
- match_difflists(KeyNo, T, SameDelOrUpd, [Data | InsAcc], UpdAcc)
- end.
-
-
-
-
-searchdelete(_Key, _ElemNo, []) ->
- {false, []};
-searchdelete(Key, ElemNo, List) ->
- searchdelete(Key, ElemNo, List, []).
-
-
-
-
-
-searchdelete(_Key, _ElemNo, [], Acc) ->
- {false, Acc};
-searchdelete(Key, ElemNo, [Tuple | Tail], Acc) ->
- % We don't use standard libraries, 'cause we want to make an 'atomic'
- % operation, i.e., we will not search the list two times...
- case (element(ElemNo, Tuple) =:= Key) of
- true ->
- {true, Acc ++ Tail}; % Return the list without the matching element
- _Other ->
- searchdelete(Key, ElemNo, Tail, [Tuple | Acc])
- end.
-
-
-
-
-
-
-
-dblist2list([]) ->
- [];
-dblist2list([{Data, _Color} | T]) ->
- [Data | dblist2list(T)].
-
-
-
-
-
-
-
-list2dblist([], _Color) ->
- [];
-list2dblist([Data | T], Color) ->
- [{Data, Color} | list2dblist(T, Color)].
-
-
-
-
-
-
-
-
-update_colors([]) ->
- [];
-update_colors([{Data, Color} | T]) ->
- [{Data, new_color(Color)} | update_colors(T)].
-
-
-
-
-
-
-
-
-new_color(?GREEN1) ->
- ?GREEN2;
-new_color(?GREEN2) ->
- ?GREEN3;
-new_color(?GREEN3) ->
- ?GREEN4;
-new_color(?GREEN4) ->
- ?GREEN5;
-new_color(?GREEN5) ->
- ?DEFAULT_BTN_COLOR;
-new_color(?RED1) ->
- ?RED2;
-new_color(?RED2) ->
- ?RED3;
-new_color(?RED3) ->
- ?RED4;
-new_color(?RED4) ->
- ?RED5;
-new_color(?RED5) ->
- ?DEFAULT_BTN_COLOR;
-new_color(_Other) ->
- ?DEFAULT_BTN_COLOR. % Default shall be gray.
-
-
-
-
-
-
-
-
-compute_elapsed_seconds({H1, M1, S1}, {H2, M2, S2}) ->
- ElapsedHours = get_time_diff(hours, H1, H2),
- ElapsedMinutes = get_time_diff(minutes, M1, M2),
- ElapsedSeconds = get_time_diff(seconds, S1, S2),
- (ElapsedHours * 3600) + (ElapsedMinutes * 60) + ElapsedSeconds + 1.
-
-
-
-
-
-
-
-get_time_diff(_Type, T1, T2) when T1 =< T2 ->
- T2 - T1;
-get_time_diff(hours, T1, T2) ->
- T2 + 24 - T1;
-get_time_diff(minutes, T1, T2) ->
- T2 + 60 - T1;
-get_time_diff(seconds, T1, T2) ->
- T2 + 60 - T1.
-
-
-
-
-split(_N, []) ->
- {[], []};
-split(0, List) ->
- {[], List};
-split(N, List) ->
- split2(0, N - 1, [], List).
-
-
-
-split2(Ctr, N, Acc, [H | T]) when Ctr < N ->
- split2(Ctr + 1, N, [H | Acc], T);
-split2(_Ctr, _N, Acc, []) ->
- {lists:reverse(Acc), []};
-split2(_Ctr, _N, Acc, List) ->
- {lists:reverse(Acc), List}.
-
-basetype(ordered_set) ->
- set;
-basetype(Any) ->
- Any.
diff --git a/lib/tv/src/tv_db_int_def.hrl b/lib/tv/src/tv_db_int_def.hrl
deleted file mode 100644
index d2cb8adee5..0000000000
--- a/lib/tv/src/tv_db_int_def.hrl
+++ /dev/null
@@ -1,80 +0,0 @@
-%%
-%% %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%
-%%%*********************************************************************
-%%%
-%%% Description: Internal definitions for the database part of the table
-%%% tool.
-%%%
-%%%*********************************************************************
-
--define(WHITE, {255, 255, 255}).
--define(MEDIUM_GRAY, {170, 170, 170}).
-
-
--define(LIGHT_GREEN, { 0, 255, 0}).
--define(GREEN, { 50, 215, 50}).
--define(DARK_GREEN, { 50, 170, 50}).
--define(FOREST_GREEN, { 34, 139, 34}).
--define(DARK_FOREST_GREEN, { 15, 100, 15}).
-
-
-
--define(RED, {255, 0, 0}).
--define(PINK, {255, 130, 170}).
--define(LIGHT_VIOLET, {220, 150, 225}).
--define(VIOLET, {160, 70, 180}).
--define(DARK_VIOLET, {100, 10, 130}).
-
-
-
-
-
-
--record(db_data, {db = [], % List containing all elements
- db_size = 0, % Number of elements in 'db'
- max_elem_size = 0, % Size of largest element in db.
- hidden = [], % Elements (i.e., keys) not to be shown
- deleted = [], % Elements just deleted
- subset_size, % Size of the subset to be extracted and
- % shown
- subset_pos, % Position in list where subset starts
- sorting = false, % Tells whether sorting is used ('true'
- % or 'false')
- requested_row = 0,
- rev_sorting = false, % Tells whether the sorting (if any) is
- % in reversed order or not ('true' or
- % 'false')
- sort_key_no, % Element in each tuple to use as sorting
- % element
- key_no, % Element in each tuple to use as key
- % (this element is used when updating the
- % dblist, i.e., inserting, deleting a.s.o)
- ets_type % 'bag' or 'set'
- }).
-
-
--record(process_variables, {master_pid,
- etsread_pid,
- db_data = #db_data{},
- list_of_keys = [],
- lists_as_strings = true
- }).
-
-
-
-
diff --git a/lib/tv/src/tv_db_search.erl b/lib/tv/src/tv_db_search.erl
deleted file mode 100644
index edfa57df04..0000000000
--- a/lib/tv/src/tv_db_search.erl
+++ /dev/null
@@ -1,475 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2012. 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%
-%%%*********************************************************************
-%%%
-%%% Description: Code for the search window.
-%%%
-%%%*********************************************************************
--module(tv_db_search).
--compile([{nowarn_deprecated_function,{gs,button,3}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,entry,3}},
- {nowarn_deprecated_function,{gs,frame,2}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,label,3}},
- {nowarn_deprecated_function,{gs,listbox,3}},
- {nowarn_deprecated_function,{gs,radiobutton,3}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([create_window/1,
- resize_window/1,
- reset_window/1,
- destroy_window/1,
- mark_busy/1,
- mark_nonbusy/1,
- get_input_and_search/3,
- update_search/4,
- string_to_term/1
- ]).
-
-
-
-
--include("tv_int_def.hrl").
--include("tv_int_msg.hrl").
--include("tv_db_int_def.hrl").
-
-
-
-
--define(WIN_WIDTH, 445).
--define(SMALL_WIN_HEIGHT, 117).
--define(BIG_WIN_HEIGHT, 335).
--define(FRAME_WIDTH, 429). % 334
--define(OLD_FRAME_WIDTH, 334).
--define(FRAME_HEIGHT, 105).
--define(FRAME_XPOS, (10-2)).
--define(FRAME_YPOS, 10).
--define(ENTRY_XPOS, 9).
--define(ENTRY_YPOS, 31).
--define(ENTRY_WIDTH, (?OLD_FRAME_WIDTH-10-2*?ENTRY_XPOS-5)).
--define(LISTBOX_WIDTH, ?WIN_WIDTH-2*?FRAME_XPOS+1).
--define(LISTBOX_HEIGHT, 162).
--define(LISTBOX_XPOS, ?FRAME_XPOS-2).
--define(LISTBOX_YPOS, ?SMALL_WIN_HEIGHT+8).
--define(BTN_WIDTH, 80).
--define(BTN_HEIGHT, 30).
--define(BTN_XPOS, ?OLD_FRAME_WIDTH-6).
--define(BG_COLOUR, {217,217,217}).
-
-
-
-
-
-
-create_window(true) ->
- gs:config(win, [raise]);
-create_window(false) ->
- gs:window(win, gs:start(), [{width,?WIN_WIDTH},
- {height,?SMALL_WIN_HEIGHT},
- {data,small},
- {bg,?BG_COLOUR},
- {title,"[TV] Search Object"},
- {destroy,true},
- {configure,true},
- {cursor,arrow}
- ]),
-
- F = gs:frame(win, [{width,?FRAME_WIDTH},
- {height,?FRAME_HEIGHT},
- {x,?FRAME_XPOS},
- {y,?FRAME_YPOS},
- {bw,2},
- {bg,?BG_COLOUR}
- ]),
-
- gs:label(F, [{width,80},
- {height,25},
- {x,?ENTRY_XPOS+2},
- {y,8},
- {align,w},
- {bg,?BG_COLOUR},
- {fg, {0,0,0}},
- {label, {text,"Search for:"}}
- ]),
-
- gs:entry(entry, F, [{width,?ENTRY_WIDTH},
- {height,30},
- {x,?ENTRY_XPOS},
- {y,?ENTRY_YPOS},
- {insert, {0,"<Search expression>"}},
- {bg, {255,255,255}},
- {fg, {0,0,0}},
- {cursor,text},
- {justify,left},
- {keypress,true},
- {setfocus,true}
- ]),
-
- Group = list_to_atom("expr" ++ pid_to_list(self())),
- RadioWidth = round(?ENTRY_WIDTH / 2),
- gs:radiobutton(expr_term, F, [{width,RadioWidth - 45},
- {height,25},
- {x,?ENTRY_XPOS},
- {y,?ENTRY_YPOS+40},
- {group,Group},
- {align, c},
- {label,{text,"as term"}},
- {select,true}
- ]),
- gs:radiobutton(expr_regexp, F, [{width,RadioWidth + 45},
- {height,25},
- {x,?ENTRY_XPOS+RadioWidth-20-26},
- {y,?ENTRY_YPOS+40},
- {group,Group},
- {align,c},
- {label,{text,"as regular expression"}}
- ]),
-
- gs:button(search, F, [{width,?BTN_WIDTH},
- {height,?BTN_HEIGHT},
- {x,?BTN_XPOS},
- {y,11},
- {label, {text,"Search"}},
- {bg,?BG_COLOUR},
- {fg, {0,0,0}}
- ]),
- gs:button(cancel, F, [{width,?BTN_WIDTH},
- {height,?BTN_HEIGHT},
- {x,?BTN_XPOS},
- {y,?BTN_HEIGHT+11+10},
- {label, {text,"Cancel"}},
- {data,cancel},
- {bg,?BG_COLOUR},
- {fg, {0,0,0}}
- ]),
- expand_window(),
- gs:config(entry, [{select, {0,1000}}]),
- gs:config(win, [{map,true}]).
-
-
-
-
-resize_window(false) ->
- done;
-resize_window(true) ->
- gs:config(win, [{width,?WIN_WIDTH},
- {height,?BIG_WIN_HEIGHT}
- ]).
-
-
-
-
-reset_window(false) ->
- done;
-reset_window(true) ->
- gs:config(listbox, [clear]),
- gs:config(objects_found, [{label, {text,""}}]).
-
-
-
-
-destroy_window(false) ->
- done;
-destroy_window(true) ->
- gs:destroy(win).
-
-
-
-mark_busy(false) ->
- done;
-mark_busy(true) ->
- gs:config(win, [{cursor,busy}]),
- gs:config(entry, [{cursor,busy}]).
-
-
-
-
-mark_nonbusy(false) ->
- done;
-mark_nonbusy(true) ->
- gs:config(win, [{cursor,arrow}]),
- gs:config(entry, [{cursor,text}]).
-
-
-
-
-get_input_and_search(DbList, IsRegExp, ListAsStr) ->
- get_input_and_search(DbList, IsRegExp, true, ListAsStr).
-
-
-
-
-get_input_and_search(DbList, IsRegExp, Notify, ListAsStr) ->
- Str = get_entry_text(),
- StrConvRes = case IsRegExp of
- true ->
- string_to_regexp(Str);
- false ->
- string_to_term(Str)
- end,
-
- case StrConvRes of
- {ok, TermOrRE} ->
- search(IsRegExp, TermOrRE, DbList, ListAsStr);
- {error, {_Reason, Msg}} when Notify ->
- gs:config(win, [beep]),
- tv_utils:notify(win, "TV Notification", Msg);
- {error, {_Reason, _Msg}} ->
- done
- end.
-
-
-
-update_search(false, _DbList, _IsRegExp, _ListAsStr) ->
- done;
-update_search(true, DbList, true, ListAsStr) ->
- get_input_and_search(DbList, false, false, ListAsStr);
-update_search(true, DbList, false, ListAsStr) ->
- get_input_and_search(DbList, true, false, ListAsStr).
-
-
-
-get_entry_text() ->
- gs:read(entry,text).
-
-
-
-string_to_regexp(Str) ->
- case re:compile(Str) of
- {ok, RegExp} ->
- {ok, RegExp};
- {error, _Error} ->
- case get(error_msg_mode) of
- normal ->
- {error, {not_a_regexp, "Please enter a regular expression!"}};
- haiku ->
- {error, {not_a_regexp, ["Being incorrect",
- "The regular expression",
- "Must now be retyped."]}}
- end
- end.
-
-
-
-string_to_term(Str) ->
- case catch erl_scan:string(Str ++ ". ") of
- {ok, ScannedStr, _No} ->
- case erl_parse:parse_term(ScannedStr) of
- {ok, Term} ->
- {ok, Term};
- _Other ->
- %% May be a PID, have to check this, since erl_scan
- %% currently cannot handle this case... :-(
- case catch list_to_pid(Str) of
- Pid when is_pid(Pid) ->
- {ok, Pid};
- _Error ->
- case get(error_msg_mode) of
- normal ->
- {error, {not_a_term, "Please enter a valid term!"}};
- haiku ->
- {error, {not_a_term, ["Aborted effort.",
- "Reflect, repent and retype:",
- "Enter valid term."]}}
- end
- end
- end;
- _Error ->
- case get(error_msg_mode) of
- normal ->
- {error, {not_a_term, "Please enter a valid term!"}};
- haiku ->
- {error, {not_a_term, ["Aborted effort.",
- "Reflect, repent and retype:",
- "Enter valid term."]}}
- end
- end.
-
-
-
-search(IsRegExp, SearchValue, DbList, ListAsStr) ->
- gs:config(cancel, [{label, {text,"Stop"}}]),
- mark_busy(true),
- reset_window(true),
- SearchRes = traverse(SearchValue, DbList, 1, length(DbList), [], IsRegExp, ListAsStr),
- gs:config(cancel, [{label, {text,"Cancel"}}]),
- mark_nonbusy(true),
- SearchRes.
-
-
-
-
-
-expand_window() ->
- gs:listbox(listbox, win, [{width,?LISTBOX_WIDTH},
- {height,?LISTBOX_HEIGHT},
- {x,?LISTBOX_XPOS},
- {y,?LISTBOX_YPOS},
- {bg, {255,255,255}},
- {fg, {0,0,0}},
- {scrollbg,?BG_COLOUR},
- {scrollfg,?BG_COLOUR},
- {hscroll,bottom},
- {vscroll,right},
- {click,true},
- {doubleclick,false},
- {selectmode,single}
- ]),
- gs:label(objects_found, win, [{width,?LISTBOX_WIDTH},
- {height,25},
- {x,?LISTBOX_XPOS},
- {y,?LISTBOX_YPOS+?LISTBOX_HEIGHT+13},
- {align,w},
- {bg,?BG_COLOUR},
- {fg, {0,0,0}}
- ]),
- gs:config(win, [{width,?WIN_WIDTH},
- {height,?BIG_WIN_HEIGHT}
- ]).
-
-
-
-
-
-
-
-traverse(Pattern, [Object | T], Row, Length, Acc, IsRegExp, ListAsStr) ->
- SearchRes =
- case IsRegExp of
- true ->
- search_for_regexp(Pattern, Object, ListAsStr);
- false ->
- compare_terms(Pattern, Object)
- end,
-
- NewAcc
- = case SearchRes of
- found ->
- RowStr = integer_to_list(Row),
- LengthStr = integer_to_list(Length),
- ObjectStr = case ListAsStr of
- true ->
- lists:flatten(tv_io_lib:format("~p", [Object]));
- false ->
- lists:flatten(tv_io_lib:write(Object))
- end,
-
- gs:config(listbox,
- [{add,
- " Row " ++ RowStr ++ ":" ++
- lists:duplicate(length(LengthStr)-length(RowStr), " ") ++
- " " ++ ObjectStr}
- ]),
- gs:config(objects_found,
- [{label,
- {text,integer_to_list(length(Acc)+1) ++
- " object(s) found"}}
- ]),
- [{Row,Object} | Acc];
- not_found ->
- Acc
- end,
- receive
- {gs,cancel,click,_Data,_Args} ->
- gs:config(objects_found,
- [{label,
- {text,integer_to_list(gs:read(listbox,size)) ++
- " object(s) found"}}
- ]),
- lists:reverse(NewAcc)
- after
- 0 ->
- traverse(Pattern, T, Row+1, Length, NewAcc, IsRegExp, ListAsStr)
- end;
-traverse(_Pattern, [], _N, _Length, Acc, _IsRegExp, _ListAsStr) ->
- gs:config(objects_found,
- [{label,
- {text,integer_to_list(gs:read(listbox,size)) ++
- " object(s) found"}}
- ]),
- lists:reverse(Acc).
-
-
-
-
-search_for_regexp(Pattern, Elem, ListAsStr) ->
- ListToSearch =
- case ListAsStr of
- true ->
- lists:flatten(tv_io_lib:format("~p", [Elem]));
- false ->
- lists:flatten(tv_io_lib:write(Elem))
- end,
-
- case re:run(ListToSearch, Pattern, [{capture,none}]) of
- match ->
- found;
- nomatch ->
- not_found
- end.
-
-
-
-
-
-compare_terms(Term, Elem) when not is_tuple(Elem), not is_list(Elem), Term =/= Elem ->
- not_found;
-compare_terms(Term, Term) ->
- %% Even the case Term = "{}" or "[]"!!!
- found;
-compare_terms(Term, Elem) when is_list(Elem) ->
- traverse_list(Term, Elem);
-compare_terms(Term, Elem) when is_tuple(Elem) ->
- traverse_tuple(Term, Elem, 1, size(Elem)).
-
-
-
-
-
-traverse_tuple(Pattern, Tuple, N, Stop) when N =< Stop ->
- Elem = element(N,Tuple),
- case compare_terms(Pattern, Elem) of
- found ->
- found;
- not_found ->
- traverse_tuple(Pattern, Tuple, N+1, Stop)
- end;
-traverse_tuple(_Pattern, _Tuple, N, Stop) when N > Stop ->
- not_found.
-
-
-
-
-
-
-traverse_list(Pattern, [H | T]) ->
- case compare_terms(Pattern, H) of
- found ->
- found;
- not_found ->
- traverse_list(Pattern, T)
- end;
-traverse_list(_Pattern, []) ->
- not_found.
-
diff --git a/lib/tv/src/tv_db_sort.erl b/lib/tv/src/tv_db_sort.erl
deleted file mode 100644
index 3675c7b413..0000000000
--- a/lib/tv/src/tv_db_sort.erl
+++ /dev/null
@@ -1,141 +0,0 @@
-%%
-%% %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(tv_db_sort).
-
-
-
--export([mergesort/3, merge/4, get_compare_value/2]).
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-
-mergesort(_KeyNo, [X], _ReverseOrder) ->
- [X];
-mergesort(_KeyNo, [], _ReverseOrder) ->
- [];
-mergesort(KeyNo, X, ReverseOrder) ->
- split(KeyNo, X, [], [], ReverseOrder).
-
-
-
-
-
-
-
-
- %% If we want reverse order when just merging two lists,
- %% each of them has to be in reverse order first!
-
-merge(KeyNo, [{E1, C1} | T1], [{E2, C2} | T2], Reverse) when not Reverse ->
- K1 = get_compare_value(KeyNo, E1),
- K2 = get_compare_value(KeyNo, E2),
- case get_correct_order(K1, E1, K2, E2) of
- {1, 2} ->
- [{E1, C1} | merge(KeyNo, T1, [{E2, C2} | T2], Reverse)];
- {2, 1} ->
- [{E2, C2} | merge(KeyNo, [{E1, C1} | T1], T2, Reverse)]
- end;
-merge(KeyNo, [{E1, C1} | T1], [{E2, C2} | T2], Reverse) ->
- K1 = get_compare_value(KeyNo, E1),
- K2 = get_compare_value(KeyNo, E2),
- case get_correct_order(K1, E1, K2, E2) of
- {1, 2} ->
- [{E2, C2} | merge(KeyNo, [{E1, C1} | T1], T2, Reverse)];
- {2, 1} ->
- [{E1, C1} | merge(KeyNo, T1, [{E2, C2} | T2], Reverse)]
- end;
-merge(_KeyNo, [], L2, _Reverse) -> % L2 may be the empty list also!
- L2;
-merge(_KeyNo, L1, [], _Reverse) -> % L1 may be the empty list also!
- L1.
-
-
-
-
-
-
-get_compare_value(KeyNo, E) when is_tuple(E) ->
- case catch element(KeyNo, E) of
- {'EXIT', {badarg, {?MODULE, get_compare_value, [KeyNo, E]}}} ->
- short_tuple;
- V ->
- {tuple, V}
- end;
-get_compare_value(_KeyNo, _E) ->
- no_tuple.
-
-
-
-
-
-
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-
-split(KeyNo, [A,B|T], X, Y, Reverse) ->
- split(KeyNo, T, [A|X], [B|Y], Reverse);
-split(KeyNo, [H], X, Y, Reverse) ->
- split(KeyNo, [], [H|X], Y, Reverse);
-split(KeyNo, [], X, Y, Reverse) ->
- merge(KeyNo,
- mergesort(KeyNo, X, Reverse),
- mergesort(KeyNo, Y, Reverse),
- Reverse).
-
-
-
-
-
-
-get_correct_order({tuple, V1}, _E1, {tuple, V2}, _E2) when V1 < V2 ->
- {1, 2};
-get_correct_order({tuple, _V1}, _E1, {tuple, _V2}, _E2) ->
- {2, 1};
-get_correct_order(short_tuple, _E1, {tuple, _V2}, _E2) ->
- {1, 2};
-get_correct_order({tuple, _V1}, _E1, short_tuple, _E2) ->
- {2, 1};
-get_correct_order(short_tuple, E1, short_tuple, E2) when E1 < E2 ->
- {1, 2};
-get_correct_order(short_tuple, _E1, short_tuple, _E2) ->
- {2, 1};
-get_correct_order(no_tuple, E1, no_tuple, E2) when E1 < E2 ->
- {1, 2};
-get_correct_order(no_tuple, _E1, no_tuple, _E2) ->
- {2, 1};
-get_correct_order(_Anything, _E1, no_tuple, _E2) -> % Tuples first, then other
- {1, 2}; % terms in correct order!
-get_correct_order(no_tuple, _E1, _Anything, _E2) ->
- {2, 1}.
diff --git a/lib/tv/src/tv_ets_rpc.erl b/lib/tv/src/tv_ets_rpc.erl
deleted file mode 100644
index ec2fde30ac..0000000000
--- a/lib/tv/src/tv_ets_rpc.erl
+++ /dev/null
@@ -1,140 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-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(tv_ets_rpc).
-
-
-
--export([all/2,
- info/4,
- new/4,
- tab2list/3,
- insert/4,
- lookup/4,
- delete/4
- ]).
-
-
-
-
-all(_Node, true) ->
- chk(catch ets:all());
-all(Node, false) ->
- chk(catch rpc:block_call(Node, ets, all, [])).
-
-
-
-
-info(_Node, true, TabId, What) ->
- chk(catch ets:info(TabId, What));
-info(Node, false, TabId, What) ->
- chk(catch rpc:block_call(Node, ets, info, [TabId, What])).
-
-
-
-
-new(_Node, true, TabName, Options) ->
- case catch ets:new(TabName, Options) of
- {TabName, Pid} when is_pid(Pid) ->
- {TabName,Pid};
- {TabNo, Pid} when is_pid(Pid) ->
- {TabNo,Pid};
- OtherResult ->
- chk(OtherResult)
- end;
-new(Node, false, TabName, Options) ->
- case catch rpc:block_call(Node, ets, new, [TabName, Options]) of
- {TabName, Pid} when is_pid(Pid) ->
- {TabName,Pid};
- {TabNo, Pid} when is_pid(Pid) ->
- {TabNo, Pid};
- OtherResult ->
- chk(OtherResult)
- end.
-
-
-
-
-tab2list(_Node, true, TabId) ->
- chk(catch ets:tab2list(TabId));
-tab2list(Node, false, TabId) ->
- chk(catch rpc:call(Node, ets, tab2list, [TabId])).
-
-
-
-
-insert(_Node, true, TabId, Object) ->
- chk(catch ets:insert(TabId, Object));
-insert(Node, false, TabId, Object) ->
- chk(catch rpc:call(Node, ets, insert, [TabId, Object])).
-
-
-
-
-lookup(_Node, true, TabId, Key) ->
- chk(catch ets:lookup(TabId, Key));
-lookup(Node, false, TabId, Key) ->
- chk(catch rpc:call(Node, ets, lookup, [TabId, Key])).
-
-
-
-
-delete(_Node, true, TabId, Key) ->
- chk(catch ets:delete(TabId, Key));
-delete(Node, false, TabId, Key) ->
- chk(catch rpc:call(Node, ets, delete, [TabId, Key])).
-
-
-
-
-chk(Result) ->
- case Result of
- undefined ->
- throw(no_table);
- _Anything when is_list(Result) ->
- Result;
- _Anything when is_atom(Result) ->
- Result;
- _Anything when is_integer(Result) ->
- Result;
- _Anything when is_pid(Result) ->
- Result;
-
- %% Messages received when node is down.
- {badrpc, nodedown} ->
- throw(nodedown);
- {'EXIT', nodedown} ->
- throw(nodedown);
- {'EXIT', {{badarg, {gen, set_monitor_node, _Args}}, _Reason}} ->
- throw(nodedown);
-
- %% Messages received when table doesn't exist.
- {'EXIT', {badarg, {ets,local_info,_Args}}} ->
- %% Due to inconsistencies in R2D and earlier versions:
- %% ets:info/1 returned 'undefined' when table didn't
- %% exist, while ets:info/2 returned the exit-signal
- %% above. This was corrected in R3A - now both functions
- %% return 'undefined' :-)
- throw(no_table);
- {badrpc, {'EXIT', {badarg,_Reason}}} ->
- throw(no_table);
- {'EXIT', {badarg,_Reason}} ->
- throw(no_table);
- Error when is_tuple(Error) ->
- throw({unexpected_error,Error})
- end.
-
diff --git a/lib/tv/src/tv_etsread.erl b/lib/tv/src/tv_etsread.erl
deleted file mode 100644
index 32f111c9a1..0000000000
--- a/lib/tv/src/tv_etsread.erl
+++ /dev/null
@@ -1,770 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. 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%
-%%%*********************************************************************
-%%%
-%%% Description: Module containing the interface towards ETS tables,
-%%% i.e., handling the polling and thereafter sending the
-%%% result to the database part of the table tool.
-%%%
-%%%*********************************************************************
-
-
--module(tv_etsread).
--compile([{nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([etsread/2]).
-
-
-
--include("tv_int_def.hrl").
--include("tv_int_msg.hrl").
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-etsread(MasterPid, ErrorMsgMode) ->
- process_flag(trap_exit, true),
- put(error_msg_mode, ErrorMsgMode),
- blocked(MasterPid).
-
-
-
-
-
-%%%*********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-blocked(MasterPid) ->
- receive
- Msg ->
- case Msg of
-
- #etsread_deblock{} ->
- deblock(Msg, MasterPid);
-
- {'EXIT', Pid, Reason} ->
- exit_signals({Pid, Reason}, MasterPid),
- blocked(MasterPid);
-
- {error_msg_mode, Mode} ->
- put(error_msg_mode, Mode),
- blocked(MasterPid);
-
- _Other ->
- %% io:format("Received signal ~p~n", [_Other]),
- blocked(MasterPid)
- end
- end.
-
-
-
-
-
-
-
-deblock(Msg, MasterPid) ->
- #etsread_deblock{dbs_pid = DbsPid,
- table_type = KindOfTable,
- node = Node,
- local_node = LocalNode,
- table_id = TableId,
- poll_interval = PollInt} = Msg,
- PollInterval = case PollInt of
- infinity ->
- PollInt;
- _Other ->
- PollInt * 1000
- end,
- %% Get table info!
- case catch get_table_info(Node, LocalNode, TableId, KindOfTable) of
- nodedown ->
- MasterPid ! #pc_nodedown{sender = self(),
- automatic_polling = false},
- blocked(MasterPid);
- no_table ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = false},
- blocked(MasterPid);
- mnesia_not_started ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = false},
- blocked(MasterPid);
- {unexpected_error,_Reason} ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = false},
- blocked(MasterPid);
- {Type, Pos, Protection} ->
- MasterPid ! #etsread_deblock_cfm{sender = self(),
- type = Type,
- keypos = Pos,
- protection = Protection
- },
-
- timer:sleep(500),
- case catch read_table(Node, LocalNode, TableId, KindOfTable, DbsPid) of
- nodedown ->
- MasterPid ! #pc_nodedown{sender = self(),
- automatic_polling = false},
- blocked(MasterPid);
- no_table ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = false},
- blocked(MasterPid);
- mnesia_not_started ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = false},
- blocked(MasterPid);
- {unexpected_error,_Reason} ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = false},
- blocked(MasterPid);
- _ElapsedTime ->
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode, TableId,
- KindOfTable, PollInterval)
- end
- end.
-
-
-
-
-
-
-get_table_info(Node, LocalNode, TableId, KindOfTable) ->
- case KindOfTable of
- ets ->
- % Check whether table is 'bag' or 'set' type.
- Type = tv_ets_rpc:info(Node, LocalNode, TableId, type),
- % Get position for the key.
- Pos = tv_ets_rpc:info(Node, LocalNode, TableId, keypos),
- Protection = tv_ets_rpc:info(Node, LocalNode, TableId, protection),
- {Type, Pos, Protection};
- mnesia ->
- Type = tv_mnesia_rpc:table_info(Node, LocalNode, TableId, type),
- Pos = 2,
- %% All Mnesia tables are regarded as being public!
- {Type, Pos, public}
- end.
-
-
-
-
-
-
-deblocked_loop(MasterPid,DbsPid,Node,LocalNode,TableId,KindOfTable,PollInterval) ->
- receive
- Msg ->
-
- case Msg of
-
- #etsread_poll_table{} ->
- case catch read_table(Node, LocalNode, TableId, KindOfTable, DbsPid) of
- %% No automatic polling here!
- nodedown ->
- MasterPid ! #pc_nodedown{sender = self(),
- automatic_polling = false};
- no_table ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = false};
- mnesia_not_started ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = false};
- {unexpected_error,_Reason} ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = false};
- _ElapsedTime ->
- done
- end,
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode,
- TableId, KindOfTable, PollInterval);
-
-
- #etsread_set_poll_interval{interval = PollInt} ->
- NewPollInterval = case PollInt of
- infinity ->
- PollInt;
- _Other ->
- PollInt * 1000
- end,
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode,
- TableId, KindOfTable, NewPollInterval);
-
-
- #etsread_deblock{} ->
- deblock(Msg, MasterPid);
-
-
- #etsread_update_object{key_no=KeyNo, object=Obj, old_object=OldObj} ->
- update_object(KindOfTable, Node, LocalNode, TableId, DbsPid,
- KeyNo, Obj, OldObj, MasterPid, PollInterval),
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode, TableId, KindOfTable,
- PollInterval);
-
-
- #etsread_new_object{object=Obj} ->
- new_object(KindOfTable, Node, LocalNode, TableId, DbsPid,
- Obj, MasterPid, PollInterval),
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode, TableId, KindOfTable,
- PollInterval);
-
-
- #etsread_delete_object{object=Obj} ->
- delete_object(KindOfTable, Node, LocalNode, TableId, DbsPid,
- Obj, MasterPid, PollInterval),
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode, TableId, KindOfTable,
- PollInterval);
-
-
- #ip_dead_table{} ->
- AutoPoll = case PollInterval of
- infinity ->
- false;
- _Other ->
- true
- end,
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = AutoPoll},
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode, TableId,
- KindOfTable, infinity);
-
-
- #etsread_nodedown{} ->
- AutoPoll = case PollInterval of
- infinity ->
- false;
- _Other ->
- true
- end,
- MasterPid ! #pc_nodedown{sender = self(),
- automatic_polling = AutoPoll},
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode, TableId,
- KindOfTable, infinity);
-
-
- {error_msg_mode, Mode} ->
- put(error_msg_mode, Mode),
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode, TableId, KindOfTable,
- PollInterval);
-
-
- {'EXIT', Pid, Reason} ->
- exit_signals({Pid, Reason}, MasterPid),
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode,
- TableId, KindOfTable, PollInterval)
- end
-
- after PollInterval ->
- %% Automatic polling must be on, otherwise these
- %% lines would never be executed!
- NewPollInterval =
- case catch read_table(Node,LocalNode,TableId,KindOfTable,DbsPid) of
- nodedown ->
- MasterPid ! #pc_nodedown{sender = self(),
- automatic_polling = true},
- infinity;
- no_table ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = true},
- infinity;
- mnesia_not_started ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = true},
- infinity;
- {unexpected_error,_Reason} ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = true},
- infinity;
- ElapsedMilliseconds ->
- if
- (ElapsedMilliseconds * 1000) >= PollInterval ->
- infinity;
- true ->
- PollInterval
- end
- end,
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode,
- TableId, KindOfTable, NewPollInterval)
- end.
-
-
-
-
-
-exit_signals(ExitInfo, MasterPid) ->
- case ExitInfo of
- {MasterPid, _Reason} ->
- exit(normal);
- _Other ->
- done
- end.
-
-
-
-
-update_object(KindOfTable, Node, LocalNode, TableId, DbsPid, KeyNo, Obj, OldObj, MasterPid, PollInterval) ->
- AutoPoll =
- case PollInterval of
- infinity ->
- false;
- _Other ->
- true
- end,
- case check_record_format(KindOfTable, Node, LocalNode, TableId, Obj) of
- bad_format ->
- DbsPid ! #etsread_update_object_cfm{sender = self(),
- success = false};
- ok ->
- %% Check that we are allowed to edit the table!
- case catch update_object2(KindOfTable, Node, LocalNode, TableId, DbsPid, KeyNo,
- Obj, OldObj) of
-
- nodedown ->
- DbsPid ! #etsread_update_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_nodedown{sender = self(),
- automatic_polling = AutoPoll};
-
- no_table ->
- DbsPid ! #etsread_update_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = AutoPoll};
-
- mnesia_not_started ->
- DbsPid ! #etsread_update_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = AutoPoll};
-
-
- {unexpected_error,_Reason} ->
- DbsPid ! #etsread_update_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = AutoPoll};
-
- ok ->
- DbsPid ! #etsread_update_object_cfm{sender = self(),
- success = true}
- end
- end.
-
-
-
-
-
-update_object2(ets, Node, LocalNode, Tab, _DbsPid, KeyNo, Obj, OldObj) ->
- %% We shall update a specific object! If the table is a 'set' table,
- %% it is just to insert the altered object. However, if the table
- %% is a 'bag', or a 'duplicate_bag', we first have to remove the
- %% old object, and then insert the altered one.
- %% But, we aren't finished with that... we also want to preserve
- %% the time order, meaning we have to delete *ALL* objects having the
- %% very same key, and then insert them again! (Actually we would have
- %% to do this anyhow, due to limitations in the interface functions,
- %% but this remark has to be noted!)
- OldKey = element(KeyNo, OldObj),
- InsertList =
- case tv_ets_rpc:info(Node, LocalNode, Tab, type) of
- set ->
- %% Have to remove old object, because the key may be what's changed.
- tv_ets_rpc:delete(Node, LocalNode, Tab, OldKey),
- [Obj];
- ordered_set ->
- %% Have to remove old object, because the key may be what's changed.
- tv_ets_rpc:delete(Node, LocalNode, Tab, OldKey),
- [Obj];
- _Other -> %% 'bag' or 'duplicate_bag'
- OldList = tv_ets_rpc:lookup(Node, LocalNode, Tab, OldKey),
- tv_ets_rpc:delete(Node, LocalNode, Tab, OldKey),
- %% Have to beware of duplicate_bag tables,
- %% i.e., the same object may occur more than
- %% once, but we only want to replace it once!
- {_Replaced, TmpList} =
- lists:foldl(
- fun(Data, {Replaced,Acc}) when Data =/= OldObj ->
- {Replaced, [Data | Acc]};
- (_Data, {Replaced,Acc}) when not Replaced ->
- {true, [Obj | Acc]};
- (Data, {Replaced,Acc}) ->
- {Replaced, [Data | Acc]}
- end,
- {false, []},
- OldList),
- lists:reverse(TmpList)
- end,
- lists:foreach(fun(H) ->
- tv_ets_rpc:insert(Node, LocalNode, Tab, H)
- end,
- InsertList),
- ok;
-update_object2(mnesia, Node, LocalNode, Tab, _DbsPid, KeyNo, Obj, OldObj) ->
- OldKey = element(KeyNo, OldObj),
- InsertList =
- case tv_mnesia_rpc:table_info(Node, LocalNode, Tab, type) of
- set ->
- tv_mnesia_rpc:transaction(
- Node,
- LocalNode,
- fun() ->
- mnesia:delete(Tab,OldKey,write)
- end),
- [Obj];
- ordered_set ->
- tv_mnesia_rpc:transaction(
- Node,
- LocalNode,
- fun() ->
- mnesia:delete(Tab,OldKey,write)
- end),
- [Obj];
- _Other -> %% 'bag' or 'duplicate_bag'
- {atomic, OldList} =
- tv_mnesia_rpc:transaction(
- Node,
- LocalNode,
- fun() ->
- mnesia:read(Tab,OldKey,read)
- end),
- %% We can't use mnesia:delete_object here, because
- %% time order wouldn't be preserved then!!!
- tv_mnesia_rpc:transaction(
- Node,
- LocalNode,
- fun() ->
- mnesia:delete(Tab,OldKey,write)
- end),
- ChangeFun =
- fun(H) when H =:= OldObj ->
- Obj;
- (H) ->
- H
- end,
- [ChangeFun(X) || X <- OldList]
- end,
- lists:foreach(fun(H) ->
- tv_mnesia_rpc:transaction(
- Node,
- LocalNode,
- fun() ->
- %% This mnesia call shall not be distributed,
- %% since the transaction sees to that it is
- %% executed on the right node!!!
- mnesia:write(Tab,H,write)
- end)
- end,
- InsertList),
- ok.
-
-
-
-
-
-
-delete_object(KindOfTable, Node, LocalNode, TableId, DbsPid, Obj, MasterPid, PollInterval) ->
- AutoPoll =
- case PollInterval of
- infinity ->
- false;
- _Other ->
- true
- end,
- case catch delete_object2(KindOfTable, Node, LocalNode, TableId, DbsPid, Obj) of
-
- nodedown ->
- DbsPid ! #etsread_delete_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_nodedown{sender = self(),
- automatic_polling = AutoPoll};
-
- no_table ->
- DbsPid ! #etsread_delete_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = AutoPoll};
-
- mnesia_not_started ->
- DbsPid ! #etsread_delete_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = AutoPoll};
-
- {unexpected_error,_Reason} ->
- DbsPid ! #etsread_delete_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = AutoPoll};
-
- ok ->
- DbsPid ! #etsread_delete_object_cfm{sender = self(),
- success = true}
- end.
-
-
-
-
-delete_object2(ets, Node, LocalNode, Tab, _DbsPid, Obj) ->
- KeyNo = tv_ets_rpc:info(Node, LocalNode, Tab, keypos),
- Key = element(KeyNo, Obj),
- InsertList =
- case tv_ets_rpc:info(Node, LocalNode, Tab, type) of
- set ->
- %% Have to remove old object, because the key may be what's changed.
- tv_ets_rpc:delete(Node, LocalNode, Tab, Key),
- [];
- ordered_set ->
- %% Have to remove old object, because the key may be what's changed.
- tv_ets_rpc:delete(Node, LocalNode, Tab, Key),
- [];
- _Other -> %% 'bag' or 'duplicate_bag'
- OldList = tv_ets_rpc:lookup(Node, LocalNode, Tab, Key),
- tv_ets_rpc:delete(Node, LocalNode, Tab, Key),
- OldList -- [Obj]
- end,
-
- lists:foreach(fun(H) ->
- tv_ets_rpc:insert(Node, LocalNode, Tab, H)
- end,
- InsertList),
- ok;
-delete_object2(mnesia, Node, LocalNode, Tab, _DbsPid, Obj) ->
- tv_mnesia_rpc:transaction(
- Node,
- LocalNode,
- fun() ->
- %% This mnesia call shall not be distributed,
- %% since the transaction sees to that it is
- %% executed on the right node!!!
- mnesia:delete_object(Tab,Obj,write)
- end),
- ok.
-
-
-
-
-
-new_object(KindOfTable, Node, LocalNode, TableId, DbsPid, Obj, MasterPid, PollInterval) ->
- AutoPoll =
- case PollInterval of
- infinity ->
- false;
- _Other ->
- true
- end,
- case check_record_format(KindOfTable, Node, LocalNode, TableId, Obj) of
- bad_format ->
- DbsPid ! #etsread_new_object_cfm{sender = self(),
- success = false};
- ok ->
- %% Check that we are allowed to edit the table!
- case catch new_object2(KindOfTable, Node, LocalNode, TableId, DbsPid, Obj) of
-
- nodedown ->
- DbsPid ! #etsread_new_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_nodedown{sender = self(),
- automatic_polling = AutoPoll};
-
- no_table ->
- DbsPid ! #etsread_new_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = AutoPoll};
-
- mnesia_not_started ->
- DbsPid ! #etsread_new_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = AutoPoll};
-
- {unexpected_error,_Reason} ->
- DbsPid ! #etsread_new_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = AutoPoll};
-
- ok ->
- DbsPid ! #etsread_new_object_cfm{sender = self(),
- success = true}
- end
- end.
-
-
-
-
-
-new_object2(ets, Node, LocalNode, Tab, _DbsPid, Obj) ->
- tv_ets_rpc:insert(Node, LocalNode, Tab, Obj),
- ok;
-new_object2(mnesia, Node, LocalNode, Tab, _DbsPid, Obj) ->
- tv_mnesia_rpc:transaction(
- Node,
- LocalNode,
- fun() ->
- %% This mnesia call shall not be distributed,
- %% since the transaction sees to that it is
- %% executed on the right node!!!
- mnesia:write(Tab,Obj,write)
- end),
- ok.
-
-
-
-
-
-check_record_format(mnesia, Node, LocalNode, Tab, Obj) ->
- Arity = tv_mnesia_rpc:table_info(Node, LocalNode, Tab, arity),
- case size(Obj) of
- Arity ->
- ok;
- _Other ->
- gs:window(etsreadwin, gs:start(), []),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(etsreadwin, "TV Notification",
- ["The record is not complete,",
- "too few fields are specified!"]);
- haiku ->
- tv_utils:notify(etsreadwin, "TV Notification",
- ["The attempt to change",
- "The specified record size",
- "Is simply ignored."])
- end,
- gs:destroy(etsreadwin),
- bad_format
- end;
-check_record_format(ets, _Node, _LocalNode, _Tab, _Obj) ->
- ok.
-
-
-
-
-
-
-
-read_table(Node, LocalNode, Tab, KindOfTable, DbsPid) ->
- T1 = time(),
-
- {TableContent, ListOfKeys} =
- case KindOfTable of
- ets ->
- {tv_ets_rpc:tab2list(Node, LocalNode, Tab),
- [tv_ets_rpc:info(Node, LocalNode, Tab, keypos)]
- };
- mnesia ->
- %% It may be tempting to use Mnesia event subscription,
- %% but will this really save the day? The main drawback
- %% is that we will then have to update the table copy we
- %% store internally in two different ways: one for the
- %% Mnesia tables, and one for the ETS tables. Also, if
- %% the Mnesia tables are frequently updated, this will
- %% cause TV to work all the time too (either updating the
- %% table copy for each inserted/deleted object, or storing
- %% these objects until polling is ordered). To make this
- %% work smoothly requires a bit of work...
- %% The second drawback is that it doesn't seem clear in all
- %% circumstances how the subscription actually works - i.e.,
- %% if we only use subscriptions, can we actually be sure that
- %% the *real* state of the table is the same as the one kept
- %% in TV? For example, imagine the scenario that Mnesia is
- %% stopped, all Mnesia directories are removed (from the UNIX
- %% shell), and then Mnesia once again is started. The first
- %% problem is that we have to check for start/stop of Mnesia,
- %% the second is that we then have to rescan the actual table.
- %% The logic for this may require som effort to write!
- %% Also, what will happen if the table is killed/dies?
- %% Will we get messages for each element in the table?
- %% (I havent't checked this last issue, this is just som thoughts.)
- %% And generally, there is always a risk that a message is lost,
- %% which will result in TV showing an erroneous table content.
- %%
- %% All in all, using Mnesia subscriptions *may* be a sub-optimization.
- %% The current solution works fine, is also easy to control, and is
- %% mainly the same for both ETS and Mnesia tables.
- %% My suggestion is that it is used until someone actually complains
- %% about the polling time being too long for huge tables! :-)
- %% (However, it shall be emphasized that it is this module that
- %% actually polls the Mnesia/ETS tables, meaning that it is
- %% mainly this module that has to be modified, should the usage of
- %% subscriptions be desired. The other module that has to be modified
- %% is the one maintaining the internal copy of the table.)
- WildPattern = tv_mnesia_rpc:table_info(Node,LocalNode,Tab,wild_pattern),
- {atomic, Content} =
- tv_mnesia_rpc:transaction(
- Node,
- LocalNode,
- fun() ->
- %% This mnesia call shall not be distributed,
- %% since the transaction sees to that it is
- %% executed on the right node!!!
- mnesia:match_object(Tab, WildPattern, read)
- end),
- {Content, [2 | tv_mnesia_rpc:table_info(Node, LocalNode,Tab, index)]}
- end,
-
- T2 = time(),
-
- ElapsedTime = compute_elapsed_seconds(T1, T2),
-
- DbsPid ! #dbs_new_data{sender = self(),
- data = TableContent,
- keys = ListOfKeys,
- time_to_read_table = ElapsedTime
- },
-
- ElapsedTime.
-
-
-
-
-
-
-
-compute_elapsed_seconds({H1, M1, S1}, {H2, M2, S2}) ->
- ElapsedHours = get_time_diff(hours, H1, H2),
- ElapsedMinutes = get_time_diff(minutes, M1, M2),
- ElapsedSeconds = get_time_diff(seconds, S1, S2),
- (ElapsedHours * 3600) + (ElapsedMinutes * 60) + ElapsedSeconds + 1.
-
-
-
-
-
-get_time_diff(_Type, T1, T2) when T1 =< T2 ->
- T2 - T1;
-get_time_diff(hours, T1, T2) ->
- T2 + 24 - T1;
-get_time_diff(minutes, T1, T2) ->
- T2 + 60 - T1;
-get_time_diff(seconds, T1, T2) ->
- T2 + 60 - T1.
diff --git a/lib/tv/src/tv_info.erl b/lib/tv/src/tv_info.erl
deleted file mode 100644
index c744888c38..0000000000
--- a/lib/tv/src/tv_info.erl
+++ /dev/null
@@ -1,884 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. 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(tv_info).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,frame,2}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,listbox,2}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([info/6
- ]).
-
-
--include("tv_int_def.hrl").
--include("tv_int_msg.hrl").
-
-
-
-
--define(DEFAULT_BG_COLOR, {217, 217, 217}).
-
-
--record(card_field_ids, {parent_pid,
- window_id,
- window_frame,
- table_id,
- table_type,
- table_name,
- named_table,
- owner_pid,
- owner_name,
- bag_or_set,
- arity,
- attributes,
- wild_pattern,
- keypos,
- index,
- snmp,
- protection,
- size,
- memory,
- storage_type,
- disc_copies,
- where_to_read,
- ram_copies,
- disc_only_copies,
- where_to_write,
- checkpoints,
- node
- }).
-
-
-
--define(WINDOW_WIDTH, 580).
--define(WINDOW_HEIGHT, 430).
-
-
-
--define(MNESIA_INFO_ITEMS, [type,
- arity,
- attributes,
- index,
- size,
- memory,
- storage_type,
- where_to_read,
- disc_copies,
- disc_only_copies,
- ram_copies,
- where_to_write,
- checkpoints
- ]).
-
-
-
-
-info(Master, Node, LocalNode, TabId, TabType, ErrMsgMode) ->
- process_flag(trap_exit,true),
- WinId = create_window(),
- {CardIds, MaskLabel} = init(Master, Node, LocalNode, TabId, TabType, WinId),
- put(error_msg_mode, ErrMsgMode),
- gs:config(WinId, [{map, true}]),
- loop(CardIds, MaskLabel, Node, LocalNode, TabId, TabType).
-
-
-
-
-
-
-create_window() ->
- WinWidth = ?WINDOW_WIDTH,
- WinHeight = ?WINDOW_HEIGHT,
- Win = gs:window(win, gs:start(), [{width, WinWidth},
- {height, WinHeight},
- {bg, ?DEFAULT_BG_COLOR},
- {destroy, true},
- {configure, true},
- {keypress, true}
- ]),
-
- MenubarId = gs:create(menubar, Win, [{bg, ?DEFAULT_BG_COLOR}
- ]),
- Mbutt = gs:create(menubutton, MenubarId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}}, % firebrick
- {label, {text, " File "}},
- {underline, 1}
- ]),
- Obutt = gs:create(menubutton, MenubarId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}}, % firebrick
- {label, {text, " Options "}},
- {underline, 1}
- ]),
-
- % Create the actual menu!
- FMenu = gs:create(menu, Mbutt, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}}]),
- OMenu = gs:create(menu, Obutt, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}}]),
- gs:create(menuitem, FMenu, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}},
- {label, {text, " Close Ctrl-C "}},
- {data, close_menu},
- {underline, 1}
- ]),
- gs:create(menuitem, OMenu, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}},
- {label, {text, " Refresh Ctrl-R "}},
- {data, update},
- {underline, 1}
- ]),
- Win.
-
-
-
-
-
-
-
-
-init(Master, Node, LocalNode, TabId, TabType, WinId) ->
- WinWidth = ?WINDOW_WIDTH,
- WinHeight = ?WINDOW_HEIGHT,
-
- WinFrame = gs:frame(WinId, [{width, WinWidth},
- {height, WinHeight},
- {x, 0},
- {y, 30},
- {bg, ?DEFAULT_BG_COLOR},
- {bw, 0}
- ]),
-
- TableIdFlap = create_flap(1, "Table Id", WinFrame),
- BasicSettingsFlap = create_flap(2, "Basic Settings", WinFrame),
- SizeFlap = create_flap(3, "Size", WinFrame),
- StorageFlap = create_flap(4, "Storage", WinFrame),
-
- TableIdCard = create_card(WinFrame, TableIdFlap),
- BasicSettingsCard = create_card(WinFrame, BasicSettingsFlap),
- SizeCard = create_card(WinFrame, SizeFlap),
- StorageCard = create_card(WinFrame, StorageFlap),
-
-
- set_flap_label(TableIdFlap, "Table Id"),
- set_flap_label(BasicSettingsFlap, "Basic Settings"),
- set_flap_label(SizeFlap, "Size"),
- set_flap_label(StorageFlap, "Storage"),
-
-
- gs:config(TableIdCard, [raise]),
-
- CardIds = print_cards(TabType, TableIdCard, BasicSettingsCard, SizeCard, StorageCard),
-
- {_CardId, FirstMaskXpos} = gs:read(TableIdFlap, data),
- Mask = gs:label(WinFrame, [{width, gs:read(TableIdFlap, width) - 2 * gs:read(TableIdFlap, bw) + 1},
- {height, gs:read(TableIdCard, bw)},
- {x, FirstMaskXpos},
- {y, gs:read(TableIdCard, y)},
- {bg, ?DEFAULT_BG_COLOR}
- ]),
-
- update_info_flaps(TabType, Node, LocalNode, TabId, CardIds, Master),
- {CardIds#card_field_ids{parent_pid = Master,
- window_id = WinId,
- window_frame = WinFrame}, Mask}.
-
-
-
-
-
-check_node(OldNode, LocalNode) ->
- HomeNode = node(),
- case net_adm:ping(OldNode) of
- pong ->
- OldNode;
- pang when LocalNode ->
- %% The system has gone either distributed or undistributed.
- %% No matter which, HomeNode tells the current correct node.
- HomeNode;
- pang ->
- OldNode
- end.
-
-
-
-
-
-
-update_data_field(notext, {label, Id}) ->
- gs:config(Id, [{label, {text, "" }}]);
-update_data_field(notext, {listbox, Id}) ->
- gs:config(Id, [{items, []}]);
-update_data_field({Data}, {label, Id}) ->
- gs:config(Id, [{label, {text, " " ++ lists:flatten(io_lib:write(Data))}}]);
-update_data_field({Data}, {listbox, Id}) ->
- gs:config(Id, [{items, lists:map(fun(E) -> " " ++ lists:flatten(io_lib:write(E))
- end, Data)}]).
-
-
-
-
-print_info(mnesia, Node, LocalNode, TabId, CardIds) ->
- update_data_field({mnesia},
- CardIds#card_field_ids.table_type),
- update_data_field({TabId},
- CardIds#card_field_ids.table_name),
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, type)},
- CardIds#card_field_ids.bag_or_set),
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, arity) - 1},
- CardIds#card_field_ids.arity),
-
- AttributesList = tv_mnesia_rpc:table_info(Node, LocalNode, TabId, attributes),
- update_data_field({AttributesList},
- CardIds#card_field_ids.attributes),
- update_data_field({lists:map(fun(N) ->
- lists:nth(N - 1, AttributesList)
- end,
- [2] ++ tv_mnesia_rpc:table_info(Node,
- LocalNode,
- TabId,
- index)
- )
- },
- CardIds#card_field_ids.index),
-
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, size)},
- CardIds#card_field_ids.size),
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, memory)},
- CardIds#card_field_ids.memory),
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, storage_type)},
- CardIds#card_field_ids.storage_type),
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, where_to_read)},
- CardIds#card_field_ids.where_to_read),
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, disc_copies)},
- CardIds#card_field_ids.disc_copies),
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, disc_only_copies)},
- CardIds#card_field_ids.disc_only_copies),
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, ram_copies)},
- CardIds#card_field_ids.ram_copies),
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, where_to_write)},
- CardIds#card_field_ids.where_to_write),
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, checkpoints)},
- CardIds#card_field_ids.checkpoints),
- {ok, TabId};
-print_info(ets, Node, LocalNode, TabId, CardIds) ->
- update_data_field({ets},
- CardIds#card_field_ids.table_type),
- update_data_field({TabId},
- CardIds#card_field_ids.table_id),
- TabName = tv_ets_rpc:info(Node, LocalNode, TabId, name),
- update_data_field({TabName},
- CardIds#card_field_ids.table_name),
- update_data_field({tv_ets_rpc:info(Node, LocalNode, TabId, named_table)},
- CardIds#card_field_ids.named_table),
-
- OwnerPid = tv_ets_rpc:info(Node, LocalNode, TabId, owner),
- OwnerNameSearchResult = lists:keysearch(registered_name,
- 1,
- rpc:block_call(Node,
- erlang,
- process_info,
- [OwnerPid])),
- OwnerName = case OwnerNameSearchResult of
- false ->
- notext;
- {value, {registered_name, WantedName}} ->
- {WantedName}
- end,
- update_data_field({OwnerPid},
- CardIds#card_field_ids.owner_pid),
- update_data_field(OwnerName,
- CardIds#card_field_ids.owner_name),
-
- update_data_field({tv_ets_rpc:info(Node, LocalNode, TabId, keypos)},
- CardIds#card_field_ids.keypos),
- update_data_field({tv_ets_rpc:info(Node, LocalNode, TabId, type)},
- CardIds#card_field_ids.bag_or_set),
- update_data_field({tv_ets_rpc:info(Node, LocalNode, TabId, protection)},
- CardIds#card_field_ids.protection),
- update_data_field({tv_ets_rpc:info(Node, LocalNode, TabId, size)},
- CardIds#card_field_ids.size),
- update_data_field({tv_ets_rpc:info(Node, LocalNode, TabId, memory)},
- CardIds#card_field_ids.memory),
- update_data_field({tv_ets_rpc:info(Node, LocalNode, TabId, node)},
- CardIds#card_field_ids.node),
- {ok, TabName}.
-
-
-
-
-
-
-print_cards(mnesia, Card1, Card2, Card3, Card4) ->
- create_card_text(1, "Table Type:", Card1),
- create_card_text(2, "Table Name:", Card1),
-
- create_card_text(1, "Table Type:", Card2),
- create_card_text(2, "Number of Attributes:", Card2),
-% create_card_text(3, "Attribute Names:", Card2),
-% create_card_text(4, "Index Positions:", Card2),
-
- create_card_text(1, "Number of Elements Stored:", Card3),
- create_card_text(2, "Number of Words Allocated:", Card3),
-
- create_card_text(1, "Local Storage Type:", Card4),
- create_card_text(2, "Table Readable at Node:", Card4),
-% create_card_text(3, "Disc Copy Nodes:", Card4),
-% create_card_text(4, "Disc Copy Only Nodes:", Card4),
-% create_card_text(5, "RAM Copy Nodes:", Card4),
-% create_card_text(6, "Active Table Replica Nodes:", Card4),
-% create_card_text(7, "Active Checkpoints:", Card4),
-
- {AttributesId, IndexId} = create_special_fields(mnesia, size_card, Card2),
-
-
- {DiscCopiesId, DiscOnlyCopiesId, RamCopiesId, WhereToWriteId, CheckpointsId} =
- create_special_fields(mnesia, storage_card, Card4),
-
- #card_field_ids{table_name = {label, create_card_data_field(2, Card1)},
- table_type = {label, create_card_data_field(1, Card1)},
- bag_or_set = {label, create_card_data_field(1, Card2)},
- arity = {label, create_card_data_field(2, Card2)},
- attributes = AttributesId,
- index = IndexId,
- size = {label, create_card_data_field(1, Card3)},
- memory = {label, create_card_data_field(2, Card3)},
- storage_type = {label, create_card_data_field(1, Card4)},
- where_to_read = {label, create_card_data_field(2, Card4)},
- disc_copies = DiscCopiesId,
- disc_only_copies = DiscOnlyCopiesId,
- ram_copies = RamCopiesId,
- where_to_write = WhereToWriteId,
- checkpoints = CheckpointsId
- };
-print_cards(ets, Card1, Card2, Card3, Card4) ->
- create_card_text(1, "Table Type:", Card1),
- create_card_text(2, "Table Id:", Card1),
- create_card_text(3, "Table Name:", Card1),
- create_card_text(4, "Table Name Registered:", Card1),
- create_card_text(5, "Process Owning the Table:", Card1),
- create_card_text(6, "Name of Owning Process:", Card1),
-
- create_card_text(1, "Index Position:", Card2),
- create_card_text(2, "Table Type:", Card2),
- create_card_text(3, "Protection Mode:", Card2),
-
- create_card_text(1, "Number of Elements Stored:", Card3),
- create_card_text(2, "Number of Words Allocated:", Card3),
-
- create_card_text(1, "Table Stored at Node:", Card4),
-
- #card_field_ids{table_id = {label, create_card_data_field(2, Card1)},
- table_type = {label, create_card_data_field(1, Card1)},
- table_name = {label, create_card_data_field(3, Card1)},
- named_table = {label, create_card_data_field(4, Card1)},
- owner_pid = {label, create_card_data_field(5, Card1)},
- owner_name = {label, create_card_data_field(6, Card1)},
-
- keypos = {label, create_card_data_field(1, Card2)},
- bag_or_set = {label, create_card_data_field(2, Card2)},
- protection = {label, create_card_data_field(3, Card2)},
-
- size = {label, create_card_data_field(1, Card3)},
- memory = {label, create_card_data_field(2, Card3)},
-
- node = {label, create_card_data_field(1, Card4)}
- }.
-
-
-
-
-
-
-create_special_fields(mnesia, size_card, CardId) ->
- LabelWidth = 195,
- LabelHeight = 24,
- ListboxWidth = 210,
- ListboxHeight = 160,
- VerticalSpacing = 20,
- LXpos = 30,
- RXpos = 330,
- Ypos = 40 + (LabelHeight + VerticalSpacing) * 2 + 25,
- gs:label(CardId, [{width, LabelWidth},
- {height, LabelHeight},
- {x, LXpos},
- {y, Ypos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, center},
- {label, {text, "Attribute Names:"}}
- ]),
-
- gs:label(CardId, [{width, LabelWidth},
- {height, LabelHeight},
- {x, RXpos},
- {y, Ypos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, center},
- {label, {text, "Attributes Used as Indices:"}}
- ]),
-
- AttributesId = gs:listbox(CardId, [{width, ListboxWidth},
- {height, ListboxHeight},
- {x, LXpos},
- {y, Ypos + LabelHeight - 3},
- {bg, {255, 255, 255}},
- {fg, {0, 0, 0}},
- {hscroll, bottom},
- {vscroll, right},
- {selectmode, single},
- {click, true},
- {doubleclick, true},
- {data, listbox}
- ]),
-
- IndexId = gs:listbox(CardId, [{width, ListboxWidth},
- {height, ListboxHeight},
- {x, RXpos},
- {y, Ypos + LabelHeight - 3},
- {bg, {255, 255, 255}},
- {fg, {0, 0, 0}},
- {hscroll, bottom},
- {vscroll, right},
- {selectmode, single},
- {click, true},
- {doubleclick, true},
- {data, listbox}
- ]),
-
- {{listbox, AttributesId},
- {listbox, IndexId}
- };
-create_special_fields(mnesia, storage_card, CardId) ->
- LabelWidth = 155,
- LabelHeight = 24,
- ListboxHeight = 80,
- ListboxWidth = 170,
- VerticalSpacing = 20,
- LXpos = 10,
- MXpos = 197,
- RXpos = 385,
- % Y-positions for upper and lower row.
- UYpos = 40 + (LabelHeight + VerticalSpacing) * 2,
- LYpos = UYpos + ListboxHeight + 37,
- gs:label(CardId, [{width, LabelWidth},
- {height, LabelHeight},
- {x, LXpos},
- {y, UYpos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, center},
- {label, {text, "Disc Copy Nodes:"}}
- ]),
-
- gs:label(CardId, [{width, LabelWidth},
- {height, LabelHeight},
- {x, MXpos},
- {y, UYpos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, center},
- {label, {text, "Disc Only Copy Nodes:"}}
- ]),
-
- gs:label(CardId, [{width, LabelWidth},
- {height, LabelHeight},
- {x, RXpos},
- {y, UYpos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, center},
- {label, {text, "RAM Copy Nodes:"}}
- ]),
-
-
- gs:label(CardId, [{width, LabelWidth},
- {height, LabelHeight},
- {x, LXpos},
- {y, LYpos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, center},
- {label, {text, "Table Replica Nodes:"}}
- ]),
-
- gs:label(CardId, [{width, LabelWidth},
- {height, LabelHeight},
- {x, MXpos},
- {y, LYpos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, center},
- {label, {text, "Active Checkpoints:"}}
- ]),
-
-
- DiscCopiesId = gs:listbox(CardId, [{width, ListboxWidth},
- {height, ListboxHeight},
- {x, LXpos},
- {y, UYpos + LabelHeight - 3},
- {bg, {255, 255, 255}},
- {fg, {0, 0, 0}},
- {hscroll, bottom},
- {vscroll, right},
- {selectmode, single},
- {click, true},
- {doubleclick, true},
- {data, listbox}
- ]),
-
- DiscCopiesOnlyId = gs:listbox(CardId, [{width, ListboxWidth},
- {height, ListboxHeight},
- {x, MXpos},
- {y, UYpos + LabelHeight - 3},
- {bg, {255, 255, 255}},
- {fg, {0, 0, 0}},
- {hscroll, bottom},
- {vscroll, right},
- {selectmode, single},
- {click, true},
- {doubleclick, true},
- {data, listbox}
- ]),
-
- RamCopiesId = gs:listbox(CardId, [{width, ListboxWidth},
- {height, ListboxHeight},
- {x, RXpos},
- {y, UYpos + LabelHeight - 3},
- {bg, {255, 255, 255}},
- {fg, {0, 0, 0}},
- {hscroll, bottom},
- {vscroll, right},
- {selectmode, single},
- {click, true},
- {doubleclick, true},
- {data, listbox}
- ]),
-
-
-
- WhereToWriteId = gs:listbox(CardId, [{width, ListboxWidth},
- {height, ListboxHeight},
- {x, LXpos},
- {y, LYpos + LabelHeight - 3},
- {bg, {255, 255, 255}},
- {fg, {0, 0, 0}},
- {hscroll, bottom},
- {vscroll, right},
- {selectmode, single},
- {click, true},
- {doubleclick, true},
- {data, listbox}
- ]),
-
- CheckpointsId = gs:listbox(CardId, [{width, ListboxWidth},
- {height, ListboxHeight},
- {x, MXpos},
- {y, LYpos + LabelHeight - 3},
- {bg, {255, 255, 255}},
- {fg, {0, 0, 0}},
- {hscroll, bottom},
- {vscroll, right},
- {selectmode, single},
- {click, true},
- {doubleclick, true},
- {data, listbox}
- ]),
-
- {{listbox, DiscCopiesId},
- {listbox, DiscCopiesOnlyId},
- {listbox, RamCopiesId},
- {listbox, WhereToWriteId},
- {listbox, CheckpointsId}
- }.
-
-
-
-
-
-
-
-create_card_data_field(N, ParentId) ->
- Width = 345,
- Height = 24,
- VerticalSpacing = 20,
- Xpos = 210,
- Ypos = 40 + (Height + VerticalSpacing) * (N - 1),
-
- BgFrame = gs:frame(ParentId, [{width, Width},
- {height, Height},
- {x, Xpos},
- {y, Ypos},
- {bg, {0, 0, 0}},
- {bw, 0}
- ]),
- gs:label(BgFrame, [{width, Width - 2},
- {height, Height - 2},
- {x, 1},
- {y, 1},
- {bg, {255, 255, 255}},
- {fg, {0, 0, 0}},
- {align, w}
- ]).
-
-
-
-
-
-
-create_card_text(N, Text, ParentId) ->
- LabelWidth = 205,
- LabelHeight = 24,
- VerticalSpacing = 20,
- Xpos = 10,
- Ypos = 40 + (LabelHeight + VerticalSpacing) * (N - 1),
- gs:label(ParentId, [{width, LabelWidth},
- {height, LabelHeight},
- {x, Xpos},
- {y, Ypos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, w},
- {label, {text, Text}}
- ]).
-
-
-
-
-create_card(ParentId, FlapId) ->
- CardId = gs:frame(ParentId, [{width, 570},
- {height, 360},
- {x, 5},
- {y, 35},
- {bg, ?DEFAULT_BG_COLOR},
- {bw, 2}
- ]),
- FlapXpos = gs:read(FlapId, data),
- gs:config(FlapId, [{data, {CardId, FlapXpos}}
- ]),
- CardId.
-
-
-
-
-
-set_flap_label(ParentId, Text) ->
- Bw = gs:read(ParentId, bw), % It is assumed that the parent is a frame! :-)
- Width = gs:read(ParentId, width) - 2 * Bw - 2,
- Height = gs:read(ParentId, height) - 2 * Bw - 6,
- Xpos = 0,
- Ypos = 0,
- Data = gs:read(ParentId, data),
-
- gs:label(ParentId, [{width, Width},
- {height, Height},
- {x, Xpos},
- {y, Ypos},
- % {fg, {178, 34, 34}},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {label, {text, Text}},
- {align, center},
- {buttonpress, true},
- {data, Data}
- ]).
-
-
-
-create_flap(N, _Text, ParentId) ->
- Width = 120,
- Height = 40,
- Spacing = 2,
- FirstXpos = 5,
- Xpos = FirstXpos + ((Width + Spacing) * (N - 1)),
- Ypos = 5,
- BorderWidth = 2,
-
- gs:frame(ParentId, [{width, Width},
- {height, Height},
- {x, Xpos},
- {y, Ypos},
- {bg, ?DEFAULT_BG_COLOR},
- {bw, BorderWidth},
- {cursor, hand},
- {buttonpress, true},
- {data, Xpos + BorderWidth}
- ]).
-
-
-
-update_info_flaps(TabType, Node, LocalNode, TabId, CardIds, MasterPid) ->
- case catch print_info(TabType, Node, LocalNode, TabId, CardIds) of
- {ok, TabName} ->
- WinTitle = tv_pc_menu_handling:get_window_title(TabType,Node,TabId,TabName),
- gs:config(win, [{title, "[TV] " ++ WinTitle}]),
- done;
- nodedown ->
- nodedown;
- no_table ->
- gs:config(win, [beep]),
- case get(error_msg_mode) of
- normal ->
- Msg = ["The table " ++ lists:flatten(io_lib:write(TabId)) ++ " on node",
- lists:flatten(io_lib:write(Node)) ++ " no longer exists!"],
- tv_utils:notify(win, "TV Notification", Msg);
- haiku ->
- Msg = ["Three things are certain:",
- "Death, taxes, and lost tables.",
- "Guess which has occurred."],
- tv_utils:notify(win, "TV Notification", Msg)
- end,
- MasterPid ! #ip_dead_table{sender = self()};
- mnesia_not_started ->
- gs:config(win, [beep]),
- case get(error_msg_mode) of
- normal ->
- Msg = ["The table " ++ lists:flatten(io_lib:write(TabId)) ++ " on node",
- lists:flatten(io_lib:write(Node)) ++ " no longer exists!"],
- tv_utils:notify(win, "TV Notification", Msg);
- haiku ->
- Msg = ["A table that big?",
- "It might be very useful.",
- "But now it is gone."],
- tv_utils:notify(win, "TV Notification", Msg)
- end,
- MasterPid ! #ip_dead_table{sender = self()};
- {unexpected_error,Reason} ->
- io:format("Unexpected error: ~p~n", [Reason]);
- _Other ->
- io:format("Unexpected return value: ~p~n", [_Other]),
- done
- end.
-
-
-
-
-loop(CardIds, MaskLabel, Node, LocalNode, TabId, TabType) ->
- receive
- #info_update_table_info{sender = Sender} ->
- NewNode = check_node(Node, LocalNode),
- update_info_flaps(TabType, NewNode, LocalNode, TabId, CardIds, Sender),
- loop(CardIds, MaskLabel, NewNode, LocalNode, TabId, TabType);
-
-
- #info_raise_window{sender = Sender} ->
- gs:config(CardIds#card_field_ids.window_id, [raise]),
- NewNode = check_node(Node, LocalNode),
- chk(update_info_flaps(TabType, NewNode, LocalNode, TabId, CardIds, Sender)),
- loop(CardIds, MaskLabel, NewNode, LocalNode, TabId, TabType);
-
-
- #info_quit{} ->
- exit(normal);
-
- {gs, _FlapId, buttonpress, {CardId, Xpos}, [1 | _]} ->
- gs:config(CardId, [raise
- ]),
- gs:config(MaskLabel, [raise,
- {x, Xpos}
- ]),
- loop(CardIds, MaskLabel, Node, LocalNode, TabId, TabType);
-
- {gs, _Id, buttonpress, {_CardId, _Xpos}, _Args} ->
- loop(CardIds, MaskLabel, Node, LocalNode, TabId, TabType);
-
- {gs, _LblId, enter, _Data, _Args} ->
- loop(CardIds, MaskLabel, Node, LocalNode, TabId, TabType);
-
- {gs, WinId, configure, _Data, _Args} ->
- gs:config(WinId, [{width, ?WINDOW_WIDTH},
- {height, ?WINDOW_HEIGHT}
- ]),
- loop(CardIds, MaskLabel, Node, LocalNode, TabId, TabType);
-
- {gs, ListboxId, click, listbox, _Args} ->
- gs:config(ListboxId, [{selection, clear}]),
- loop(CardIds, MaskLabel, Node, LocalNode, TabId, TabType);
-
- {gs, ListboxId, doubleclick, listbox, _Args} ->
- gs:config(ListboxId, [{selection, clear}]),
- loop(CardIds, MaskLabel, Node, LocalNode, TabId, TabType);
-
- {gs, _Id, click, update, _Args} ->
- NewNode = check_node(Node, LocalNode),
- chk(update_info_flaps(TabType,NewNode,LocalNode,TabId,CardIds,
- CardIds#card_field_ids.parent_pid)),
- loop(CardIds, MaskLabel, NewNode, LocalNode, TabId, TabType);
-
- {gs, _Id, keypress, _, [r, _, 0, 1 | _]} ->
- NewNode = check_node(Node, LocalNode),
- chk(update_info_flaps(TabType,NewNode,LocalNode,TabId,CardIds,
- CardIds#card_field_ids.parent_pid)),
- loop(CardIds, MaskLabel, NewNode, LocalNode, TabId, TabType);
-
- {gs, _Id, keypress, _, ['R', _, 1, 1 | _]} ->
- NewNode = check_node(Node, LocalNode),
- chk(update_info_flaps(TabType,NewNode,LocalNode,TabId,CardIds,
- CardIds#card_field_ids.parent_pid)),
- loop(CardIds, MaskLabel, NewNode, LocalNode, TabId, TabType);
-
- {gs, _Id, click, close_menu, _Args} ->
- exit(normal);
-
- {gs, _Id, keypress, _, [c, _, 0, 1 | _]} ->
- exit(normal);
-
- {gs, _Id, keypress, _, ['C', _, 1, 1 | _]} ->
- exit(normal);
-
- {gs, _Id, destroy, _Data, _Args} ->
- exit(normal);
-
- {'EXIT', _Pid, _Reason} ->
- exit(normal);
-
- {error_msg_mode, Mode} ->
- put(error_msg_mode, Mode),
- loop(CardIds, MaskLabel, Node, LocalNode, TabId, TabType);
-
- _Other ->
- loop(CardIds, MaskLabel, Node, LocalNode, TabId, TabType)
- end.
-
-
-
-
-
-
-chk(nodedown) ->
- gs:config(win, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(win, "TV Notification",
- ["The node is down, and the",
- "table cannot be reached."]);
- haiku ->
- ErrMsg1 = ["With searching comes loss",
- "And the presence of absence:",
- "Node is down."],
- tv_utils:notify(win, "TV Notification", ErrMsg1)
- end;
-chk(_Other) ->
- done.
-
diff --git a/lib/tv/src/tv_int_def.hrl b/lib/tv/src/tv_int_def.hrl
deleted file mode 100644
index 6d4263c51b..0000000000
--- a/lib/tv/src/tv_int_def.hrl
+++ /dev/null
@@ -1,56 +0,0 @@
-%%
-%% %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%
-%%%*********************************************************************
-%%%
-%%% Description: Internal definitions for the table tool as a whole.
-%%%
-%%%*********************************************************************
-
--define(COMM_FUNC_FILE, tv_comm_func).
-
--define(ITEMS_TO_DISPLAY, 35).
-
-
--define(DEFAULT_BACKGROUND_COLOR, {255, 255, 255}). % white
-
-
-% Colors used for marking updates.
-
--define(BLACK, { 0, 0, 0}).
-
--define(RED1, {255, 0, 0}).
--define(RED2, {255, 100, 100}).
--define(RED3, {255, 150, 150}).
--define(RED4, {255, 200, 200}).
--define(RED5, {235, 217, 217}).
-
-
--define(GREEN1, { 0, 255, 0}).
--define(GREEN2, {115, 255, 135}).
--define(GREEN3, {125, 225, 150}).
--define(GREEN4, {170, 225, 185}).
--define(GREEN5, {195, 219, 202}).
-
--define(DEFAULT_BTN_COLOR, {217, 217, 217}).
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_int_msg.hrl b/lib/tv/src/tv_int_msg.hrl
deleted file mode 100644
index 75ce8eca3b..0000000000
--- a/lib/tv/src/tv_int_msg.hrl
+++ /dev/null
@@ -1,504 +0,0 @@
-%%
-%% %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%
-%%%*********************************************************************
-%%%
-%%% Description: File containing all messages used internally
-%%% between the various table tool components.
-%%%
-%%%*********************************************************************
-
-
-%%%*********************************************************************
-%%% MESSAGES OWNED BY PC
-%%%*********************************************************************
-
-
-
--record(pc_raise_window, {sender}).
-
-
-
--record(pc_menu_msg, {sender,
- data}).
-
-
-
--record(pc_win_conf, {sender,
- width,
- height}).
-
-
-
--record(pc_show_table_info, {sender}).
-
-
-
--record(pc_poll_table, {sender}).
-
-
-
--record(pc_select, {sender}).
-
-
-
--record(pc_help, {sender}).
-
-
-
--record(pc_set_sorting_mode, {sender,
- sorting, % 'true' or 'false'
- reverse, % 'true' or 'false',
- sort_key_no = 1
- }).
-
-
-
--record(pc_set_sorting_mode_cfm, {sender,
- sort_key_no
- }).
-
-
-
--record(pc_marked_row, {sender,
- row_no,
- object,
- color
- }).
-
-
-
--record(pc_data_req, {sender,
- element,
- nof_elements
- }).
-
-
-
--record(pc_resend_data, {sender}).
-
-
-
-
--record(pc_data, {sender,
- scale_pos, % vertical scale
- scale_range, % vertical scale
- max_elem_size,
- list_range,
- elementlist,
- marked_row,
- list_of_keys,
- color}).
-
-
-
-
--record(pc_list_info, {sender,
- lists_as_strings}).
-
-
-
--record(pc_dead_table, {sender,
- automatic_polling}).
-
-
-
--record(pc_nodedown, {sender,
- automatic_polling}).
-
-
-
--record(pc_search_req, {sender
- }).
-
-
-
-
-%%%*********************************************************************
-%%% MESSAGES OWNED BY PD
-%%%*********************************************************************
-
-
-
--record(pd_win_conf, {sender,
- width,
- height}).
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data: sender: Pid of the sender of the message.
-%% win: Id of window to create canvas and scale in.
-%% win_width: width of the window to create the canvas in.
-%% win_height: height of the window to create the canvas in.
-%% scale: whether a scale shall be shown or not.
-%% Possible values: true -- scale is shown.
-%% false -- scale is not shown.
-%%======================================================================
-
--record(pd_deblock, {sender,
- win,
- win_width,
- win_height,
- scale = false,
- range}).
-
-
-
-
--record(pd_deblock_cfm, {sender}).
-
-
-
--record(pd_new_table, {sender,
- table_type,
- table_name,
- record_name, %% Only valid for Mnesia tables.
- writable
- }).
-
-
-
--record(pd_get_sort_settings, {sender,
- sorting,
- reverse
- }).
-
-
-
--record(pd_no_sorting, {sender
- }).
-
-
-
-
--record(pd_ignore, {sender
- }).
-
-
-
-
--record(pd_updated_object, {sender,
- object,
- old_object,
- old_color, %% Tells status of the object, if deleted or present.
- obj_no
- }).
-
-
-
--record(pd_new_object, {sender, %% Used when no row is marked.
- object %% Note: may still be an updated object!
- }).
-
-
-
--record(pd_delete_object, {sender,
- object,
- color
- }).
-
-
-
--record(pd_rec_edit, {sender,
- attributes
- }).
-
-
-
-%%%*********************************************************************
-%%% MESSAGES OWNED BY PW
-%%%*********************************************************************
-
-
-
-
--record(pw_deblock, {sender,
- win_title,
- win_width,
- win_height,
- min_win_width,
- min_win_height}).
-
-
-
--record(pw_set_window_title, {sender,
- win_title}).
-
-
-
--record(pw_deblock_cfm, {sender,
- win_id}).
-
-
-
-
-%%======================================================================
-%% Message: pw_create_menu.
-%%
-%% Function: Order to pw to create a menu according to the content of the message.
-%%
-%% Data: menutitle: string containing the name of the menu, e.g., "File".
-%% menulist: list of tuples having the following format:
-%% {Text, Data}, where Text is the string that shall be
-%% written in each menulist item, and Data is optional data,
-%% presumably the name of a function that is to be called
-%% when the corresponding menulist message is received.
-%%======================================================================
-
--record(pw_create_menu, {sender,
- menutitle,
- title_acc_pos,
- menulist}).
-
-
-
--record(pw_create_menu_cfm, {sender}).
-
-
-
--record(pw_select_menu, {sender,
- menu,
- old_menus}).
-
-
-
-
-
-%%%*********************************************************************
-%%% MESSAGES OWNED BY DBS
-%%%*********************************************************************
-
-
-
--record(dbs_deblock, {sender,
- etsread_pid,
- type,
- keypos,
- sublist_length}).
-
-
-
--record(dbs_deblock_cfm, {sender}).
-
-
-
-
--record(dbs_new_data, {sender,
- data,
- keys,
- time_to_read_table
- }).
-
-
-
--record(dbs_new_mnesia_data, {sender,
- new_or_changed,
- deleted,
- keys
- }).
-
-
-
--record(dbs_subset, {sender,
- data,
- requested_row,
- subset_pos,
- db_length,
- max_elem_size,
- list_of_keys,
- required_time_etsread,
- required_time_dbs}).
-
-
-
-
-
--record(dbs_subset_req, {sender,
- subset_pos,
- subset_length
- }).
-
-
-
-
--record(dbs_sorting_mode, {sender,
- sorting, % 'true' or 'false'
- reverse, % 'true' or 'false'
- sort_key_no
- }).
-
-
-
--record(dbs_marked_row, {sender,
- row_no
- }).
-
-
-
-
--record(dbs_search_req, {sender
- }).
-
-
-
--record(dbs_updated_object, {sender,
- object,
- old_object,
- old_color,
- obj_no
- }).
-
-
--record(dbs_new_object, {sender,
- object
- }).
-
-
--record(dbs_delete_object, {sender,
- object,
- color,
- obj_no
- }).
-
-
-
-%%%*********************************************************************
-%%% MESSAGES OWNED BY ETSREAD
-%%%*********************************************************************
-
-
-
--record(etsread_update_object, {sender,
- object,
- old_object,
- key_no
- }).
-
--record(etsread_update_object_cfm, {sender,
- success
- }).
-
-
-
--record(etsread_new_object, {sender,
- object
- }).
-
-
--record(etsread_new_object_cfm, {sender,
- success
- }).
-
-
-
--record(etsread_delete_object, {sender,
- object,
- key_no
- }).
-
-
--record(etsread_delete_object_cfm, {sender,
- success
- }).
-
-
-
--record(etsread_deblock, {sender,
- dbs_pid,
- node,
- local_node,
- table_id,
- table_type, % One of 'ets' or 'mnesia'
- poll_interval
- }).
-
-
-
--record(etsread_deblock_cfm, {sender,
- type,
- keypos,
- protection
- }).
-
-
-
--record(etsread_set_poll_interval, {sender,
- interval}).
-
-
-
--record(etsread_poll_table, {sender}).
-
-
-
--record(etsread_nodedown, {sender}).
-
-
-
-%%%*********************************************************************
-%%% MESSAGES OWNED BY IP
-%%%*********************************************************************
-
-
-
-
--record(ip_dead_table, {sender}).
-
-
--record(ip_register_parent, {sender}).
-
-
-
--record(ip_update, {sender,
- nof_elements_to_mark,
- text}).
-
-
-
--record(ip_quit, {sender}).
-
-
-
-
-%%%*********************************************************************
-%%% MESSAGES OWNED BY INFO
-%%%*********************************************************************
-
-
--record(info_update_table_info, {sender}).
-
-
-
--record(info_raise_window, {sender}).
-
-
-
--record(info_restart, {sender,
- node,
- table_id,
- table_type}).
-
-
-
--record(info_quit, {sender}).
-
-
diff --git a/lib/tv/src/tv_io_lib.erl b/lib/tv/src/tv_io_lib.erl
deleted file mode 100644
index 5457575b7d..0000000000
--- a/lib/tv/src/tv_io_lib.erl
+++ /dev/null
@@ -1,223 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2010. 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%
-%%%*********************************************************************
-%%%
-%%% Description: This file contains io functions adapted to the
-%%% TV requirements.
-%%%
-%%%*********************************************************************
-
--module(tv_io_lib).
-
-
--export([format/2]).
-
--export([write/1,write/2]).
--export([write_atom/1,write_string/2]).
-
--export([char_list/1,deep_char_list/1,printable_list/1]).
-
-
-
-%% Interface calls to sub-modules.
-
-format(Format, Args) ->
- tv_io_lib_format:fwrite(Format, Args).
-
-
-%% write(Term)
-%% write(Term, Depth)
-%% write(Term, Depth, Pretty)
-%% Return a (non-flattened) list of characters giving a printed
-%% representation of the term.
-
-write(Term) -> write(Term, -1).
-
-write(_Term, 0) -> "...";
-write(Term, _D) when is_integer(Term) -> integer_to_list(Term);
-write(Term, _D) when is_float(Term) -> tv_io_lib_format:fwrite_g(Term);
-write(Atom, _D) when is_atom(Atom) -> write_atom(Atom);
-write(Term, _D) when is_port(Term) -> lists:flatten(io_lib:write(Term));
-write(Term, _D) when is_pid(Term) -> pid_to_list(Term);
-write(Term, _D) when is_reference(Term) -> io_lib:write(Term);
-write(Term, _D) when is_binary(Term), byte_size(Term) > 100 -> "#Bin";
-write(Term, _D) when is_binary(Term) -> "<<\"" ++ binary_to_list(Term) ++ "\">>";
-write(Term, _D) when is_bitstring(Term) -> "#Bitstr";
-write([], _D) -> "[]";
-write({}, _D) -> "{}";
-write([H|T], D) ->
- if
- D =:= 1 -> "[...]";
- true ->
- [$[,[write(H, D-1)|write_tail(T, D-1)],$]]
- end;
-write(F, _D) when is_function(F) ->
- {module,M} = erlang:fun_info(F, module),
- ["#Fun<",atom_to_list(M),">"];
-write(T, D) when is_tuple(T) ->
- if
- D =:= 1 -> "{...}";
- true ->
- [${,
- [write(element(1, T), D-1)|write_tail(tl(tuple_to_list(T)), D-1)],
- $}]
- end.
-
-%% write_tail(List, Depth)
-%% Test the terminating case first as this looks better with depth.
-
-write_tail([], _D) -> "";
-write_tail(_List, 1) -> "|...";
-write_tail([H|T], D) ->
- [$,,write(H, D-1)|write_tail(T, D-1)];
-write_tail(Other, D) ->
- [$|,write(Other, D-1)].
-
-%% write_atom(Atom) -> [Char]
-%% Generate the list of characters needed to print an atom.
-
-write_atom(Atom) ->
- Chars = atom_to_list(Atom),
- case quote_atom(Atom, Chars) of
- true ->
- write_string(Chars, $');
- false ->
- Chars
- end.
-
-
-write_string(S, Q) ->
- [Q|write_string1(S, Q)].
-
-write_string1([], Q) ->
- [Q];
-write_string1([C|Cs], Q) ->
- write_char(C, Q, write_string1(Cs, Q)).
-
-
-write_char(Q, Q, Tail) -> %Must check this first
- [$\\,Q|Tail];
-write_char($\\, _, Tail) -> %In printable character range
- [$\\,$\\|Tail];
-write_char(C, _, Tail) when C >= $ , C =< $~ ->
- [C|Tail];
-write_char(C, _, Tail) when C >= 128+$ , C =< 255 ->
- [C|Tail];
-write_char($\n, _Q, Tail) -> %\n = LF
- [$\\,$n|Tail];
-write_char($\r, _, Tail) -> %\r = CR
- [$\\,$r|Tail];
-write_char($\t, _, Tail) -> %\t = TAB
- [$\\,$t|Tail];
-write_char($\v, _, Tail) -> %\v = VT
- [$\\,$v|Tail];
-write_char($\b, _, Tail) -> %\b = BS
- [$\\,$b|Tail];
-write_char($\f, _, Tail) -> %\f = FF
- [$\\,$f|Tail];
-write_char($\e, _, Tail) -> %\e = ESC
- [$\\,$e|Tail];
-write_char($\d, _, Tail) -> %\d = DEL
- [$\\,$d|Tail];
-write_char(C, _, Tail) when C < $ ->
- C1 = (C bsr 3) + $0,
- C2 = (C band 7) + $0,
- [$\\,$0,C1,C2|Tail];
-write_char(C, _, Tail) when C > $~ ->
- C1 = (C bsr 6) + $0,
- C2 = ((C bsr 3) band 7) + $0,
- C3 = (C band 7) + $0,
- [$\\,C1,C2,C3|Tail].
-
-%% quote_atom(Atom, CharList)
-%% Return 'true' if atom with chars in CharList needs to be quoted, else
-%% return 'false'.
-
-quote_atom(Atom, Cs0) ->
- case erl_scan:reserved_word(Atom) of
- true -> true;
- false ->
- case Cs0 of
- [C|Cs] when C >= $a, C =< $z ->
- quote_atom(Cs);
- _ -> true
- end
- end.
-
-quote_atom([C|Cs]) when C >= $a, C =< $z ->
- quote_atom(Cs);
-quote_atom([C|Cs]) when C >= $A, C =< $Z ->
- quote_atom(Cs);
-quote_atom([C|Cs]) when C >= $0, C =< $9 ->
- quote_atom(Cs);
-quote_atom([$_|Cs]) ->
- quote_atom(Cs);
-quote_atom([$@|Cs]) ->
- quote_atom(Cs);
-quote_atom([_|_]) ->
- true;
-quote_atom([]) ->
- false.
-
-%% char_list(CharList)
-%% deep_char_list(CharList)
-%% Return true if CharList is a (possibly deep) list of characters, else
-%% false.
-
-char_list([C|Cs]) when is_integer(C), C >= 0, C =< 255 ->
- char_list(Cs);
-char_list([]) -> true;
-char_list(_Other) -> false. %Everything else is false
-
-deep_char_list(Cs) ->
- deep_char_list(Cs, []).
-
-deep_char_list([C|Cs], More) when is_list(C) ->
- deep_char_list(C, [Cs|More]);
-deep_char_list([C|Cs], More) when is_integer(C), C >= 0, C =< 255 ->
- deep_char_list(Cs, More);
-deep_char_list([], [Cs|More]) ->
- deep_char_list(Cs, More);
-deep_char_list([], []) -> true;
-deep_char_list(_Other, _More) -> %Everything else is false
- false.
-
-%% printable_list([Char]) -> bool()
-%% Return true if CharList is a list of printable characters, else
-%% false.
-
-printable_list([C|Cs]) when is_integer(C), C >= $ , C =< 255 ->
- printable_list(Cs);
-printable_list([$\n|Cs]) ->
- printable_list(Cs);
-printable_list([$\r|Cs]) ->
- printable_list(Cs);
-printable_list([$\t|Cs]) ->
- printable_list(Cs);
-printable_list([$\v|Cs]) ->
- printable_list(Cs);
-printable_list([$\b|Cs]) ->
- printable_list(Cs);
-printable_list([$\f|Cs]) ->
- printable_list(Cs);
-printable_list([$\e|Cs]) ->
- printable_list(Cs);
-printable_list([]) -> true;
-printable_list(_Other) -> false. %Everything else is false
-
-
diff --git a/lib/tv/src/tv_io_lib_format.erl b/lib/tv/src/tv_io_lib_format.erl
deleted file mode 100644
index e043d9296e..0000000000
--- a/lib/tv/src/tv_io_lib_format.erl
+++ /dev/null
@@ -1,386 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2010. 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(tv_io_lib_format).
-
-
--export([fwrite/2,fwrite_g/1,indentation/2]).
-
-
-%% fwrite(Format, ArgList) -> [Char].
-%% Format the arguments in ArgList after string Format. Just generate
-%% an error if there is an error in the arguments.
-%%
-%% To do the printing command correctly we need to calculate the
-%% current indentation for everything before it. This may be very
-%% expensive, especially when it is not needed, so we first determine
-%% if, and for how long, we need to calculate the indentations. We do
-%% this by first collecting all the control sequences and
-%% corresponding arguments, then counting the print sequences and
-%% then building the output. This method has some drawbacks, it does
-%% two passes over the format string and creates more temporary data,
-%% and it also splits the handling of the control characters into two
-%% parts.
-
-fwrite(Format, Args) when is_atom(Format) ->
- fwrite(atom_to_list(Format), Args);
-fwrite(Format, Args) ->
- Cs = collect(Format, Args),
- Pc = pcount(Cs),
- build(Cs, Pc, 0).
-
-collect([$~|Fmt0], Args0) ->
- {C,Fmt1,Args1} = collect_cseq(Fmt0, Args0),
- [C|collect(Fmt1, Args1)];
-collect([C|Fmt], Args) ->
- [C|collect(Fmt, Args)];
-collect([], []) -> [].
-
-collect_cseq(Fmt0, Args0) ->
- {F,Ad,Fmt1,Args1} = field_width(Fmt0, Args0),
- {P,Fmt2,Args2} = precision(Fmt1, Args1),
- {Pad,Fmt3,Args3} = pad_char(Fmt2, Args2),
- {C,As,Fmt4,Args4} = collect_cc(Fmt3, Args3),
- {{C,As,F,Ad,P,Pad},Fmt4,Args4}.
-
-field_width([$-|Fmt0], Args0) ->
- {F,Fmt,Args} = field_value(Fmt0, Args0),
- field_width(-F, Fmt, Args);
-field_width(Fmt0, Args0) ->
- {F,Fmt,Args} = field_value(Fmt0, Args0),
- field_width(F, Fmt, Args).
-
-field_width(F, Fmt, Args) when F < 0 ->
- {-F,left,Fmt,Args};
-field_width(F, Fmt, Args) when F >= 0 ->
- {F,right,Fmt,Args}.
-
-precision([$.|Fmt], Args) ->
- field_value(Fmt, Args);
-precision(Fmt, Args) ->
- {none,Fmt,Args}.
-
-field_value([$*|Fmt], [A|Args]) when is_integer(A) ->
- {A,Fmt,Args};
-field_value([C|Fmt], Args) when C >= $0, C =< $9 ->
- field_value([C|Fmt], Args, 0);
-field_value(Fmt, Args) ->
- {none,Fmt,Args}.
-
-field_value([C|Fmt], Args, F) when C >= $0, C =< $9 ->
- field_value(Fmt, Args, 10*F + (C - $0));
-field_value(Fmt, Args, F) -> %Default case
- {F,Fmt,Args}.
-
-pad_char([$.,$*|Fmt], [Pad|Args]) -> {Pad,Fmt,Args};
-pad_char([$.,Pad|Fmt], Args) -> {Pad,Fmt,Args};
-pad_char(Fmt, Args) -> {$ ,Fmt,Args}.
-
-%% collect_cc([FormatChar], [Argument]) ->
-%% {Control,[ControlArg],[FormatChar],[Arg]}.
-%% Here we collect the argments for each control character.
-%% Be explicit to cause failure early.
-
-collect_cc([$w|Fmt], [A|Args]) -> {$w,[A],Fmt,Args};
-collect_cc([$p|Fmt], [A|Args]) -> {$p,[A],Fmt,Args};
-collect_cc([$W|Fmt], [A,Depth|Args]) -> {$W,[A,Depth],Fmt,Args};
-collect_cc([$P|Fmt], [A,Depth|Args]) -> {$P,[A,Depth],Fmt,Args};
-collect_cc([$s|Fmt], [A|Args]) -> {$s,[A],Fmt,Args};
-collect_cc([$e|Fmt], [A|Args]) -> {$e,[A],Fmt,Args};
-collect_cc([$f|Fmt], [A|Args]) -> {$f,[A],Fmt,Args};
-collect_cc([$g|Fmt], [A|Args]) -> {$g,[A],Fmt,Args};
-collect_cc([$c|Fmt], [A|Args]) -> {$c,[A],Fmt,Args};
-collect_cc([$~|Fmt], Args) -> {$~,[],Fmt,Args};
-collect_cc([$n|Fmt], Args) -> {$n,[],Fmt,Args};
-collect_cc([$i|Fmt], [A|Args]) -> {$i,[A],Fmt,Args}.
-
-%% pcount([ControlC]) -> Count.
-%% Count the number of print requests.
-
-pcount(Cs) -> pcount(Cs, 0).
-
-pcount([{$p,_As,_F,_Ad,_P,_Pad}|Cs], Acc) -> pcount(Cs, Acc+1);
-pcount([{$P,_As,_F,_Ad,_P,_Pad}|Cs], Acc) -> pcount(Cs, Acc+1);
-pcount([_|Cs], Acc) -> pcount(Cs, Acc);
-pcount([], Acc) -> Acc.
-
-%% build([Control], Pc, Indentation) -> [Char].
-%% Interpret the control structures. Count the number of print
-%% remaining and only calculate indentation when necessary. Must also
-%% be smart when calculating indentation for characters in format.
-
-build([{C,As,F,Ad,P,Pad}|Cs], Pc0, I) ->
- S = control(C, As, F, Ad, P, Pad, I),
- Pc1 = decr_pc(C, Pc0),
- if
- Pc1 > 0 -> [S|build(Cs, Pc1, indentation(S, I))];
- true -> [S|build(Cs, Pc1, I)]
- end;
-build([$\n|Cs], Pc, _I) -> [$\n|build(Cs, Pc, 0)];
-build([$\t|Cs], Pc, I) -> [$\t|build(Cs, Pc, ((I + 8) div 8) * 8)];
-build([C|Cs], Pc, I) -> [C|build(Cs, Pc, I+1)];
-build([], _, _) -> [].
-
-decr_pc($p, Pc) -> Pc - 1;
-decr_pc($P, Pc) -> Pc - 1;
-decr_pc(_C, Pc) -> Pc.
-
-%% control(FormatChar, [Argument], FieldWidth, Adjust, Precision, PadChar,
-
-%% Indentation) ->
-%% [Char]
-%% This is the main dispatch function for the various formatting commands.
-%% Field widths and precisions have already been calculated.
-
-control($w, [A], F, Adj, P, Pad, _I) ->
- term(tv_io_lib:write(A, -1), F, Adj, P, Pad);
-control($p, [A], F, Adj, P, Pad, I) ->
- print(A, -1, F, Adj, P, Pad, I);
-control($W, [A,Depth], F, Adj, P, Pad, _I) when is_integer(Depth) ->
- term(tv_io_lib:write(A, Depth), F, Adj, P, Pad);
-control($P, [A,Depth], F, Adj, P, Pad, I) when is_integer(Depth) ->
- print(A, Depth, F, Adj, P, Pad, I);
-control($s, [A], F, Adj, P, Pad, _I) when is_atom(A) ->
- string(atom_to_list(A), F, Adj, P, Pad);
-control($s, [L], F, Adj, P, Pad, _I) ->
- true = tv_io_lib:deep_char_list(L), %Check if L a character list
- string(L, F, Adj, P, Pad);
-control($e, [A], F, Adj, P, Pad, _I) when is_float(A) ->
- fwrite_e(A, F, Adj, P, Pad);
-control($f, [A], F, Adj, P, Pad, _I) when is_float(A) ->
- fwrite_f(A, F, Adj, P, Pad);
-control($g, [A], F, Adj, P, Pad, _I) when is_float(A) ->
- fwrite_g(A, F, Adj, P, Pad);
-control($c, [A], F, Adj, P, Pad, _I) when is_integer(A) ->
- char(A band 255, F, Adj, P, Pad);
-control($~, [], F, Adj, P, Pad, _I) -> char($~, F, Adj, P, Pad);
-control($n, [], F, Adj, P, Pad, _I) -> newline(F, Adj, P, Pad);
-control($i, [_A], _F, _Adj, _P, _Pad, _I) -> [].
-
-%% indentation([Char], Indentation) -> Indentation.
-%% Calculate the indentation of the end of a string given its start
-%% indentation. We assume tabs at 8 cols.
-
-indentation([$\n|Cs], _I) -> indentation(Cs, 0);
-indentation([$\t|Cs], I) -> indentation(Cs, ((I + 8) div 8) * 8);
-indentation([C|Cs], I) when is_integer(C) ->
- indentation(Cs, I+1);
-indentation([C|Cs], I) ->
- indentation(Cs, indentation(C, I));
-indentation([], I) -> I.
-
-%% term(TermList, Field, Adjust, Precision, PadChar)
-%% Output the characters in a term.
-
-term(T, none, _Adj, none, _Pad) -> T;
-term(T, none, Adj, P, Pad) -> term(T, P, Adj, P, Pad);
-term(T, F, Adj, none, Pad) -> term(T, F, Adj, erlang:min(flat_length(T), F), Pad);
-term(T, F, Adj, P, Pad) when F >= P ->
- adjust_error(T, F, Adj, P, Pad).
-
-%% print(Term, Depth, Field, Adjust, Precision, PadChar, Indentation)
-%% Print a term.
-
-print(T, D, none, Adj, P, Pad, I) -> print(T, D, 80, Adj, P, Pad, I);
-print(T, D, F, Adj, none, Pad, I) -> print(T, D, F, Adj, I+1, Pad, I);
-print(T, D, F, right, P, _Pad, _I) ->
- tv_io_lib_pretty:pretty_print(T, P, F, D).
-
-%% fwrite_e(Float, Field, Adjust, Precision, PadChar)
-
-fwrite_e(Fl, none, Adj, none, Pad) -> %Default values
- fwrite_e(Fl, none, Adj, 6, Pad);
-fwrite_e(Fl, none, _Adj, P, _Pad) when P >= 2 ->
- float_e(Fl, float_data(Fl), P);
-fwrite_e(Fl, F, Adj, none, Pad) ->
- fwrite_e(Fl, F, Adj, 6, Pad);
-fwrite_e(Fl, F, Adj, P, Pad) when P >= 2 ->
- adjust_error(float_e(Fl, float_data(Fl), P), F, Adj, F, Pad).
-
-float_e(Fl, Fd, P) when Fl < 0.0 -> %Negative numbers
- [$-|float_e(-Fl, Fd, P)];
-float_e(_Fl, {Ds,E}, P) ->
- case float_man(Ds, 1, P-1) of
- {[$0|Fs],true} -> [[$1|Fs]|float_exp(E)];
- {Fs,false} -> [Fs|float_exp(E-1)]
- end.
-
-%% float_man([Digit], Icount, Dcount) -> {[Chars],CarryFlag}.
-%% Generate the characters in the mantissa from the digits with Icount
-%% characters before the '.' and Dcount decimals. Handle carry and let
-%% caller decide what to do at top.
-
-float_man(Ds, 0, Dc) ->
- {Cs,C} = float_man(Ds, Dc),
- {[$.|Cs],C};
-float_man([D|Ds], I, Dc) ->
- case float_man(Ds, I-1, Dc) of
- {Cs,true} when D =:= $9 -> {[$0|Cs],true};
- {Cs,true} -> {[D+1|Cs],false};
- {Cs,false} -> {[D|Cs],false}
- end;
-float_man([], I, Dc) -> %Pad with 0's
- {string:chars($0, I, [$.|string:chars($0, Dc)]),false}.
-
-float_man([D|_Ds], 0) when D >= $5 -> {[],true};
-float_man([_|_], 0) -> {[],false};
-float_man([D|Ds], Dc) ->
- case float_man(Ds, Dc-1) of
- {Cs,true} when D =:= $9 -> {[$0|Cs],true};
- {Cs,true} -> {[D+1|Cs],false};
- {Cs,false} -> {[D|Cs],false}
- end;
-float_man([], Dc) -> {string:chars($0, Dc),false}. %Pad with 0's
-
-%% float_exp(Exponent) -> [Char].
-%% Generate the exponent of a floating point number. Alwayd include sign.
-
-float_exp(E) when E >= 0 ->
- [$e,$+|integer_to_list(E)];
-float_exp(E) ->
- [$e|integer_to_list(E)].
-
-%% fwrite_f(FloatData, Field, Adjust, Precision, PadChar)
-
-fwrite_f(Fl, none, Adj, none, Pad) -> %Default values
- fwrite_f(Fl, none, Adj, 6, Pad);
-fwrite_f(Fl, none, _Adj, P, _Pad) when P >= 1 ->
- float_f(Fl, float_data(Fl), P);
-fwrite_f(Fl, F, Adj, none, Pad) ->
- fwrite_f(Fl, F, Adj, 6, Pad);
-fwrite_f(Fl, F, Adj, P, Pad) when P >= 1 ->
- adjust_error(float_f(Fl, float_data(Fl), P), F, Adj, F, Pad).
-
-float_f(Fl, Fd, P) when Fl < 0.0 ->
- [$-|float_f(-Fl, Fd, P)];
-float_f(Fl, {Ds,E}, P) when E =< 0 ->
- float_f(Fl, {string:chars($0, -E+1, Ds),1}, P); %Prepend enough 0's
-float_f(_Fl, {Ds,E}, P) ->
- case float_man(Ds, E, P) of
- {Fs,true} -> "1" ++ Fs; %Handle carry
- {Fs,false} -> Fs
- end.
-
-%% float_data([FloatChar]) -> {[Digit],Exponent}
-
-float_data(Fl) ->
- float_data(float_to_list(Fl), []).
-
-float_data([$e|E], Ds) ->
- {reverse(Ds),list_to_integer(E)+1};
-float_data([D|Cs], Ds) when D >= $0, D =< $9 ->
- float_data(Cs, [D|Ds]);
-float_data([_D|Cs], Ds) ->
- float_data(Cs, Ds).
-
-
-%% fwrite_g(Float, Field, Adjust, Precision, PadChar)
-%% Use the f form if Float is > 0.1 and < 10^4, else the e form.
-%% Precision always means the # of significant digits.
-
-fwrite_g(Fl) ->
- fwrite_g(Fl, none, right, none, $\s).
-
-fwrite_g(Fl, F, Adj, none, Pad) ->
- fwrite_g(Fl, F, Adj, 6, Pad);
-fwrite_g(Fl, F, Adj, P, Pad) when abs(Fl) < 0.1 ->
- fwrite_e(Fl, F, Adj, P, Pad);
-fwrite_g(Fl, F, Adj, P, Pad) when abs(Fl) < 1.0 ->
- fwrite_f(Fl, F, Adj, P, Pad);
-fwrite_g(Fl, F, Adj, P, Pad) when abs(Fl) < 10.0 ->
- fwrite_f(Fl, F, Adj, P-1, Pad);
-fwrite_g(Fl, F, Adj, P, Pad) when abs(Fl) < 100.0 ->
- fwrite_f(Fl, F, Adj, P-2, Pad);
-fwrite_g(Fl, F, Adj, P, Pad) when abs(Fl) < 1000.0 ->
- fwrite_f(Fl, F, Adj, P-3, Pad);
-fwrite_g(Fl, F, Adj, P, Pad) when abs(Fl) < 10000.0 ->
- fwrite_f(Fl, F, Adj, P-4, Pad);
-fwrite_g(Fl, F, Adj, P, Pad) ->
- fwrite_e(Fl, F, Adj, P, Pad).
-
-%% string(String, Field, Adjust, Precision, PadChar)
-
-string(S, none, _Adj, none, _Pad) -> S;
-string(S, F, Adj, none, Pad) ->
- string(S, F, Adj, erlang:min(flat_length(S), F), Pad);
-string(S, none, _Adj, P, Pad) ->
- string:left(flatten(S), P, Pad);
-string(S, F, Adj, P, Pad) when F >= P ->
- adjust(string:left(flatten(S), P, Pad), string:chars(Pad, F - P), Adj).
-
-%% char(Char, Field, Adjust, Precision, PadChar) -> [Char].
-
-char(C, none, _Adj, none, _Pad) -> [C];
-char(C, F, _Adj, none, _Pad) -> string:chars(C, F);
-char(C, none, _Adj, P, _Pad) -> string:chars(C, P);
-char(C, F, Adj, P, Pad) when F >= P ->
- adjust(string:chars(C, P), string:chars(Pad, F - P), Adj).
-
-%% newline(Field, Adjust, Precision, PadChar) -> [Char].
-
-newline(none, _Adj, _P, _Pad) -> "\n";
-newline(F, right, _P, _Pad) -> string:chars($\n, F).
-
-%% adjust_error([Char], Field, Adjust, Max, PadChar) -> [Char].
-%% Adjust the characters within the field if length less than Max padding
-%% with PadChar.
-
-adjust_error(Cs, F, Adj, M, Pad) ->
- L = flat_length(Cs),
- if
- L > M ->
- adjust(string:chars($*, M), string:chars(Pad, F - M), Adj);
- true ->
- adjust(Cs, string:chars(Pad, F - L), Adj)
- end.
-
-adjust(Data, Pad, left) -> [Data,Pad];
-adjust(Data, Pad, right) -> [Pad,Data].
-
-%%
-%% Utilities
-%%
-
-reverse(List) ->
- reverse(List, []).
-
-reverse([H|T], Stack) ->
- reverse(T, [H|Stack]);
-reverse([], Stack) -> Stack.
-
-%% flatten(List)
-%% Flatten a list.
-
-flatten(List) -> flatten(List, []).
-
-flatten([H|T], Cont) when is_list(H) ->
- flatten(H, [T|Cont]);
-flatten([H|T], Cont) ->
- [H|flatten(T, Cont)];
-flatten([], [H|Cont]) -> flatten(H, Cont);
-flatten([], []) -> [].
-
-%% flat_length(List)
-%% Calculate the length of a list of lists.
-
-flat_length(List) -> flat_length(List, 0).
-
-flat_length([H|T], L) when is_list(H) ->
- flat_length(H, flat_length(T, L));
-flat_length([_|T], L) ->
- flat_length(T, L + 1);
-flat_length([], L) -> L.
diff --git a/lib/tv/src/tv_io_lib_pretty.erl b/lib/tv/src/tv_io_lib_pretty.erl
deleted file mode 100644
index c19277d006..0000000000
--- a/lib/tv/src/tv_io_lib_pretty.erl
+++ /dev/null
@@ -1,171 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-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(tv_io_lib_pretty).
-
-
-
--export([pretty_print/4]).
-
-%% pretty_print(Term, Column, LineLength, Depth) -> [Chars]
-%% Depth = -1 gives unlimited print depth. Use tv_io_lib:write for atomic terms.
-
-pretty_print(_, _, _, 0) -> "...";
-pretty_print([], _, _, _) -> "[]";
-pretty_print({}, _, _, _) -> "{}";
-pretty_print(List, Col, Ll, D) when is_list(List) ->
- case tv_io_lib:printable_list(List) of
- true ->
- tv_io_lib:write_string(List, $");
- false ->
- Len = write_length(List, D, 0, Ll - Col),
- if
- D =:= 1 -> "[...]";
- Len + Col < Ll ->
- write(List, D);
- true ->
- [$[,
- [pretty_print(hd(List), Col + 1, Ll, D - 1)|
- pretty_print_tail(tl(List), Col + 1, Ll, D - 1)],
- $]]
- end
- end;
-pretty_print(Fun, _Col, _Ll, _D) when is_function(Fun) ->
- tv_io_lib:write(Fun);
-pretty_print(Tuple, Col, Ll, D) when is_tuple(Tuple) ->
- Len = write_length(Tuple, D, 0, Ll - Col),
- if
- D =:= 1 -> "{...}";
- Len + Col < Ll ->
- write(Tuple, D);
- is_atom(element(1, Tuple)), size(Tuple) > 1 ->
- print_tag_tuple(Tuple, Col, Ll, D);
- true ->
- [${,
- [pretty_print(element(1, Tuple), Col + 1, Ll, D - 1)|
- pretty_print_tail(tl(tuple_to_list(Tuple)), Col + 1, Ll, D - 1)],
- $}]
- end;
-pretty_print(Term, _Col, _Ll, D) -> tv_io_lib:write(Term, D).
-
-%% print_tag_tuple(Tuple, Column, LineLength, Depth) -> [Char]
-%% Print a tagged tuple by indenting the rest of the elements differently
-%% to the tag. Start beside the tag if start column not too far to
-%% the right. Tuple has size >= 2.
-
-print_tag_tuple(Tuple, Col, Ll, D) ->
- Tag = tv_io_lib:write_atom(element(1, Tuple)),
- Tlen = length(Tag),
- Tcol = Col + Tlen + 2,
- if
- Tcol >= Ll div 2, Tlen > 2 ->
- [${,Tag,
- pretty_print_tail(tl(tuple_to_list(Tuple)), Col + 4, Ll, D - 2),
- $}];
- true ->
- [${,Tag,$,,
- [pretty_print(element(2, Tuple), Col + Tlen + 2, Ll, D - 2)|
- pretty_print_tail(tl(tl(tuple_to_list(Tuple))), Tcol, Ll, D - 3)],
- $}]
- end.
-
-%% pretty_print_tail([Element], Column, LineLength, D) -> [Char]
-%% Pretty print the elements of a list or tuple.
-
-pretty_print_tail([], _Col, _Ll, _D) -> "";
-pretty_print_tail(_Es, _Col, _Ll, 1) -> "|...";
-pretty_print_tail([E|Es], Col, Ll, D) ->
- [$,,nl_indent(Col-1),
- pretty_print(E, Col, Ll, D-1)|
- pretty_print_tail(Es, Col, Ll, D-1)];
-pretty_print_tail(E, Col, Ll, D) ->
- [$|,nl_indent(Col-1),pretty_print(E, Col, Ll, D-1)].
-
-%% write(Term, Depth) -> [Char]
-%% Write a term down to Depth on one line. Use tv_io_lib:write/2 for
-%% atomic terms.
-
-write(_, 0) -> "...";
-write([], _) -> "[]";
-write({}, _) -> "{}";
-write(List, D) when is_list(List) ->
- case tv_io_lib:printable_list(List) of
- true ->
- tv_io_lib:write_string(List, $");
- false ->
- if
- D =:= 1 -> "[...]";
- true ->
- [$[,
- [write(hd(List), D-1)|write_tail(tl(List), D-1)],
- $]]
- end
- end;
-write(Fun, _D) when is_function(Fun) -> tv_io_lib:write(Fun); %Must catch this first
-write(T, D) when is_tuple(T) ->
- if
- D =:= 1 -> "{...}";
- true ->
- [${,
- [write(element(1, T), D-1)|write_tail(tl(tuple_to_list(T)), D-1)],
- $}]
- end;
-write(Term, D) -> tv_io_lib:write(Term, D).
-
-write_tail([], _D) -> "";
-write_tail(_Es, 1) -> "|...";
-write_tail([E|Es], D) ->
- [$,,write(E, D - 1)|write_tail(Es, D - 1)];
-write_tail(E, D) ->
- [$|,write(E, D - 1)].
-
-%% write_length(Term, Depth, Accumulator, MaxLength) -> integer()
-%% Calculate the print length of a term, but exit when length becomes
-%% greater than MaxLength.
-
-write_length(_T, _D, Acc, Max) when Acc > Max -> Acc;
-write_length(_T, 0, Acc, _Max) -> Acc + 3;
-write_length([], _, Acc, _) -> Acc + 2;
-write_length({}, _, Acc, _) -> Acc + 2;
-write_length(List, D, Acc, Max) when is_list(List) ->
- case tv_io_lib:printable_list(List) of
- true ->
- Acc + length(tv_io_lib:write_string(List, $"));
- false ->
- write_length_list(List, D, Acc, Max)
- end;
-write_length(Fun, _D, Acc, _Max) when is_function(Fun) ->
- Acc + length(tv_io_lib:write(Fun));
-write_length(Tuple, D, Acc, Max) when is_tuple(Tuple) ->
- write_length_list(tuple_to_list(Tuple), D, Acc, Max);
-write_length(Term, _D, Acc, _Max) ->
- Acc + length(tv_io_lib:write(Term)).
-
-write_length_list(_, _, Acc, Max) when Acc > Max -> Acc;
-write_length_list([], _, Acc, _) -> Acc + 1; %]
-write_length_list(_Es, 1, Acc, _) -> Acc + 5; %|...]
-write_length_list([E|Es], D, Acc, Max) ->
- write_length_list(Es,
- D - 1,
- write_length(E, D - 1, Acc + 1, Max),
- Max);
-write_length_list(E, D, Acc, Max) ->
- write_length(E, D - 1, Acc + 2, Max). %| ]
-
-
-
-nl_indent(_) -> "".
diff --git a/lib/tv/src/tv_ip.erl b/lib/tv/src/tv_ip.erl
deleted file mode 100644
index 9f66917362..0000000000
--- a/lib/tv/src/tv_ip.erl
+++ /dev/null
@@ -1,242 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. 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(tv_ip).
--compile([{nowarn_deprecated_function,{gs,canvas,2}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([ip/1]).
-
-
-
--include("tv_int_msg.hrl").
-
-
--define(NOF_LABELS, 25).
-
--define(DEFAULT_BG_COLOR, {217, 217, 217}).
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-ip(_Master) ->
- W = gs:window(win, gs:start(), [{width, 302},
- {height, 38},
- {bg, ?DEFAULT_BG_COLOR},
- {title, "Launching..."}
- ]),
- C = gs:canvas(W, [{width, 40},
- {height, 35},
- {x, 0},
- {bg, {255, 255, 255}}
- ]),
- gs:create(image, C, [{load_gif, code:priv_dir(tv) ++ "/erlang.gif"}]),
- gs:label(W, [{width, 252},
- {height, 12},
- {x, 47},
- {y, 23},
- {bg, {0, 0, 0}},
- {cursor, arrow}
- ]),
-
- LabelList = create_labels(?NOF_LABELS, W, 48),
-
- L = gs:label(W, [{width, 250},
- {height, 18},
- {x, 47},
- {y, 0},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, w}
- ]),
- gs:config(win, [{map, true}]),
- loop(1, LabelList, L).
-
-
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_labels(0, _WinId, _Xpos) ->
- [];
-create_labels(N, WinId, Xpos) ->
- Width = 10,
- Xdiff = Width,
- LabelId = gs:label(WinId, [{width, Width},
- {height, 10},
- {x, Xpos},
- {y, 24},
- {bg, {235, 235, 235}},
- {cursor, arrow}
- ]),
-
- [LabelId | create_labels(N - 1, WinId, Xpos + Xdiff)].
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-loop(N, LabelList, L) ->
- receive
- Msg ->
- case Msg of
-
- #ip_update{nof_elements_to_mark = X, text = Text} ->
- update_window(LabelList, N, N + X, L, Text),
- loop(N + X, LabelList, L);
-
- #ip_quit{} ->
- update_labels(LabelList, N, ?NOF_LABELS),
- receive
- after 1000 ->
- done
- end,
- done;
-
- _Other ->
- loop(N, LabelList, L)
- end
- end.
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_window(LabelList, N, Hi, LblId, Text) ->
- gs:config(win, [raise]),
- gs:config(LblId, [{label, {text, Text}}]),
- update_labels(LabelList, N, Hi).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_labels(_LabelList, N, _Hi) when N > ?NOF_LABELS ->
- done;
-update_labels(_LabelList, N, Hi) when N >= Hi ->
- done;
-update_labels(LabelList, N, Hi) ->
- LabelId = lists:nth(N, LabelList),
- gs:config(LabelId, [{bg, {0, 0, 255}}]),
- update_labels(LabelList, N + 1, Hi).
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_main.erl b/lib/tv/src/tv_main.erl
deleted file mode 100644
index b6ffbd7c49..0000000000
--- a/lib/tv/src/tv_main.erl
+++ /dev/null
@@ -1,1821 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2012. 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(tv_main).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,frame,3}},
- {nowarn_deprecated_function,{gs,grid,3}},
- {nowarn_deprecated_function,{gs,gridline,2}},
- {nowarn_deprecated_function,{gs,label,3}},
- {nowarn_deprecated_function,{gs,menu,2}},
- {nowarn_deprecated_function,{gs,menubar,3}},
- {nowarn_deprecated_function,{gs,menubutton,2}},
- {nowarn_deprecated_function,{gs,menuitem,2}},
- {nowarn_deprecated_function,{gs,menuitem,3}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([start/0,
- init/0
- ]).
-
-
--export([get_ets_tables/1,
- get_mnesia_tables/1
- ]).
-
-
-
--include("tv_main.hrl").
--include("tv_int_msg.hrl").
--include("tv_pd_int_msg.hrl").
--include("tv_pd_int_def.hrl").
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-start() ->
- spawn(?MODULE, init, []).
-
-
-
-init() ->
- process_flag(trap_exit,true),
- %% OK, so it's *BAD* to use the process dictionary...
- %% So why have I used it? Because it is simple to remove the haiku-functionality,
- %% if that is desired. Otherwise a lot of functions (the parameters) would have
- %% to be changed.
- put(error_msg_mode, ?ERROR_MSG_MODE),
- KindOfTable = ets,
- SysTabHidden = true,
- UnreadHidden = true,
- SortKey = ?NAME_COL,
- CurrNode = node(),
- Children = start_tv_nodewin(CurrNode),
- {MarkedCell, TempGridLines, WinSize, ShortcutList} = create_window([]),
- Tables = get_tables(CurrNode, KindOfTable, UnreadHidden, SysTabHidden,SortKey),
- gs:config(grid, [{rows, {1, get_nof_rows(length(Tables),
- gs:read(grid, height))}}]),
- GridLines = update_gridlines(Tables, TempGridLines, 1),
- gs:config(win, [{map, true}, {cursor,arrow}]),
- %% To avoid unpleasant error/exit messages, we surround the loop with a catch.
- catch loop(KindOfTable, CurrNode, MarkedCell, GridLines, WinSize, Tables, ShortcutList,
- UnreadHidden, SysTabHidden, SortKey, Children).
-
-
-
-start_tv_nodewin(CurrNode) ->
- NodewinPid = tv_nodewin:start(CurrNode, get(error_msg_mode)),
- [{NodewinPid, tv_nodewin, CurrNode}].
-
-
-
-
-
-get_ets_tables(SysTabHidden) ->
- Tables = ets:all(),
- get_ets_table_info(Tables,
- hidden_tables(ets, SysTabHidden) ++
- current_mnesia_tables(SysTabHidden),
- owners_to_hide(ets, SysTabHidden),
- []).
-
-
-
-get_mnesia_tables(SysTabHidden) ->
- Tables = mnesia:system_info(tables),
- get_mnesia_table_info(Tables -- hidden_tables(mnesia, SysTabHidden),
- owners_to_hide(mnesia, SysTabHidden),
- []).
-
-
-
-
-
-owners_to_hide(ets, true) ->
- ?SYSTEM_OWNERS;
-owners_to_hide(ets, false) ->
- [];
-owners_to_hide(mnesia, true) ->
- [];
-owners_to_hide(mnesia, false) ->
- [].
-
-
-
-
-get_mnesia_table_info([], _OwnersToHide, Acc) ->
- lists:keysort(?NAME_ELEM, Acc);
-get_mnesia_table_info([TabId | Tail], OwnersToHide, Acc) ->
- case catch get_mnesia_owner_size(TabId) of
- {'EXIT', _Reason} ->
- %% Ignore tables ceasing to exist.
- %% Nodedown errors caught above!
- get_mnesia_table_info(Tail, OwnersToHide, Acc);
- {OwnerPid, OwnerName, Size} ->
- case lists:member(OwnerName, OwnersToHide) of
- true ->
- get_mnesia_table_info(Tail, OwnersToHide, Acc);
- false ->
- Readable = not(lists:member(TabId, ?UNREADABLE_MNESIA_TABLES)),
- get_mnesia_table_info(Tail,
- OwnersToHide,
- [{TabId, {notext}, {notext}, Readable,
- OwnerPid, OwnerName, Size} | Acc])
- end
- end.
-
-
-
-
-get_mnesia_owner_size(TabId) ->
- {OwnerPid, OwnerName} =
- case catch mnesia:table_info(TabId, owner) of
- Pid when is_pid(Pid) ->
- case lists:keysearch(registered_name, 1, process_info(Pid)) of
- false ->
- {Pid, {notext}};
- {value, {registered_name, ProcName}} ->
- {Pid, ProcName}
- end;
- _Other ->
- {{notext}, {notext}}
- end,
- Size = mnesia:table_info(TabId, size),
- {OwnerPid, OwnerName, Size}.
-
-
-
-
-
-
-
-hidden_tables(_Any, true) ->
- ?SYSTEM_TABLES ++ ?MNESIA_TABLES;
-hidden_tables(ets, _SysTabHidden) ->
- ?MNESIA_TABLES;
-hidden_tables(mnesia, _SysTabHidden) ->
- [].
-
-
-
-
-get_tables(Node, KindOfTable, UnreadHidden, SysTabHidden,SortKey) ->
- LocalNode = (Node =:= node()),
- Tables =
- case catch get_table_list(Node,LocalNode,KindOfTable,SysTabHidden) of
- Result when is_list(Result) ->
- case UnreadHidden of
- true ->
- lists:filter(fun(H) ->
- element(?READABLE_ELEM, H)
- end,
- Result);
- _Other ->
- Result
- end;
- Error ->
- analyze_error(Error, Node, undefined),
- []
- end,
- case SortKey of
- ?PROCNAME_ELEM ->
- lists:keysort(SortKey,
- lists:keysort(?PID_ELEM, Tables));
- _OtherCol ->
- lists:keysort(SortKey,
- lists:keysort(?NAME_ELEM, Tables))
- end.
-
-
-
-
-
-get_ets_table_info([], _TablesToHide, _OwnersToHide, Acc) ->
- lists:keysort(?ID_ELEM, Acc);
-get_ets_table_info([TabId | Tail], TablesToHide, OwnersToHide, Acc) ->
- case catch get_ets_name_owner_protection(TabId) of
- {'EXIT', _Reason} ->
- %% Ignore tables ceasing to exist.
- %% Nodedown errors caught above!
- get_ets_table_info(Tail, TablesToHide, OwnersToHide, Acc);
- {Name, NamedTable, Id, Readable, OwnerPid, OwnerName, Size} ->
- case lists:member(Name, TablesToHide) of
- true ->
- get_ets_table_info(Tail, TablesToHide, OwnersToHide, Acc);
- false ->
- case lists:member(OwnerName, OwnersToHide) of
- true ->
- get_ets_table_info(Tail, TablesToHide, OwnersToHide, Acc);
- false ->
- get_ets_table_info(Tail, TablesToHide, OwnersToHide,
- [{Name,NamedTable,Id,Readable,
- OwnerPid,OwnerName,Size} | Acc])
- end
- end
- end.
-
-
-
-get_ets_name_owner_protection(TabId) ->
- Name = ets:info(TabId, name),
- OwnerPid = ets:info(TabId, owner),
- Readable = case ets:info(TabId, protection) of
- private ->
- false;
- _Other ->
- true
- end,
- Size = ets:info(TabId, size),
- {NamedTable,Id} = case ets:info(TabId, named_table) of
- true ->
- {true,{notext}};
- false ->
- {false, TabId}
- end,
- PName = case lists:keysearch(registered_name, 1, process_info(OwnerPid)) of
- false ->
- {notext};
- {value, {registered_name, ProcName}} ->
- ProcName
- end,
- {Name, NamedTable, Id, Readable, OwnerPid, PName, Size}.
-
-
-
-
-
-
-current_mnesia_tables(SysTabHidden) ->
- case catch get_table_list(node(), true, mnesia, SysTabHidden) of
- Result when is_list(Result) ->
- lists:map(fun(H) ->
- element(?NAME_ELEM, H)
- end,
- Result);
- nodedown ->
- handle_error(nodedown, node(), undefined),
- [];
- _Other ->
- []
- end.
-
-
-
-
-get_table_list(_Node, true, ets, SysTabHidden) ->
- get_ets_tables(SysTabHidden);
-get_table_list(Node, false, ets, SysTabHidden) ->
- case rpc:block_call(Node, ?MODULE, get_ets_tables, [SysTabHidden]) of
- {badrpc, Reason} ->
- throw({badrpc,Reason});
- Result ->
- Result
- end;
-get_table_list(_Node, true, mnesia, SysTabHidden) ->
- get_mnesia_tables(SysTabHidden);
-get_table_list(Node, false, mnesia, SysTabHidden) ->
- case rpc:block_call(Node, ?MODULE, get_mnesia_tables, [SysTabHidden]) of
- {badrpc,Reason} ->
- throw({badrpc,Reason});
- Result ->
- Result
- end.
-
-
-
-
-analyze_error(Cause, Node, Table) ->
- case Cause of
- {badrpc, {'EXIT', {badarg,_Reason}}} ->
- done; %% Table has ceased to exist.
- {'EXIT', {badarg, {ets,local_info,_Args}}} ->
- done;
-
- {badrpc, nodedown} ->
- handle_error(nodedown, Node, Table);
- {'EXIT', nodedown} ->
- handle_error(nodedown, Node, Table);
-
- {'EXIT', {aborted, {node_not_running,_ErrNode}}} ->
- handle_error(mnesia_not_started, Node, Table);
- {'EXIT', {'EXIT', {aborted, {node_not_running,_ErrNode}}}} ->
- handle_error(mnesia_not_started, Node, Table);
- {badrpc, {'EXIT', {aborted, {node_not_running,_ErrNode}}}} ->
- handle_error(mnesia_not_started, Node, Table);
- {'EXIT', {undef, {mnesia,_Fcn,_Args,_}}} ->
- handle_error(mnesia_not_started, Node, Table);
-
- {'EXIT', Reason} ->
- handle_error({unexpected_error,Reason}, Node, Table);
- Error when is_tuple(Error) ->
- handle_error({unexpected_error,Error}, Node, Table)
- end.
-
-
-
-handle_error(mnesia_not_started, _Node, _Table) ->
- gs:config(win, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(win, "TV Notification", ["Mnesia not started!"]);
- haiku ->
- tv_utils:notify(win, "TV Notification", ["Mnesia is stopped.",
- "We wish to reach all data",
- "But we never will."])
- end;
-handle_error(nodedown, _Node, _Table) ->
- gs:config(win, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(win, "TV Notification", ["The selected node is down!"]);
- haiku ->
- Msg = ["With searching comes loss",
- "And the presence of absence:",
- "Node is down."],
- tv_utils:notify(win, "TV Notification", Msg)
- end,
- self() ! nodedown;
-handle_error({unexpected_error,Cause}, _Node, _Table) ->
- io:format("Unexpected error: ~p~n", [Cause]),
- gs:config(win, [beep]).
-
-
-
-
-loop(KindOfTable,CurrNode,MarkedCell,GridLines,
- WinSize,Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children) ->
- receive
-
- {gs, Gridline, click, {grid,Readable}, [Col,Row,Text | _]} when Text =/= "" ->
- unmark_cell(MarkedCell, Tables),
- NewMarkedCell = mark_cell({Gridline, Col, Row}, MarkedCell, Readable),
- loop(KindOfTable,CurrNode,NewMarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, _Gridline, click, {grid,_Readable}, [_Col,_Row,"" | _]} ->
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- loop(KindOfTable,CurrNode,NewMarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, Gridline, doubleclick, {grid,Data}, [?NAME_COL,Row,Text | _]} when Text =/= "" ->
- unmark_cell(MarkedCell, Tables),
- NewMarkedCell = mark_cell({Gridline, ?NAME_COL, Row}, undefined, Data),
- {Table, Name, Readable} = get_table_id(KindOfTable, Row, Tables),
- case start_tv_browser(Table,CurrNode,Name,KindOfTable,Readable,Children) of
- Children ->
- {FinalMarkedCell, NewTables, NewGridLines} =
- refresh_window(NewMarkedCell,Tables,KindOfTable,CurrNode,GridLines,
- UnreadHidden,SysTabHidden,SortKey, Children),
- loop(KindOfTable,CurrNode,FinalMarkedCell,NewGridLines,WinSize,NewTables,
- Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- NewChildren ->
- loop(KindOfTable,CurrNode,NewMarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren)
- end;
-
-
- {gs, Gridline, doubleclick, {grid,Data}, [?ID_COL,Row,Text | _]} when Text =/= "" ->
- unmark_cell(MarkedCell, Tables),
- NewMarkedCell = mark_cell({Gridline, ?ID_COL, Row}, undefined, Data),
- {Table, Name, Readable} = get_table_id(KindOfTable, Row, Tables),
- case start_tv_browser(Table,CurrNode,Name,KindOfTable,Readable,Children) of
- Children ->
- {FinalMarkedCell, NewTables, NewGridLines} =
- refresh_window(NewMarkedCell,Tables,KindOfTable,CurrNode,GridLines,
- UnreadHidden,SysTabHidden,SortKey, Children),
- loop(KindOfTable,CurrNode,FinalMarkedCell,NewGridLines,WinSize,NewTables,
- Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- NewChildren ->
- loop(KindOfTable,CurrNode,NewMarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren)
- end;
-
-
- {gs, Gridline, doubleclick, {grid,Data}, [?INFO_COL,Row,Text | _]} when Text =/= "" ->
- unmark_cell(MarkedCell, Tables),
- NewMarkedCell = mark_cell({Gridline, ?INFO_COL, Row}, undefined, Data),
- {Table, _Name, _Readable} = get_table_id(KindOfTable, Row, Tables),
- case start_tv_info(Table, CurrNode, CurrNode =:= node(), KindOfTable, Children) of
- Children ->
- {FinalMarkedCell, NewTables, NewGridLines} =
- refresh_window(NewMarkedCell,Tables,KindOfTable,CurrNode,GridLines,
- UnreadHidden,SysTabHidden,SortKey, Children),
- loop(KindOfTable,CurrNode,FinalMarkedCell,NewGridLines,WinSize,NewTables,
- Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- NewChildren ->
- loop(KindOfTable,CurrNode,NewMarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren)
- end;
-
-
- {gs, Gridline, doubleclick, {grid,Data}, [?PID_COL,Row,Text | _]} when Text =/= "" ->
- unmark_cell(MarkedCell, Tables),
- NewMarkedCell = mark_cell({Gridline, ?PID_COL, Row}, undefined, Data),
- OwnerPid = element(?PID_ELEM, lists:nth(Row, Tables)),
- NewChildren = start_pman(OwnerPid, Children),
- loop(KindOfTable,CurrNode,NewMarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey, NewChildren);
-
-
- {gs, Gridline, doubleclick, {grid,Data}, [?PROCNAME_COL,Row,Text | _]} when Text =/= "" ->
- unmark_cell(MarkedCell, Tables),
- NewMarkedCell = mark_cell({Gridline, ?PROCNAME_COL, Row}, undefined, Data),
- OwnerPid = element(?PID_ELEM, lists:nth(Row, Tables)),
- NewChildren = start_pman(OwnerPid, Children),
- loop(KindOfTable,CurrNode,NewMarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey, NewChildren);
-
-
-%% {gs, win, configure, _Data, [Width, Height | _]} when {Width,Height} /= WinSize ->
- Msg0 = {gs, win, configure, _Data, [Width0, Height0 | _]}
- when {Width0,Height0} =/= WinSize ->
- {gs, win, configure, _, [Width,Height|_]} = flush_msgs(Msg0),
-
- NewSize = resize_window(Width, Height, length(Tables)),
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,NewSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, _Id, click, update, _Args} ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines} =
- update_grid(KindOfTable,CurrNode,GridLines,UnreadHidden,SysTabHidden,SortKey),
- update_tv_info(Children),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, _Id, click, open_table, _Args} ->
- {Table, Name, Readable} = get_table_id(KindOfTable, element(3, MarkedCell),
- Tables),
- case start_tv_browser(Table,CurrNode,Name,KindOfTable,Readable,Children) of
- Children ->
- {NewMarkedCell, NewTables, NewGridLines} =
- refresh_window(MarkedCell,Tables,KindOfTable,CurrNode,GridLines,
- UnreadHidden,SysTabHidden,SortKey, Children),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,
- Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- NewChildren ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren)
- end;
-
-
- {gs, _Id, click, new_table, _Args} ->
- NewChildren = start_tv_new_table(CurrNode, Children),
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren);
-
-
- {gs, _Id, click, select_node, _Args} ->
- show_tv_nodewin(Children),
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, _Id, click, show_mnesia, _Args} when KindOfTable =:= ets ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- gs:config(label2, [{fg, ?DISABLED_COLOR}]),
- gs:config(sort_table_id, [{enable, false}]),
- NewSortKey =
- case SortKey of
- ?ID_ELEM ->
- gs:config(sort_table_name, [{select,true}]),
- ?NAME_ELEM;
- _Other ->
- SortKey
- end,
- {NewTables, NewGridLines} =
- update_grid(mnesia, CurrNode, GridLines, UnreadHidden, SysTabHidden, NewSortKey),
- gs:config(win, [{cursor,arrow}]),
- loop(mnesia,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,SysTabHidden,NewSortKey,Children);
-
-
- {gs, _Id, click, show_ets, _Args} when KindOfTable =:= mnesia ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- gs:config(label2, [{fg, ?NORMAL_FG_COLOR}]),
- gs:config(label3, [{fg, ?NORMAL_FG_COLOR}]),
- gs:config(label4, [{fg, ?NORMAL_FG_COLOR}]),
- {NewTables, NewGridLines} =
- update_grid(ets, CurrNode, GridLines, UnreadHidden, SysTabHidden,SortKey),
- %% gs:config(show_unreadable, [{enable, true},
- %% {select, not(UnreadHidden)}]),
- gs:config(sort_table_id, [{enable, true}]),
- gs:config(win, [{cursor,arrow}]),
- loop(ets,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, _Id, click, show_system, _Args} when SysTabHidden ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines}
- = update_grid(KindOfTable, CurrNode, GridLines, UnreadHidden, false, SortKey),
- gs:config(show_system, [{data, hide_system}]),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,false,SortKey,Children);
-
-
- {gs, _Id, click, hide_system, _Args} when not SysTabHidden ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines} =
- update_grid(KindOfTable, CurrNode, GridLines, UnreadHidden, true, SortKey),
- gs:config(show_system, [{label, {text, " System Tables "}},
- {data, show_system}]),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,true,SortKey,Children);
-
-
- {gs, _Id, click, show_unreadable, _Args} when UnreadHidden ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines}
- = update_grid(KindOfTable, CurrNode, GridLines, false, SysTabHidden, SortKey),
- gs:config(show_unreadable, [{data, hide_unreadable}]),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- false,SysTabHidden,SortKey,Children);
-
-
- {gs, _Id, click, hide_unreadable, _Args} when not UnreadHidden ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines} =
- update_grid(KindOfTable, CurrNode, GridLines, true, SysTabHidden, SortKey),
- gs:config(show_unreadable, [{label, {text, " Unreadable Tables "}},
- {data, show_unreadable}]),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- true,SysTabHidden,SortKey,Children);
-
-
- {gs, _Id, click, show_info, _Args} ->
- {Table, _Name, _Readable} = get_table_id(KindOfTable, element(3,MarkedCell),
- Tables),
- case start_tv_info(Table, CurrNode, CurrNode =:= node(), KindOfTable, Children) of
- Children ->
- {NewMarkedCell, NewTables, NewGridLines} =
- refresh_window(MarkedCell,Tables,KindOfTable,CurrNode,GridLines,
- UnreadHidden,SysTabHidden,SortKey, Children),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,
- Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- NewChildren ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren)
- end;
-
-
- {gs, _Id, click, sort_table_name, _Args} when SortKey =/= ?NAME_ELEM ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines} =
- update_grid(KindOfTable,CurrNode,GridLines,UnreadHidden,SysTabHidden,?NAME_ELEM),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,SysTabHidden,?NAME_ELEM,Children);
-
-
- {gs, _Id, click, sort_table_id, _Args} when SortKey =/= ?ID_ELEM ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines} =
- update_grid(KindOfTable,CurrNode,GridLines,UnreadHidden,SysTabHidden,?ID_ELEM),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,SysTabHidden,?ID_ELEM,Children);
-
-
- {gs, _Id, click, sort_owner_name, _Args} when SortKey =/= ?PROCNAME_ELEM ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines} =
- update_grid(KindOfTable,CurrNode,GridLines,UnreadHidden,SysTabHidden,
- ?PROCNAME_ELEM),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,SysTabHidden,?PROCNAME_ELEM,Children);
-
-
- {gs, _Id, click, sort_owner_pid, _Args} when SortKey =/= ?PID_ELEM ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines} =
- update_grid(KindOfTable,CurrNode,GridLines,UnreadHidden,SysTabHidden,?PID_ELEM),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,SysTabHidden,?PID_ELEM,Children);
-
-
- {gs, _Id, click, trace_process, _Args} ->
- OwnerPid = element(?PID_ELEM, lists:nth(element(3,MarkedCell), Tables)),
- NewChildren = start_pman(OwnerPid, Children),
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren);
-
-
- {gs, _Id, click, help_button, _Args} ->
- HelpFile = filename:join([code:lib_dir(tv), "doc", "html", "index.html"]),
- tool_utils:open_help(win, HelpFile),
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, _Id, click, otp_help_button, _Args} ->
- IndexFile = filename:join([code:root_dir(), "doc", "index.html"]),
- tool_utils:open_help(win, IndexFile),
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, win, configure, _Data, _Args} ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, _Id, click, exit_button, _Args} ->
- lists:foreach(
- fun({Pid,pman,_OP}) ->
- exit(Pid,kill);
- (_) ->
- done
- end,
- Children),
- exit(normal);
-
-
- {gs, _Id, click, show_haiku, _Args} ->
- gs:config(win, [{cursor,busy}]),
- gs:config(show_haiku, [{data, hide_haiku}]),
- lists:foreach(
- fun({Pid,tv_info,_Data}) ->
- Pid ! {error_msg_mode,haiku};
- ({Pid,tv_browser,_Data}) ->
- Pid ! {error_msg_mode,haiku};
- ({Pid,tv_nodewin,_Data}) ->
- Pid ! {error_msg_mode,haiku};
- ({Pid,tv_new_table,_Data}) ->
- Pid ! {error_msg_mode,haiku};
- (_Other) ->
- done
- end,
- Children),
- put(error_msg_mode, haiku),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable, CurrNode, MarkedCell, GridLines, WinSize, Tables, Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, _Id, click, hide_haiku, _Args} ->
- gs:config(win, [{cursor,busy}]),
- gs:config(show_haiku, [{data, show_haiku}]),
- lists:foreach(
- fun({Pid,tv_info,_Data}) ->
- Pid ! {error_msg_mode,normal};
- ({Pid,tv_browser,_Data}) ->
- Pid ! {error_msg_mode,normal};
- ({Pid,tv_nodewin,_Data}) ->
- Pid ! {error_msg_mode,normal};
- ({Pid,tv_new_table,_Data}) ->
- Pid ! {error_msg_mode,normal};
- (_Other) ->
- done
- end,
- Children),
- put(error_msg_mode, normal),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable, CurrNode, MarkedCell, GridLines, WinSize, Tables, Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, win, destroy, _Data, _Args} ->
- lists:foreach(
- fun({Pid,pman,_OP}) ->
- exit(Pid,kill);
- (_) ->
- done
- end,
- Children),
- exit(normal);
-
-
- {gs, win, keypress, _Data, [Key, _, _, 1 | _]} ->
- case lists:keysearch(Key, 1, Shortcuts) of
- {value, {Key, Value}} ->
- handle_keypress(Value,KindOfTable,CurrNode,MarkedCell,
- GridLines,WinSize,Tables, Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
- false ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children)
- end;
-
-
- {gs, win, keypress, _Data, _Args} ->
- loop(KindOfTable, CurrNode, MarkedCell, GridLines, WinSize, Tables, Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {tv_new_node, _Sender, NewCurrNode} ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines} =
- update_grid(KindOfTable,NewCurrNode,GridLines,UnreadHidden,SysTabHidden,SortKey),
- update_tv_info(Children),
- update_tv_browser(Children),
- NewChildren =
- case replace_node_name(NewCurrNode, CurrNode) of
- false ->
- Children;
- true ->
- update_node_name(Children)
- end,
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,NewCurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren);
-
-
- {tv_start_infowin, Table, Node, LocalNode, TableType} ->
- case start_tv_info(Table, Node, LocalNode, TableType, Children) of
- Children ->
- {NewMarkedCell, NewTables, NewGridLines} =
- refresh_window(MarkedCell,Tables,KindOfTable,CurrNode,GridLines,
- UnreadHidden,SysTabHidden,SortKey, Children),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,
- Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- NewChildren ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren)
- end;
-
-
- {tv_update_infowin, Table, Node, _Type} ->
- case get_tv_info_pid(Table, Node, Children) of
- undefined ->
- done;
- Pid ->
- Pid ! #info_update_table_info{sender=self()}
- end,
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,
- Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {tv_new_table, NewTabWinPid, Node, Name, Options, KindOfTableToCreate, _Readable, false} ->
- case create_table(KindOfTableToCreate, Node, Node =:= node(), Name, Options,
- NewTabWinPid) of
- error ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,
- Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- _TabId ->
- case KindOfTable of
- mnesia ->
- done;
- ets ->
- self() ! {gs, tv_main, click, update, []}
- end,
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,
- Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children)
- end;
-
-
-
- {tv_new_table, NewTabWinPid, Node, Name, Options, KindOfTableToCreate, Readable, true} ->
- case create_table(KindOfTableToCreate, Node, Node =:= node(), Name, Options,
- NewTabWinPid) of
- error ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,
- Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- TabId ->
- case start_tv_browser(TabId,Node,Name,KindOfTableToCreate,Readable,Children) of
- Children ->
- {FinalMarkedCell, NewTables, NewGridLines} =
- case KindOfTable of
- mnesia ->
- {MarkedCell, Tables, GridLines};
- ets ->
- refresh_window(MarkedCell,Tables,KindOfTable,
- CurrNode,GridLines,UnreadHidden,
- SysTabHidden,SortKey, Children)
- end,
- loop(KindOfTable,CurrNode,FinalMarkedCell,NewGridLines,WinSize,
- NewTables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- NewChildren ->
- case KindOfTable of
- mnesia ->
- done;
- ets ->
- self() ! {gs, tv_main, click, update, []}
- end,
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,
- Shortcuts,UnreadHidden,SysTabHidden,SortKey,NewChildren)
- end
- end;
-
-
-
- {'EXIT', Pid, _Reason} ->
- case lists:keysearch(Pid, 1, Children) of
- false ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,
- Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- {value, {Pid,Prog,_Data}} ->
- NewChildren =
- case Prog of
- tv_nodewin ->
- lists:keydelete(Pid, 1, Children) ++ start_tv_nodewin(CurrNode);
- _Other ->
- lists:keydelete(Pid, 1, Children)
- end,
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,
- Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,NewChildren)
- end;
-
-
- _Other ->
- loop(KindOfTable, CurrNode, MarkedCell, GridLines, WinSize, Tables, Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children)
- end.
-
-
-flush_msgs(Msg0 = {gs, Win, Op, _, _}) ->
- receive Msg = {gs, Win,Op,_,_} ->
- flush_msgs(Msg)
- after 100 ->
- Msg0
- end.
-
-handle_keypress(open_table,KindOfTable,CurrNode,MarkedCell,GridLines,
- WinSize,Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children) ->
- NewChildren =
- case MarkedCell of
- {undefined,_,_} ->
- case get(error_msg_mode) of
- normal ->
- gs:config(win, [beep]),
- tv_utils:notify(win, "TV Notification", "No table selected!");
- haiku ->
- Msg = ["Rather than a beep",
- "Or a rude error message",
- "These words: make a choice."],
- tv_utils:notify(win, "TV Notification", Msg)
- end,
- Children;
- _OtherCell ->
- {Table, Name, Readable} = get_table_id(KindOfTable, element(3, MarkedCell),
- Tables),
- start_tv_browser(Table, CurrNode, Name, KindOfTable, Readable, Children)
- end,
- case NewChildren of
- Children ->
- {NewMarkedCell, NewTables, NewGridLines} =
- refresh_window(MarkedCell,Tables,KindOfTable,CurrNode,GridLines,UnreadHidden,
- SysTabHidden, SortKey, Children),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,
- Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- _Other ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren)
- end;
-
-
-handle_keypress(update,KindOfTable,CurrNode,MarkedCell,GridLines,
- WinSize,Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children) ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTabs, NewGrLines} =
- update_grid(KindOfTable,CurrNode,GridLines,UnreadHidden,SysTabHidden,SortKey),
- update_tv_info(Children),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGrLines,WinSize,NewTabs,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
-handle_keypress(show_mnesia,ets,CurrNode,MarkedCell,GridLines,
- WinSize,Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children) ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- gs:config(label2, [{fg, ?DISABLED_COLOR}]),
- gs:config(label3, [{fg, ?DISABLED_COLOR}]),
- gs:config(label4, [{fg, ?DISABLED_COLOR}]),
- gs:config(show_unreadable, [{label, {text, " Unreadable Tables "}},
- {data, show_unreadable}]),
- %% gs:config(show_unreadable, [{enable, false},
- %% {select, false}]),
- gs:config(sort_table_id, [{enable, false}]),
- NewSortKey =
- case SortKey of
- ?ID_ELEM ->
- gs:config(sort_table_name, [{select,true}]),
- ?NAME_ELEM;
- _Other ->
- SortKey
- end,
- {NewTables, NewGridLines} =
- update_grid(mnesia,CurrNode,GridLines,UnreadHidden,SysTabHidden,NewSortKey),
- gs:config(win, [{cursor,arrow}]),
- loop(mnesia,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,SysTabHidden,NewSortKey,Children);
-
-
-
-handle_keypress(show_ets,mnesia,CurrNode,MarkedCell,GridLines,
- WinSize,Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children) ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- gs:config(label2, [{fg, ?NORMAL_FG_COLOR}]),
- gs:config(label3, [{fg, ?NORMAL_FG_COLOR}]),
- gs:config(label4, [{fg, ?NORMAL_FG_COLOR}]),
- {NewTables, NewGridLines} =
- update_grid(ets,CurrNode,GridLines,UnreadHidden,SysTabHidden,SortKey),
- %% gs:config(show_unreadable, [{enable, true},
- %% {select, not(UnreadHidden)}]),
- gs:config(sort_table_id, [{enable, true}]),
- gs:config(win, [{cursor,arrow}]),
- loop(ets,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
-handle_keypress(trace_process,KindOfTable,CurrNode,MarkedCell,GridLines,
- WinSize,Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children) ->
- NewChildren =
- case MarkedCell of
- {_Id, ?PID_COL, Row} ->
- OwnerPid = element(?PID_ELEM, lists:nth(Row, Tables)),
- start_pman(OwnerPid, Children);
- {_Id, ?PROCNAME_COL, Row} ->
- OwnerPid = element(?PID_ELEM, lists:nth(Row, Tables)),
- start_pman(OwnerPid, Children);
- _Other ->
- Children
- end,
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey, NewChildren);
-
-
-handle_keypress(select_node,KindOfTable,CurrNode,MarkedCell,GridLines,
- WinSize,Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children) ->
- show_tv_nodewin(Children),
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
-handle_keypress(show_info,KindOfTable,CurrNode,MarkedCell,GridLines,
- WinSize,Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children) ->
- NewChildren =
- case MarkedCell of
- {_Id, ?NAME_COL, Row} ->
- {Table, _Name, _Readable} = get_table_id(KindOfTable, Row, Tables),
- start_tv_info(Table, CurrNode, CurrNode =:= node(), KindOfTable, Children);
- {_Id, ?ID_COL, Row} ->
- {Table, _Name, _Readable} = get_table_id(KindOfTable, Row, Tables),
- start_tv_info(Table, CurrNode, CurrNode =:= node(), KindOfTable, Children);
- {_Id, ?INFO_COL, Row} ->
- {Table, _Name, _Readable} = get_table_id(KindOfTable, Row, Tables),
- start_tv_info(Table, CurrNode, CurrNode =:= node(), KindOfTable, Children);
- _OtherCell ->
- Children
- end,
- case NewChildren of
- Children ->
- {NewMarkedCell, NewTables, NewGridLines} =
- refresh_window(MarkedCell,Tables,KindOfTable,CurrNode,GridLines,UnreadHidden,
- SysTabHidden, SortKey, Children),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,
- Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- _Other ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren)
- end;
-
-
-handle_keypress(help_button,KindOfTable,CurrNode,MarkedCell,GridLines,
- WinSize,Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children) ->
- HelpFile = filename:join([code:lib_dir(tv), "doc", "html", "index.html"]),
- tool_utils:open_help(win, HelpFile),
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-handle_keypress(exit_button,_KindOfTable,_CurrNode,_MarkedCell,_GridLines,
- _WinSize,_Tables,_Shortcuts,_UnreadHidden,_SysTabHidden,_SortKey,Children) ->
- lists:foreach(
- fun({Pid,pman,_OP}) ->
- exit(Pid,kill);
- (_) ->
- done
- end,
- Children),
- exit(normal);
-
-
-handle_keypress(_Any,KindOfTable,CurrNode,MarkedCell,GridLines,
- WinSize,Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children) ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children).
-
-
-
-
-refresh_window(MarkedCell,Tables,KindOfTable,
- CurrNode,GridLines,UnreadHidden,SysTabHidden, SortKey, Children) ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines} =
- update_grid(KindOfTable,CurrNode,GridLines,UnreadHidden,SysTabHidden,
- SortKey),
- update_tv_info(Children),
- gs:config(win, [{cursor,arrow}]),
- {NewMarkedCell, NewTables, NewGridLines}.
-
-
-
-
-
-get_table_id(mnesia, Row, Tables) ->
- TabTuple = lists:nth(Row, Tables),
- Readable = element(?READABLE_ELEM, TabTuple),
- Id = element(?NAME_ELEM, TabTuple),
- {Id, Id, Readable};
-get_table_id(ets, Row, Tables) ->
- TabTuple = lists:nth(Row, Tables),
- Readable = element(?READABLE_ELEM, TabTuple),
- Name = element(?NAME_ELEM, TabTuple),
- case element(?NAMED_TABLE_ELEM, TabTuple) of
- false ->
- {element(?ID_ELEM, TabTuple), Name, Readable};
- _Other ->
- {Name, Name, Readable}
- end.
-
-
-
-replace_node_name('nonode@nohost', 'nonode@nohost') ->
- %% Still undistributed...
- false;
-replace_node_name(_Node, _OldNode) when node() =:= 'nonode@nohost' ->
- %% No longer distributed, but previously was!
- true;
-replace_node_name(_Node, 'nonode@nohost') ->
- %% The system has been distributed!
- true;
-replace_node_name(_Node, _OldNode) ->
- false.
-
-
-
-update_node_name(Children) when node() =:= 'nonode@nohost' ->
- %% We have been distributed, but no longer are!
- %% We change all node names stored to 'nonode@nohost'!
- %% This works because we *will* receive exit signals
- %% for those processes that have died on other nodes,
- %% whereupon these processes will be removed from the
- %% 'Children' list.
- lists:map(fun({Pid, Prog, {Table,_Node}}) ->
- {Pid, Prog, {Table,'nonode@nohost'}};
- (H) ->
- H
- end,
- Children);
-update_node_name(Children) ->
- %% We have become distributed!
- %% Change all occurrences of 'nonode@nohost'
- %% to the new current node name!
- HomeNode = node(),
- lists:map(fun({Pid, Prog, {Table,'nonode@nohost'}}) ->
- {Pid, Prog, {Table,HomeNode}};
- (H) ->
- H
- end,
- Children).
-
-
-
-
-show_tv_nodewin(Children) ->
- {value, {Pid,tv_nodewin,_Node}} = lists:keysearch(tv_nodewin, 2, Children),
- Pid ! show_window.
-
-
-
-update_tv_info(Children) ->
- Sender = self(),
- lists:foreach(fun({Pid,tv_info,{_Table,_Node}}) ->
- Pid ! #info_update_table_info{sender=Sender};
- (_) ->
- done
- end,
- Children).
-
-
-
-update_tv_browser(Children) ->
- lists:foreach(fun({Pid,tv_browser,{_Table,_Node}}) ->
- Pid ! check_node;
- (_) ->
- done
- end,
- Children).
-
-
-
-get_tv_info_pid(TabId,Node,Children) ->
- TvInfoChildren = [X || X <- Children, element(2,X) =:= tv_info],
- case lists:keysearch({TabId,Node}, 3, TvInfoChildren) of
- {value, {Pid, tv_info, {_Table,Node}}} ->
- Pid;
- _Other ->
- undefined
- end.
-
-
-
-start_tv_browser(Tab,Node,_Name,KindOfTable,false,Children) ->
- gs:config(win, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(win, "TV Notification",
- ["The selected table is unreadable!",
- "Only table information may be viewed!"]);
- haiku ->
- Msg = ["Table protected.",
- "The answers that you're seeking",
- "will remain unknown."],
- tv_utils:notify(win, "TV Notification", Msg)
- end,
- start_tv_info(Tab, Node, Node =:= node(), KindOfTable, Children);
-start_tv_browser(Table,Node,Name,KindOfTable,_Readable,Children) ->
- TvBrowserChildren = [X || X <- Children, element(2,X) =:= tv_browser],
- case lists:keysearch({Table,Node}, 3, TvBrowserChildren) of
- {value, {BPid,tv_browser,{Table,Node}}} ->
- BPid ! raise,
- Children;
- _Other ->
- %% Check that table still exists!
- case table_still_there(KindOfTable, Node, Node =:= node(), Table, Name) of
- true ->
- LocalNode = (Node =:= node()),
- NewBPid = tv:start_browser(Node, LocalNode, Table, KindOfTable, Name,
- get(error_msg_mode)),
- [{NewBPid, tv_browser, {Table,Node}} | Children];
- _TableDead ->
- gs:config(win, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(win, "TV Notification",
- ["The table no longer exists!"]);
- haiku ->
- Msg = ["A table that big?",
- "It might be very useful.",
- "But now it is gone."],
- tv_utils:notify(win, "TV Notification", Msg)
- end,
- Children
- end
- end.
-
-
-
-
-
-table_still_there(ets, Node, LocalNode, Table, Name) ->
- case catch tv_ets_rpc:all(Node, LocalNode) of
- Tables when is_list(Tables) ->
- case lists:member(Table, Tables) of
- true ->
- true;
- false -> %% May be a named table...
- lists:keymember(Name, 1, Tables)
- end;
- Error ->
- analyze_error(Error, Node, Table),
- false
- end;
-table_still_there(mnesia, Node, LocalNode, Table, Name) ->
- case catch tv_mnesia_rpc:system_info(Node, LocalNode, tables) of
- Tables when is_list(Tables) ->
- lists:member(Name, Tables);
- Error ->
- analyze_error(Error, Node, Table),
- false
- end.
-
-
-
-
-
-
-start_tv_info(Table, Node, LocalNode, KindOfTable, Children) ->
- TvInfoChildren = [X || X <- Children, element(2,X) =:= tv_info],
- case lists:keysearch({Table,Node}, 3, TvInfoChildren) of
- {value, {Pid,tv_info,{Table,Node}}} ->
- Pid ! #info_raise_window{sender = self()},
- Children;
- _Other ->
- %% May have started a browser but no info window!
- %% Info window may have been started from that browser, but
- %% don't bother with checking *that*.
- Pid = spawn_link(tv_info, info, [self(), Node, LocalNode, Table, KindOfTable,
- get(error_msg_mode)]),
- [{Pid, tv_info, {Table,Node}} | Children]
- end.
-
-
-
-
-
-start_tv_new_table(CurrNode, Children) ->
- TvNewTableChild = [X || X <- Children, element(2,X) =:= tv_new_table],
- case TvNewTableChild of
- [{Pid,tv_new_table,undefined}] ->
- Pid ! raise,
- Children;
- [] ->
- Pid = tv_new_table:start(CurrNode, get(error_msg_mode)),
- [{Pid, tv_new_table, undefined} | Children]
- end.
-
-
-
-
-create_table(mnesia, _Node, _LocalNode, _TabName, _Options, _NewTabWinPid) ->
- error;
-create_table(ets, Node, LocalNode, TabName, Options, NewTabWinPid) ->
- case tv_table_owner:create(ets, Node, LocalNode, TabName, Options) of
- {ok, TabId} ->
- NewTabWinPid ! ok,
- TabId;
- error ->
- NewTabWinPid ! error,
- error
- end.
-
-
-
-
-start_pman(OwnerPid, Children) ->
- Pid = pman_shell:start(OwnerPid),
- [{Pid,pman,OwnerPid} | Children].
-
-
-
-
-update_grid(TableType, CurrNode, GridLines, UnreadHidden, SysTabHidden,SortKey) ->
- NewTables = get_tables(CurrNode, TableType, UnreadHidden, SysTabHidden,SortKey),
- TabStr = case TableType of
- mnesia ->
- "Mnesia ";
- ets ->
- "ETS "
- end,
- NodeStr = atom_to_list(CurrNode),
- gs:config(win, [{title, "[TV] " ++ TabStr ++ "tables on " ++ NodeStr}]),
- gs:config(grid, [{rows, {1, get_nof_rows(length(NewTables), gs:read(grid,height))}}]),
- NewGridLines = update_gridlines(NewTables, GridLines, 1),
- {NewTables, NewGridLines}.
-
-
-
-unmark_cell({undefined, AnyCol, AnyRow}, _Tables) ->
- {undefined, AnyCol, AnyRow};
-unmark_cell({Id, Col, Row}, Tables) ->
- disable_menus(),
- TabTuple = lists:nth(Row, Tables),
- ReadableTable = element(?READABLE_ELEM, TabTuple),
- NamedTable = element(?NAMED_TABLE_ELEM, TabTuple),
- BgColor =
- case ReadableTable of
- false ->
- ?UNREADABLE_BG_COLOR;
- _Other1 ->
- ?READABLE_BG_COLOR
- end,
-
- FgColor =
- case NamedTable of
- false when Col =:= ?NAME_COL ->
- ?UNNAMED_FG_COLOR;
- _Other2 ->
- ?NORMAL_FG_COLOR
- end,
-
- gs:config(Id, [{bg, {Col, BgColor}},
- {fg, {Col, FgColor}}]),
- {undefined, undefined, undefined}.
-
-
-
-
-mark_cell({Id,Col,Row}, {Id,Col,Row}, _Readable) ->
- {undefined, undefined, undefined};
-mark_cell({Id,Col,Row}, _Any, Readable) ->
- case lists:member(Col, ?POSSIBLE_MARK_COLS) of
- true ->
- enable_menus(Col, Readable),
- gs:config(Id, [{bg, {Col, ?GRID_MARK_COLOR}},
- {fg, {Col, ?NORMAL_FG_COLOR}}]),
- {Id, Col,Row};
- false ->
- {undefined, undefined, undefined}
- end.
-
-
-disable_menus() ->
- disable_open_menu(),
- disable_trace_menu(),
- disable_info_menu().
-
-
-enable_menus(?ID_COL, true) ->
- enable_open_menu(),
- enable_info_menu();
-enable_menus(?ID_COL, {notext}) ->
- enable_open_menu(),
- enable_info_menu();
-enable_menus(?ID_COL, false) ->
- enable_info_menu();
-enable_menus(?NAME_COL, true) ->
- enable_open_menu(),
- enable_info_menu();
-enable_menus(?NAME_COL, {notext}) ->
- enable_open_menu(),
- enable_info_menu();
-enable_menus(?NAME_COL, false) ->
- enable_info_menu();
-enable_menus(?PID_COL, _Any) ->
- enable_trace_menu();
-enable_menus(?PROCNAME_COL, _Any) ->
- enable_trace_menu();
-enable_menus(?INFO_COL, _Any) ->
- enable_info_menu();
-enable_menus(_Col, _Any) ->
- done.
-
-
-
-resize_window(Width, Height, NofElems) ->
- WinWidth = lists:max([Width, ?MIN_WIN_WIDTH]),
- WinHeight = lists:max([Height, ?MIN_WIN_HEIGHT]),
- gs:config(win, [{width, WinWidth},
- {height, WinHeight}
- ]),
- {BgWidth, BgHeight, FgWidth, FgHeight} = get_frame_coords(WinWidth, WinHeight),
- {GridWidth, GridHeight} = get_grid_coords(FgWidth, FgHeight),
- ColWidths = get_col_widths(?COL_WIDTHS, GridWidth),
- resize_header_labels(ColWidths,
- [label1,label2,label3,label4,label5],
- ?GRID_XPOS),
- gs:config(bgframe, [{width, BgWidth},
- {height, BgHeight}
- ]),
- gs:config(fgframe, [{width, FgWidth},
- {height, FgHeight}
- ]),
- gs:config(grid, [{width, GridWidth},
- {height, GridHeight},
- {columnwidths, ColWidths},
- {rows, {1, get_nof_rows(NofElems, GridHeight)}}
- ]),
- {WinWidth, WinHeight}.
-
-
-
-
-create_window(Tables) ->
- gs:window(win, gs:start(), [{width, ?WIN_WIDTH},
- {height, ?WIN_HEIGHT},
- {bg, ?DEFAULT_BG_COLOR},
- {title, "[TV] ETS tables on " ++
- atom_to_list(node())},
- {destroy, true},
- {configure, true},
- {keypress, true}
- ]),
-
- ShortcutList = create_menus(),
-
- disable_menus(),
-
- {BgFrameWidth, BgFrameHeight, FgFrameWidth, FgFrameHeight} =
- get_frame_coords(?WIN_WIDTH, ?WIN_HEIGHT),
-
- {GridWidth, GridHeight} = get_grid_coords(FgFrameWidth, FgFrameHeight),
-
- ColWidths = get_col_widths(?COL_WIDTHS, GridWidth),
-
- gs:frame(bgframe, win, [{width, BgFrameWidth},
- {height, BgFrameHeight},
- {x, ?GRID_XPOS},
- {y, ?GRID_YPOS},
- {bg, {0,0,0}}
- ]),
- gs:frame(fgframe, bgframe, [{width, FgFrameWidth},
- {height, FgFrameHeight},
- {x, 0},
- {y, 1},
- {bg, ?DEFAULT_BG_COLOR}
- ]),
-
-
- create_header_labels(ColWidths, ?HEADER_LABELS),
- gs:grid(grid, fgframe, [{width, GridWidth},
- {height, GridHeight},
- {x, 0},
- {y, -1},
- {hscroll,bottom},
- {vscroll,right},
- {rows, {1, get_nof_rows(length(Tables), GridHeight)}},
- {columnwidths, ColWidths},
- {fg, ?NORMAL_FG_COLOR},
- {bg, {255,255,255}},
- {font, ?FONT}
- ]),
- GridLines = update_gridlines(Tables, [], 1),
- {{undefined,undefined,undefined}, GridLines, {?WIN_WIDTH,?WIN_HEIGHT}, ShortcutList}.
-
-
-
-
-get_frame_coords(WinWidth, WinHeight) ->
- BgWidth = WinWidth - 2 * ?GRID_XPOS,
- BgHeight = WinHeight - ?GRID_YPOS - ?GRID_XPOS,
- FgWidth = BgWidth,
- FgHeight = BgHeight - 1,
- {BgWidth, BgHeight, FgWidth, FgHeight}.
-
-
-
-
-get_grid_coords(ParentWidth, ParentHeight) ->
- {ParentWidth, ParentHeight + 1}.
-
-
-
-get_col_widths(Cols, GridWidth) ->
- SbWidth = 25, %% OK, OK, don't bother about it, this constant makes it work... :-/
- FixColWidthSum = lists:sum(lists:map(fun(H) ->
- lists:nth(H, Cols)
- end,
- ?FIX_WIDTH_COLS)),
- AvailableWidth = GridWidth - FixColWidthSum - SbWidth,
- OriginalWidth = ?WIN_WIDTH - 2 * ?GRID_XPOS - FixColWidthSum - SbWidth,
- get_col_widths(1, Cols, AvailableWidth, OriginalWidth).
-
-
-
-get_col_widths(N, [H | T], AvailWidth, OrigWidth) ->
- NewColWidth =
- case lists:member(N, ?FIX_WIDTH_COLS) of
- true ->
- H;
- _Other ->
- round(H * (AvailWidth / OrigWidth) + 0.1)
- end,
- [NewColWidth | get_col_widths(N + 1, T, AvailWidth, OrigWidth)];
-get_col_widths(_N, [], _AvailWidth, _OrigWidth) ->
- [].
-
-
-
-create_header_labels(ColWidths, Text) ->
- create_header_labels(ColWidths, Text, 1, ?GRID_XPOS).
-
-
-
-create_header_labels([W | T], [{Name, Text} | TextT], N, Xpos) ->
- Ypos = ?GRID_YPOS - 20,
- gs:label(Name, win, [{width, W + 1 - 3},
- {height, 20},
- {x, Xpos + 1 + 3},
- {y, Ypos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, ?NORMAL_FG_COLOR},
- {font, ?HEADER_FONT},
- {align, w},
- {label, {text, Text}}
- ]),
- create_header_labels(T, TextT, N + 1, Xpos + 1 + W);
-create_header_labels([], [], _N, _Xpos) ->
- done.
-
-
-
-resize_header_labels([W | T], [Name | NT], Xpos) ->
- gs:config(Name, [{width, W + 1 - 3},
- {x, Xpos + 1 + 3}
- ]),
- resize_header_labels(T, NT, Xpos + 1 + W);
-resize_header_labels([], [], _Xpos) ->
- done.
-
-
-
-disable_open_menu() ->
- gs:config(open_table, [{enable,false}]).
-
-
-disable_info_menu() ->
- gs:config(show_info, [{enable,false}]).
-
-disable_trace_menu() ->
- gs:config(trace_process, [{enable,false}]).
-
-
-enable_open_menu() ->
- gs:config(open_table, [{enable,true}]).
-
-
-enable_info_menu() ->
- gs:config(show_info, [{enable,true}]).
-
-
-enable_trace_menu() ->
- gs:config(trace_process, [{enable,true}]).
-
-
-create_menus() ->
- gs:menubar(menubar, win, [{bg, ?DEFAULT_BG_COLOR}]),
-
- HelpButt = gs:menubutton(menubar, [{bg, ?DEFAULT_BG_COLOR},
- {fg, ?FIREBRICK}, % firebrick
- {label, {text, " Help "}},
- {underline, 1},
- {side, right}
- ]),
- FileButt = gs:menubutton(menubar, [{bg, ?DEFAULT_BG_COLOR},
- {fg, ?FIREBRICK}, % firebrick
- {label, {text, " File "}},
- {underline, 1},
- {side, left}
- ]),
- ViewButt = gs:menubutton(menubar, [{bg, ?DEFAULT_BG_COLOR},
- {fg, ?FIREBRICK}, % firebrick
- {label, {text, " View "}},
- {underline, 1},
- {side, left}
- ]),
- OptionsButt = gs:menubutton(menubar, [{bg, ?DEFAULT_BG_COLOR},
- {fg, ?FIREBRICK}, % firebrick
- {label, {text, " Options "}},
- {underline, 1},
- {side, left}
- ]),
-
- HelpMenu = gs:menu(HelpButt, [{bg, ?DEFAULT_BG_COLOR},
- {fg, ?FIREBRICK},
- {disabledfg,?DISABLED_COLOR}
- ]),
- FileMenu = gs:menu(FileButt, [{bg, ?DEFAULT_BG_COLOR},
- {fg, ?FIREBRICK},
- {disabledfg,?DISABLED_COLOR}
- ]),
-
- OptionsMenu = gs:menu(OptionsButt, [{bg, ?DEFAULT_BG_COLOR},
- {fg, ?FIREBRICK},
- {disabledfg,?DISABLED_COLOR}
- ]),
-
- ViewMenu = gs:menu(ViewButt, [{bg, ?DEFAULT_BG_COLOR},
- {fg, ?FIREBRICK},
- {disabledfg,?DISABLED_COLOR}
- ]),
-
- ShortCutList =
- create_menulist([{" Help ",normal,help_button,1,h},
- separator,
- {" OTP Documentation ",normal,otp_help_button,1,no_char}], HelpMenu) ++
- create_menulist([{" Open Table ",normal,open_table,1,o},
- {" New Table... ",normal,new_table,1,no_char},
- {" Table Info ",normal,show_info,7,i},
- separator,
- {" Nodes... ",normal,select_node,1,n},
- separator,
- {" Trace Process ",normal,trace_process,1,t},
- separator,
- {" Exit ",normal, exit_button,2,x}], FileMenu) ++
- [{c,exit_button}, {'C',exit_button}] ++
- create_menulist([{" Refresh ",normal,update,1,r},
- separator,
- {" Unreadable Tables ",check,show_unreadable,1,no_char},
- separator,
- {" System Tables ",check,show_system,1,no_char},
- separator,
- {" Sort by Name ",radio,sort_table_name,9,no_char},
- {" Sort by Id ",radio,sort_table_id,9,no_char},
- {" Sort by Owner PID ",radio,sort_owner_pid,15,no_char},
- {" Sort by Owner Name ",radio,sort_owner_name,9,no_char},
- separator,
- {" Error Messages in Haiku ",check,show_haiku,1,no_char}
- ],
- OptionsMenu) ++
- create_menulist([{" ETS Tables ",radio,show_ets,1,e},
- {" Mnesia Tables ",radio,show_mnesia,1,m}], ViewMenu),
- gs:config(show_unreadable, [{select,false}]),
- gs:config(show_system, [{select,false}]),
- gs:config(show_haiku, [{select,false}]),
- %% Due to a bug (or some other reason), only one of the radiobuttons belonging
- %% to a specified group can be selected, even if different processes have created
- %% the radiobuttons! This means that, if we have started more than one tv_main
- %% process, selecting one radiobutton will affect the radiobuttons in the other
- %% tv_main process(es)!!! Since this is a highly undesirable bahaviour, we have to
- %% create unique group names (i.e., atoms).
- %% (We need to group the radiobuttons, since otherwise all created by one process
- %% belongs to the same group, which also is undesirable...)
- SelfStr = pid_to_list(self()),
- SortGroup = list_to_atom("sorting" ++ SelfStr),
- TypeGroup = list_to_atom("table_type" ++ SelfStr),
- gs:config(sort_table_name, [{group,SortGroup},{select,true}]),
- gs:config(sort_table_id, [{group,SortGroup}]),
- gs:config(sort_owner_pid, [{group,SortGroup}]),
- gs:config(sort_owner_name, [{group,SortGroup}]),
- gs:config(show_ets, [{group,TypeGroup}, {select,true}]),
- gs:config(show_mnesia, [{group,TypeGroup}]),
- ShortCutList.
-
-
-
-
-
-create_menulist(List, Menu) ->
- MaxLength = get_length_of_longest_menu_text(List, 0),
- create_menulist(List, Menu, MaxLength).
-
-
-
-
-create_menulist([], _Menu, _MaxLength) ->
- [];
-create_menulist([{Text, Type, Data, AccCharPos, ShortcutChar} | Rest], Menu, MaxLength) ->
- ShortcutCapitalChar =
- if
- ShortcutChar =:= no_char ->
- no_char;
- true ->
- CharAsciiValue = lists:nth(1, atom_to_list(ShortcutChar)),
- CapitalCharValue = CharAsciiValue - ($a - $A),
- list_to_atom([CapitalCharValue])
- end,
-
- FinalText = if
- ShortcutChar =:= no_char ->
- Text;
- true ->
- Text ++ lists:duplicate(MaxLength - length(Text), " ") ++
- " Ctrl+" ++ atom_to_list(ShortcutCapitalChar) ++ " "
- end,
- gs:menuitem(Data, Menu, [{bg, ?DEFAULT_BG_COLOR},
- {fg, ?FIREBRICK},
- {itemtype, Type},
- {label, {text, FinalText}},
- {underline, AccCharPos},
- {data, Data}
- ]),
- [{ShortcutChar, Data}, {ShortcutCapitalChar, Data} | create_menulist(Rest, Menu, MaxLength)];
-create_menulist([separator | Rest], Menu, MaxLength) ->
- gs:menuitem(Menu, [{itemtype, separator}]),
- create_menulist(Rest, Menu, MaxLength).
-
-
-
-
-
-
-
-get_length_of_longest_menu_text([], MaxLength) ->
- MaxLength;
-get_length_of_longest_menu_text([{Text, _Type, _Data, _APos, _SChar} | Rest], CurrMax) ->
- L = length(Text),
- if
- L > CurrMax ->
- get_length_of_longest_menu_text(Rest, L);
- true ->
- get_length_of_longest_menu_text(Rest, CurrMax)
- end;
-get_length_of_longest_menu_text([separator | Rest], CurrMax) ->
- get_length_of_longest_menu_text(Rest, CurrMax).
-
-
-
-
-
-
-get_nof_rows(NofElems, GridHeight) ->
- lists:max([NofElems, round((GridHeight - 20) / 21) + 1]).
-
-
-
-config_gridline(LineId, TabTuple) ->
- Readable = element(?READABLE_ELEM, TabTuple),
- NamedTable = element(?NAMED_TABLE_ELEM, TabTuple),
- {FgColor, BgColor} =
- case Readable of
- true ->
- {?NORMAL_FG_COLOR, ?READABLE_BG_COLOR};
- false ->
- {?UNREADABLE_FG_COLOR, ?UNREADABLE_BG_COLOR};
- {notext} ->
- {?NORMAL_FG_COLOR, ?READABLE_BG_COLOR}
- end,
-
- NameFgColor =
- case NamedTable of
- false ->
- ?UNNAMED_FG_COLOR;
- _Other ->
- ?NORMAL_FG_COLOR
- end,
-
- gs:config(LineId, [{bg, BgColor},
- {fg, FgColor},
- {fg, {?NAME_COL, NameFgColor}},
- {click, true},
- {doubleclick, true},
- {data, {grid,Readable}} |
-
- lists:map(
- fun({Elem,Col}) ->
- case element(Elem, TabTuple) of
- {notext} ->
- {text, {Col, ""}};
- Other when Elem =:= ?NAME_ELEM ->
- case NamedTable of
- false ->
- {text, {Col, " " ++
- lists:flatten(
- io_lib:write(
- Other)) ++ " "}};
- _AnyOther ->
- {text, {Col, " " ++ lists:flatten(
- io_lib:write(
- Other))}}
- end;
- Other ->
- {text, {Col, " " ++ lists:flatten(
- io_lib:write(
- Other))}}
- end
- end,
- [{?NAME_ELEM, ?NAME_COL},
- {?ID_ELEM, ?ID_COL},
- {?PID_ELEM, ?PID_COL},
- {?PROCNAME_ELEM, ?PROCNAME_COL},
- {?INFO_ELEM, ?INFO_COL}]
- )
- ]).
-
-
-
-
-
-update_gridlines([TabTuple | TT], [LineId | GT], CurrRow) ->
- config_gridline(LineId, TabTuple),
- [LineId | update_gridlines(TT, GT, CurrRow + 1)];
-update_gridlines([TabTuple | TT], [], CurrRow) ->
- LineId = gs:gridline(grid, [{row, CurrRow}]),
- config_gridline(LineId, TabTuple),
- [LineId | update_gridlines(TT, [], CurrRow + 1)];
-update_gridlines([], [LineId | GT], _CurrRow) ->
- gs:destroy(LineId),
- update_gridlines([], GT, _CurrRow);
-update_gridlines([], [], _CurrRow) ->
- [].
-
-
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_main.hrl b/lib/tv/src/tv_main.hrl
deleted file mode 100644
index c9db1d9484..0000000000
--- a/lib/tv/src/tv_main.hrl
+++ /dev/null
@@ -1,285 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2013. 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%
-
--define(ERROR_MSG_MODE, normal).
-
--define(WIN_WIDTH, 745). % 779
--define(WIN_HEIGHT, 380).
--define(MIN_WIN_WIDTH, 524).
--define(MIN_WIN_HEIGHT, 150).
-
--define(FONT, {screen, 12}).
--define(HEADER_FONT, {screen, [bold,italic], 12}).
-
--define(GRID_XPOS, 3).
--define(GRID_YPOS, 68).
-
-
-%% Unreadable tables are indicated by the background color.
-%% Unnamed tables are indicated by the foreground color.
-
--define(NORMAL_FG_COLOR, {0,0,0}).
--define(READABLE_BG_COLOR, {255,255,255}).
--define(UNREADABLE_FG_COLOR, ?NORMAL_FG_COLOR).
--define(UNREADABLE_BG_COLOR, {240,240,240}).
-%-define(UNREADABLE_BG_COLOR, {255,250,230}).
-%-define(UNREADABLE_BG_COLOR, {242,242,242}).
--define(UNNAMED_FG_COLOR, {175,175,175}).
-%-define(UNNAMED_FG_COLOR, {140,35,35}).
-
-
--define(DISABLED_COLOR, {160,160,160}).
-
--define(NAME_ELEM, 1).
--define(NAMED_TABLE_ELEM, 2).
--define(ID_ELEM, 3).
--define(READABLE_ELEM, 4).
--define(PID_ELEM, 5).
--define(PROCNAME_ELEM, 6).
--define(INFO_ELEM, 7).
-
--define(NAME_COL, 1).
--define(ID_COL, 2).
--define(PID_COL, 3).
--define(PROCNAME_COL, 4).
--define(INFO_COL, 5).
-
--define(POSSIBLE_MARK_COLS, [?NAME_COL, ?ID_COL, ?PID_COL, ?PROCNAME_COL, ?INFO_COL]).
--define(COL_WIDTHS, [205,131,91,197,90]). % [140,95,125,75,85,140,90]).
--define(FIX_WIDTH_COLS, [2,3,5]).
-
-
--define(HEADER_LABELS, [{label1, " Table Name"},
- % {label2, " Named Table"},
- {label2, " Table Id"},
- % {label4, " Readable"},
- {label3, " Owner Pid"},
- {label4, " Owner Name"},
- {label5, " Table Size"}
- ]).
-
-
-
-%% TABLES_TO_HIDE shall contain both Mnesia and ETS tables that we want to hide. :-)
-
--define(SYSTEM_TABLES, [ac_tab,
- asn1,
- cdv_dump_index_table,
- cdv_menu_table,
- cdv_decode_heap_table,
- cell_id,
- cell_pos,
- clist,
- cover_internal_data_table,
- cover_collected_remote_data_table,
- cover_binary_code_table,
- code,
- code_names,
- cookies,
- corba_policy,
- corba_policy_associations,
- dets,
- dets_owners,
- dets_registry,
- disk_log_names,
- disk_log_pids,
- eprof,
- erl_atom_cache,
- erl_epmd_nodes,
- etop_accum_tab,
- etop_tr,
- ets_coverage_data,
- file_io_servers,
- global,
- global_locks,
- global_names,
- global_names_ext,
- gs_mapping,
- gs_names,
- gstk_db,
- gstk_grid_cellid,
- gstk_grid_cellpos,
- gstk_grid_id,
- gvar,
- httpd,
- id,
- ig,
- ign_req_index,
- ign_requests,
- index,
- inet_cache,
- inet_db,
- inet_hosts,
- 'InitialReferences',
- int_db,
- interpreter_includedirs_macros,
- ir_WstringDef,
- lmcounter,
- locks,
- pg2_table,
- queue,
- snmp_agent_table,
- snmp_local_db2,
- snmp_mib_data,
- snmp_note_store,
- snmp_symbolic_ets,
- sticky,
- sys_dist,
- tid_locks,
- tkFun,
- tkLink,
- tkPriv,
- ttb,
- ttb_history_table,
- udp_fds,
- udp_pids
- ]).
-
-
--define(MNESIA_TABLES, [alarm,
- alarmTable,
- evaLogDiscriminatorTable,
- eva_snmp_map,
- eventTable,
- group,
- imprec,
- ir_AliasDef,
- ir_ArrayDef,
- ir_AttributeDef,
- ir_ConstantDef,
- ir_Contained,
- ir_Container,
- ir_EnumDef,
- ir_ExceptionDef,
- ir_IDLType,
- ir_IRObject,
- ir_InterfaceDef,
- ir_ModuleDef,
- ir_ORB,
- ir_OperationDef,
- ir_PrimitiveDef,
- ir_Repository,
- ir_SequenceDef,
- ir_StringDef,
- ir_StructDef,
- ir_TypedefDef,
- ir_UnionDef,
- logTable,
- logTransferTable,
- mesh_meas,
- mesh_type,
- mnesia_clist,
- mnesia_decision,
- mnesia_transient_decision,
- orber_CosNaming,
- orber_objkeys,
- schema,
- user
- ]).
-
-
--define(UNREADABLE_MNESIA_TABLES, [schema]).
-
-
--define(SYSTEM_OWNERS, [alarm_handler,
- application_controller,
- auth,
- coast_server,
- code_server,
- cover_server_001,
- dbg,
- dets,
- dets_sup,
- disk_log_server,
- disk_log_sup,
- erl_epmd,
- erl_prim_loader,
- error_logger,
- eva_log_sup,
- eva_server,
- eva_sup,
- file_server,
- file_server_2,
- global_group,
- global_group_check,
- global_name_server,
- gs_frontend,
- heart,
- help_main,
- inet_db,
- inet_gethost_native,
- init,
- int_db,
- interpret,
- jive_server,
- kernel_safe_sup,
- kernel_sup,
- log_server,
- mandel_server,
- mesh_sup,
- mesh_server,
- mnesia_checkpoint_sup,
- mnesia_dumper,
- mnesia_event,
- mnesia_fallback,
- mnesia_init,
- mnesia_kernel_sup,
- mnesia_late_loader,
- mnesia_locker,
- mnesia_monitor,
- mnesia_recover,
- mnesia_snmp_sup,
- mnesia_subscr,
- mnesia_sup,
- mnesia_tm,
- net_kernel,
- net_sup,
- overload,
- perfmon_sampler,
- pxw_server,
- release_handler,
- %% rex, %% Otherwise we won't see tables we've created on other nodes!
- rsh_starter,
- sasl_safe_sup,
- sasl_sup,
- snmp_agent_sup,
- snmp_local_db,
- snmp_master_agent,
- snmp_misc_sup,
- snmp_note_store,
- snmp_supervisor,
- snmp_symbolic_store,
- socket,
- sounder,
- ssl_socket,
- take_over_monitor,
- timer_server,
- tk,
- udp_server,
- user,
- winshell_controller,
- xerl_copy,
- xerl_monitor
- ]).
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_mnesia_rpc.erl b/lib/tv/src/tv_mnesia_rpc.erl
deleted file mode 100644
index b2434fcdd3..0000000000
--- a/lib/tv/src/tv_mnesia_rpc.erl
+++ /dev/null
@@ -1,106 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2011. 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(tv_mnesia_rpc).
-
-
-
--export([system_info/3,
- table_info/4,
- transaction/3
- ]).
-
-
-
-
-
-
-system_info(_Node, true, Key) ->
- chk(catch mnesia:system_info(Key));
-system_info(Node, false, Key) ->
- chk(catch rpc:block_call(Node, mnesia, system_info, [Key])).
-
-
-
-
-table_info(_Node, true, Tab, Item) ->
- chk(catch mnesia:table_info(Tab, Item));
-table_info(Node, false, Tab, Item) ->
- chk(catch rpc:block_call(Node, mnesia, table_info, [Tab, Item])).
-
-
-
-
-transaction(_Node, true, Fun) ->
- chk(catch mnesia:transaction(Fun));
-transaction(Node, false, Fun) ->
- chk(catch rpc:block_call(Node, mnesia, transaction, [Fun])).
-
-
-
-
-chk(Result) ->
- case Result of
- _Anything when is_list(Result) ->
- Result;
- _Anything when is_atom(Result) ->
- Result;
- _Anything when is_integer(Result) ->
- Result;
- _Anything when is_pid(Result) ->
- Result;
-
- {aborted, {bad_type, _Rec}} ->
- throw(bad_format);
-
- {badrpc,nodedown} ->
- throw(nodedown);
- {'EXIT', nodedown} ->
- throw(nodedown);
-
- {'EXIT', {aborted, {no_exists, _Table, _Arg}}} ->
- throw(no_table);
-
- {'EXIT', {aborted, {node_not_running, _Node}}} ->
- throw(mnesia_not_started);
- {'EXIT', {{badarg, {gen, set_monitor_mode, _Data}}, _Info}} ->
- throw(mnesia_not_started);
- {'EXIT', {'EXIT', {aborted, {node_not_running,_Node}}}} ->
- throw(mnesia_not_started);
- {badrpc, {'EXIT', {aborted, {node_not_running,_Node}}}} ->
- throw(mnesia_not_started);
- {badrpc, {'EXIT', {aborted, {no_exists,_Table,_Args}}}} ->
- throw(mnesia_not_started);
- {badrpc, _Reason} ->
- throw(mnesia_not_started);
- {'EXIT', {undef, {mnesia,_Fcn,_Args,_}}} ->
- throw(mnesia_not_started);
- {'EXIT', {undef, {mnesia,_Fcn,_Args}}} ->
- throw(mnesia_not_started);
-
- {'EXIT', Reason} ->
- throw({unexpected_error, Reason});
-
- Other when is_tuple(Other) ->
- %% For example wild_pattern requests return a tuple!
- Other;
-
- Other ->
- io:format("Unexpected return value: ~p~n", [Other])
- end.
-
-
diff --git a/lib/tv/src/tv_new_table.erl b/lib/tv/src/tv_new_table.erl
deleted file mode 100644
index 779835d78a..0000000000
--- a/lib/tv/src/tv_new_table.erl
+++ /dev/null
@@ -1,666 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2012. 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%k
--module(tv_new_table).
--compile([{nowarn_deprecated_function,{gs,button,3}},
- {nowarn_deprecated_function,{gs,checkbutton,3}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,entry,3}},
- {nowarn_deprecated_function,{gs,frame,3}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,radiobutton,3}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([start/2,
- init/3
- ]).
-
-
-
--define(DEFAULT_BG_COLOR, {217, 217, 217}).
--define(FONT, {screen, 12}).
-
--define(WIN_WIDTH, 400).
--define(WIN_HEIGHT, 555). %% 510
-
--define(FRAME_WIDTH, 400).
--define(FRAME1_HEIGHT, 170).
--define(FRAME2_HEIGHT, 260).
--define(FRAME3_HEIGHT, 125). %% 80
--define(BW, 2).
-
--define(FRAME_X, 0).
--define(FRAME1_Y, 0).
--define(FRAME2_Y, 170).
--define(FRAME3_Y, 430).
-
-
--define(LBL_HEIGHT, 30).
--define(NODE_LBL_WIDTH, 45).
--define(NAME_LBL_WIDTH, 85).
--define(TYPE_LBL_WIDTH, 45).
--define(PROT_LBL_WIDTH, 85).
--define(KEYPOS_LBL_WIDTH, 95).
-
--define(LBL_X, 10).
--define(NODE_LBL_Y, 20).
--define(NAME_LBL_Y, 80).
--define(TYPE_LBL_Y, 10).
--define(PROT_LBL_Y, 100).
--define(KEYPOS_LBL_Y, 200).
-
-
--define(ENTRY_HEIGHT, 30).
--define(NODE_ENTRY_WIDTH, 275).
--define(NAME_ENTRY_WIDTH, 275).
--define(KEYPOS_ENTRY_WIDTH, 50).
-
--define(ENTRY_X1, 110).
--define(ENTRY_X2, 110).
--define(NODE_ENTRY_Y, 20).
--define(NAME_ENTRY_Y, 80).
--define(KEYPOS_ENTRY_Y, 200).
-
--define(RBTN_HEIGHT, 30).
--define(RBTN_WIDTH1, 105).
--define(RBTN_WIDTH2, 115).
-
--define(RBTN_X1, 60).
--define(RBTN_X2, 165).
--define(RBTN_X3, 270).
--define(RBTN_Y1, 40).
--define(RBTN_Y1PLUS, 70).
--define(RBTN_Y2, 130).
-
-
--define(CBTN_HEIGHT, 30).
--define(NAMED_TABLE_CBTN_WIDTH, 100).
--define(OPEN_BROWSER_CBTN_WIDTH, 105).
-
--define(NAMED_TABLE_CBTN_X, 110).
--define(NAMED_TABLE_CBTN_Y, 120).
-
--define(OPEN_BROWSER_CBTN_X, 85). %% 215
--define(OPEN_BROWSER_CBTN_Y, 10). %% 200
-
-
--define(BTN_WIDTH, 100).
--define(BTN_HEIGHT, 30).
-
--define(BTN_X1, 85).
--define(BTN_X2, 225).
--define(BTN_Y, 65). %% 30
-
-
--define(VLINE_LBL_WIDTH, (380 - 2 * ?BW)).
--define(VLINE_LBL_HEIGHT, 1).
--define(HLINE_LBL_WIDTH, 1).
--define(HLINE_LBL_HEIGHT, 70).
-
--define(VLINE_LBL_X, (10 - ?BW)).
--define(VLINE_LBL_Y1, 85).
--define(VLINE_LBL_Y2, 180).
--define(HLINE_LBL_X, 188).
--define(HLINE_LBL_Y, 180).
-
-
--define(DEFAULT_NAME, my_table).
--define(DEFAULT_TYPE, set).
--define(DEFAULT_PROT, public).
--define(DEFAULT_KEYPOS, 1).
-
-
-
-
-start(Node, ErrMsgMode) ->
- spawn_link(?MODULE, init, [Node, ErrMsgMode, self()]).
-
-
-
-
-
-init(Node, ErrMsgMode, MPid) ->
- process_flag(trap_exit, true),
- put(error_msg_mode, ErrMsgMode),
- create_window(Node),
- loop(false, ?DEFAULT_TYPE, ?DEFAULT_PROT, true, MPid).
-
-
-
-
-
-loop(NamedTab, Type, Prot, OpenBrowser, MPid) ->
- receive
-
- {gs, ok, click, _Data, _Args} ->
- gs:config(win, [{cursor, busy}]),
- case create_table(NamedTab, Type, Prot, OpenBrowser, MPid) of
- ok ->
- exit(normal);
- error ->
- gs:config(win, [{cursor, arrow}]),
- loop(NamedTab, Type, Prot, OpenBrowser, MPid)
- end;
-
-
- {gs, cancel, click, _Data, _Args} ->
- exit(normal);
-
-
- {gs, set, click, _Data, _Args} ->
- loop(NamedTab, set, Prot, OpenBrowser, MPid);
-
-
- {gs, ordered_set, click, _Data, _Args} ->
- loop(NamedTab, ordered_set, Prot, OpenBrowser, MPid);
-
-
- {gs, bag, click, _Data, _Args} ->
- loop(NamedTab, bag, Prot, OpenBrowser, MPid);
-
-
- {gs, duplicate_bag, click, _Data, _Args} ->
- loop(NamedTab, duplicate_bag, Prot, OpenBrowser, MPid);
-
-
- {gs, public, click, _Data, _Args} ->
- gs:config(open_browser, [{enable, true}, {select, OpenBrowser}]),
- loop(NamedTab, Type, public, OpenBrowser, MPid);
-
-
- {gs, protected, click, _Data, _Args} ->
- gs:config(open_browser, [{enable, true}, {select, OpenBrowser}]),
- loop(NamedTab, Type, protected, OpenBrowser, MPid);
-
-
- {gs, private, click, _Data, _Args} ->
- gs:config(open_browser, [{select, false}, {enable, false}]),
- loop(NamedTab, Type, private, OpenBrowser, MPid);
-
-
- {gs, named_table, click, Data, _Args} ->
- gs:config(named_table, [{data, not(Data)}]),
- loop(Data, Type, Prot, OpenBrowser, MPid);
-
-
- {gs, open_browser, click, Data, _Args} ->
- gs:config(open_browser, [{data, not(Data)}]),
- loop(Data, Type, Prot, Data, MPid);
-
-
- {gs, EntryId, keypress, _Data, ['Tab', _No, 0 | _T]} ->
- case get_entry_term(EntryId) of
- {ok, _Term} ->
- gs:config(next_entry(EntryId, forward), [{setfocus, true},
- {select, {0, 100000000}}]);
- error ->
- done
- end,
- loop(NamedTab, Type, Prot, OpenBrowser, MPid);
-
-
- {gs, EntryId, keypress, _Data, ['Tab', _No, 1 | _T]} ->
- case get_entry_term(EntryId) of
- {ok, _Term} ->
- gs:config(next_entry(EntryId, backward), [{setfocus, true},
- {select, {0, 100000000}}]);
- error ->
- done
- end,
- loop(NamedTab, Type, Prot, OpenBrowser, MPid);
-
-
- {gs, EntryId, keypress, _Data, ['Down' | _T]} ->
- case get_entry_term(EntryId) of
- {ok, _Term} ->
- gs:config(next_entry(EntryId, forward), [{setfocus, true},
- {select, {0, 100000000}}]);
- error ->
- done
- end,
- loop(NamedTab, Type, Prot, OpenBrowser, MPid);
-
-
- {gs, EntryId, keypress, _Data, ['Up' | _T]} ->
- case get_entry_term(EntryId) of
- {ok, _Term} ->
- gs:config(next_entry(EntryId, backward), [{setfocus, true},
- {select, {0, 100000000}}]);
- error ->
- done
- end,
- loop(NamedTab, Type, Prot, OpenBrowser, MPid);
-
-
- {gs, _EntryId, keypress, _Data, ['Return' | _T]} ->
- gs:config(win, [{cursor, busy}]),
- case create_table(NamedTab, Type, Prot, OpenBrowser, MPid) of
- ok ->
- exit(normal);
- error ->
- gs:config(win, [{cursor, arrow}]),
- loop(NamedTab, Type, Prot, OpenBrowser, MPid)
- end;
-
-
- {gs, win, configure, _Data, _Args} ->
- gs:config(win, [{width, ?WIN_WIDTH},
- {height, ?WIN_HEIGHT}]),
- loop(NamedTab, Type, Prot, OpenBrowser, MPid);
-
-
- {gs, win, destroy, _Data, _Args} ->
- exit(normal);
-
-
- raise ->
- gs:config(win, [raise]),
- loop(NamedTab, Type, Prot, OpenBrowser, MPid);
-
-
- {error_msg_mode, ErrMsgMode} ->
- put(error_msg_mode, ErrMsgMode),
- loop(NamedTab, Type, Prot, OpenBrowser, MPid);
-
-
- {'EXIT', _Pid, _Reason} ->
- exit(normal);
-
-
- _Other ->
- loop(NamedTab, Type, Prot, OpenBrowser, MPid)
-
- end.
-
-
-
-
-create_table(NamedTab, Type, Prot, OpenBrowser, MPid) ->
- case get_entry_term(node_entry) of
- error ->
- error;
- {ok, Node} ->
- case get_entry_term(name_entry) of
- error ->
- error;
- {ok, TabName} ->
- case get_entry_term(keypos_entry) of
- error ->
- error;
- {ok, KeyPos} ->
- Options =
- [Type, Prot, {keypos, KeyPos}] ++
- case NamedTab of
- true ->
- [named_table];
- false ->
- []
- end,
- {Readable, NewOpenBrowser} =
- case Prot of
- private ->
- {false, false};
- _Other ->
- {true, OpenBrowser}
- end,
- MPid ! {tv_new_table, self(), Node, TabName, Options, ets,
- Readable, NewOpenBrowser},
- receive
- ok ->
- ok;
- error ->
- show_error_msg(),
- error
- after
- 5000 ->
- show_error_msg(),
- error
- end
- end
- end
- end.
-
-
-
-
-
-show_error_msg() ->
- Msg =
- case get(error_msg_mode) of
- normal ->
- ["Couldn't create a table using",
- "the specified settings!"];
- haiku ->
- ["The table you want",
- "Could maybe be created.",
- "But I don't know how."]
- end,
- tv_utils:notify(win, "TV Notification", Msg).
-
-
-
-
-
-
-
-get_entry_term(Id) ->
- EditedStr = gs:read(Id, text),
- case tv_db_search:string_to_term(EditedStr) of
- {ok, NewTerm} when Id =:= node_entry, is_atom(NewTerm) ->
- {ok,NewTerm};
- {ok, NewTerm} when Id =:= name_entry, is_atom(NewTerm) ->
- {ok,NewTerm};
- {ok, NewTerm} when Id =:= keypos_entry, is_integer(NewTerm), NewTerm > 0 ->
- {ok,NewTerm};
- _Other ->
- NewMsg =
- case get(error_msg_mode) of
- normal ->
- case Id of
- node_entry ->
- ["Please enter a valid node name!"];
- name_entry ->
- ["Please enter a valid table name!"];
- keypos_entry ->
- ["Please enter a valid key position!"]
- end;
- haiku ->
- E1 = "Aborted effort",
- L =
- case Id of
- node_entry ->
- ["Reflect, repent and retype:",
- "Enter valid node."];
- name_entry ->
- ["Reflect, repent and retype:",
- "Enter valid name."];
- keypos_entry ->
- ["Reflect, repent and retype",
- "Key position, please."]
- end,
- [E1 | L]
- end,
- gs:config(Id, [beep, {select, {0, 100000000}}, {setfocus, true}]),
- tv_utils:notify(win, "TV Notification", NewMsg),
- error
- end.
-
-
-
-
-
-next_entry(node_entry, forward) ->
- name_entry;
-next_entry(node_entry, backward) ->
- keypos_entry;
-next_entry(name_entry, forward) ->
- keypos_entry;
-next_entry(name_entry, backward) ->
- node_entry;
-next_entry(keypos_entry, forward) ->
- node_entry;
-next_entry(keypos_entry, backward) ->
- name_entry.
-
-
-
-
-create_window(Node) ->
- gs:window(win, gs:start(), [{width, ?WIN_WIDTH},
- {height, ?WIN_HEIGHT},
- {bg, ?DEFAULT_BG_COLOR},
- {title, "[TV] Create New ETS Table"},
- {configure, true},
- {destroy, true},
- {cursor, arrow}
- ]),
-
- gs:frame(frame1, win, [{width, ?FRAME_WIDTH},
- {height, ?FRAME1_HEIGHT},
- {x, ?FRAME_X},
- {y, ?FRAME1_Y},
- {bg, ?DEFAULT_BG_COLOR},
- {bw, ?BW}]),
- gs:frame(frame2, win, [{width, ?FRAME_WIDTH},
- {height, ?FRAME2_HEIGHT},
- {x, ?FRAME_X},
- {y, ?FRAME2_Y},
- {bg, ?DEFAULT_BG_COLOR},
- {bw, ?BW}]),
- gs:frame(frame3, win, [{width, ?FRAME_WIDTH},
- {height, ?FRAME3_HEIGHT},
- {x, ?FRAME_X},
- {y, ?FRAME3_Y},
- {bg, ?DEFAULT_BG_COLOR},
- {bw, ?BW}]),
-
- gs:label(frame1, [{width, ?NODE_LBL_WIDTH},
- {height, ?LBL_HEIGHT},
- {x, ?LBL_X},
- {y, ?NODE_LBL_Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {align, w},
- {font, ?FONT},
- {label, {text, "Node:"}}
- ]),
- gs:label(frame1, [{width, ?NAME_LBL_WIDTH},
- {height, ?LBL_HEIGHT},
- {x, ?LBL_X},
- {y, ?NAME_LBL_Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {align, w},
- {font, ?FONT},
- {label, {text, "Table name:"}}
- ]),
- gs:label(frame2, [{width, ?TYPE_LBL_WIDTH},
- {height, ?LBL_HEIGHT},
- {x, ?LBL_X},
- {y, ?TYPE_LBL_Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {align, w},
- {font, ?FONT},
- {label, {text, "Type:"}}
- ]),
- gs:label(frame2, [{width, ?PROT_LBL_WIDTH},
- {height, ?LBL_HEIGHT},
- {x, ?LBL_X},
- {y, ?PROT_LBL_Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {align, w},
- {font, ?FONT},
- {label, {text, "Protection:"}}
- ]),
- gs:label(frame2, [{width, ?KEYPOS_LBL_WIDTH},
- {height, ?LBL_HEIGHT},
- {x, ?LBL_X},
- {y, ?KEYPOS_LBL_Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {align, w},
- {font, ?FONT},
- {label, {text, "Key position:"}}
- ]),
-
- gs:entry(node_entry, frame1, [{width, ?NODE_ENTRY_WIDTH},
- {height, ?ENTRY_HEIGHT},
- {x, ?ENTRY_X1},
- {y, ?NODE_ENTRY_Y},
- {bg, {255,255,255}},
- {fg, {0,0,0}},
- {font, ?FONT},
- {enable, true},
- {text, "'" ++ atom_to_list(Node) ++ "'"},
- {keypress, true}
- ]),
- gs:entry(name_entry, frame1, [{width, ?NAME_ENTRY_WIDTH},
- {height, ?ENTRY_HEIGHT},
- {x, ?ENTRY_X1},
- {y, ?NAME_ENTRY_Y},
- {bg, {255,255,255}},
- {fg, {0,0,0}},
- {font, ?FONT},
- {enable, true},
- {text, atom_to_list(?DEFAULT_NAME)},
- {keypress, true},
- {setfocus, true},
- {select, {0,100000000}}
- ]),
- gs:entry(keypos_entry, frame2, [{width, ?KEYPOS_ENTRY_WIDTH},
- {height, ?ENTRY_HEIGHT},
- {x, ?ENTRY_X2},
- {y, ?KEYPOS_ENTRY_Y},
- {bg, {255,255,255}},
- {fg, {0,0,0}},
- {font, ?FONT},
- {enable, true},
- {keypress, true},
- {text, integer_to_list(?DEFAULT_KEYPOS)}
- ]),
-
- gs:radiobutton(set, frame2, [{width, ?RBTN_WIDTH1},
- {height, ?RBTN_HEIGHT},
- {x, ?RBTN_X1},
- {y, ?RBTN_Y1},
- {align, w},
- {label, {text, "set"}},
- {group, type}
- ]),
- gs:radiobutton(ordered_set, frame2, [{width, ?RBTN_WIDTH1},
- {height, ?RBTN_HEIGHT},
- {x, ?RBTN_X2},
- {y, ?RBTN_Y1},
- {align, w},
- {label, {text, "ordered_set"}},
- {group, type}
- ]),
- gs:radiobutton(bag, frame2, [{width, ?RBTN_WIDTH1},
- {height, ?RBTN_HEIGHT},
- {x, ?RBTN_X1},
- {y, ?RBTN_Y1PLUS},
- {align, w},
- {label, {text, "bag"}},
- {group, type}
- ]),
- gs:radiobutton(duplicate_bag, frame2, [{width, ?RBTN_WIDTH2},
- {height, ?RBTN_HEIGHT},
- {x, ?RBTN_X2},
- {y, ?RBTN_Y1PLUS},
- {align, w},
- {label, {text, "duplicate_bag"}},
- {group, type}
- ]),
-
- gs:radiobutton(public, frame2, [{width, ?RBTN_WIDTH1},
- {height, ?RBTN_HEIGHT},
- {x, ?RBTN_X1},
- {y, ?RBTN_Y2},
- {align, w},
- {label, {text, "public"}},
- {group, protection}
- ]),
- gs:radiobutton(protected, frame2, [{width, ?RBTN_WIDTH1},
- {height, ?RBTN_HEIGHT},
- {x, ?RBTN_X2},
- {y, ?RBTN_Y2},
- {align, w},
- {label, {text, "protected"}},
- {group, protection}
- ]),
- gs:radiobutton(private, frame2, [{width, ?RBTN_WIDTH2},
- {height, ?RBTN_HEIGHT},
- {x, ?RBTN_X3},
- {y, ?RBTN_Y2},
- {align, w},
- {label, {text, "private"}},
- {group, protection}
- ]),
-
- gs:checkbutton(named_table, frame1, [{width, ?NAMED_TABLE_CBTN_WIDTH},
- {height, ?CBTN_HEIGHT},
- {x, ?NAMED_TABLE_CBTN_X},
- {y, ?NAMED_TABLE_CBTN_Y},
- {align, w},
- {label, {text, "Named table"}},
- {select, false},
- {data, true}
- ]),
-
- gs:checkbutton(open_browser, frame3, [{width, ?OPEN_BROWSER_CBTN_WIDTH},
- {height, ?CBTN_HEIGHT},
- {x, ?OPEN_BROWSER_CBTN_X},
- {y, ?OPEN_BROWSER_CBTN_Y},
- {align, w},
- {label, {text, "Open browser"}},
- {select, true},
- {data, false}
- ]),
-
-%% gs:label(frame2, [{width, ?VLINE_LBL_WIDTH},
-%% {height, ?VLINE_LBL_HEIGHT},
-%% {x, ?VLINE_LBL_X},
-%% {y, ?VLINE_LBL_Y1},
-%% {bg, {0,0,0}}
-%% ]),
-%% gs:label(frame2, [{width, ?VLINE_LBL_WIDTH},
-%% {height, ?VLINE_LBL_HEIGHT},
-%% {x, ?VLINE_LBL_X},
-%% {y, ?VLINE_LBL_Y2},
-%% {bg, {0,0,0}}
-%% ]),
-%% gs:label(frame2, [{width, ?HLINE_LBL_WIDTH},
-%% {height, ?HLINE_LBL_HEIGHT},
-%% {x, ?HLINE_LBL_X},
-%% {y, ?HLINE_LBL_Y},
-%% {bg, {0,0,0}}
-%% ]),
-%%
- gs:button(ok, frame3, [{width, ?BTN_WIDTH},
- {height, ?BTN_HEIGHT},
- {x, ?BTN_X1},
- {y, ?BTN_Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {label, {text, "OK"}}
- ]),
- gs:button(cancel, frame3, [{width, ?BTN_WIDTH},
- {height, ?BTN_HEIGHT},
- {x, ?BTN_X2},
- {y, ?BTN_Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {label, {text, "Cancel"}}
- ]),
-
- gs:config(?DEFAULT_TYPE, [{select, true}]),
- gs:config(?DEFAULT_PROT, [{select, true}]),
-
- gs:config(win, [{map, true}]).
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_nodewin.erl b/lib/tv/src/tv_nodewin.erl
deleted file mode 100644
index 8376c4a7aa..0000000000
--- a/lib/tv/src/tv_nodewin.erl
+++ /dev/null
@@ -1,412 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2012. 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(tv_nodewin).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,listbox,3}},
- {nowarn_deprecated_function,{gs,menu,3}},
- {nowarn_deprecated_function,{gs,menubar,3}},
- {nowarn_deprecated_function,{gs,menubutton,3}},
- {nowarn_deprecated_function,{gs,menuitem,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([start/2, init/3]).
-
-
--include("tv_int_msg.hrl").
-
-
-
--define(WINDOW_WIDTH, 230).
--define(WINDOW_HEIGHT, 260).
--define(DEFAULT_BG_COLOR, {217,217,217}).
--define(POLL_INTERVAL, 5000).
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-start(CurrNode, ErrMsgMode) ->
- spawn_link(?MODULE, init, [self(), CurrNode, ErrMsgMode]).
-
-
-
-
-
-init(Pid, CurrNode, ErrMsgMode) ->
- process_flag(trap_exit, true),
- net_kernel:monitor_nodes(true),
- put(error_msg_mode, ErrMsgMode),
- gs:start(),
- NewCurrNode = update_node_listbox(CurrNode, false),
- tell_master(NewCurrNode, CurrNode, Pid),
- loop(Pid, NewCurrNode, node(), false).
-
-
-
-
-%%%*********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-init_window(CurrNode, Pid) ->
- create_window(),
- NewCurrNode = update_node_listbox(CurrNode, true),
- tell_master(NewCurrNode, CurrNode, Pid),
- gs:config(win, [{map,true}]),
- NewCurrNode.
-
-
-
-
-handle_error(nodedown) ->
- gs:window(errorwin, gs:start(), []),
- gs:config(errorwin, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(errorwin, "TV Notification", ["The selected node is down!"]);
- haiku ->
- Msg = ["With searching comes loss",
- "And the presence of absence:",
- "Node is down."],
- tv_utils:notify(errorwin, "TV Notification", Msg)
- end,
- gs:destroy(errorwin);
-handle_error(distributed) ->
- gs:window(errorwin, gs:start(), []),
- gs:config(errorwin, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(errorwin, "TV Notification",
- ["The system has become distributed!"]);
- haiku ->
- Msg = [],
- tv_utils:notify(errorwin, "TV Notification", Msg)
- end,
- gs:destroy(errorwin);
-handle_error(undistributed) ->
- gs:window(errorwin, gs:start(), []),
- gs:config(errorwin, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(errorwin, "TV Notification",
- ["The system is no longer distributed!"]);
- haiku ->
- Msg = ["The system you see",
- "Is not a distributed",
- "system anymore."],
- tv_utils:notify(errorwin, "TV Notification", Msg)
- end,
- gs:destroy(errorwin).
-
-get_node_lists(CurrNode) ->
- NodeDataList = lists:sort([node() | nodes()]),
- NodeTextList = lists:map(fun(Item) ->
- " " ++ atom_to_list(Item)
- end,
- NodeDataList),
-
- %% It *may* be possible that CurrNode has disappeared!
- %% If this is the case, use the node where TV resides
- %% as new current node.
- %% This also covers the case when our own node (or some
- %% other node) suddenly goes distributed.
-
- NewCurrNode = case lists:member(CurrNode, NodeDataList) of
- true ->
- CurrNode;
- false ->
- node()
- end,
-
- %% Now get the index that shall be marked in the node listbox.
- %% Remember that the first item has number 0 (zero)!
- NodeMarkIndex = get_node_mark_index(NewCurrNode, NodeDataList, 0),
-
- {NewCurrNode, NodeDataList, NodeTextList, NodeMarkIndex}.
-
-
-
-
-%% We know that CurrNode is *somewhere* in the list, since we have checked.
-%% If the original CurrNode wasn't there, then we are using node() instead,
-%% which definitely is in the list. (node() may have gone distributed in the
-%% meantime, but it *IS* in the list!) :-)
-
-get_node_mark_index(CurrNode, [H | T], Acc) when CurrNode =/= H ->
- get_node_mark_index(CurrNode, T, Acc + 1);
-get_node_mark_index(CurrNode, [CurrNode | _], Acc) ->
- Acc. %% Acc tells the index of the current head. :-)
-
-
-
-
-
-check_selected_node('nonode@nohost', _OldNode, _WinCreated) when node() =:= 'nonode@nohost' ->
- %% Not distributed, OK!
- 'nonode@nohost';
-check_selected_node(_Node, _OldNode, WinCreated) when node() =:= 'nonode@nohost' ->
- %% No longer distributed, but previously was!
- handle_error(undistributed),
- update_node_listbox('nonode@nohost', WinCreated);
-check_selected_node(Node, _OldNode, _WinCreated) when Node =:= node() ->
- %% We are distributed, but on
- %% our own node! Since we
- % still are running, the node
- %% is up.
- Node;
-check_selected_node(Node, 'nonode@nohost', WinCreated) ->
- %% The system has been distributed!
- net_kernel:monitor_nodes(true),
- handle_error(distributed),
- update_node_listbox(Node, WinCreated);
-check_selected_node(Node, _OldNode, WinCreated) ->
- %% We are distributed, and a new node has been chosen!
- %% We better check this node!
- case net_adm:ping(Node) of
- pong ->
- Node;
- _Other ->
- handle_error(nodedown),
- update_node_listbox(Node, WinCreated)
- end.
-
-
-
-available_nodes() ->
- lists:sort([node() | nodes()]).
-
-
-
-loop(Pid, CurrNode, HomeNode, WinCreated) ->
- receive
-
- {nodedown, _Node} ->
- flush_nodedown_messages(),
- flush_nodeup_messages(),
- case lists:member(CurrNode, available_nodes()) of
- true ->
- done;
- false when node() =:= 'nonode@nohost', CurrNode =/= 'nonode@nohost' ->
- handle_error(undistributed);
- false ->
- handle_error(nodedown)
- end,
- NewCurrNode = update_node_listbox(CurrNode, WinCreated),
- tell_master(NewCurrNode, CurrNode, Pid),
- loop(Pid, NewCurrNode, node(), WinCreated);
-
-
- {nodeup, _Node} ->
- flush_nodeup_messages(),
- flush_nodedown_messages(),
- case lists:member(CurrNode, available_nodes()) of
- true ->
- done;
- false when node() =:= 'nonode@nohost', CurrNode =/= 'nonode@nohost' ->
- handle_error(undistributed);
- false when CurrNode =:= 'nonode@nohost' ->
- net_kernel:monitor_nodes(true),
- handle_error(distributed);
- false ->
- handle_error(nodedown)
- end,
- NewCurrNode = update_node_listbox(CurrNode, WinCreated),
- tell_master(NewCurrNode, CurrNode, Pid),
- loop(Pid, NewCurrNode, node(), WinCreated);
-
-
- {gs, node_listbox, click, Data, [Idx, _Txt | _]} ->
- NewCurrNode = check_selected_node(lists:nth(Idx + 1, Data), CurrNode, WinCreated),
- tell_master(NewCurrNode, CurrNode, Pid),
- loop(Pid, NewCurrNode, node(), WinCreated);
-
-
- {gs, win, configure, _, _} ->
- gs:config(win, [{width, ?WINDOW_WIDTH}, {height, ?WINDOW_HEIGHT}]),
- loop(Pid, CurrNode, HomeNode, WinCreated);
-
-
- show_window when WinCreated->
- gs:config(win, [raise]),
- loop(Pid, CurrNode, HomeNode, WinCreated);
-
- show_window when not WinCreated ->
- init_window(CurrNode, Pid),
- loop(Pid, CurrNode, HomeNode, true);
-
- {gs, _Id, click, close_menu, _Args} ->
- gs:destroy(win),
- loop(Pid, CurrNode, HomeNode, false);
-
-
- {gs, _Id, keypress, _Data, [c, _, 0, 1 | _]} ->
- gs:destroy(win),
- loop(Pid, CurrNode, HomeNode, false);
-
-
- {gs, _Id, keypress, _Data, ['C', _, 1, 1 | _]} ->
- gs:destroy(win),
- loop(Pid, CurrNode, HomeNode, false);
-
-
- {gs, _Id, keypress, _Data, _Args} ->
- loop(Pid, CurrNode, HomeNode, WinCreated);
-
-
- {gs, _, destroy, _, _} ->
- loop(Pid, CurrNode, HomeNode, false);
-
-
- {error_msg_mode, Mode} ->
- put(error_msg_mode, Mode),
- loop(Pid, CurrNode, HomeNode, WinCreated);
-
- {'EXIT', Pid, _Reason} ->
- net_kernel:monitor_nodes(false),
- exit(normal);
-
-
- {'EXIT', _OtherPid, _Reason} ->
- loop(Pid, CurrNode, HomeNode, WinCreated);
-
-
- _Other ->
- io:format("Node window received message ~p ~n", [_Other]),
- loop(Pid, CurrNode, HomeNode, WinCreated)
-
- after
- 1000 ->
- NewHomeNode = case node() of
- HomeNode ->
- HomeNode;
- Other ->
- self() ! {nodeup, Other}
- end,
- loop(Pid, CurrNode, NewHomeNode, WinCreated)
- end.
-
-
-
-
-tell_master(NewNode, NewNode, _Pid) ->
- done;
-tell_master(NewNode, _OldNode, Pid) ->
- Pid ! {tv_new_node, self(), NewNode}.
-
-
-
-
-flush_nodedown_messages() ->
- receive
- {nodedown,_Node} ->
- flush_nodedown_messages()
- after
- 0 ->
- done
- end.
-
-
-
-
-flush_nodeup_messages() ->
- receive
- {nodeup,_Node} ->
- flush_nodeup_messages()
- after
- 0 ->
- done
- end.
-
-
-
-
-update_node_listbox(Node, WinCreated) ->
- {NewNode, NodeDataList, NodeTextList, MarkIndex} = get_node_lists(Node),
- case WinCreated of
- false ->
- done;
- true ->
- catch gs:config(node_listbox, [{data, NodeDataList},
- {items, NodeTextList},
- {selection, MarkIndex}
- ])
- end,
- NewNode.
-
-
-
-
-
-create_window() ->
- gs:window(win, gs:start(), [{width, ?WINDOW_WIDTH},
- {height, ?WINDOW_HEIGHT},
- {bg, ?DEFAULT_BG_COLOR},
- {title, "[TV] Connected nodes"},
- {configure, true},
- {destroy, true},
- {cursor, arrow},
- {keypress, true}
- ]),
- gs:menubar(menubar, win, [{bg, ?DEFAULT_BG_COLOR}
- ]),
- gs:menubutton(mbutt, menubar, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}}, % firebrick
- {label, {text, " File "}},
- {underline, 1}
- ]),
-
- % Create the actual menu!
- gs:menu(menu, mbutt, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}}]),
- gs:menuitem(menu, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}},
- {label, {text, " Close Ctrl-C "}},
- {data, close_menu},
- {underline, 1}
- ]),
-
- Xpos = 4,
- Ypos = 40,
- gs:listbox(node_listbox, win, [{x, Xpos},
- {y, Ypos},
- {width, ?WINDOW_WIDTH - 2 * Xpos},
- {height, ?WINDOW_HEIGHT - Ypos - Xpos},
- {bg, {255,255,255}},
- {vscroll, right},
- {hscroll, true},
- {click, true}
- ]).
-
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_pb.erl b/lib/tv/src/tv_pb.erl
deleted file mode 100644
index 81e7e7e2d1..0000000000
--- a/lib/tv/src/tv_pb.erl
+++ /dev/null
@@ -1,663 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. 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(tv_pb).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,frame,2}}]).
-
-
-
--export([pb/1]).
-
-
--include("tv_int_def.hrl").
--include("tv_pd_int_msg.hrl").
--include("tv_pb_int_def.hrl").
-
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function: pb.
-%%
-%% Return Value: None.
-%%
-%% Description: Process controlling the grid buttons on the display.
-%%
-%% Parameters: None.
-%%======================================================================
-
-
-pb(ParentPid) ->
- process_flag(trap_exit, true),
- ProcVars = #process_variables{parent_pid = ParentPid},
- loop(ProcVars).
-
-
-
-
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-
-
-%%======================================================================
-%% Function: loop.
-%%
-%% Return Value: None.
-%%
-%% Description: Eternal (well, almost) loop, receiving messages and
-%% handling them.
-%%
-%% Parameters:
-%%======================================================================
-
-
-loop(ProcVars) ->
- receive
- Msg ->
- case Msg of
-
- #pb_update_vbtns{} ->
- NewProcVars = update_vbtns(Msg, ProcVars),
- loop(NewProcVars);
-
- #pb_key_info{} ->
- NewProcVars = update_keys(Msg, ProcVars),
- loop(NewProcVars);
-
- #pb_update_hbtns{} ->
- NewProcVars = update_hbtns(Msg, ProcVars),
- loop(NewProcVars);
-
- #pb_set_sort_col{} ->
- NewProcVars = set_sort_col(Msg, ProcVars),
- loop(NewProcVars);
-
- #pb_remove_marks{} ->
- NewProcVars = remove_marks(ProcVars),
- loop(NewProcVars);
-
- #pb_init_btns{} ->
- NewProcVars = init_btns(Msg, ProcVars),
- loop(NewProcVars);
-
- {gs, Id, Event, Data, Args} ->
- NewProcVars = gs_messages({Id, Event, Data, Args}, ProcVars),
- loop(NewProcVars);
-
-
- {'EXIT', Pid, Reason} ->
- ParentPid = ProcVars#process_variables.parent_pid,
- exit_signals({Pid, Reason}, ParentPid, ProcVars),
- loop(ProcVars);
-
- _Other ->
- loop(ProcVars)
- end
- end.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-exit_signals(ExitInfo, ParentPid, _ProcVars) ->
- case ExitInfo of
- {ParentPid, _Reason} ->
- exit(normal);
- _Other ->
- done
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-gs_messages(Msg, ProcVars) ->
-
- case Msg of
-
- {Id, click, {hbtn, RealCol, VirtualCol}, _Args} ->
- handle_col_marking(Id, RealCol, VirtualCol, ProcVars);
-
- {Id, buttonpress, {resbtn, RealCol, VirtualCol, Xpos}, [1 | _Tail]} ->
- handle_col_resizing(Id, RealCol, VirtualCol, Xpos, ProcVars),
- ProcVars;
-
- {_Id, click, {vbtn, RealRow, VirtualRow}, _Args} ->
- handle_row_marking(RealRow, VirtualRow, ProcVars);
-
- _OtherMessage ->
- ProcVars
-
- end.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-remove_marks(ProcVars) ->
- #process_variables{col_mark_params = ColMarkP,
- row_mark_params = RowMarkP} = ProcVars,
-
- #col_mark_params{col_btn_id = BtnId,
- virtual_col_marked = VirtualCol,
- virtual_sort_col = SortCol} = ColMarkP,
-
- case BtnId of
- undefined ->
- done;
- _AnyId ->
- case VirtualCol of
- SortCol ->
- gs:config(BtnId, [{bg, ?SORT_MARK_COLOR},
- {fg, {0, 0, 0}}
- ]);
- _Other ->
- gs:config(BtnId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}}
- ])
- end
- end,
-
- NewRowMarkP = RowMarkP#row_mark_params{virtual_row_marked = undefined,
- real_row_marked = undefined
- },
- NewColMarkP = ColMarkP#col_mark_params{col_btn_id = undefined,
- virtual_col_marked = undefined
- },
- ProcVars#process_variables{col_mark_params = NewColMarkP,
- row_mark_params = NewRowMarkP
- }.
-
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-handle_col_marking(BtnId, RealCol, VirtualCol, ProcVars) ->
- #process_variables{parent_pid = PdPid,
- col_mark_params = ColMarkP,
- row_mark_params = RowMarkP} = ProcVars,
-
- #col_mark_params{col_btn_id = OldBtnId,
- virtual_col_marked = OldVirtualCol,
- virtual_sort_col = SortCol} = ColMarkP,
-
- {ColMarked, NewColMarkP} = mark_col_btn(BtnId, OldBtnId, VirtualCol,
- OldVirtualCol, RealCol, SortCol,
- ColMarkP),
-
- PdPid ! #pb_col_marked{sender = self(),
- col_marked = ColMarked,
- real_col = RealCol,
- virtual_col = VirtualCol
- },
-
- NewRowMarkP = RowMarkP#row_mark_params{virtual_row_marked = undefined,
- real_row_marked = undefined
- },
- ProcVars#process_variables{col_mark_params = NewColMarkP,
- row_mark_params = NewRowMarkP
- }.
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-handle_row_marking(RealRow, VirtualRow, ProcVars) ->
- #process_variables{parent_pid = PdPid,
- col_mark_params = ColMarkP,
- row_mark_params = RowMarkP} = ProcVars,
-
- #col_mark_params{col_btn_id = OldBtnId,
- virtual_col_marked = OldVirtualCol,
- virtual_sort_col = SortCol} = ColMarkP,
-
- {_ColMarked, NewColMarkP} = mark_col_btn(OldBtnId, OldBtnId, OldVirtualCol,
- OldVirtualCol, undefined, SortCol,
- ColMarkP),
-
- #row_mark_params{virtual_row_marked = OldVirtualRow} = RowMarkP,
-
- % Check if row shall be marked or unmarked!
- {RowMarked, NewRowMarkP} = check_marked_row(VirtualRow, OldVirtualRow, RealRow,
- RowMarkP),
-
- PdPid ! #pb_row_marked{sender = self(),
- row_marked = RowMarked,
- real_row = RealRow,
- virtual_row = VirtualRow
- },
-
- ProcVars#process_variables{row_mark_params = NewRowMarkP,
- col_mark_params = NewColMarkP}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-%% Three cases: no button previously clicked, or same button clicked,
-%% or some other button clicked.
-
-check_marked_row(NewVirtRow, undefined, RealRow, RowMarkP) ->
- % No btn already pressed!
- {true, RowMarkP#row_mark_params{virtual_row_marked = NewVirtRow,
- real_row_marked = RealRow}};
-check_marked_row(NewVirtRow, OldVirtRow, _RealRow, RowMarkP) when NewVirtRow =:= OldVirtRow ->
- % The button previously pressed has been pressed again!
- {false, RowMarkP#row_mark_params{virtual_row_marked = undefined,
- real_row_marked = undefined}};
-check_marked_row(NewVirtRow, _OldVirtRow, RealRow, RowMarkP) ->
- % A new btn has been pressed!
- {true, RowMarkP#row_mark_params{virtual_row_marked = NewVirtRow,
- real_row_marked = RealRow}}.
-
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-set_sort_col(Msg, ProcVars) ->
- #pb_set_sort_col{virtual_col = SortCol} = Msg,
- tv_pb_funcs:set_new_sort_col(SortCol, ProcVars).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-%% Three cases: no button previously clicked, or same button clicked,
-%% or some other button clicked.
-
-mark_col_btn(NewId, undefined, NewVirtCol, _OldVirtCol, _RealCol, _SortCol, ColMarkP) ->
- % No btn already pressed!
- gs:config(NewId, [{bg, ?COL_MARK_COLOR},
- {fg, {255, 255, 255}}
- ]),
- {true, ColMarkP#col_mark_params{col_btn_id = NewId,
- virtual_col_marked = NewVirtCol}};
-mark_col_btn(NewId, _OldId, NewVirtCol, OldVirtCol, _RealCol, SortCol, ColMarkP) when NewVirtCol =:= OldVirtCol, NewVirtCol =:= SortCol ->
- % The button previously pressed has been pressed again!
- gs:config(NewId, [{bg, ?SORT_MARK_COLOR},
- {fg, {0, 0, 0}}
- ]),
- {false, ColMarkP#col_mark_params{col_btn_id = undefined,
- virtual_col_marked = undefined}};
-mark_col_btn(NewId, _OldId, NewVirtCol, OldVirtCol, _RealCol, _SortCol, ColMarkP) when NewVirtCol =:= OldVirtCol ->
- % The button previously pressed has been pressed again!
- gs:config(NewId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}}
- ]),
- {false, ColMarkP#col_mark_params{col_btn_id = undefined,
- virtual_col_marked = undefined}};
-mark_col_btn(NewId, OldId, NewVirtCol, _OldVirtCol, _RealCol, _SortCol, ColMarkP) ->
- % A new btn has been pressed!
- gs:config(OldId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}}
- ]),
- gs:config(NewId, [{bg, ?COL_MARK_COLOR},
- {fg, {255, 255, 255}}
- ]),
- {true, ColMarkP#col_mark_params{col_btn_id = NewId,
- virtual_col_marked = NewVirtCol}}.
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-handle_col_resizing(RbtnId, RealCol, VirtualCol, Xpos, ProcVars) ->
- gs:config(RbtnId, [{motion, true}]),
- #process_variables{parent_pid = ParentPid,
- grid_frame_id = GrFrId,
- grid_frame_height = Height,
- hbtn_height = HbtnH,
- resbtn_width = RbtnW,
- cols_shown = ColsShown} = ProcVars,
-
- LineId = gs:frame(GrFrId, [{width, 1},
- {height, Height - HbtnH},
- {x, Xpos},
- {y, HbtnH - 1},
- {bg, ?DEFAULT_BG_COLOR}
- ]),
- MinColWidth = RbtnW,
-
- OldColWidth = lists:nth(RealCol, ColsShown),
- Xdiff = get_xdiff(RbtnId, 1, 0, LineId, Xpos, MinColWidth - OldColWidth),
-
- ParentPid ! #pb_new_colwidth{sender = self(),
- real_col = RealCol,
- virtual_col = VirtualCol,
- xdiff = Xdiff},
-
- gs:config(RbtnId, [{motion, false}]),
- gs:destroy(LineId).
-
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_xdiff(Id, Btn, LastXdiff, LineId, LineXpos, MinAllowedXdiff) ->
- receive
- {gs, Id, motion, {resbtn, _RealCol, _VirtCol, _OldXpos}, [NewXdiff | _T]} ->
- UsedXdiff = erlang:max(MinAllowedXdiff, NewXdiff),
- gs:config(LineId, [{x, LineXpos + UsedXdiff}]),
- get_xdiff(Id, Btn, UsedXdiff, LineId, LineXpos, MinAllowedXdiff);
- {gs, Id, buttonrelease, _Data, [Btn | _T]} ->
- LastXdiff;
- {gs, Id, buttonrelease, _Data, _Args} ->
- get_xdiff(Id, Btn, LastXdiff, LineId, LineXpos, MinAllowedXdiff);
- {gs, Id, buttonpress, _Data, _Args} ->
- get_xdiff(Id, Btn, LastXdiff, LineId, LineXpos, MinAllowedXdiff)
- end.
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-init_btns(Msg, ProcVars) ->
- #pb_init_btns{parent_id = ParentId,
- parent_width = Width,
- parent_height = Height,
- ypos = Ypos,
- hbtn_height = HbtnH,
- resbtn_width = RbtnW,
- vbtn_width = VbtnW,
- nof_rows = NofRows,
- row_height = RowHeight,
- first_col_shown = FirstColShown,
- cols_shown = ColsShown} = Msg,
-
- NewProcVars = tv_pb_funcs:init_btns(ParentId, Ypos, HbtnH, VbtnW, RbtnW,
- FirstColShown, ColsShown, NofRows,
- RowHeight, ProcVars),
-
- gs:frame(ParentId, [{bg, {0, 0, 0}},
- {bw, 0},
- {width, 1300},
- {height, 1},
- {x, 0},
- {y, Ypos - 1}
- ]),
- NewProcVars#process_variables{grid_frame_width = Width,
- grid_frame_height = Height
- }.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_hbtns(Msg, ProcVars) ->
- #pb_update_hbtns{parent_width = Width,
- parent_height = Height,
- first_col_shown = FirstColShown,
- cols_shown = ColsShown} = Msg,
-
- NewProcVars = tv_pb_funcs:update_hbtns(FirstColShown, ColsShown, ProcVars),
-
- NewProcVars#process_variables{grid_frame_width = Width,
- grid_frame_height = Height
- }.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_vbtns(Msg, ProcVars) ->
- #pb_update_vbtns{color_list = Colors,
- first_row_shown = FirstRowShown,
- nof_rows_shown = NofRowsShown,
- blinking_enabled = BlinkEnabled} = Msg,
-
- tv_pb_funcs:update_vbtns(NofRowsShown, FirstRowShown, Colors, BlinkEnabled,
- ProcVars).
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_keys(Msg, ProcVars) ->
- #pb_key_info{list_of_keys = KeyList} = Msg,
- tv_pb_funcs:update_keys(KeyList, ProcVars).
diff --git a/lib/tv/src/tv_pb_funcs.erl b/lib/tv/src/tv_pb_funcs.erl
deleted file mode 100644
index 24d1120597..0000000000
--- a/lib/tv/src/tv_pb_funcs.erl
+++ /dev/null
@@ -1,1056 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. 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(tv_pb_funcs).
--compile([{nowarn_deprecated_function,{gs,button,2}},
- {nowarn_deprecated_function,{gs,canvas,2}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,read,2}}]).
-
-
-
--export([init_btns/10,
- update_hbtns/3,
- update_vbtns/5,
- update_keys/2,
- set_new_sort_col/2]).
-
-
--include("tv_int_def.hrl").
--include("tv_pb_int_def.hrl").
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-
-init_btns(ParentId, Ypos, HbtnH,
- VbtnW, ResbtnW, FirstColShown, ColsShown, NofRows, RowH, ProcVars) ->
-
- #process_variables{key_numbers = KeyNos,
- key_ids = KeyIds} = ProcVars,
-
-% C = gs:canvas(ParentId, [{width, VbtnW - 1},
-% {height, HbtnH},
-% {x, 0},
-% {y, HbtnH + 1},
-% {bg, white}
-% ]),
-% gs:create(image, C, [{load_gif, "erlang.gif"}]),
-
- {HbtnsShown, ResBtnsShown} = update_hbtns(ColsShown, [], [],
- FirstColShown, ParentId, Ypos,
- HbtnH, ResbtnW, VbtnW),
-
- NewKeyIds = update_keys(KeyNos, KeyIds, FirstColShown,
- FirstColShown + length(ColsShown) - 1, HbtnsShown,
- ParentId, []),
-
- VbtnsShown = create_vbtns(ParentId, Ypos, NofRows, RowH, VbtnW, HbtnH),
- ProcVars#process_variables{grid_frame_id = ParentId,
- ypos = Ypos,
- hbtn_height = HbtnH,
- vbtn_width = VbtnW,
- resbtn_width = ResbtnW,
- first_col_shown = FirstColShown,
- hbtns_shown = HbtnsShown,
- resbtns_shown = ResBtnsShown,
- vbtns_shown = VbtnsShown,
- cols_shown = ColsShown,
- key_ids = NewKeyIds
- }.
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_hbtns(FirstColShown, ColsShown, ProcVars) ->
- #process_variables{grid_frame_id = ParentId,
- first_col_shown = OldFirstColShown,
- cols_shown = OldColsShown,
- ypos = Ypos,
- hbtn_height = HbtnH,
- vbtn_width = VbtnW,
- resbtn_width = ResbtnW,
- hbtns_shown = HbtnsShown,
- resbtns_shown = ResbtnsShown,
- key_numbers = KeyNos,
- key_ids = KeyIds,
- col_mark_params = ColMarkP} = ProcVars,
-
- % Only if the grid has been scrolled horizontally need we move the
- % col mark!
- case FirstColShown of
- OldFirstColShown ->
- done;
- _NewValue ->
- #col_mark_params{col_btn_id = MarkedBtnId,
- virtual_col_marked = ColMarked,
- sort_btn_id = SortBtnId,
- virtual_sort_col = SortCol} = ColMarkP,
- unmark_marked_col(MarkedBtnId, ColMarked, SortCol),
- unmark_sort_col(SortBtnId, ColMarked, SortCol)
- end,
-
- {NewHbtns, NewResbtns, NewKeys} =
- case {FirstColShown, ColsShown} of
- {OldFirstColShown, OldColsShown} ->
- {HbtnsShown, ResbtnsShown, KeyIds};
- _Other ->
- {NewHbtnsShown, NewResbtnsShown} = update_hbtns(ColsShown,
- HbtnsShown,
- ResbtnsShown,
- FirstColShown,
- ParentId,
- Ypos,
- HbtnH,
- ResbtnW,
- VbtnW),
- NewKeyIds = update_keys(KeyNos, KeyIds, FirstColShown,
- FirstColShown + length(ColsShown) - 1,
- NewHbtnsShown, ParentId, []),
- {NewHbtnsShown, NewResbtnsShown, NewKeyIds}
- end,
-
- % Now mark the marked column again!
- NewColMarkP = mark_marked_col(NewHbtns, FirstColShown, ColMarkP),
-
- ProcVars#process_variables{first_col_shown = FirstColShown,
- hbtns_shown = NewHbtns,
- resbtns_shown = NewResbtns,
- cols_shown = ColsShown,
- key_ids = NewKeys,
- col_mark_params = NewColMarkP
- }.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_vbtns(NofRowsShown, FirstRowShown, Colors, BlinkEnabled, ProcVars) ->
- #process_variables{vbtns_shown = Vbtns,
- blink_color_list = BlinkList} = ProcVars,
-
- update_vbtns(1, NofRowsShown, FirstRowShown, Vbtns, Colors, BlinkEnabled, BlinkList),
- NewProcVars = update_sort_btn_mark(ProcVars),
- NewProcVars.
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-set_new_sort_col(SortCol, ProcVars) ->
- #process_variables{hbtns_shown = HbtnsShown,
- col_mark_params = ColMarkP} = ProcVars,
-
- #col_mark_params{col_btn_id = MarkedColBtnId,
- sort_btn_id = OldSortBtnId} = ColMarkP,
-
- % Set the new color of the sort btn, and remove the mark, if it is the same
- % column!
-
- case MarkedColBtnId of
- undefined ->
- done;
- _AnyId ->
- gs:config(MarkedColBtnId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}}
- ])
- end,
-
- SortBtnId = get_btn_id(SortCol, HbtnsShown),
- case SortBtnId of
- undefined ->
- % The btn isn't visible, or no sorting shall be performed!
- gs:config(OldSortBtnId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}}
- ]);
- _Other ->
- % Unmark the old sort btn id!
- gs:config(OldSortBtnId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}}
- ]),
- gs:config(SortBtnId, [{bg, ?SORT_MARK_COLOR},
- {fg, {0, 0, 0}}
- ])
- end,
-
- NewColMarkP = ColMarkP#col_mark_params{col_btn_id = undefined,
- virtual_col_marked = undefined,
- sort_btn_id = SortBtnId,
- virtual_sort_col = SortCol
- },
- ProcVars#process_variables{col_mark_params = NewColMarkP}.
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_keys(KeyList, ProcVars) ->
- #process_variables{key_numbers = OldKeyList,
- key_ids = KeyIds,
- first_col_shown = FirstColShown,
- cols_shown = ColsShown,
- hbtns_shown = HbtnsShown,
- grid_frame_id = ParentId} = ProcVars,
-
- NewKeyIds = case KeyList of
- OldKeyList ->
- KeyIds;
- NewKeyList ->
- update_keys(NewKeyList, KeyIds, FirstColShown,
- FirstColShown + length(ColsShown) - 1,
- HbtnsShown, ParentId, [])
- end,
-
- ProcVars#process_variables{key_numbers = KeyList,
- key_ids = NewKeyIds
- }.
-
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-unmark_sort_col(undefined, _ColMarked, _SortCol) ->
- done;
-unmark_sort_col(SortBtnId, _ColMarked, _SortCol) ->
- gs:config(SortBtnId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}}
- ]).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_marked_col(HbtnsShown, _FirstColShown, ColMarkP) ->
- #col_mark_params{virtual_col_marked = VirtualCol,
- virtual_sort_col = SortCol} = ColMarkP,
-
- {NewMarkBtnId, NewSortBtnId} =
- case VirtualCol of
- SortCol ->
- % Same btn!
- BtnId = get_btn_id(VirtualCol,
- HbtnsShown),
- gs:config(BtnId, [{bg, ?SORT_MARK_COLOR},
- {fg, {0, 0, 0}}
- ]),
- {BtnId, BtnId};
- _OtherCol ->
- MarkBtnId = get_btn_id(VirtualCol, HbtnsShown),
- case MarkBtnId of
- undefined ->
- done;
- _Else ->
- gs:config(MarkBtnId, [{bg, ?COL_MARK_COLOR},
- {fg, {255, 255, 255}}
- ])
- end,
-
- SortBtnId = get_btn_id(SortCol, HbtnsShown),
- case SortBtnId of
- undefined ->
- done;
- _OtherId ->
- gs:config(SortBtnId, [{bg, ?SORT_MARK_COLOR},
- {fg, {0, 0, 0}}
- ])
- end,
-
- {MarkBtnId, SortBtnId}
- end,
-
- ColMarkP#col_mark_params{col_btn_id = NewMarkBtnId,
- sort_btn_id = NewSortBtnId}.
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-unmark_marked_col(undefined, _ColMarked, _SortCol) ->
- done;
-unmark_marked_col(BtnId, _ColMarked, _SortCol) ->
- gs:config(BtnId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}}
- ]).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_sort_btn_mark(ProcVars) ->
- #process_variables{hbtns_shown = HbtnsShown,
- col_mark_params = ColMarkP} = ProcVars,
-
- #col_mark_params{col_btn_id = MarkedColBtnId,
- virtual_col_marked = ColMarked,
- sort_btn_id = OldSortBtnId,
- virtual_sort_col = SortCol} = ColMarkP,
-
- {NewMarkedColBtnId, NewColMarked} = case ColMarked of
- SortCol ->
- {undefined, undefined};
- _Other ->
- {MarkedColBtnId, ColMarked}
- end,
-
- NewSortBtnId = set_sort_btn_color(OldSortBtnId, SortCol, HbtnsShown),
-
- NewColMarkP = ColMarkP#col_mark_params{col_btn_id = NewMarkedColBtnId,
- virtual_col_marked = NewColMarked,
- sort_btn_id = NewSortBtnId},
-
- ProcVars#process_variables{col_mark_params = NewColMarkP}.
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_btn_id(VirtualCol, HbtnsShown) ->
- case lists:keysearch(VirtualCol, #hbtn.virtual_col, HbtnsShown) of
- false ->
- undefined;
- {value, HbtnRec} ->
- HbtnRec#hbtn.id
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-set_sort_btn_color(undefined, SortCol, HbtnsShown) ->
- case lists:keysearch(SortCol, #hbtn.virtual_col, HbtnsShown) of
- false ->
- undefined;
- {value, HbtnRec} ->
- BtnId = HbtnRec#hbtn.id,
- gs:config(BtnId, [{bg, ?SORT_MARK_COLOR}]),
- BtnId
- end;
-set_sort_btn_color(BtnId, undefined, _HbtnsShown) ->
- gs:config(BtnId, [{bg, ?DEFAULT_BG_COLOR}]);
-set_sort_btn_color(OldSortBtnId, SortCol, HbtnsShown) ->
- case gs:read(OldSortBtnId, bg) of
- SortCol ->
- % Btn is already marked!
- OldSortBtnId;
- _OtherColor ->
- % Unmark old btn, mark new btn, if visible.
- gs:config(OldSortBtnId, [{bg, ?DEFAULT_BG_COLOR}]),
- case lists:keysearch(SortCol, #hbtn.virtual_col, HbtnsShown) of
- false ->
- undefined;
- {value, HbtnRec} ->
- BtnId = HbtnRec#hbtn.id,
- gs:config(BtnId, [{bg, ?SORT_MARK_COLOR}]),
- BtnId
- end
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_vbtns(N, NofRowsShown, _VirtualRowNo,
- _Vbtns, _Colors, _BlinkEnabled, _BlinkList) when N > NofRowsShown ->
- done;
-update_vbtns(_N, _NofRowsShown, _VirtualRowNo, [], [], _BlinkEnabled, _BlinkList) ->
- done;
-update_vbtns(_N, _NofRowsShown, _VirtualRowNo, [], _Colors, _BlinkEnabled, _BlinkList) ->
- % Right now we don't bother with dynamically creating row buttons:
- % we ought too know in advance the maximum number of rows that can
- % be visible.
- io:format("Configuration error: too few rows in grid.~n"),
- done;
-update_vbtns(N, NofRowsShown,
- VirtualRowNo, [VbtnRec | VT], [], BlinkEnabled, BlinkList) ->
- VbtnId = VbtnRec#vbtn.id,
- gs:config(VbtnId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, ?BLACK},
- {label, {text, integer_to_list(VirtualRowNo)}},
- {data, {vbtn, N, VirtualRowNo}} % Real row + virtual row
- ]),
- update_vbtns(N + 1, NofRowsShown, VirtualRowNo + 1,VT, [], BlinkEnabled,
- BlinkList);
-update_vbtns(N, NofRowsShown,
- VirtualRowNo, [VbtnRec | VT], [Color | CT], true, BlinkList) ->
- VbtnId = VbtnRec#vbtn.id,
- {Text, TextColor} = get_vbtn_text_and_textcolor(Color, VirtualRowNo),
- case lists:member(Color, BlinkList) of
- true ->
- gs:config(VbtnId, [{bg, Color},
- {fg, TextColor},
- {label, {text, Text}},
- {data, {vbtn, N, VirtualRowNo}}, % Real + virtual row
- flash
- ]);
- false ->
- gs:config(VbtnId, [{bg, Color},
- {fg, TextColor},
- {label, {text, Text}},
- {data, {vbtn, N, VirtualRowNo}} % Real + virtual row
- ])
- end,
- update_vbtns(N + 1, NofRowsShown, VirtualRowNo + 1, VT, CT, true, BlinkList);
-update_vbtns(N, NofRowsShown,
- VirtualRowNo, [VbtnRec | VT], [Color | CT], false, BlinkList) ->
- VbtnId = VbtnRec#vbtn.id,
- {Text, TextColor} = get_vbtn_text_and_textcolor(Color, VirtualRowNo),
- gs:config(VbtnId, [{bg, Color},
- {fg, TextColor},
- {label, {text, Text}},
- {data, {vbtn, N, VirtualRowNo}} % Real row + virtual row
- ]),
- update_vbtns(N + 1, NofRowsShown, VirtualRowNo + 1, VT, CT, false, BlinkList).
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_vbtn_text_and_textcolor(?BLACK, N) ->
- {integer_to_list(N), ?WHITE};
-get_vbtn_text_and_textcolor(?RED1, N) ->
- {integer_to_list(N), ?BLACK};
-get_vbtn_text_and_textcolor(?RED2, N) ->
- {integer_to_list(N), ?BLACK};
-get_vbtn_text_and_textcolor(?RED3, N) ->
- {integer_to_list(N), ?BLACK};
-get_vbtn_text_and_textcolor(?RED4, N) ->
- {integer_to_list(N), ?BLACK};
-get_vbtn_text_and_textcolor(?RED5, N) ->
- {integer_to_list(N), ?BLACK};
-get_vbtn_text_and_textcolor(?GREEN1, N) ->
- {integer_to_list(N), ?BLACK};
-get_vbtn_text_and_textcolor(?GREEN2, N) ->
- {integer_to_list(N), ?BLACK};
-get_vbtn_text_and_textcolor(?GREEN3, N) ->
- {integer_to_list(N), ?BLACK};
-get_vbtn_text_and_textcolor(?GREEN4, N) ->
- {integer_to_list(N), ?BLACK};
-get_vbtn_text_and_textcolor(?GREEN5, N) ->
- {integer_to_list(N), ?BLACK};
-get_vbtn_text_and_textcolor(_AnyOtherColor, N) ->
- {integer_to_list(N), ?BLACK}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_vbtns(ParentId, Ypos, NofRows, RowHeight, VbtnW, HbtnH) ->
- create_vbtns(1, NofRows, RowHeight, ParentId, VbtnW, Ypos + HbtnH, []).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_vbtns(N, NofRows, _RowHeight, _ParId, _VbtnW, _Ypos, VAcc) when N > NofRows ->
- lists:reverse(VAcc);
-create_vbtns(N, NofRows, RowHeight, ParId, VbtnW, Ypos, VAcc) ->
- VHeight = RowHeight + 1,
- VInfo = create_one_vbtn(ParId, VHeight, VbtnW, Ypos, N),
- create_vbtns(N + 1, NofRows, RowHeight, ParId, VbtnW, Ypos + VHeight,
- [VInfo | VAcc]).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_one_vbtn(ParentId, Height, VbtnW, Ypos, N) ->
- Id = gs:button(ParentId, [{width, VbtnW},
- {height, Height},
- {x, 0},
- {y, Ypos},
- {font, ?BTN_FONT},
- {bg, ?DEFAULT_BG_COLOR},
- {align, center},
- {label, {text,integer_to_list(N)}},
- {data, {vbtn, N, N}} % Real row + virtual row
- ]),
- #vbtn{virtual_row = N,
- real_row = N,
- id = Id,
- height = Height,
- ypos = Ypos}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_hbtns([], _HBtnsShown,
- _ResBtns, _VirtualColNo, _FrId, _Ypos, _HbtnH, _ResBtnW, _VbtnW) ->
- {[], []};
-update_hbtns(ColsShown, HBtns,
- ResBtns, VirtualColNo, FrId, Ypos, HbtnH, ResBtnW, VbtnW) ->
- update_hbtns(1, ColsShown, HBtns, ResBtns, HbtnH, ResBtnW, VbtnW,
- VirtualColNo, FrId, 0, Ypos, [], []).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_hbtns(_N, [],
- [], [], _HbtnH, _ResBtnW, _VbtnW, _ColNo, _FrId, _Xpos, _Ypos, HAcc, RAcc) ->
- {lists:reverse(HAcc), lists:reverse(RAcc)};
-
-update_hbtns(N, [], [HInfo | HT], [RInfo | RT],
- HbtnH, ResBtnW, VbtnW, ColNo, FrId, Xpos, Ypos, HAcc, RAcc) ->
- % If too many buttons, i.e., if the ColsShown list
- % has become empty.
- gs:destroy(HInfo#hbtn.id),
- gs:destroy(RInfo#resbtn.id),
- update_hbtns(N, [], HT, RT, HbtnH, ResBtnW, VbtnW, ColNo, FrId,
- Xpos, Ypos, HAcc, RAcc);
-
-update_hbtns(1, [ColW | T], [], [],
- HbtnH, ResBtnW, VbtnW, ColNo, FrId, _Xpos, Ypos, HAcc, RAcc) ->
- % The first button has to be bigger than the others.
- {HInfo, RInfo} = create_one_hbtn_and_resbtn(FrId, ColW - 2,
- HbtnH, VbtnW - 1,
- Ypos, ResBtnW, 1, ColNo),
- update_hbtns(2, T, [], [], HbtnH, ResBtnW, VbtnW, ColNo + 1,
- FrId, VbtnW - 1 + ColW - 2 + ResBtnW, Ypos, [HInfo | HAcc],
- [RInfo | RAcc]);
-
-update_hbtns(N, [ColW | T], [], [],
- HbtnH, ResBtnW, VbtnW, ColNo, FrId, Xpos, Ypos, HAcc, RAcc) ->
- {HInfo, RInfo} = create_one_hbtn_and_resbtn(FrId, ColW - 4,
- HbtnH, Xpos,
- Ypos, ResBtnW, N, ColNo),
- update_hbtns(N + 1, T, [], [], HbtnH, ResBtnW, VbtnW, ColNo + 1,
- FrId, Xpos + ColW - 4 + ResBtnW, Ypos, [HInfo | HAcc],
- [RInfo | RAcc]);
-
-update_hbtns(1, [ColW | T], [HInfo | HT], [RInfo | RT],
- HbtnH, ResBtnW, VbtnW, ColNo, FrId, _Xpos, Ypos, HAcc, RAcc) ->
- {NewHInfo, NewRInfo} = config_one_hbtn_and_resbtn(HInfo, RInfo,
- ColW - 2,
- VbtnW - 1,
- 1, ColNo),
- update_hbtns(2, T, HT, RT, HbtnH, ResBtnW, VbtnW, ColNo + 1,
- FrId, VbtnW - 1 + ColW - 2 + ResBtnW, Ypos,
- [NewHInfo | HAcc], [NewRInfo | RAcc]);
-
-update_hbtns(N, [ColW | T], [HInfo | HT], [RInfo | RT],
- HbtnH, ResBtnW, VbtnW, ColNo, FrId, Xpos, Ypos, HAcc, RAcc) ->
- {NewHInfo, NewRInfo} = config_one_hbtn_and_resbtn(HInfo, RInfo,
- ColW - 4,
- Xpos, N,
- ColNo),
- update_hbtns(N + 1, T, HT, RT, HbtnH, ResBtnW, VbtnW, ColNo + 1,
- FrId, Xpos + ColW - 4 + ResBtnW, Ypos, [NewHInfo | HAcc],
- [NewRInfo | RAcc]).
-
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_one_hbtn_and_resbtn(ParId, HWidth, HHeight, HXpos, Ypos, RWidth, N, ColNo) ->
- HId = gs:button(ParId, [{width, HWidth},
- {height, HHeight},
- {x, HXpos},
- {y, Ypos},
- {font, ?BTN_FONT},
- {bg, ?DEFAULT_BG_COLOR},
- {data, {hbtn, N, ColNo}},
- {label, {text, integer_to_list(ColNo)}}
- ]),
- RId = gs:button(ParId, [{width, RWidth},
- {height, HHeight},
- {x, HXpos + HWidth},
- {y, Ypos},
- {cursor, resize},
- {buttonpress, true},
- {buttonrelease, true},
- {data, {resbtn, N, ColNo, (HXpos + HWidth + RWidth div 2)}},
- {bg, ?BLACK}
- ]),
- HInfo = #hbtn{virtual_col = ColNo,
- real_col = N,
- id = HId,
- width = HWidth,
- xpos = HXpos},
- RInfo = #resbtn{virtual_col = ColNo,
- real_col = N,
- id = RId,
- width = RWidth,
- xpos = HXpos + HWidth},
- {HInfo, RInfo}.
-
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-config_one_hbtn_and_resbtn(HInfo, RInfo, HWidth, HXpos, N, ColNo) ->
- gs:config(HInfo#hbtn.id, [{width, HWidth},
- {x, HXpos},
- {data, {hbtn, N, ColNo}},
- {label, {text, integer_to_list(ColNo)}}
- ]),
- gs:config(RInfo#resbtn.id, [{x, HXpos + HWidth},
- {data, {resbtn, N, ColNo,
- (HXpos + HWidth + RInfo#resbtn.width div 2)}}
- ]),
- NewHInfo = HInfo#hbtn{virtual_col = ColNo,
- width = HWidth,
- xpos = HXpos},
- NewRInfo = RInfo#resbtn{virtual_col = ColNo,
- xpos = HXpos + HWidth},
- {NewHInfo, NewRInfo}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_keys([], [], _FirstCol, _LastCol, _HBtns, _ParentId, KeyIdsAcc) ->
- lists:reverse(KeyIdsAcc);
-
-update_keys([], [KeyId | IdT], FirstCol, LastCol, HBtns, ParentId, KeyIdsAcc) ->
- gs:config(KeyId, [{x, 1200}]),
- update_keys([], IdT, FirstCol, LastCol, HBtns, ParentId,
- [KeyId | KeyIdsAcc]);
-
-update_keys([KeyNo | KT], [], FirstCol, LastCol,
- HBtns,ParentId, KeyIdsAcc) when KeyNo >= FirstCol, KeyNo =< LastCol ->
- {_Width, Xpos} = get_keywidth_and_pos(KeyNo, FirstCol, HBtns),
- NewKeyId = create_key(ParentId, Xpos, 1),
- update_keys(KT, [], FirstCol, LastCol, HBtns, ParentId,
- [NewKeyId | KeyIdsAcc]);
-
-update_keys([_KeyNo | KT], [], FirstCol, LastCol, HBtns, ParentId, KeyIdsAcc) ->
- update_keys(KT, [], FirstCol, LastCol, HBtns, ParentId,
- KeyIdsAcc);
-
-update_keys([KeyNo | KT], [KeyId | IdT], FirstCol, LastCol,
- HBtns, ParentId, KeyIdsAcc) when KeyNo >= FirstCol, KeyNo =< LastCol ->
- {Width, Xpos} = get_keywidth_and_pos(KeyNo, FirstCol, HBtns),
- gs:config(KeyId, [{width, Width},
- {x, Xpos}
- ]),
- update_keys(KT, IdT, FirstCol, LastCol, HBtns, ParentId,
- [KeyId | KeyIdsAcc]);
-
-update_keys([_KeyNo | KT],
- [KeyId | IdT], FirstCol, LastCol, HBtns, ParentId, KeyIdsAcc) ->
- update_keys(KT, [KeyId | IdT], FirstCol, LastCol, HBtns, ParentId,
- KeyIdsAcc).
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_keywidth_and_pos(VirtualCol, FirstCol, HBtns) ->
- RealColNo = VirtualCol - FirstCol + 1,
- HBtnR = lists:nth(RealColNo, HBtns),
- #hbtn{width = Width,
- xpos = Xpos} = HBtnR,
- KeyWidth = 10,
- % Compute the x position for the key!
- KeyXpos = (Xpos + (Width div 2) - (KeyWidth div 2)),
- {KeyWidth, KeyXpos}.
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_key(ParentId, Xpos, Ypos) ->
- PicDir = code:priv_dir(tv),
- C = gs:canvas(ParentId, [{width, 10},
- {height, 18},
- {x, Xpos},
- {y, Ypos},
- {bg, ?DEFAULT_BG_COLOR}
- ]),
- gs:create(image, C, [{bitmap, PicDir ++ "/key.xbm"}]),
- C.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_pb_int_def.hrl b/lib/tv/src/tv_pb_int_def.hrl
deleted file mode 100644
index 0fe9df193a..0000000000
--- a/lib/tv/src/tv_pb_int_def.hrl
+++ /dev/null
@@ -1,99 +0,0 @@
-%%
-%% %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%
-
--define(WHITE, {255,255,255}).
-
--define(DEFAULT_BG_COLOR, {217,217,217}).
-
--define(COL_MARK_COLOR, {0, 0, 0}).
--define(SORT_MARK_COLOR, {255,215,0}).
-
--define(BLINK_COLOR1, {255,0,0}).
--define(BLINK_COLOR2, {0,255,0}).
--define(BLINK_COLOR3, {0,0,0}).
--define(BTN_FONT, {courier,12}).
-
-
-
-
--record(col_mark_params, {col_btn_id,
- virtual_col_marked,
- sort_btn_id,
- virtual_sort_col
- }).
-
-
-
--record(row_mark_params, {virtual_row_marked,
- real_row_marked
- }).
-
-
-
-
--record(process_variables, {parent_pid,
- grid_frame_id,
- grid_frame_width,
- grid_frame_height,
- ypos,
- hbtn_height,
- vbtn_width,
- resbtn_width,
- first_col_shown,
- hbtns_shown = [],
- vbtns_shown = [],
- resbtns_shown = [],
- cols_shown = [],
- key_numbers = [],
- key_ids = [],
- blink_color_list = [?BLINK_COLOR1,
- ?BLINK_COLOR2,
- ?BLINK_COLOR3],
- col_mark_params = #col_mark_params{},
- row_mark_params = #row_mark_params{}
- }).
-
-
-
--record(hbtn, {virtual_col,
- real_col,
- id,
- width,
- xpos
- }).
-
-
-
--record(resbtn, {virtual_col,
- real_col,
- id,
- width,
- xpos
- }).
-
-
-
--record(vbtn, {virtual_row,
- real_row,
- id,
- height,
- ypos
- }).
-
-
-
diff --git a/lib/tv/src/tv_pc.erl b/lib/tv/src/tv_pc.erl
deleted file mode 100644
index e0612e13eb..0000000000
--- a/lib/tv/src/tv_pc.erl
+++ /dev/null
@@ -1,795 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. 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%
-%%%*********************************************************************
-%%%
-%%% Description: pc part of the table tool, i.e., the process
-%%% controlling all other processes, and managing
-%%% the actions to take.
-%%%
-%%%*********************************************************************
-
-
--module(tv_pc).
--compile([{nowarn_deprecated_function,{gs,config,2}}]).
-
-
-
--export([pc/7,
- send_data/2
- ]).
-
-
-
--include("tv_int_def.hrl").
--include("tv_int_msg.hrl").
--include("tv_pc_int_def.hrl").
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-%%======================================================================
-%% Function: pc.
-%%
-%% Return Value: None.
-%%
-%% Description: Process controlling the processes 'pd', 'pw', 'dbs' and 'etsread'.
-%% After necessary initialisations, an eternal loop is
-%% entered, where window created messages are received and
-%% handled, as well as user input.
-%%
-%% Parameters:
-%%======================================================================
-
-
-pc(Master, Node, LocalNode, TableId, KindOfTable, TableName, ErrMsgMode) ->
- process_flag(trap_exit, true),
- put(error_msg_mode, ErrMsgMode),
- ProcVars = prepare_and_open_table(Node, LocalNode, TableId, KindOfTable, TableName,
- false, #process_variables{parent_pid=Master}),
- loop(ProcVars).
-
-
-
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-
-
-prepare_and_open_table(Node, LocalNode, TabId, TabType, TabName, Raise, ProcVars) ->
- IpPid = spawn(tv_ip, ip, [self()]),
- show_progress(IpPid, 5, "Initializing graphics..."),
-
- TmpProcVars = start_procs(IpPid, ProcVars),
-
- show_progress(IpPid, 5, "Loading table..."),
- NewProcVars = ?MENU_FUNC_FILE:open_table(Node, LocalNode, TabId, TabType, TabName,
- Raise, TmpProcVars),
-
- IpPid ! #ip_quit{sender = self()},
- % Now make window visible!
- WinP = NewProcVars#process_variables.window_params,
- gs:config(WinP#window_params.window_id, [{map, true}]),
- NewProcVars.
-
-
-
-
-
-start_procs(IpPid, ProcVars) ->
- ErrorMsgMode = get(error_msg_mode),
- PwPid = spawn_link(tv_pw, pw, [self()]),
- PdPid = spawn_link(tv_pd, pd, [self(), ErrorMsgMode]),
- DbsPid = spawn_link(tv_db, dbs, [self(), ErrorMsgMode]),
- EtsreadPid = spawn_link(tv_etsread, etsread, [self(), ErrorMsgMode]),
-
- show_progress(IpPid, 5, "Initializing graphics..."),
- NewWinP = init_pw(PwPid, ProcVars),
-
- show_progress(IpPid, 5, "Initializing graphics..."),
- init_pd(PdPid, NewWinP),
- ProcVars#process_variables{pw_pid = PwPid,
- pd_pid = PdPid,
- dbs_pid = DbsPid,
- etsread_pid = EtsreadPid,
- current_node = node(), %% Will be replaced, when table opened.
- local_node = true,
- window_params = NewWinP
- }.
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-show_progress(IpPid, NofElements, Text) ->
- IpPid ! #ip_update{sender = self(),
- nof_elements_to_mark = NofElements,
- text = Text
- }.
-
-
-
-
-
-
-
-%%======================================================================
-%% Function: loop.
-%%
-%% Return Value: None.
-%%
-%% Description: Eternal (well, almost) loop, receiving messages and
-%% handling them.
-%%
-%% Parameters: None.
-%%======================================================================
-
-
-loop(ProcVars) ->
- receive
- Msg ->
- case Msg of
-
- % Normal messages!
- #dbs_subset{} ->
- NewProcVars1 = send_data(Msg, ProcVars),
- NewProcVars2 = check_time_to_poll_table(Msg, NewProcVars1),
- loop(NewProcVars2);
-
- #pc_poll_table{} ->
- TmpProcVars = check_node(ProcVars),
- NewProcVars = ?MENU_FUNC_FILE:poll_table(TmpProcVars),
- loop(NewProcVars);
-
- #pc_search_req{} ->
- DbsPid = ProcVars#process_variables.dbs_pid,
- DbsPid ! #dbs_search_req{sender=self()},
- loop(ProcVars);
-
- #pc_set_sorting_mode{} ->
- set_sorting_mode(Msg, ProcVars),
- loop(ProcVars);
-
-
- #pc_data_req{element = Pos, nof_elements = Length} ->
- DbsPid = ProcVars#process_variables.dbs_pid,
- DbsPid ! #dbs_subset_req{sender = self(),
- subset_pos = Pos,
- subset_length = Length
- },
- loop(ProcVars);
-
-
- #pc_marked_row{row_no=RowNo, object=Obj, color=Color} ->
- DbsPid = ProcVars#process_variables.dbs_pid,
- DbsPid ! #dbs_marked_row{sender = self(),
- row_no = RowNo
- },
- NewProcVars = ProcVars#process_variables{marked_row = RowNo,
- marked_object = Obj,
- marked_color = Color},
- loop(NewProcVars);
-
-
- #pc_menu_msg{} ->
- Fcn = Msg#pc_menu_msg.data,
- NewProcVars = ?MENU_FUNC_FILE:Fcn(ProcVars),
- loop(NewProcVars);
-
-
- #pd_updated_object{object=Obj,old_object=OldObj,old_color=Color,obj_no=ObjNo} ->
- DbsPid = ProcVars#process_variables.dbs_pid,
- DbsPid ! #dbs_updated_object{sender = self(),
- object = Obj,
- old_object = OldObj,
- old_color = Color,
- obj_no = ObjNo},
- loop(ProcVars);
-
-
- #pd_new_object{object=Obj} ->
- DbsPid = ProcVars#process_variables.dbs_pid,
- DbsPid ! #dbs_new_object{sender = self(),
- object = Obj},
- loop(ProcVars);
-
-
- #pc_show_table_info{} ->
- NewProcVars = ?MENU_FUNC_FILE:table_info(ProcVars),
- loop(NewProcVars);
-
- #pc_win_conf{} ->
- NewProcVars = ?GRAPH_FUNC_FILE:win_conf(Msg, ProcVars),
- loop(NewProcVars);
-
- #pc_help{} ->
- NewProcVars = ?MENU_FUNC_FILE:help_button(ProcVars),
- loop(NewProcVars);
-
- #pc_dead_table{automatic_polling = AutoPoll} ->
- WinP = ProcVars#process_variables.window_params,
- WinId = WinP#window_params.window_id,
- gs:config(WinId, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(WinId, "TV Notification",
- ["The table no longer exists!"]);
- haiku ->
- ErrMsg1 = ["A table that big?",
- "It might be very useful.",
- "But now it is gone."],
- tv_utils:notify(WinId, "TV Notification", ErrMsg1)
- end,
- NewProcVars =
- case AutoPoll of
- true ->
- gs:config(WinId, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(WinId, "TV Notification",
- ["The automatic polling is turned off!"]);
- haiku ->
- ErrMsg2 = ["Previously on",
- "The polling is now idled.",
- "That's the way it is."],
- tv_utils:notify(WinId, "TV Notification", ErrMsg2)
- end,
- ProcVars#process_variables{poll_interval = infinity};
- false ->
- ProcVars
- end,
- loop(NewProcVars);
-
- #pc_nodedown{automatic_polling = AutoPoll} ->
- WinP = ProcVars#process_variables.window_params,
- WinId = WinP#window_params.window_id,
- gs:config(WinId, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(WinId, "TV Notification",
- ["The node is down, and the",
- "table cannot be reached."]);
- haiku ->
- ErrMsg1 = ["With searching comes loss",
- "And the presence of absence:",
- "Node is down."],
- tv_utils:notify(WinId, "TV Notification", ErrMsg1)
- end,
- NewProcVars =
- case AutoPoll of
- true ->
- gs:config(WinId, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(WinId, "TV Notification",
- ["The automatic polling is turned off!"]);
- haiku ->
- ErrMsg = ["Previously on,",
- "The polling is now idled.",
- "That's the way it is."],
- tv_utils:notify(WinId, "TV Notification", ErrMsg)
- end,
- ProcVars#process_variables{poll_interval = infinity};
- false ->
- ProcVars
- end,
- loop(NewProcVars);
-
-
- {pc_edit_object, _Sender} ->
- NewProcVars = ?MENU_FUNC_FILE:insert_object(ProcVars),
- loop(NewProcVars);
-
-
- check_node ->
- NewProcVars = check_node(ProcVars),
- loop(NewProcVars);
-
-
- raise ->
- WinP = ProcVars#process_variables.window_params,
- gs:config(WinP#window_params.window_id, [raise]),
- loop(ProcVars);
-
-
- {error_msg_mode, Mode} ->
- ProcVars#process_variables.dbs_pid ! {error_msg_mode, Mode},
- ProcVars#process_variables.etsread_pid ! {error_msg_mode, Mode},
- ProcVars#process_variables.pd_pid ! {error_msg_mode, Mode},
- put(error_msg_mode, Mode),
- loop(ProcVars);
-
- % Exit messages!
- {'EXIT', Sender, Reason} ->
- exit_signals({Sender, Reason}, ProcVars);
-
-
- _Other ->
- loop(ProcVars)
-
- end
- end.
-
-
-
-
-
-
-check_node(ProcVars) ->
- #process_variables{pw_pid = PwPid,
- current_node = OldCurrNode,
- local_node = LocalNode,
- table_id = TableId,
- table_type = TableType,
- table_name = TableName} = ProcVars,
-
- HomeNode = node(),
- case net_adm:ping(OldCurrNode) of
- pong ->
- ProcVars;
- pang when not LocalNode ->
- ProcVars;
- pang when LocalNode ->
- %% XXX [siri] Will this ever happen? I thought local_node
- %% indicated if current_node was the node where tv was
- %% started. If so, we are pinging ourselves here, and
- %% a pang can never happen??
- WinTitle = ?MENU_FUNC_FILE:get_window_title(TableType,HomeNode,TableId,TableName),
- PwPid ! #pw_set_window_title{sender = self(),
- win_title = WinTitle},
- ProcVars#process_variables{current_node = HomeNode}
- end.
-
-
-
-
-
-
-
-send_data(Msg, ProcVars) ->
- #process_variables{pd_pid = PdPid,
- parent_pid = ParentPid,
- table_id = Table,
- table_type = Type,
- current_node = Node} = ProcVars,
-
- ParentPid ! {tv_update_infowin, Table, Node, Type},
-
- #dbs_subset{data = DbData,
- subset_pos = ScalePos,
- db_length = DbLength,
- list_of_keys = ListOfKeys,
- max_elem_size = MaxElemSize,
- requested_row = ReqRowData} = Msg,
-
- Range = case ScalePos of
- 0 ->
- {0, 0};
- _Other ->
- {1, DbLength}
- end,
-
- PdPid ! #pc_data{sender = self(),
- scale_pos = ScalePos,
- scale_range = Range,
- elementlist = DbData,
- list_of_keys = ListOfKeys,
- max_elem_size = MaxElemSize,
- marked_row = ReqRowData
- },
-
- {MarkedObject, MarkedColor} =
- case ReqRowData of
- [] ->
- {undefined, undefined};
- [Data] ->
- Data
- end,
- ProcVars#process_variables{marked_object = MarkedObject,
- marked_color = MarkedColor}.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-set_sorting_mode(Msg, ProcVars) ->
- #pc_set_sorting_mode{sorting = Sorting,
- reverse = Reverse,
- sort_key_no = SortKeyNo} = Msg,
-
- DbsPid = ProcVars#process_variables.dbs_pid,
- PdPid = ProcVars#process_variables.pd_pid,
- PwPid = ProcVars#process_variables.pw_pid,
- TableType = ProcVars#process_variables.table_type,
-
- NewSortKeyNo =
- case SortKeyNo of
- undefined ->
- if
- TableType =:= mnesia ->
- 2;
- true ->
- 1
- end;
- _Other ->
- SortKeyNo
- end,
-
- Menu =
- case Sorting of
- true ->
- case Reverse of
- true ->
- sort_falling_order;
- false ->
- sort_rising_order
- end;
- false ->
- no_sorting
- end,
-
- PwPid ! #pw_select_menu{sender = self(),
- menu = Menu},
-
- DbsPid ! #dbs_sorting_mode{sender = self(),
- sorting = Sorting,
- reverse = Reverse,
- sort_key_no = NewSortKeyNo
- },
-
- PdPid ! #pc_set_sorting_mode_cfm{sender = self(),
- sort_key_no = NewSortKeyNo
- }.
-
-
-
-
-
-
-
-%%======================================================================
-%% Function: init_pw.
-%%
-%% Return Value: Tuple containing the Pid of the pw process, and the id of
-%% the window created by the pw process.
-%%
-%% Description: Starts the pw process, and orders it to create a window.
-%% (The size of the window may be given as option.)
-%%
-%% Parameters: None.
-%%======================================================================
-
-
-
-init_pw(PwPid, ProcVars) ->
- #process_variables{window_params = WinP} = ProcVars,
-
- % Now deblock pw, and order it to create a window!
- PwPid ! #pw_deblock{sender = self(),
- win_title = ?APPLICATION_NAME,
- win_width = ?DEFAULT_WINDOW_WIDTH,
- win_height = ?DEFAULT_WINDOW_HEIGHT,
- min_win_width = ?DEFAULT_MIN_WINDOW_WIDTH,
- min_win_height = ?DEFAULT_MIN_WINDOW_HEIGHT
- },
-
-
- receive
- #pw_deblock_cfm{win_id = WindowId} ->
- ?MENU_FUNC_FILE:create_menus(PwPid),
-
- % Store the window id as well as the size of it.
- WinP#window_params{window_id = WindowId,
- window_width = ?DEFAULT_WINDOW_WIDTH,
- window_height = ?DEFAULT_WINDOW_HEIGHT
- }
-
-
- after 180000 -> % A timeout of 1000 ms is too short, at least the first
- % time the system is started!
- exit(error)
- end.
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-init_pd(PdPid, WinP) ->
- #window_params{window_id = WindowId,
- window_width = WindowWidth,
- window_height = WindowHeight} = WinP,
-
- % Now deblock pd, and order it to create a canvas and a scale!
- PdPid ! #pd_deblock{sender = self(),
- win = WindowId,
- win_width = WindowWidth,
- win_height = WindowHeight,
- scale = true
- },
-
- receive
- #pd_deblock_cfm{} ->
- done
- after 180000 ->
- exit(error)
- end.
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function: exit_signals.
-%%
-%% Return Value: None.
-%%
-%% Description: Decides, given an error message, action to take, i.e., whether
-%% operation shall procede, any process shall be restarted, or
-%% the table tool terminated.
-%%
-%% Parameters: Exit_info: tuple containing sender of the error message, and the
-%% reason.
-%%======================================================================
-
-
-exit_signals(ExitInfo, ProcVars) ->
- #process_variables{parent_pid = ParentPid,
- pd_pid = PdPid,
- pw_pid = PwPid,
- dbs_pid = DbsPid,
- etsread_pid = EtsreadPid,
- table_id = TabId,
- table_type = TabType,
- table_name = TabName,
- current_node = Node,
- local_node = LocalNode
- } = ProcVars,
-
- case ExitInfo of
- {ParentPid, Reason} ->
- exit(Reason);
-
- {PwPid, normal} ->
- exit(normal);
-
- {PwPid, error} ->
- io:format("Internal error... restarting. ~n"),
- kill_procs(normal, [PdPid, EtsreadPid, DbsPid]),
- NewProcVars = pc(ParentPid, Node, LocalNode, TabId, TabType, TabName,
- get(error_msg_mode)),
- loop(NewProcVars);
-
- {PdPid, _Reason} ->
- io:format("Internal error... restarting. ~n"),
- kill_procs(normal, [PwPid, EtsreadPid, DbsPid]),
- NewProcVars = pc(ParentPid, Node, LocalNode, TabId, TabType, TabName,
- get(error_msg_mode)),
- loop(NewProcVars);
-
- {DbsPid, _Reason} ->
- io:format("Internal error... restarting. ~n"),
- kill_procs(normal, [PdPid, PwPid, EtsreadPid]),
- NewProcVars = pc(ParentPid, Node, LocalNode, TabId, TabType, TabName,
- get(error_msg_mode)),
- loop(NewProcVars);
-
- {EtsreadPid, _Reason} ->
- io:format("Internal error... restarting. ~n"),
- kill_procs(normal, [PdPid, PwPid, DbsPid]),
- NewProcVars = pc(ParentPid, Node, LocalNode, TabId, TabType, TabName,
- get(error_msg_mode)),
- loop(NewProcVars);
-
- {_Sender, _OtherReason} ->
- loop(ProcVars)
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-kill_procs(_Status, []) ->
- done;
-kill_procs(Status, [Pid | Tail]) ->
- exit(Pid, Status),
- kill_procs(Status, Tail).
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-check_time_to_poll_table(Msg, ProcVars) ->
- #dbs_subset{required_time_etsread = EtsreadTime,
- required_time_dbs = DbsTime} = Msg,
-
- UserSetPollInterval = ProcVars#process_variables.poll_interval,
- WinP = ProcVars#process_variables.window_params,
- WinId = WinP#window_params.window_id,
-
- case too_short_pollinterval_chosen(UserSetPollInterval, EtsreadTime, DbsTime) of
- true ->
- EtsreadPid = ProcVars#process_variables.etsread_pid,
- EtsreadPid ! #etsread_set_poll_interval{sender = self(),
- interval = infinity},
-
- TimeRequired = trunc(max_time_required(EtsreadTime, DbsTime) / 10 + 0.5) * 10 + 20,
-
- gs:config(WinId, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(WinId, "TV Notification",
- ["The current poll interval is too short!"]),
- Str = "to " ++ lists:flatten(io_lib:write(TimeRequired)) ++ " seconds!",
- tv_utils:notify(WinId, "TV Notification", ["Setting the poll interval", Str]);
- haiku ->
- ErrMsg = ["Being way too short",
- "The interval of polling",
- "Is simply increased."],
- tv_utils:notify(WinId, "TV Notification", ErrMsg)
- end,
- clear_message_buffer(),
- EtsreadPid ! #etsread_set_poll_interval{sender = self(),
- interval = TimeRequired},
-
- ProcVars#process_variables{poll_interval = TimeRequired};
- false ->
- ProcVars
- end.
-
-
-
-
-
-
-clear_message_buffer() ->
- receive
- #dbs_subset{} ->
- clear_message_buffer()
- after 100 ->
- done
- end.
-
-
-
-
-
-max_time_required(T1, T2) when is_number(T1), is_number(T2) ->
- if
- T1 > T2 ->
- T1;
- true ->
- T2
- end;
-max_time_required(T1, _T2) when is_number(T1) ->
- T1;
-max_time_required(_T1, T2) ->
- T2.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-too_short_pollinterval_chosen(infinity, _EtsreadTime, _DbsTime) ->
- false;
-too_short_pollinterval_chosen(undefined, _EtsreadTime, _DbsTime) ->
- false;
-too_short_pollinterval_chosen(PollInt, EtsreadTime, _DbsTime) when EtsreadTime >= PollInt, is_number(EtsreadTime) ->
- true;
-too_short_pollinterval_chosen(PollInt, _EtsreadTime, DbsTime) when DbsTime >= PollInt, is_number(DbsTime) ->
- true;
-too_short_pollinterval_chosen(_PollInt, _EtsreadTime, _DbsTime) ->
- false.
diff --git a/lib/tv/src/tv_pc_graph_ctrl.erl b/lib/tv/src/tv_pc_graph_ctrl.erl
deleted file mode 100644
index 3fc3ded565..0000000000
--- a/lib/tv/src/tv_pc_graph_ctrl.erl
+++ /dev/null
@@ -1,120 +0,0 @@
-%%
-%% %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(tv_pc_graph_ctrl).
-
-
-
--export([create_menu/4, win_conf/2]).
-
-
--include("tv_int_msg.hrl").
--include("tv_pc_int_def.hrl").
-
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_menu(PwPid, MenuTitle, TitleAccPos, MenuList) ->
- PwPid ! #pw_create_menu{sender = self(),
- menutitle = MenuTitle,
- title_acc_pos = TitleAccPos,
- menulist = MenuList
- },
- receive
- #pw_create_menu_cfm{} ->
- done
- after 10000 ->
- exit(error)
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function: win_conf.
-%%
-%% Return Value: None.
-%%
-%% Description: Configures all objects in the window according to new coordinates.
-%%
-%% Parameters:
-%%======================================================================
-
-
-win_conf(Msg, ProcVars) ->
- #pc_win_conf{width = NewWidth,
- height = NewHeight} = Msg,
-
- #process_variables{pd_pid = PdPid,
- window_params = WinP} = ProcVars,
-
- #window_params{window_width = OldWindowWidth,
- window_height = OldWindowHeight} = WinP,
-
-
- case {NewWidth, NewHeight} of
- {OldWindowWidth, OldWindowHeight} ->
- ProcVars;
- _Other ->
- PdPid ! #pd_win_conf{sender = self(),
- width = NewWidth,
- height = NewHeight
- },
- NewWinP = WinP#window_params{window_width = NewWidth,
- window_height = NewHeight},
-
- ProcVars#process_variables{window_params = NewWinP}
- end.
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_pc_int_def.hrl b/lib/tv/src/tv_pc_int_def.hrl
deleted file mode 100644
index 22f8dcd5d8..0000000000
--- a/lib/tv/src/tv_pc_int_def.hrl
+++ /dev/null
@@ -1,62 +0,0 @@
-%%
-%% %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%
-%%%*********************************************************************
-%%%
-%%% Description: Include file for the pc parts of the table tool.
-%%%
-%%%*********************************************************************
-
-
--define(HEAD_FILE, pc).
--define(GRAPH_FUNC_FILE, tv_pc_graph_ctrl).
--define(MENU_FUNC_FILE, tv_pc_menu_handling).
-
-
-
--define(APPLICATION_NAME, "Table Visualizer").
--define(DEFAULT_WINDOW_WIDTH, 750).
--define(DEFAULT_WINDOW_HEIGHT, 600).
--define(DEFAULT_MIN_WINDOW_WIDTH, 300).
--define(DEFAULT_MIN_WINDOW_HEIGHT, 250).
-
-
--record(window_params, {window_id,
- window_width,
- window_height
- }).
-
-
-
--record(process_variables, {parent_pid,
- pw_pid,
- pd_pid,
- dbs_pid,
- etsread_pid,
- current_node,
- local_node,
- table_id = undefined,
- table_type = ets,
- table_name,
- table_protection,
- marked_row,
- marked_object,
- marked_color,
- lists_as_strings = true,
- poll_interval = infinity, % seconds or 'infinity'
- window_params = #window_params{}
- }).
diff --git a/lib/tv/src/tv_pc_menu_handling.erl b/lib/tv/src/tv_pc_menu_handling.erl
deleted file mode 100644
index 64a06743b7..0000000000
--- a/lib/tv/src/tv_pc_menu_handling.erl
+++ /dev/null
@@ -1,489 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. 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%
-%%%*********************************************************************
-%%%
-%%% Description: Part of pc handling the creation of menus, as well as
-%%% treating the signals these menus results in,
-%%% when chosen.
-%%%
-%%%*********************************************************************
-
-
--module(tv_pc_menu_handling).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([create_menus/1,
- exit_button/1,
- insert_object/1,
- delete_object/1,
- search_object/1,
- open_table/7,
- set_poll_interval/1,
- poll_table/1,
- sort_rising_order/1,
- sort_falling_order/1,
- no_sorting/1,
- lists_as_strings/1,
- lists_as_lists/1,
- table_info/1,
- help_button/1,
- otp_help_button/1,
- get_window_title/4]).
-
-
-
-
-
--include("tv_int_def.hrl").
--include("tv_int_msg.hrl").
--include("tv_pc_int_def.hrl").
-
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-%% Shortcuts currently used, in alphabetical order:
-%%
-%% c -> "Exit"
-%% d -> "Delete Object"
-%% f -> "Sort Falling Order"
-%% h -> "Help"
-%% i -> "Table Info"
-%% n -> "No Sorting"
-%% o -> "Edit Object"
-%% p -> "Poll Table"
-%% r -> "Sort Rising Order"
-%% s -> "Search Object"
-%% v -> "Set Poll Interval"
-%% x -> "Exit"
-
-
-create_menus(PwPid) ->
- %% Due to a bug (or some other reason), only one of the radiobuttons belonging
- %% to a specified group can be selected, even if different processes have created
- %% the radiobuttons! This means that, if we have started more than one tv_main
- %% process, selecting one radiobutton will affect the radiobuttons in the other
- %% tv_main process(es)!!! Since this is a highly undesirable bahaviour, we have to
- %% create unique group names (i.e., atoms).
- %% (We need to group the radiobuttons, since otherwise all created by one process
- %% belongs to the same group, which also is undesirable...)
- SelfStr = pid_to_list(self()),
- SortGroup = list_to_atom("sorting" ++ SelfStr),
- ListGroup = list_to_atom("lists" ++ SelfStr),
-
- % Order pw to create the 'File' menu.
- ?GRAPH_FUNC_FILE:create_menu(PwPid,
- " File ",
- 1,
- [{" Table Info ", normal, table_info, 7, i},
- separator,
- {" Close ", normal, exit_button, 1, c}
- ]),
- ?GRAPH_FUNC_FILE:create_menu(PwPid,
- " Edit ",
- 1,
- [{" Edit Object... ", normal, insert_object, 1, o},
- {" Delete Object ", normal, delete_object, 1, d}
- ]),
- ?GRAPH_FUNC_FILE:create_menu(PwPid,
- " View ",
- 1,
- [{" Lists as Lists ",{radio,false,ListGroup},lists_as_lists,10,no_char},
- {" Lists as Strings ",{radio,true,ListGroup},lists_as_strings,10,no_char}
- ]),
- % Order pw to create the 'Options' menu.
- ?GRAPH_FUNC_FILE:create_menu(PwPid,
- " Options ",
- 1,
- [{" Poll Table ", normal, poll_table, 1, p},
- {" Poll Interval... ",normal,set_poll_interval,6,no_char},
- separator,
- {" Search Object ", normal, search_object, 1, s},
- separator,
- {" Sort Ascending Order ",{radio,false,SortGroup},sort_rising_order,6,no_char},
- {" Sort Descending Order ",{radio,false,SortGroup},sort_falling_order,6,no_char},
- {" No Sorting ",{radio,true,SortGroup},no_sorting,1,no_char}
- ]).
-
-
-
-
-
-exit_button(_ProcVars) ->
- exit(normal).
-
-
-
-help_button(ProcVars) ->
- WinP = ProcVars#process_variables.window_params,
- HelpFile = filename:join([code:lib_dir(tv), "doc", "html", "index.html"]),
- tool_utils:open_help(WinP#window_params.window_id, HelpFile),
- ProcVars.
-
-
-
-
-otp_help_button(ProcVars) ->
- WinP = ProcVars#process_variables.window_params,
- IndexFile = filename:join([code:root_dir(), "doc", "index.html"]),
-
- tool_utils:open_help(WinP#window_params.window_id, IndexFile),
- ProcVars.
-
-
-
-
-table_info(ProcVars) ->
- #process_variables{table_id = TableId,
- current_node = Node,
- local_node = LocalNode,
- table_type = Type,
- parent_pid = ParentPid} = ProcVars,
-
- case TableId of
- undefined ->
- done;
- _OtherValue ->
- ParentPid ! {tv_start_infowin, TableId, Node, LocalNode, Type}
- end,
- ProcVars.
-
-
-
-sort_rising_order(ProcVars) ->
- request_sort_settings(ProcVars#process_variables.pd_pid, true, false),
- ProcVars.
-
-
-sort_falling_order(ProcVars) ->
- request_sort_settings(ProcVars#process_variables.pd_pid, true, true),
- ProcVars.
-
-
-no_sorting(ProcVars) ->
- request_sort_settings(ProcVars#process_variables.pd_pid, false, false),
- ProcVars.
-
-
-set_poll_interval(ProcVars) ->
- #process_variables{etsread_pid = EtsreadPid,
- poll_interval = PollInterval} = ProcVars,
-
- case tv_poll_dialog:start(PollInterval) of
- cancel ->
- ProcVars;
- NewPollInterval ->
- EtsreadPid ! #etsread_set_poll_interval{sender = self(),
- interval = NewPollInterval},
- ProcVars#process_variables{poll_interval = NewPollInterval}
- end.
-
-
-
-poll_table(ProcVars) ->
- EtsreadPid = ProcVars#process_variables.etsread_pid,
- EtsreadPid ! #etsread_poll_table{sender = self()},
- ProcVars.
-
-
-search_object(ProcVars) ->
- DbsPid = ProcVars#process_variables.dbs_pid,
- DbsPid ! #dbs_search_req{sender=self()},
- ProcVars.
-
-
-
-lists_as_strings(ProcVars) ->
- PdPid = ProcVars#process_variables.pd_pid,
- PdPid ! #pc_list_info{sender=self(), lists_as_strings=true},
- DbsPid = ProcVars#process_variables.dbs_pid,
- DbsPid ! #pc_list_info{sender=self(), lists_as_strings=true},
- ProcVars#process_variables{lists_as_strings=true}.
-
-
-
-
-lists_as_lists(ProcVars) ->
- PdPid = ProcVars#process_variables.pd_pid,
- PdPid ! #pc_list_info{sender=self(), lists_as_strings=false},
- DbsPid = ProcVars#process_variables.dbs_pid,
- DbsPid ! #pc_list_info{sender=self(), lists_as_strings=false},
- ProcVars#process_variables{lists_as_strings=false}.
-
-
-
-
-
-
-insert_object(ProcVars) ->
- #process_variables{pd_pid = PdPid,
- current_node = Node,
- local_node = LocalNode,
- table_type = TabType,
- table_name = TabName,
- table_protection = Protection,
- window_params = WinP} = ProcVars,
-
- case Protection of
- public ->
- case TabType of
- mnesia ->
- case catch tv_mnesia_rpc:table_info(Node, LocalNode, TabName, attributes) of
- nodedown ->
- handle_error(nodedown);
- no_table ->
- handle_error(nodedown);
- mnesia_not_started ->
- handle_error(mnesia_not_started);
- {unexpected_error,Reason} ->
- handle_error({unexpected_error,Reason});
- AttrList ->
- PdPid ! #pd_rec_edit{sender = self(),
- attributes = AttrList
- }
- end;
- ets ->
- PdPid ! #pd_rec_edit{sender = self(),
- attributes = [tuple]
- }
- end;
- _OtherProtection ->
- WinId = WinP#window_params.window_id,
- gs:config(WinId, [beep]),
- ErrMsg =
- case get(error_msg_mode) of
- normal ->
- ["The table is protected and",
- " cannot be edited."];
- haiku ->
- ["The table you see",
- "Is cunningly protected:",
- "You can only watch."]
- end,
- tv_utils:notify(WinId, "TV Notification", ErrMsg)
- end,
- ProcVars.
-
-
-
-
-
-
-delete_object(ProcVars) ->
- #process_variables{dbs_pid = DbsPid,
- table_protection = Protection,
- marked_row = MarkedRow,
- marked_object = MarkedObject,
- marked_color = MarkedColor,
- window_params = WinP} = ProcVars,
-
- case MarkedRow of
- undefined ->
- done;
- _AnyRow ->
- case Protection of
- public ->
- DbsPid ! #dbs_delete_object{sender = self(),
- object = MarkedObject,
- color = MarkedColor,
- obj_no = MarkedRow};
- _OtherProtection ->
- WinId = WinP#window_params.window_id,
- gs:config(WinId, [beep]),
- ErrMsg =
- case get(error_msg_mode) of
- normal ->
- ["The table is protected and",
- " cannot be edited."];
- haiku ->
- ["The table you see",
- "Is cunningly protected:",
- "You can only watch."]
- end,
- tv_utils:notify(WinId, "TV Notification", ErrMsg)
- end
- end,
- ProcVars.
-
-
-
-
-
-
-open_table(CurrNode, LocalNode, TableId, TableType, TableName, Raise, ProcVars) ->
- #process_variables{dbs_pid = DbsPid,
- etsread_pid = EtsreadPid,
- pw_pid = PwPid,
- pd_pid = PdPid,
- poll_interval = PollInterval,
- window_params = WinP} = ProcVars,
-
- case Raise of
- true ->
- gs:config(WinP#window_params.window_id, [raise]);
- false ->
- done
- end,
-
- {Type, KeyPos, Protection} = init_etsread(EtsreadPid, DbsPid, CurrNode, LocalNode, TableId,
- TableType, PollInterval),
- WinTitle = get_window_title(TableType, CurrNode, TableId, TableName),
- PwPid ! #pw_set_window_title{sender = self(),
- win_title = WinTitle},
- Writable =
- case Protection of
- public ->
- true;
- _Other ->
- false
- end,
- RecordName =
- case TableType of
- mnesia ->
- tv_mnesia_rpc:table_info(CurrNode, LocalNode, TableId, record_name);
- ets ->
- undefined
- end,
- PdPid ! #pd_new_table{sender = self(),
- table_type = TableType,
- table_name = TableName,
- record_name = RecordName,
- writable = Writable},
- init_dbs(DbsPid, Type, KeyPos, EtsreadPid),
- ProcVars#process_variables{current_node = CurrNode,
- local_node = LocalNode,
- table_id = TableId,
- table_type = TableType,
- table_name = TableName,
- table_protection = Protection}.
-
-
-
-
-
-
-get_window_title(ets, Node, TableId, TableName) ->
- NameStr = lists:flatten(io_lib:write(TableName)),
- TableStr = case TableId of
- {TableName, _Pid} ->
- NameStr;
- TableName ->
- NameStr;
- _Other ->
- lists:flatten(io_lib:write(TableId)) ++ " (" ++ NameStr ++ ")"
- end,
-
- WinTitleSuffix = " Node: " ++ atom_to_list(Node),
- "ETS: " ++ TableStr ++ WinTitleSuffix;
-get_window_title(mnesia, Node, _TableId, TableName) ->
- TableNameStr = lists:flatten(io_lib:write(TableName)),
- WinTitleSuffix = " Node: " ++ atom_to_list(Node),
- "Mnesia: " ++ TableNameStr ++ WinTitleSuffix.
-
-
-
-
-%%%*********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-init_etsread(EtsreadPid, DbsPid, Node, LocalNode, TableId, TableType, PollInterval) ->
- EtsreadPid ! #etsread_deblock{sender = self(),
- dbs_pid = DbsPid,
- node = Node,
- local_node = LocalNode,
- table_id = TableId,
- table_type = TableType,
- poll_interval = PollInterval
- },
- receive
- #etsread_deblock_cfm{type=Type, keypos=KeyPos, protection=Protection} ->
- {Type, KeyPos, Protection}
- after 10000 ->
- exit(error)
- end.
-
-
-
-
-init_dbs(DbsPid, Type, KeyPos, EtsreadPid) ->
- DbsPid ! #dbs_deblock{sender = self(),
- etsread_pid = EtsreadPid,
- type = Type,
- keypos = KeyPos,
- sublist_length = ?ITEMS_TO_DISPLAY
- },
- receive
- #dbs_deblock_cfm{} ->
- done
- after 10000 ->
- exit(error)
- end.
-
-
-
-
-
-
-request_sort_settings(PdPid, Sorting, Reverse) ->
- PdPid ! #pd_get_sort_settings{sender = self(),
- sorting = Sorting,
- reverse = Reverse
- }.
-
-
-
-
-
-
-handle_error(mnesia_not_started) ->
- gs:window(errorwin, gs:start(), []),
- gs:config(errorwin, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(errorwin, "TV Notification", ["Mnesia not started!"]);
- haiku ->
- tv_utils:notify(errorwin, "TV Notification", ["Mnesia is stopped.",
- "We wish to reach all data",
- "But we never will."])
- end,
- gs:destroy(errorwin);
-handle_error(nodedown) ->
- done; %% Main process handles this!
-handle_error({unexpected_error,Cause}) ->
- gs:window(errorwin, gs:start(), []),
- io:format("Unexpected error: ~p~n", [Cause]),
- gs:config(errorwin, [beep]),
- gs:destroy(errorwin).
-
-
diff --git a/lib/tv/src/tv_pd.erl b/lib/tv/src/tv_pd.erl
deleted file mode 100644
index 6c38148fdd..0000000000
--- a/lib/tv/src/tv_pd.erl
+++ /dev/null
@@ -1,1127 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. 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%
-%%%*********************************************************************
-%%%
-%%% Description: Code for pd, i.e., the data displaying part of the table
-%%% tool.
-%%%
-%%%*********************************************************************
-
-
--module(tv_pd).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([pd/2]).
-
-
-
-
--include("tv_int_def.hrl").
--include("tv_int_msg.hrl").
--include("tv_pd_int_def.hrl").
--include("tv_pd_int_msg.hrl").
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function: pd.
-%%
-%% Return Value: None.
-%%
-%% Description: Process controlling the display part of the window,
-%% i.e., showing diagrams and handling the scale used for scrolling.
-%%
-%% Parameters: None.
-%%======================================================================
-
-
-pd(Master, ErrMsgMode) ->
- process_flag(trap_exit, true),
- put(error_msg_mode, ErrMsgMode),
- PgPid = spawn_link(tv_pg, pg, [self()]),
- PbPid = spawn_link(tv_pb, pb, [self()]),
-
- ProcVars = #process_variables{master_pid = Master,
- pg_pid = PgPid,
- pb_pid = PbPid},
- blocked(ProcVars).
-
-
-
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-
-
-%%======================================================================
-%% Function: blocked.
-%%
-%% Return Value: None.
-%%
-%% Description: When started or explicitly blocked, pd enters this state,
-%% where nothing is performed until the module explicitly is
-%% deblocked.
-%%
-%% Parameters:
-%%======================================================================
-
-
-blocked(ProcVars) ->
- receive
- Msg ->
- case Msg of
-
- #pd_deblock{} ->
- deblock(Msg, ProcVars);
-
-
- {error_msg_mode, Mode} ->
- put(error_msg_mode, Mode),
- blocked(ProcVars);
-
-
- _Other ->
- blocked(ProcVars)
- end
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function: deblock.
-%%
-%% Return Value: None.
-%%
-%% Description: When deblocked, a canvas and scale shall be created according to
-%% specification received in pd_deblock message.
-%%
-%% Parameters: Rec: received pd_deblock message.
-%%======================================================================
-
-
-
-deblock(Msg, ProcVars) ->
- #pd_deblock{win = WindowId,
- win_width = WindowWidth,
- win_height = WindowHeight} = Msg,
-
- NewProcVars = ?DISP_FUNC_FILE:init_display(WindowId, WindowWidth, WindowHeight,
- ProcVars),
- receive
-
- #pg_ready{} ->
- Sender = Msg#pd_deblock.sender,
- Sender ! #pd_deblock_cfm{sender = self()},
- deblocked_loop(NewProcVars)
-
- end.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function: deblocked_loop.
-%%
-%% Return Value: None.
-%%
-%% Description: Eternal (well, almost) loop, receiving messages and
-%% handling them.
-%%
-%% Parameters: Master: Pid to the 'pc' process.
-%% Win: Id of the window created.
-%%======================================================================
-
-
-
-deblocked_loop(ProcVars) ->
- receive
- Msg ->
- case Msg of
-
- {gs, Id, Event, Data, Args} ->
- NewProcVars = gs_messages({Id, Event, Data, Args}, ProcVars),
- deblocked_loop(NewProcVars);
-
- _Other ->
- NewProcVars = tv_messages(Msg, ProcVars),
- deblocked_loop(NewProcVars)
- end
- end.
-
-
-
-
-
-tv_messages(Msg, ProcVars) ->
- WinId = ProcVars#process_variables.window_id,
-
- case Msg of
- #pg_cell_marked{} ->
- mark_busy(WinId),
- NewProcVars = handle_cell_marked(Msg, ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
- #pc_data{} ->
- mark_busy(WinId),
- NewProcVars = show_data(Msg, ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
- #pc_list_info{} ->
- handle_list_info(Msg, ProcVars);
-
- #pb_col_marked{} ->
- mark_busy(WinId),
- NewProcVars = handle_col_marked(Msg, ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
- #pb_row_marked{} ->
- mark_busy(WinId),
- NewProcVars = handle_row_marked(Msg, ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
- #pb_new_colwidth{} ->
- mark_busy(WinId),
- NewProcVars = resize_column(Msg, ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
- #pd_get_sort_settings{sorting = Sorting, reverse = Reverse} ->
- mark_busy(WinId),
- NewProcVars =
- case send_sort_info_signal(Sorting, Reverse, ProcVars) of
- ignore ->
- ProcVars;
- TempNewProcVars ->
- set_sort_col(Sorting, TempNewProcVars)
- end,
- mark_nonbusy(WinId),
- NewProcVars;
-
- #pd_new_table{table_type=TabType,table_name=TabName,
- record_name=RecName,writable=Writable} ->
- mark_busy(WinId),
- ToolP = ProcVars#process_variables.toolbar_params,
- ?DISP_FUNC_FILE:update_toolbar_label(notext, ToolP, undefined, undefined, Writable),
- mark_nonbusy(WinId),
- ProcVars#process_variables{table_type = TabType,
- table_name = TabName,
- record_name = RecName,
- writable = Writable};
-
- #pd_win_conf{} ->
- mark_busy(WinId),
- NewProcVars = resize_window(Msg, ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
- #pd_rec_edit{} ->
- mark_busy(WinId),
- NewProcVars = open_rec_edit(Msg, ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
-
- {updated_object, UpdObj} ->
- get_updated_elem2(true, UpdObj, ProcVars),
- ProcVars;
-
- {new_object, NewObj} ->
- get_updated_elem2(true, NewObj, ProcVars),
- ProcVars;
-
- {error_msg_mode, Mode} ->
- put(error_msg_mode, Mode),
- ProcVars;
-
- {'EXIT', Pid, Reason} ->
- exit_signals({Pid, Reason}, ProcVars);
-
- _Other ->
- ProcVars
- end.
-
-
-
-
-
-
-exit_signals(ExitInfo, ProcVars) ->
- #process_variables{master_pid = MasterPid,
- pg_pid = PgPid,
- pb_pid = PbPid,
- rec_pid = RecPid} = ProcVars,
-
- case ExitInfo of
- {MasterPid, _Reason} ->
- exit(normal);
- {PgPid, _Reason} ->
- exit(normal);
- {PbPid, _Reason} ->
- exit(normal);
- {RecPid, _Reason} ->
- ProcVars#process_variables{rec_pid = undefined};
- _Other ->
- ProcVars
- end.
-
-
-
-
-open_rec_edit(Msg, ProcVars) ->
- #pd_rec_edit{attributes = AttrList} = Msg,
-
- #process_variables{rec_pid = RecPid,
- table_type = TabType,
- table_name = TabName,
- record_name = RecordName,
- lists_as_strings = ListsAsStr,
- mark_params = MarkP} = ProcVars,
-
- #mark_params{marked_object = MarkedObject} = MarkP,
-
- TabOrRecName =
- case TabType of
- mnesia ->
- RecordName;
- ets ->
- TabName
- end,
-
- case RecPid of
- undefined ->
- NewRecPid =
- case MarkedObject of
- undefined ->
- tv_rec_edit:start(TabType, TabOrRecName, AttrList, ListsAsStr,
- get(error_msg_mode));
- _Other ->
- AttrVals =
- case TabType of
- mnesia ->
- tl(tuple_to_list(MarkedObject));
- ets ->
- [MarkedObject]
- end,
- tv_rec_edit:start(TabType, TabOrRecName, AttrList, AttrVals, ListsAsStr,
- get(error_msg_mode))
- end,
- ProcVars#process_variables{rec_pid = NewRecPid};
- _AnyPid ->
- RecPid ! raise,
- ProcVars
- end.
-
-
-
-
-
-
-
-gs_messages(Msg, ProcVars) ->
-
- case Msg of
-
- {editentry, keypress, _Data, ['Tab' | _T]} ->
- gs:config(editentry, [{select, {0,100000000}}]),
- ProcVars;
-
- {editentry, keypress, _Data, ['Return' | _T]} ->
- get_updated_elem(ProcVars),
- ProcVars;
-
- {Id, enter, {toolbar, Btn, Str}, _} ->
- gs:config(Id, [{motion, true}]),
- NewProcVars = handle_toolbar_buttons(Id, Btn, Str, false, 0, 0,
- ProcVars),
- NewProcVars;
-
-
- {_Id, buttonpress, _Data, [3 | _Rest]} ->
- ProcVars;
-
-
- {_Id, buttonpress, vscale, [MouseBtn | _Tail]} ->
- WinId = ProcVars#process_variables.window_id,
- mark_busy(WinId),
- NewProcVars = ?DISP_FUNC_FILE:scroll_vertically(MouseBtn, ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
-
- % The order of messages from gs ought to be
- % 1. 'buttonpress'
- % 2. 'click' and
- % 3. 'buttonrelease'
- % However, quite often the 'click' message comes last, meaning we have
- % to check for this. :-(
-
- {_Id, click, vscale, [NewScalePos | _Tail]} ->
- WinId = ProcVars#process_variables.window_id,
- mark_busy(WinId),
- NewProcVars = ?DISP_FUNC_FILE:perform_vertical_scroll(NewScalePos,
- ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
-
- {_Id, buttonpress, hscale, [MouseBtn | _Tail]} ->
- WinId = ProcVars#process_variables.window_id,
- mark_busy(WinId),
- NewProcVars = ?DISP_FUNC_FILE:scroll_horizontally(MouseBtn, ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
-
- {_Id, click, hscale, [NewScalePos | _Tail]} ->
- WinId = ProcVars#process_variables.window_id,
- mark_busy(WinId),
- NewProcVars = ?DISP_FUNC_FILE:perform_horizontal_scroll(NewScalePos,
- ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
-
- {_Id, click, {toolbar, poll_table, _Str}, _Arg} ->
- WinId = ProcVars#process_variables.window_id,
- mark_busy(WinId),
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! #pc_poll_table{sender = self()},
- mark_nonbusy(WinId),
- ProcVars;
-
-
- {_Id, click, {toolbar, select_browser, _Str}, _Arg} ->
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! #pc_select{sender = self()},
- ProcVars;
-
-
- {_Id, click, {toolbar, help_button, _Str}, _Arg} ->
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! #pc_help{sender = self()},
- ProcVars;
-
-
-
- {_Id, click, {toolbar, insert_object, _Str}, _Arg} ->
- WinId = ProcVars#process_variables.window_id,
- mark_busy(WinId),
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! {pc_edit_object, self()},
- mark_nonbusy(WinId),
- ProcVars;
-
-
- {_Id, click, {toolbar, search_object, _Str}, _Arg} ->
- WinId = ProcVars#process_variables.window_id,
- mark_busy(WinId),
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! #pc_search_req{sender = self()},
- mark_nonbusy(WinId),
- ProcVars;
-
-
- {_Id, click, {toolbar, sort_rising_order, _Str}, _Arg} ->
- WinId = ProcVars#process_variables.window_id,
- mark_busy(WinId),
- NewProcVars = case send_sort_info_signal(true, false, ProcVars) of
- ignore ->
- ProcVars;
- TempNewProcVars ->
- set_sort_col(true, TempNewProcVars)
- end,
- mark_nonbusy(WinId),
- NewProcVars;
-
-
- {_Id, click, {toolbar, sort_falling_order, _Str}, _Arg} ->
- WinId = ProcVars#process_variables.window_id,
- mark_busy(WinId),
- NewProcVars = case send_sort_info_signal(true, true, ProcVars) of
- ignore ->
- ProcVars;
- TempNewProcVars ->
- set_sort_col(true, TempNewProcVars)
- end,
- mark_nonbusy(WinId),
- NewProcVars;
-
-
- {_Id, click, {toolbar, no_sorting, _Str}, _Arg} ->
- NewProcVars = case send_sort_info_signal(false, false, ProcVars) of
- ignore ->
- ProcVars;
- TempNewProcVars ->
- set_sort_col(false, TempNewProcVars)
- end,
- NewProcVars;
-
-
- {Id, click, {toolbar, table_info, _Str}, _Arg} ->
- ToolP = ProcVars#process_variables.toolbar_params,
- F = ToolP#toolbar_params.pop_up_frame_id,
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! #pc_show_table_info{sender = self()},
- ProcVars;
-
-
- {Id, click, {labelbtn, pop_up}, _Arg} ->
- gs:config(Id, [{data, {labelbtn, pop_down}}]),
- NewProcVars = ?DISP_FUNC_FILE:show_toolbar_editor(ProcVars),
- NewProcVars;
-
-
- {Id, click, {labelbtn, pop_down}, _Arg} ->
- gs:config(Id, [{data, {labelbtn, pop_up}}]),
- NewProcVars = ?DISP_FUNC_FILE:hide_toolbar_editor(ProcVars),
- NewProcVars;
-
-
- _OtherMessage ->
- ProcVars
-
- end.
-
-
-
-
-
-get_updated_elem(ProcVars) ->
- EditedStr = gs:read(editentry, text),
- case tv_db_search:string_to_term(EditedStr) of
- {error, {_Reason, Msg}} ->
- gs:config(editentry, [beep]),
- gs:window(pdwin, gs:start(), []),
- tv_utils:notify(pdwin, "TV Notification", Msg),
- gs:destroy(pdwin),
- ProcVars;
- {ok, NewTerm} ->
- get_updated_elem2(false, NewTerm, ProcVars)
- end.
-
-
-
-
-
-get_updated_elem2(FromRecEdit, NewTerm, ProcVars) ->
- #process_variables{table_type = TableType,
- record_name = RecordName,
- mark_params = MarkP,
- master_pid = PcPid} = ProcVars,
-
- #mark_params{marked_object = ObjToUpdate,
- marked_color = ObjColor,
- virtual_row_no = VirtualRow,
- cell_col_no = VirtualCol} = MarkP,
-
- case ObjToUpdate of
- undefined ->
- case new_object_ok(TableType, RecordName, NewTerm) of
- true ->
- PcPid ! #pd_new_object{sender = self(),
- object = NewTerm},
- ProcVars;
- {false, Msg} ->
- gs:window(pdwin, gs:start(), []),
- tv_utils:notify(pdwin, "TV Notification", Msg),
- gs:destroy(pdwin),
- ProcVars
- end;
- _AnyObj ->
- %% We need to know if the object has been deleted!
- NewObj =
- case VirtualCol of
- undefined ->
- NewTerm;
- _AnyCol when FromRecEdit ->
- NewTerm;
- _AnyCol ->
- if
- is_tuple(ObjToUpdate) ->
- erlang:setelement(VirtualCol, ObjToUpdate, NewTerm);
- true ->
- NewTerm
- end
- end,
- %% Is the update OK?
- case update_ok(TableType, ObjToUpdate, NewObj) of
- true ->
- PcPid ! #pd_updated_object{sender = self(),
- object = NewObj,
- old_object = ObjToUpdate,
- old_color = ObjColor,
- obj_no = VirtualRow},
- ProcVars;
- false ->
- gs:window(pdwin, gs:start(), []),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(pdwin, "TV Notification",
- ["The record name cannot be changed!"]);
- haiku ->
- tv_utils:notify(pdwin, "TV Notification",
- ["The attempt to change",
- "The permanent record name",
- "Is simply ignored."])
- end,
- gs:destroy(pdwin),
- ProcVars
- end
- end.
-
-
-
-
-new_object_ok(ets, _RecordName, NewTerm) when is_tuple(NewTerm) ->
- true;
-new_object_ok(ets, _RecordName, _NewTerm) ->
- Msg = case get(error_msg_mode) of
- normal ->
- ["Object is not a tuple!"];
- haiku ->
- ["Yes, it is a term.",
- "It is pretty, but it's not",
- "A proper tuple."]
- end,
- {false, Msg};
-new_object_ok(mnesia, RecordName, NewTerm) when is_tuple(NewTerm) ->
- NewRecName = element(1, NewTerm),
- case NewRecName of
- RecordName ->
- true;
- _OtherName ->
- Msg = case get(error_msg_mode) of
- normal ->
- ["Erroneous record name!"];
- haiku ->
- ["The attempt to use",
- "An invalid record name",
- "Is simply ignored."]
- end,
- {false, Msg}
- end;
-new_object_ok(mnesia, _RecordName, _NewTerm) ->
- Msg = case get(error_msg_mode) of
- normal ->
- ["Object is not a record!"];
- haiku ->
- ["Yes, it is a term.",
- "It is pretty, but it's not",
- "The proper record."]
- end,
- {false, Msg}.
-
-
-
-
-update_ok(ets, _ObjectToUpdate, _NewObject) ->
- true;
-update_ok(mnesia, ObjectToUpdate, NewObject) ->
- OldRecName = element(1, ObjectToUpdate),
- NewRecName = element(1, NewObject),
- case NewRecName of
- OldRecName ->
- true;
- _Other ->
- false
- end.
-
-
-
-
-handle_toolbar_buttons(Id, Btn, Str, LabelShown, X, Y, ProcVars) ->
- WinId = ProcVars#process_variables.window_id,
- ToolP = ProcVars#process_variables.toolbar_params,
- F = ToolP#toolbar_params.pop_up_frame_id,
-
- receive
-
- {gs, Id, motion, _Data, [NewX, NewY | _]} ->
- handle_toolbar_buttons(Id, Btn, Str, LabelShown, NewX, NewY,
- ProcVars);
-
- {gs, editentry, keypress, _Data, ['Tab' | _T]} ->
- gs:config(editentry, [{select, {0,100000000}}]),
- handle_toolbar_buttons(Id, Btn, Str, LabelShown, X, Y, ProcVars);
-
- {gs, editentry, keypress, _Data, ['Return' | _T]} ->
- get_updated_elem(ProcVars),
- handle_toolbar_buttons(Id, Btn, Str, LabelShown, X, Y, ProcVars);
-
- {gs, Id, leave, {toolbar, Btn, Str}, _Arg} ->
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- ProcVars;
-
- {gs, Id, click, {toolbar, poll_table, _Str}, _Arg} ->
- mark_busy(WinId),
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! #pc_poll_table{sender = self()},
- mark_nonbusy(WinId),
- ProcVars;
-
- {gs, Id, click, {toolbar, select_browser, _Str}, _Arg} ->
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! #pc_select{sender = self()},
- ProcVars;
-
- {gs, Id, click, {toolbar, help_button, _Str}, _Arg} ->
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! #pc_help{sender = self()},
- ProcVars;
-
- {gs, Id, click, {toolbar, insert_object, _Str}, _Arg} ->
- mark_busy(WinId),
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! {pc_edit_object, self()},
- mark_nonbusy(WinId),
- ProcVars;
-
-
- {gs, Id, click, {toolbar, search_object, _Str}, _Arg} ->
- mark_busy(WinId),
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! #pc_search_req{sender = self()},
- mark_nonbusy(WinId),
- ProcVars;
-
- {gs, Id, click, {toolbar, sort_rising_order, _Str}, _Arg} ->
- mark_busy(WinId),
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- NewProcVars =
- case send_sort_info_signal(true, false, ProcVars) of
- ignore ->
- ProcVars;
- TempNewProcVars ->
- set_sort_col(true, TempNewProcVars)
- end,
- mark_nonbusy(WinId),
- NewProcVars;
-
- {gs, Id, click, {toolbar, sort_falling_order, _Str}, _Arg} ->
- mark_busy(WinId),
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- NewProcVars =
- case send_sort_info_signal(true, true, ProcVars) of
- ignore ->
- ProcVars;
- TempNewProcVars ->
- set_sort_col(true, TempNewProcVars)
- end,
- mark_nonbusy(WinId),
- NewProcVars;
-
- {gs, Id, click, {toolbar, no_sorting, _Str}, _Arg} ->
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- NewProcVars =
- case send_sort_info_signal(false, false, ProcVars) of
- ignore ->
- ProcVars;
- TempNewProcVars ->
- set_sort_col(false, TempNewProcVars)
- end,
- NewProcVars;
-
- {gs, Id, click, {toolbar, table_info, _Str}, _Arg} ->
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! #pc_show_table_info{sender = self()},
- ProcVars;
-
- {'EXIT', Pid, Reason} ->
- exit_signals({Pid, Reason}, ProcVars),
- handle_toolbar_buttons(Id, Btn, Str, LabelShown, X, Y, ProcVars);
-
- OtherMsg ->
- NewProcVars = tv_messages(OtherMsg, ProcVars),
- handle_toolbar_buttons(Id, Btn, Str, LabelShown, X, Y, NewProcVars)
-
- after 600 ->
- case LabelShown of
- false ->
- FrameP = ProcVars#process_variables.frame_params,
- L = ToolP#toolbar_params.pop_up_label_id,
-
- #frame_params{toolbar_frame_width = TWidth,
- toolbar_frame_height = THeight} = FrameP,
-
- BtnHeight = gs:read(Id, height),
- BtnXpos = gs:read(Id, x),
- BtnYpos = gs:read(Id, y),
- FrameHeight = gs:read(F, height),
- FontUsed = gs:read(L, font),
- {StringWidth, _H} = gs:read(L, {font_wh, {FontUsed, Str}}),
-
- Width = StringWidth + 6,
- Xpos = BtnXpos + X,
- LblXpos = if
- Xpos + Width > TWidth ->
- Xpos - Width;
- true ->
- Xpos
- end,
- % Ypos = BtnYpos + Y + 15,
- Ypos = BtnYpos + BtnHeight + 6,
- LblYpos = if
- Ypos + FrameHeight > THeight ->
- Ypos - FrameHeight - 25;
- true ->
- Ypos
- end,
- gs:config(L, [{width, Width - 2},
- {label, {text, Str}}]),
- gs:config(F, [{width, Width},
- {x, LblXpos},
- {y, LblYpos}
- ]);
- true ->
- done
- end,
- handle_toolbar_buttons(Id, Btn, Str, true, X, Y, ProcVars)
- end.
-
-
-
-
-
-
-set_sort_col(SortingOn, ProcVars) ->
- #process_variables{pb_pid = PbPid,
- mark_params = MarkP} = ProcVars,
-
- SortCol = case SortingOn of
- true ->
- MarkP#mark_params.col_no;
- false ->
- undefined
- end,
- PbPid ! #pb_set_sort_col{sender = self(),
- virtual_col = SortCol
- },
- remove_all_marks(SortCol, ProcVars).
-
-
-
-
-
-send_sort_info_signal(Sorting, Reverse, ProcVars) ->
- #process_variables{master_pid = PcPid,
- mark_params = MarkP} = ProcVars,
-
- SortColNo = MarkP#mark_params.col_no,
-
- PcPid ! #pc_set_sorting_mode{sender = self(),
- sorting = Sorting,
- reverse = Reverse,
- sort_key_no = SortColNo
- },
- receive
- #pc_set_sorting_mode_cfm{sort_key_no = FinalSortColNo} ->
- NewMarkP = MarkP#mark_params{col_no = FinalSortColNo},
- ProcVars#process_variables{mark_params = NewMarkP};
-
- #pd_ignore{} ->
- ignore
-
- end.
-
-
-
-
-
-show_data(Msg, ProcVars) ->
- #pc_data{scale_pos = Pos,
- scale_range = Range,
- list_range = MaxValue,
- elementlist = List,
- list_of_keys = KeyList,
- max_elem_size = MaxElemSize,
- marked_row = MarkedRowData} = Msg,
-
- ?DISP_FUNC_FILE:display_data(Pos, Range, MaxValue, List, KeyList, MaxElemSize,
- MarkedRowData, ProcVars).
-
-
-
-
-
-
-handle_list_info(Msg, ProcVars) ->
- ListAsStr = Msg#pc_list_info.lists_as_strings,
- PgPid = ProcVars#process_variables.pg_pid,
- PgPid ! #pg_list_info{sender = self(),
- lists_as_strings = ListAsStr},
- ProcVars#process_variables{lists_as_strings = ListAsStr}.
-
-
-
-
-
-handle_col_marked(Msg, ProcVars) ->
- #pb_col_marked{col_marked = ColMarked,
- virtual_col = VirtualCol} = Msg,
-
- #process_variables{master_pid = MasterPid,
- pg_pid = PgPid,
- rec_pid = RecPid,
- writable = Writable,
- toolbar_params = ToolP,
- mark_params = MarkP} = ProcVars,
- SortCol = MarkP#mark_params.sort_col_no,
-
- PgPid ! #pg_remove_marks{sender = self()},
-
- case ColMarked of
- true ->
- PgPid ! #pg_col_marked{sender = self(),
- virtual_col = VirtualCol};
- false ->
- done
- end,
-
- MasterPid ! #pc_marked_row{sender = self(),
- row_no = undefined,
- object = undefined,
- color = undefined
- },
-
- ?DISP_FUNC_FILE:update_toolbar_label(notext, ToolP, undefined, undefined, Writable),
- send_to_rec_edit(RecPid, insert_mode),
-
- NewMarkP =
- if
- ColMarked ->
- MarkP#mark_params{col_no = VirtualCol};
- true ->
- if
- SortCol =:= undefined ->
- MarkP;
- true ->
- MarkP#mark_params{col_no = SortCol}
- end
- end,
- ProcVars#process_variables{mark_params = NewMarkP}.
-
-
-
-
-
-
-remove_all_marks(SortCol, ProcVars) ->
- #process_variables{master_pid = MasterPid,
- pb_pid = PbPid,
- pg_pid = PgPid,
- toolbar_params = ToolP} = ProcVars,
-
- PgPid ! #pg_remove_marks{sender = self()},
- PbPid ! #pb_remove_marks{sender = self()},
- MasterPid ! #pc_marked_row{sender = self(),
- row_no = undefined,
- object = undefined,
- color = undefined
- },
-%% ?DISP_FUNC_FILE:update_toolbar_label(notext, ToolP, undefined, undefined, Writable),
- ?DISP_FUNC_FILE:update_toolbar_editor(ToolP#toolbar_params.editor_id, notext),
-%% send_to_rec_edit(RecPid, insert_mode),
- ProcVars#process_variables{mark_params = #mark_params{sort_col_no = SortCol,
- cell_col_no = undefined,
- row_no = undefined,
- virtual_row_no = undefined,
- marked_object = undefined,
- marked_color = undefined}
- }.
-
-
-
-
-
-
-handle_row_marked(Msg, ProcVars) ->
- #pb_row_marked{row_marked = RowMarked,
- virtual_row = VirtualRow,
- real_row = RealRow} = Msg,
-
- #process_variables{master_pid = MasterPid,
- rec_pid = RecPid,
- pg_pid = PgPid,
- data_list = DataList,
- color_list = ColorList,
- writable = Writable,
- toolbar_params = ToolP,
- mark_params = MarkP} = ProcVars,
-
- PgPid ! #pg_remove_marks{sender = self()},
-
- case RowMarked of
- true ->
- PgPid ! #pg_row_marked{sender = self(),
- virtual_row = VirtualRow};
- false ->
- done
- end,
-
- {DataElement, NewMarkP} =
- if
- RowMarked ->
- {MarkedRowOrCol, RowObj} =
- ?DISP_FUNC_FILE:get_data_element(row, DataList, RealRow, undefined),
-
- MarkedRowColor =
- case MarkedRowOrCol of
- notext ->
- undefined;
- _OtherObject ->
- lists:nth(RealRow, ColorList)
- end,
- MasterPid ! #pc_marked_row{sender = self(),
- row_no = VirtualRow,
- object = RowObj,
- color = MarkedRowColor
- },
- send_to_rec_edit(RecPid, {update_mode,RowObj}),
- {MarkedRowOrCol, MarkP#mark_params{virtual_row_no = VirtualRow,
- row_no = RealRow,
- cell_col_no = undefined,
- col_no = undefined,
- marked_object = RowObj,
- marked_color = MarkedRowColor}};
- true ->
- MasterPid ! #pc_marked_row{sender = self(),
- row_no = undefined,
- object = undefined,
- color = undefined
- },
- send_to_rec_edit(RecPid, insert_mode),
- {notext, MarkP#mark_params{virtual_row_no = undefined,
- row_no = undefined,
- cell_col_no = undefined,
- col_no = undefined,
- marked_object = undefined,
- marked_color = undefined}}
- end,
-
- ?DISP_FUNC_FILE:update_toolbar_label(DataElement, ToolP, VirtualRow,
- undefined, Writable),
- ProcVars#process_variables{mark_params = NewMarkP}.
-
-
-
-
-
-handle_cell_marked(Msg, ProcVars) ->
- #pg_cell_marked{cell_marked = CellMarked,
- virtual_col = VirtualCol,
- real_row = RealRow,
- virtual_row = VirtualRow} = Msg,
-
- % We are interested in the real row number, since we only have a sublist
- % stored in pd.
- ?DISP_FUNC_FILE:marked_cell(CellMarked, VirtualCol, RealRow, VirtualRow,
- ProcVars).
-
-
-
-
-resize_window(Msg, ProcVars) ->
- #pd_win_conf{width = NewWindowWidth,
- height = NewWindowHeight} = Msg,
-
- ?DISP_FUNC_FILE:resize_display(NewWindowWidth, NewWindowHeight, ProcVars).
-
-
-
-
-resize_column(Msg, ProcVars) ->
- #pb_new_colwidth{real_col = RealCol,
- virtual_col = VirtualCol,
- xdiff = Xdiff} = Msg,
-
- ?DISP_FUNC_FILE:resize_column(RealCol, VirtualCol, Xdiff, ProcVars).
-
-
-
-
-mark_busy(Id) ->
- gs:config(Id, [{cursor, busy}]).
-
-
-
-
-mark_nonbusy(Id) ->
- gs:config(Id, [{cursor, arrow}]).
-
-
-
-
-send_to_rec_edit(undefined, _Msg) ->
- done;
-send_to_rec_edit(RecPid, Msg) ->
- RecPid ! Msg.
-
diff --git a/lib/tv/src/tv_pd_display.erl b/lib/tv/src/tv_pd_display.erl
deleted file mode 100644
index 804180da16..0000000000
--- a/lib/tv/src/tv_pd_display.erl
+++ /dev/null
@@ -1,1066 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. 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%
-%%%*********************************************************************
-%%%
-%%% Description: Part of pd controlling the graphics.
-%%%
-%%%*********************************************************************
-
--module(tv_pd_display).
--compile([{nowarn_deprecated_function,{gs,button,2}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,editor,2}},
- {nowarn_deprecated_function,{gs,entry,3}},
- {nowarn_deprecated_function,{gs,frame,2}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,read,2}}]).
-
-
-
-
--export([init_display/4,
- display_data/8,
- resize_display/3,
- resize_column/4,
- scroll_horizontally/2,
- scroll_vertically/2,
- perform_horizontal_scroll/2,
- perform_vertical_scroll/2,
- marked_cell/5,
- update_toolbar_label/5,
- update_toolbar_editor/2,
- get_data_element/4,
- hide_toolbar_editor/1,
- show_toolbar_editor/1]).
-
-
-
-
-
--include("tv_int_def.hrl").
--include("tv_int_msg.hrl").
--include("tv_pd_int_def.hrl").
--include("tv_pd_int_msg.hrl").
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-%%======================================================================
-%% Function: init_display.
-%%
-%% Return Value: Id of the display (here:canvas) created.
-%%
-%% Description: Creates the canvas and the scale.
-%%
-%% Parameters: Id of the window the display shall be created in.
-%%======================================================================
-
-
-init_display(WindowId, WindowWidth, WindowHeight, ProcVars) ->
- % Get all necessary window parameters!
- #process_variables{pg_pid = PgPid,
- pb_pid = PbPid,
- frame_params = FrameP,
- scale_params = ScaleP,
- toolbar_params = ToolP} = ProcVars,
-
- NewFrameP = tv_pd_frames:create_display_frames(WindowId, WindowWidth,
- WindowHeight, FrameP),
-
- #frame_params{grid_frame_id = GridParentId,
- grid_frame_width = GridParentWidth,
- grid_frame_height = GridParentHeight} = NewFrameP,
-
- PgPid ! #pg_init_grid{sender = self(),
- parent_id = GridParentId,
- width = GridParentWidth,
- height = GridParentHeight,
- xpos = ?VBTN_WIDTH - 1,
- ypos = ?KEY_MARK_AREA_HEIGHT + ?HBTN_HEIGHT - 1,
- nof_rows = ?NOF_GRIDROWS,
- row_height = ?ROW_HEIGHT
- },
-
-
- receive
- #pg_col_info{first_col_shown = FirstColShown,
- width_of_cols_shown = ColsShown,
- nof_rows_shown = NofRowsShown} ->
-
- PbPid ! #pb_init_btns{sender = self(),
- parent_id = GridParentId,
- parent_width = GridParentWidth,
- parent_height = GridParentHeight,
- ypos = ?KEY_MARK_AREA_HEIGHT,
- hbtn_height = ?HBTN_HEIGHT,
- resbtn_width = ?RESBTN_WIDTH,
- vbtn_width = ?VBTN_WIDTH,
- nof_rows = ?NOF_GRIDROWS,
- row_height = ?ROW_HEIGHT,
- first_col_shown = FirstColShown,
- cols_shown = ColsShown
- },
-
- NewScaleP = tv_pd_scale:init_scale(NewFrameP, ScaleP),
-
- NewToolP = init_toolbar(NewFrameP, ToolP),
-
- ProcVars#process_variables{window_id = WindowId,
- window_width = WindowWidth,
- window_height = WindowHeight,
- first_col_shown = FirstColShown,
- nof_rows_shown = NofRowsShown,
- cols_shown = ColsShown,
- frame_params = NewFrameP,
- scale_params = NewScaleP,
- toolbar_params = NewToolP
- }
- end.
-
-
-
-
-
-resize_display(NewWinW, NewWinH, ProcVars) ->
- #process_variables{pg_pid = PgPid,
- pb_pid = PbPid,
- color_list = ColorList,
- first_row_shown = FirstRowShown,
- frame_params = FrameP,
- scale_params = ScaleP,
- toolbar_params = ToolP} = ProcVars,
-
- NewFrameP = tv_pd_frames:resize_display_frames(NewWinW, NewWinH, FrameP),
-
- #frame_params{grid_frame_width = GridParentWidth,
- grid_frame_height = GridParentHeight} = NewFrameP,
-
- PgPid ! #pg_resize_grid{sender = self(),
- width = GridParentWidth,
- height = GridParentHeight
- },
-
- receive
- #pg_col_info{first_col_shown = FirstColShown,
- width_of_cols_shown = ColsShown,
- nof_rows_shown = NofRowsShown} ->
-
- PbPid ! #pb_update_hbtns{sender = self(),
- parent_width = GridParentWidth,
- parent_height = GridParentHeight,
- first_col_shown = FirstColShown,
- cols_shown = ColsShown
- },
-
- PbPid ! #pb_update_vbtns{sender = self(),
- color_list = ColorList,
- first_row_shown = FirstRowShown,
- nof_rows_shown = NofRowsShown,
- blinking_enabled = false
- },
-
- NewScaleP = tv_pd_scale:resize_scale(NewFrameP, ScaleP),
-
- NewToolP = resize_toolbar(NewFrameP, ToolP),
-
- ProcVars#process_variables{window_width = NewWinW,
- window_height = NewWinH,
- first_col_shown = FirstColShown,
- nof_rows_shown = NofRowsShown,
- cols_shown = ColsShown,
- frame_params = NewFrameP,
- scale_params = NewScaleP,
- toolbar_params = NewToolP
- }
- end.
-
-
-
-
-
-
-
-resize_column(RealCol, VirtualCol, Xdiff, ProcVars) ->
- #process_variables{pg_pid = PgPid,
- pb_pid = PbPid,
- frame_params = FrameP} = ProcVars,
-
- PgPid ! #pg_resize_grid_col{sender = self(),
- real_col_no = RealCol,
- virtual_col_no = VirtualCol,
- xdiff = Xdiff
- },
-
- #frame_params{grid_frame_width = GridFrameWidth,
- grid_frame_height = GridFrameHeight} = FrameP,
- receive
- #pg_col_info{first_col_shown = FirstColShown,
- width_of_cols_shown = ColsShown,
- nof_rows_shown = NofRowsShown} ->
-
- PbPid ! #pb_update_hbtns{parent_width = GridFrameWidth,
- parent_height = GridFrameHeight,
- first_col_shown = FirstColShown,
- cols_shown = ColsShown
- },
-
- ProcVars#process_variables{first_col_shown = FirstColShown,
- nof_rows_shown = NofRowsShown,
- cols_shown = ColsShown
- }
- end.
-
-
-
-
-
-
-
-
-display_data(Pos, Range, _MaxValue, List, KeyList, MaxElemSize, MarkedRowData,ProcVars) ->
- #process_variables{master_pid = PcPid,
- rec_pid = RecPid,
- pg_pid = PgPid,
- pb_pid = PbPid,
- writable = Writable,
- sorting_on = SortingOn,
- nof_rows_shown = NofRowsShown,
- scale_params = ScaleP,
- toolbar_params = ToolP,
- mark_params = MarkP} = ProcVars,
-
- {DataList, ColorList} = split_dblist(List, [], []),
-
- NewMarkP = update_marks(SortingOn, DataList, ColorList, MarkedRowData, Pos, NofRowsShown,
- Writable, Range, PcPid, PgPid, RecPid, ToolP, MarkP),
-
- PgPid ! #pg_data{sender = self(),
- data = DataList,
- first_row_shown = Pos
- },
-
- PbPid ! #pb_update_vbtns{sender = self(),
- color_list = ColorList,
- first_row_shown = Pos,
- nof_rows_shown = NofRowsShown,
- blinking_enabled = false
- },
-
- PbPid ! #pb_key_info{sender = self(),
- list_of_keys = KeyList
- },
-
- % May be new number of elements in the total list!
- ?SCALE_FUNC_FILE:set_scale_range(vscale, Range, ScaleP),
- % May be new vertical scale position required!
- NewScaleP = ?SCALE_FUNC_FILE:set_scale_pos(vscale, Pos, ScaleP),
- % May be new maximum size of elements!
- ?SCALE_FUNC_FILE:set_scale_range(hscale, {1, MaxElemSize}, NewScaleP),
-
- ProcVars#process_variables{data_list = DataList,
- color_list = ColorList,
- first_row_shown = Pos,
- initialising = false,
- scale_params = NewScaleP,
- mark_params = NewMarkP
- }.
-
-
-
-
-
-
-
-scroll_vertically(MouseBtn, ProcVars) ->
- #process_variables{scale_params = ScaleP} = ProcVars,
-
- OldScalePos = ScaleP#scale_params.vscale_pos,
- NewScalePos = get_new_scalepos(MouseBtn, OldScalePos),
-
- case NewScalePos of
- OldScalePos ->
- ProcVars;
- NewValue ->
- perform_vertical_scroll(NewValue, ProcVars)
- end.
-
-
-
-
-
-
-
-scroll_horizontally(MouseBtn, ProcVars) ->
- #process_variables{scale_params = ScaleP} = ProcVars,
-
- OldScalePos = ScaleP#scale_params.hscale_pos,
- NewScalePos = get_new_scalepos(MouseBtn, OldScalePos),
-
- case NewScalePos of
- OldScalePos ->
- ProcVars;
- NewValue ->
- perform_horizontal_scroll(NewValue, ProcVars)
- end.
-
-
-
-
-
-
-
-
-perform_vertical_scroll(NewScalePos, ProcVars) ->
- #process_variables{master_pid = MasterPid,
- initialising = Init,
- scale_params = ScaleP} = ProcVars,
-
- %% To avoid erroneous scrollbar signals during creation of the display.
- case Init of
- true ->
- done;
- false ->
- MasterPid ! #pc_data_req{sender = self(),
- element = NewScalePos,
- nof_elements = ?NOF_GRIDROWS}
- end,
-
- % Since the order of click/buttonrelease messages isn't
- % precise, set the scale to the returned pos (may otherwise
- % differ one unit).
- NewScaleP = ?SCALE_FUNC_FILE:set_scale_pos(vscale,
- NewScalePos,
- ScaleP),
-
- ProcVars#process_variables{scale_params = NewScaleP}.
-
-
-
-
-
-
-
-perform_horizontal_scroll(NewScalePos, ProcVars) ->
- #process_variables{pg_pid = PgPid,
- pb_pid = PbPid,
- frame_params = FrameP,
- scale_params = ScaleP} = ProcVars,
-
- % Since the order of click/buttonrelease messages isn't
- % precise, set the scale to the returned pos (may otherwise
- % differ one unit).
- NewScaleP = ?SCALE_FUNC_FILE:set_scale_pos(hscale,
- NewScalePos,
- ScaleP),
-
- PgPid ! #pg_horizontal_scroll{sender = self(),
- leftmost_virtual_col = NewScalePos
- },
-
- #frame_params{grid_frame_width = GridFrameWidth,
- grid_frame_height = GridFrameHeight} = FrameP,
- receive
- #pg_col_info{first_col_shown = FirstColShown,
- width_of_cols_shown = ColsShown,
- nof_rows_shown = NofRowsShown} ->
-
- PbPid ! #pb_update_hbtns{parent_width = GridFrameWidth,
- parent_height = GridFrameHeight,
- first_col_shown = FirstColShown,
- cols_shown = ColsShown
- },
-
- ProcVars#process_variables{first_col_shown = FirstColShown,
- cols_shown = ColsShown,
- nof_rows_shown = NofRowsShown,
- scale_params = NewScaleP
- }
- end.
-
-
-
-
-
-
-
-
-marked_cell(true, VirtualCol, RealRow, VirtualRow, ProcVars) ->
- #process_variables{master_pid = MasterPid,
- rec_pid = RecPid,
- data_list = DataList,
- color_list = ColorList,
- writable = Writable,
- mark_params = MarkP,
- toolbar_params = ToolP} = ProcVars,
-
- {DataElement, MarkedRowObject} = get_data_element(cell, DataList, RealRow, VirtualCol),
- update_toolbar_label(DataElement, ToolP, VirtualRow, VirtualCol, Writable),
- send_to_rec_edit(RecPid, {update_mode,MarkedRowObject}),
-
- MarkedRowColor = lists:nth(RealRow, ColorList),
-
- MasterPid ! #pc_marked_row{sender = self(),
- row_no = VirtualRow,
- object = MarkedRowObject,
- color = MarkedRowColor
- },
- NewMarkP = MarkP#mark_params{cell_col_no = VirtualCol,
- row_no = RealRow,
- virtual_row_no = VirtualRow,
- marked_object = MarkedRowObject,
- marked_color = MarkedRowColor
- },
- ProcVars#process_variables{mark_params = NewMarkP
- };
-marked_cell(false, VirtualCol, _RealRow, VirtualRow, ProcVars) ->
- #process_variables{master_pid = MasterPid,
- rec_pid = RecPid,
- pb_pid = PbPid,
- writable = Writable,
- mark_params = MarkP} = ProcVars,
-
- PbPid ! #pb_remove_marks{sender = self()},
-
- case VirtualRow of
- undefined ->
- done;
- _AnyRow ->
- update_toolbar_label(notext, ProcVars#process_variables.toolbar_params,
- VirtualRow, VirtualCol, Writable),
- send_to_rec_edit(RecPid, insert_mode)
- end,
- MasterPid ! #pc_marked_row{sender = self(),
- %% row_no = VirtualRow
- row_no = undefined,
- object = undefined,
- color = undefined
- },
- NewMarkP = MarkP#mark_params{cell_col_no = undefined,
- row_no = undefined,
- virtual_row_no = undefined,
- marked_object = undefined,
- marked_color = undefined
- },
- ProcVars#process_variables{mark_params = NewMarkP
- }.
-
-
-
-
-
-
-
-
-update_toolbar_label(notext, ToolP, _VirtualRowNo, _VirtualColNo, Writable) ->
- #toolbar_params{row_col_label_id = RowColLblId,
- fg_label_id = FgLblId,
- editor_id = EdId} = ToolP,
- gs:config(RowColLblId, [{label, {text,""}}]),
- gs:config(FgLblId, [{enable,true}]),
- gs:config(FgLblId, [{delete, {0,1000000000}}]),
- gs:config(FgLblId, [{insert, {0, ""}}]),
- case Writable of
- true ->
- gs:config(FgLblId, [{cursor, text},
- {setfocus, true}]);
- false ->
- gs:config(FgLblId, [{enable, false},
- {cursor, arrow},
- {setfocus, false}])
- end,
- update_toolbar_editor(EdId, notext);
-update_toolbar_label({DataToShow}, ToolP, VirtualRowNo, VirtualColNo, Writable) ->
- #toolbar_params{row_col_label_id = RowColLblId,
- fg_label_id = FgLblId,
- editor_id = EdId} = ToolP,
-
- case VirtualRowNo of
- undefined ->
- %% No row - nothing can possibly be marked!
- case Writable of
- true ->
- gs:config(FgLblId, [{setfocus,true},
- {cursor, text}]);
- false ->
- gs:config(FgLblId, [{enable,false},
- {setfocus, false},
- {cursor, arrow}])
- end;
- _AnyRow ->
- RowStr = "R" ++ integer_to_list(VirtualRowNo),
- ColStr = case VirtualColNo of
- undefined ->
- "";
- _AnyCol ->
- " x C" ++ integer_to_list(VirtualColNo)
- end,
- DataStr = lists:flatten(tv_io_lib:format("~p", [DataToShow])),
- gs:config(RowColLblId, [{label, {text,RowStr++ColStr}}]),
- gs:config(FgLblId, [{enable,true}]),
- gs:config(FgLblId, [{delete, {0,10000000}}]),
- gs:config(FgLblId, [{insert, {0,DataStr}}]),
- case Writable of
- true ->
- gs:config(FgLblId, [{setfocus,true},
- {cursor, text}]);
- false ->
- gs:config(FgLblId, [{enable,false},
- {setfocus, false},
- {cursor, arrow}])
- end,
- update_toolbar_editor(EdId, {DataToShow})
- end.
-
-
-
-
-
-
-
-
-get_data_element(row, DataList, RowNo, _VirtualCol) ->
- if
- length(DataList) < RowNo ->
- {notext, undefined};
- true ->
- RowObj = lists:nth(RowNo, DataList),
- {{RowObj}, RowObj}
- end;
-get_data_element(cell, DataList, RowNo, ColNo) ->
- %% It's the responsibility of pg to ensure that there is a data item
- %% for the cell marked, meaning we don't *have* to check the length of
- %% the data items. However, since we in the future may want to edit
- %% even empty cells, we check it!
- if
- length(DataList) < RowNo ->
- {notext, undefined};
- true ->
- DataItem = lists:nth(RowNo, DataList),
- if
- is_tuple(DataItem) ->
- if size(DataItem) < ColNo ->
- {notext, DataItem};
- true ->
- {{element(ColNo, DataItem)}, DataItem}
- end;
- true ->
- {{DataItem}, DataItem}
- end
- end.
-
-
-
-
-
-
-
-
-show_toolbar_editor(ProcVars) ->
- #process_variables{frame_params = FrameP,
- toolbar_params = ToolP} = ProcVars,
-
- #frame_params{toolbar_frame_height = THeight} = FrameP,
-
- #toolbar_params{editor_frame_id = EdFrameId} = ToolP,
-
- Xpos = 0,
- Ypos = THeight - 8 - ?ROW_COL_LBL_HEIGHT + 1,
- gs:config(EdFrameId, [{x, Xpos},
- {y, Ypos}
- ]),
- ProcVars.
-
-
-
-
-
-
-
-
-hide_toolbar_editor(ProcVars) ->
- #process_variables{toolbar_params = ToolP} = ProcVars,
-
- #toolbar_params{editor_frame_id = EdFrameId} = ToolP,
-
- Xpos = 0,
- Ypos = (-1) * gs:read(EdFrameId, height) - 50,
- gs:config(EdFrameId, [{x, Xpos},
- {y, Ypos}
- ]),
- ProcVars.
-
-
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-
-
-update_toolbar_editor(EdId, notext) ->
- gs:config(EdId, [{enable, true}]),
- gs:config(EdId, [clear]),
- gs:config(EdId, [{enable, false}]);
-update_toolbar_editor(EdId, {DataToShow}) ->
- Str = io_lib:format("~n~p~n", [DataToShow]),
- gs:config(EdId, [{enable, true}]),
- gs:config(EdId, [clear]),
- gs:config(EdId, [{overwrite, {insert, Str}}]),
- gs:config(EdId, [{enable, false}]).
-
-
-
-
-
-
-update_marks(true, _DataList, _ColorList, _MarkedRowData,
- _Pos, _NofRowsShown, _Writable, _Range, PcPid, PgPid, RecPid, ToolP, MarkP) ->
- PgPid ! #pg_remove_marks{sender = self()},
- %% Too much trouble trying to find the marked object again!
- %% On the other hand, is the mark based on the row number
- %% or the row content? Probably different strategies now, depending
- %% on where in the code we are... :-(
- %% update_toolbar_label(notext, ToolP, undefined, undefined, Writable),
- update_toolbar_editor(ToolP#toolbar_params.editor_id, notext),
- send_to_rec_edit(RecPid, insert_mode),
- PcPid ! #pc_marked_row{sender = self(),
- row_no = undefined,
- object = undefined,
- color = undefined
- },
- MarkP#mark_params{cell_col_no = undefined,
- row_no = undefined,
- virtual_row_no = undefined,
- marked_object = undefined,
- marked_color = undefined
- };
-update_marks(false, DataList, ColorList, MarkedRowData,
- Pos, NofRowsShown, Writable, Range, PcPid, PgPid, RecPid, ToolP, MarkP) ->
- #mark_params{cell_col_no = CellColNo,
- virtual_row_no = VirtualRowNo} = MarkP,
-
- % Marked row data contains the color also!
- {RowData, RowColors} = split_dblist(MarkedRowData, [], []),
-
- case VirtualRowNo of
- undefined ->
- MarkP;
- _AnyRow ->
- if
- VirtualRowNo > element(2, Range) ->
- %% Mark outside the existing list! Uh-uh, remove the mark immediately! 8-0
- update_marks(true, DataList, ColorList, MarkedRowData, Pos, NofRowsShown,
- Writable, Range, PcPid, PgPid, RecPid, ToolP, MarkP);
- true ->
- {DataElement, RowObj} = choose_data_to_show(VirtualRowNo, CellColNo, RowData,
- DataList, Pos),
- {_, RowObjColor} = choose_data_to_show(VirtualRowNo, CellColNo, RowColors,
- ColorList, Pos),
- case DataElement of
- notext ->
- %% send_to_rec_edit(RecPid, insert_mode);
- done;
- _OtherElement ->
- %% send_to_rec_edit(RecPid, {update_mode, RowObj})
- send_to_rec_edit(RecPid, {reset_info, RowObj})
- end,
-
- %% case RowObj of
- %% OldMarkedObj ->
- %% done;
- %% _NewObj ->
- %% update_toolbar_label(DataElement, ToolP, VirtualRowNo,
- %% CellColNo, Writable)
- %% end,
-
- %% update_toolbar_label(DataElement,ToolP,VirtualRowNo,CellColNo,Writable),
-
- update_toolbar_editor(ToolP#toolbar_params.editor_id, DataElement),
- MarkP#mark_params{marked_object = RowObj,
- marked_color = RowObjColor}
- end
- end.
-
-
-
-
-
-choose_data_to_show(VirtualRowNo, undefined, _RowData, DataList, Pos) when VirtualRowNo >= Pos, VirtualRowNo =< (Pos + length(DataList) - 1) ->
- get_data_element(row, DataList, VirtualRowNo - Pos + 1, undefined);
-choose_data_to_show(_VirtualRowNo, undefined, RowData, _DataList, _Pos) ->
- get_data_element(row, RowData, 1, undefined);
-choose_data_to_show(VirtualRowNo, CellColNo, _RowData, DataList, Pos)
- when VirtualRowNo >= Pos, VirtualRowNo =< (Pos + length(DataList) - 1) ->
- get_data_element(cell, DataList, VirtualRowNo - Pos + 1, CellColNo);
-choose_data_to_show(_VirtualRowNo, CellColNo, RowData, _DataList, _Pos) ->
- get_data_element(cell, RowData, 1, CellColNo).
-
-
-
-
-
-
-get_new_scalepos(Btn, LastScalePos) ->
- receive
- {gs, _Id, click, _Data, [NewScalePos | _T]} ->
- get_new_scalepos(Btn, NewScalePos);
-
- {gs, _Id, buttonrelease, _Data, [Btn | _T]} ->
- LastScalePos;
-
- {gs, _Id, buttonrelease, _Data, _Args} ->
- get_new_scalepos(Btn, LastScalePos);
-
- {gs, _Id, buttonpress, _Data, _Args} ->
- get_new_scalepos(Btn, LastScalePos)
-
- end.
-
-
-
-
-
-
-
-split_dblist([], DataAcc, ColorAcc) ->
- {lists:reverse(DataAcc), lists:reverse(ColorAcc)};
-split_dblist([{Data, Color} | Tail], DataAcc, ColorAcc) ->
- split_dblist(Tail, [Data | DataAcc], [Color | ColorAcc]).
-
-
-
-
-
-
-
-
-init_toolbar(FrameP, ToolP) ->
- #frame_params{display_id = DispId,
- toolbar_frame_id = TId,
- toolbar_frame_width = TWidth,
- toolbar_frame_height = THeight,
- grid_frame_width = GWidth} = FrameP,
-
- NewToolP = init_toolbar_btns(TId, ToolP),
- {RowColLblId, BgLabelId, FgLabelId, BtnId} =
- init_toolbar_label(TId, TWidth, THeight, GWidth),
-
- PopUpFrame = gs:frame(TId, [{width, 80},
- {height, 20},
- {x, 0},
- {y, -30},
- {bg, {0, 0, 0}}
- ]),
-
- PopUpLabel = gs:label(PopUpFrame, [{width, 78},
- {height, 18},
- {bg, {255,255,190}},
- {x,1},
- {y,1},
- {align, center},
- {label, {text,""}},
- {font,{screen,12}}]),
-
- {EditorFrameId, EditorId} = init_toolbar_editor(DispId, TWidth, THeight),
-
- NewToolP#toolbar_params{parent_id = TId,
- row_col_label_id = RowColLblId,
- bg_label_id = BgLabelId,
- fg_label_id = FgLabelId,
- label_btn_id = BtnId,
- pop_up_frame_id = PopUpFrame,
- pop_up_label_id = PopUpLabel,
- editor_frame_id = EditorFrameId,
- editor_id = EditorId
- }.
-
-
-
-
-
-
-init_toolbar_btns(TId, ToolP) ->
- PicDir = code:priv_dir(tv),
-% PicDir = "../priv",
- % Toolbar btns are 25x25, the bitmaps are 20x20.
- create_one_toolbar_btn(TId, 1, PicDir ++ "/edit1.xbm",
- {toolbar, insert_object, "Edit Object"}),
- create_one_toolbar_btn(TId, 3, PicDir ++ "/search.xbm",
- {toolbar, search_object, "Search Object"}),
- create_one_toolbar_btn(TId, 5, PicDir ++ "/sort.xbm",
- {toolbar, sort_rising_order, "Sort Ascending"}),
- create_one_toolbar_btn(TId, 6, PicDir ++ "/no_sort.xbm",
- {toolbar, no_sorting,"No Sorting"}),
- create_one_toolbar_btn(TId, 7, PicDir ++ "/sort_reverse.xbm",
- {toolbar, sort_falling_order,"Sort Descending"}),
- create_one_toolbar_btn(TId, 9, PicDir ++ "/poll.xbm",
- {toolbar, poll_table,"Poll Table"}),
- create_one_toolbar_btn(TId, 11, PicDir ++ "/info.xbm",
- {toolbar, table_info,"Table Info"}),
- create_one_toolbar_btn(TId, 13, PicDir ++ "/help.xbm",
- {toolbar, help_button, "Help"}),
- ToolP.
-
-
-
-
-
-
-
-
-create_one_toolbar_btn(ParentId, N, Image, Data) ->
- BtnWidth = 25,
- BtnHeight = 25,
- StartXpos = 0,
- BtnXpos = StartXpos + ((N - 1) * BtnWidth),
- BtnYpos = 2,
- BgColor = ?DEFAULT_BG_COLOR,
- FgColor = {178,34,34}, % Firebrick
-
- gs:button(ParentId, [{width, BtnWidth},
- {height, BtnHeight},
- {x, BtnXpos},
- {y, BtnYpos},
- {enter, true},
- {leave, true},
- {label, {image, Image}},
- {data, Data},
- {fg, FgColor},
- {bg, BgColor}
- ]).
-
-
-
-
-
-resize_toolbar(FrameP, ToolP) ->
- #frame_params{toolbar_frame_width = TWidth,
- toolbar_frame_height = THeight,
- grid_frame_width = GWidth} = FrameP,
-
- #toolbar_params{bg_label_id = BgId,
- fg_label_id = FgId,
- row_col_label_id = RowColId,
- label_btn_id = BtnId,
- editor_frame_id = FrId,
- editor_id = EdId} = ToolP,
-
- resize_toolbar_label(BgId, FgId, RowColId, BtnId, TWidth, THeight, GWidth),
- resize_toolbar_editor(FrId, EdId, TWidth, THeight),
- ToolP.
-
-
-
-
-
-
-
-
-init_toolbar_label(ParentId, ParentWidth, ParentHeight, GWidth) ->
- {BgWidth, BgHeight, BgXpos, BgYpos, FgWidth, FgHeight, FgXpos, FgYpos, BtnWidth,
- BtnHeight, BtnXpos, BtnYpos} =
- get_toolbar_label_coords(ParentWidth, ParentHeight),
-
- BgId = gs:label(ParentId, [{width, BgWidth},
- {height, BgHeight},
- {x, BgXpos},
- {y, BgYpos},
- {bg, {0, 0, 0}},
- {fg, {0, 0, 0}}
- ]),
-
-
- RowColLblHeight = ?ROW_COL_LBL_HEIGHT,
- RowColLblWidth = GWidth - ?VBTN_WIDTH,
- RowColLblYpos = BgYpos + RowColLblHeight + 18,
-
- RowColLblId = gs:label(ParentId, [{width, RowColLblWidth},
- {height, RowColLblHeight},
- {x, ?VBTN_WIDTH},
- {y, RowColLblYpos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {178,34,34}},
- {align,center},
- {font,{screen,12}},
- {label, {text,""}}
- ]),
-
- FgId = gs:entry(editentry, ParentId, [{width, FgWidth},
- {height, FgHeight},
- {x, FgXpos},
- {y, FgYpos},
- {bg, {255,255,255}},
- {fg, {0,0,0}},
- {bw, 1},
- {font,{screen,12}},
- {justify, left},
- {cursor, arrow},
- {setfocus, false},
- {enable, false},
- {keypress,true}
- ]),
-
- PicDir = code:priv_dir(tv),
- BtnId = gs:button(ParentId, [{width, BtnWidth},
- {height, BtnHeight},
- {x, BtnXpos},
- {y, BtnYpos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {label, {image, PicDir ++ "/more.xbm"}},
- {data, {labelbtn, pop_up}}
- ]),
-
- {RowColLblId, BgId, FgId, BtnId}.
-
-
-
-
-
-
-
-init_toolbar_editor(DispId, TWidth, THeight) ->
- {BgWidth, BgHeight, BgXpos, BgYpos, Width, Height, Xpos, Ypos} =
- get_toolbar_editor_coords(TWidth, THeight),
-
- EditorFrame = gs:frame(DispId, [{width, BgWidth},
- {height, BgHeight},
- {x, BgXpos},
- {y, BgYpos},
- {bg, {0, 0, 0}}
- ]),
-
- Editor = gs:editor(EditorFrame, [{width, Width},
- {height, Height},
- {x, Xpos},
- {y, Ypos},
- {vscroll, right},
- {wrap, word},
- {bg, {255, 255, 255}},
- {fg, {0, 0, 0}},
- {enable, false}
- ]),
-
- {EditorFrame, Editor}.
-
-
-
-
-
-
-
-get_toolbar_editor_coords(TWidth, _THeight) ->
- BgWidth = TWidth,
- BgHeight = 200,
- BgXpos = 0,
- BgYpos = (-1) * BgHeight - 50,
- FgWidth = BgWidth - 2,
- FgHeight = BgHeight - 2,
- FgXpos = 1,
- FgYpos = 1,
-
- {BgWidth, BgHeight, BgXpos, BgYpos, FgWidth, FgHeight, FgXpos, FgYpos}.
-
-
-
-
-
-
-resize_toolbar_editor(FrId, EdId, TWidth, THeight) ->
- {BgWidth, BgHeight, _BgXpos, _BgYpos, FgWidth, FgHeight, _FgXpos, _FgYpos} =
- get_toolbar_editor_coords(TWidth, THeight),
- gs:config(FrId, [{width, BgWidth},
- {height, BgHeight}
- ]),
-
- gs:config(EdId, [{width, FgWidth},
- {height, FgHeight}
- ]).
-
-
-
-
-
-
-resize_toolbar_label(BgId, FgId, RowColId, BtnId, ParentWidth, ParentHeight, GWidth) ->
- {BgWidth, BgHeight, _BgXpos, _BgYpos, FgWidth, FgHeight, _FgXpos, _FgYpos, _BtnWidth,
- _BtnHeight, BtnXpos, BtnYpos} =
- get_toolbar_label_coords(ParentWidth, ParentHeight),
-
- gs:config(RowColId, [{width, GWidth - ?VBTN_WIDTH}]),
-
- gs:config(BgId, [{width, BgWidth},
- {height, BgHeight}
- ]),
-
- gs:config(BtnId, [{x, BtnXpos},
- {y, BtnYpos}
- ]),
-
- gs:config(FgId, [{width, FgWidth},
- {height, FgHeight}
- ]).
-
-
-
-
-
-get_toolbar_label_coords(ParentWidth, ParentHeight) ->
- BtnWidth = 19,
- BgWidth = ParentWidth,
- BgHeight = 26,
- BgXpos = 0,
- BgYpos = ParentHeight - BgHeight - 8 - ?ROW_COL_LBL_HEIGHT + 2,
- FgHeight = BgHeight - 2,
- FgWidth = BgWidth - BtnWidth - 3,
- FgXpos = BgXpos + 1,
- FgYpos = BgYpos + 1,
- BtnHeight = BgHeight - 2,
- BtnXpos = FgWidth + 2,
- BtnYpos = BgYpos + 1,
-
- {BgWidth, BgHeight, BgXpos, BgYpos, FgWidth, FgHeight, FgXpos, FgYpos, BtnWidth,
- BtnHeight, BtnXpos, BtnYpos}.
-
-
-
-
-
-
-send_to_rec_edit(undefined, _Msg) ->
- done;
-send_to_rec_edit(RecPid, Msg) ->
- RecPid ! Msg.
-
-
-
-
diff --git a/lib/tv/src/tv_pd_frames.erl b/lib/tv/src/tv_pd_frames.erl
deleted file mode 100644
index aab40e2bba..0000000000
--- a/lib/tv/src/tv_pd_frames.erl
+++ /dev/null
@@ -1,482 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. 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(tv_pd_frames).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,frame,2}}]).
-
-
-
--export([create_display_frames/4, resize_display_frames/3]).
-
-
-
-
--include("tv_int_def.hrl").
--include("tv_pd_int_def.hrl").
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_display_frames(WindowId, WindowWidth, WindowHeight, FrameP) ->
- {DisplayId, DisplayWidth, DisplayHeight} =
- create_frame(WindowId,
- get_display_coords(WindowWidth, WindowHeight),
- ?DEFAULT_BG_COLOR,
- 0),
-
- {ToolbarId, ToolbarWidth, ToolbarHeight} = create_toolbar_frame(DisplayId,
- DisplayWidth),
-
- {SheetFrameId, SheetBgFrameId, SheetFrameWidth, SheetFrameHeight} =
- create_sheet_frames(DisplayId,
- DisplayWidth,
- DisplayHeight),
-
- {GridFrameId, GridBgFrameId, GridFrameWidth, GridFrameHeight} =
- create_grid_frames(SheetFrameId,
- SheetFrameWidth,
- SheetFrameHeight),
-
-
- FrameP#frame_params{display_id = DisplayId,
- toolbar_frame_id = ToolbarId,
- toolbar_frame_width = ToolbarWidth,
- toolbar_frame_height = ToolbarHeight,
- sheet_frame_id = SheetFrameId,
- sheet_frame_width = SheetFrameWidth,
- sheet_frame_height = SheetFrameHeight,
- sheet_bgframe_id = SheetBgFrameId,
- grid_frame_id = GridFrameId,
- grid_frame_width = GridFrameWidth,
- grid_frame_height = GridFrameHeight,
- grid_bgframe_id = GridBgFrameId
- }.
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_display_frames(NewW, NewH, FrameP) ->
- #frame_params{display_id = DispId,
- toolbar_frame_id = ToolbarId,
- sheet_frame_id = SheetFgId,
- sheet_bgframe_id = SheetBgId,
- grid_frame_id = GridFgId,
- grid_bgframe_id = GridBgId} = FrameP,
-
- {NewDispW, NewDispH} = config_frame(DispId, get_display_coords(NewW, NewH)),
- {NewToolW, NewToolH} = resize_toolbar(ToolbarId, NewDispW),
- {NewSheetFgW, NewSheetFgH} = resize_sheet_frames(SheetFgId, SheetBgId, NewDispW,
- NewDispH),
-
- {NewGridFgW, NewGridFgH} = resize_grid_frames(GridFgId, GridBgId, NewSheetFgW,
- NewSheetFgH),
-
- FrameP#frame_params{toolbar_frame_width = NewToolW,
- toolbar_frame_height = NewToolH,
- sheet_frame_width = NewSheetFgW,
- sheet_frame_height = NewSheetFgH,
- grid_frame_width = NewGridFgW,
- grid_frame_height = NewGridFgH
- }.
-
-
-
-
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-config_frame(Id, {Width, Height, Xpos, Ypos}) ->
- gs:config(Id, [{width, Width},
- {height, Height},
- {x, Xpos},
- {y, Ypos}
- ]),
- {Width, Height}.
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_frame(ParentId, {Width, Height, Xpos, Ypos}, Color, BorderWidth) ->
- Id = gs:frame(ParentId, [{width, Width},
- {height, Height},
- {x, Xpos},
- {y, Ypos},
- {bw, BorderWidth},
- {bg, Color}
- ]),
- {Id, Width, Height}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_grid_frames(SheetFrameId, SheetFrameWidth, SheetFrameHeight) ->
- {BgId, _W, _H} =
- create_frame(SheetFrameId,
- get_grid_frame_coords(bg, SheetFrameWidth, SheetFrameHeight),
- ?BLACK,
- 0),
- {FgId, FgWidth, FgHeight} =
- create_frame(SheetFrameId,
- get_grid_frame_coords(fg, SheetFrameWidth, SheetFrameHeight),
- ?DEFAULT_BG_COLOR,
- 0),
- {FgId, BgId, FgWidth, FgHeight}.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_sheet_frames(DispId, DispWidth, DispHeight) ->
- {BgId, _W, _H} = create_frame(DispId,
- get_sheet_frame_coords(bg, DispWidth, DispHeight),
- ?BLACK,
- 0),
- {FgId, FgWidth, FgHeight} =
- create_frame(DispId,
- get_sheet_frame_coords(fg, DispWidth, DispHeight),
- ?DEFAULT_BG_COLOR,
- 0),
- {FgId, BgId, FgWidth, FgHeight}.
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_toolbar_frame(DispId, DispWidth) ->
- create_frame(DispId, get_toolbar_coords(DispWidth), ?DEFAULT_BG_COLOR, 0).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_display_coords(WindowWidth, WindowHeight) ->
- Xpos = 4,
- {WindowWidth - 2 * Xpos, WindowHeight - ?MENUBAR_HEIGHT - Xpos, Xpos, ?MENUBAR_HEIGHT}.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_grid_frame_coords(bg, FrameWidth, FrameHeight) ->
- get_grid_frame_coords2(FrameWidth, FrameHeight, 0);
-get_grid_frame_coords(fg, FrameWidth, FrameHeight) ->
- get_grid_frame_coords2(FrameWidth, FrameHeight, 1).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_grid_frame_coords2(FrameWidth, FrameHeight, BorderWidth) ->
- Xpos = 0,
- Ypos = 0,
- Width = FrameWidth - ?VSCALE_WIDTH - Xpos - BorderWidth,
- Height = FrameHeight - ?HSCALE_HEIGHT - Ypos - BorderWidth,
- {Width, Height, Xpos, Ypos}.
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_sheet_frame_coords(bg, FrameWidth, FrameHeight) ->
- get_sheet_frame_coords2(FrameWidth, FrameHeight, 0);
-get_sheet_frame_coords(fg, FrameWidth, FrameHeight) ->
- get_sheet_frame_coords2(FrameWidth, FrameHeight, 1).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_sheet_frame_coords2(FrameWidth, FrameHeight, BorderWidth) ->
- Xpos = BorderWidth,
- Ypos = ?TOOLBAR_HEIGHT + BorderWidth,
- Width = FrameWidth - 2 * BorderWidth,
- Height = FrameHeight - Ypos - ?MISC_AREA_HEIGHT - BorderWidth,
- {Width, Height, Xpos, Ypos}.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_toolbar_coords(DispWidth) ->
- Xpos = 0,
- {DispWidth - 2 * Xpos, ?TOOLBAR_HEIGHT, Xpos, 0}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_grid_frames(FgId, BgId, ParentWidth, ParentHeight) ->
- config_frame(BgId, get_grid_frame_coords(bg, ParentWidth, ParentHeight)),
- config_frame(FgId, get_grid_frame_coords(fg, ParentWidth, ParentHeight)).
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_sheet_frames(FgId, BgId, ParentWidth, ParentHeight) ->
- config_frame(BgId, get_sheet_frame_coords(bg, ParentWidth, ParentHeight)),
- config_frame(FgId, get_sheet_frame_coords(fg, ParentWidth, ParentHeight)).
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_toolbar(Id, DispWidth) ->
- config_frame(Id, get_toolbar_coords(DispWidth)).
-
-
-
diff --git a/lib/tv/src/tv_pd_int_def.hrl b/lib/tv/src/tv_pd_int_def.hrl
deleted file mode 100644
index 2c76bef892..0000000000
--- a/lib/tv/src/tv_pd_int_def.hrl
+++ /dev/null
@@ -1,139 +0,0 @@
-%%
-%% %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%
-%%%*********************************************************************
-%%%
-%%% Description: Internal definitions for the pd part of the table tool.
-%%%
-%%%*********************************************************************
-
--define(SCALE_FUNC_FILE, tv_pd_scale).
--define(DISP_FUNC_FILE, tv_pd_display).
-
-
--define(SCALE_WIDTH, 75).
--define(VSCALE_WIDTH, 75).
--define(HSCALE_HEIGHT, 75).
--define(MENUBAR_HEIGHT, 30).
--define(TOOLBAR_HEIGHT, 84). %% 97
--define(DISPLAY_HEIGHT, 849).
--define(MISC_AREA_HEIGHT, 0).
--define(GRID_HEIGHT, 849).
--define(NOF_GRIDROWS, 35). %% 29
--define(NOF_GRIDCOLS, 10).
--define(DEFAULT_COLWIDTH, 100).
--define(ROW_HEIGHT, 20). %% 24
--define(VBTN_WIDTH, 55). %% 18
--define(HBTN_HEIGHT, 20).
--define(RESBTN_WIDTH, 5).
--define(DEFAULT_GRID_BGCOLOR, {255,255,255}).
--define(DEFAULT_GRID_FGCOLOR, {0,0,0}).
--define(GRID_MARK_COLOR, {0,255,255}).
--define(GRID_FONT, {courier,12}).
-
--define(ROW_COL_LBL_WIDTH, 140).
--define(ROW_COL_LBL_HEIGHT, 14).
-
-
-
--define(KEY_MARK_AREA_HEIGHT, 21).
-
-
--define(DEFAULT_BG_COLOR, {217,217,217}).
--define(DEFAULT_ROW_COLOR, {178,34,34}). % Firebrick!
--define(DEFAULT_GRID_COLOR, {0,0,0}).
--define(LIGHT_GRAY, {226,226,226}).
--define(DARK_VIOLET, {148,0,211}).
--define(FIREBRICK, {178,34,34}).
--define(ANTIQUE_WHITE, {255,255,235}).
-
-
--record(frame_params, {display_id,
- toolbar_frame_id,
- toolbar_frame_width,
- toolbar_frame_height,
- sheet_frame_id,
- sheet_frame_width,
- sheet_frame_height,
- sheet_bgframe_id,
- grid_frame_id,
- grid_frame_width,
- grid_frame_height,
- grid_bgframe_id
- }).
-
-
-
-
--record(scale_params, {vscale_id,
- vscale_pos = 0,
- hscale_id,
- hscale_pos = 0
- }).
-
-
-
-
--record(mark_params, {cell_id,
- cell_col_no, % Virtual number!
- row_no, % Real number!
- virtual_row_no,
- col_no, % Virtual number!
- sort_col_no,
- marked_object,
- marked_color
- }).
-
-
-
--record(toolbar_params, {parent_id,
- row_col_label_id,
- bg_label_id,
- fg_label_id,
- label_btn_id,
- pop_up_frame_id,
- pop_up_label_id,
- editor_frame_id,
- editor_id
- }).
-
-
--record(process_variables, {master_pid,
- pg_pid,
- pb_pid,
- rec_pid,
- window_id,
- window_width,
- window_height,
- initialising = true,
- table_type,
- table_name,
- record_name,
- writable = false,
- lists_as_strings = true,
- sorting_on = false,
- first_col_shown = 1,
- first_row_shown = 1,
- nof_rows_shown,
- cols_shown = [],
- data_list = [],
- color_list = [],
- frame_params = #frame_params{},
- scale_params = #scale_params{},
- mark_params = #mark_params{},
- toolbar_params = #toolbar_params{}
- }).
diff --git a/lib/tv/src/tv_pd_int_msg.hrl b/lib/tv/src/tv_pd_int_msg.hrl
deleted file mode 100644
index faf23a9376..0000000000
--- a/lib/tv/src/tv_pd_int_msg.hrl
+++ /dev/null
@@ -1,433 +0,0 @@
-%%
-%% %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%
-
-
-%%%*********************************************************************
-%%% MESSAGES OWNED BY PG
-%%%*********************************************************************
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pg_init_grid, {sender,
- parent_id,
- width,
- height,
- xpos,
- ypos,
- nof_rows,
- row_height
- }).
-
-
-
--record(pg_list_info, {sender,
- lists_as_strings}).
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pg_col_info, {sender,
- first_col_shown,
- width_of_cols_shown,
- nof_rows_shown
- }).
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pg_col_marked, {sender,
- virtual_col
- }).
-
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pg_row_marked, {sender,
- virtual_row
- }).
-
-
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
--record(pg_data, {sender,
- data,
- first_row_shown
- }).
-
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
--record(pg_cell_marked, {sender,
- cell_marked, % true or false
- real_col,
- real_row,
- virtual_col,
- virtual_row,
- cell_text
- }).
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
--record(pg_resize_grid, {sender,
- width,
- height
- }).
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
--record(pg_resize_grid_col, {sender,
- real_col_no,
- virtual_col_no,
- xdiff
- }).
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
--record(pg_horizontal_scroll, {sender,
- leftmost_virtual_col
- }).
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pg_ready, {sender}).
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pg_remove_marks, {sender}).
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pg_mark_col, {sender,
- virtual_col,
- real_col
- }).
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pg_mark_row, {sender,
- virtual_row,
- real_row
- }).
-
-
-
-
-
-
-%%%*********************************************************************
-%%% MESSAGES OWNED BY PB
-%%%*********************************************************************
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
--record(pb_init_btns, {sender,
- parent_id,
- parent_width,
- parent_height,
- ypos,
- hbtn_height,
- resbtn_width,
- vbtn_width,
- nof_rows,
- row_height,
- first_col_shown,
- cols_shown
- }).
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pb_remove_marks, {sender}).
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pb_update_hbtns, {sender,
- parent_width,
- parent_height,
- first_col_shown,
- cols_shown
- }).
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pb_update_vbtns, {sender,
- color_list,
- first_row_shown,
- nof_rows_shown,
- blinking_enabled
- }).
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pb_key_info, {sender,
- list_of_keys
- }).
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pb_new_colwidth, {sender,
- real_col,
- virtual_col,
- xdiff
- }).
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pb_col_marked, {sender,
- col_marked, % 'true' or 'false'
- real_col,
- virtual_col
- }).
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pb_row_marked, {sender,
- row_marked, % 'true' or 'false'
- real_row,
- virtual_row
- }).
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pb_set_sort_col, {sender,
- virtual_col
- }).
-
-
-
-
diff --git a/lib/tv/src/tv_pd_scale.erl b/lib/tv/src/tv_pd_scale.erl
deleted file mode 100644
index 04af2bb981..0000000000
--- a/lib/tv/src/tv_pd_scale.erl
+++ /dev/null
@@ -1,305 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. 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%
-%%%*********************************************************************
-%%%
-%%% Description: Part of pd controlling the scale, i.e., the scrollbar
-%%% imitation.
-%%%
-%%%*********************************************************************
-
-
--module(tv_pd_scale).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,scale,2}}]).
-
-
-
--export([init_scale/2,
- resize_scale/2,
- set_scale_range/3,
- set_scale_pos/3]).
-
-
-
--include("tv_int_def.hrl").
--include("tv_pd_int_def.hrl").
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-init_scale(FrameP, ScaleP) ->
- #frame_params{sheet_frame_id = SheetFrameId,
- sheet_frame_width = SheetFrameWidth,
- sheet_frame_height = SheetFrameHeight,
- grid_frame_width = GridFrameWidth,
- grid_frame_height = GridFrameHeight} = FrameP,
-
- VScaleId = create_scale(vscale, SheetFrameId, SheetFrameWidth, GridFrameHeight),
- HScaleId = create_scale(hscale, SheetFrameId, GridFrameWidth, SheetFrameHeight),
-
- ScaleP#scale_params{vscale_id = VScaleId,
- vscale_pos = 0,
- hscale_id = HScaleId,
- hscale_pos = 0
- }.
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_scale(FrameP, ScaleP) ->
- #frame_params{sheet_frame_width = SheetFrameWidth,
- sheet_frame_height = SheetFrameHeight,
- grid_frame_width = GridFrameWidth,
- grid_frame_height = GridFrameHeight} = FrameP,
-
- #scale_params{vscale_id = VScaleId,
- hscale_id = HScaleId} = ScaleP,
-
- config_scale(vscale, VScaleId, SheetFrameWidth, GridFrameHeight),
- config_scale(hscale, HScaleId, GridFrameWidth, SheetFrameHeight),
- ScaleP.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-set_scale_range(vscale, Range, ScaleP) ->
- {Lo, Hi} = Range,
- NewRange = if
- Lo > Hi ->
- {Hi, Hi};
- true ->
- Range
- end,
- VScaleId = ScaleP#scale_params.vscale_id,
- gs:config(VScaleId, [{range, NewRange}]);
-set_scale_range(hscale, Range, ScaleP) ->
- {Lo, Hi} = Range,
- NewRange = if
- Lo > Hi ->
- {Hi, Hi};
- true ->
- Range
- end,
- HScaleId = ScaleP#scale_params.hscale_id,
- gs:config(HScaleId, [{range, NewRange}]).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-set_scale_pos(_ScaleName, undefined, ScaleP) ->
- ScaleP;
-set_scale_pos(vscale, NewPos, ScaleP) ->
- ScaleId = ScaleP#scale_params.vscale_id,
- gs:config(ScaleId, [{pos, NewPos}]),
- ScaleP#scale_params{vscale_pos = NewPos};
-set_scale_pos(hscale, NewPos, ScaleP) ->
- ScaleId = ScaleP#scale_params.hscale_id,
- gs:config(ScaleId, [{pos, NewPos}]),
- ScaleP#scale_params{hscale_pos = NewPos}.
-
-
-
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-config_scale(ScaleName, ScaleId, FrameWidth, FrameHeight) ->
- {Width, Height, Xpos, Ypos} = get_scale_coords(ScaleName,
- FrameWidth,
- FrameHeight),
- gs:config(ScaleId, [{height, Height},
- {width, Width},
- {x, Xpos},
- {y, Ypos}
- ]).
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_scale(ScaleName, FrameId, FrameWidth, FrameHeight) ->
- {Width, Height, Xpos, Ypos} = get_scale_coords(ScaleName,
- FrameWidth,
- FrameHeight),
- {Orientation, Range} = case ScaleName of
- vscale ->
- {vertical, {1, 1}};
- hscale ->
- {horizontal, {1, 1}}
- end,
- gs:scale(FrameId, [{data, ScaleName},
- {orient, Orientation},
- {buttonpress, true},
- {buttonrelease, true},
- {height, Height},
- {width, Width},
- {x, Xpos},
- {y, Ypos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {range, Range}
- ]).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_scale_coords(hscale, FrameWidth, FrameHeight) ->
- Height = ?HSCALE_HEIGHT,
- Xpos = ?VBTN_WIDTH - 3, % Subtracting 3 makes it look better!
- Ypos = FrameHeight - Height,
- Width = FrameWidth - Xpos + 5, % Adding 5 for better look!
- {Width, Height, Xpos, Ypos};
-get_scale_coords(vscale, FrameWidth, FrameHeight) ->
- Width = ?VSCALE_WIDTH,
- Xpos = (FrameWidth - Width),
- Ypos = ?HBTN_HEIGHT - 3, % Subtracting 3 makes it look better!
- Height = FrameHeight - Ypos + 5, % Adding 5 for better look!
- {Width, Height, Xpos, Ypos}.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_pg.erl b/lib/tv/src/tv_pg.erl
deleted file mode 100644
index 7194cfb756..0000000000
--- a/lib/tv/src/tv_pg.erl
+++ /dev/null
@@ -1,430 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. 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(tv_pg).
--compile([{nowarn_deprecated_function,{gs,config,2}}]).
-
-
-
--export([pg/1]).
-
-
--include("tv_int_def.hrl").
--include("tv_pg_int_def.hrl").
--include("tv_pd_int_msg.hrl").
-
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function: pg.
-%%
-%% Return Value: None.
-%%
-%% Description: Process controlling the grid part of the display.
-%%
-%% Parameters: None.
-%%======================================================================
-
-
-pg(ParentPid) ->
- process_flag(trap_exit, true),
- ProcVars = #process_variables{parent_pid = ParentPid},
- loop(ProcVars).
-
-
-
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-
-
-%%======================================================================
-%% Function: loop.
-%%
-%% Return Value: None.
-%%
-%% Description: Eternal (well, almost) loop, receiving messages and
-%% handling them.
-%%
-%% Parameters:
-%%======================================================================
-
-
-
-loop(ProcVars) ->
- receive
- Msg ->
- case Msg of
-
-
- #pg_data{} ->
- GridId = mark_busy(ProcVars),
- NewProcVars = update_grid_data(Msg, ProcVars),
- mark_nonbusy(GridId),
- loop(NewProcVars);
-
- #pg_list_info{lists_as_strings=ListAsStr} ->
- NewProcVars = tv_pg_gridfcns:handle_list_info(ListAsStr, ProcVars),
- loop(NewProcVars);
-
- #pg_horizontal_scroll{} ->
- GridId = mark_busy(ProcVars),
- NewProcVars = scroll_grid_horizontally(Msg, ProcVars),
- mark_nonbusy(GridId),
- loop(NewProcVars);
-
- #pg_remove_marks{} ->
- GridId = mark_busy(ProcVars),
- NewProcVars = tv_pg_gridfcns:remove_marks(ProcVars),
- mark_nonbusy(GridId),
- loop(NewProcVars);
-
- #pg_col_marked{} ->
- GridId = mark_busy(ProcVars),
- NewProcVars = mark_grid_col(Msg, ProcVars),
- mark_nonbusy(GridId),
- loop(NewProcVars);
-
- #pg_row_marked{} ->
- GridId = mark_busy(ProcVars),
- NewProcVars = mark_grid_row(Msg, ProcVars),
- mark_nonbusy(GridId),
- loop(NewProcVars);
-
- #pg_resize_grid_col{} ->
- GridId = mark_busy(ProcVars),
- NewProcVars = resize_grid_column(Msg, ProcVars),
- mark_nonbusy(GridId),
- loop(NewProcVars);
-
- #pg_resize_grid{} ->
- GridId = mark_busy(ProcVars),
- NewProcVars = resize_grid(Msg, ProcVars),
- mark_nonbusy(GridId),
- loop(NewProcVars);
-
- #pg_init_grid{} ->
- GridId = mark_busy(ProcVars),
- NewProcVars = init_grid(Msg, ProcVars),
- mark_nonbusy(GridId),
- PdPid = ProcVars#process_variables.parent_pid,
- PdPid ! #pg_ready{sender = self()},
- loop(NewProcVars);
-
- {gs, Id, Event, Data, Args} ->
- GridId = mark_busy(ProcVars),
- NewProcVars = gs_messages({Id, Event, Data, Args}, ProcVars),
- mark_nonbusy(GridId),
- loop(NewProcVars);
-
-
- {'EXIT', Pid, Reason} ->
- ParentPid = ProcVars#process_variables.parent_pid,
- exit_signals({Pid, Reason}, ParentPid, ProcVars),
- loop(ProcVars);
-
- _Other ->
- loop(ProcVars)
- end
- end.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-exit_signals(ExitInfo, ParentPid, _ProcVars) ->
- case ExitInfo of
- {ParentPid, _Reason} ->
- exit(normal);
- _Other ->
- done
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-gs_messages(Msg, ProcVars) ->
-
- case Msg of
-
- {Id, buttonpress, {gridcell, RealCol, RealRow, _FrameId}, [1 | _]} ->
- NewProcVars = tv_pg_gridfcns:mark_cell_and_notify(Id, RealCol,
- RealRow, ProcVars),
- NewProcVars;
-
-
- _OtherMessage ->
- ProcVars
-
- end.
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-init_grid(Msg, ProcVars) ->
- #pg_init_grid{parent_id = ParentId,
- width = Width,
- height = Height,
- xpos = Xpos,
- ypos = Ypos,
- nof_rows = NofRows,
- row_height = RowHeight} = Msg,
- tv_pg_gridfcns:init_grid(ParentId, Width, Height, Xpos, Ypos, NofRows,
- RowHeight, ProcVars).
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_grid(Msg, ProcVars) ->
- #pg_resize_grid{width = Width,
- height = Height} = Msg,
- tv_pg_gridfcns:resize_grid(Width, Height, ProcVars).
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_grid_column(Msg, ProcVars) ->
- #pg_resize_grid_col{real_col_no = RealCol,
- virtual_col_no = VirtualCol,
- xdiff = Xdiff} = Msg,
- tv_pg_gridfcns:resize_grid_column(RealCol, VirtualCol, Xdiff, ProcVars).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-scroll_grid_horizontally(Msg, ProcVars) ->
- FirstColShown = ?COMM_FUNC_FILE:max(1, Msg#pg_horizontal_scroll.leftmost_virtual_col),
- tv_pg_gridfcns:scroll_grid_horizontally(FirstColShown, ProcVars).
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_grid_data(Msg, ProcVars) ->
- #pg_data{data = Data,
- first_row_shown = FirstRowShown} = Msg,
- tv_pg_gridfcns:update_grid_data(Data, FirstRowShown, ProcVars).
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_grid_col(Msg, ProcVars) ->
- #pg_col_marked{virtual_col = VirtualCol} = Msg,
- tv_pg_gridfcns:mark_col(VirtualCol, ProcVars).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_grid_row(Msg, ProcVars) ->
- #pg_row_marked{virtual_row = VirtualRow} = Msg,
- tv_pg_gridfcns:mark_row(VirtualRow, ProcVars).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_busy(ProcVars) ->
- GridP = ProcVars#process_variables.grid_params,
- GridId = GridP#grid_params.fg_frame,
- gs:config(GridId, [{cursor, busy}]),
- GridId.
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_nonbusy(GridId) ->
- gs:config(GridId, [{cursor, arrow}]).
-
diff --git a/lib/tv/src/tv_pg_gridfcns.erl b/lib/tv/src/tv_pg_gridfcns.erl
deleted file mode 100644
index d037b42294..0000000000
--- a/lib/tv/src/tv_pg_gridfcns.erl
+++ /dev/null
@@ -1,1918 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. 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(tv_pg_gridfcns).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,frame,2}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,read,2}}]).
-
-
-
-
--export([init_grid/8,
- resize_grid/3,
- resize_grid_column/4,
- update_grid_data/3,
- scroll_grid_horizontally/2,
- mark_cell_and_notify/4,
- remove_marks/1,
- mark_col/2,
- mark_row/2,
- handle_list_info/2
- ]).
-
-
-
-
-
--include("tv_pd_int_msg.hrl").
--include("tv_pg_int_def.hrl").
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-init_grid(GridParentId, GridWidth,
- GridHeight, GridXpos, GridYpos, NofRows, RowHeight, ProcVars) ->
-
- % Get the size and ID of the grid-parent frame, i.e., the
- % grid-frame! Do not confuse the base-frames below with
- % the grid-frame!
-
- #process_variables{parent_pid = ParentPid,
- grid_params = GridP} = ProcVars,
-
- #grid_params{fg_color = GridFgColor,
- nof_cols = NofCols,
- col_width = DefaultColWidth,
- first_col_shown = FirstColShown,
- col_widths = ColWidths} = GridP,
-
- % Create the two frames the column frames are placed on!
- % These two frames defines the size of the grid.
- BgFrame = create_base_frame(GridParentId, GridWidth, GridHeight,
- GridXpos, GridYpos, GridFgColor),
- FgFrame = create_base_frame(BgFrame, GridWidth - 1, GridHeight - 1,
- 0, 0, GridFgColor),
-
- % Compute the the colwidths necessary to cover the grid.
- ColsShown = compute_cols_shown(FirstColShown, ColWidths, GridWidth, NofCols,
- DefaultColWidth),
- NofRowsShown = compute_rows_shown(GridHeight, RowHeight),
-
- % Tell parent about the width of columns shown!
- ParentPid ! #pg_col_info{sender = self(),
- first_col_shown = FirstColShown,
- width_of_cols_shown = ColsShown,
- nof_rows_shown = NofRowsShown
- },
-
- NewNofCols = erlang:max(length(ColsShown), NofCols),
-
- % The GridColWidths list shall contain the current width of each frame.
- NewColWidths = update_col_widths(ColsShown, ColWidths, FirstColShown,
- DefaultColWidth),
-
- % Create column frames, one for each column, and rows (labels) on each frame.
- {FrameIdList, ColLabelList} = create_col_frames(NewNofCols, NofRows, RowHeight,
- FgFrame, GridP, [], []),
-
- % Get lists of label-ID's for each row. (When we created the column frames,
- % we got the id's of labels placed on each column, i.e., vertically.
- % However, most often we want the id's for one row, i.e., label id's
- % horisontally.)
- RowIdList = get_row_ids(NofRows, ColLabelList, []),
-
- % Update the grid_params record with the new values!
- NewGridP = GridP#grid_params{bg_frame = BgFrame,
- fg_frame = FgFrame,
- grid_width = GridWidth,
- grid_height = GridHeight,
- grid_xpos = GridXpos,
- grid_ypos = GridYpos,
- nof_cols = NewNofCols,
- col_widths = NewColWidths,
- cols_shown = ColsShown,
- nof_rows = NofRows,
- row_height = RowHeight,
- nof_rows_shown = NofRowsShown,
- col_frame_ids = FrameIdList,
- col_ids = ColLabelList,
- row_ids = RowIdList,
- row_data_list = lists:duplicate(NofRows, notext)
- },
-
- ProcVars#process_variables{grid_parent_id = GridParentId,
- grid_params = NewGridP}.
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_grid(NewWidth, NewHeight, ProcVars) ->
- #process_variables{parent_pid = ParentPid,
- grid_params = GridP,
- mark_params = MarkP} = ProcVars,
-
- #grid_params{bg_frame = BgFrame,
- fg_frame = FgFrame,
- nof_cols = NofCols,
- nof_rows = NofRows,
- col_width = DefaultColWidth,
- first_col_shown = FirstColShown,
- col_widths = ColWidths,
- row_height = RowHeight,
- col_frame_ids = ColFrameIds,
- col_ids = ColIds,
- row_ids = RowIds,
- bg_color = BgColor,
- fg_color = FgColor,
- row_data_list = RowDataList,
- lists_as_strings = ListAsStr} = GridP,
-
- gs:config(BgFrame, [{width, NewWidth},
- {height, NewHeight}
- ]),
- gs:config(FgFrame, [{width, NewWidth - 1},
- {height, NewHeight - 1}
- ]),
-
- ColsShown = compute_cols_shown(FirstColShown, ColWidths, NewWidth, NofCols,
- DefaultColWidth),
-
- NofRowsShown = compute_rows_shown(NewHeight, RowHeight),
-
-
- % Tell parent about the width of columns shown!
- ParentPid ! #pg_col_info{sender = self(),
- first_col_shown = FirstColShown,
- width_of_cols_shown = ColsShown,
- nof_rows_shown = NofRowsShown
- },
-
- NewColWidths = update_col_widths(ColsShown, ColWidths, FirstColShown,
- DefaultColWidth),
-
- NofColsShown = length(ColsShown),
- {NewNofCols, NewColFrameIds, NewColIds, NewRowIds} =
- check_nof_cols(ColsShown, (NofColsShown - NofCols), ColFrameIds, ColIds,
- RowIds, NofRows, RowHeight, FgColor, BgColor ),
-
- clear_fields(safe_nthtail(NofColsShown, NewColIds),
- safe_nthtail(NofRowsShown, NewRowIds)),
-
- RowsToUpdate = lists:sublist(NewRowIds, NofRowsShown),
-
- refresh_visible_rows(RowsToUpdate, FirstColShown, NofColsShown, RowDataList, ListAsStr),
-
- NewGridP = GridP#grid_params{grid_width = NewWidth,
- grid_height = NewHeight,
- nof_cols = NewNofCols,
- nof_rows_shown = NofRowsShown,
- cols_shown = ColsShown,
- col_widths = NewColWidths,
- col_frame_ids = NewColFrameIds,
- col_ids = NewColIds,
- row_ids = NewRowIds
- },
-
- refresh_marks(NewGridP, MarkP),
-
- ProcVars#process_variables{grid_params = NewGridP}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_grid_column(RealCol, VirtualCol, Xdiff, ProcVars) ->
- #process_variables{parent_pid = ParentPid,
- grid_params = GridP,
- mark_params = MarkP} = ProcVars,
-
- #grid_params{grid_width = GridWidth,
- first_col_shown = FirstColShown,
- nof_cols = NofCols,
- col_widths = ColWidths,
- col_frame_ids = ColFrameIds,
- col_ids = ColIds,
- col_width = DefaultColWidth,
- row_ids = RowIds,
- max_col_width = MaxColWidth,
- min_col_width = MinColWidth,
- nof_rows = NofRows,
- nof_rows_shown = NofRowsShown,
- row_height = RowHeight,
- bg_color = BgColor,
- fg_color = FgColor,
- row_data_list = RowDataList,
- lists_as_strings = ListAsStr} = GridP,
-
- % Get new width!
- Width = erlang:min(MaxColWidth, erlang:max((lists:nth(VirtualCol, ColWidths) + Xdiff),
- MinColWidth)),
-
- % Resize the column.
- NewWidthOfCol = resize_one_column(RealCol, Width, ColFrameIds, MaxColWidth,
- MinColWidth),
-
- % Update the ColWidths list.
- TempColWidths = lists:sublist(ColWidths, VirtualCol - 1) ++
- [NewWidthOfCol | safe_nthtail(VirtualCol, ColWidths)],
-
- % Check the other columns, whether a new column has to be created.
- ColsShown = compute_cols_shown(FirstColShown, TempColWidths, GridWidth,
- NofCols, DefaultColWidth),
-
- % Get the final ColWidths list, after all updates!
- NewColWidths = update_col_widths(ColsShown, TempColWidths, FirstColShown,
- DefaultColWidth),
-
- % Tell parent about the width of columns shown!
- ParentPid ! #pg_col_info{sender = self(),
- first_col_shown = FirstColShown,
- width_of_cols_shown = ColsShown,
- nof_rows_shown = NofRowsShown
- },
-
- % Get the new number of columns (may have changed).
- NofColsShown = length(ColsShown),
- {NewNofCols, NewColFrameIds, NewColIds, NewRowIds} =
- check_nof_cols(ColsShown, (NofColsShown - NofCols), ColFrameIds, ColIds,
- RowIds, NofRows, RowHeight, FgColor, BgColor ),
-
- RowsToUpdate = lists:sublist(NewRowIds, NofRowsShown),
- refresh_visible_rows(RowsToUpdate, FirstColShown, NofColsShown, RowDataList, ListAsStr),
-
- NewGridP = GridP#grid_params{nof_cols = NewNofCols,
- cols_shown = ColsShown,
- col_widths = NewColWidths,
- col_frame_ids = NewColFrameIds,
- col_ids = NewColIds,
- row_ids = NewRowIds
- },
-
- refresh_marks(NewGridP, MarkP),
-
- ProcVars#process_variables{grid_params = NewGridP}.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-handle_list_info(ListAsStr, ProcVars) ->
- #process_variables{grid_params = GridP} = ProcVars,
-
- #grid_params{first_col_shown = FirstColShown,
- cols_shown = ColsShown,
- nof_rows_shown = NofRowsShown,
- row_data_list = RowDataList,
- row_ids = RowIds,
- lists_as_strings = OldListAsStr} = GridP,
-
- case ListAsStr of
- OldListAsStr ->
- ProcVars;
- _NewValue ->
- NofColsShown = length(ColsShown),
- RowsToUpdate = lists:sublist(RowIds, NofRowsShown),
- refresh_visible_rows(RowsToUpdate, FirstColShown, NofColsShown,
- RowDataList, ListAsStr),
- NewGridP = GridP#grid_params{lists_as_strings = ListAsStr},
- ProcVars#process_variables{grid_params = NewGridP}
- end.
-
-
-
-
-update_grid_data(Data, FirstRowShown, ProcVars) ->
- #process_variables{grid_params = GridP,
- mark_params = MarkP} = ProcVars,
-
- #grid_params{first_col_shown = FirstColShown,
- cols_shown = ColsShown,
- nof_rows = NofRows,
- nof_rows_shown = NofRowsShown,
- row_ids = RowIds,
- lists_as_strings = ListAsStr} = GridP,
-
- NofColsShown = length(ColsShown),
- RowsToUpdate = lists:sublist(RowIds, NofRowsShown),
-
- NewMarkP = move_marks(FirstColShown, FirstRowShown, GridP, MarkP),
-
- update_visible_rows(RowsToUpdate, FirstColShown, NofColsShown, Data, ListAsStr),
- NewRowDataList = make_row_data_list(1, NofRows, Data),
-
- NewGridP = GridP#grid_params{first_row_shown = FirstRowShown,
- row_data_list = NewRowDataList},
-
- ProcVars#process_variables{grid_params = NewGridP,
- mark_params = NewMarkP}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-scroll_grid_horizontally(NewFirstColShown, ProcVars) ->
- #process_variables{parent_pid = ParentPid,
- grid_params = GridP,
- mark_params = MarkP} = ProcVars,
-
- #grid_params{grid_width = Width,
- nof_cols = NofCols,
- nof_rows = NofRows,
- nof_rows_shown = NofRowsShown,
- first_row_shown = FirstRowShown,
- col_width = DefaultColWidth,
- max_col_width = MaxColWidth,
- min_col_width = MinColWidth,
- col_widths = ColWidths,
- row_height = RowHeight,
- col_frame_ids = ColFrameIds,
- col_ids = ColIds,
- row_ids = RowIds,
- bg_color = BgColor,
- fg_color = FgColor,
- row_data_list = RowDataList,
- lists_as_strings = ListAsStr} = GridP,
-
- % Probably it is unnecessary to check whether any new columns shall be
- % created or not, but what the heck, we don't want to crash...
- ColsShown = compute_cols_shown(NewFirstColShown, ColWidths, Width, NofCols,
- DefaultColWidth),
- NofColsShown = length(ColsShown),
-
- ParentPid ! #pg_col_info{sender = self(),
- first_col_shown = NewFirstColShown,
- width_of_cols_shown = ColsShown,
- nof_rows_shown = NofRowsShown
- },
-
- NewMarkP = move_marks(NewFirstColShown, FirstRowShown, GridP, MarkP),
-
- NewColWidths = update_col_widths(ColsShown, ColWidths, NewFirstColShown,
- DefaultColWidth),
-
- {NewNofCols, NewColFrameIds, NewColIds, NewRowIds} =
- check_nof_cols(ColsShown, (NofColsShown - NofCols), ColFrameIds, ColIds,
- RowIds, NofRows, RowHeight, FgColor, BgColor ),
-
-
- RowsToUpdate = lists:sublist(NewRowIds, NofRowsShown),
- resize_all_grid_columns(1, ColsShown, NewColFrameIds, MaxColWidth, MinColWidth),
-
- refresh_visible_rows(RowsToUpdate, NewFirstColShown, NofColsShown, RowDataList, ListAsStr),
-
- % Clear fields currently not visible.
- clear_fields(safe_nthtail(NofColsShown, NewColIds),
- safe_nthtail(NofRowsShown, NewRowIds)),
-
-
- NewGridP = GridP#grid_params{nof_cols = NewNofCols,
- cols_shown = ColsShown,
- col_widths = NewColWidths,
- col_frame_ids = NewColFrameIds,
- col_ids = NewColIds,
- row_ids = NewRowIds,
- first_col_shown = NewFirstColShown
- },
-
- ProcVars#process_variables{grid_params = NewGridP,
- mark_params = NewMarkP}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_row(VirtualRow, ProcVars) ->
- #process_variables{grid_params = GridP,
- mark_params = MarkP} = ProcVars,
-
- #grid_params{first_row_shown = FirstRowShown,
- nof_rows_shown = NofRowsShown,
- row_ids = RowIds} = GridP,
-
- mark_row(VirtualRow, FirstRowShown, FirstRowShown + NofRowsShown - 1, RowIds,
- ?GRID_MARK_COLOR),
-
- NewMarkP = MarkP#mark_params{cell_id = undefined,
- virtual_col = undefined,
- virtual_row = VirtualRow
- },
-
- ProcVars#process_variables{mark_params = NewMarkP}.
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_col(VirtualCol, ProcVars) ->
- #process_variables{grid_params = GridP,
- mark_params = MarkP} = ProcVars,
-
- #grid_params{first_col_shown = FirstColShown,
- cols_shown = ColsShown,
- col_ids = ColIds} = GridP,
-
- NofColsShown = length(ColsShown),
- mark_col(VirtualCol, FirstColShown, FirstColShown + NofColsShown - 1, ColIds,
- ?GRID_MARK_COLOR),
-
- NewMarkP = MarkP#mark_params{cell_id = undefined,
- virtual_col = VirtualCol,
- virtual_row = undefined
- },
-
- ProcVars#process_variables{mark_params = NewMarkP}.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_cell_and_notify(CellId, RealCol, RealRow, ProcVars) ->
- #process_variables{parent_pid = ParentPid,
- grid_params = GridP,
- mark_params = MarkP} = ProcVars,
-
- #grid_params{first_col_shown = FirstColShown,
- first_row_shown = FirstRowShown} = GridP,
-
- OldCellId = MarkP#mark_params.cell_id,
-
- VirtualCol = FirstColShown + RealCol - 1,
- VirtualRow = FirstRowShown + RealRow - 1,
-
- %% Right now, when the table tool only is passive, i.e., we cannot edit
- %% the table content, we don't want to be able to mark empty cells.
-
- {text, CellText} = gs:read(CellId, label),
-
- CellMarked = case CellText of
- "" -> false;
- _AnyText when CellId=:=OldCellId -> false;
- _AnyText -> true
- end,
-
- remove_marks(ProcVars),
- update_marked_cells(CellId, OldCellId, CellMarked),
-
- notify_about_cell_marked(ParentPid, CellMarked, RealCol, RealRow,
- VirtualCol, VirtualRow, CellText),
-
- NewMarkP = case CellMarked of
- true ->
- MarkP#mark_params{cell_id = CellId,
- virtual_col = VirtualCol,
- virtual_row = VirtualRow
- };
- false ->
- MarkP#mark_params{cell_id = undefined,
- virtual_col = 0,
- virtual_row = undefined
- }
- end,
-
- ProcVars#process_variables{mark_params = NewMarkP}.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-remove_marks(ProcVars) ->
- #process_variables{mark_params = MarkP,
- grid_params = GridP} = ProcVars,
-
- #grid_params{first_col_shown = FirstColShown,
- cols_shown = ColsShown,
- col_ids = ColIds,
- first_row_shown = FirstRowShown,
- nof_rows_shown = NofRowsShown,
- row_ids = RowIds} = GridP,
-
-
- #mark_params{cell_id = CellId,
- virtual_col = VirtualCol,
- virtual_row = VirtualRow} = MarkP,
-
- case {VirtualCol, VirtualRow} of
- {undefined, undefined} ->
- update_marked_cells(CellId, CellId, false);
- {_AnyCol, undefined} ->
- NofColsShown = length(ColsShown),
- unmark_col(VirtualCol, FirstColShown, FirstColShown + NofColsShown - 1,
- ColIds);
- {undefined, _AnyRow} ->
- unmark_row(VirtualRow, FirstRowShown, FirstRowShown + NofRowsShown - 1,
- RowIds);
- _Other ->
- update_marked_cells(CellId, CellId, false)
- end,
-
- NewMarkP = MarkP#mark_params{cell_id = undefined,
- virtual_col = 0,
- virtual_row = undefined
- },
- ProcVars#process_variables{mark_params = NewMarkP}.
-
-
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-move_marks(FirstCol, FirstRow, GridP, MarkP) ->
- #grid_params{first_col_shown = OldFirstCol,
- cols_shown = ColsShown,
- first_row_shown = OldFirstRow,
- nof_rows_shown = NofRowsShown,
- col_ids = ColIds,
- row_ids = RowIds} = GridP,
-
- #mark_params{virtual_col = VirtualCol,
- virtual_row = VirtualRow} = MarkP,
-
-
- case {VirtualCol, VirtualRow} of
- {undefined, undefined} ->
- NofColsShown = length(ColsShown),
- move_marked_cell(FirstCol, FirstRow, NofColsShown,
- NofRowsShown, RowIds, MarkP);
- {_AnyCol, undefined} ->
- NofColsShown = length(ColsShown),
- OldLastCol = OldFirstCol + NofColsShown - 1,
- LastCol = FirstCol + NofColsShown - 1,
- move_marked_col(VirtualCol, OldFirstCol, OldLastCol,
- FirstCol, LastCol, ColIds, MarkP);
- {undefined, _AnyRow} ->
- OldLastRow = OldFirstRow + NofRowsShown - 1,
- LastRow = FirstRow + NofRowsShown - 1,
- move_marked_row(VirtualRow, OldFirstRow, OldLastRow,
- FirstRow, LastRow, RowIds, MarkP);
- {_CellCol, _CellRow} ->
- NofColsShown = length(ColsShown),
- move_marked_cell(FirstCol, FirstRow, NofColsShown,
- NofRowsShown, RowIds, MarkP)
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-refresh_marks(GridP, MarkP) ->
- #grid_params{first_col_shown = FirstCol,
- cols_shown = ColsShown,
- first_row_shown = FirstRow,
- nof_rows_shown = NofRowsShown,
- col_ids = ColIds,
- row_ids = RowIds} = GridP,
-
- #mark_params{virtual_col = VirtualCol,
- virtual_row = VirtualRow} = MarkP,
-
-
- case {VirtualCol, VirtualRow} of
- {undefined, undefined} ->
- NofColsShown = length(ColsShown),
- move_marked_cell(FirstCol, FirstRow, NofColsShown, NofRowsShown,
- RowIds, MarkP);
- {_AnyCol, undefined} ->
- NofColsShown = length(ColsShown),
- LastCol = FirstCol + NofColsShown - 1,
- mark_col(VirtualCol, FirstCol, LastCol, ColIds, ?GRID_MARK_COLOR);
- {undefined, _AnyRow} ->
- LastRow = FirstRow + NofRowsShown - 1,
- mark_row(VirtualRow, FirstRow, LastRow, RowIds, ?GRID_MARK_COLOR);
- {_CellCol, _CellRow} ->
- NofColsShown = length(ColsShown),
- move_marked_cell(FirstCol, FirstRow, NofColsShown, NofRowsShown,
- RowIds, MarkP)
- end.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-move_marked_col(VirtualCol,
- OldFirstCol, OldLastCol, FirstCol, LastCol, ColIds, MarkP) ->
- unmark_col(VirtualCol, OldFirstCol, OldLastCol, ColIds),
- mark_col(VirtualCol, FirstCol, LastCol, ColIds, ?GRID_MARK_COLOR),
- MarkP#mark_params{cell_id = undefined}.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_col(VirtualCol, FirstCol, _LastCol, _ColIds, _Color) when VirtualCol < FirstCol ->
- done;
-mark_col(VirtualCol, _FirstCol, LastCol, _ColIds, _Color) when VirtualCol > LastCol ->
- done;
-mark_col(VirtualCol, FirstCol, _LastCol, ColIds, Color) ->
- RealCol = VirtualCol - FirstCol + 1,
- MarkedColIds = lists:nth(RealCol, ColIds),
- mark_all_cells(MarkedColIds, Color).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-unmark_col(VirtualCol, FirstCol, LastCol, ColIds) ->
- mark_col(VirtualCol, FirstCol, LastCol, ColIds, ?DEFAULT_GRID_BGCOLOR).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_all_cells([], _Color) ->
- done;
-mark_all_cells([CellId | T], Color) ->
- gs:config(CellId, [{bg, Color}]),
- mark_all_cells(T, Color).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_row(VirtualRow, FirstRow, _LastRow, _RowIds, _Color) when VirtualRow < FirstRow ->
- done;
-mark_row(VirtualRow, _FirstRow, LastRow, _RowIds, _Color) when VirtualRow > LastRow ->
- done;
-mark_row(VirtualRow, FirstRow, _LastRow, RowIds, Color) ->
- RealRow = VirtualRow - FirstRow + 1,
- MarkedRowIds = lists:nth(RealRow, RowIds),
- mark_all_cells(MarkedRowIds, Color).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-unmark_row(VirtualRow, FirstRow, LastRow, RowIds) ->
- mark_row(VirtualRow, FirstRow, LastRow, RowIds, ?DEFAULT_GRID_BGCOLOR).
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-move_marked_row(VirtualRow,
- OldFirstRow, OldLastRow, FirstRow, LastRow, RowIds, MarkP) ->
- unmark_row(VirtualRow, OldFirstRow, OldLastRow, RowIds),
- mark_row(VirtualRow, FirstRow, LastRow, RowIds, ?GRID_MARK_COLOR),
- MarkP#mark_params{cell_id = undefined}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-move_marked_cell(FirstColShown,
- FirstRowShown, NofColsShown, NofRowsShown, RowIds, MarkP) ->
- #mark_params{cell_id = OldCellId,
- virtual_col = VirtualCol,
- virtual_row = VirtualRow} = MarkP,
-
- case OldCellId of
- undefined ->
- MarkP;
- _OtherId ->
- NewRealCol = VirtualCol - FirstColShown + 1,
- NewRealRow = VirtualRow - FirstRowShown + 1,
- update_marked_cells(undefined, OldCellId, false),
- case check_if_new_mark_visible(NewRealCol, NewRealRow,
- NofColsShown, NofRowsShown) of
- false ->
- MarkP;
- true ->
- NewCellId = lists:nth(NewRealCol,
- lists:nth(NewRealRow, RowIds)),
- update_marked_cells(NewCellId, undefined, true),
- MarkP#mark_params{cell_id = NewCellId}
- end
- end.
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-check_if_new_mark_visible(Col, _Row, NofCols, _NofRows) when Col > NofCols ->
- false;
-check_if_new_mark_visible(Col, _Row, _NofCols, _NofRows) when Col =< 0 ->
- false;
-check_if_new_mark_visible(_Col, Row, _NofCols, NofRows) when Row > NofRows ->
- false;
-check_if_new_mark_visible(_Col, Row, _NofCols, _NofRows) when Row =< 0 ->
- false;
-check_if_new_mark_visible(_Col, _Row, _NofCols, _NofRows) ->
- true.
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_marked_cells(CellId, OldCellId, _MarkedCell) when CellId =:= OldCellId ->
- gs:config(CellId, [{bg, ?DEFAULT_GRID_BGCOLOR}]);
-update_marked_cells(_CellId, undefined, false) ->
- done;
-update_marked_cells(CellId, undefined, true) ->
- gs:config(CellId, [{bg, ?GRID_MARK_COLOR}]);
-update_marked_cells(CellId, OldCellId, true) ->
- gs:config(OldCellId, [{bg, ?DEFAULT_GRID_BGCOLOR}]),
- gs:config(CellId, [{bg, ?GRID_MARK_COLOR}]);
-update_marked_cells(_CellId, OldCellId, false) ->
- gs:config(OldCellId, [{bg, ?DEFAULT_GRID_BGCOLOR}]).
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-notify_about_cell_marked(Pid, Marked, RealCol, RealRow, VirtCol, VirtRow, Text) ->
- Pid ! #pg_cell_marked{sender = self(),
- cell_marked = Marked,
- real_col = RealCol,
- real_row = RealRow,
- virtual_col = VirtCol,
- virtual_row = VirtRow,
- cell_text = Text
- }.
-
-
-
-
-
-
-
-
-%%%---------------------------------------------------------------------
-%%% START of functions used to print data in the grid fields.
-%%%---------------------------------------------------------------------
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-refresh_visible_rows([], _FirstColShown, _NofColsShown, _DataList, _ListAsStr) ->
- done;
-refresh_visible_rows(RowIds, _FirstColShown, _NofColsShown, [], _ListAsStr) ->
- clear_cols_or_rows(RowIds);
-refresh_visible_rows([OneRowIds | RemRowIds], FirstColShown, NofColsShown,
- [DataItemList | RemDataItemLists], ListAsStr) ->
- NewDataItemList = get_data_sublist(DataItemList, FirstColShown, NofColsShown),
- update_one_row(lists:sublist(OneRowIds, NofColsShown), NewDataItemList, ListAsStr),
- refresh_visible_rows(RemRowIds, FirstColShown, NofColsShown, RemDataItemLists, ListAsStr).
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_visible_rows([], _FirstColShown, _NofColsShown, _DataList, _ListAsStr) ->
- done;
-update_visible_rows(RowIds, _FirstColShown, _NofColsShown, [], _ListAsStr) ->
- clear_cols_or_rows(RowIds);
-update_visible_rows([OneRowIds | RemRowIds], FirstColShown, NofColsShown,
- [DataItem | RemData], ListAsStr) ->
- % We convert the received item to a list! This way we know that
- % '[notext]' shall be printed as 'notext', while 'notext' shall
- % be printed as ''.
- TempDataItemList = item_to_list(DataItem),
- DataItemList = get_data_sublist(TempDataItemList, FirstColShown,
- NofColsShown),
- update_one_row(lists:sublist(OneRowIds, NofColsShown), DataItemList, ListAsStr),
- update_visible_rows(RemRowIds, FirstColShown, NofColsShown, RemData, ListAsStr).
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_one_row(OneRowIds, [], _ListAsStr) ->
- clear_one_col_or_row(OneRowIds);
-update_one_row([], _DataItemList, _ListAsStr) ->
- done;
-update_one_row([LabelId | RemLabelIds], [notext | T], ListAsStr) ->
- gs:config(LabelId, [{label, {text, ""}}
- ]),
- update_one_row(RemLabelIds, T, ListAsStr);
-update_one_row([LabelId | RemLabelIds], [DataElem | T], ListAsStr) ->
- Str = case ListAsStr of
- true ->
- tv_io_lib:format(" ~p", [DataElem]);
- false ->
- " " ++ lists:flatten(tv_io_lib:write(DataElem))
- end,
- gs:config(LabelId, [{label, {text, Str}}
- ]),
- update_one_row(RemLabelIds, T, ListAsStr).
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-make_row_data_list(N, NofRows, []) when N > NofRows ->
- [];
-make_row_data_list(N, NofRows, []) ->
- % If NofRows == N, we get the empty list here!
- lists:duplicate(NofRows- N, notext);
-make_row_data_list(N, NofRows, [_DataItem | _RemData]) when N > NofRows ->
- [];
-make_row_data_list(N, NofRows, [DataItem | RemData]) ->
- % We convert the received item to a list! This way we know that
- % '[notext]' shall be printed as 'notext', while 'notext' shall
- % be printed as ''.
- [item_to_list(DataItem) | make_row_data_list(N + 1, NofRows, RemData)].
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-item_to_list(Item) when is_tuple(Item) ->
- tuple_to_list(Item);
-item_to_list(Item) ->
- [Item].
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_data_sublist(DataList, StartPos, Length) ->
- case catch lists:sublist(DataList, StartPos, Length) of
- {'EXIT', _Reason} ->
- [];
- Sublist ->
- Sublist
- end.
-
-
-
-
-
-
-
-%%%---------------------------------------------------------------------
-%%% END of functions used to print data in the grid fields.
-%%%---------------------------------------------------------------------
-
-
-
-
-
-%%%---------------------------------------------------------------------
-%%% START of functions used to resize the grid columns.
-%%%---------------------------------------------------------------------
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_all_grid_columns(_RealCol, [], _ColFrameIds, _MaxColWidth, _MinColWidth) ->
- done;
-resize_all_grid_columns(RealCol, [ColWidth | Tail], ColFrameIds, MaxColWidth, MinColWidth) ->
-
- resize_one_column(RealCol, ColWidth, ColFrameIds, MaxColWidth, MinColWidth),
- resize_all_grid_columns(RealCol + 1, Tail, ColFrameIds, MaxColWidth,
- MinColWidth).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_one_column(RealCol, Width, ColFrameIds, MaxW, MinW) ->
- NewWidthOfCol = erlang:min(MaxW, erlang:max(Width, MinW)),
- case length(ColFrameIds) of
- RealCol ->
- done;
- _Other ->
- FrameId = lists:nth(RealCol + 1, ColFrameIds),
- gs:config(FrameId, [{x, NewWidthOfCol + 1}])
- end,
- NewWidthOfCol.
-
-
-
-
-%%%---------------------------------------------------------------------
-%%% END of functions used to resize the grid columns.
-%%%---------------------------------------------------------------------
-
-
-
-
-
-
-%%%---------------------------------------------------------------------
-%%% START of functions used to update the grid.
-%%%---------------------------------------------------------------------
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-clear_fields(ColIds, RowIds) ->
- clear_cols_or_rows(ColIds),
- clear_cols_or_rows(RowIds).
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-clear_cols_or_rows([]) ->
- done;
-clear_cols_or_rows([IdList | RemIdLists]) ->
- clear_one_col_or_row(IdList),
- clear_cols_or_rows(RemIdLists).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-clear_one_col_or_row([]) ->
- done;
-clear_one_col_or_row([LabelId | RemLabelIds]) ->
- gs:config(LabelId, [{label, {text, ""}}
- ]),
- clear_one_col_or_row(RemLabelIds).
-
-
-
-
-
-%%%---------------------------------------------------------------------
-%%% END of functions used to update the grid.
-%%%---------------------------------------------------------------------
-
-
-
-
-
-
-%%%---------------------------------------------------------------------
-%%% START of functions used to compute the part of the grid that has to
-%%% be updated, as well as deciding whether a new column has to be added.
-%%% Old columns (i.e., columns not visible) are not removed, but they
-%%% shall not be updated until they once again becomes visible.
-%%%---------------------------------------------------------------------
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-check_nof_cols(_ColsShown, NofNewCols, ColFrameIds, ColIds, RowIds,
- _NofRows, _RowHeight, _FgColor, _BgColor) when NofNewCols =< 0 ->
- {length(ColFrameIds), ColFrameIds, ColIds, RowIds};
-check_nof_cols(ColsShown, NofNewCols, ColFrameIds, ColIds,
- RowIds, NofRows, RowHeight, FgColor, BgColor) ->
- NewColNo = length(ColFrameIds) + 1,
- % We don't care about the pathological case where no columns have been
- % created. If the gridwidth, or the columnwidth, was set to =< 0 during
- % initialisation, then no columns will have been created. The program
- % will probably also have crashed. If any smart jackass has set invalid
- % values on these important parameters, then he can only blame himself.
- ParentId = lists:nth((NewColNo - 1), ColFrameIds),
- ParentColWidth = lists:nth((NewColNo - 1), ColsShown),
- Xpos = ParentColWidth + 1,
-
- {ColFrameId, LabelIds} = add_one_col_frame(ParentId, NewColNo, Xpos, FgColor,
- BgColor, NofRows, RowHeight),
-
- NewColFrameIds = ColFrameIds ++ [ColFrameId],
- NewColIds = ColIds ++ [LabelIds],
- NewRowIds = update_row_ids(RowIds, LabelIds),
-
- check_nof_cols(ColsShown, NofNewCols - 1, NewColFrameIds, NewColIds, NewRowIds,
- NofRows, RowHeight, FgColor, BgColor).
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_row_ids([], _LabelIds) ->
- [];
-update_row_ids([OneRowIds | RemainingRows], [NewElemId | RemainingElemIds]) ->
- [OneRowIds ++ [NewElemId] | update_row_ids(RemainingRows, RemainingElemIds)].
-
-
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_col_widths(ColsShown, ColWidths, FirstColShown, DefaultColWidth) ->
- % What we do here is that we first (if necessary) add default
- % column widths to the ColWidth list until it reaches to where
- % ColsShown starts (vitually seen).
- % In the second step we take the appropriate elements from the
- % ColsShown list and add them to the ColWidths list, until it is
- % of sufficient length.
- % Of course this may seem unnecessary - it would suffice to just
- % add default widths to the ColWidths list until it is long enough,
- % since the compute_cols_shown function right now just adds default
- % width columns to the ColsShown list, when the ColWidths list is empty.
- % However, this could change (maybe we some other time want the last
- % column to carry all remaining width, instead of adding new columns).
- % Besides, we don't like hidden dependencies between functions!!!
-
- NofColsShown = length(ColsShown),
- NewColWidths = set_necessary_col_widths_length(FirstColShown, ColWidths,
- DefaultColWidth),
- % Now NofVirtualCols will always be equal to, or greater
- % than, FirstColShown - 1.
-
- NofVirtualCols = length(NewColWidths),
- NecessaryNofVirtualCols = FirstColShown + (NofColsShown - 1),
- if
- NecessaryNofVirtualCols > NofVirtualCols ->
- TailNo = NofVirtualCols - FirstColShown + 1, % Always >= 0 !!!
- NewColWidths ++ safe_nthtail(TailNo, ColsShown);
- true ->
- NewColWidths
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-set_necessary_col_widths_length(FirstColShown, ColWidths, DefaultColWidth) ->
- % First check that (length(ColWidths) - FirstColShown) >= -1.
- % If not, add elements so the relation holds true!
- MissingDefaultWidthElems = FirstColShown - length(ColWidths),
- if
- MissingDefaultWidthElems > 1 ->
- ColWidths ++ lists:duplicate(MissingDefaultWidthElems - 1,
- DefaultColWidth);
- true ->
- ColWidths
- end.
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-compute_rows_shown(GridHeight, RowHeight) ->
- (GridHeight div RowHeight) + 1.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-compute_cols_shown(FirstColShown, ColWidths, GridWidth, _NofCols, DefaultColWidth) ->
- ColWidthsLength = length(ColWidths),
- % Normally ColWidths shall be long enough, but just to make sure...
- % (We could have chosen to update ColWidths here to, but right now
- % we do it instead explicitly when resizeing the grid, changing the
- % column size(s), and scrolling horizontally.)
- UsedColWidths = if
- ColWidthsLength < FirstColShown ->
- [];
- true ->
- safe_nthtail(FirstColShown - 1, ColWidths)
- end,
- compute_cols_shown(UsedColWidths, GridWidth, DefaultColWidth).
-
-
-
-
-
-
-compute_cols_shown(_ColWidths, RemainingWidth, _DefColW) when RemainingWidth =< 0 ->
- [];
-compute_cols_shown([], RemainingWidth, DefaultColWidth) ->
- [DefaultColWidth | compute_cols_shown([], RemainingWidth - DefaultColWidth,
- DefaultColWidth)];
-compute_cols_shown([VirtualColWidth | T], RemainingWidth, DefaultColWidth) ->
- [VirtualColWidth | compute_cols_shown(T, RemainingWidth - VirtualColWidth,
- DefaultColWidth)].
-
-
-
-
-
-%%%---------------------------------------------------------------------
-%%% END of functions used to compute the part of the grid that has to
-%%% be updated, as well as deciding whether a new column has to be added.
-%%%---------------------------------------------------------------------
-
-
-
-
-
-
-
-%%%---------------------------------------------------------------------
-%%% START of functions used to create the grid (baseframes, columns
-%%% and rows), as well as sorting the ID's appropriately.
-%%%---------------------------------------------------------------------
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_base_frame(ParentId, Width, Height, Xpos, Ypos, BgColor) ->
- gs:frame(ParentId, [{width, Width},
- {height, Height},
- {x, Xpos},
- {y, Ypos},
- {bg, BgColor}
- ]).
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_col_frames(0, _NofRows, _RowHeight, _ParentId, _GridP, ColFrameAcc, LabelAcc) ->
- {lists:reverse(ColFrameAcc), lists:reverse(LabelAcc)};
-create_col_frames(N, NofRows, RowHeight, ParentId, GridP, ColFrameAcc, LabelAcc) ->
- % Yes, it *IS* inefficient to copy GridP for each loop.
- % However, it is only done once, and for a limited number of times,
- % and we avoid having a lot of parameters!
- #grid_params{bg_color = BgColor,
- fg_color = FgColor,
- nof_cols = NofCols,
- col_width = ColWidth} = GridP,
- Xpos = if
- N =:= NofCols ->
- 0;
- true ->
- ColWidth + 1
- end,
-
- ColNo = NofCols - N + 1,
- {ColFrameId, LabelIds} = add_one_col_frame(ParentId, ColNo, Xpos, FgColor,
- BgColor, NofRows, RowHeight),
- create_col_frames(N - 1, NofRows, RowHeight, ColFrameId, GridP,
- [ColFrameId | ColFrameAcc], [LabelIds | LabelAcc]).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-add_one_col_frame(ParentId, ColNo, Xpos, FgColor, BgColor, NofRows, RowHeight) ->
- ColFrameId = create_one_col_frame(ParentId, Xpos, FgColor),
- FirstRowYpos = 1,
- FirstRowNo = 1,
- LabelIds = create_rows_on_frame(ColFrameId, FirstRowNo, NofRows, RowHeight,
- FirstRowYpos, FgColor, BgColor, ColNo, []),
- {ColFrameId, LabelIds}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_one_col_frame(ParentId, Xpos, BgColor) ->
- ColFrameWidth = 1200,
- ColFrameHeight = 900,
- Ypos = 0,
- gs:frame(ParentId, [{width, ColFrameWidth},
- {height, ColFrameHeight},
- {x, Xpos},
- {y, Ypos},
- {bg, BgColor}
- ]).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_rows_on_frame(_FrameId, RowNo, NofRows, _H, _Y, _Fg, _Bg, _ColNo, Acc) when RowNo > NofRows ->
- lists:reverse(Acc);
-create_rows_on_frame(FrameId, RowNo, NofRows, H, Y, Fg, Bg, ColNo, RAcc) ->
- Width = 1200,
- R = gs:label(FrameId, [{width, Width},
- {height, H},
- {x, 1},
- {y, Y},
- {bg, Bg},
- {fg, Fg},
- {align, w},
- {buttonpress, true},
- {data, {gridcell, ColNo, RowNo, FrameId}}
- ]),
- NextRowNo = RowNo + 1,
- NextY = Y + H +1,
- create_rows_on_frame(FrameId, NextRowNo, NofRows, H, NextY, Fg, Bg, ColNo,
- [R | RAcc]).
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_row_ids(0, _Cols, RowAcc) ->
- RowAcc;
-get_row_ids(RowNo, Cols, RowAcc) ->
- Row = extract_ids_for_one_row(RowNo, Cols),
- get_row_ids(RowNo - 1, Cols, [Row | RowAcc]).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-extract_ids_for_one_row(_N, []) ->
- [];
-extract_ids_for_one_row(N, [ColIds | Tail]) ->
- [lists:nth(N, ColIds) | extract_ids_for_one_row(N, Tail)].
-
-
-
-%%%---------------------------------------------------------------------
-%%% END of functions used to create the grid.
-%%%---------------------------------------------------------------------
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-safe_nthtail(_, []) -> [];
-safe_nthtail(1, [_|T]) -> T;
-safe_nthtail(N, [_|T]) when N > 1 ->
- safe_nthtail(N - 1, T);
-safe_nthtail(0, L) when is_list(L) -> L.
diff --git a/lib/tv/src/tv_pg_int_def.hrl b/lib/tv/src/tv_pg_int_def.hrl
deleted file mode 100644
index 6f88053d47..0000000000
--- a/lib/tv/src/tv_pg_int_def.hrl
+++ /dev/null
@@ -1,92 +0,0 @@
-%%
-%% %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%
-%%%*********************************************************************
-%%%
-%%% Description: Internal definitions for the pd part of the table tool.
-%%%
-%%%*********************************************************************
-
-
--define(GRIDFUNCS, tv_pg_gridfcns).
-
-
-
--define(DEFAULT_COLFRAME_HEIGHT, 870).
--define(DEFAULT_COLWIDTH, 100).
--define(DEFAULT_GRID_BGCOLOR, {255, 255, 255}). % white
--define(DEFAULT_GRID_FGCOLOR, {0, 0, 0}). % black
--define(GRID_MARK_COLOR, {200, 255, 255}).
--define(GRID_FONT, {courier, 12}).
-
-
-
--define(DEFAULT_BG_COLOR, {217, 217, 217}).
--define(DEFAULT_ROW_COLOR, {178, 34, 34}). % Firebrick!
--define(DEFAULT_GRID_COLOR, {0, 0, 0}).
--define(LIGHT_GRAY, {226, 226, 226}).
--define(DARK_VIOLET, {148, 0, 211}).
--define(FIREBRICK, {178, 34, 34}).
--define(ANTIQUE_WHITE, {255, 255, 235}).
-
-
-
-
--record(grid_params, {bg_frame,
- fg_frame,
- grid_width,
- grid_height = ?DEFAULT_COLFRAME_HEIGHT, % Actual height,
- % not the height
- % shown!
- grid_xpos,
- grid_ypos,
- bg_color = ?DEFAULT_GRID_BGCOLOR,
- fg_color = ?DEFAULT_GRID_FGCOLOR,
- nof_cols = 10,
- nof_rows,
- nof_rows_shown,
- row_height,
- col_width = ?DEFAULT_COLWIDTH,
- first_col_shown = 1,
- first_row_shown = 1,
- max_col_width = 1200,
- min_col_width = 5,
- col_widths = [],
- cols_shown = [],
- col_frame_ids = [],
- col_ids = [],
- row_ids = [],
- row_data_list = [],
- current_max_value,
- lists_as_strings = true
- }).
-
-
-
--record(mark_params, {cell_id,
- virtual_col,
- virtual_row
- }).
-
-
-
-
--record(process_variables, {parent_pid,
- grid_parent_id,
- grid_params = #grid_params{},
- mark_params = #mark_params{}
- }).
diff --git a/lib/tv/src/tv_poll_dialog.erl b/lib/tv/src/tv_poll_dialog.erl
deleted file mode 100644
index e33d398898..0000000000
--- a/lib/tv/src/tv_poll_dialog.erl
+++ /dev/null
@@ -1,363 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. 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%
-%%%*********************************************************************
-%%%
-%%% Description: Code for the "set poll interval" dialog with the user.
-%%%
-%%%*********************************************************************
-
--module(tv_poll_dialog).
--compile([{nowarn_deprecated_function,{gs,button,2}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,radiobutton,2}},
- {nowarn_deprecated_function,{gs,scale,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,2}}]).
-
-
--export([start/1, init/2]).
-
-
-
--include("tv_int_msg.hrl").
-
-
-
--define(WINDOW_WIDTH, 305).
--define(WINDOW_HEIGHT, 185).
-
--define(DEFAULT_BG_COLOR, {217, 217, 217}).
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-start(Pos) ->
- Pid = self(),
- ProcPid = spawn_link(?MODULE, init, [Pid, Pos]),
- receive_answer(ProcPid).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-init(Pid, Pos) ->
- process_flag(trap_exit, true),
- {ScalePos, ScaleRange, Poll, Color} = case Pos of
- infinity ->
- {0, {20, 20}, false, {255, 255, 255}};
- _Other ->
- {Pos, {20, 300}, true, {0, 0, 0}}
- end,
- S = gs:start(),
- Win = gs:window(S, [{width, ?WINDOW_WIDTH},
- {height, ?WINDOW_HEIGHT},
- {bg, ?DEFAULT_BG_COLOR},
- {title, "[TV] Set Poll Interval"},
- {configure, true},
- {destroy, true}
- ]),
-
- NoPollBtn = gs:radiobutton(Win, [{height, 30},
- {width, 143},
- {x, 10},
- {y, 10},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {value, no_poll},
- {label, {text, "Manual Polling"}},
- {select, not(Poll)}
- ]),
-
- PollBtn = gs:radiobutton(Win, [{height, 30},
- {width, 163},
- {x, 10},
- {y, 60},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {value, poll},
- {label, {text, "Automatic Polling"}},
- {select, Poll}
- ]),
-
- Lbl = gs:label(Win, [{label, {text, "Poll Interval (seconds):"}},
- {align, center},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, Color},
- {width, 183},
- {height, 30},
- {x, 10},
- {y, 100}
- ]),
-
- Scale = gs:scale(Win, [{bg, ?DEFAULT_BG_COLOR},
- {fg, Color},
- {orient, horizontal},
- {range, ScaleRange},
- {pos, ScalePos},
- {width, 285},
- {height, 50},
- {x, 10},
- {y, 130}
- ]),
-
- OkBtn = gs:button(Win, [{label, {text, "OK"}},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, center},
- {width, 60},
- {height, 30},
- {x, 230},
- {y, 10}
- ]),
-
- CancelBtn = gs:button(Win, [{label, {text, "Cancel"}},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, center},
- {width, 60},
- {height, 30},
- {x, 230},
- {y, 60}
- ]),
-
- gs:config(Win, {map, true}),
- browser_loop(Pid, Win, NoPollBtn, PollBtn, Lbl, Scale, OkBtn, CancelBtn, Poll, Pos).
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-receive_answer(ProcPid) ->
- receive_answer(ProcPid, undefined, undefined, undefined, undefined).
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-receive_answer(ProcPid, DataReqMsg, WinConfMsg, MarkedRowMsg, SubsetMsg) ->
- receive Msg ->
- case Msg of
-
- {browser, ProcPid, cancel} ->
- PcPid = self(),
- PcPid ! DataReqMsg,
- PcPid ! WinConfMsg,
- PcPid ! MarkedRowMsg,
- PcPid ! SubsetMsg,
- cancel;
-
- {browser, ProcPid, {true, PollInterval}} ->
- PcPid = self(),
- PcPid ! DataReqMsg,
- PcPid ! WinConfMsg,
- PcPid ! MarkedRowMsg,
- PcPid ! SubsetMsg,
- PollInterval;
-
- {browser, ProcPid, {false, _Pollinterval}} ->
- PcPid = self(),
- PcPid ! DataReqMsg,
- PcPid ! WinConfMsg,
- PcPid ! MarkedRowMsg,
- PcPid ! SubsetMsg,
- infinity;
-
- #pc_data_req{} ->
- receive_answer(ProcPid, Msg, WinConfMsg, MarkedRowMsg, SubsetMsg);
-
- #pc_win_conf{} ->
- receive_answer(ProcPid, DataReqMsg, Msg, MarkedRowMsg, SubsetMsg);
-
- #pc_marked_row{} ->
- receive_answer(ProcPid, DataReqMsg, WinConfMsg, Msg, SubsetMsg);
-
- #dbs_subset{} ->
- receive_answer(ProcPid, DataReqMsg, WinConfMsg, MarkedRowMsg, Msg);
-
- #pc_menu_msg{data = exit_button} ->
- self() ! Msg,
- cancel;
-
- #pc_set_sorting_mode{sender = Sender} ->
- Sender ! #pd_ignore{sender = self()},
- ProcPid ! raise_and_beep,
- receive_answer(ProcPid, DataReqMsg, WinConfMsg, MarkedRowMsg, SubsetMsg);
-
- {'EXIT', _Sender, _Reason} ->
- self() ! Msg,
- cancel;
-
- _Other ->
- ProcPid ! raise_and_beep,
- receive_answer(ProcPid, DataReqMsg, WinConfMsg, MarkedRowMsg, SubsetMsg)
- end
- end.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-browser_loop(Pid, Win, NoPollBtn, PollBtn, Lbl, Scale, OkBtn, CancelBtn, Poll, Pos) ->
- receive
- {gs, Scale, click, _, [NewPos | _]} ->
- browser_loop(Pid, Win, NoPollBtn, PollBtn, Lbl, Scale, OkBtn,
- CancelBtn, Poll, NewPos);
-
- {gs, NoPollBtn, click, _, _} ->
- gs:config(Lbl, [{fg, {255, 255, 255}}]),
- gs:config(Scale, [{fg, {255, 255, 255}}, {pos, 0}, {range, {20, 20}}]),
- receive
- {gs, Scale, click, _, _} ->
- done
- after 500 ->
- done
- end,
- browser_loop(Pid, Win, NoPollBtn, PollBtn, Lbl, Scale, OkBtn,
- CancelBtn, false, Pos);
-
- {gs, PollBtn, click, _, _} ->
- gs:config(Lbl, [{fg, {0, 0, 0}}]),
- gs:config(Scale, [{fg, {0, 0, 0}}, {pos, Pos}, {range, {20, 300}}]),
- receive
- {gs, Scale, click, _, _} ->
- done
- after 500 ->
- done
- end,
- browser_loop(Pid, Win, NoPollBtn, PollBtn, Lbl, Scale, OkBtn,
- CancelBtn, true, Pos);
-
- {gs, OkBtn, click, _, _} ->
- Pid ! {browser, self(), {Poll, Pos}};
-
- {gs, CancelBtn, click, _, _} ->
- Pid ! {browser, self(), cancel};
-
- {gs, _, destroy, _, _} ->
- Pid ! {browser, self(), cancel};
-
-
- {gs, Win, configure, _, _} ->
- gs:config(Win, [{width, ?WINDOW_WIDTH},
- {height, ?WINDOW_HEIGHT}
- ]),
- browser_loop(Pid, Win, NoPollBtn, PollBtn, Lbl, Scale, OkBtn,
- CancelBtn, Poll, Pos);
-
-
- raise_and_beep ->
- gs:config(Win, [raise,
- beep]),
- browser_loop(Pid, Win, NoPollBtn, PollBtn, Lbl, Scale, OkBtn,
- CancelBtn, Poll, Pos);
-
-
- {'EXIT', _Sender, _Reason} ->
- Pid ! {browser, self(), cancel};
-
-
- _Other ->
- io:format("Poll dialog received message ~w ~n", [_Other]),
- browser_loop(Pid, Win, NoPollBtn, PollBtn, Lbl, Scale, OkBtn,
- CancelBtn, Poll, Pos)
-
- end.
-
diff --git a/lib/tv/src/tv_pw.erl b/lib/tv/src/tv_pw.erl
deleted file mode 100644
index 5f88c9f1fd..0000000000
--- a/lib/tv/src/tv_pw.erl
+++ /dev/null
@@ -1,328 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. 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%
-%%%*********************************************************************
-%%%
-%%% Description: Code for pw, the window controlling part of the table tool.
-%%%
-%%%*********************************************************************
-
-
--module(tv_pw).
--compile([{nowarn_deprecated_function,{gs,config,2}}]).
-
-
-
--export([pw/1]).
-
-
-
-
--include("tv_int_def.hrl").
--include("tv_int_msg.hrl").
--include("tv_pw_int_def.hrl").
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function: pw.
-%%
-%% Return Value: None.
-%%
-%% Description: Process controlling the graphical window, as well as the
-%% menubuttons.
-%%
-%% Parameters: None.
-%%======================================================================
-
-
-
-pw(Master) ->
- process_flag(trap_exit, true),
- ProcVars = #process_variables{master_pid = Master},
- blocked(ProcVars).
-
-
-
-
-
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-
-
-%%======================================================================
-%% Function: blocked.
-%%
-%% Return Value: None.
-%%
-%% Description: When started or explicitly blocked, pw enters this state,
-%% where nothing is performed until the module explicitly is
-%% deblocked.
-%%
-%% Parameters:
-%%======================================================================
-
-
-blocked(ProcVars) ->
- receive
- Msg ->
- case Msg of
- #pw_deblock{} ->
- deblock(Msg, ProcVars);
- _Other ->
- blocked(ProcVars)
- end
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function: deblocked.
-%%
-%% Return Value: None.
-%%
-%% Description: When deblocked, a window shall be created according to
-%% specification received in pw_deblock message.
-%%
-%% Parameters: Rec: received pw_deblock message.
-%%======================================================================
-
-
-
-deblock(Msg, ProcVars) ->
- #process_variables{window_params = WinP,
- menu_params = MenuP} = ProcVars,
-
- NewWinP = ?WIN_FUNC_FILE:create_window(Msg, WinP),
- NewMenuP = ?WIN_FUNC_FILE:create_menubar(NewWinP, MenuP),
-
- Sender = Msg#pw_deblock.sender,
- Sender ! #pw_deblock_cfm{sender = self(),
- win_id = NewWinP#window_params.window_id
- },
-
- NewProcVars = ProcVars#process_variables{window_params = NewWinP,
- menu_params = NewMenuP
- },
- deblocked_loop(NewProcVars).
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-deblocked_loop(ProcVars) ->
- receive
- Msg ->
- case Msg of
-
- {gs, Id, Event, Data, Args} ->
- NewProcVars = gs_messages({Id, Event, Data, Args}, ProcVars),
- deblocked_loop(NewProcVars);
-
- % Messages from pc!
- #pw_select_menu{menu=Menu} ->
- gs:config(Menu, [{select,true}]),
- deblocked_loop(ProcVars);
-
- #pw_create_menu{} ->
- NewProcVars = ?WIN_FUNC_FILE:create_menu(Msg, ProcVars),
- % Send confirmation...
- Sender = Msg#pw_create_menu.sender,
- Sender ! #pw_create_menu_cfm{sender = self()},
- deblocked_loop(NewProcVars);
-
- #pw_set_window_title{win_title = WinTitle} ->
- WinP = ProcVars#process_variables.window_params,
- gs:config(WinP#window_params.window_id, [{title, "[TV] " ++ WinTitle}]),
- NewWinP = WinP#window_params{window_title = WinTitle},
- NewProcVars = ProcVars#process_variables{window_params = NewWinP},
- deblocked_loop(NewProcVars);
-
- #pw_deblock{} ->
- deblock(Msg, ProcVars);
-
- % Exit signals!
- {'EXIT', Pid, Reason} ->
- MasterPid = ProcVars#process_variables.master_pid,
- exit_signals({Pid, Reason}, MasterPid),
- deblocked_loop(ProcVars);
-
- _Other ->
- deblocked_loop(ProcVars)
-
- end
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-exit_signals(Exit_info, MasterPid) ->
- case Exit_info of
- {MasterPid, _Reason} -> % When from master, just quit!
- exit(normal);
- _Other ->
- done
- end.
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-gs_messages(Msg, ProcVars) ->
- MasterPid = ProcVars#process_variables.master_pid,
- case Msg of
-
- {_Id, click, Data, _Args} ->
- MasterPid ! #pc_menu_msg{sender = self(),
- data = Data},
- ProcVars;
-
- {_Win, keypress, _Data, [Key, _ , _, 1 | _T]} ->
- MenuP = ProcVars#process_variables.menu_params,
- ShortcutList = MenuP#menu_params.shortcuts,
- send_shortcut_data(Key, ShortcutList, MasterPid),
- ProcVars;
-
- Msg0 = {Win, configure, _, _} ->
- {Win, configure, _, [W, H | _T]} = flush_msgs(Msg0),
- WinP = ProcVars#process_variables.window_params,
- #window_params{window_id = WindowId,
- min_window_width = MinAllowedWidth,
- min_window_height = MinAllowedHeight} = WinP,
- FinalWidth = ?COMM_FUNC_FILE:max(W, MinAllowedWidth),
- FinalHeight = ?COMM_FUNC_FILE:max(H, MinAllowedHeight),
- ?WIN_FUNC_FILE:resize_window(WindowId, FinalWidth, FinalHeight),
- MasterPid ! #pc_win_conf{sender = self(),
- width = FinalWidth,
- height = FinalHeight},
- NewWinP = WinP#window_params{window_width = FinalWidth,
- window_height = FinalHeight
- },
- ProcVars#process_variables{window_params = NewWinP};
-
- {_Win, destroy, _Data, _Args} ->
- exit(normal);
-
- _Other ->
- ProcVars
- end.
-
-flush_msgs(Msg0 = {Win, Op, _, _}) ->
- receive {gs, Win,Op,D,P} ->
- flush_msgs({Win,Op,D,P})
- after 200 ->
- Msg0
- end.
-
-send_shortcut_data(_Key, [], _MasterPid) ->
- done;
-send_shortcut_data(Key, ShortcutList, MasterPid) ->
- case lists:keysearch(Key, 1, ShortcutList) of
- {value, {Key, Data}} ->
- MasterPid ! #pc_menu_msg{sender = self(),
- data = Data};
- false ->
- done
- end.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_pw_int_def.hrl b/lib/tv/src/tv_pw_int_def.hrl
deleted file mode 100644
index fabfbc2762..0000000000
--- a/lib/tv/src/tv_pw_int_def.hrl
+++ /dev/null
@@ -1,55 +0,0 @@
-%%
-%% %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%
-%%%*********************************************************************
-%%%
-%%% Description: Internal definitions for the pw part of the table tool.
-%%%
-%%%*********************************************************************
-
--define(WIN_FUNC_FILE, tv_pw_window).
-
-
-
--define(DEFAULT_WINDOW_WIDTH, 1000).
--define(DEFAULT_WINDOW_HEIGHT, 800).
--define(DEFAULT_MIN_WINDOW_WIDTH, 50).
--define(DEFAULT_MIN_WINDOW_HEIGHT, 50).
-
-
-
--record(window_params, {window_id,
- window_title,
- window_width,
- window_height,
- min_window_width,
- min_window_height
- }).
-
-
--record(menu_params, {menubar_id,
- shortcuts
- }).
-
-
-
-
-
--record(process_variables, {master_pid,
- window_params = #window_params{},
- menu_params = #menu_params{}
- }).
diff --git a/lib/tv/src/tv_pw_window.erl b/lib/tv/src/tv_pw_window.erl
deleted file mode 100644
index 81f29dc41c..0000000000
--- a/lib/tv/src/tv_pw_window.erl
+++ /dev/null
@@ -1,277 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. 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%
-%%%*********************************************************************
-%%%
-%%% Description: Part of the pw component controlling the graphics.
-%%%
-%%%*********************************************************************
-
-
--module(tv_pw_window).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,menuitem,3}},
- {nowarn_deprecated_function,{gs,start,0}}]).
-
-
-
--export([create_window/2,
- resize_window/3,
- create_menubar/2,
- create_menu/2]).
-
-
-
-
--include("tv_int_def.hrl").
--include("tv_int_msg.hrl").
--include("tv_pw_int_def.hrl").
-
-
-
--define(DEFAULT_BG_COLOR, {217, 217, 217}).
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function: create_menu.
-%%
-%% Return Value: Identifier to the menu created.
-%%
-%% Description: Creates a menu in the window.
-%%
-%% Parameters: Win: ID of parent window.
-%%======================================================================
-
-
-create_menu(Msg, ProcVars) ->
- MenuP = ProcVars#process_variables.menu_params,
- MenubarId = MenuP#menu_params.menubar_id,
- ShortcutList = MenuP#menu_params.shortcuts,
-
- #pw_create_menu{menutitle = MenuTitle,
- title_acc_pos = TitleAccPos,
- menulist = MenuList} = Msg,
-
- % Create the menubutton!
- Label = def_or_param(MenuTitle, "NoName"),
- Mbutt = gs:create(menubutton, MenubarId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}}, % firebrick
- % {font, {helvetica, bold, 14}},
- {label, {text, Label}},
- {underline, TitleAccPos}
- ]),
-
- % Create the actual menu!
- Menu = gs:create(menu, Mbutt, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}}
- ]),
-
- NewMenuP = MenuP#menu_params{shortcuts = ShortcutList ++ create_menulist(MenuList, Menu)},
-
- ProcVars#process_variables{menu_params = NewMenuP}.
-
-
-
-
-
-
-
-create_menubar(WinP, MenuP) ->
- WindowId = WinP#window_params.window_id,
- MenubarId = gs:create(menubar, WindowId, [{bg, ?DEFAULT_BG_COLOR}
- ]),
- Mbutt = gs:create(menubutton, MenubarId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}}, % firebrick
- % {font, {helvetica, bold, 14}},
- {label, {text, " Help "}},
- {underline, 1},
- {side, right}
- ]),
-
- % Create the actual menu!
- Menu = gs:create(menu, Mbutt, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}}
- ]),
- MenuP#menu_params{menubar_id = MenubarId,
- shortcuts = create_menulist([{" Help ", normal, help_button, 1, h},
- separator,
- {" OTP Documentation ",normal,otp_help_button,1,no_char}],
- Menu) ++ [{x,exit_button}, {'X',exit_button}]
- }.
-
-
-
-
-
-create_window(Msg, WinP) ->
- #pw_deblock{win_title = Title,
- win_width = Width,
- win_height = Height,
- min_win_width = MinWidth} = Msg,
-
-
- S = gs:start(),
- WindowTitle = def_or_param(Title, "NoName"),
- WindowMinWidth = def_or_param(MinWidth, ?DEFAULT_MIN_WINDOW_WIDTH),
- WindowMinHeight = def_or_param(MinWidth, ?DEFAULT_MIN_WINDOW_HEIGHT),
- WindowWidth = ?COMM_FUNC_FILE:max(def_or_param(Width,
- ?DEFAULT_WINDOW_WIDTH),
- WindowMinWidth),
- WindowHeight = ?COMM_FUNC_FILE:max(def_or_param(Height,
- ?DEFAULT_WINDOW_HEIGHT),
- WindowMinHeight),
-
-
- WindowId = gs:create(window, S, [{title, WindowTitle},
- {width, WindowWidth},
- {height, WindowHeight},
- {bg, ?DEFAULT_BG_COLOR},
- {configure, true},
- {destroy, true},
- {keypress, true},
- {cursor, arrow}
- ]),
-
- WinP#window_params{window_id = WindowId,
- window_title = WindowTitle,
- window_width = WindowWidth,
- window_height = WindowHeight,
- min_window_width = WindowMinWidth,
- min_window_height = WindowMinHeight
- }.
-
-
-
-
-
-
-
-resize_window(WindowId, NewWidth, NewHeight) ->
- gs:config(WindowId, [{width, NewWidth},
- {height, NewHeight}
- ]).
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-create_menulist([], _Menu) ->
- [];
-create_menulist(List, Menu) ->
- MaxLength = get_length_of_longest_menu_text(List, 0),
- create_menulist(List, Menu, MaxLength).
-
-
-
-
-create_menulist([], _Menu, _MaxLength) ->
- [];
-create_menulist([{Text, Type, Data, AccCharPos, ShortcutChar} | Rest], Menu, MaxLength) ->
- ShortcutCapitalChar =
- if
- ShortcutChar =:= no_char ->
- no_char;
- true ->
- CharAsciiValue = lists:nth(1, atom_to_list(ShortcutChar)),
- CapitalCharValue = CharAsciiValue - ($a - $A),
- list_to_atom([CapitalCharValue])
- end,
-
- FinalText = if
- ShortcutChar =:= no_char ->
- Text;
- true ->
- Text ++ lists:duplicate(MaxLength - length(Text), " ") ++
- " Ctrl+" ++ atom_to_list(ShortcutCapitalChar) ++ " "
- end,
- TypeAndSel =
- case Type of
- normal ->
- [{itemtype, normal}];
- {radio, Selected, Group} ->
- [{itemtype, radio},
- {select, Selected},
- {group, Group}];
- {check, Selected} ->
- [{itemtype, check},
- {select, Selected}]
- end,
- gs:menuitem(Data, Menu, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}},
- {label, {text, FinalText}},
- {underline, AccCharPos},
- {data, Data} |
- TypeAndSel
- ]),
- [{ShortcutChar, Data}, {ShortcutCapitalChar, Data} | create_menulist(Rest, Menu, MaxLength)];
-create_menulist([separator | Rest], Menu, MaxLength) ->
- gs:create(menuitem, Menu, [{itemtype, separator}
- ]),
- create_menulist(Rest, Menu, MaxLength).
-
-
-
-
-
-
-
-get_length_of_longest_menu_text([], MaxLength) ->
- MaxLength;
-get_length_of_longest_menu_text([{Text, _Type, _Data, _APos, _SChar} | Rest], CurrMax) ->
- L = length(Text),
- if
- L > CurrMax ->
- get_length_of_longest_menu_text(Rest, L);
- true ->
- get_length_of_longest_menu_text(Rest, CurrMax)
- end;
-get_length_of_longest_menu_text([separator | Rest], CurrMax) ->
- get_length_of_longest_menu_text(Rest, CurrMax).
-
-
-
-
-
-def_or_param(undefined, DefaultValue) ->
- DefaultValue;
-def_or_param(Param, _Default) ->
- Param.
-
-
-
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_rec_edit.erl b/lib/tv/src/tv_rec_edit.erl
deleted file mode 100644
index 3f9ea8b5f5..0000000000
--- a/lib/tv/src/tv_rec_edit.erl
+++ /dev/null
@@ -1,754 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2012. 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(tv_rec_edit).
--compile([{nowarn_deprecated_function,{gs,button,2}},
- {nowarn_deprecated_function,{gs,button,3}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,entry,3}},
- {nowarn_deprecated_function,{gs,frame,2}},
- {nowarn_deprecated_function,{gs,frame,3}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([start/5,
- start/6,
- init/8
- ]).
-
-
--include("tv_int_def.hrl").
-
-
-
--define(DEFAULT_BG_COLOR, {217,217,217}).
-
--define(WIN_WIDTH, 375).
--define(WIN_HEIGHT, 341).
--define(ETS_WIN_HEIGHT, 154).
-
--define(FRAME_WIDTH, 375).
--define(FRAME_HEIGHT, 265).
--define(ETS_FRAME_HEIGHT, 74).
-
--define(MAX_LABEL_WIDTH, 165).
--define(X0, 15).
--define(Y0, 20).
--define(LABEL_HEIGHT, 30).
--define(ENTRY_HEIGHT, 30).
--define(FONT, {screen,12}).
--define(NEXT_BTN_WIDTH, 57).
--define(NEXT_BTN_HEIGHT, 22).
--define(NEXT_BTN_FG, {178,34,34}).
--define(INSERT_BTN_WIDTH, 80).
--define(INSERT_BTN_HEIGHT, 30).
--define(INSERT_BTN_DIST_BETWEEN, 23).
--define(INSERT_BTN_DIST_FROM_BOTTOM, 23).
-
-
-
-
-
-start(TableType, TableName, AttributeList, ListsAsStr, ErrMsgMode) ->
- AttributeValues = lists:duplicate(length(AttributeList), undefined),
- spawn_link(?MODULE, init, [TableType, TableName, AttributeList,
- AttributeValues, ListsAsStr, ErrMsgMode, self(), true]).
-
-
-
-start(TableType, TableName, AttributeList, AttributeValues, ListsAsStr, ErrMsgMode) ->
- spawn_link(?MODULE, init, [TableType, TableName, AttributeList,
- AttributeValues, ListsAsStr, ErrMsgMode, self(), false]).
-
-
-
-
-init(TableType,TableName,AttributeList,AttributeValues,ListsAsStr,ErrMsgMode,MasterPid,Insert) ->
- process_flag(trap_exit, true),
- put(error_msg_mode, ErrMsgMode),
- Frames = create_window(TableType, TableName, AttributeList, AttributeValues,
- ListsAsStr, Insert),
- loop(TableType, TableName, Frames, AttributeList, AttributeValues, MasterPid, ListsAsStr).
-
-
-
-
-
-loop(TabType, TabName, Frames, AttrList, AttrVals, MPid, ListsAsStr) ->
- receive
-
- {gs, insert, click, Insert, _Args} ->
- gs:config(win, [{cursor, busy}]),
- case get_record(TabType, TabName, AttrList, AttrList, Frames) of
- {ok, NewRec} ->
- case Insert of
- insert ->
- MPid ! {new_object, NewRec};
- change ->
- MPid ! {updated_object, NewRec}
- end;
- error ->
- done
- end,
- gs:config(win, [{cursor, arrow}]),
- loop(TabType, TabName, Frames, AttrList, AttrVals, MPid, ListsAsStr);
-
-
- {gs, cancel, click, _Data, _Args} ->
- exit(normal);
-
-
- {gs, reset, click, _Data, _Args} ->
- gs:config(win, [{cursor, busy}]),
- set_entry_values(TabType, AttrList, AttrVals, ListsAsStr),
- gs:config(win, [{cursor, arrow}]),
- loop(TabType, TabName, Frames, AttrList, AttrVals, MPid, ListsAsStr);
-
-
-
- {gs, EntryId, keypress, _Data, ['Tab', _No, 0 | _T]} ->
- {_Term, {NextEntry, NextFrame}} =
- check_entry_content(EntryId, AttrList, Frames, forward),
- case NextEntry of
- EntryId ->
- gs:config(NextEntry, [{setfocus, true}]);
- _OtherId ->
- gs:config(NextFrame, [raise]),
- gs:config(NextEntry, [{setfocus, true},
- {select, {0,100000000}}])
- end,
- loop(TabType, TabName, Frames, AttrList, AttrVals, MPid, ListsAsStr);
-
-
- {gs, EntryId, keypress, _Data, ['Down' | _T]} ->
- {_Term, {NextEntry, NextFrame}} =
- check_entry_content(EntryId, AttrList, Frames, forward),
- case NextEntry of
- EntryId ->
- gs:config(NextEntry, [{setfocus, true}]);
- _OtherId ->
- gs:config(NextFrame, [raise]),
- gs:config(NextEntry, [{setfocus, true},
- {select, {0,100000000}}])
- end,
- loop(TabType, TabName, Frames, AttrList, AttrVals, MPid, ListsAsStr);
-
-
- {gs, EntryId, keypress, _Data, ['Tab', _No, 1 | _T]} ->
- {_Term, {NextEntry, NextFrame}} =
- check_entry_content(EntryId, AttrList, Frames, backward),
- gs:config(NextFrame, [raise]),
- case NextEntry of
- EntryId ->
- gs:config(NextEntry, [{setfocus, true}]);
- _OtherId ->
- gs:config(NextFrame, [raise]),
- gs:config(NextEntry, [{setfocus, true},
- {select, {0,100000000}}])
- end,
- loop(TabType, TabName, Frames, AttrList, AttrVals, MPid, ListsAsStr);
-
-
- {gs, EntryId, keypress, _Data, ['Up' | _T]} ->
- {_Term, {NextEntry, NextFrame}} =
- check_entry_content(EntryId, AttrList, Frames, backward),
- gs:config(NextFrame, [raise]),
- case NextEntry of
- EntryId ->
- gs:config(NextEntry, [{setfocus, true}]);
- _OtherId ->
- gs:config(NextFrame, [raise]),
- gs:config(NextEntry, [{setfocus, true},
- {select, {0,100000000}}])
- end,
- loop(TabType, TabName, Frames, AttrList, AttrVals, MPid, ListsAsStr);
-
-
- {gs, Id, keypress, _Data, ['Return' | _T]} ->
- OldCursor = gs:read(Id, cursor),
- gs:config(Id, [{cursor, busy}]),
- gs:config(win, [{cursor, busy}]),
- Insert = gs:read(insert, data),
- case get_record(TabType, TabName, AttrList, AttrList, Frames) of
- {ok, NewRec} ->
- case Insert of
- insert ->
- MPid ! {new_object, NewRec};
- change ->
- MPid ! {updated_object, NewRec}
- end;
- error ->
- done
- end,
- gs:config(win, [{cursor, arrow}]),
- gs:config(Id, [{cursor, OldCursor}]),
- loop(TabType, TabName, Frames, AttrList, AttrVals, MPid, ListsAsStr);
-
-
-
- {gs, _Id, click, FrameNo, _Args} ->
- gs:config(lists:nth(FrameNo, Frames), [raise]),
- loop(TabType, TabName, Frames, AttrList, AttrVals, MPid, ListsAsStr);
-
-
- {gs, win, configure, _Data, [Width | _T]} ->
- resize_window(TabType, lists:max([Width, ?WIN_WIDTH]), Frames, AttrList),
- loop(TabType, TabName, Frames, AttrList, AttrVals, MPid, ListsAsStr);
-
-
- {gs, win, destroy, _Data, _Args} ->
- exit(normal);
-
-
- insert_mode ->
- NewAttrVals = lists:duplicate(length(AttrList), undefined),
- set_entry_values(TabType, AttrList, NewAttrVals, ListsAsStr),
- loop(TabType, TabName, Frames, AttrList, NewAttrVals, MPid, ListsAsStr);
-
-
- {update_mode, Obj} ->
- NewAttrVals =
- case TabType of
- mnesia ->
- case Obj of
- undefined ->
- lists:duplicate(length(AttrList), undefined);
- _AnyRec ->
- tl(tuple_to_list(Obj))
- end;
- ets ->
- [Obj]
- end,
- set_entry_values(TabType, AttrList, NewAttrVals, ListsAsStr),
- loop(TabType, TabName, Frames, AttrList, NewAttrVals, MPid, ListsAsStr);
-
-
- {reset_info, Obj} ->
- %% Info to use, instead of old info, when reset button is pressed.
- NewAttrVals =
- case TabType of
- mnesia ->
- case Obj of
- undefined ->
- lists:duplicate(length(AttrList), undefined);
- _AnyRec ->
- tl(tuple_to_list(Obj))
- end;
- ets ->
- [Obj]
- end,
- loop(TabType, TabName, Frames, AttrList, NewAttrVals, MPid, ListsAsStr);
-
-
- raise ->
- gs:config(win, [raise]),
- loop(TabType, TabName, Frames, AttrList,AttrVals, MPid, ListsAsStr);
-
-
- {'EXIT', _Pid, _Reason} ->
- exit(normal);
-
-
- _Other ->
- loop(TabType, TabName, Frames, AttrList,AttrVals, MPid, ListsAsStr)
- end.
-
-
-
-
-resize_window(TabType, WinWidth, Frames, AttrList) ->
- WinHeight =
- case TabType of
- mnesia ->
- get_window_height(length(AttrList));
- ets ->
- ?ETS_WIN_HEIGHT
- end,
- gs:config(win, [{width, WinWidth},
- {height, WinHeight}
- ]),
- FrameWidth = WinWidth,
- LblL = lists:map(fun(H) ->
- gs:config(H, [{width, FrameWidth}]),
- {LblW, BId, NId} = gs:read(H, data),
- XNext = get_next_btn_xpos(FrameWidth),
- XBack = XNext - ?NEXT_BTN_WIDTH,
- gs:config(BId, [{x, XBack}]),
- gs:config(NId, [{x, XNext}]),
- LblW
- end,
- Frames),
- LblW = hd(LblL),
- EntryW = get_entry_width(TabType, FrameWidth, LblW),
- lists:foreach(fun(H) ->
- gs:config(H, [{width, EntryW}])
- end,
- AttrList),
- gs:config(btnframe, [{width, FrameWidth}]),
- {XInsert, XCancel, XReset} = get_insert_btn_coords(WinWidth),
- gs:config(insert, [{x, XInsert}]),
- gs:config(cancel, [{x, XCancel}]),
- gs:config(reset, [{x, XReset}]).
-
-
-
-
-check_entry_content(EntryId, AttributeList, Frames, Direction) ->
- EditedStr = gs:read(EntryId, text),
- case tv_db_search:string_to_term(EditedStr) of
- {error, {_Reason, Msg}} ->
- gs:config(EntryId, [beep]),
- tv_utils:notify(gs:start(), "TV Notification", Msg),
- {error, {EntryId, no_matter}};
- {ok, NewTerm} ->
- {{ok,NewTerm}, get_next_entry_id(EntryId, AttributeList, Frames, Direction)}
- end.
-
-
-
-
-get_next_entry_id(EntryId, AttributeList, Frames, Direction) ->
- OldPos = get_pos(EntryId, AttributeList),
- MaxPos = length(AttributeList),
- NewPos = case Direction of
- forward when OldPos < MaxPos ->
- OldPos + 1;
- forward ->
- 1;
- backward when OldPos > 1 ->
- OldPos - 1;
- backward ->
- MaxPos;
- stationary ->
- OldPos
- end,
- FramePos = get_next_frame_id(NewPos),
- {lists:nth(NewPos, AttributeList), lists:nth(FramePos, Frames)}.
-
-
-
-
-get_next_frame_id(Pos) ->
- case Pos rem 5 of
- 0 ->
- Pos div 5;
- _Other ->
- (Pos div 5) + 1
- end.
-
-
-
-
-get_record(TabType, TabName, AttrList, AttrList, Frames) ->
- case get_record(AttrList, AttrList, Frames, []) of
- {ok, RecList} ->
- case TabType of
- mnesia ->
- NewRecList = [TabName | RecList],
- {ok, list_to_tuple(NewRecList)};
- ets ->
- {ok, hd(RecList)} %% Only one element, a tuple!
- end;
- error ->
- error
- end.
-
-
-
-
-get_record([H | T], AttrList, Frames, Acc) ->
- case check_entry_content(H, AttrList, Frames, forward) of
- {{ok, NewTerm}, _PosTuple} ->
- get_record(T, AttrList, Frames, [NewTerm | Acc]);
- {error, _PosTuple} ->
- {EntryId, FrameId} = get_next_entry_id(H, AttrList, Frames, stationary),
- gs:config(FrameId, [raise]),
- gs:config(EntryId, [{setfocus, true}]),
- error
- end;
-get_record([], _AttrList, _Frames, Acc) ->
- {ok, lists:reverse(Acc)}.
-
-
-
-
-
-
-get_pos(Elem, L) ->
- get_pos(Elem, L, 1).
-
-
-get_pos(Elem, [Elem | _T], N) ->
- N;
-get_pos(Elem, [_H | T], N) ->
- get_pos(Elem, T, N + 1).
-
-
-
-
-create_window(mnesia, TableName, AttrList, AttrValues, ListsAsStr, Insert) ->
- NofAttr = length(AttrList),
- NofFrames =
- case NofAttr rem 5 of
- 0 ->
- NofAttr div 5;
- _Rem ->
- (NofAttr div 5) + 1
- end,
-
- WinHeight = get_window_height(NofAttr),
- FrameHeight = get_frame_height(NofAttr),
-
- Attr = get_longest_attribute_name(AttrList),
- LabelWidth = lists:min([?MAX_LABEL_WIDTH,
- element(1, gs:read(gs:start(),
- {font_wh, {?FONT, atom_to_list(Attr)}}))]),
-
- gs:window(win, gs:start(), [{width, ?WIN_WIDTH},
- {height, WinHeight},
- {title, "[TV] Record Editor: '" ++
- atom_to_list(TableName) ++ "'"},
- {bg, ?DEFAULT_BG_COLOR},
- {configure, true},
- {destroy, true},
- {cursor, arrow}
- ]),
-
- create_insert_and_cancel_btns(Insert, WinHeight, FrameHeight),
- FrameList = create_frames(NofFrames, LabelWidth, AttrList, AttrValues, NofFrames,
- ListsAsStr, FrameHeight),
- gs:config(hd(FrameList), [raise]),
- gs:config(hd(AttrList), [{setfocus, true},
- {select, {0,100000000}}]),
- gs:config(win, [{map,true}]),
- FrameList;
-create_window(ets, TableName, [Attr], [AttrVal], ListsAsStr, Insert) ->
- gs:window(win, gs:start(), [{width, ?WIN_WIDTH},
- {height, ?ETS_WIN_HEIGHT},
- {title, "[TV] Tuple Editor, table '" ++
- atom_to_list(TableName) ++ "'"},
- {bg, ?DEFAULT_BG_COLOR},
- {configure, true},
- {destroy, true},
- {cursor, arrow}
- ]),
-
- F = gs:frame(win, [{width, ?FRAME_WIDTH},
- {height, ?ETS_FRAME_HEIGHT},
- {x, 0},
- {y, 0},
- {bg, ?DEFAULT_BG_COLOR},
- {bw,2},
- {data, {0, undefined, undefined}}
- ]),
-
- create_insert_and_cancel_btns(Insert, ?ETS_WIN_HEIGHT, ?ETS_FRAME_HEIGHT),
-
- EntryW = get_entry_width(ets, ?FRAME_WIDTH, 0),
- EntryX = ?X0 - 2,
-
- EntryText =
- case AttrVal of
- undefined ->
- "";
- _OtherVal ->
- case ListsAsStr of
- true ->
- tv_io_lib:format("~p", [AttrVal]);
- false ->
- lists:flatten(io_lib:write(AttrVal))
- end
- end,
- gs:entry(Attr, F, [{width, EntryW},
- {height, ?LABEL_HEIGHT},
- {x, EntryX},
- {y, ?Y0},
- {bg, {255,255,255}},
- {fg, {0,0,0}},
- {bw, 1},
- {font, ?FONT},
- {justify, left},
- {text, EntryText},
- {cursor, text},
- {setfocus, true},
- {enable, true},
- {keypress,true},
- {select, {0,100000000}}
- ]),
- gs:config(win, [{map,true}]),
- [F].
-
-
-
-
-get_insert_btn_coords(WinWidth) ->
- Middle = round(WinWidth / 2),
- XInsert = Middle - round(1.5 * ?INSERT_BTN_WIDTH) - ?INSERT_BTN_DIST_BETWEEN,
- XCancel = Middle - round(0.5 * ?INSERT_BTN_WIDTH),
- XReset = Middle + round(0.5 * ?INSERT_BTN_WIDTH) + ?INSERT_BTN_DIST_BETWEEN,
- {XInsert, XCancel, XReset}.
-
-
-
-
-create_insert_and_cancel_btns(Insert, WinHeight, FrameHeight) ->
- LowerFrameHeight = WinHeight - FrameHeight,
- Y = ?INSERT_BTN_DIST_FROM_BOTTOM,
- {XInsert, XCancel, XReset} = get_insert_btn_coords(?WIN_WIDTH),
-
- {InsertBtnText, InsertBtnData} =
- case Insert of
- true ->
- {"Insert", insert};
- false ->
- {"Change", change}
- end,
-
- gs:frame(btnframe, win, [{width, ?FRAME_WIDTH},
- {height, LowerFrameHeight},
- {x, 0},
- {y, FrameHeight},
- {bg, ?DEFAULT_BG_COLOR},
- {bw,2}
- ]),
- gs:button(insert, btnframe, [{width, ?INSERT_BTN_WIDTH},
- {height, ?INSERT_BTN_HEIGHT},
- {x, XInsert},
- {y, Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {font, ?FONT},
- {label, {text, InsertBtnText}},
- {align, center},
- {data, InsertBtnData}
- ]),
- gs:button(cancel, btnframe, [{width, ?INSERT_BTN_WIDTH},
- {height, ?INSERT_BTN_HEIGHT},
- {x, XCancel},
- {y, Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {font, ?FONT},
- {label, {text, "Cancel"}},
- {align, center}
- ]),
- gs:button(reset, btnframe, [{width, ?INSERT_BTN_WIDTH},
- {height, ?INSERT_BTN_HEIGHT},
- {x, XReset},
- {y, Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {font, ?FONT},
- {label, {text, "Reset"}},
- {align, center}
- ]).
-
-
-
-
-
-create_frames(0, _LblW, _AttrList, _AttrValues, _NofFrames, _ListsAsStr, _FrameHeight) ->
- [];
-create_frames(N, LblW, AttrList, AttrValues, NofFrames, ListsAsStr, FrameHeight) ->
- F = gs:frame(win, [{width, ?FRAME_WIDTH},
- {height, FrameHeight},
- {x, 0},
- {y, 0},
- {bg, ?DEFAULT_BG_COLOR},
- {bw,2}
- ]),
- {BId, NId} = create_back_and_next_btns(F, 5, N, NofFrames),
- gs:config(F, [{data, {LblW, BId, NId}}]),
- {RemAttrList, RemAttrValues} =
- create_labels_and_entries(5, AttrList, AttrValues, LblW, F, ListsAsStr),
- [F | create_frames(N - 1,LblW,RemAttrList,RemAttrValues,NofFrames,ListsAsStr,FrameHeight)].
-
-
-
-
-
-
-create_back_and_next_btns(FrameId, NofEntries, FrameNo, NofFrames) ->
- Y = ?Y0 + NofEntries * (?LABEL_HEIGHT + 10) + 8,
- XNext = get_next_btn_xpos(?FRAME_WIDTH),
- XBack = XNext - ?NEXT_BTN_WIDTH,
- DataNext = (NofFrames - FrameNo + 1) + 1,
- DataBack = (NofFrames - FrameNo + 1) - 1,
- BId =
- if
- DataBack =< 0 ->
- undefined;
- true ->
- gs:button(FrameId, [{width, ?NEXT_BTN_WIDTH},
- {height, ?NEXT_BTN_HEIGHT},
- {x, XBack},
- {y, Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, ?NEXT_BTN_FG},
- {font, ?FONT},
- {align, center},
- {label, {text, "< Back"}},
- %% {underline, 2},
- {data, DataBack}
- ])
- end,
- NId =
- if
- DataNext > NofFrames ->
- undefined;
- true ->
- gs:button(FrameId, [{width, ?NEXT_BTN_WIDTH},
- {height, ?NEXT_BTN_HEIGHT},
- {x, XNext},
- {y, Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, ?NEXT_BTN_FG},
- {font, ?FONT},
- {align, center},
- {label, {text, " Next >"}},
- %% {underline, 1},
- {data, DataNext}
- ])
- end,
- {BId, NId}.
-
-
-
-
-get_next_btn_xpos(FrameWidth) ->
- FrameWidth - ?X0 - ?NEXT_BTN_WIDTH.
-
-
-
-get_entry_width(TableType, FrameWidth, LblWidth) ->
- HorizontalSpacing =
- case TableType of
- mnesia ->
- 10;
- ets ->
- 0
- end,
- FrameWidth - LblWidth - 2 * ?X0 - HorizontalSpacing.
-
-
-
-create_labels_and_entries(N, [H | T], [VH | VT], LblW, F, ListsAsStr) when N > 0 ->
- Y = ?Y0 + (5 - N) * (?LABEL_HEIGHT + 10),
- EntryW = get_entry_width(mnesia, ?FRAME_WIDTH, LblW),
- EntryX = ?FRAME_WIDTH - EntryW - ?X0 - 2,
-
- EntryText =
- case ListsAsStr of
- true ->
- tv_io_lib:format("~p", [VH]);
- false ->
- lists:flatten(io_lib:write(VH))
- end,
- gs:label(F, [{width, LblW},
- {height, ?LABEL_HEIGHT},
- {x, ?X0},
- {y, Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {align,w},
- {font, ?FONT},
- {label, {text, atom_to_list(H)}}
- ]),
- gs:entry(H, F, [{width, EntryW},
- {height, ?LABEL_HEIGHT},
- {x, EntryX},
- {y, Y},
- {bg, {255,255,255}},
- {fg, {0,0,0}},
- {bw, 1},
- {font, ?FONT},
- {justify, left},
- {text, EntryText},
- {cursor, text},
- {setfocus, false},
- {enable, true},
- {keypress,true}
- ]),
- create_labels_and_entries(N - 1, T, VT, LblW, F, ListsAsStr);
-create_labels_and_entries(0, RemAttrList, RemAttrValues, _LblW, _F, _ListsAsStr) ->
- {RemAttrList, RemAttrValues};
-create_labels_and_entries(_N, [], [], _LblW, _F, _ListsAsStr) ->
- {[], []}.
-
-
-
-
-get_longest_attribute_name(AttrList) ->
- get_longest_attribute_name(AttrList, 0, undefined).
-
-
-get_longest_attribute_name([H | T], Max, Attr) ->
- CurrLength = length(atom_to_list(H)),
- if
- CurrLength >= Max ->
- get_longest_attribute_name(T, CurrLength, H);
- true ->
- get_longest_attribute_name(T, Max, Attr)
- end;
-get_longest_attribute_name([], _Max, Attr) ->
- Attr.
-
-
-
-
-get_window_height(N) ->
- if
- N >= 5 ->
- ?WIN_HEIGHT;
- true ->
- ?WIN_HEIGHT - ((5 - N) * (?LABEL_HEIGHT + 10) + ?NEXT_BTN_HEIGHT + 8)
- end.
-
-
-
-get_frame_height(N) ->
- if
- N >= 5 ->
- ?FRAME_HEIGHT;
- true ->
- ?FRAME_HEIGHT - ((5 - N) * (?LABEL_HEIGHT + 10) + ?NEXT_BTN_HEIGHT + 8)
- end.
-
-
-
-
-set_entry_values(TabType, [H | T], [VH | VT], ListsAsStr) ->
- EntryText =
- case VH of
- undefined when TabType =:= ets ->
- "";
- _AnyValue ->
- case ListsAsStr of
- true ->
- tv_io_lib:format("~p", [VH]);
- false ->
- lists:flatten(io_lib:write(VH))
- end
- end,
- gs:config(H, [{text, EntryText}]),
- set_entry_values(TabType, T, VT, ListsAsStr);
-set_entry_values(_TabType, [], [], _ListsAsStr) ->
- done.
diff --git a/lib/tv/src/tv_table_owner.erl b/lib/tv/src/tv_table_owner.erl
deleted file mode 100644
index bccac6c236..0000000000
--- a/lib/tv/src/tv_table_owner.erl
+++ /dev/null
@@ -1,122 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-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(tv_table_owner).
-
-
-
--export([create/5
- ]).
-
-
--export([internal_create/3,
- start/0,
- init/0
- ]).
-
-
-
--define(REGISTERED_NAME, tv_table_owner).
-
-
-
-create(mnesia, _Node, _LocalNode, _TableName, _Options) ->
- error;
-create(ets, _Node, true, TabName, Options) ->
- case catch internal_create(ets, TabName, Options) of
- {TabName, Pid} when is_pid(Pid) ->
- {ok, {TabName,Pid}};
- {TabNo, Pid} when is_pid(Pid) ->
- {ok, {TabNo,Pid}};
- _OtherResult ->
- error
- end;
-create(ets, Node, false, TabName, Options) ->
- case catch rpc:block_call(Node, ?MODULE, internal_create, [ets, TabName, Options]) of
- {TabName, Pid} when is_pid(Pid) ->
- {ok, {TabName,Pid}};
- {TabNo, Pid} when is_pid(Pid) ->
- {ok, {TabNo,Pid}};
- _OtherResult ->
- error
- end.
-
-
-
-
-
-internal_create(ets, TabName, Options) ->
- ?MODULE:start(),
- ?REGISTERED_NAME ! {create, self(), ets, TabName, Options},
- receive
- {?REGISTERED_NAME, Result} ->
- Result
- after
- 5000 ->
- error
- end.
-
-
-
-
-
-
-start() ->
- case whereis(?REGISTERED_NAME) of
- undefined ->
- ServerPid = spawn(?MODULE, init, []),
- case catch register(?REGISTERED_NAME, ServerPid) of
- true ->
- ok;
- {'EXIT', _Reason} ->
- exit(ServerPid, kill),
- timer:sleep(500),
- start()
- end;
- Pid when is_pid(Pid) ->
- ok
- end.
-
-
-
-
-
-
-
-
-init() ->
- %% Currently no initialisations!
- loop().
-
-
-
-
-
-
-loop() ->
- receive
-
- {create, Sender, ets, TabName, Options} ->
- Sender ! {?REGISTERED_NAME, (catch ets:new(TabName, Options))},
- loop();
-
-
- _Other ->
- loop()
-
- end.
-
diff --git a/lib/tv/src/tv_utils.erl b/lib/tv/src/tv_utils.erl
deleted file mode 100644
index 799e3994cb..0000000000
--- a/lib/tv/src/tv_utils.erl
+++ /dev/null
@@ -1,179 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2012. 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(tv_utils).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,destroy,1}}]).
-
-
-
--export([notify/3]).
-
-
-
- %% Minimum size of help windows
--define(wwin, 300).
--define(hwin, 180).
-
- %% Button sizes
--define(wbut, 60).
--define(hbut, 30).
-
--define(pad, 10).
-
-
-%----------------------------------------
-% notify(S,Strings) -> ok
-% S = pid() GS
-% Strings = string() | [string()]
-% A notification window contains a message to the user.
-% Will lock the GUI until the user confirms the message by
-% pressing the 'Ok' button.
-%----------------------------------------
-notify(S,Title,Strings) ->
- W = required_width(Strings, ?wwin),
- Htop = round(2 * ?hwin / 3),
- Hbot = ?hwin - Htop,
-
- %% Open a new window
- Win = gs:create(window,S,[{width, W},
- {height, ?hwin},
- {title, Title},
- {data, notifywin}
- ]),
-
- %% Top frame containing a label
- Top = gs:create(frame,Win,[{width, W},
- {height, Htop},
- {x, 0},
- {y, 0},
- {data, notifywin},
- {keypress, true}
- ]),
-
- Lbl = gs:create(label,Top,[{width,W},
- {height, Htop - 2 * ?pad},
- {x, 0},
- {y, ?pad},
- {align, c},
- {justify, center},
- {data, notifywin},
- {keypress, true}
- ]),
-
- gs:config(Lbl, {label, {text, insert_newlines(Strings)}}),
-
- %% Bottom frame containing an 'Ok' button
- Bot = gs:create(frame,Win,[{width, W},
- {height, Hbot},
- {x, 0},
- {y, Htop}
- ]),
- gs:create(button,Bot,[{width, ?wbut},
- {height, ?hbut},
- {x, W / 2 - ?wbut/2},
- {y, Hbot / 2 - ?hbut / 2},
- {label, {text, "OK"}},
- {data, notifywin},
- {keypress, true}]),
-
- gs:config(Win, [{map,true}]),
-
- event_loop(Win,null).
-
-
-
-
-insert_newlines([String|Rest]) when is_list(String), Rest=/=[]->
- String ++ "\n" ++ insert_newlines(Rest);
-insert_newlines([Last]) ->
- [Last];
-insert_newlines(Other) ->
- Other.
-
-
-
-
-event_loop(Win,Entry) ->
- receive
-
- %%
- %% Notify window
- %%
-
- %% 'Ok' pressed in notify window
- {gs,_Obj,_Event,notifywin,["OK"|_]} ->
- gs:destroy(Win),
- ok;
-
- %% 'Window manager destroy' received in notify window
- {gs,_Obj,destroy,notifywin,_} ->
- gs:destroy(Win),
- ok;
-
- %% 'Return' pressed in notify or confirm window
- {gs,_Obj,_Event,helpwin,['Return'|_]} ->
- gs:destroy(Win),
- ok;
-
-
- %%
- %% Common or partly common events
- %%
-
- %% 'Window manager destroy' received in notify,
- %% confirm,confirm_exit or request window
- {gs,_Obj,destroy,_,_} ->
- gs:destroy(Win),
- cancel;
-
- %% Flush any other GS events
- {gs,_Obj,_Event,_Data,_Arg} ->
- event_loop(Win,Entry)
- end.
-
-
-
-
-%----------------------------------------
-% required_width(Strings,Min) -> Req
-% Strings = string() | [string()]
-% Min = Req = integer()
-% Returns the minimum required width in pixels for a help window,
-% which is the maximum of Min and the required width for Strings.
-% NOTE: Font dependant really!
-%----------------------------------------
-required_width([First|Rest],Min) when is_list(First) ->
- Req = 7*length(First), % 7 pixels per character
- if
- Req>Min ->
- required_width(Rest,Req);
- true ->
- required_width(Rest,Min)
- end;
-required_width([],Min) ->
- Min;
-required_width(String,Min) ->
- Req = 7*length(String),
- if
- Req>Min ->
- Req;
- true ->
- Min
- end.
-