]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.spreadsheet.ui/src/org/simantics/spreadsheet/ui/TextTableCellEditor.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.spreadsheet.ui / src / org / simantics / spreadsheet / ui / TextTableCellEditor.java
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
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.spreadsheet.ui;\r
13 \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
19 \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
25 \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
31 \r
32 class TextTableCellEditor extends DefaultCellEditor implements SpreadsheetCellEditor {\r
33 \r
34     final int row;\r
35     final int column;\r
36     final CellEditor<?> editor;\r
37     final String initial;\r
38     \r
39     private static final long serialVersionUID = 8039248821751464832L;\r
40 \r
41     JTextField ftf;\r
42     ClientModel clientModel;\r
43         \r
44     public TextTableCellEditor(final int row, final int column,final String initial, final CellEditor<?> editor, ClientModel clientModel) {\r
45         \r
46         super(new JTextField());\r
47         \r
48         assert(editor != null);\r
49 \r
50         this.row = row;\r
51         this.column = column;\r
52         this.initial = initial == null ? "" : initial;\r
53         this.editor = editor;\r
54         this.clientModel = clientModel;\r
55         \r
56         ftf = (JTextField)getComponent();\r
57 \r
58         ftf.setHorizontalAlignment(JTextField.TRAILING);\r
59         \r
60     }\r
61 \r
62     @Override\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
68                 switch (kc) {\r
69                 case KeyEvent.VK_ESCAPE:\r
70                     return false;\r
71                 case KeyEvent.VK_F2:\r
72                     return true;\r
73                 }\r
74                 if (ke.isActionKey())\r
75                     return false;\r
76             }\r
77             return true;\r
78         }\r
79         return false;\r
80     }\r
81 \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
86         JTextField ftf =\r
87             (JTextField)super.getTableCellEditorComponent(\r
88                 table, value, isSelected, row, column);\r
89         ftf.setText(initial);\r
90         ftf.selectAll();\r
91         ftf.setFont(ftf.getFont().deriveFont(AffineTransform.getScaleInstance(0.8, 0.8)));\r
92         return ftf;\r
93     }\r
94 \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
99     }\r
100 \r
101     /** \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
106      */\r
107     protected boolean userSaysRevert() {\r
108         Toolkit.getDefaultToolkit().beep();\r
109         ftf.selectAll();\r
110         Object[] options = {"Edit",\r
111                             "Revert"};\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
122             null,\r
123             options,\r
124             options[1]);\r
125             \r
126         if (answer == 1) { //Revert!\r
127             ftf.setText(ftf.getText());\r
128             return true;\r
129         }\r
130         return false;\r
131     }\r
132 \r
133     @Override\r
134     public void commit() {\r
135         \r
136         String str = (String)getCellEditorValue();\r
137 \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
144                         else\r
145                                 expression = "";\r
146                 } else {\r
147                         expression = "=" + expression;\r
148                 }        \r
149         if (expression.equals(str))\r
150                 return;\r
151         \r
152         if (str.startsWith("=")) {\r
153                         editor.edit(null, SpreadsheetUtils.cellName(row, column), ClientModel.CONTENT_EXPRESSION, str, Bindings.STRING, null);\r
154                 } else {\r
155                         editor.edit(null, SpreadsheetUtils.cellName(row, column), Variant.ofInstance(str), null);\r
156                 }\r
157         \r
158     }\r
159     \r
160 }\r