annotate src/samer/maths/MatrixPanel.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 * MatrixPanel.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.text.*;
samer@0 17 import samer.core.types.*;
samer@0 18 import samer.core.util.*;
samer@0 19 import samer.core.*;
samer@0 20
samer@0 21 /**
samer@0 22 A text based matrix editor
samer@0 23 */
samer@0 24
samer@0 25 public class MatrixPanel extends BaseViewer
samer@0 26 implements FocusListener, ActionListener
samer@0 27 {
samer@0 28 int rowdim, coldim;
samer@0 29 Matrix M;
samer@0 30 Field[][] TF;
samer@0 31 boolean isvalid;
samer@0 32 String errmsg;
samer@0 33 boolean readonly;
samer@0 34 Color validColor, badColor;
samer@0 35
samer@0 36 public MatrixPanel( Matrix A) { this(A,true); }
samer@0 37 public MatrixPanel( Matrix A, boolean qedit)
samer@0 38 {
samer@0 39 super(A.observable());
samer@0 40
samer@0 41 int m = A.getRowDimension();
samer@0 42 int n = A.getColumnDimension();
samer@0 43
samer@0 44 readonly = !qedit;
samer@0 45
samer@0 46 /* initialize to all 0 */
samer@0 47 int i, j;
samer@0 48 setLayout(new GridLayout(m,n,2,2));
samer@0 49 rowdim = m; coldim = n;
samer@0 50 M = A;
samer@0 51
samer@0 52 TF = new Field[m][n];
samer@0 53 isvalid = true;
samer@0 54 for (i=0; i < m; i++) {
samer@0 55 for (j=0; j < n; j++){
samer@0 56 TF[i][j] = new Field(6);
samer@0 57 TF[i][j].setEditable(qedit);
samer@0 58 add(TF[i][j]);
samer@0 59 }
samer@0 60 }
samer@0 61
samer@0 62 validColor = TF[0][0].getForeground();
samer@0 63 badColor = Color.red;
samer@0 64 update(null,null);
samer@0 65 }
samer@0 66
samer@0 67 public void update(java.util.Observable o, Object src)
samer@0 68 {
samer@0 69 if (src!=this) { // &&&
samer@0 70 for (int i=0; i < rowdim; i++) {
samer@0 71 for (int j=0; j< coldim; j++) {
samer@0 72 TF[i][j].setForeground(validColor);
samer@0 73 TF[i][j].setText(numfmt._format(M.get(i,j)));
samer@0 74 TF[i][j].edited=false;
samer@0 75 }
samer@0 76 }
samer@0 77 }
samer@0 78 super.update(o,src);
samer@0 79 }
samer@0 80
samer@0 81
samer@0 82 boolean Validate(boolean qcheck)
samer@0 83 {
samer@0 84 /* check validity of all edited entries and change M
samer@0 85 If qcheck is true, check all entries
samer@0 86 */
samer@0 87 String newtext="";
samer@0 88 isvalid = true;
samer@0 89 for (int i=0; i < rowdim; i++) {
samer@0 90 for (int j=0; j < coldim; j++) {
samer@0 91 if (TF[i][j].edited || qcheck) {
samer@0 92 try {
samer@0 93 newtext = TF[i][j].getText().trim();
samer@0 94 double newv = numfmt._parse(newtext);
samer@0 95 M.set(i,j,newv);
samer@0 96 TF[i][j].setForeground(validColor);
samer@0 97 TF[i][j].edited = false;
samer@0 98 TF[i][j].repaint();
samer@0 99 } catch( Exception ex) {
samer@0 100 TF[i][j].setForeground(badColor);
samer@0 101 TF[i][j].repaint();
samer@0 102 isvalid = false;
samer@0 103 if (ex instanceof NumberFormatException)
samer@0 104 errmsg = "Invalid number:"+newtext;
samer@0 105 else errmsg = ex.getMessage();
samer@0 106 Shell.print(errmsg);
samer@0 107 }
samer@0 108 }
samer@0 109 }
samer@0 110 }
samer@0 111
samer@0 112 if (isvalid) M.changed(this);
samer@0 113 return isvalid;
samer@0 114 }
samer@0 115
samer@0 116 public void focusGained( FocusEvent e) {}
samer@0 117 public void focusLost( FocusEvent e) {
samer@0 118 if (!readonly) {
samer@0 119 Component c=e.getComponent();
samer@0 120 if (c instanceof Field) {
samer@0 121 ((Field)c).edited=true;
samer@0 122 Validate(false);
samer@0 123 }
samer@0 124 }
samer@0 125 }
samer@0 126 public void actionPerformed( ActionEvent e)
samer@0 127 {
samer@0 128 // could mean return pressed in a field
samer@0 129 Object c=e.getSource();
samer@0 130 if (c instanceof Field) {
samer@0 131 ((Field)c).edited=true;
samer@0 132 Validate(false);
samer@0 133 }
samer@0 134 }
samer@0 135
samer@0 136 static DoubleFormat numfmt=new DoubleFormat(3);
samer@0 137
samer@0 138 class Field extends TextField
samer@0 139 {
samer@0 140 boolean edited=false;
samer@0 141
samer@0 142 public Field(int cols)
samer@0 143 {
samer@0 144 super(cols);
samer@0 145 this.addFocusListener(MatrixPanel.this);
samer@0 146 this.addActionListener(MatrixPanel.this);
samer@0 147 }
samer@0 148 }
samer@0 149 }