s1520454056@5121
|
1 |
package isac.gui.treetable;
|
s1520454056@5121
|
2 |
|
s1520454056@5121
|
3 |
import isac.gui.Worksheet;
|
s1520454056@5121
|
4 |
import isac.gui.mawen.editor.EditorListener;
|
s1520454056@5121
|
5 |
import isac.gui.mawen.syntax.Ast;
|
s1520454056@5121
|
6 |
import isac.interfaces.IEditor;
|
s1520454056@5121
|
7 |
import isac.util.formulae.Formula;
|
s1520454056@5121
|
8 |
|
s1520454056@5121
|
9 |
import java.awt.BorderLayout;
|
s1520454056@5121
|
10 |
import java.awt.Color;
|
s1520454056@5121
|
11 |
import java.awt.Component;
|
s1520454056@5121
|
12 |
import java.awt.Dimension;
|
s1520454056@5121
|
13 |
import java.awt.Rectangle;
|
s1520454056@5121
|
14 |
import java.util.ArrayList;
|
s1520454056@5121
|
15 |
import java.util.EventObject;
|
s1520454056@5121
|
16 |
import java.util.Iterator;
|
s1520454056@5121
|
17 |
|
s1520454056@5121
|
18 |
import javax.swing.JPanel;
|
s1520454056@5121
|
19 |
import javax.swing.JTextField;
|
s1520454056@5121
|
20 |
import javax.swing.JTree;
|
s1520454056@5121
|
21 |
import javax.swing.UIManager;
|
s1520454056@5121
|
22 |
import javax.swing.border.LineBorder;
|
s1520454056@5121
|
23 |
import javax.swing.event.CellEditorListener;
|
s1520454056@5121
|
24 |
import javax.swing.event.ChangeEvent;
|
s1520454056@5121
|
25 |
import javax.swing.tree.TreeCellRenderer;
|
s1520454056@5121
|
26 |
|
s1520454056@5121
|
27 |
public class CalcTreeCellEditor implements javax.swing.tree.TreeCellEditor {
|
s1520454056@5121
|
28 |
|
s1520454056@5121
|
29 |
protected ArrayList<CellEditorListener> listeners_;
|
s1520454056@5121
|
30 |
protected Worksheet worksheet_;
|
s1520454056@5121
|
31 |
|
s1520454056@5121
|
32 |
protected Object editedNode_;
|
s1520454056@5121
|
33 |
protected TreeCellRenderer renderer_;
|
s1520454056@5121
|
34 |
|
s1520454056@5121
|
35 |
protected IEditor editor_;
|
s1520454056@5121
|
36 |
protected JTextField tacticText_;
|
s1520454056@5121
|
37 |
|
s1520454056@5121
|
38 |
|
s1520454056@5121
|
39 |
protected JPanel editorPanel_;
|
s1520454056@5121
|
40 |
|
s1520454056@5121
|
41 |
private int subCell_;
|
s1520454056@5121
|
42 |
|
s1520454056@5121
|
43 |
public static final int SUBCELL_FORMULA = 1;
|
s1520454056@5121
|
44 |
public static final int SUBCELL_TACTIC = 2;
|
s1520454056@5121
|
45 |
|
s1520454056@5121
|
46 |
public CalcTreeCellEditor( TreeCellRenderer renderer, Worksheet ws ) {
|
s1520454056@5121
|
47 |
listeners_ = new ArrayList<CellEditorListener>();
|
s1520454056@5121
|
48 |
editedNode_ = null;
|
s1520454056@5121
|
49 |
subCell_ = 0;
|
s1520454056@5121
|
50 |
renderer_ = renderer;
|
s1520454056@5121
|
51 |
|
s1520454056@5121
|
52 |
editor_ = EditorFactory.getFormulaEditor();
|
s1520454056@5121
|
53 |
editor_.addEditorListener(new EditorListener() {
|
s1520454056@5121
|
54 |
|
s1520454056@5121
|
55 |
@Override
|
s1520454056@5121
|
56 |
public void notifyLocalCheck() {
|
s1520454056@5121
|
57 |
System.out.println("notifyLocalCheck");
|
s1520454056@5121
|
58 |
}
|
s1520454056@5121
|
59 |
|
s1520454056@5121
|
60 |
@Override
|
s1520454056@5121
|
61 |
public void notifyIsaCheck() {
|
s1520454056@5121
|
62 |
/*err*/ editedNode_ = new Formula(editor_.getMathText(), editor_.getFormula());
|
s1520454056@5121
|
63 |
notifyWorksheet();
|
s1520454056@5121
|
64 |
}
|
wneuper@5195
|
65 |
/*err*/public void notifyBraille(Ast.Ast formula) {
|
wneuper@5200
|
66 |
System.out.println("output to Braille display");
|
wneuper@5200
|
67 |
System.out.println(Ast.math_string_of(formula));
|
wneuper@5195
|
68 |
}
|
wneuper@5195
|
69 |
|
s1520454056@5121
|
70 |
});
|
s1520454056@5121
|
71 |
tacticText_ = new JTextField();
|
s1520454056@5121
|
72 |
|
s1520454056@5121
|
73 |
|
s1520454056@5121
|
74 |
editorPanel_ = new JPanel();
|
s1520454056@5121
|
75 |
|
s1520454056@5121
|
76 |
editorPanel_.setOpaque(true);
|
s1520454056@5121
|
77 |
editorPanel_.setBackground(UIManager.getColor("Tree.background"));
|
s1520454056@5121
|
78 |
|
s1520454056@5121
|
79 |
// GridBagLayout gbl = new GridBagLayout();
|
s1520454056@5121
|
80 |
editorPanel_.setLayout(new BorderLayout());
|
s1520454056@5121
|
81 |
|
s1520454056@5121
|
82 |
// GridBagConstraints gbc = new GridBagConstraints();
|
s1520454056@5121
|
83 |
// gbc.gridwidth = GridBagConstraints.REMAINDER;
|
s1520454056@5121
|
84 |
// gbc.fill = GridBagConstraints.BOTH;
|
s1520454056@5121
|
85 |
// gbc.weightx = 1.0;
|
s1520454056@5121
|
86 |
// gbc.weighty = 1.0;
|
s1520454056@5121
|
87 |
//
|
s1520454056@5121
|
88 |
// gbc.anchor = GridBagConstraints.WEST;
|
s1520454056@5121
|
89 |
|
s1520454056@5121
|
90 |
|
s1520454056@5121
|
91 |
|
s1520454056@5121
|
92 |
// gbl.setConstraints( ep, gbc );
|
s1520454056@5121
|
93 |
editorPanel_.add(editor_.getComponent(), BorderLayout.CENTER);
|
s1520454056@5121
|
94 |
|
s1520454056@5121
|
95 |
// gbc.anchor = GridBagConstraints.EAST;
|
s1520454056@5121
|
96 |
// gbc.insets = new Insets( 0, 30, 0, 0 );
|
s1520454056@5121
|
97 |
// gbl.setConstraints( tacticText_, gbc );
|
s1520454056@5121
|
98 |
editorPanel_.add(tacticText_, BorderLayout.SOUTH);
|
s1520454056@5121
|
99 |
|
s1520454056@5121
|
100 |
worksheet_ = ws;
|
s1520454056@5121
|
101 |
}
|
s1520454056@5121
|
102 |
|
s1520454056@5121
|
103 |
public void activateSubCell( int subcell ) {
|
s1520454056@5121
|
104 |
subCell_ = subcell;
|
s1520454056@5121
|
105 |
}
|
s1520454056@5121
|
106 |
|
s1520454056@5121
|
107 |
public int getSubCell() {
|
s1520454056@5121
|
108 |
return subCell_;
|
s1520454056@5121
|
109 |
}
|
s1520454056@5121
|
110 |
|
s1520454056@5121
|
111 |
public void addCellEditorListener(CellEditorListener listener) {
|
s1520454056@5121
|
112 |
if( !listeners_.contains( listener ) )
|
s1520454056@5121
|
113 |
listeners_.add( listener );
|
s1520454056@5121
|
114 |
System.out.println("### Listeners : " + listeners_.size() );
|
s1520454056@5121
|
115 |
Iterator<CellEditorListener> it = listeners_.iterator();
|
s1520454056@5121
|
116 |
while(it.hasNext())
|
s1520454056@5121
|
117 |
System.out.println( it.next().toString() );
|
s1520454056@5121
|
118 |
}
|
s1520454056@5121
|
119 |
|
s1520454056@5121
|
120 |
public void notifyWorksheet() {
|
s1520454056@5121
|
121 |
if( worksheet_ != null )
|
s1520454056@5121
|
122 |
worksheet_.editingStopped( new ChangeEvent( this ) );
|
s1520454056@5121
|
123 |
}
|
s1520454056@5121
|
124 |
|
s1520454056@5121
|
125 |
public Object getCellEditorValue() {
|
s1520454056@5121
|
126 |
return editedNode_;
|
s1520454056@5121
|
127 |
}
|
s1520454056@5121
|
128 |
|
s1520454056@5121
|
129 |
public boolean isCellEditable(EventObject e) {
|
s1520454056@5121
|
130 |
return true;
|
s1520454056@5121
|
131 |
}
|
s1520454056@5121
|
132 |
|
s1520454056@5121
|
133 |
public void removeCellEditorListener(CellEditorListener listener) {
|
s1520454056@5121
|
134 |
listeners_.remove( listener );
|
s1520454056@5121
|
135 |
}
|
s1520454056@5121
|
136 |
|
s1520454056@5121
|
137 |
public boolean shouldSelectCell(EventObject e) {
|
s1520454056@5121
|
138 |
return true;
|
s1520454056@5121
|
139 |
}
|
s1520454056@5121
|
140 |
|
s1520454056@5121
|
141 |
public boolean stopCellEditing() {
|
s1520454056@5121
|
142 |
for( int i = 0; i < listeners_.size(); i++ )
|
s1520454056@5121
|
143 |
((CellEditorListener)(listeners_.get(i))).editingStopped( new ChangeEvent( this ) );
|
s1520454056@5121
|
144 |
return true;
|
s1520454056@5121
|
145 |
}
|
s1520454056@5121
|
146 |
|
s1520454056@5121
|
147 |
public void cancelCellEditing() {
|
s1520454056@5121
|
148 |
for( int i = 0; i < listeners_.size(); i++ )
|
s1520454056@5121
|
149 |
((CellEditorListener)(listeners_.get(i))).editingCanceled( new ChangeEvent( this ) );
|
s1520454056@5121
|
150 |
}
|
s1520454056@5121
|
151 |
/**called by double-clicking TreeTextPanel (which includes formula and tactic textfield)*/
|
s1520454056@5121
|
152 |
@Override
|
s1520454056@5121
|
153 |
public Component getTreeCellEditorComponent(JTree tree, Object value,
|
s1520454056@5121
|
154 |
boolean isSelected, boolean expanded, boolean leaf, int row) {
|
s1520454056@5121
|
155 |
|
s1520454056@5121
|
156 |
|
s1520454056@5121
|
157 |
|
s1520454056@5121
|
158 |
if( !isSelected ) {
|
s1520454056@5121
|
159 |
return renderer_.getTreeCellRendererComponent(tree, value, true, expanded, leaf, row, true);
|
s1520454056@5121
|
160 |
}
|
s1520454056@5121
|
161 |
|
s1520454056@5121
|
162 |
editedNode_ = value;
|
s1520454056@5121
|
163 |
if( !(value instanceof CalcModelNode ) )
|
s1520454056@5121
|
164 |
return null;
|
s1520454056@5121
|
165 |
|
s1520454056@5121
|
166 |
CalcModelNode current_node = (CalcModelNode) value;
|
s1520454056@5121
|
167 |
|
s1520454056@5121
|
168 |
//
|
s1520454056@5121
|
169 |
if (editor_ instanceof JTextField) {
|
s1520454056@5121
|
170 |
editor_.setFormula( current_node.toString() );
|
s1520454056@5128
|
171 |
}else {
|
s1520454056@5128
|
172 |
|
s1520454056@5129
|
173 |
if (current_node.getFormula() == null) {
|
s1520454056@5129
|
174 |
// new Ast
|
s1520454056@5129
|
175 |
/*err*/editor_.setFormula(new Ast.Constant("GAP"));
|
s1520454056@5129
|
176 |
|
s1520454056@5129
|
177 |
}else {
|
s1520454056@5121
|
178 |
/*err*/editor_.setFormula(current_node.getFormula().getFormula().getTerm() );
|
s1520454056@5129
|
179 |
}
|
s1520454056@5129
|
180 |
|
s1520454056@5129
|
181 |
|
s1520454056@5121
|
182 |
}
|
s1520454056@5121
|
183 |
|
s1520454056@5121
|
184 |
|
s1520454056@5121
|
185 |
try {
|
s1520454056@5121
|
186 |
tacticText_.setText(((CalcModelNode)value).getSecondaryString() + " ");
|
s1520454056@5121
|
187 |
}
|
s1520454056@5121
|
188 |
catch (Exception e) {
|
s1520454056@5121
|
189 |
tacticText_.setText("");
|
s1520454056@5121
|
190 |
}
|
s1520454056@5121
|
191 |
|
s1520454056@5121
|
192 |
if( subCell_ == SUBCELL_TACTIC ) {
|
s1520454056@5121
|
193 |
if (editor_ instanceof JTextField) {
|
s1520454056@5121
|
194 |
((JTextField)editor_).setEditable( false );
|
s1520454056@5121
|
195 |
((JTextField)editor_).setEnabled( false );
|
s1520454056@5121
|
196 |
}
|
s1520454056@5121
|
197 |
|
s1520454056@5121
|
198 |
|
s1520454056@5121
|
199 |
|
s1520454056@5121
|
200 |
tacticText_.setBorder(new LineBorder( Color.BLACK ) );
|
s1520454056@5121
|
201 |
tacticText_.setEditable( true );
|
s1520454056@5121
|
202 |
tacticText_.setEnabled( true );
|
s1520454056@5121
|
203 |
tacticText_.requestFocusInWindow();
|
s1520454056@5121
|
204 |
}
|
s1520454056@5121
|
205 |
|
s1520454056@5121
|
206 |
if( subCell_ == SUBCELL_FORMULA ) {
|
s1520454056@5121
|
207 |
tacticText_.setEditable( false );
|
s1520454056@5121
|
208 |
tacticText_.setEnabled( false );
|
s1520454056@5121
|
209 |
if (editor_ instanceof JTextField) {
|
s1520454056@5121
|
210 |
((JTextField)editor_).setBorder(new LineBorder( Color.BLACK ) );
|
s1520454056@5121
|
211 |
((JTextField)editor_).setEditable( true );
|
s1520454056@5121
|
212 |
((JTextField)editor_).setEnabled( true );
|
s1520454056@5121
|
213 |
((JTextField)editor_).requestFocusInWindow();
|
s1520454056@5121
|
214 |
}
|
s1520454056@5121
|
215 |
}
|
s1520454056@5121
|
216 |
|
s1520454056@5121
|
217 |
editorPanel_.revalidate();
|
s1520454056@5121
|
218 |
editorPanel_.setBackground(Color.RED);
|
s1520454056@5121
|
219 |
Rectangle worksheet_rect = this.worksheet_.getBounds();
|
s1520454056@5121
|
220 |
editorPanel_.setPreferredSize(new Dimension(worksheet_rect.width - 50, editor_.getExpressionSize().height + 25));
|
s1520454056@5121
|
221 |
editorPanel_.revalidate();
|
s1520454056@5121
|
222 |
tree.revalidate();
|
s1520454056@5121
|
223 |
return editorPanel_;
|
s1520454056@5121
|
224 |
}
|
s1520454056@5121
|
225 |
|
s1520454056@5121
|
226 |
|
s1520454056@5121
|
227 |
|
s1520454056@5121
|
228 |
}
|