view src/samer/maths/MatEditor.java @ 8:5e3cbbf173aa tip

Reorganise some more
author samer
date Fri, 05 Apr 2019 22:41:58 +0100
parents bf79fb79ee13
children
line wrap: on
line source
/*
 *	MatEditor.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.maths;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import samer.core.*;
import samer.core.types.*;
import samer.core.util.*;

/**
	This is a mouse event handler that interprets mouse clicks
	to edit a matrix. It assumes that it is handling mouse
	events for a component the contains some representation of the 
	matrix that is arranged in rows and columns, just like the
	matrix itself (it doesn't have to be an image). The window
	relative coordinates are simply mapped to a matrix element 
	address.
  */

public class MatEditor extends MouseAdapter 
	implements MouseMotionListener, Agent
{
	Component	canvas;
	Mat			M;
	VDouble		setto;
	Observable	obs;
	int			lasti=-1, lastj=-1;
	double		dragval=0;
	boolean		add=false;
	boolean		b1down=false;

	public MatEditor( Mat m, Component c, Observable v, Viewer vwr)
	{
		M=m; 
		canvas=c;
		setto = new VDouble("button1",1,0);
		canvas.addMouseListener(this);
		canvas.addMouseMotionListener(this);
		obs=v;

		vwr.exposeCommands(this);
	}

	public void getCommands(Agent.Registry r) { r.add("add",add); }
	public void execute(String cmd, Environment env) {	
		add=X._bool(env.datum(),!add); 
	}

	private void handle(MouseEvent e)
	{
		// get position in matrix
		int i = (M.height()*e.getY())/canvas.getHeight();
		int j = (M.width()*e.getX())/canvas.getWidth();

		// check bounds
		if (i<0 || i>=M.height()) return;
		if (j<0 || j>=M.width()) return;

		// correct for vertical flip
		i=M.height()-i-1;

		if (!add) {
			if (i==lasti && j==lastj) return;
			M.set(i,j,dragval);
		} else M.set(i,j,M.get(i,j)+dragval);

		lasti=i;
		lastj=j;
		obs.notifyObservers(new Point(j,i)); // Point as x,y into image raster
	}

	public void mouseMoved(MouseEvent e) {}
	public void mouseDragged(MouseEvent e) { if (b1down) { handle(e); e.consume(); } }
	public void mousePressed(MouseEvent e)
	{
		int f = e.getModifiers();

		if ((f & InputEvent.BUTTON1_MASK)!=0) b1down=true;
		if (b1down) {

			// if ((f&(InputEvent.BUTTON2_MASK|InputEvent.BUTTON3_MASK))==0) {
			if (!e.isControlDown()) {
				dragval=setto.value;
			} else {
				dragval=add ? -setto.value : 0;
				// canvas.addMouseListener(this); // to catch mouse up!
				// b2down=true;
			}

			lasti=lastj=-1;
			handle(e);
			e.consume();

		}	
	}

	public void mouseReleased(MouseEvent e)
	{
		int f = e.getModifiers();

		if ((f & InputEvent.BUTTON1_MASK)!=0) {
			// button 1 up - stop all dragging
			b1down=false;

			//if (b2down) {
			//	canvas.removeMouseListener(this);
			//	b2down=false;
			//}
			e.consume();
		} /* else {

			// something else up
			if (b1down) {

				if ((f&(InputEvent.BUTTON2_MASK|InputEvent.BUTTON3_MASK))!=0) {
					// button 2 up
					dragval=setto.value;
					b2down=false;
					canvas.removeMouseListener(this);
					handle(e);
				} 
				e.consume();

			} else {
				Shell.print("button up while button 1 not down?");
			}
		} */
	}

	public void detach() { setto.dispose(); }
}