diff options
Diffstat (limited to 'lib/tv/src/tv_pg.erl')
-rw-r--r-- | lib/tv/src/tv_pg.erl | 429 |
1 files changed, 429 insertions, 0 deletions
diff --git a/lib/tv/src/tv_pg.erl b/lib/tv/src/tv_pg.erl new file mode 100644 index 0000000000..ba8782392b --- /dev/null +++ b/lib/tv/src/tv_pg.erl @@ -0,0 +1,429 @@ +%% +%% %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_pg). + + + +-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}]). + |