diff options
Diffstat (limited to 'lib/tv/src/tv_pw.erl')
-rw-r--r-- | lib/tv/src/tv_pw.erl | 327 |
1 files changed, 327 insertions, 0 deletions
diff --git a/lib/tv/src/tv_pw.erl b/lib/tv/src/tv_pw.erl new file mode 100644 index 0000000000..8b3186e090 --- /dev/null +++ b/lib/tv/src/tv_pw.erl @@ -0,0 +1,327 @@ +%% +%% %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: Code for pw, the window controlling part of the table tool. +%%% +%%%********************************************************************* + + +-module(tv_pw). + + + +-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. + + + + + + + + + + + + + + + |