Mercurial > hg > jslab
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(); } }