]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.spreadsheet.ui/src/org/simantics/spreadsheet/ui/test/RowHeaderExample.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.spreadsheet.ui / src / org / simantics / spreadsheet / ui / test / RowHeaderExample.java
diff --git a/bundles/org.simantics.spreadsheet.ui/src/org/simantics/spreadsheet/ui/test/RowHeaderExample.java b/bundles/org.simantics.spreadsheet.ui/src/org/simantics/spreadsheet/ui/test/RowHeaderExample.java
new file mode 100644 (file)
index 0000000..b014dfe
--- /dev/null
@@ -0,0 +1,245 @@
+/*******************************************************************************\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.test;\r
+import java.awt.BorderLayout;\r
+import java.awt.Component;\r
+import java.awt.Toolkit;\r
+import java.awt.datatransfer.Clipboard;\r
+import java.awt.datatransfer.DataFlavor;\r
+import java.awt.datatransfer.StringSelection;\r
+import java.awt.event.ActionEvent;\r
+import java.awt.event.ActionListener;\r
+import java.awt.event.KeyEvent;\r
+import java.awt.event.WindowAdapter;\r
+import java.awt.event.WindowEvent;\r
+import java.util.StringTokenizer;\r
+\r
+import javax.swing.AbstractListModel;\r
+import javax.swing.JComponent;\r
+import javax.swing.JFrame;\r
+import javax.swing.JLabel;\r
+import javax.swing.JList;\r
+import javax.swing.JOptionPane;\r
+import javax.swing.JScrollPane;\r
+import javax.swing.JTable;\r
+import javax.swing.KeyStroke;\r
+import javax.swing.ListCellRenderer;\r
+import javax.swing.ListModel;\r
+import javax.swing.UIManager;\r
+import javax.swing.event.TableModelEvent;\r
+import javax.swing.event.TableModelListener;\r
+import javax.swing.table.DefaultTableModel;\r
+import javax.swing.table.JTableHeader;\r
+\r
+/**\r
+ * @version 1.0 11/09/98\r
+ */\r
+\r
+class RowHeaderRenderer extends JLabel implements ListCellRenderer {\r
+\r
+       RowHeaderRenderer(JTable table) {\r
+               JTableHeader header = table.getTableHeader();\r
+               setOpaque(true);\r
+               setBorder(UIManager.getBorder("TableHeader.cellBorder"));\r
+               setHorizontalAlignment(CENTER);\r
+               setForeground(header.getForeground());\r
+               setBackground(header.getBackground());\r
+               setFont(header.getFont());\r
+       }\r
+\r
+       public Component getListCellRendererComponent(JList list, Object value,\r
+                       int index, boolean isSelected, boolean cellHasFocus) {\r
+               setText((value == null) ? "" : value.toString());\r
+               return this;\r
+       }\r
+}\r
+\r
+public class RowHeaderExample extends JFrame {\r
+\r
+       public RowHeaderExample() {\r
+\r
+               super("Row Header Example");\r
+               setSize(300, 150);\r
+\r
+               ListModel lm = new AbstractListModel() {\r
+\r
+                       public int getSize() {\r
+                               return 500;\r
+                       }\r
+\r
+                       public Object getElementAt(int index) {\r
+                               return "" + index;\r
+                       }\r
+\r
+               };\r
+\r
+               final DefaultTableModel dm = new DefaultTableModel(lm.getSize(), 500);\r
+               for(int i=0;i<10;i++) {\r
+                       for(int j=0;j<10;j++) {\r
+                               dm.setValueAt(new Object () { private Integer i = new Integer((int)(20 *Math.random())); } , i, j);\r
+                       }\r
+               }\r
+\r
+               dm.addTableModelListener(new TableModelListener() {\r
+\r
+                       @Override\r
+                       public void tableChanged(TableModelEvent e) {\r
+//                             System.out.println(e);\r
+//                             System.out.println(e.getColumn());\r
+//                             System.out.println(e.getFirstRow());\r
+//                             System.out.println(e.getLastRow());\r
+//                             System.out.println(e.getSource());\r
+//                             Object value = dm.getValueAt(e.getFirstRow(), e.getColumn());\r
+//                             System.out.println(value);\r
+//                             System.out.println(value.getClass());\r
+//                             Object value2 = dm.getValueAt(e.getFirstRow(), e.getColumn() + 1);\r
+//                             System.out.println(value2);\r
+//                             System.out.println(value2.getClass());\r
+                       }\r
+\r
+               });\r
+\r
+               JTable table = new JTable(dm);\r
+               new ExcelAdapter(table);\r
+               table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);\r
+\r
+               table.setColumnSelectionAllowed(true);\r
+               table.addRowSelectionInterval(1, 3);\r
+               table.addColumnSelectionInterval(1, 3);\r
+\r
+               JList rowHeader = new JList(lm);\r
+               rowHeader.setFixedCellWidth(50);\r
+\r
+               rowHeader.setFixedCellHeight(table.getRowHeight() /*\r
+        + table.getRowMargin() + table.getIntercellSpacing().height*/);\r
+\r
+               rowHeader.setCellRenderer(new RowHeaderRenderer(table));\r
+\r
+               JScrollPane scroll = new JScrollPane(table);\r
+               scroll.setRowHeaderView(rowHeader);\r
+               getContentPane().add(scroll, BorderLayout.CENTER);\r
+       }\r
+\r
+       /**\r
+        * ExcelAdapter enables Copy-Paste Clipboard functionality on JTables.\r
+        * The clipboard data format used by the adapter is compatible with\r
+        * the clipboard format used by Excel. This provides for clipboard\r
+        * interoperability between enabled JTables and Excel.\r
+        */\r
+       public class ExcelAdapter implements ActionListener\r
+       {\r
+               private String rowstring,value;\r
+               private Clipboard system;\r
+               private StringSelection stsel;\r
+               private JTable jTable1 ;\r
+               /**\r
+                * The Excel Adapter is constructed with a\r
+                * JTable on which it enables Copy-Paste and acts\r
+                * as a Clipboard listener.\r
+                */\r
+               public ExcelAdapter(JTable myJTable)\r
+               {\r
+                       jTable1 = myJTable;\r
+                       KeyStroke copy = KeyStroke.getKeyStroke(KeyEvent.VK_C,ActionEvent.CTRL_MASK,false);\r
+                       // Identifying the copy KeyStroke user can modify this\r
+                       // to copy on some other Key combination.\r
+                       KeyStroke paste = KeyStroke.getKeyStroke(KeyEvent.VK_V,ActionEvent.CTRL_MASK,false);\r
+                       // Identifying the Paste KeyStroke user can modify this\r
+                       //to copy on some other Key combination.\r
+                       jTable1.registerKeyboardAction(this,"Copy",copy,JComponent.WHEN_FOCUSED);\r
+                       jTable1.registerKeyboardAction(this,"Paste",paste,JComponent.WHEN_FOCUSED);\r
+                       system = Toolkit.getDefaultToolkit().getSystemClipboard();\r
+               }\r
+               /**\r
+                * Public Accessor methods for the Table on which this adapter acts.\r
+                */\r
+               public JTable getJTable() {return jTable1;}\r
+               public void setJTable(JTable jTable1) {this.jTable1=jTable1;}\r
+               /**\r
+                * This method is activated on the Keystrokes we are listening to\r
+                * in this implementation. Here it listens for Copy and Paste ActionCommands.\r
+                * Selections comprising non-adjacent cells result in invalid selection and\r
+                * then copy action cannot be performed.\r
+                * Paste is done by aligning the upper left corner of the selection with the\r
+                * 1st element in the current selection of the JTable.\r
+                */\r
+               public void actionPerformed(ActionEvent e)\r
+               {\r
+                       if (e.getActionCommand().compareTo("Copy")==0)\r
+                       {\r
+                               StringBuffer sbf=new StringBuffer();\r
+                               // Check to ensure we have selected only a contiguous block of\r
+                               // cells\r
+                               int numcols=jTable1.getSelectedColumnCount();\r
+                               int numrows=jTable1.getSelectedRowCount();\r
+                               int[] rowsselected=jTable1.getSelectedRows();\r
+                               int[] colsselected=jTable1.getSelectedColumns();\r
+                               if (!((numrows-1==rowsselected[rowsselected.length-1]-rowsselected[0] &&\r
+                                               numrows==rowsselected.length) &&\r
+                                               (numcols-1==colsselected[colsselected.length-1]-colsselected[0] &&\r
+                                                               numcols==colsselected.length)))\r
+                               {\r
+                                       JOptionPane.showMessageDialog(null, "Invalid Copy Selection",\r
+                                                       "Invalid Copy Selection",\r
+                                                       JOptionPane.ERROR_MESSAGE);\r
+                                       return;\r
+                               }\r
+                               for (int i=0;i<numrows;i++)\r
+                               {\r
+                                       for (int j=0;j<numcols;j++)\r
+                                       {\r
+                                               sbf.append(jTable1.getValueAt(rowsselected[i],colsselected[j]));\r
+                                               if (j<numcols-1) sbf.append("\t");\r
+                                       }\r
+                                       sbf.append("\n");\r
+                               }\r
+                               stsel  = new StringSelection(sbf.toString());\r
+                               system = Toolkit.getDefaultToolkit().getSystemClipboard();\r
+                               system.setContents(stsel,stsel);\r
+                       }\r
+                       if (e.getActionCommand().compareTo("Paste")==0)\r
+                       {\r
+                               int startRow=(jTable1.getSelectedRows())[0];\r
+                               int startCol=(jTable1.getSelectedColumns())[0];\r
+                               try\r
+                               {\r
+                                       String trstring= (String)(system.getContents(this).getTransferData(DataFlavor.stringFlavor));\r
+                                       StringTokenizer st1=new StringTokenizer(trstring,"\n");\r
+                                       for(int i=0;st1.hasMoreTokens();i++)\r
+                                       {\r
+                                               rowstring=st1.nextToken();\r
+                                               StringTokenizer st2=new StringTokenizer(rowstring,"\t");\r
+                                               for(int j=0;st2.hasMoreTokens();j++)\r
+                                               {\r
+                                                       value=(String)st2.nextToken();\r
+                                                       if (startRow+i< jTable1.getRowCount()  &&\r
+                                                                       startCol+j< jTable1.getColumnCount())\r
+                                                               jTable1.setValueAt(value,startRow+i,startCol+j);\r
+                                               }\r
+                                       }\r
+                               }\r
+                               catch(Exception ex){ex.printStackTrace();}\r
+                       }\r
+               }\r
+       }\r
+\r
+\r
+       public static void main(String[] args) {\r
+               RowHeaderExample frame = new RowHeaderExample();\r
+               frame.addWindowListener(new WindowAdapter() {\r
+                       public void windowClosing(WindowEvent e) {\r
+                               System.exit(0);\r
+                       }\r
+               });\r
+               frame.setVisible(true);\r
+       }\r
+}
\ No newline at end of file