Bei den klassischen Annotationsformaten (ContentManager 7 / 8, FileNet IS / P8, jadice XML, Wang) werden Textinhalte mittels referenzierten Schriftarten (im weiteren als Font bzw. Fonts bezeichnet) dargestellt.
Bei textbasierten Annotationen sind Fonts durch einen Namen und den Stilinformationen (hier: bold / fett, italic / kursiv, plain / einfach) definiert. Anhand diesen Informationen muss ein passender Font für die Anzeige der Annotation ermittelt werden.
Ein Font wird als Datenstrom / Datenobjekt zur Verfügung gestellt, der via
Klasse FontSource
repräsentiert wird, siehe hierzu„Repräsentation von Fonts“.
Die FontSource
-Instanzen müssen in einer FontManager
-Implementation
registiert werden, damit sie von der Font-Engine zur Darstellung von
Annotationen gefunden und verwendet werden können (siehe auch„Bereitstellen der verfügbaren Fonts“).
Ein Font wird durch Eigenschaften (Attribute) definiert, welche via Klasse
FontAttributeSet
repräsentiert werden, die von der FontSource
Klasse
abgefragt werden können. Siehe hierzu„Eigenschaften von Fonts“.
Die Definition der Eigenschaften wird bei einer Font-Abfrage berücksichtigt.
Fonts für Annotationen werden anhand von
AnnotationFontFactory
-Implementationen für die Darstellung / das Rendering
zur Verfügung gestellt. AnnotationFontFactory
-Implementationen können im
Annotationsprofil definiert und einem bestimmten Annotationstyp zugeordnet oder
zentral in der Annotations
-Klasse via
setDefaultAnnotationFontFactory
-Methode registriert
werden. Definitionen im Annotationsprofil haben immer Vorrang. Wenn keine
Definition vorhanden ist, wird auf die Annotations
-Klasse zurückgegriffen. Es
muss letztendlich immer eine AnnotationFontFactory
-Implementation mit einer
Fallback-FontSource
wie Beispielsweise AnnotationBasicFontFactory
oder
SwingAnnotationBasicFontFactory
definiert werden. Kann der Font nicht
bestimmt werden, werden Fehler im Programmcode ausgelöst, der Anzeigevorgang
wird nicht korrekt ausgeführt und die weitere Verarbeitung wird unterbrochen.
Definitionsmöglichkeiten von AnnotationFontFactory
-Implementationen:
-
Annotationstyp spezifische Definition im Annotationsprofil (Klasse muss einen Standardkonstruktor besitzen):
<annotation-type name="BaseText" archetype="BaseText" class="com.levigo.jadice.annotation.TextAnnotation"> ... <font-factory class="com.levigo.jadice.demo.font.annotation.SwingAnnotationProfileLogicalFontFactory"/> <font-factory class="com.levigo.jadice.demo.font.annotation.SwingAnnotationProfileStandard14FontFactory"/> <font-factory class="com.levigo.jadice.demo.font.annotation.SwingAnnotationProfileSystemFontFactory"/> <font-factory class="com.levigo.jadice.demo.font.annotation.SwingAnnotationProfileBasicFontFactory"/> ... </annotation-type>
Die
AnnotationFontFactory
-Implementationen können auch in einerChainedAnnotationFontFactory
-Implementation zusammengefasst (siehe Beispiel weiter unten) und mit nur einem Eintrag definiert werden. Änderungen (zum Beispiel Reihenfolge anpassen oder Deaktivieren von Definitionen) müssen dann jedoch im Quelltext vorgenommen werden. -
Registrierung in der
Annotations
-Klasse:FontManagerFuture fontManagerFuture = ... Annotations.setDefaultAnnotationFontFactory( new SwingAnnotationStandard14FontFactory(fontManagerFuture));
AnnotationFontFactory
-Implementationen können auch mit Hilfe der
ChainedAnnotationFontFactory
-Klasse verkettet / zusammengefasst werden, siehe
auchBeispiel 7.15, „Verwendung der ChainedFontFactory
“. Die
AnnotationFontFactory
-Implementationen werden in definierter Reihenfolge
abgefragt. Bei einer erfolgreichen Suche wird die gefundene Font
-Instanz
zurückgegeben und der Abfragevorgang wird beendet. Wird nichts gefunden wird
null
zurückgegeben.
-
Registrierung in der
Annotations
-Klasse viaChainedAnnotationFontFactory
-Klasse:FontManagerFuture fontManagerFuture = ... Annotations.setDefaultAnnotationFontFactory(// new ChainedSwingAnnotationFontFactory(// new SwingAnnotationLogicalFontFactory(fontManagerFuture), // new SwingAnnotationStandard14FontFactory(fontManagerFuture), // new SwingAnnotationSystemFontFactory(fontManagerFuture) // )// );
Die AnnotationFontFactory
-Implementationen werden mit einer
FontAttributeSet
-Klasse abgefragt, die die entsprechenden Attribute / Werte
des Fonts beinhalten. Folgende Attribute werden von textbasierten Annotationen
(siehe Klasse TextAnnotation
) verwendet und entsprechend in der
FontAttributeSet
-Abfrage abgelegt:
Attribut FontName , ermittelt aus getFontFace()
|
Attribut Bold , wird nur definiert wenn Rückgabewert
isBold() == true
|
Attribut Italic , wird nur definiert wenn Rückgabewert
isItalic() == true
|
Attribut Plain , wird nur definiert wenn Rückgabewert
isBold() == false und isItalic() ==
false
|
Weitere Attribute werden nicht definiert / berücksichtigt; Gross-/Kleinschreibung bei der Fontnamensdefinition wird bei der Abfrage nicht beachtet.
Als weiterer Parameter wird eine Map
-Instanz mit der
AnnotationType
-Instanz der aktuellen Textannotation zur Verfügung gestellt.
Anhand der AnnotationType
-Instanz kann die Annotation identifiziert werden,
zum Beispiel die Klasse der Annotation (siehe auch Klassen Scopes
und
AnnotationType
):
public Font create(FontAttributeSet fontAttributeSet, Map<String, Object> scope) { Object scopeObject = scope.get(Scopes.SOURCE); if (scopeObject != null && scopeObject instanceof AnnotationType) { AnnotationType type = (AnnotationType) scopeObject; System.out.println(type.getAnnotationClass()); } ... }
AnnotationFontFactory
erweitert das FontFactory
-Interface um die Methode
getAvailableFontAttributeSets()
, die eine
Collection
mit FontAttributeSet
-Definitionen
zurückgibt, die für eigene Zwecke (z.B. Informationen über Fonts) verwendet
werden kann. Die aktuellen Implementationen liefern über diese Methode
verfügbare Fonts. Es werden alle Fonts mit identischer FamilyName
-Definition
zusammengefasst und in einer vereinfachten FontAttributeSet
-Definition
bereitgestellt:
Beispiel: Die Fontdefinitionen
-
FamilyName
= "Arimo",FontName
= "Arimo",PostScriptName
= "Arimo",Plain
-
FamilyName
= "Arimo",FontName
= "Arimo Bold",PostScriptName
= "Arimo-Bold",Bold
-
FamilyName
= "Arimo",FontName
= "Arimo Italic",PostScriptName
= "Arimo-Italic",Italic
-
FamilyName
= "Arimo",FontName
= "Arimo Bold Italic",PostScriptName
= "Arimo-BoldItalic",Bold
,Italic
werden zu folgender Definition zusammengefasst:
-
FamilyName
= "Arimo"
Werden schriftbezogene GUI-Annotationseditorkomponenten (Schriftauswahl,
Editieren des Textes) verwendet, muss die Methode gewünschte / verfügbare
Fontdefinitionen liefern, ansonsten kann die
getAvailableFontAttributeSets()
-Methode
null
oder eine leere Collection
zurückgeben. Auf die Darstellung / Rendering der Annotationen hat diese Methode
keinen Einfluss.
Basis-/Fallback-Implementation im Paket
com.levigo.jadice.annotation.font
im jadice document platform 5
Core-Annotation-Modul:
-
Diese Klasse liefert eine vektorbasierte
Font
-Basisimplementation mit einem eingeschränkten Zeichensatz (a-z, A-Z, 0-9, Leerzeichen), es sind keine Sonderzeichen vorhanden. Diese Implementation benötigt keineFontManager
-Instanz und ist in derAnnotations
-Klasse als StandardAnnotationFontFactory
registriert. DiegetAvailableFontAttributeSets()
-Methode gibt eine leereCollection
zurück.
Die Implementationen im Paket
com.levigo.jadice.appbase.font.factory.annotation
im jadice document platform 5
Core-Appbase-Modul benötigen im Konstruktor eine FontManagerFuture
-Instanz
und können daher nicht im Annotationsprofil verwendet werden. Bei erfolgreicher
Suche in der entsprechenden FontManager
-Instanz wird ein Font
-Objekt
zurückgegeben. Diese Klassen stehen auch als Quellcode zur Verfügung.
-
Diese Implementation löst logische Fontnamen nach jadice Standard-14 Fonts auf (siehe
LogicalFontIdentifier
,LogicalFontFactory
), diegetAvailableFontAttributeSets()
-Methode stellt alle logische Fontdefinitionen zur Verfügung. Die benötigteFontManagerFuture
-Instanz muss die Standard-14 Fonts registriert haben -
AnnotationStandard14FontFactory
Diese Implementation löst alle jadice Standard-14 Fontnamen auf (siehe
Standard14Substitute
,Standard14FontFactory
), diegetAvailableFontAttributeSets()
-Methode stellt alle Standard-14 Fontdefinitionen zur Verfügung. Die benötigteFontManagerFuture
-Instanz muss die Standard-14 Fonts registriert haben. -
Diese Implementation versucht Fontnamen nach Systemfonts aufzulösen, die
getAvailableFontAttributeSets()
-Methode stellt alle System-Fontdefinitionen zur Verfügung. Die benötigteFontManagerFuture
-Instanz muss System-Fonts, die der Java Virtual Machine (JVM) bekannt sind, registriert haben. -
Diese Implementation fasst mehrere
AnnotationFontFactory
-Instanzen zusammen, diegetAvailableFontAttributeSets()
-Methode stellt die Fontdefinitionen aus allen registriertenAnnotationFontFactory
-Instanz zur Verfügung.
Die Implementationen im Paket
com.levigo.jadice.demo.font.annotation
im jadice document platform 5
Core-Demo-Modul besitzen einen Standardkonstruktor und können somit im
Annotationsprofil verwendet werden, hier wird intern eine
FontManagerFuture
-Instanz mit Standard-14 / System-Fonts verwendet. Diese
Klassen befinden sich in einem Demo-Modul, stehen als Quellcode zur Verfügung
und sollten bei Verwendung kopiert und entsprechend angepasst werden, da sich
der Quelltext der Klassen in Zukunft ändern kann.
-
AnnotationProfileLogicalFontFactory
Funktionsweise entspricht der
AnnotationLogicalFontFactory
, intern wird eineAnnotationLogicalFontFactory
-Instanz erstellt, die benötigteFontManagerFuture
-Instanz wird aus derFontEnvironments
-Klasse viagetFontManagerFuture()
-Methode geholt. -
AnnotationProfileStandard14FontFactory
Funktionsweise entspricht der
AnnotationStandard14FontFactory
, intern wird eineAnnotationStandard14FontFactory
-Instanz erstellt, die benötigteFontManagerFuture
-Instanz wird aus derFontEnvironments
-Klasse viagetFontManagerFuture()
-Methode geholt. -
AnnotationProfileSystemFontFactory
Funktionsweise entspricht der
AnnotationSystemFontFactory
, intern wird eineAnnotationSystemFontFactory
-Instanz erstellt, die benötigteFontManagerFuture
-Instanz wird aus derFontEnvironments
-Klasse viagetFontManagerFuture()
-Methode geholt.
SwingAnnotationFontFactory
erweitert das AnnotationFontFactory
-Interface
um die Methode createAWTFont(FontAttributeSet
fontAttributeSet)
, die aus einer FontAttributeSet
-Definition
einen passenden Java AWT Font erstellen soll.
SwingAnnotationFontFactory
-Implementationen werden verwendet um dem
Schriftauswahldialog und dem Texteditor (beide Java AWT
basierend) passende AWT Font-Instanzen zur Verfügung zu
stellen.
Funktionsweise / Ablauf:
In der folgenden Übersicht wird das Zusammenspiel / Verhalten der
GUI-Schriftauswahl und der SwingAnnotationFontFactory
-Definition erläutert:
Definition der verwendeten SwingAnnotationFontFactory
-Implementationen im
Annotationsprofil:
<annotation-type name="BaseText" archetype="BaseText" class="com.levigo.jadice.annotation.TextAnnotation"> ... <font-factory class="com.levigo.jadice.demo.font.annotation.SwingAnnotationProfileLogicalFontFactory"/> <font-factory class="com.levigo.jadice.demo.font.annotation.SwingAnnotationProfileStandard14FontFactory"/> <font-factory class="com.levigo.jadice.demo.font.annotation.SwingAnnotationProfileBasicFontFactory"/> ... </annotation-type>
Entsprechende Verwendung der SwingAnnotationFontFactory
-Implementationen
via Annotations
-Klasse:
FontManagerFuture fontManagerFuture = SwingFontEnvironment.getFontManagerFuture(); Annotations.setDefaultAnnotationFontFactory(// new ChainedSwingAnnotationFontFactory(// new SwingAnnotationLogicalFontFactory(fontManagerFuture), // new SwingAnnotationStandard14FontFactory(fontManagerFuture), // new SwingAnnotationBasicFontFactory(fontManagerFuture) // )// );
Die Methode getAvailableFontAttributeSets()
gibt folgende
FamilyName
-Attribute zurück:
-
SwingAnnotationProfileLogicalFontFactory
Dialog DialogInput Monospaced SansSerif Serif -
SwingAnnotationProfileStandard14FontFactory
Arimo Cousine Tinos -
SwingAnnotationProfileBasicFontFactory
Hier werden keine Family-Namen zurückgegeben.
Alle oben genannten Font-Family-Namen stehen dem Schriftauswahldialog und dem
Texteditor zur Verfügung, d. h. die createAWTFont(FontAttributeSet
fontAttributeSet)
-Methode sollte auch entsprechende Java
AWT Font-Instanzen erzeugen um eine korrekte Darstellung
in den GUI-Editorkomponenten zu gewährleisten.
Schriftauswahldialog sieht wie folgt aus:
Arimo |
Cousine |
Dialog |
DialogInput |
Monospaced |
SansSerif |
Serif |
Tinos |
Die Fontauswahl kann im Annotationsprofil definiert / gefiltert werden:
-
Mit folgender Definition sind alle Fonts auswählbar:
<annotation-type name="BaseText" archetype="BaseText" class="com.levigo.jadice.annotation.TextAnnotation"> ... <unrestricted name="fontFace" propertyType="java.lang.String"> <editor class="com.levigo.jadice.swing.internal.annotation.editors.FontFaceEditor" /> <default>Sansserif</default> </unrestricted> ... </annotation-type>
-
Mit folgender Einstellung können Fonts gezielt ausgewählt werden:
<annotation-type name="BaseText" archetype="BaseText" class="com.levigo.jadice.annotation.TextAnnotation"> ... <discrete name="fontFace" propertyType="java.lang.String"> <editor class="com.levigo.jadice.swing.internal.annotation.editors.FontFaceEditor" /> <default>Sansserif</default> <!-- Folgende Fonts sind auswählbar --> <allowed>Sansserif</allowed> <allowed>Serif</allowed> <allowed>Monospaced</allowed> <allowed>Arimo</allowed> <allowed>Cousine</allowed> <allowed>Tinos</allowed> </discrete> ... </annotation-type>
Hier werden nur die mit dem allowed
-Element definierten
Font-Family-Namen im Schriftauswahldialog angezeigt:
Arimo |
Cousine |
Monospaced |
SansSerif |
Serif |
Tinos |
Die Fontdefinitionen werden im Schriftauswahldialog sortiert (alphanumerisch
aufsteigend) angezeigt, ist eine Fontdefinition in den
SwingAnnotationFontFactory
-Implementationen nicht verfügbar, wird sie im
Auswahlmenü ausgeblendet.
Wird ein Fontname aus der Liste ausgewählt, wird dieser der entsprechenden
TextAnnotation
-Instanz via setFontFace(String
fontFace)
-Methode gesetzt, beim darauf folgenden Darstellungs- /
Rendervorgang wird aus dem Fontnamen und den Stilinformationen erneut eine
Fontabfrage erstellt und ausgeführt (siehe„Aufbau und Funktion einer Fontabfrage“).
Die Implementationen im Paket
com.levigo.jadice.appbase.annotation.font
im jadice document platform 5
Swing-Appbase-Modul benötigen im Konstruktor eine FontManagerFuture
-Instanz
und können daher nicht im Annotationsprofil verwendet werden. Bei erfolgreicher
Suche in der entsprechenden FontManager
-Instanz wird ein Font
-Objekt
zurückgegeben. Diese Klassen stehen auch als Quellcode zur Verfügung. Die
Implementationen werden aktuell in der SwingFontEnvironments
-Klasse im
Swing-Demo-Client-Modul verwendet.
-
SwingAnnotationBasicFontFactory
Diese Klasse liefert eine vektorbasierte
Font
-Basisimplementation mit einem eingeschränkten Zeichensatz (a-z, A-Z, 0-9, Leerzeichen), es sind keine Sonderzeichen vorhanden. DiegetAvailableFontAttributeSets()
-Methode gibt eine leereCollection
zurück. DieFontManagerFuture
-Instanz muss die Standard-14 Fonts registriert haben, damit diecreateAWTFont(FontAttributeSet fontAttributeSet)
-Methode eine passende Java AWT Font-Instanz erzeugen kann, hier wird immer der Standard-14-Font 'Arimo' zurückgegeben, ist ein anderer Font gewünscht, muss eine eigene Implementation erstellt werden. -
SwingAnnotationLogicalFontFactory
Diese Implementation löst logische Fontnamen nach jadice Standard-14 Fonts auf (siehe
LogicalFontIdentifier
,LogicalFontFactory
), diegetAvailableFontAttributeSets()
-Methode stellt alle logische Fontdefinitionen zur Verfügung. Die benötigteFontManagerFuture
-Instanz muss die Standard-14 Fonts registriert haben, diecreateAWTFont(FontAttributeSet fontAttributeSet)
-Methode erstellt aus dem Standard-14 Fontdatenstrom eine Java AWT Font-Instanz. -
SwingAnnotationStandard14FontFactory
Diese Implementation löst alle jadice Standard-14 Fontnamen auf (siehe
Standard14Substitute
,Standard14FontFactory
), diegetAvailableFontAttributeSets()
-Methode stellt alle Standard-14 Fontdefinitionen zur Verfügung. Die benötigteFontManagerFuture
-Instanz muss die Standard-14 Fonts registriert haben, diecreateAWTFont(FontAttributeSet fontAttributeSet)
-Methode erstellt aus dem Standard-14 Fontdatenstrom eine Java AWT Font-Instanz. -
SwingAnnotationSystemFontFactory
Diese Implementation versucht Fontnamen nach Systemfonts aufzulösen, die
getAvailableFontAttributeSets()
-Methode stellt alle System-Fontdefinitionen zur Verfügung. Die benötigteFontManagerFuture
-Instanz muss System-Fonts registriert haben, diecreateAWTFont(FontAttributeSet fontAttributeSet)
-Methode erstellt aus dem Font-Family-Namen eine passende Java AWT Font-Instanz. -
SwingAnnotationGenericStylesSystemFontFactory
Funktionsweise entspricht der
SwingAnnotationSystemFontFactory
-Implementation, diegetAvailableFontAttributeSets()
-Methode stellt nur System-Fontdefinitionen zur Verfügung, die die Stilarten plain / normal, bold / fett, italic / kursiv und bold-italic / fett-kursiv erfüllen. -
ChainedSwingAnnotationFontFactory
Diese Implementation fasst mehrere
SwingAnnotationFontFactory
-Instanzen zusammen, diegetAvailableFontAttributeSets()
-Methode stellt die Fontdefinitionen aus allen registriertenAnnotationFontFactory
-Instanz zur Verfügung. DiecreateAWTFont(FontAttributeSet fontAttributeSet)
-Methode gibt den ersten Treffer von den registrierten Instanzen zurück.
Die Implementationen im Paket
com.levigo.jadice.demo.font.annotation
im jadice document platform 5
Swing-Demo-Client-Modul besitzen einen Standardkonstruktor und können somit im
Annotationsprofil verwendet werden, hier wird intern eine
FontManagerFuture
-Instanz mit Standard-14 / System-Fonts verwendet. Diese
Klassen befinden sich in einem Demo-Modul, stehen als Quellcode zur Verfügung
und sollten bei Verwendung kopiert und entsprechend angepasst werden, da sich
der Quelltext der Klassen in Zukunft ändern kann.
-
SwingAnnotationProfileBasicFontFactory
Funktionsweise entspricht der
SwingAnnotationBasicFontFactory
, intern wird eineSwingAnnotationBasicFontFactory
-Instanz erstellt, die benötigteFontManagerFuture
-Instanz wird aus derSwingFontEnvironments
-Klasse viagetFontManagerFuture()
-Methode geholt. -
SwingAnnotationProfileLogicalFontFactory
Funktionsweise entspricht der
SwingAnnotationLogicalFontFactory
, intern wird eineSwingAnnotationLogicalFontFactory
-Instanz erstellt, die benötigteFontManagerFuture
-Instanz wird aus derSwingFontEnvironments
-Klasse viagetFontManagerFuture()
-Methode geholt. -
SwingAnnotationProfileStandard14FontFactory
Funktionsweise entspricht der
SwingAnnotationStandard14FontFactory
, intern wird eineSwingAnnotationStandard14FontFactory
-Instanz erstellt, die benötigteFontManagerFuture
-Instanz wird aus derSwingFontEnvironments
-Klasse viagetFontManagerFuture()
-Methode geholt. -
SwingAnnotationProfileSystemFontFactory
Funktionsweise entspricht der
SwingAnnotationSystemFontFactory
, intern wird eineSwingAnnotationSystemFontFactory
-Instanz erstellt, die benötigteFontManagerFuture
-Instanz wird aus derSwingFontEnvironments
-Klasse viagetFontManagerFuture()
-Methode geholt. -
SwingAnnotationProfileGenericStylesSystemFontFactory
Funktionsweise entspricht der
SwingAnnotationGenericStylesSystemFontFactory
, intern wird eineSwingAnnotationGenericStylesSystemFontFactory
-Instanz erstellt, die benötigteFontManagerFuture
-Instanz wird aus derSwingFontEnvironments
-Klasse viagetFontManagerFuture()
-Methode geholt.