1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.spreadsheet.ui.test;
\r
13 import java.awt.BorderLayout;
\r
14 import java.awt.Component;
\r
15 import java.awt.Toolkit;
\r
16 import java.awt.datatransfer.Clipboard;
\r
17 import java.awt.datatransfer.DataFlavor;
\r
18 import java.awt.datatransfer.StringSelection;
\r
19 import java.awt.event.ActionEvent;
\r
20 import java.awt.event.ActionListener;
\r
21 import java.awt.event.KeyEvent;
\r
22 import java.awt.event.WindowAdapter;
\r
23 import java.awt.event.WindowEvent;
\r
24 import java.util.StringTokenizer;
\r
26 import javax.swing.AbstractListModel;
\r
27 import javax.swing.JComponent;
\r
28 import javax.swing.JFrame;
\r
29 import javax.swing.JLabel;
\r
30 import javax.swing.JList;
\r
31 import javax.swing.JOptionPane;
\r
32 import javax.swing.JScrollPane;
\r
33 import javax.swing.JTable;
\r
34 import javax.swing.KeyStroke;
\r
35 import javax.swing.ListCellRenderer;
\r
36 import javax.swing.ListModel;
\r
37 import javax.swing.UIManager;
\r
38 import javax.swing.event.TableModelEvent;
\r
39 import javax.swing.event.TableModelListener;
\r
40 import javax.swing.table.DefaultTableModel;
\r
41 import javax.swing.table.JTableHeader;
\r
44 * @version 1.0 11/09/98
\r
47 class RowHeaderRenderer extends JLabel implements ListCellRenderer {
\r
49 RowHeaderRenderer(JTable table) {
\r
50 JTableHeader header = table.getTableHeader();
\r
52 setBorder(UIManager.getBorder("TableHeader.cellBorder"));
\r
53 setHorizontalAlignment(CENTER);
\r
54 setForeground(header.getForeground());
\r
55 setBackground(header.getBackground());
\r
56 setFont(header.getFont());
\r
59 public Component getListCellRendererComponent(JList list, Object value,
\r
60 int index, boolean isSelected, boolean cellHasFocus) {
\r
61 setText((value == null) ? "" : value.toString());
\r
66 public class RowHeaderExample extends JFrame {
\r
68 public RowHeaderExample() {
\r
70 super("Row Header Example");
\r
73 ListModel lm = new AbstractListModel() {
\r
75 public int getSize() {
\r
79 public Object getElementAt(int index) {
\r
85 final DefaultTableModel dm = new DefaultTableModel(lm.getSize(), 500);
\r
86 for(int i=0;i<10;i++) {
\r
87 for(int j=0;j<10;j++) {
\r
88 dm.setValueAt(new Object () { private Integer i = new Integer((int)(20 *Math.random())); } , i, j);
\r
92 dm.addTableModelListener(new TableModelListener() {
\r
95 public void tableChanged(TableModelEvent e) {
\r
96 // System.out.println(e);
\r
97 // System.out.println(e.getColumn());
\r
98 // System.out.println(e.getFirstRow());
\r
99 // System.out.println(e.getLastRow());
\r
100 // System.out.println(e.getSource());
\r
101 // Object value = dm.getValueAt(e.getFirstRow(), e.getColumn());
\r
102 // System.out.println(value);
\r
103 // System.out.println(value.getClass());
\r
104 // Object value2 = dm.getValueAt(e.getFirstRow(), e.getColumn() + 1);
\r
105 // System.out.println(value2);
\r
106 // System.out.println(value2.getClass());
\r
111 JTable table = new JTable(dm);
\r
112 new ExcelAdapter(table);
\r
113 table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
\r
115 table.setColumnSelectionAllowed(true);
\r
116 table.addRowSelectionInterval(1, 3);
\r
117 table.addColumnSelectionInterval(1, 3);
\r
119 JList rowHeader = new JList(lm);
\r
120 rowHeader.setFixedCellWidth(50);
\r
122 rowHeader.setFixedCellHeight(table.getRowHeight() /*
\r
123 + table.getRowMargin() + table.getIntercellSpacing().height*/);
\r
125 rowHeader.setCellRenderer(new RowHeaderRenderer(table));
\r
127 JScrollPane scroll = new JScrollPane(table);
\r
128 scroll.setRowHeaderView(rowHeader);
\r
129 getContentPane().add(scroll, BorderLayout.CENTER);
\r
133 * ExcelAdapter enables Copy-Paste Clipboard functionality on JTables.
\r
134 * The clipboard data format used by the adapter is compatible with
\r
135 * the clipboard format used by Excel. This provides for clipboard
\r
136 * interoperability between enabled JTables and Excel.
\r
138 public class ExcelAdapter implements ActionListener
\r
140 private String rowstring,value;
\r
141 private Clipboard system;
\r
142 private StringSelection stsel;
\r
143 private JTable jTable1 ;
\r
145 * The Excel Adapter is constructed with a
\r
146 * JTable on which it enables Copy-Paste and acts
\r
147 * as a Clipboard listener.
\r
149 public ExcelAdapter(JTable myJTable)
\r
151 jTable1 = myJTable;
\r
152 KeyStroke copy = KeyStroke.getKeyStroke(KeyEvent.VK_C,ActionEvent.CTRL_MASK,false);
\r
153 // Identifying the copy KeyStroke user can modify this
\r
154 // to copy on some other Key combination.
\r
155 KeyStroke paste = KeyStroke.getKeyStroke(KeyEvent.VK_V,ActionEvent.CTRL_MASK,false);
\r
156 // Identifying the Paste KeyStroke user can modify this
\r
157 //to copy on some other Key combination.
\r
158 jTable1.registerKeyboardAction(this,"Copy",copy,JComponent.WHEN_FOCUSED);
\r
159 jTable1.registerKeyboardAction(this,"Paste",paste,JComponent.WHEN_FOCUSED);
\r
160 system = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
163 * Public Accessor methods for the Table on which this adapter acts.
\r
165 public JTable getJTable() {return jTable1;}
\r
166 public void setJTable(JTable jTable1) {this.jTable1=jTable1;}
\r
168 * This method is activated on the Keystrokes we are listening to
\r
169 * in this implementation. Here it listens for Copy and Paste ActionCommands.
\r
170 * Selections comprising non-adjacent cells result in invalid selection and
\r
171 * then copy action cannot be performed.
\r
172 * Paste is done by aligning the upper left corner of the selection with the
\r
173 * 1st element in the current selection of the JTable.
\r
175 public void actionPerformed(ActionEvent e)
\r
177 if (e.getActionCommand().compareTo("Copy")==0)
\r
179 StringBuffer sbf=new StringBuffer();
\r
180 // Check to ensure we have selected only a contiguous block of
\r
182 int numcols=jTable1.getSelectedColumnCount();
\r
183 int numrows=jTable1.getSelectedRowCount();
\r
184 int[] rowsselected=jTable1.getSelectedRows();
\r
185 int[] colsselected=jTable1.getSelectedColumns();
\r
186 if (!((numrows-1==rowsselected[rowsselected.length-1]-rowsselected[0] &&
\r
187 numrows==rowsselected.length) &&
\r
188 (numcols-1==colsselected[colsselected.length-1]-colsselected[0] &&
\r
189 numcols==colsselected.length)))
\r
191 JOptionPane.showMessageDialog(null, "Invalid Copy Selection",
\r
192 "Invalid Copy Selection",
\r
193 JOptionPane.ERROR_MESSAGE);
\r
196 for (int i=0;i<numrows;i++)
\r
198 for (int j=0;j<numcols;j++)
\r
200 sbf.append(jTable1.getValueAt(rowsselected[i],colsselected[j]));
\r
201 if (j<numcols-1) sbf.append("\t");
\r
205 stsel = new StringSelection(sbf.toString());
\r
206 system = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
207 system.setContents(stsel,stsel);
\r
209 if (e.getActionCommand().compareTo("Paste")==0)
\r
211 int startRow=(jTable1.getSelectedRows())[0];
\r
212 int startCol=(jTable1.getSelectedColumns())[0];
\r
215 String trstring= (String)(system.getContents(this).getTransferData(DataFlavor.stringFlavor));
\r
216 StringTokenizer st1=new StringTokenizer(trstring,"\n");
\r
217 for(int i=0;st1.hasMoreTokens();i++)
\r
219 rowstring=st1.nextToken();
\r
220 StringTokenizer st2=new StringTokenizer(rowstring,"\t");
\r
221 for(int j=0;st2.hasMoreTokens();j++)
\r
223 value=(String)st2.nextToken();
\r
224 if (startRow+i< jTable1.getRowCount() &&
\r
225 startCol+j< jTable1.getColumnCount())
\r
226 jTable1.setValueAt(value,startRow+i,startCol+j);
\r
230 catch(Exception ex){ex.printStackTrace();}
\r
236 public static void main(String[] args) {
\r
237 RowHeaderExample frame = new RowHeaderExample();
\r
238 frame.addWindowListener(new WindowAdapter() {
\r
239 public void windowClosing(WindowEvent e) {
\r
243 frame.setVisible(true);
\r