diff src/samer/core_/util/UserEnvironment.java @ 0:bf79fb79ee13

Initial Mercurial check in.
author samer
date Tue, 17 Jan 2012 17:50:20 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/samer/core_/util/UserEnvironment.java	Tue Jan 17 17:50:20 2012 +0000
@@ -0,0 +1,172 @@
+/*
+ *	UserEnvironment.java	
+ *
+ *	Copyright (c) 2000, Samer Abdallah, King's College London.
+ *	All rights reserved.
+ *
+ *	This software is provided AS IS and WITHOUT ANY WARRANTY; 
+ *	without even the implied warranty of MERCHANTABILITY or 
+ *	FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+package samer.core.util;
+import  samer.core.types.*;
+import  samer.core.*;
+import  java.util.Hashtable;
+import  java.awt.Color;
+
+/**	
+  *	Environment which provides access to the user
+  *	using a GUI
+  */
+
+public class UserEnvironment extends Environment
+{
+	boolean toggleBoolean=false;
+	boolean state;
+
+	public UserEnvironment(Environment parent) {	super(parent,parent.node()); }
+	public UserEnvironment(Environment parent, boolean bool) { 
+		super(parent,parent.node()); toggleBoolean=true; state=bool;
+	}
+
+	private static Hashtable reg=new Hashtable();
+
+	public interface Thingy {
+		Viewable viewable(String name, Object obj);
+		Object	decode(Viewable vbl);
+	}
+
+	static {
+		reg.put( Boolean.class, new Thingy() {
+			public Object decode(Viewable vbl) { return new Boolean(((VBoolean)vbl).value); }
+			public Viewable viewable(String name, Object obj) {
+				return new VBoolean(name,((Boolean)obj).booleanValue(),Variable.NOINIT);
+			}
+		} );
+
+		reg.put( Integer.class, new Thingy() {
+			public Object decode(Viewable vbl) { return new Integer(((VInteger)vbl).value); }
+			public Viewable viewable(String name, Object obj) {
+				return new VInteger(name,((Number)obj).intValue(),Variable.NOINIT);
+			}
+		} );
+
+		reg.put( Double.class, new Thingy() {
+			public Object decode(Viewable vbl) { return new Double(((VDouble)vbl).value); }
+			public Viewable viewable(String name, Object obj) {
+				return new VDouble(name,((Number)obj).doubleValue(),Variable.NOINIT);
+			}
+		} );
+
+		reg.put( String.class, new Thingy() {
+			public Object decode(Viewable vbl) { return ((VString)vbl).value; }
+			public Viewable viewable(String name, Object obj) {
+				return new VString(name,obj==null ? "" : (String)obj,Variable.NOINIT);
+			}
+		} );
+
+		reg.put( Color.class, new Thingy() {
+			public Object decode(Viewable vbl) { return ((VColor)vbl).getColor(); }
+			public Viewable viewable(String name, Object obj) {
+				return obj!=null ?
+						new VColor(name,(Color)obj,Variable.NOINIT)
+					:	new VColor(name,Variable.NOINIT);
+			}
+		} );
+	}
+
+	public void add(Object o) { Shell.print(X.codec(o).string(o)); }
+	public Binding add(String n, Object o) {
+		Shell.print(n+"="+X.codec(o).string(o));
+		return super.add(n,o);
+	}
+
+	public Datum datum() { return new Gluon(".",Null); } // ??
+	public Datum datum(String name) {
+		return new Gluon(rel(name),parent.datum(abs(name)));
+	}
+
+	private class Gluon implements Datum
+	{
+		String	name;			// name of this Binding
+		Datum		inherited;	// parent's binding
+
+		public Gluon(String nm, Datum inh) { name=nm; inherited=inh; }
+
+		public String name()  { return this.name; }
+		public int	  score() { return 0; } // ie perfect match
+
+		public Object get(Codec c, Object def)
+		{
+			if (toggleBoolean) {
+				if (c.targetClass()==Boolean.class) return new Boolean(state);
+			}
+
+			if (def==null) def=inherited.get(c,def);
+			else def=c.decode(def); // ??
+
+			Thingy thing=(Thingy)reg.get(c.targetClass());
+
+			if (thing==null) {
+				Object strdef=(def==null?null:c.string(def));
+				Object result=get(X.StringCodec,strdef);
+				return (result==strdef ? def : c.decode(result));
+			}
+
+			// what if def is still null??
+
+			Shell.push(parent);
+			try {
+				// create, decode, and dispose of dialog with user
+				Viewable vbl=thing.viewable(name,def);
+				String	rc=showdlg(vbl.getViewer().getComponent());
+				if (rc.equals("ok")) def=thing.decode(vbl);
+				vbl.dispose();
+				check(rc);
+
+				return def;
+			} finally { Shell.pop(); }
+		}
+
+		public void get(Autocoder obj)
+		{
+			if (toggleBoolean) {
+				 if (obj instanceof VBoolean) obj.decode(new Boolean(state));
+			} else if (obj instanceof Viewable) {
+				Viewable vbl=(Viewable)obj;
+				Object	old=obj.object();
+
+				Shell.push(parent);
+				try {
+					Viewer	vwr=((Viewable)obj).getViewer();
+					String	rc=showdlg(vwr.getComponent());
+					if (rc.equals("default")) { obj.decode(old); vbl.changed(); }
+					vwr.detach();
+					check(rc);
+				}
+				finally { Shell.pop(); }
+			} else {
+				obj.decode(get(X.StringCodec,obj.string()));
+			}
+		}
+
+		private void check(String rc) {
+			if (rc.equals("cancel")) throw new Error("cancel");
+		}
+
+		private String showdlg(java.awt.Component c) {
+			Shell.Dialog	dlg = Shell.getDialog(name.endsWith(".") ? "Parameter entry" : name);
+
+			dlg.container().add(c);
+			dlg.addAction("default");
+			dlg.addAction("cancel");
+			dlg.addAction("ok");
+			dlg.expose();
+			dlg.dispose();
+
+			return dlg.result();
+		}
+	}
+}
+