001: package jimm.datavision;
002:
003: import jimm.util.XMLWriter;
004: import java.util.Observer;
005: import java.util.Observable;
006:
007: /**
008: * <code>Element</code> is the abstract superclass of <code>Field</code>
009: * and <code>Line</code>. These are the visual elements of a report section.
010: *
011: * @author Jim Menard, <a href="mailto:jimm@io.com">jimm@io.com</a>
012: */
013:
014: public abstract class Element extends Observable implements Writeable,
015: Observer {
016:
017: protected Report report;
018: protected Section section;
019: protected boolean visible;
020:
021: /**
022: * Constructor. (Though a section knows about it's report, too, often we
023: * create elements with a <code>null</code> section and then add them to
024: * some section later on).
025: *
026: * @param report the report containing this element
027: * @param section the report section containing this element
028: */
029: public Element(Report report, Section section, boolean visible) {
030: this .report = report;
031: this .section = section;
032: this .visible = visible;
033: }
034:
035: public void update(Observable o, Object arg) {
036: setChanged();
037: notifyObservers(arg);
038: }
039:
040: /**
041: * Returns the section that containts this field.
042: *
043: * @return the section
044: */
045: public Section getSection() {
046: return section;
047: }
048:
049: /**
050: * Returns the report that containts this field.
051: *
052: * @return the report
053: */
054: public Report getReport() {
055: return report;
056: }
057:
058: /**
059: * Modifies the section to which this field belongs. Only called by
060: * section itself.
061: *
062: * @param s the section
063: */
064: public void setSection(Section s) {
065: if (s != section) {
066: section = s;
067: setChanged();
068: notifyObservers();
069: }
070: }
071:
072: /**
073: * Returns the visible state of this element.
074: *
075: * @return the visible state
076: */
077: public boolean isVisible() {
078: return visible;
079: }
080:
081: /**
082: * Sets the visibility of this element.
083: *
084: * @param newVisible the new visible state
085: */
086: public void setVisible(boolean newVisible) {
087: if (visible != newVisible) {
088: visible = newVisible;
089: setChanged();
090: notifyObservers();
091: }
092: }
093:
094: /**
095: * Writes this element as an XML tag. This abstract method is overridden
096: * by the <code>Field</code> and <code>Line</code> subclasses.
097: *
098: * @param out a writer that knows how to write XML
099: */
100: public abstract void writeXML(XMLWriter out);
101:
102: }
|