%%
%% %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}]).