view src/samer/core_/viewers/swing/NumberViewer.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
/*
 *	NumberViewer.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.util.*;
import  samer.core.*;
import  java.awt.*;
import  java.awt.event.*;
import  java.util.*;
import  javax.swing.*;
import  javax.swing.event.*;


abstract	class NumberViewer extends VariableViewer implements
	FocusListener, ChangeListener, ActionListener
{
	JTextField	t=null;
	volatile boolean ignoreTextChange=false, ignoreSliderChange=false;

	protected NumberViewer(Variable v)
	{
		super(v);
		setLayout(new BoxLayout(panel(),BoxLayout.X_AXIS));
	}

	protected void init() { init(true); }
	protected void init(boolean entry)
	{
		Dimension	d;

		JComponent	s = createSlider();


		if (s!=null) {
			d=s.getPreferredSize();
			d.width=80;
			s.setPreferredSize(d);
			if (s instanceof JSlider) add(s);
			else {
				add(Box.createHorizontalStrut(4));	add(s);
				add(Box.createHorizontalStrut(4));
			}
		} else {
			add(Box.createHorizontalGlue());
		}

		if (entry) {
			t = new JTextField(6);
			d=t.getPreferredSize();
			d.width *= 2;
			t.setMaximumSize(d);
			t.addFocusListener(this);
			t.addActionListener(this);
			add(t);
		}

		update(null,null);
	}

	protected abstract JComponent createSlider();
	protected abstract void getText() throws Exception;
	protected abstract void setText();
	protected abstract void getSlider();
	protected abstract void setSlider();

	// ....... Viewer bits ...................................

	public void update(Observable o, Object source) // &&&
	{
		if (source!=this) {
			ignoreTextChange=true;
			ignoreSliderChange=true;
			if (t!=null) setText();
			setSlider();
			ignoreTextChange=false;
			ignoreSliderChange=false;
		}
		super.update(o,source);
	}

	// ----------- event handling -------------

	private void textChanged()
	{
		if (ignoreTextChange) return;
		// enter pressed in text field:
		// read value from text, set slider and
		// notify observers.
		try {
			getText();
			ignoreSliderChange=true;
			setSlider();
			ignoreSliderChange=false;
			variable.changed(this);
		}
		catch (Exception ex) { Shell.trace(ex.toString()); }
	}

	public void stateChanged(ChangeEvent e)
	{
		if (ignoreSliderChange) return;

		getSlider();
		ignoreTextChange=true;
		if (t!=null) setText();
		ignoreTextChange=false;
		variable.changed(this);
	}

	public void focusGained( FocusEvent e) {}
	public void focusLost( FocusEvent e) {
		if (e.getSource()==t) textChanged();
	}

	public void actionPerformed( ActionEvent e) {
		if (e.getSource()==t) textChanged();
	}
}