view src/samer/core_/viewers/swing/DoubleViewer.java @ 5:b67a33c44de7

Remove some crap, etc
author samer
date Fri, 05 Apr 2019 21:34:25 +0100
parents bf79fb79ee13
children
line wrap: on
line source
/*
 *	DoubleViewer.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.viewers.swing;
import  samer.core.types.*;
import  samer.core.util.*;
import  samer.core.util.swing.Meter;
import  samer.core.Agent.*;
import  samer.core.*;
import  java.awt.*;
import  java.util.*;
import  javax.swing.*;

import samer.tools.SignalTrace;

public class DoubleViewer extends NumberViewer
{
	VDouble		model;
	JSlider			slider;
	Meter			meter;
	VMap				map;
	int					flags;

	public DoubleViewer(Viewable v) { this((VDouble)v); }
	public DoubleViewer(VDouble model) { this(model,model.flags); }
	public DoubleViewer(VDouble model, int flags)
	{
		super(model);
		this.model = model;
		this.flags = flags;
		init((flags&VDouble.NOENTRY)==0);
	}

	protected JComponent createSlider() {
		Shell.push(model.getNode());
		try {
			if ((flags&VDouble.NOSLIDER)==0) {
				Shell.push("slider");
				slider=new JSlider( JSlider.HORIZONTAL, 0, 100, 0);
				slider.addChangeListener(this);
				map=new VMap(new LinearMap(100),true);
				map.addObserver( new Observer() {
					public void update(Observable o, Object args) {
						ignoreSliderChange=true; setSlider();
						ignoreSliderChange=false;
					}
				} );
				exposeCommands(map);
	
				Shell.pop();
				return slider;
			} else if (Shell.getBoolean("meter",(flags&VDouble.METER)!=0)) {
				Shell.push("meter");
				meter = new Meter();
				meter.exposeMap();
				meter.setMaximumSize(new Dimension(1000,6));
				Shell.pop();
				return meter;
			} else return null;
		} finally { Shell.pop(); }
	}

	protected void setText()	{ t.setText(X.string(model.get())); }
	protected void getText()   { model.decode(t.getText()); }
	protected void setSlider() {
		if (meter!=null) {
			meter.next(model.get());
		} else if (slider!=null) {
			IMap imap=this.map.getMap();
			double value=model.get();
			int k=imap.toInt(value);
			if (imap.wasClipped()) {
				double right=imap.getDomainMax(), left=imap.getDomainMin();
				if (k<0) map.setDomain(2*value-right,right);
				else map.setDomain(left,2*value-left);
				map.changed();
			} else 	slider.setValue(k);
		}
	}

	protected void getSlider() {
		if (slider!=null) model.value = map.getMap().inverseFromInt(slider.getValue());
	}

	public void getCommands(Registry r) {
		// this gets called in VariableViewer constructor before this
		// object is propery constructed. Hmmmph.
		//if ((model.flags&VDouble.NOENTRY)==0) r.add("print").add("set");
		//if (slider!=null || meter!=null) r.add("calibrate");
		r.add("print").add("set");
		r.add("calibrate");
		r.add("trace");
		r.group();
		super.getCommands(r);
	}

	public void execute(String cmd, Environment env) throws Exception
	{
		if (cmd.equals("print")) Shell.print(model.toString());
		else if (cmd.equals("set"))
			model.set(X._double(env.datum(model.getNode().fullName()),model.get()));
		else if (cmd.equals("calibrate")) {
			if (slider!=null) {
				map.setDomain(0,model.get()*2); setSlider();
			} else if (meter!=null) 
				meter.getMap().setDomain(0,2*model.get());
		} else if (cmd.equals("trace")) {
			Shell.push(new Node("trace", model.getNode()));
			SignalTrace vwr = new SignalTrace(model);
			Shell.expose((Viewer)vwr,"window");
			model.addObserver(vwr);
			Shell.pop();
		} else super.execute(cmd,env);
	}
}