Annotationsformate werden in Profilen abgebildet. Alle Eigenschaften, Editoren, Darstellungskomponenten und Funktionen zum Anlegen von Annotationen sind im Profile zusammengefasst und entsprechend dem zugrunde liegenden Format konfiguriert.
Annotation Profile sind im XML-Format abgelegt.
Sie werden über die AnnotationProfile
-Klasse verwaltet. Als Standardprofil ist
das jadice eigene Annotationsformat (default-annotation-profile.xml) registriert.
Folgende Profile / Annotationsformate sind aktuell verfügbar:
-
jadice Format (default-annotation-profile.xml)
Standardprofil, definiert das jadice eigene Annotationsformat, alle Annotationen eines Dokuments werden in einer XML-Datei abgelegt.
-
ContentManager 7 (CM7) (cm7-annotation-profile.xml)
Profil für CM7 Annotationen, können auch als CM8 Annotationen gespeichert werden, sind dann aber nicht mehr kompatibel zu CM7 Client-Anwendungen.
Alle Annotationen eines Dokuments werden in einer Datei im MODCA-Format abgelegt.
-
ContentManager 8 (CM8) (cm8-annotation-profile.xml)
Profil für CM8 Annotationen, alle Annotationen eines Dokuments werden in einer Datei im MODCA-Format abgelegt.
-
FileNet IS (filent-is-annotation-profile.xml)
Profil für FileNet Image Service Annotationen, alle Annotationen eines Dokuments werden in einer XML-Datei gespeichert, diese Datei wird jedoch nicht abgelegt, sondern wird vom Archiv-System interpretiert und entsprechend intern verwaltet. Nach dem Speichern müssen die Annotation erneut aus dem Archiv geladen werden, um einen inkonsistenten Zustand bei erneutem Speichern zu vermeiden.
-
FileNet P8 (filent-p8-annotation-profile.xml)
Profil für FileNet P8 Annotationen, Annotationen werden hier jeweils in eine eigene XML-Datei abgelegt, FileNet Dokumente können aus mehreren Dokumentdatenströmen zusammengestellt werden, was beim Laden / Speichern beachtet werden muss.
-
XFDF (xfdf-annotation-profile.xml)
Profil für XFDF Annotationen, Annotationen sind in einem XML basierenden XFDF Format abgelegt. Das zugehörige Annotation Profile beschreibt die unterschiedlichen Typen, Eigenschaften und Verhalten von XFDF Annotationen.
Profile können wie folgt geladen und als Standard gesetzt werden. Zu diesem Zweck müssen die jeweiligen Profile auf dem Klassenpfad vorhanden sein.
// URL für das Jadice Profil URL profileUrl = JadiceAnnotationReader.class.getResource("/default-annotation-profile.xml"); // URL für das CM7 Profil URL profileUrl = CMAnnotationReader.class.getResource("/cm7-annotation-profile.xml"); // URL für das CM8 Profil URL profileUrl = CMAnnotationReader.class.getResource("/cm8-annotation-profile.xml"); // URL für das FileNet IS Profil URL profileUrl = FNISAnnotationReader.class.getResource("/filenet-is-annotation-profile.xml"); // URL für das FileNet P8 Profil URL profileUrl = FNP8AnnotationReader.class.getResource("/filenet-p8-annotation-profile.xml"); // URL für das XFDF Profil URL profileUrl = XFDFAnnotationReader.class.getResource("/xfdf-annotation-profile.xml"); // Laden und Setzen des Profils AnnotationProfile profile = AnnotationProfile.load(profileUrl); AnnotationProfile.setDefaultProfile(profile);
Im Profil werden an erster Stelle die Annotationstypen des jeweiligen Formats definiert. Dabei handelt es sich um "Basistypen", die die grundsätzlichen Eigenschaften unterschiedler Typen festlegen. Sie werden beim Laden von Annotationen genutzt, um geladene Annotationseigenschaften mit Hilfe des Profils auf eine Java-Klasse abbilden zu können.
Als nächstes werden die "Templates" (Vorlagen) für die Annotationen definiert. Templates sind spezifische Ausprägungen eines "Basistypes". Damit werden mehrere Arten eines "Basistypes" definierbar. Als Beispiel, blaues und gelbes Rechteck. "Templates" werden bei der Anzeige der Annotationstoolbar und beim Erstellen von Annotationen genutzt.
Abschließend wird der Inhalt der Annotationtoolbar festgelegt. Durch diesen Schritt wird bestimmt, welche Annotationsarten dem Anwender per Toolbar zum Erstellen eines Annotationsobjektes angeboten werden. Dabei definiert die konkrete Zusammenstellung bestimmter "Templates" das Erscheinungsbild Annotationtoolbar. Verwandte "Templates" können dabei auch gruppiert in die Toolbar aufgenommen werden.
Das 'annotation-profile' Element ist das Root-Element des Profils, das 'name' Attribut muss mit einem eindeutigen (idealerweise das Format beschreibenden) Namen belegt werden.
<annotation-profile name="Profile name"> <!-- ############################################################################### --> <!-- ## Base types to match archetype definitions (used in reader class) --> <!-- ############################################################################### --> <annotation-type name="BaseLine" archetype="BaseLine" class="com.levigo.jadice.annotation.LineAnnotation"> ... </annotation-type> <annotation-type name="BaseArrow" archetype="BaseArrow" class="com.levigo.jadice.annotation.ArrowAnnotation"> ... </annotation-type> <annotation-type name="BaseStamp" archetype="BaseStamp" class="com.levigo.jadice.annotation.StampAnnotation"> ... </annotation-type> <!-- ############################################################################### --> <!-- ## User defined types (used in annotation toolbar) --> <!-- ############################################################################### --> <annotation-template name="Line" extends="BaseLine"> <!-- User defined settings --> </annotation-template> <annotation-template name="Arrow" extends="BaseArrow"> <!-- User defined settings --> </annotation-template> <annotation-template name="Stamp01" extends="BaseStamp"> <!-- User defined settings --> </annotation-template> <annotation-template name="Stamp02" extends="BaseStamp"> <!-- User defined settings --> </annotation-template> <!-- ############################################################################### --> <!-- ## Annotation toolbar definition --> <!-- ############################################################################### --> <type-set name="default"> <type ref="Line" /> <type ref="Arrow" /> <type-set name="Stamp annotations"> <type ref="Stamp01" /> <type ref="stamp02" /> </type-set> </type-set> </annotation-profile>
Annotationseigenschaften, die im zugehörigen Annotation Profile für ein spezifischen Annotationtyp definiert wurden, werden beim Erstellen eines neuen Annotationsobjekts gesetzt. Damit ist es möglich verschiedene Ausprägungen von gewünschte Annotationen vorzudefinieren. Die vorgegebenen Eigenschaften müssen dabei zwingend von der im 'annotation-type' Element angegebenen Annotationsklasse und dem zugrundeliegenden Annotationsformat unterstützt werden.
Technisch werden dabei die Eigenschaften via Code-Reflection auf das Annotationsobjekt angewendet. Der Name der zu setzenden Eigenschaft wird vom entsprechenden Methodenname abgeleitet, z.B. für die Eigenschaft 'linePainted' muss das Annotationsobjekt die Methode 'setLinePainted(boolean)' zur Verfügung stellen.
Eine Übersicht der Methoden kann der Javadoc-Beschreibung der Annotationsklassen entnommen werden. Bei den hier aufgeführten Beispielen werden die Attribute mit dem Element 'fixed' (fester Wert) definiert. Es gibt noch weitere Ausprägungen von Elementen, die aber nur im Zusammenhang mit Editordefinitionen Sinn machen. Hierzu mehr im Abschnitt„Attribut-Definition mit Editor“. Eigenschaftstypen basieren auf einfachen Basistypen:
-
java.lang.Boolean
-
java.lang.String
-
java.lang.Float
-
java.lang.Integer
-
java.awt.Color
Beispiele:
-
Eigenschaft "Füllen" definieren, die Methode 'setFilled(boolean)' muss vorhanden sein:
<fixed name="filled" propertyType="java.lang.Boolean"> <default>true</default> </fixed>
-
Text definieren, die Methode 'setText(String)' muss vorhanden sein:
<fixed name="text" propertyType="java.lang.String"> <default>Annotation-Text</default> </fixed>
-
Liniendicke definieren, die Methode 'setLineWidth(float)' muss vorhanden sein:
<fixed name="lineWidth" propertyType="java.lang.Float"> <default>10.5</default> </fixed>
-
Rotation definieren, die Methode 'setRotation(int)' muss vorhanden sein:
<fixed name="rotation" propertyType="java.lang.Integer"> <default>90</default> </fixed>
-
Linienfarbe definieren, die Methode 'setStrokeColor(Color)' muss vorhanden sein:
<fixed name="strokeColor" propertyType="java.awt.Color"> <default>#7F11AA22</default> </fixed>
Der Farbwert ist wie folgt aufgebaut (hexadezimal):
7F = Alphaanteil, 11 = Rotanteil, AA = Blauanteil, 22 = Grünanteil
Wenn kein Alphawert angegeben wird ist der Standardwert 'FF', d.h. volle Deckkraft.
Komplexe Eigenschaftsdefinitionen, z.B. Vektorpfade, Bilder, Datumsformate usw. müssen über eine AnnotationCustomizer-Implementation gesetzt werden. Siehe dazu den Abschnitt„AnnotationCustomizer-Klassen“).
Die Attribut-Definition kann um eine Editorkomponente erweitert werden. Wird eine Annotation selektiert erscheint oberhalb eine Menüleiste in der alle definierten Editoren angezeigt werden, hier kann der Anwender dann Änderungen vornehmen.
Übersicht Editorkomponenten:
-
Farbeditor (com.levigo.jadice.swing.internal.annotation.editors.ColorEditor)
Editor zum Ändern der Füll-, Linien-, Textfarbe
-
Schrifteditor (com.levigo.jadice.swing.internal.annotation.editors.FontFaceEditor)
Editor zur Auswahl einer Schriftart
-
Schriftgrösseneditor (com.levigo.jadice.swing.internal.annotation.editors.FontSizeEditor)
Editor zur Auswahl der Schriftgrösse
-
Editor für Liniendicke (com.levigo.jadice.swing.internal.annotation.editors.LineWidthEditor)
-
Umschalteditor (com.levigo.jadice.swing.internal.annotation.editors.ToggleEditor)
Kann verwendet werden um eine Boolean Attribut-Definition umzuschalten
-
Transparenzeditor (com.levigo.jadice.swing.internal.annotation.editors.TransparencyEditor)
Virtueller Editor der nicht an eine Attribut-Definition gebunden werden kann. Dieser Editor dient zum Umschalten der Transparenz von Farben (Linien- / Füllfarbe)
-
Rotationeditor (com.levigo.jadice.swing.internal.annotation.editors.RotationEditor)
Editor zur Rotation entsprechender Annotationen um 90° nach rechts oder links. Kann nur mit Annotationen verwendet werden, welche eine Rotation unterstützen. Momentan sind das:
-
Textannotation (com.levigo.jadice.annotation.TextAnnotation)
-
Stempelannotation (com.levigo.jadice.annotation.StampAnnotation)
-
-
Editor für horizontale Textausrichtung (com.levigo.jadice.swing.internal.annotation.editors.HorizontalAlignmentEditor)
Editor um zwischen verschiedenen Ausrichtungen von Text zu wechseln.
Der Wertebereich der Editoren kann anhand der Attribut-Definition festgelegt werden:
-
fixed
Ein fester Wert, es können zusätzlich Werte via 'preferred' Element definiert werden, z.B.:
<fixed name="lineWidth" propertyType="java.lang.Float"> <labels> <label locale="en">Line width</label> <label locale="de">Liniendicke</label> </labels> <editor class="com.levigo.jadice.swing.internal.annotation.editors.LineWidthEditor"/> <default>10.0</default> <preferred>0.5</preferred> <preferred>1.0</preferred> <preferred>3.0</preferred> <preferred>5.0</preferred> <preferred>10.0</preferred> </fixed>
-
discrete
Einzelne Werte, die via 'preferred' Element definiert werden, z.B.:
<discrete name="lineWidth" propertyType="java.lang.Float"> <labels> <label locale="en">Line width</label> <label locale="de">Liniendicke</label> </labels> <editor class="com.levigo.jadice.swing.internal.annotation.editors.LineWidthEditor"/> <default>10.0</default> <preferred>0.5</preferred> <preferred>1.0</preferred> <preferred>3.0</preferred> <preferred>5.0</preferred> <preferred>10.0</preferred> </discrete>
-
range
Wertebereich, es können zusätzlich Werte via 'preferred' Element angegeben werden, der Werte wird via 'minimum' / 'maximum' Elementen definiert, z.B.:
<range name="lineWidth" propertyType="java.lang.Float"> <labels> <label locale="en">Line width</label> <label locale="de">Liniendicke</label> </labels> <editor class="com.levigo.jadice.swing.internal.annotation.editors.LineWidthEditor"/> <default>10.0</default> <preferred>0.5</preferred> <preferred>1.0</preferred> <preferred>3.0</preferred> <preferred>5.0</preferred> <preferred>10.0</preferred> <minimum>0.5</minimum> <maximum>10.0</maximum> </range>
-
unrestricted
Uneingeschränkter Werte
Die Customizer-Klassen können dazu verwendet werden um eine Annotation nach deren Anlegen zu konfigurieren. Customizer-Klassen werden in Annotation-Type und Annotation-Template Elementen definiert, dabei ist auch die Angabe mehrerer Customizer möglich.
Während des Anlegens einer Annotation wird diese anhand der Definition im
Annotationsprofil erstellt. Bevor die Annotation abschließend ins
AnnotationPageSegment
hinzugefügt wird, werden zuvor alle
AnnotationCustomizer-Implementationen in der konfigurierten definierter
Reihenfolge ausgeführt.
Um ein Anwendungsbeispiel zu nennen, der AnnotationCustomizer kann verwendet werden, um eine komplexe Polygonannotation anzulegen (hier Hakenannotation):
AnnotationCustomizer-Implementation
package customizers; import java.awt.geom.GeneralPath; import java.awt.geom.Point2D; import com.levigo.jadice.annotation.Annotation; import com.levigo.jadice.annotation.AnnotationCustomizer; import com.levigo.jadice.annotation.PathAnnotation; public class TickAnnotationCustomizer implements AnnotationCustomizer { @Override public void customize(Annotation a) { final PathAnnotation annotation = (PathAnnotation) a; // Position holen final Point2D point = new Point2D.Double(annotation.getBounds().getX(), annotation.getBounds().getY()); final double xOff = point.getX(); final double yOff = point.getY(); final GeneralPath path = new GeneralPath(); path.moveTo(xOff, yOff + 2000); path.lineTo(xOff + 1000, yOff + 3000); path.lineTo(xOff + 3000, yOff); annotation.setPath(path); } }
Definition im Profil
<annotation-type name="Tick" extends="BasePen"> <wrangler class="com.levigo.jadice.swing.internal.annotation.wranglers.FreehandAnnotationWrangler"> <property name="creationMode">SINGLE_CLICK</property> </wrangler> <customizer class="customizers.TickAnnotationCustomizer"/> </annotation-type>