diff options
Diffstat (limited to 'lib/gs/src/gs.erl')
-rw-r--r-- | lib/gs/src/gs.erl | 403 |
1 files changed, 403 insertions, 0 deletions
diff --git a/lib/gs/src/gs.erl b/lib/gs/src/gs.erl new file mode 100644 index 0000000000..3e9a1c4b8b --- /dev/null +++ b/lib/gs/src/gs.erl @@ -0,0 +1,403 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-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% +%% + +%% +%% ------------------------------------------------------------ +%% Erlang Graphics Interface and front end server +%% ------------------------------------------------------------ +%% + +-module(gs). + + +%% ----- Exports ----- +-export([start/0, stop/0, start/1]). +-export([create/3, create/4, is_id/1]). +-export([info/1,create_tree/2]). +-export([config/2, read/2, destroy/1]). +-export([get_id/1]). + +%% ----- Not standard but convenient ----- +-export([error/2,creation_error/2,assq/2,pair/2,val/2,val/3,foreach/3]). +-export([create/2]). +-export([window/1,window/2,window/3,button/1,button/2,button/3]). +-export([radiobutton/1,radiobutton/2,radiobutton/3]). +-export([checkbutton/1,checkbutton/2,checkbutton/3]). +-export([frame/1,frame/2,frame/3,label/1,label/2,label/3]). +-export([message/1,message/2,message/3]). +-export([listbox/1,listbox/2,listbox/3,entry/1,entry/2,entry/3]). +-export([scrollbar/1,scrollbar/2,scrollbar/3]). +-export([scale/1,scale/2,scale/3]). +-export([canvas/1,canvas/2,canvas/3,editor/1,editor/2,editor/3]). +-export([prompter/1,prompter/2,prompter/3]). +-export([line/1,line/2,line/3,oval/1,oval/2,oval/3]). +-export([rectangle/1,rectangle/2,rectangle/3]). +-export([polygon/1,polygon/2,polygon/3]). +-export([text/1,text/2,text/3,image/1,image/2,image/3,arc/1,arc/2,arc/3]). +-export([menu/1,menu/2,menu/3,menubutton/1,menubutton/2,menubutton/3]). +-export([menubar/1,menubar/2,menubar/3]). +-export([grid/1,grid/2,grid/3]). +-export([gridline/1,gridline/2,gridline/3]). +-export([menuitem/1,menuitem/2,menuitem/3]). + +-include("gstk.hrl"). + +%% ----- Start/Stop ----- + +start() -> + start([]). + +start(Opts) -> + Opts2 = gstk_generic:merge_default_options(gs_widgets:default_options(gs), + lists:sort(Opts)), + gs_frontend:start(Opts2). + +stop() -> + gs_frontend:stop(). + +%% ----- Widget Commands ----- + +create(Objtype, Parent) -> + GsPid = frontend(Parent), + tag_if_ok(gs_frontend:create(GsPid,{Objtype, undefined, obj_id(Parent),[]}) + ,GsPid). + +create(Objtype, Parent, Opts) when is_list(Opts) -> + GsPid = frontend(Parent), + tag_if_ok(gs_frontend:create(GsPid,{Objtype,undefined,obj_id(Parent),Opts}), + GsPid); +create(Objtype, Parent, Opt) -> + GsPid = frontend(Parent), + tag_if_ok(gs_frontend:create(GsPid, + {Objtype,undefined,obj_id(Parent),[Opt]}), + GsPid). + +create(Objtype, Name, Parent, Opts) when is_list(Opts) -> + GsPid = frontend(Parent), + tag_if_ok(gs_frontend:create(GsPid,{Objtype, Name, obj_id(Parent),Opts}), + GsPid); +create(Objtype, Name, Parent, Opt) -> + GsPid = frontend(Parent), + tag_if_ok(gs_frontend:create(GsPid,{Objtype,Name,obj_id(Parent),[Opt]}), + GsPid). + +tag_if_ok(Int,Pid) when is_integer(Int) -> + {Int,Pid}; +tag_if_ok(Err,_) -> + Err. + +config(IdOrName, Options) when is_list(Options) -> + gs_frontend:config(frontend(IdOrName),{obj_id(IdOrName),Options}); +config(IdOrName, Option) -> + gs_frontend:config(frontend(IdOrName),{obj_id(IdOrName),[Option]}). + +read(IdOrName, Option) -> + gs_frontend:read(frontend(IdOrName),{obj_id(IdOrName),Option}). + +destroy(IdOrName) -> + gs_frontend:destroy(frontend(IdOrName),obj_id(IdOrName)). + +get_id(Name) -> + read(Name,id). + +info(version) -> "1.3.2"; +info(Option) -> + gs_frontend:info(Option). + +is_id({Int,Pid}) when is_integer(Int), is_pid(Pid) -> true; +is_id(_) -> false. + +frontend({_,Pid}) when is_pid(Pid) -> Pid; +frontend({AtomName,Node}) when is_atom(AtomName),is_atom(Node) -> + rpc:call(Node,erlang,whereis,[gs_frontend]); +frontend(Atom) when is_atom(Atom) -> whereis(gs_frontend). + +obj_id({Id,_}) -> Id; +obj_id(Atom) when is_atom(Atom) -> Atom. + +error(Format, Data) -> + io:format("gs error: "), + ok = io:format(Format, Data), % don't be quiet when Format is malformed + io:format("~n"). + +creation_error(#gstkid{objtype=Ot}, {bad_result, BadResult}) -> + {error, {creation_error,Ot,BadResult}}; +creation_error(#gstkid{objtype=Ot}, BadResult) -> + {error, {creation_error,Ot,BadResult}}. + + +create_tree(ParentId,[{Type,Name,Options,Children}|R]) -> + case create(Type,Name,ParentId,Options) of + {error,_Reason} -> {error,{create_tree,aborted_at,Type,Name}}; + Id -> + case create_tree(Id,Children) of + ok -> create_tree(ParentId,R); + Err -> Err + end + end; +create_tree(ParentId,[{Type,Name,Options}|R]) when is_atom(Name) -> + create_tree(ParentId,[{Type,Name,Options,[]}|R]); +create_tree(ParentId,[{Type,Options,Children}|R]) -> + case create(Type,ParentId,Options) of + {error,_Reason} -> {error,{create_tree,aborted_at,Type,Options}}; + Id -> + case create_tree(Id,Children) of + ok -> create_tree(ParentId,R); + Err -> Err + end + end; +create_tree(ParentId,[{Type,Options}|R]) -> + create_tree(ParentId,[{Type,Options,[]}|R]); +create_tree(ParentId,Tuple) when is_tuple(Tuple) -> + create_tree(ParentId,[Tuple]); +create_tree(_,[]) -> + ok. + + +window(ParentId) -> + create(window,ParentId,[]). +window(ParentId,Options) -> + create(window,ParentId,Options). +window(Name,ParentId,Options) -> + create(window,Name,ParentId,Options). + +button(ParentId) -> + create(button,ParentId,[]). +button(ParentId,Options) -> + create(button,ParentId,Options). +button(Name,ParentId,Options) -> + create(button,Name,ParentId,Options). + +checkbutton(ParentId) -> + create(checkbutton,ParentId,[]). +checkbutton(ParentId,Options) -> + create(checkbutton,ParentId,Options). + +checkbutton(Name,ParentId,Options) -> + create(checkbutton,Name,ParentId,Options). + +radiobutton(ParentId) -> + create(radiobutton,ParentId,[]). +radiobutton(ParentId,Options) -> + create(radiobutton,ParentId,Options). +radiobutton(Name,ParentId,Options) -> + create(radiobutton,Name,ParentId,Options). + +frame(ParentId) -> + create(frame,ParentId,[]). +frame(ParentId,Options) -> + create(frame,ParentId,Options). +frame(Name,ParentId,Options) -> + create(frame,Name,ParentId,Options). + +canvas(ParentId) -> + create(canvas,ParentId,[]). +canvas(ParentId,Options) -> + create(canvas,ParentId,Options). +canvas(Name,ParentId,Options) -> + create(canvas,Name,ParentId,Options). + +label(ParentId) -> + create(label,ParentId,[]). +label(ParentId,Options) -> + create(label,ParentId,Options). +label(Name,ParentId,Options) -> + create(label,Name,ParentId,Options). + +message(ParentId) -> + create(message,ParentId,[]). +message(ParentId,Options) -> + create(message,ParentId,Options). +message(Name,ParentId,Options) -> + create(message,Name,ParentId,Options). + +listbox(ParentId) -> + create(listbox,ParentId,[]). +listbox(ParentId,Options) -> + create(listbox,ParentId,Options). +listbox(Name,ParentId,Options) -> + create(listbox,Name,ParentId,Options). + +entry(ParentId) -> + create(entry,ParentId,[]). +entry(ParentId,Options) -> + create(entry,ParentId,Options). +entry(Name,ParentId,Options) -> + create(entry,Name,ParentId,Options). + +scrollbar(ParentId) -> + create(scrollbar,ParentId,[]). +scrollbar(ParentId,Options) -> + create(scrollbar,ParentId,Options). +scrollbar(Name,ParentId,Options) -> + create(scrollbar,Name,ParentId,Options). + +scale(ParentId) -> + create(scale,ParentId,[]). +scale(ParentId,Options) -> + create(scale,ParentId,Options). +scale(Name,ParentId,Options) -> + create(scale,Name,ParentId,Options). + +editor(ParentId) -> + create(editor,ParentId,[]). +editor(ParentId,Options) -> + create(editor,ParentId,Options). +editor(Name,ParentId,Options) -> + create(editor,Name,ParentId,Options). + +prompter(ParentId) -> + create(prompter,ParentId,[]). +prompter(ParentId,Options) -> + create(prompter,ParentId,Options). +prompter(Name,ParentId,Options) -> + create(prompter,Name,ParentId,Options). + +line(ParentId) -> + create(line,ParentId,[]). +line(ParentId,Options) -> + create(line,ParentId,Options). +line(Name,ParentId,Options) -> + create(line,Name,ParentId,Options). + +oval(ParentId) -> + create(oval,ParentId,[]). +oval(ParentId,Options) -> + create(oval,ParentId,Options). +oval(Name,ParentId,Options) -> + create(oval,Name,ParentId,Options). + +rectangle(ParentId) -> + create(rectangle,ParentId,[]). +rectangle(ParentId,Options) -> + create(rectangle,ParentId,Options). +rectangle(Name,ParentId,Options) -> + create(rectangle,Name,ParentId,Options). + +polygon(ParentId) -> + create(polygon,ParentId,[]). +polygon(ParentId,Options) -> + create(polygon,ParentId,Options). +polygon(Name,ParentId,Options) -> + create(polygon,Name,ParentId,Options). + +text(ParentId) -> + create(text,ParentId,[]). +text(ParentId,Options) -> + create(text,ParentId,Options). +text(Name,ParentId,Options) -> + create(text,Name,ParentId,Options). + +image(ParentId) -> + create(image,ParentId,[]). +image(ParentId,Options) -> + create(image,ParentId,Options). +image(Name,ParentId,Options) -> + create(image,Name,ParentId,Options). + +arc(ParentId) -> + create(arc,ParentId,[]). +arc(ParentId,Options) -> + create(arc,ParentId,Options). +arc(Name,ParentId,Options) -> + create(arc,Name,ParentId,Options). + +menu(ParentId) -> + create(menu,ParentId,[]). +menu(ParentId, Options) -> + create(menu,ParentId,Options). +menu(Name,ParentId,Options) -> + create(menu,Name,ParentId,Options). + +menubutton(ParentId) -> + create(menubutton,ParentId,[]). +menubutton(ParentId,Options) -> + create(menubutton,ParentId,Options). +menubutton(Name,ParentId,Options) -> + create(menubutton,Name,ParentId,Options). + +menubar(ParentId) -> + create(menubar,ParentId,[]). +menubar(ParentId,Options) -> + create(menubar,ParentId,Options). +menubar(Name,ParentId,Options) -> + create(menubar,Name,ParentId,Options). + +menuitem(ParentId) -> + create(menuitem,ParentId,[]). +menuitem(ParentId,Options) -> + create(menuitem,ParentId,Options). +menuitem(Name,ParentId,Options) -> + create(menuitem,Name,ParentId,Options). + +grid(ParentId) -> + create(grid,ParentId,[]). +grid(ParentId,Options) -> + create(grid,ParentId,Options). +grid(Name,ParentId,Options) -> + create(grid,Name,ParentId,Options). + +gridline(ParentId) -> + create(gridline,ParentId,[]). +gridline(ParentId,Options) -> + create(gridline,ParentId,Options). +gridline(Name,ParentId,Options) -> + create(gridline,Name,ParentId,Options). + +%%---------------------------------------------------------------------- +%% Waiting for erl44 +%%---------------------------------------------------------------------- +foreach(F, ExtraArgs, [H | T]) -> + apply(F, [H | ExtraArgs]), + foreach(F, ExtraArgs, T); +foreach(_F, _ExtraArgs, []) -> ok. + +%%---------------------------------------------------------------------- +%% ASSociation with eQual key (scheme standard) +%%---------------------------------------------------------------------- +assq(Key, List) -> + case lists:keysearch(Key, 1, List) of + {value, {_, Val}} -> {value, Val}; + _ -> false + end. + +%%---------------------------------------------------------------------- +%% When we need the whole pair. +%%---------------------------------------------------------------------- +pair(Key, List) -> + case lists:keysearch(Key, 1, List) of + {value, Pair} -> Pair; + _ -> false + end. + +%%---------------------------------------------------------------------- +%% When we know there is a value +%%---------------------------------------------------------------------- +val(Key, List) when is_list(List) -> + {value, {_,Val}} = lists:keysearch(Key, 1, List), + Val. + +val(Key,List,ElseVal) when is_list(List) -> + case lists:keysearch(Key, 1, List) of + {value, {_, Val}} -> Val; + _ -> ElseVal + end. + +%% ---------------------------------------- +%% done |