1 package org.simantics.spreadsheet.ui;
3 import javax.swing.JTable;
4 import javax.swing.JTextField;
5 import javax.swing.event.ListSelectionEvent;
6 import javax.swing.event.ListSelectionListener;
8 import org.eclipse.jface.viewers.StructuredSelection;
9 import org.eclipse.swt.widgets.Display;
10 import org.simantics.databoard.binding.mutable.Variant;
11 import org.simantics.db.layer0.variable.Variable;
12 import org.simantics.spreadsheet.Adaptable;
13 import org.simantics.spreadsheet.ClientModel;
14 import org.simantics.spreadsheet.Spreadsheets;
15 import org.simantics.spreadsheet.util.SpreadsheetUtils;
16 import org.simantics.ui.selection.VariableWorkbenchSelectionElement;
17 import org.simantics.utils.ui.jface.ActiveSelectionProvider;
19 public class SelectionListener implements ListSelectionListener {
22 final JTextField expression;
23 final ExpressionTextListener etl;
24 final ActiveSelectionProvider selectionProvider;
25 final Adaptable serverModel;
26 final ClientModel clientModel;
28 // It is necessary to keep the table since it is not possible
29 // to determine the table from the event's source
30 SelectionListener(JTable table, JTextField expression, ExpressionTextListener etl, ActiveSelectionProvider selectionProvider, Adaptable serverModel, ClientModel clientModel) {
31 assert(table != null);
32 assert(selectionProvider != null);
34 this.expression = expression;
36 this.selectionProvider = selectionProvider;
37 this.serverModel = serverModel;
38 this.clientModel = clientModel;
41 public void valueChanged(ListSelectionEvent e) {
43 final int[] selectedColumns = table.getSelectedColumns();
44 final int[] selectedRows = table.getSelectedRows();
46 if(selectedColumns.length == 1 && selectedRows.length == 1) {
48 final TableSelection tableSelection = new TableSelection() {
51 public int[] getColumns() {
52 return selectedColumns;
56 public int[] getRows() {
62 final Variable sheet = serverModel.getAdapter(Variable.class);
64 final Object cell = table.getValueAt(selectedRows[0], selectedColumns[0]);
67 String expression = "";
69 Object expressionO = clientModel.getPossiblePropertyAt(Spreadsheets.cellName(selectedRows[0], selectedColumns[0]), ClientModel.CONTENT_EXPRESSION);
70 if(expressionO instanceof String) {
71 expression = (String)expressionO;
72 } else if(expressionO instanceof Variant) {
73 expression = ((Variant)expressionO).toString();
76 if(expression == null) {
77 Variant content = SpreadsheetUtils.getSafeClientVariant(clientModel, Spreadsheets.cellName(selectedRows[0], selectedColumns[0]), ClientModel.CONTENT);
79 expression = content.getValue().toString();
83 expression = "=" + expression;
85 if (this.etl != null) {
86 if(expression != null) {
87 SelectionListener.this.etl.setCell(expression, selectedRows[0], selectedColumns[0]);
89 SelectionListener.this.etl.setCell("", -1, -1);
93 Display.getDefault().asyncExec(new Runnable() {
98 selectionProvider.setSelection(new StructuredSelection(new VariableWorkbenchSelectionElement(sheet)));
100 selectionProvider.setSelection(new StructuredSelection(new Object[] { cell, "", tableSelection}));
107 Display.getDefault().asyncExec(new Runnable() {
112 if(selectionProvider == null) return;
115 selectionProvider.setSelection(new StructuredSelection(new Object[] { sheet, "", tableSelection}));
117 selectionProvider.setSelection(new StructuredSelection(new Object[] { "", "", tableSelection}));
127 if (e.getValueIsAdjusting()) {
128 // The mouse button has not yet been released