1 package edu.psu.geovista.app.spreadsheet;
2
3 /*
4 * Description:
5 * Date: Feb 9, 2003
6 * Time: 12:09:50 PM
7 * @author Jin Chen
8 */
9
10
11
12 import javax.swing.*;
13 import javax.swing.event.TableModelEvent;
14 import javax.swing.event.ChangeEvent;
15 import javax.swing.event.ChangeListener;
16 import javax.swing.table.*;
17 import java.awt.*;
18 import java.awt.event.WindowEvent;
19 import java.awt.event.WindowAdapter;
20 import java.awt.event.ActionEvent;
21 import java.awt.event.ActionListener;
22 import java.util.*;
23 import java.net.URL;
24
25 import edu.psu.geovista.app.spreadsheet.formula.*;
26 import edu.psu.geovista.app.spreadsheet.tools.*;
27 import edu.psu.geovista.app.spreadsheet.table.SSTableModel;
28 import edu.psu.geovista.app.spreadsheet.table.SSTable;
29 import edu.psu.geovista.app.spreadsheet.util.ColumnSelector;
30 import edu.psu.geovista.app.spreadsheet.util.Debug;
31 import edu.psu.geovista.ui.event.DataSetEvent;
32 import edu.psu.geovista.ui.event.SelectionListener;
33 import edu.psu.geovista.ui.event.DataSetListener;
34 import edu.psu.geovista.ui.event.SelectionEvent;
35 import edu.psu.geovista.data.geog.DataSetForApps;
36
37 public class SpreadSheetBean extends JPanel
38 implements java.io.Serializable,ChangeListener,
39 SelectionListener, DataSetListener{
40 public static final boolean DEBUG=false;
41 static final long serialVersionUID = 2262286688943155764L;
42 //static final long serialVersionUID = -60211928319749278L;
43 // static final long serialVersionUID =-1249714123591458746L;
44 private transient SSTable table; //
45 private transient boolean scffo=false; //selection change fired from outsite(beans);
46
47 public SpreadSheetBean() {
48
49 this.setLayout(new BorderLayout());
50
51 table=new SSTable( new SSTableModel());
52 table.setBean(this);
53
54 table.reSetRowHeader() ;
55
56 // support select column, row
57 table.getTableHeader().setReorderingAllowed(false);
58 ColumnSelector selector=new ColumnSelector(table);
59 table.getTableHeader().addMouseListener(selector);
60 table.addMouseMotionListener(selector) ;
61
62 table.setColumnSelectionAllowed(true);
63 table.setRowSelectionAllowed(true);
64 table.setCellSelectionEnabled(true);
65 ListSelectionModel lsm=table.getSelectionModel();
66 lsm.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION );
67 //support select column
68
69 table.setAutoCreateColumnsFromModel(false); //If true, any change to Model => recreation of ColumnModel
70 table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF );
71 FormulaEditor fe=new FormulaEditor(table);
72 table.setFormulaEditor(fe);
73 table.setDefaultEditor(Cell.class, new CellFomulaEditor(new JTextField(),fe));
74
75 // set initial column set value->
76 if (Debug.isDebug() ){
77 int len=10;
78 Float[] values=new Float[len];
79 for(int i=0;i<len;i++){
80 Float v=new Float(i+1);
81 values[i]=v;
82 for (int j=1;j<5;j++){
83 table.setValueAt(v,i,j) ;
84 }
85 }
86 }
87 //set value<-
88 table.reSetColumnHeader() ;
89 ToolManager tb=new ToolManager(table);
90
91
92 JPanel controlP=new JPanel();
93 controlP.setLayout(new BorderLayout());
94 controlP.add(tb.getToolBar(),BorderLayout.CENTER ) ;
95 controlP.add(fe,BorderLayout.SOUTH ) ;
96 this.add(controlP, BorderLayout.NORTH );
97 this.add(new JScrollPane(table), BorderLayout.CENTER);
98
99
100 }
101 /*
102 private DefaultTableModel getTableModel(){
103 SSTableModel sstbm=(SSTableModel) SSTableModel.getInstance() ;
104 return sstbm;
105 } */
106 /*********************************************************************
107 * Bean property
108 ********************************************************************/
109 public void dataSetChanged(DataSetEvent e){
110 this.setData(e.getDataSet());
111 }
112 public void selectionChanged(SelectionEvent e){
113 this.setSelectedIndex(e.getSelection());
114 }
115 public void stateChanged(ChangeEvent e) {
116 if(this.scffo ){
117 //Not fire the event if the selection is made by outside(other beans)
118 this.scffo =false;
119
120
121 }
122 else{
123 //fire selection event only when the selection is made internally by bean itself
124 int[] sel = table.getSelectedRows();
125 this.fireSelectionChanged(sel);
126 }
127
128 }
129
130 /***
131 * Notify all listeners that have registered interest for
132 * notification on this event type. The event instance
133 * is lazily created using the parameters passed into
134 * the fire method.
135 * @see EventListenerList
136 */
137 private void fireSelectionChanged (int[] newSelection) {
138
139 // Guaranteed to return a non-null array
140 Object[] listeners = listenerList.getListenerList();
141 SelectionEvent e = null;
142 // Process the listeners last to first, notifying
143 // those that are interested in this event
144 for (int i = listeners.length - 2; i >= 0; i -= 2) {
145 if (listeners[i] == SelectionListener.class) {
146 // Lazily create the event:
147 if (e == null) {
148 e = new SelectionEvent(this, newSelection);
149 }
150 ((SelectionListener)listeners[i + 1]).selectionChanged(e);
151 }
152 }//next i
153
154 }
155 /***
156 * adds an SelectionListener
157 */
158 public void addSelectionListener (SelectionListener l) {
159 listenerList.add(SelectionListener.class, l);
160 }
161 /***
162 * removes an SelectionListener from the component
163 */
164 public void removeSelectionListener (SelectionListener l) {
165 listenerList.remove(SelectionListener.class, l);
166
167 }
168 /*********************************************************************
169 * GeoVista Function/interface
170 ********************************************************************/
171 /*for use with coordinator
172 */
173 public void setData(Object[] data) {
174
175 //Object[] attributeNames = (Object[])data[0];
176 /*Vector names = new Vector();
177
178 for (int i = 0; i < attributeNames.length; i++){
179 names.add(attributeNames[i]);
180 }*/
181
182
183 DataSetForApps dataSet = new DataSetForApps();
184 dataSet.setDataObject(data);
185 String[] attributeNames = dataSet.getAttributeNamesOriginal();
186 Object[] allData = dataSet.getDataSetFull();
187 int numObs = dataSet.getNumObservations();
188 Object[][] tablesData = new Object[numObs][attributeNames.length];
189
190 double[] doubleData = null;
191 int[] intData = null;
192 String[] stringData = null;
193 boolean[] boolData = null;
194
195 for (int column = 0; column < attributeNames.length; column++) {
196 //Object datum = data[column+1];
197 Object datum = data[column+1];
198 if (datum instanceof double[]) {
199 doubleData = (double[])datum;
200 for (int row = 0; row < numObs; row++) {
201 double dat = doubleData[row];
202 Double d = new Double(dat);
203 tablesData[row][column] = d;
204 }
205 }
206
207 if (datum instanceof int[]) {
208 intData = (int[])datum;
209 for (int row = 0; row < numObs; row++) {
210 int dat = intData[row];
211 Integer d = new Integer(dat);
212 tablesData[row][column] = d;
213 }
214 }
215
216 if (datum instanceof String[]) {
217
218 stringData = (String[])datum;
219 for (int row = 0; row < numObs; row++) {
220 String dat = stringData[row];
221 tablesData[row][column] = dat;
222 }
223 }
224
225 if (datum instanceof boolean[]) {
226 boolData = (boolean[])datum;
227 for (int row = 0; row < numObs; row++) {
228 boolean dat = boolData[row];
229 Boolean d = new Boolean(dat);
230 tablesData[row][column] = d;
231 }
232 }
233
234
235 }
236
237 this.setData(tablesData,attributeNames);
238
239 }
240
241 public void setData(Vector data,Vector columnIdentifiers)
242 {
243 // Insert rowIndex column
244 Iterator Iter =data.iterator();
245 while(Iter.hasNext()){
246 Object o= Iter.next();
247 if (o!=null &&o instanceof Vector ){
248 Vector v=(Vector)o;
249 Debug.println("v count->:"+v.size());
250 v.insertElementAt(null,0);
251 Debug.println("v count<-:"+v.size());
252
253 }
254 }
255 // Insert rowIndex column<-
256 Debug.println("columnIdentifiers count<-:"+columnIdentifiers.size());
257 columnIdentifiers.insertElementAt("Row Index",0); //Not insert null, super.getColumnName(0) will return 0. It will affect SSTableModel.getColumnName()
258 Debug.println("columnIdentifiers count<-:"+columnIdentifiers.size());
259 SSTableModel tbm=(SSTableModel)table.getModel();
260 tbm.setDataVector(data,columnIdentifiers);
261 //tbm.setDataVector(data,new Vector());
262 }
263 public void setData(Object[][] dataVector,Object[] columnIdentifiers)
264 {
265
266 //SSTableModel tbm=(SSTableModel)table.getModel();
267 setData(convertToVector(dataVector), convertToVector(columnIdentifiers));
268 //tbm.setDataVector(dataVector,columnIdentifiers);
269 //getTableInstance().tableChanged(new TableModelEvent(tbm, TableModelEvent.HEADER_ROW));
270
271 }
272 /***
273 * Returns a vector that contains the same objects as the array.
274 * @param anArray the array to be converted
275 * @return the new vector; if <code>anArray</code> is <code>null</code>,
276 * returns <code>null</code>
277 */
278 protected static Vector convertToVector(Object[] anArray) {
279 if (anArray == null) {
280 return null;
281 }
282 Vector v = new Vector(anArray.length);
283 for (int i=0; i < anArray.length; i++) {
284 v.addElement(anArray[i]);
285 }
286 return v;
287 }
288
289 /***
290 * Returns a vector of vectors that contains the same objects as the array.
291 * @param anArray the double array to be converted
292 * @return the new vector of vectors; if <code>anArray</code> is
293 * <code>null</code>, returns <code>null</code>
294 */
295 protected static Vector convertToVector(Object[][] anArray) {
296 if (anArray == null) {
297 return null;
298 }
299 Vector v = new Vector(anArray.length);
300 for (int i=0; i < anArray.length; i++) {
301 v.addElement(convertToVector(anArray[i]));
302 }
303 return v;
304 }
305 public void setSelectedIndex(int[] selectedRows)
306 { long start,stop; //put is at start of method
307 if(DEBUG){//put is at start of method
308 start=Calendar.getInstance().getTime().getTime() ;
309 }
310 //table.setSelectionMode(2);
311 if (selectedRows == null){
312 return;
313 }
314 int len = selectedRows.length;
315 if(len>0){
316 this.setScffo(true);//selection event is fired by other beans from outside
317 table.setSelectedRow(selectedRows[0]); //To clear previously selection
318 for (int i = 1 ; i<len ; i++){
319 this.setScffo(true);//selection event is fired by other beans from outside
320 table.addSelectedRow(selectedRows[i]) ;
321 }
322
323 //table.repaint() ;
324
325 }
326 else{
327 //dp{
328 if (DEBUG){
329 System.out.println("setSelectedIndex() get empty array");
330 }//dp}
331 }
332
333 if(DEBUG){ //put is at end of method
334 stop=Calendar.getInstance().getTime().getTime() ;
335 System.out.println(" setSelectedIndex() take "+(stop-start)*0.001f+" to finish" );
336 }
337 }
338
339 private void setScffo(boolean scffo) {
340 this.scffo = scffo;
341 }
342
343 /*********************************************************************
344 * Test
345 ********************************************************************/
346 public static void main(String args[]) {
347 JFrame mf=new JFrame ();
348 mf.getRootPane().getContentPane().add( new SpreadSheetBean() ) ;
349 GJApp.launch(mf, "A Simple Model",100,100,800,600);
350 }
351
352
353
354
355 }
356
357 /********************** For testing purpse ***************************/
358 class GJApp extends WindowAdapter {
359 static private JPanel statusArea = new JPanel();
360 static private JLabel status = new JLabel(" ");
361 static private ResourceBundle resources;
362
363 public static void launch(final JFrame f, String title,
364 final int x, final int y,
365 final int w, int h) {
366 launch(f,title,x,y,w,h,null);
367 }
368 public static void launch(final JFrame f, String title,
369 final int x, final int y,
370 final int w, int h,
371 String propertiesFilename) {
372 f.setTitle(title);
373 f.setBounds(x,y,w,h);
374 f.setVisible(true);
375
376 statusArea.setBorder(BorderFactory.createEtchedBorder());
377 statusArea.setLayout(new FlowLayout(FlowLayout.LEFT,0,0));
378 statusArea.add(status);
379 status.setHorizontalAlignment(JLabel.LEFT);
380
381 f.setDefaultCloseOperation(
382 WindowConstants.DISPOSE_ON_CLOSE);
383
384 if(propertiesFilename != null) {
385 resources = ResourceBundle.getBundle(
386 propertiesFilename, Locale.getDefault());
387 }
388
389 f.addWindowListener(new WindowAdapter() {
390 public void windowClosed(WindowEvent e) {
391 System.exit(0);
392 }
393 });
394 }
395 static public JPanel getStatusArea() {
396 return statusArea;
397 }
398 static public void showStatus(String s) {
399 status.setText(s);
400 }
401 static Object getResource(String key) {
402 if(resources != null) {
403 return resources.getString(key);
404 }
405 return null;
406 }
407
408 }
This page was automatically generated by Maven