1 package prefuse.data.column; 2 3 import java.util.Date ; 4 5 import prefuse.data.DataTypeException; 6 import prefuse.data.event.ColumnListener; 7 import prefuse.data.parser.DataParseException; 8 import prefuse.data.parser.DataParser; 9 import prefuse.data.parser.ObjectParser; 10 import prefuse.data.parser.ParserFactory; 11 import prefuse.util.TypeLib; 12 import prefuse.util.collections.CopyOnWriteArrayList; 13 14 20 public abstract class AbstractColumn implements Column { 21 22 protected final Class m_columnType; 23 protected DataParser m_parser; 24 protected Object m_defaultValue; 25 protected boolean m_readOnly; 26 27 protected CopyOnWriteArrayList m_listeners; 28 29 32 public AbstractColumn() { 33 this(Object .class, null); 34 } 35 36 40 public AbstractColumn(Class columnType) { 41 this(columnType, null); 42 } 43 44 49 public AbstractColumn(Class columnType, Object defaultValue) { 50 m_columnType = columnType; 51 52 DataParser p = ParserFactory.getDefaultFactory().getParser(columnType); 53 m_parser = ( p==null ? new ObjectParser() : p ); 54 55 setDefaultValue(defaultValue); 56 m_readOnly = false; 57 m_listeners = new CopyOnWriteArrayList(); 58 } 59 60 63 67 public boolean isReadOnly() { 68 return m_readOnly; 69 } 70 71 76 public void setReadOnly(boolean readOnly) { 77 m_readOnly = readOnly; 78 } 80 85 public boolean isCellEditable(int row) { 86 return !m_readOnly; 87 } 88 89 93 public Class getColumnType() { 94 return m_columnType; 95 } 96 97 100 public DataParser getParser() { 101 return m_parser; 102 } 103 104 107 public void setParser(DataParser parser) { 108 if ( !m_columnType.isAssignableFrom(parser.getType()) ) { 109 throw new IllegalArgumentException ( 110 "Parser type ("+parser.getType().getName()+") incompatible with" 111 +" this column's data type ("+m_columnType.getName()+")"); 112 } 113 m_parser = parser; 114 } 115 116 119 123 public void addColumnListener(ColumnListener listener) { 124 m_listeners.add(listener); 125 } 126 127 131 public void removeColumnListener(ColumnListener listener) { 132 m_listeners.remove(listener); 133 } 134 135 138 protected final void fireColumnEvent(int type, int start, int end) { 139 Object [] lstnrs = m_listeners.getArray(); 140 for ( int i=0; i<lstnrs.length; ++i ) 141 ((ColumnListener)lstnrs[i]).columnChanged(this, type, start, end); 142 } 143 144 149 protected final void fireColumnEvent(int idx, int prev) { 150 Object [] lstnrs = m_listeners.getArray(); 151 for ( int i=0; i<lstnrs.length; ++i ) 152 ((ColumnListener)lstnrs[i]).columnChanged(this, idx, prev); 153 } 154 155 160 protected final void fireColumnEvent(int idx, long prev) { 161 Object [] lstnrs = m_listeners.getArray(); 162 for ( int i=0; i<lstnrs.length; ++i ) 163 ((ColumnListener)lstnrs[i]).columnChanged(this, idx, prev); 164 } 165 166 171 protected final void fireColumnEvent(int idx, float prev) { 172 Object [] lstnrs = m_listeners.getArray(); 173 for ( int i=0; i<lstnrs.length; ++i ) 174 ((ColumnListener)lstnrs[i]).columnChanged(this, idx, prev); 175 } 176 177 182 protected final void fireColumnEvent(int idx, double prev) { 183 Object [] lstnrs = m_listeners.getArray(); 184 for ( int i=0; i<lstnrs.length; ++i ) 185 ((ColumnListener)lstnrs[i]).columnChanged(this, idx, prev); 186 } 187 188 193 protected final void fireColumnEvent(int idx, boolean prev) { 194 Object [] lstnrs = m_listeners.getArray(); 195 for ( int i=0; i<lstnrs.length; ++i ) 196 ((ColumnListener)lstnrs[i]).columnChanged(this, idx, prev); 197 } 198 199 204 protected final void fireColumnEvent(int idx, Object prev) { 205 Object [] lstnrs = m_listeners.getArray(); 206 for ( int i=0; i<lstnrs.length; ++i ) 207 ((ColumnListener)lstnrs[i]).columnChanged(this, idx, prev); 208 } 209 210 213 216 public Object getDefaultValue() { 217 return m_defaultValue; 218 } 219 220 227 public void setDefaultValue(Object dflt) { 228 boolean prim = m_columnType.isPrimitive(); 229 if ( dflt != null && 230 ((!prim && !m_columnType.isInstance(dflt)) || 231 (prim && !TypeLib.isWrapperInstance(m_columnType, dflt))) ) 232 { 233 throw new IllegalArgumentException ( 234 "Default value is not of type " + m_columnType.getName()); 235 } 236 m_defaultValue = dflt; 237 } 238 239 243 public void revertToDefault(int row) { 244 set(m_defaultValue, row); 245 } 246 247 253 public boolean canGet(Class type) { 254 if ( type == null ) return false; 255 256 if ( m_columnType.isPrimitive() ) { 257 boolean primTypes = type.isAssignableFrom(m_columnType) || 258 (TypeLib.isNumericType(m_columnType) 259 && TypeLib.isNumericType(type)); 260 261 return primTypes 262 || type.isAssignableFrom(TypeLib.getWrapperType(m_columnType)) 263 || type.isAssignableFrom(String .class); 264 } else { 265 return type.isAssignableFrom(m_columnType); 266 } 267 } 268 269 275 public boolean canSet(Class type) { 276 if ( type == null ) return false; 277 278 if ( m_columnType.isPrimitive() ) { 279 return m_columnType.isAssignableFrom(type) 280 || TypeLib.getWrapperType(m_columnType).isAssignableFrom(type) 281 || String .class.isAssignableFrom(type); 282 } else { 283 return m_columnType.isAssignableFrom(type); 284 } 285 } 286 287 290 292 294 299 public boolean canGetInt() { 300 return canGet(int.class); 301 } 302 303 308 public boolean canSetInt() { 309 return canSet(int.class); 310 } 311 312 319 public int getInt(int row) throws DataTypeException { 320 if ( canGetInt() ) { 321 return ((Integer )get(row)).intValue(); 322 } else { 323 throw new DataTypeException(int.class); 324 } 325 } 326 327 334 public void setInt(int val, int row) throws DataTypeException { 335 if ( canSetInt() ) { 336 set(new Integer (val), row); 337 } else { 338 throw new DataTypeException(int.class); 339 } 340 } 341 342 344 349 public boolean canGetLong() { 350 return canGet(long.class); 351 } 352 353 358 public boolean canSetLong() { 359 return canSet(long.class); 360 } 361 362 369 public long getLong(int row) throws DataTypeException { 370 if ( canGetLong() ) { 371 return ((Long )get(row)).longValue(); 372 } else { 373 throw new DataTypeException(long.class); 374 } 375 } 376 377 384 public void setLong(long val, int row) throws DataTypeException { 385 if ( canSetLong() ) { 386 set(new Long (val), row); 387 } else { 388 throw new DataTypeException(long.class); 389 } 390 } 391 392 394 399 public boolean canGetFloat() { 400 return canGet(float.class); 401 } 402 403 408 public boolean canSetFloat() { 409 return canSet(float.class); 410 } 411 412 419 public float getFloat(int row) throws DataTypeException { 420 if ( canGetFloat() ) { 421 return ((Float )get(row)).floatValue(); 422 } else { 423 throw new DataTypeException(float.class); 424 } 425 } 426 427 434 public void setFloat(float val, int row) throws DataTypeException { 435 if ( canSetFloat() ) { 436 set(new Float (val), row); 437 } else { 438 throw new DataTypeException(float.class); 439 } 440 } 441 442 444 449 public boolean canGetDouble() { 450 return canGet(double.class); 451 } 452 453 458 public boolean canSetDouble() { 459 return canSet(double.class); 460 } 461 462 469 public double getDouble(int row) throws DataTypeException { 470 if ( canGetDouble() ) { 471 return ((Double )get(row)).doubleValue(); 472 } else { 473 throw new DataTypeException(double.class); 474 } 475 } 476 477 484 public void setDouble(double val, int row) throws DataTypeException { 485 if ( canSetDouble() ) { 486 set(new Double (val), row); 487 } else { 488 throw new DataTypeException(double.class); 489 } 490 } 491 492 494 499 public boolean canGetBoolean() { 500 return canGet(boolean.class); 501 } 502 503 508 public boolean canSetBoolean() { 509 return canSet(boolean.class); 510 } 511 512 519 public boolean getBoolean(int row) throws DataTypeException { 520 if ( canGetBoolean() ) { 521 return ((Boolean )get(row)).booleanValue(); 522 } else { 523 throw new DataTypeException(boolean.class); 524 } 525 } 526 527 534 public void setBoolean(boolean val, int row) throws DataTypeException { 535 if ( canSetBoolean() ) { 536 set(new Boolean (val), row); 537 } else { 538 throw new DataTypeException(boolean.class); 539 } 540 } 541 542 544 549 public boolean canGetString() { 550 return true; 551 } 553 554 559 public boolean canSetString() { 560 return m_parser != null && !(m_parser instanceof ObjectParser); 561 } 563 564 571 public String getString(int row) throws DataTypeException { 572 if ( canGetString() ) { 573 return m_parser.format(get(row)); 574 } else { 575 throw new DataTypeException(String .class); 576 } 577 } 578 579 586 public void setString(String val, int row) throws DataTypeException { 587 try { 588 set(m_parser.parse(val), row); 589 } catch (DataParseException e) { 590 throw new DataTypeException(e); 591 } 592 } 593 594 596 601 public boolean canGetDate() { 602 return canGet(Date .class); 603 } 604 605 610 public boolean canSetDate() { 611 return canSet(Date .class); 612 } 613 614 621 public Date getDate(int row) throws DataTypeException { 622 if ( canGetDate() ) { 623 return (Date )get(row); 624 } else { 625 throw new DataTypeException(Date .class); 626 } 627 } 628 629 636 public void setDate(Date val, int row) throws DataTypeException { 637 set(val, row); 638 } 639 640 } | Popular Tags |