isac-java/src/java/isac/gui/treetable/CalcTreeCellEditor.java
author Walther Neuper <wneuper@ist.tugraz.at>
Thu, 07 Sep 2017 09:21:29 +0200
changeset 5200 80152e6a6702
parent 5198 00b2583bba9e
child 5224 3de25c2fe154
permissions -rw-r--r--
restore broken merge from 3799cb07f123
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
}