-/*******************************************************************************\r
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
- * in Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.spreadsheet.ui;\r
-\r
-import java.awt.Component;\r
-import java.awt.Toolkit;\r
-import java.awt.event.KeyEvent;\r
-import java.awt.geom.AffineTransform;\r
-import java.util.EventObject;\r
-\r
-import javax.swing.DefaultCellEditor;\r
-import javax.swing.JOptionPane;\r
-import javax.swing.JTable;\r
-import javax.swing.JTextField;\r
-import javax.swing.SwingUtilities;\r
-\r
-import org.simantics.databoard.Bindings;\r
-import org.simantics.databoard.binding.mutable.Variant;\r
-import org.simantics.spreadsheet.CellEditor;\r
-import org.simantics.spreadsheet.ClientModel;\r
-import org.simantics.spreadsheet.util.SpreadsheetUtils;\r
-\r
-class TextTableCellEditor extends DefaultCellEditor implements SpreadsheetCellEditor {\r
-\r
- final int row;\r
- final int column;\r
- final CellEditor<?> editor;\r
- final String initial;\r
- \r
- private static final long serialVersionUID = 8039248821751464832L;\r
-\r
- JTextField ftf;\r
- ClientModel clientModel;\r
- \r
- public TextTableCellEditor(final int row, final int column,final String initial, final CellEditor<?> editor, ClientModel clientModel) {\r
- \r
- super(new JTextField());\r
- \r
- assert(editor != null);\r
-\r
- this.row = row;\r
- this.column = column;\r
- this.initial = initial == null ? "" : initial;\r
- this.editor = editor;\r
- this.clientModel = clientModel;\r
- \r
- ftf = (JTextField)getComponent();\r
-\r
- ftf.setHorizontalAlignment(JTextField.TRAILING);\r
- \r
- }\r
-\r
- @Override\r
- public boolean isCellEditable(EventObject event) {\r
- if (super.isCellEditable(event)) {\r
- if (event instanceof KeyEvent) {\r
- KeyEvent ke = (KeyEvent) event;\r
- int kc = ke.getKeyCode();\r
- switch (kc) {\r
- case KeyEvent.VK_ESCAPE:\r
- return false;\r
- case KeyEvent.VK_F2:\r
- return true;\r
- }\r
- if (ke.isActionKey())\r
- return false;\r
- }\r
- return true;\r
- }\r
- return false;\r
- }\r
-\r
- //Override to invoke setValue on the formatted text field.\r
- public Component getTableCellEditorComponent(JTable table,\r
- Object value, boolean isSelected,\r
- int row, int column) {\r
- JTextField ftf =\r
- (JTextField)super.getTableCellEditorComponent(\r
- table, value, isSelected, row, column);\r
- ftf.setText(initial);\r
- ftf.selectAll();\r
- ftf.setFont(ftf.getFont().deriveFont(AffineTransform.getScaleInstance(0.8, 0.8)));\r
- return ftf;\r
- }\r
-\r
- //Override to ensure that the value remains an Integer.\r
- public Object getCellEditorValue() {\r
- JTextField ftf = (JTextField)getComponent();\r
- return ftf.getText();\r
- }\r
-\r
- /** \r
- * Lets the user know that the text they entered is \r
- * bad. Returns true if the user elects to revert to\r
- * the last good value. Otherwise, returns false, \r
- * indicating that the user wants to continue editing.\r
- */\r
- protected boolean userSaysRevert() {\r
- Toolkit.getDefaultToolkit().beep();\r
- ftf.selectAll();\r
- Object[] options = {"Edit",\r
- "Revert"};\r
- int answer = JOptionPane.showOptionDialog(\r
- SwingUtilities.getWindowAncestor(ftf),\r
- "The value must be an integer between "\r
-// + minimum + " and "\r
-// + maximum + ".\n"\r
- + "You can either continue editing "\r
- + "or revert to the last valid value.",\r
- "Invalid Text Entered",\r
- JOptionPane.YES_NO_OPTION,\r
- JOptionPane.ERROR_MESSAGE,\r
- null,\r
- options,\r
- options[1]);\r
- \r
- if (answer == 1) { //Revert!\r
- ftf.setText(ftf.getText());\r
- return true;\r
- }\r
- return false;\r
- }\r
-\r
- @Override\r
- public void commit() {\r
- \r
- String str = (String)getCellEditorValue();\r
-\r
- String cellName = SpreadsheetUtils.cellName(row, column);\r
- String expression = clientModel.getPossiblePropertyAt(cellName, ClientModel.CONTENT_EXPRESSION);\r
- if(expression == null) {\r
- Variant content = SpreadsheetUtils.getSafeClientVariant(clientModel, cellName, ClientModel.CONTENT);\r
- if(content != null)\r
- expression = content.getValue().toString();\r
- else\r
- expression = "";\r
- } else {\r
- expression = "=" + expression;\r
- } \r
- if (expression.equals(str))\r
- return;\r
- \r
- if (str.startsWith("=")) {\r
- editor.edit(null, SpreadsheetUtils.cellName(row, column), ClientModel.CONTENT_EXPRESSION, str, Bindings.STRING, null);\r
- } else {\r
- editor.edit(null, SpreadsheetUtils.cellName(row, column), Variant.ofInstance(str), null);\r
- }\r
- \r
- }\r
- \r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+package org.simantics.spreadsheet.ui;
+
+import java.awt.Component;
+import java.awt.Toolkit;
+import java.awt.event.KeyEvent;
+import java.awt.geom.AffineTransform;
+import java.util.EventObject;
+
+import javax.swing.DefaultCellEditor;
+import javax.swing.JOptionPane;
+import javax.swing.JTable;
+import javax.swing.JTextField;
+import javax.swing.SwingUtilities;
+
+import org.simantics.databoard.Bindings;
+import org.simantics.databoard.binding.mutable.Variant;
+import org.simantics.spreadsheet.CellEditor;
+import org.simantics.spreadsheet.ClientModel;
+import org.simantics.spreadsheet.util.SpreadsheetUtils;
+
+class TextTableCellEditor extends DefaultCellEditor implements SpreadsheetCellEditor {
+
+ final int row;
+ final int column;
+ final CellEditor<?> editor;
+ final String initial;
+
+ private static final long serialVersionUID = 8039248821751464832L;
+
+ JTextField ftf;
+ ClientModel clientModel;
+
+ public TextTableCellEditor(final int row, final int column,final String initial, final CellEditor<?> editor, ClientModel clientModel) {
+
+ super(new JTextField());
+
+ assert(editor != null);
+
+ this.row = row;
+ this.column = column;
+ this.initial = initial == null ? "" : initial;
+ this.editor = editor;
+ this.clientModel = clientModel;
+
+ ftf = (JTextField)getComponent();
+
+ ftf.setHorizontalAlignment(JTextField.TRAILING);
+
+ }
+
+ @Override
+ public boolean isCellEditable(EventObject event) {
+ if (super.isCellEditable(event)) {
+ if (event instanceof KeyEvent) {
+ KeyEvent ke = (KeyEvent) event;
+ int kc = ke.getKeyCode();
+ switch (kc) {
+ case KeyEvent.VK_ESCAPE:
+ return false;
+ case KeyEvent.VK_F2:
+ return true;
+ }
+ if (ke.isActionKey())
+ return false;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ //Override to invoke setValue on the formatted text field.
+ public Component getTableCellEditorComponent(JTable table,
+ Object value, boolean isSelected,
+ int row, int column) {
+ JTextField ftf =
+ (JTextField)super.getTableCellEditorComponent(
+ table, value, isSelected, row, column);
+ ftf.setText(initial);
+ ftf.selectAll();
+ ftf.setFont(ftf.getFont().deriveFont(AffineTransform.getScaleInstance(0.8, 0.8)));
+ return ftf;
+ }
+
+ //Override to ensure that the value remains an Integer.
+ public Object getCellEditorValue() {
+ JTextField ftf = (JTextField)getComponent();
+ return ftf.getText();
+ }
+
+ /**
+ * Lets the user know that the text they entered is
+ * bad. Returns true if the user elects to revert to
+ * the last good value. Otherwise, returns false,
+ * indicating that the user wants to continue editing.
+ */
+ protected boolean userSaysRevert() {
+ Toolkit.getDefaultToolkit().beep();
+ ftf.selectAll();
+ Object[] options = {"Edit",
+ "Revert"};
+ int answer = JOptionPane.showOptionDialog(
+ SwingUtilities.getWindowAncestor(ftf),
+ "The value must be an integer between "
+// + minimum + " and "
+// + maximum + ".\n"
+ + "You can either continue editing "
+ + "or revert to the last valid value.",
+ "Invalid Text Entered",
+ JOptionPane.YES_NO_OPTION,
+ JOptionPane.ERROR_MESSAGE,
+ null,
+ options,
+ options[1]);
+
+ if (answer == 1) { //Revert!
+ ftf.setText(ftf.getText());
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void commit() {
+
+ String str = (String)getCellEditorValue();
+
+ String cellName = SpreadsheetUtils.cellName(row, column);
+ Object expressionO = clientModel.getPossiblePropertyAt(cellName, ClientModel.CONTENT_EXPRESSION);
+ String expression = null;
+ if(expressionO instanceof String) {
+ expression = (String)expressionO;
+ } else if(expressionO instanceof Variant) {
+ expression = ((Variant)expressionO).getValue().toString();
+ }
+
+ if(expression == null) {
+ Variant content = SpreadsheetUtils.getSafeClientVariant(clientModel, cellName, ClientModel.CONTENT);
+ if(content != null)
+ expression = content.getValue().toString();
+ else
+ expression = "";
+ } else {
+ expression = "=" + expression;
+ }
+ //Don't update if the expression hasn't changed
+ if (expression.equals(str))
+ return;
+
+ if (str.startsWith("=")) {
+ editor.edit(null, SpreadsheetUtils.cellName(row, column), ClientModel.CONTENT_EXPRESSION, str, Bindings.STRING, null);
+ //Update cell expression
+ clientModel.setProperty(cellName, ClientModel.CONTENT_EXPRESSION, str);
+ } else {
+ editor.edit(null, SpreadsheetUtils.cellName(row, column), Variant.ofInstance(str), null);
+ //Update cell expression
+ clientModel.setProperty(cellName, ClientModel.CONTENT_EXPRESSION, null); //If not an expression, then the expression property is null
+ }
+
+ }
+
+}