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 }
|