aboutsummaryrefslogtreecommitdiffstats
path: root/lib/tv/src/tv_utils.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/tv/src/tv_utils.erl')
-rw-r--r--lib/tv/src/tv_utils.erl176
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.
+