tv_pw.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 328 行

ERL
328
字号
%% ``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 via the world wide web 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.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %%     $Id$%%%%%*********************************************************************%%% %%%   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.                

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?