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