aboutsummaryrefslogtreecommitdiffstats
path: root/lib/tv/src/tv_pw_window.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/tv/src/tv_pw_window.erl')
-rw-r--r--lib/tv/src/tv_pw_window.erl273
1 files changed, 273 insertions, 0 deletions
diff --git a/lib/tv/src/tv_pw_window.erl b/lib/tv/src/tv_pw_window.erl
new file mode 100644
index 0000000000..9cb5c879c0
--- /dev/null
+++ b/lib/tv/src/tv_pw_window.erl
@@ -0,0 +1,273 @@
+%%
+%% %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: Part of the pw component controlling the graphics.
+%%%
+%%%*********************************************************************
+
+
+-module(tv_pw_window).
+
+
+
+-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.
+
+
+
+
+
+
+
+
+
+