1 package jimm.datavision.field; 2 import jimm.datavision.*; 3 import jimm.datavision.gui.FieldWidget; 4 import jimm.datavision.gui.SectionWidget; 5 import jimm.util.I18N; 6 import jimm.util.XMLWriter; 7 import java.util.Observable ; 8 9 21 public abstract class Field 22 extends Element 23 implements Identity, Draggable, Cloneable { 24 25 public static final double DEFAULT_WIDTH = 120; 26 public static final double DEFAULT_HEIGHT = 16; 27 28 static Long maxIdSeen = new Long (0); 29 30 protected Long id; 31 protected Rectangle bounds; 32 protected Format format; 33 protected Border border; protected Object value; protected FormattedValueCache cache; 36 37 52 public static Field create(Long id, Report report, Section section, 53 String type, Object value, boolean visible) 54 { 55 if (type == null || type.length() == 0) 56 throw new IllegalArgumentException (I18N.get("Field.field_cap") 57 + " " + id + ": " 58 + I18N.get("Field.need_type")); 59 60 type = type.toLowerCase(); 61 if (type.equals("special")) 62 return new SpecialField(id, report, section, value, visible); 63 else if (type.equals("text")) 64 return new TextField(id, report, section, value, visible); 65 else if (type.equals("column")) 66 return new ColumnField(id, report, section, value, visible); 67 else if (type.equals("formula")) 68 return new FormulaField(id, report, section, value, visible); 69 else if (type.equals("parameter")) 70 return new ParameterField(id, report, section, value, visible); 71 else if (type.equals("image")) 72 return new ImageField(id, report, section, value, visible); 73 else if (type.equals("usercol")) 74 return new UserColumnField(id, report, section, value, visible); 75 else if (type.equals("subreport")) 76 return new SubreportField(id, report, section, value, visible); 77 else if (AggregateField.isAggregateFunctionName(type)) 78 return new AggregateField(id, report, section, value, visible, type); 79 80 throw new IllegalArgumentException (I18N.get("Field.field_cap") + " " + id 81 + ": " + I18N.get("Field.unknown") 82 + " \"" + type + "\""); 83 } 84 85 93 public static Field createFromDragString(Report report, String str) { 94 int pos = str.indexOf(":"); 95 if (pos == -1) 96 return null; 97 98 String type = str.substring(0, pos); 99 String value = str.substring(pos + 1); 100 return create(null, report, null, type, value, true); 101 } 102 103 104 105 114 protected Field(Long id, Report report, Section section, Object value, 115 boolean visible) 116 { 117 super(report, section, visible); 118 119 if (id == null) id = new Long (maxIdSeen.longValue() + 1); 121 if (id.compareTo(maxIdSeen) == 1) 122 maxIdSeen = new Long (id.longValue()); 123 this.id = id; 124 125 format = Format.createEmptyFormat(); 126 format.setField(this); 127 format.addObserver(this); 128 129 Field defaultField = report.getDefaultField(); 132 133 this.value = value; 134 cache = new FormattedValueCache(this); 135 bounds = defaultField != null 136 ? new Rectangle(0, 0, defaultField.getBounds().width, 137 defaultField.getBounds().height) 138 : new Rectangle(0, 0, DEFAULT_WIDTH, DEFAULT_HEIGHT); 139 bounds.addObserver(this); 140 141 if (defaultField != null) 143 defaultField.addObserver(this); 144 } 145 146 152 public Object clone() { 153 Field f = Field.create(null, report, section, typeString(), value, true); 154 f.bounds = new Rectangle(bounds); 155 f.format = (Format)format.clone(); 156 f.format.setField(f); 157 if (border == null) 158 f.border = null; 159 else { 160 f.border = (Border)border.clone(); 161 f.border.setField(f); 162 } 163 return f; 164 } 165 166 protected void finalize() throws Throwable { 167 bounds.deleteObserver(this); 168 if (format != null) format.deleteObserver(this); 169 if (border != null) border.deleteObserver(this); 170 } 171 172 public void update(Observable o, Object arg) { 173 super.update(o, arg); 174 if (format != null) 175 format.clearFontCache(); 176 } 177 178 public Object getId() { return id; } 179 180 185 public Rectangle getBounds() { return bounds; } 186 187 192 public void setBounds(Rectangle newBounds) { 193 if (bounds != newBounds) { 194 bounds.deleteObserver(this); 195 bounds = newBounds; 196 bounds.addObserver(this); 197 setChanged(); 198 notifyObservers(); 199 } 200 } 201 202 207 public double getOutputHeight() { 208 return cache.getOutputHeight(getValue()); 209 } 210 211 216 public Format getFormat() { return format; } 217 218 224 public void setFormat(Format newFormat) { 225 if (format != newFormat) { 226 if (format != null) format.deleteObserver(this); 227 format = newFormat; 228 format.setField(this); 229 if (format != null) format.addObserver(this); 230 setChanged(); 231 notifyObservers(); 232 } 233 } 234 235 240 public Border getBorder() { return border; } 241 242 249 public Border getBorderOrDefault() { 250 if (border != null) 251 return border; 252 253 Border b = (Border)report.getDefaultField().getBorder().clone(); 254 b.setField(this); 255 return b; 256 } 257 258 263 public void setBorder(Border newBorder) { 264 if (border != newBorder) { 265 if (border != null) border.deleteObserver(this); 266 border = newBorder; 267 if (border != null) border.addObserver(this); 268 setChanged(); 269 notifyObservers(); 270 } 271 } 272 273 278 public Object getValue() { return value; } 279 280 285 public void setValue(Object newValue) { 286 if (value != newValue) { 287 value = newValue; 288 setChanged(); 289 notifyObservers(); 290 } 291 } 292 293 300 public FieldWidget makeWidget(SectionWidget sw) { 301 return new FieldWidget(sw, this); 302 } 303 304 309 public abstract String typeString(); 310 311 317 public abstract String dragString(); 318 319 324 public String designLabel() { return formulaString(); } 325 326 331 public abstract String formulaString(); 332 333 342 public boolean refersTo(Field f) { 343 return false; 344 } 345 346 355 public boolean refersTo(Formula f) { 356 return false; 357 } 358 359 369 public boolean refersTo(UserColumn uc) { 370 return false; 371 } 372 373 382 public boolean refersTo(Parameter p) { 383 return false; 384 } 385 386 393 public boolean canBeAggregated() { 394 return false; 395 } 396 397 404 public String toString() { 405 if (!visible) return null; 406 return cache.getFormattedString(getValue()); 407 } 408 409 414 public void writeXML(XMLWriter out) { 415 out.startElement("field"); 416 out.attr("id", id); 417 out.attr("type", typeString()); 418 out.attr("value", value); 419 if (!visible) 420 out.attr("visible", visible); 421 422 writeFieldGuts(out); 423 424 out.endElement(); 425 } 426 427 432 protected void writeFieldGuts(XMLWriter out) { 433 bounds.writeXML(out); 434 if (format != null) format.writeXML(out); 435 if (border != null) border.writeXML(out); 436 } 437 438 } 439 | Popular Tags |