View Javadoc
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