1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.spreadsheet.ui;
\r
14 import java.awt.Component;
\r
15 import java.awt.Toolkit;
\r
16 import java.awt.event.KeyEvent;
\r
17 import java.awt.geom.AffineTransform;
\r
18 import java.util.EventObject;
\r
20 import javax.swing.DefaultCellEditor;
\r
21 import javax.swing.JOptionPane;
\r
22 import javax.swing.JTable;
\r
23 import javax.swing.JTextField;
\r
24 import javax.swing.SwingUtilities;
\r
26 import org.simantics.databoard.Bindings;
\r
27 import org.simantics.databoard.binding.mutable.Variant;
\r
28 import org.simantics.spreadsheet.CellEditor;
\r
29 import org.simantics.spreadsheet.ClientModel;
\r
30 import org.simantics.spreadsheet.util.SpreadsheetUtils;
\r
32 class TextTableCellEditor extends DefaultCellEditor implements SpreadsheetCellEditor {
\r
36 final CellEditor<?> editor;
\r
37 final String initial;
\r
39 private static final long serialVersionUID = 8039248821751464832L;
\r
42 ClientModel clientModel;
\r
44 public TextTableCellEditor(final int row, final int column,final String initial, final CellEditor<?> editor, ClientModel clientModel) {
\r
46 super(new JTextField());
\r
48 assert(editor != null);
\r
51 this.column = column;
\r
52 this.initial = initial == null ? "" : initial;
\r
53 this.editor = editor;
\r
54 this.clientModel = clientModel;
\r
56 ftf = (JTextField)getComponent();
\r
58 ftf.setHorizontalAlignment(JTextField.TRAILING);
\r
63 public boolean isCellEditable(EventObject event) {
\r
64 if (super.isCellEditable(event)) {
\r
65 if (event instanceof KeyEvent) {
\r
66 KeyEvent ke = (KeyEvent) event;
\r
67 int kc = ke.getKeyCode();
\r
69 case KeyEvent.VK_ESCAPE:
\r
71 case KeyEvent.VK_F2:
\r
74 if (ke.isActionKey())
\r
82 //Override to invoke setValue on the formatted text field.
\r
83 public Component getTableCellEditorComponent(JTable table,
\r
84 Object value, boolean isSelected,
\r
85 int row, int column) {
\r
87 (JTextField)super.getTableCellEditorComponent(
\r
88 table, value, isSelected, row, column);
\r
89 ftf.setText(initial);
\r
91 ftf.setFont(ftf.getFont().deriveFont(AffineTransform.getScaleInstance(0.8, 0.8)));
\r
95 //Override to ensure that the value remains an Integer.
\r
96 public Object getCellEditorValue() {
\r
97 JTextField ftf = (JTextField)getComponent();
\r
98 return ftf.getText();
\r
102 * Lets the user know that the text they entered is
\r
103 * bad. Returns true if the user elects to revert to
\r
104 * the last good value. Otherwise, returns false,
\r
105 * indicating that the user wants to continue editing.
\r
107 protected boolean userSaysRevert() {
\r
108 Toolkit.getDefaultToolkit().beep();
\r
110 Object[] options = {"Edit",
\r
112 int answer = JOptionPane.showOptionDialog(
\r
113 SwingUtilities.getWindowAncestor(ftf),
\r
114 "The value must be an integer between "
\r
115 // + minimum + " and "
\r
116 // + maximum + ".\n"
\r
117 + "You can either continue editing "
\r
118 + "or revert to the last valid value.",
\r
119 "Invalid Text Entered",
\r
120 JOptionPane.YES_NO_OPTION,
\r
121 JOptionPane.ERROR_MESSAGE,
\r
126 if (answer == 1) { //Revert!
\r
127 ftf.setText(ftf.getText());
\r
134 public void commit() {
\r
136 String str = (String)getCellEditorValue();
\r
138 String cellName = SpreadsheetUtils.cellName(row, column);
\r
139 String expression = clientModel.getPossiblePropertyAt(cellName, ClientModel.CONTENT_EXPRESSION);
\r
140 if(expression == null) {
\r
141 Variant content = SpreadsheetUtils.getSafeClientVariant(clientModel, cellName, ClientModel.CONTENT);
\r
142 if(content != null)
\r
143 expression = content.getValue().toString();
\r
147 expression = "=" + expression;
\r
149 if (expression.equals(str))
\r
152 if (str.startsWith("=")) {
\r
153 editor.edit(null, SpreadsheetUtils.cellName(row, column), ClientModel.CONTENT_EXPRESSION, str, Bindings.STRING, null);
\r
155 editor.edit(null, SpreadsheetUtils.cellName(row, column), Variant.ofInstance(str), null);
\r