]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
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
8  *\r
9  * Contributors:\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
25 \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
42 \r
43 /**\r
44  * @version 1.0 11/09/98\r
45  */\r
46 \r
47 class RowHeaderRenderer extends JLabel implements ListCellRenderer {\r
48 \r
49         RowHeaderRenderer(JTable table) {\r
50                 JTableHeader header = table.getTableHeader();\r
51                 setOpaque(true);\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
57         }\r
58 \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
62                 return this;\r
63         }\r
64 }\r
65 \r
66 public class RowHeaderExample extends JFrame {\r
67 \r
68         public RowHeaderExample() {\r
69 \r
70                 super("Row Header Example");\r
71                 setSize(300, 150);\r
72 \r
73                 ListModel lm = new AbstractListModel() {\r
74 \r
75                         public int getSize() {\r
76                                 return 500;\r
77                         }\r
78 \r
79                         public Object getElementAt(int index) {\r
80                                 return "" + index;\r
81                         }\r
82 \r
83                 };\r
84 \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
89                         }\r
90                 }\r
91 \r
92                 dm.addTableModelListener(new TableModelListener() {\r
93 \r
94                         @Override\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
107                         }\r
108 \r
109                 });\r
110 \r
111                 JTable table = new JTable(dm);\r
112                 new ExcelAdapter(table);\r
113                 table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);\r
114 \r
115                 table.setColumnSelectionAllowed(true);\r
116                 table.addRowSelectionInterval(1, 3);\r
117                 table.addColumnSelectionInterval(1, 3);\r
118 \r
119                 JList rowHeader = new JList(lm);\r
120                 rowHeader.setFixedCellWidth(50);\r
121 \r
122                 rowHeader.setFixedCellHeight(table.getRowHeight() /*\r
123         + table.getRowMargin() + table.getIntercellSpacing().height*/);\r
124 \r
125                 rowHeader.setCellRenderer(new RowHeaderRenderer(table));\r
126 \r
127                 JScrollPane scroll = new JScrollPane(table);\r
128                 scroll.setRowHeaderView(rowHeader);\r
129                 getContentPane().add(scroll, BorderLayout.CENTER);\r
130         }\r
131 \r
132         /**\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
137          */\r
138         public class ExcelAdapter implements ActionListener\r
139         {\r
140                 private String rowstring,value;\r
141                 private Clipboard system;\r
142                 private StringSelection stsel;\r
143                 private JTable jTable1 ;\r
144                 /**\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
148                  */\r
149                 public ExcelAdapter(JTable myJTable)\r
150                 {\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
161                 }\r
162                 /**\r
163                  * Public Accessor methods for the Table on which this adapter acts.\r
164                  */\r
165                 public JTable getJTable() {return jTable1;}\r
166                 public void setJTable(JTable jTable1) {this.jTable1=jTable1;}\r
167                 /**\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
174                  */\r
175                 public void actionPerformed(ActionEvent e)\r
176                 {\r
177                         if (e.getActionCommand().compareTo("Copy")==0)\r
178                         {\r
179                                 StringBuffer sbf=new StringBuffer();\r
180                                 // Check to ensure we have selected only a contiguous block of\r
181                                 // cells\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
190                                 {\r
191                                         JOptionPane.showMessageDialog(null, "Invalid Copy Selection",\r
192                                                         "Invalid Copy Selection",\r
193                                                         JOptionPane.ERROR_MESSAGE);\r
194                                         return;\r
195                                 }\r
196                                 for (int i=0;i<numrows;i++)\r
197                                 {\r
198                                         for (int j=0;j<numcols;j++)\r
199                                         {\r
200                                                 sbf.append(jTable1.getValueAt(rowsselected[i],colsselected[j]));\r
201                                                 if (j<numcols-1) sbf.append("\t");\r
202                                         }\r
203                                         sbf.append("\n");\r
204                                 }\r
205                                 stsel  = new StringSelection(sbf.toString());\r
206                                 system = Toolkit.getDefaultToolkit().getSystemClipboard();\r
207                                 system.setContents(stsel,stsel);\r
208                         }\r
209                         if (e.getActionCommand().compareTo("Paste")==0)\r
210                         {\r
211                                 int startRow=(jTable1.getSelectedRows())[0];\r
212                                 int startCol=(jTable1.getSelectedColumns())[0];\r
213                                 try\r
214                                 {\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
218                                         {\r
219                                                 rowstring=st1.nextToken();\r
220                                                 StringTokenizer st2=new StringTokenizer(rowstring,"\t");\r
221                                                 for(int j=0;st2.hasMoreTokens();j++)\r
222                                                 {\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
227                                                 }\r
228                                         }\r
229                                 }\r
230                                 catch(Exception ex){ex.printStackTrace();}\r
231                         }\r
232                 }\r
233         }\r
234 \r
235 \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
240                                 System.exit(0);\r
241                         }\r
242                 });\r
243                 frame.setVisible(true);\r
244         }\r
245 }