--- /dev/null
+/*******************************************************************************\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