diff options
Diffstat (limited to 'lib/tv/src/tv_utils.erl')
-rw-r--r-- | lib/tv/src/tv_utils.erl | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/lib/tv/src/tv_utils.erl b/lib/tv/src/tv_utils.erl new file mode 100644 index 0000000000..fd232bde69 --- /dev/null +++ b/lib/tv/src/tv_utils.erl @@ -0,0 +1,176 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-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_utils). + + + +-export([notify/3]). + + + + %% Minimum size of help windows +-define(wwin, 300). +-define(hwin, 180). + + %% Button sizes +-define(wbut, 60). +-define(hbut, 30). + +-define(pad, 10). + + +%---------------------------------------- +% notify(S,Strings) -> ok +% S = pid() GS +% Strings = string() | [string()] +% A notification window contains a message to the user. +% Will lock the GUI until the user confirms the message by +% pressing the 'Ok' button. +%---------------------------------------- +notify(S,Title,Strings) -> + W = required_width(Strings, ?wwin), + Htop = round(2 * ?hwin / 3), + Hbot = ?hwin - Htop, + + %% Open a new window + Win = gs:create(window,S,[{width, W}, + {height, ?hwin}, + {title, Title}, + {data, notifywin} + ]), + + %% Top frame containing a label + Top = gs:create(frame,Win,[{width, W}, + {height, Htop}, + {x, 0}, + {y, 0}, + {data, notifywin}, + {keypress, true} + ]), + + Lbl = gs:create(label,Top,[{width,W}, + {height, Htop - 2 * ?pad}, + {x, 0}, + {y, ?pad}, + {align, c}, + {justify, center}, + {data, notifywin}, + {keypress, true} + ]), + + gs:config(Lbl, {label, {text, insert_newlines(Strings)}}), + + %% Bottom frame containing an 'Ok' button + Bot = gs:create(frame,Win,[{width, W}, + {height, Hbot}, + {x, 0}, + {y, Htop} + ]), + gs:create(button,Bot,[{width, ?wbut}, + {height, ?hbut}, + {x, W / 2 - ?wbut/2}, + {y, Hbot / 2 - ?hbut / 2}, + {label, {text, "OK"}}, + {data, notifywin}, + {keypress, true}]), + + gs:config(Win, [{map,true}]), + + event_loop(Win,null). + + + + +insert_newlines([String|Rest]) when is_list(String), Rest=/=[]-> + String ++ "\n" ++ insert_newlines(Rest); +insert_newlines([Last]) -> + [Last]; +insert_newlines(Other) -> + Other. + + + + +event_loop(Win,Entry) -> + receive + + %% + %% Notify window + %% + + %% 'Ok' pressed in notify window + {gs,_Obj,_Event,notifywin,["OK"|_]} -> + gs:destroy(Win), + ok; + + %% 'Window manager destroy' received in notify window + {gs,_Obj,destroy,notifywin,_} -> + gs:destroy(Win), + ok; + + %% 'Return' pressed in notify or confirm window + {gs,_Obj,_Event,helpwin,['Return'|_]} -> + gs:destroy(Win), + ok; + + + %% + %% Common or partly common events + %% + + %% 'Window manager destroy' received in notify, + %% confirm,confirm_exit or request window + {gs,_Obj,destroy,_,_} -> + gs:destroy(Win), + cancel; + + %% Flush any other GS events + {gs,_Obj,_Event,_Data,_Arg} -> + event_loop(Win,Entry) + end. + + + + +%---------------------------------------- +% required_width(Strings,Min) -> Req +% Strings = string() | [string()] +% Min = Req = integer() +% Returns the minimum required width in pixels for a help window, +% which is the maximum of Min and the required width for Strings. +% NOTE: Font dependant really! +%---------------------------------------- +required_width([First|Rest],Min) when is_list(First) -> + Req = 7*length(First), % 7 pixels per character + if + Req>Min -> + required_width(Rest,Req); + true -> + required_width(Rest,Min) + end; +required_width([],Min) -> + Min; +required_width(String,Min) -> + Req = 7*length(String), + if + Req>Min -> + Req; + true -> + Min + end. + |