diff options
Diffstat (limited to 'lib/tv/src/tv_pw_window.erl')
-rw-r--r-- | lib/tv/src/tv_pw_window.erl | 273 |
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. + + + + + + + + + + |