-/*******************************************************************************\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.Font;\r
-import java.awt.Point;\r
-import java.awt.Rectangle;\r
-import java.awt.event.KeyEvent;\r
-import java.util.Arrays;\r
-\r
-import javax.swing.DefaultListModel;\r
-import javax.swing.JList;\r
-import javax.swing.KeyStroke;\r
-import javax.swing.event.ChangeEvent;\r
-import javax.swing.event.ListSelectionEvent;\r
-import javax.swing.table.TableCellEditor;\r
-import javax.swing.table.TableColumn;\r
-import javax.swing.table.TableColumnModel;\r
-\r
-import org.simantics.scenegraph.INode;\r
-import org.simantics.scenegraph.swing.JTableSG;\r
-import org.simantics.spreadsheet.CellEditor;\r
-import org.simantics.spreadsheet.ClientModel;\r
-import org.simantics.spreadsheet.ClientModel.OperationMode;\r
-\r
-public class SpreadsheetTable extends JTableSG {\r
- \r
- public static final String uiClassID = "SpreadsheetTableUI"; \r
- \r
- final private CellEditor cellEditor;\r
- private ClientModel clientModel;\r
- private final DefaultListModel rowModel;\r
- private final JList rowHeader;\r
- \r
- private static final long serialVersionUID = -4592686559195294773L;\r
-\r
- @Override\r
- public int getRowHeight() {\r
- Font font = getFont();\r
- if(font != null) {\r
- return font.getSize() + 4;\r
- } else {\r
- return super.getRowHeight();\r
- }\r
- }\r
- \r
- \r
- public SpreadsheetTable(final INode node, final CellEditor cellEditor, final ClientModel clientModel, final DefaultListModel rowModel) {\r
-\r
- super(new ClientTableModel(clientModel), node);\r
- \r
- this.rowHeader = null;\r
- this.cellEditor = cellEditor;\r
- this.clientModel = clientModel;\r
- this.rowModel = rowModel;\r
- \r
-// ((ClientTableModel)getModel()).setTable(this);\r
-// \r
-// InputMap im = this.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);\r
-// Action deleteAction = new AbstractAction() {\r
-// public void actionPerformed(ActionEvent ae) {\r
-// System.out.println("deleteaction");\r
-// RemoveCellHandler removeHandler = serverInterface.getAdapter(RemoveCellHandler.class);\r
-// int[] rowSelection = getSelectedRows();\r
-// int[] columnSelection = getSelectedColumns();\r
-// for (int i = 0; i < columnSelection.length; i++) {\r
-// for (int j = 0; j < rowSelection.length; j++) {\r
-// int row = rowSelection[j];\r
-// int column = columnSelection[i];\r
-// System.out.println("deleteaction " + row + " " + column);\r
-// Object cell = getValueAt(row, column);\r
-//// RemoveHandler remove = cell.getAdapter(RemoveHandler.class);\r
-//// remove.handle();\r
-// }\r
-// }\r
-// }\r
-// };\r
-// KeyStroke delete = KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0);\r
-// im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), delete);\r
-// getActionMap().put(im.get(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0)), deleteAction);\r
- \r
- setDefaultRenderer(Object.class, new Renderer());\r
- \r
- setShowGrid(false);\r
- setRowMargin(0);\r
- \r
- }\r
-\r
- public SpreadsheetTable(final INode node, final CellEditor cellEditor, final ClientModel clientModel, final DefaultListModel rowModel, JList rowHeader) {\r
-\r
- super(new ClientTableModel(clientModel), node);\r
- \r
- this.rowHeader = rowHeader;\r
- this.cellEditor = cellEditor;\r
- this.clientModel = clientModel;\r
- this.rowModel = rowModel;\r
- setDefaultRenderer(Object.class, new Renderer());\r
- \r
- setShowGrid(false);\r
- setRowMargin(0);\r
- \r
- }\r
- \r
- @Override\r
- public Rectangle getCellRect(int row, int column, boolean includeSpacing) {\r
- if (clientModel != null) {\r
- Rectangle span = clientModel.getSpan(row, column);\r
- if (span != null) {\r
- Rectangle rect1 = super.getCellRect(span.y, span.x, includeSpacing);\r
- Rectangle rect2 = super.getCellRect(span.y + span.height - 1, span.x + span.width - 1, includeSpacing);\r
- return rect1.union(rect2);\r
- }\r
- }\r
- return super.getCellRect(row, column, includeSpacing);\r
- }\r
-\r
- @Override\r
- public String getUIClassID() {\r
- return uiClassID;\r
- } \r
- \r
- @Override \r
- public int rowAtPoint(Point p) {\r
- int row = super.rowAtPoint(p);\r
- if (row == -1) {\r
- return -1;\r
- }\r
- int column = super.columnAtPoint(p);\r
- Rectangle span = clientModel.getSpan(row, column);\r
- if (span != null) {\r
- return span.y;\r
- } else {\r
- return row;\r
- }\r
- }\r
- \r
- @Override\r
- public int columnAtPoint(Point p) {\r
- int column = super.columnAtPoint(p);\r
- if (column == -1) {\r
- return -1;\r
- }\r
- int row = super.rowAtPoint(p);\r
- Rectangle span = clientModel.getSpan(row, column);\r
- if (span != null) {\r
- return span.x;\r
- } else {\r
- return column;\r
- }\r
- }\r
-\r
- @Override\r
- public void valueChanged(ListSelectionEvent e) {\r
- super.valueChanged(e);\r
- repaint();\r
- }\r
-\r
- @Override\r
- public void columnSelectionChanged(ListSelectionEvent e) {\r
- super.columnSelectionChanged(e);\r
- repaint();\r
- }\r
-\r
- \r
- public ClientModel getClientModel() {\r
- return clientModel;\r
- }\r
-\r
- // wrapper function for SpreadsheetTableUI\r
- protected int rowAtPointWithoutSpan(Point p) {\r
- return super.rowAtPoint(p);\r
- } \r
-\r
- // wrapper function for SpreadsheetTableUI \r
- protected int columnAtPointWithoutSpan(Point p) {\r
- return super.columnAtPoint(p);\r
- } \r
- \r
- @Override\r
- protected boolean processKeyBinding(KeyStroke ks, KeyEvent e, int condition, boolean pressed) {\r
- // turn off edit but still can cause actions\r
- if (e.getKeyCode()==KeyEvent.VK_DELETE) {\r
- //System.out.println("processKeyBinding delete");\r
- this.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE);\r
- boolean retvalue = super.processKeyBinding(ks, e, condition, pressed);\r
- this.putClientProperty("JTable.autoStartsEdit", Boolean.TRUE);\r
- return retvalue;\r
- }\r
- boolean retValue = super.processKeyBinding(ks, e, condition, pressed);\r
- return retValue;\r
- }\r
- \r
- @Override\r
- public TableCellEditor getCellEditor(int row, int column) {\r
- \r
-// CellEditor editor = serverInterface.getAdapter(CellEditor.class);\r
- if(cellEditor == null) return null;\r
- \r
- boolean editable = false;\r
- OperationMode mode = clientModel.getPropertyAt(ClientModel.MODE, ClientModel.MODE_CURRENT);\r
- if (!OperationMode.OPERATION.equals(mode))\r
- editable = true;\r
- \r
- \r
- CellValue cellValue = (CellValue)getValueAt(row, column);\r
- editable = cellValue.editable;\r
- if (editable) {\r
- String initial = ((CellValue)getValueAt(row, column)).label;\r
- return new TextTableCellEditor(row, column, initial, cellEditor, clientModel);\r
- } else {\r
- return null;\r
- }\r
- \r
- }\r
- \r
- @Override\r
- public void editingStopped(ChangeEvent e) {\r
- // Take in the new value\r
- SpreadsheetCellEditor editor = (SpreadsheetCellEditor)getCellEditor();\r
- if (editor != null) {\r
- int[] rc = getSelectedRows();\r
- editor.commit();\r
- removeEditor();\r
- if(rc.length == 1 && rc[0] < getRowCount() - 1)\r
- setRowSelectionInterval(rc[0]+1, rc[0]+1);\r
- }\r
- }\r
-\r
- public void applyRowLabels(String[] rowLabels) {\r
- \r
- if(Spreadsheet.DEBUG) System.out.println("Apply row labels: " + Arrays.toString(rowLabels));\r
- \r
- rowModel.ensureCapacity(rowLabels.length);\r
- int i=0;\r
- for(;i<rowLabels.length && i<rowModel.size();i++) {\r
- rowModel.setElementAt(rowLabels[i], i);\r
- }\r
- for(;i<rowLabels.length;i++) {\r
- rowModel.addElement(rowLabels[i]);\r
- }\r
- \r
- }\r
-\r
- public void applyHeaderSizes(ClientModel clientModel) {\r
- \r
- // TODO: initialization haxx\r
- if(clientModel == null) return;\r
- \r
- int[] rows = clientModel.getPropertyAt(ClientModel.HEADERS, ClientModel.HEADERS_ROW_HEIGHTS);\r
- int[] cols = clientModel.getPropertyAt(ClientModel.HEADERS, ClientModel.HEADERS_COL_WIDTHS);\r
- \r
- for(int i = 0; i < getColumnModel().getColumnCount() && i < cols.length ; i++) { \r
- TableColumn column = getColumnModel().getColumn(i);\r
- int preferred = cols[i];\r
- if(preferred > 0)\r
- column.setPreferredWidth(preferred); \r
- }\r
-\r
- if(rowHeader!=null)\r
- rowHeader.setCellRenderer(new RowHeaderRenderer(this));\r
- \r
- for(int i = 0; i<getRowCount() && i<rows.length ;i++) {\r
- if (rows[i] > 0) {\r
- setRowHeight(i, rows[i]);\r
- }\r
- }\r
- }\r
- \r
- @Override\r
- public void createDefaultColumnsFromModel() {\r
- super.createDefaultColumnsFromModel();\r
- applyHeaderSizes(clientModel);\r
- }\r
- \r
- @Override\r
- protected TableColumnModel createDefaultColumnModel() {\r
- TableColumnModel model = super.createDefaultColumnModel();\r
- model.setColumnMargin(0);\r
- return model; \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.Font;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.KeyEvent;
+import java.util.Arrays;
+
+import javax.swing.DefaultListModel;
+import javax.swing.JList;
+import javax.swing.KeyStroke;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.table.TableCellEditor;
+import javax.swing.table.TableColumn;
+import javax.swing.table.TableColumnModel;
+
+import org.simantics.scenegraph.INode;
+import org.simantics.scenegraph.swing.JTableSG;
+import org.simantics.spreadsheet.CellEditor;
+import org.simantics.spreadsheet.ClientModel;
+import org.simantics.spreadsheet.ClientModel.OperationMode;
+
+public class SpreadsheetTable extends JTableSG {
+
+ public static final String uiClassID = "SpreadsheetTableUI";
+
+ final private CellEditor cellEditor;
+ private ClientModel clientModel;
+ private final DefaultListModel rowModel;
+ private final JList rowHeader;
+
+ private static final long serialVersionUID = -4592686559195294773L;
+
+ @Override
+ public int getRowHeight() {
+ Font font = getFont();
+ if(font != null) {
+ return font.getSize() + 4;
+ } else {
+ return super.getRowHeight();
+ }
+ }
+
+
+ public SpreadsheetTable(final INode node, final CellEditor cellEditor, final ClientModel clientModel, final DefaultListModel rowModel) {
+
+ super(new ClientTableModel(clientModel), node);
+
+ this.rowHeader = null;
+ this.cellEditor = cellEditor;
+ this.clientModel = clientModel;
+ this.rowModel = rowModel;
+
+// ((ClientTableModel)getModel()).setTable(this);
+//
+// InputMap im = this.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
+// Action deleteAction = new AbstractAction() {
+// public void actionPerformed(ActionEvent ae) {
+// System.out.println("deleteaction");
+// RemoveCellHandler removeHandler = serverInterface.getAdapter(RemoveCellHandler.class);
+// int[] rowSelection = getSelectedRows();
+// int[] columnSelection = getSelectedColumns();
+// for (int i = 0; i < columnSelection.length; i++) {
+// for (int j = 0; j < rowSelection.length; j++) {
+// int row = rowSelection[j];
+// int column = columnSelection[i];
+// System.out.println("deleteaction " + row + " " + column);
+// Object cell = getValueAt(row, column);
+//// RemoveHandler remove = cell.getAdapter(RemoveHandler.class);
+//// remove.handle();
+// }
+// }
+// }
+// };
+// KeyStroke delete = KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0);
+// im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), delete);
+// getActionMap().put(im.get(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0)), deleteAction);
+
+ setDefaultRenderer(Object.class, new Renderer());
+
+ setShowGrid(false);
+ setRowMargin(0);
+
+ }
+
+ public SpreadsheetTable(final INode node, final CellEditor cellEditor, final ClientModel clientModel, final DefaultListModel rowModel, JList rowHeader) {
+
+ super(new ClientTableModel(clientModel), node);
+
+ this.rowHeader = rowHeader;
+ this.cellEditor = cellEditor;
+ this.clientModel = clientModel;
+ this.rowModel = rowModel;
+ setDefaultRenderer(Object.class, new Renderer());
+
+ setShowGrid(false);
+ setRowMargin(0);
+
+ }
+
+ @Override
+ public Rectangle getCellRect(int row, int column, boolean includeSpacing) {
+ if (clientModel != null) {
+ Rectangle span = clientModel.getSpan(row, column);
+ if (span != null) {
+ Rectangle rect1 = super.getCellRect(span.y, span.x, includeSpacing);
+ Rectangle rect2 = super.getCellRect(span.y + span.height - 1, span.x + span.width - 1, includeSpacing);
+ return rect1.union(rect2);
+ }
+ }
+ return super.getCellRect(row, column, includeSpacing);
+ }
+
+ @Override
+ public String getUIClassID() {
+ return uiClassID;
+ }
+
+ @Override
+ public int rowAtPoint(Point p) {
+ int row = super.rowAtPoint(p);
+ if (row == -1) {
+ return -1;
+ }
+ int column = super.columnAtPoint(p);
+ Rectangle span = clientModel.getSpan(row, column);
+ if (span != null) {
+ return span.y;
+ } else {
+ return row;
+ }
+ }
+
+ @Override
+ public int columnAtPoint(Point p) {
+ int column = super.columnAtPoint(p);
+ if (column == -1) {
+ return -1;
+ }
+ int row = super.rowAtPoint(p);
+ Rectangle span = clientModel.getSpan(row, column);
+ if (span != null) {
+ return span.x;
+ } else {
+ return column;
+ }
+ }
+
+ @Override
+ public void valueChanged(ListSelectionEvent e) {
+ super.valueChanged(e);
+ repaint();
+ }
+
+ @Override
+ public void columnSelectionChanged(ListSelectionEvent e) {
+ super.columnSelectionChanged(e);
+ repaint();
+ }
+
+
+ public ClientModel getClientModel() {
+ return clientModel;
+ }
+
+ // wrapper function for SpreadsheetTableUI
+ protected int rowAtPointWithoutSpan(Point p) {
+ return super.rowAtPoint(p);
+ }
+
+ // wrapper function for SpreadsheetTableUI
+ protected int columnAtPointWithoutSpan(Point p) {
+ return super.columnAtPoint(p);
+ }
+
+ @Override
+ protected boolean processKeyBinding(KeyStroke ks, KeyEvent e, int condition, boolean pressed) {
+ // turn off edit but still can cause actions
+ if (e.getKeyCode()==KeyEvent.VK_DELETE) {
+ //System.out.println("processKeyBinding delete");
+ this.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE);
+ boolean retvalue = super.processKeyBinding(ks, e, condition, pressed);
+ this.putClientProperty("JTable.autoStartsEdit", Boolean.TRUE);
+ return retvalue;
+ }
+ boolean retValue = super.processKeyBinding(ks, e, condition, pressed);
+ return retValue;
+ }
+
+ @Override
+ public TableCellEditor getCellEditor(int row, int column) {
+
+// CellEditor editor = serverInterface.getAdapter(CellEditor.class);
+ if(cellEditor == null) return null;
+
+ boolean editable = false;
+ OperationMode mode = clientModel.getPropertyAt(ClientModel.MODE, ClientModel.MODE_CURRENT);
+ if (!OperationMode.OPERATION.equals(mode))
+ editable = true;
+
+
+ CellValue cellValue = (CellValue)getValueAt(row, column);
+ editable = cellValue.editable;
+ if (editable) {
+ String initial = ((CellValue)getValueAt(row, column)).label;
+ return new TextTableCellEditor(row, column, initial, cellEditor, clientModel);
+ } else {
+ return null;
+ }
+
+ }
+
+ @Override
+ public void editingStopped(ChangeEvent e) {
+ // Take in the new value
+ SpreadsheetCellEditor editor = (SpreadsheetCellEditor)getCellEditor();
+ if (editor != null) {
+ int[] rc = getSelectedRows();
+ editor.commit();
+ removeEditor();
+ if(rc.length == 1 && rc[0] < getRowCount() - 1)
+ setRowSelectionInterval(rc[0]+1, rc[0]+1);
+ }
+ }
+
+ public void applyRowLabels(String[] rowLabels) {
+
+ if(Spreadsheet.DEBUG) System.out.println("Apply row labels: " + Arrays.toString(rowLabels));
+
+ rowModel.ensureCapacity(rowLabels.length);
+ int i=0;
+ for(;i<rowLabels.length && i<rowModel.size();i++) {
+ rowModel.setElementAt(rowLabels[i], i);
+ }
+ for(;i<rowLabels.length;i++) {
+ rowModel.addElement(rowLabels[i]);
+ }
+
+ }
+
+ public void applyHeaderSizes(ClientModel clientModel) {
+
+ // TODO: initialization haxx
+ if(clientModel == null) return;
+
+ int[] rows = clientModel.getPropertyAt(ClientModel.HEADERS, ClientModel.HEADERS_ROW_HEIGHTS);
+ int[] cols = clientModel.getPropertyAt(ClientModel.HEADERS, ClientModel.HEADERS_COL_WIDTHS);
+
+ for(int i = 0; i < getColumnModel().getColumnCount() && i < cols.length ; i++) {
+ TableColumn column = getColumnModel().getColumn(i);
+ int preferred = cols[i];
+ if(preferred > 0)
+ column.setPreferredWidth(preferred);
+ }
+
+ if(rowHeader!=null)
+ rowHeader.setCellRenderer(new RowHeaderRenderer(this));
+
+ for(int i = 0; i<getRowCount() && i<rows.length ;i++) {
+ if (rows[i] > 0) {
+ setRowHeight(i, rows[i]);
+ }
+ }
+ }
+
+ @Override
+ public void createDefaultColumnsFromModel() {
+ super.createDefaultColumnsFromModel();
+ applyHeaderSizes(clientModel);
+ }
+
+ @Override
+ protected TableColumnModel createDefaultColumnModel() {
+ TableColumnModel model = super.createDefaultColumnModel();
+ model.setColumnMargin(0);
+ return model;
+ }
+
+}