menu.sa
Generated by gen_html_sa_files from ICSI. Contact gomes@icsi.berkeley.edu for details
---------------------------> Sather 1.1 source file <--------------------------
-- menu.sa: Tk menus
-- Author: Matthias Ernst <tisi@beutlin.desy.de>
-- Copyright (C) 1995, International Computer Science Institute
-- $Id: menu.sa,v 1.3 1996/06/27 16:33:37 holger Exp $
--
-- COPYRIGHT NOTICE: This code is provided WITHOUT ANY WARRANTY
-- and is subject to the terms of the SATHER LIBRARY GENERAL PUBLIC
-- LICENSE contained in the file: Sather/Doc/License of the
-- Sather distribution. The license is also available from ICSI,
-- 1947 Center St., Suite 600, Berkeley CA 94704, USA.
class TK_MENU_CFG
class TK_MENU_CFG is
include TK_WIDGET_CFG_INCL
background->background,
foreground->foreground,
font->font,
borderwidth->borderwidth,
relief_none->relief_none,relief_raised->relief_raised,
relief_sunken->relief_sunken,
relief_flat->relief_flat,relief_ridge->relief_ridge,
relief_groove->relief_groove,
activeforeground->activeforeground,
activebackground->activebackground,
activeborderwidth->activeborderwidth,
disabledforeground->disabledforeground;
tearoff(tearoff: BOOL) is
config("tearoff", tearoff);
end;
tearoff(tearoff: BOOL): SAME is
tearoff(tearoff);
return self;
end;
end; -- class TK_MENU_CFG
class TK_MENU < $TK_WIDGET
class TK_MENU < $TK_WIDGET is
-- a simplified version of Tk menus
include TK_WIDGET_INCL{TK_MENU_CFG}
create ->; -- create's aren't suitable for me
private const tk_widget_type: STR := "menu";
private default_config: TK_MENU_CFG is
return TK_MENU_CFG::std
end;
private default_init(c: TK_MENU_CFG) is
commands := #;
end;
act_on(id: INT, args: ARRAY{STR}) is
-- ignore args
commands[id].call
end;
-- creation needed to be overwritten since there's no packing for menus
create(parent: $TK_WIDGET): SAME is
-- Use default packing and name
return create(parent,"widget",default_config);
end;
create(parent: $TK_WIDGET,np: STR): SAME is
-- Use default packing and name
return create(parent,np,default_config);
end;
create(parent: $TK_WIDGET,cf: TK_MENU_CFG): SAME is
return create(parent,"widget",cf);
end;
create(parent:$TK_WIDGET,np:STR,cf: TK_MENU_CFG): SAME is
res ::= new;
name ::= fix_tcl_name(np)+'u'+UNIQ::next;
deb("Creating widget named:"+name+" specfied name:"+np);
res.init(parent,name,cf);
res.register;
eval(res.actual_widget_name,"configure", cf.str);
return res;
end;
-- commands[id].call
private attr commands: LIST{ROUT};
-- indices into the menu are integers
-- some special indices:
-- (see menu manual page for explanation)
-- instead of feeding special strings to index
-- you call these and give Tk the result.
-- There's one problematic index:
-- index_active may return -1, which means 'none'
-- You may however not feed -1 as index argument into a procedure
private index(s: STR): INT is
index_str ::= GUI_APP_END::eval(actual_widget_name+" index " + s);
-- possibly "none"
if index_str = "none" then return -1
else return #INT(index_str)
end;
end;
index_active: INT is
return index("active");
end;
index_end: INT is
return index("end");
end;
index_at(y: FLT): INT is
return index("@"+y);
end;
-- adding entries
-- with sugar for creation
-- file_menu ::= #TK_MENU(...).
-- command("New", bind(file_new)).
-- command("Open ...", bind(file_open)).
-- separator.
-- cascade("Language").command("English",
-- bind(set_lang("english"))).
-- .command("German",
-- bind(set_lang("german")))
-- .parent_menu. -- end cascade
-- command("You got it now")
command(label: STR, command: ROUT) is
index ::= commands.size;
commands.append(command);
eval(path_name,"add command -label",
quote(label),"-command",quote("sather "+path_name+" "+index));
end;
command(label: STR, command: ROUT): SAME is
command(label, command);
return self;
end;
separator is
eval(path_name, "add separator");
end;
separator: SAME is
separator;
return self;
end;
cascade(label: STR): SAME is
-- returns empty submenu
submenu ::= #SAME(self, "submenu", default_config);
eval(path_name, "add cascade", "-label "
+quote(label), "-menu "+submenu.path_name);
return submenu;
end;
parent_menu: SAME
-- give the parent menu [of course, only if it is one]
-- otherwise we get a runtime error
is
paren::=parent;
typecase paren
when SAME then return paren
end;
end;
-- entry manipulation
--
-- for the moment, only dis/enabling is supported
--
-- dis/enabling of separators/tearoffs will be ignored
disable(index: INT) is
state_config(index, "-state disabled");
end;
enable(index: INT) is
state_config(index, "-state normal");
end;
private state_config(index: INT, state: STR) is
typestr ::= GUI_APP_END::eval(path_name + " type " + index);
case typestr
when "command", "cascade" then
eval(path_name, "entryconfigure", index, state);
else -- ignore
end;
end;
end; -- class TK_MENU