]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.spreadsheet.ui/src/org/simantics/spreadsheet/ui/SpreadsheetTable.java
Adopt spreadsheet changes made in Balas development
[simantics/platform.git] / bundles / org.simantics.spreadsheet.ui / src / org / simantics / spreadsheet / ui / SpreadsheetTable.java
index e5b0e090160288567f2f11d1261ab166b394b554..96254ae63334cb4f4ea74b56d751201de0132756 100644 (file)
-/*******************************************************************************\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.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; 
+       }
+       
+}