%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 1997-2012. 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).
-compile([{nowarn_deprecated_function,{gs,config,2}},
{nowarn_deprecated_function,{gs,create,3}},
{nowarn_deprecated_function,{gs,menuitem,3}},
{nowarn_deprecated_function,{gs,start,0}}]).
-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.