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