annotate 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
rev   line source
samer@0 1 /*
samer@0 2 * MatEditor.java
samer@0 3 *
samer@0 4 * Copyright (c) 2000, Samer Abdallah, King's College London.
samer@0 5 * All rights reserved.
samer@0 6 *
samer@0 7 * This software is provided AS iS and WITHOUT ANY WARRANTY;
samer@0 8 * without even the implied warranty of MERCHANTABILITY or
samer@0 9 * FITNESS FOR A PARTICULAR PURPOSE.
samer@0 10 */
samer@0 11
samer@0 12 package samer.maths;
samer@0 13
samer@0 14 import java.awt.*;
samer@0 15 import java.awt.event.*;
samer@0 16 import java.util.*;
samer@0 17 import samer.core.*;
samer@0 18 import samer.core.types.*;
samer@0 19 import samer.core.util.*;
samer@0 20
samer@0 21 /**
samer@0 22 This is a mouse event handler that interprets mouse clicks
samer@0 23 to edit a matrix. It assumes that it is handling mouse
samer@0 24 events for a component the contains some representation of the
samer@0 25 matrix that is arranged in rows and columns, just like the
samer@0 26 matrix itself (it doesn't have to be an image). The window
samer@0 27 relative coordinates are simply mapped to a matrix element
samer@0 28 address.
samer@0 29 */
samer@0 30
samer@0 31 public class MatEditor extends MouseAdapter
samer@0 32 implements MouseMotionListener, Agent
samer@0 33 {
samer@0 34 Component canvas;
samer@0 35 Mat M;
samer@0 36 VDouble setto;
samer@0 37 Observable obs;
samer@0 38 int lasti=-1, lastj=-1;
samer@0 39 double dragval=0;
samer@0 40 boolean add=false;
samer@0 41 boolean b1down=false;
samer@0 42
samer@0 43 public MatEditor( Mat m, Component c, Observable v, Viewer vwr)
samer@0 44 {
samer@0 45 M=m;
samer@0 46 canvas=c;
samer@0 47 setto = new VDouble("button1",1,0);
samer@0 48 canvas.addMouseListener(this);
samer@0 49 canvas.addMouseMotionListener(this);
samer@0 50 obs=v;
samer@0 51
samer@0 52 vwr.exposeCommands(this);
samer@0 53 }
samer@0 54
samer@0 55 public void getCommands(Agent.Registry r) { r.add("add",add); }
samer@0 56 public void execute(String cmd, Environment env) {
samer@0 57 add=X._bool(env.datum(),!add);
samer@0 58 }
samer@0 59
samer@0 60 private void handle(MouseEvent e)
samer@0 61 {
samer@0 62 // get position in matrix
samer@0 63 int i = (M.height()*e.getY())/canvas.getHeight();
samer@0 64 int j = (M.width()*e.getX())/canvas.getWidth();
samer@0 65
samer@0 66 // check bounds
samer@0 67 if (i<0 || i>=M.height()) return;
samer@0 68 if (j<0 || j>=M.width()) return;
samer@0 69
samer@0 70 // correct for vertical flip
samer@0 71 i=M.height()-i-1;
samer@0 72
samer@0 73 if (!add) {
samer@0 74 if (i==lasti && j==lastj) return;
samer@0 75 M.set(i,j,dragval);
samer@0 76 } else M.set(i,j,M.get(i,j)+dragval);
samer@0 77
samer@0 78 lasti=i;
samer@0 79 lastj=j;
samer@0 80 obs.notifyObservers(new Point(j,i)); // Point as x,y into image raster
samer@0 81 }
samer@0 82
samer@0 83 public void mouseMoved(MouseEvent e) {}
samer@0 84 public void mouseDragged(MouseEvent e) { if (b1down) { handle(e); e.consume(); } }
samer@0 85 public void mousePressed(MouseEvent e)
samer@0 86 {
samer@0 87 int f = e.getModifiers();
samer@0 88
samer@0 89 if ((f & InputEvent.BUTTON1_MASK)!=0) b1down=true;
samer@0 90 if (b1down) {
samer@0 91
samer@0 92 // if ((f&(InputEvent.BUTTON2_MASK|InputEvent.BUTTON3_MASK))==0) {
samer@0 93 if (!e.isControlDown()) {
samer@0 94 dragval=setto.value;
samer@0 95 } else {
samer@0 96 dragval=add ? -setto.value : 0;
samer@0 97 // canvas.addMouseListener(this); // to catch mouse up!
samer@0 98 // b2down=true;
samer@0 99 }
samer@0 100
samer@0 101 lasti=lastj=-1;
samer@0 102 handle(e);
samer@0 103 e.consume();
samer@0 104
samer@0 105 }
samer@0 106 }
samer@0 107
samer@0 108 public void mouseReleased(MouseEvent e)
samer@0 109 {
samer@0 110 int f = e.getModifiers();
samer@0 111
samer@0 112 if ((f & InputEvent.BUTTON1_MASK)!=0) {
samer@0 113 // button 1 up - stop all dragging
samer@0 114 b1down=false;
samer@0 115
samer@0 116 //if (b2down) {
samer@0 117 // canvas.removeMouseListener(this);
samer@0 118 // b2down=false;
samer@0 119 //}
samer@0 120 e.consume();
samer@0 121 } /* else {
samer@0 122
samer@0 123 // something else up
samer@0 124 if (b1down) {
samer@0 125
samer@0 126 if ((f&(InputEvent.BUTTON2_MASK|InputEvent.BUTTON3_MASK))!=0) {
samer@0 127 // button 2 up
samer@0 128 dragval=setto.value;
samer@0 129 b2down=false;
samer@0 130 canvas.removeMouseListener(this);
samer@0 131 handle(e);
samer@0 132 }
samer@0 133 e.consume();
samer@0 134
samer@0 135 } else {
samer@0 136 Shell.print("button up while button 1 not down?");
samer@0 137 }
samer@0 138 } */
samer@0 139 }
samer@0 140
samer@0 141 public void detach() { setto.dispose(); }
samer@0 142 }