Die Image Registry liefert für eine Image Konstante ein Image Handle. In der Regel fragt man das Image Handle nicht selbst ab, sondern verwendet eine Image Konstante zur Definition eines Images oder Icons für ein Widget. Die Adapter Klassen in der SPI Implementierung lösen dann mit Hilfe der Image Registry diese Image Konstante in ein Image Handle auf.
Eine Image Registry Instanz bekommt man vom Toolkit mittels der folgenden Methode:
IImageRegistry getImageRegistry();
Es folgt eine kurze Auflistung der wichtigsten Methoden der
Schnittstelle IImageRegistry
:
Die folgenden Methoden dienen der Registrierung eines
Image Handle
zu einer
Image Konstante
:
1 void registerImageConstant(IImageConstant key, IImageHandle imageHandle); 2 3 void registerImageConstant(IImageConstant key, IImageDescriptor descriptor); 4 5 void registerImageConstant(IImageConstant key, URL url); 6 7 void registerImageConstant(IImageConstant key, IImageConstant substitude); 8 9 void registerImageConstant(IImageConstant key, IImageProvider provider);
Die erste Methode macht die Registrierung explizit. Diese wird normalerweise nur von der SPI Implementierung verwendet, welche das Image Handle erzeugt, zum Beispiel mit Hilfe eines Image Descriptors, welchen man mit der Methode in Zeile 3 übergeben kann.
Die Methode in Zeile 5 bietet eine verkürzte Schreibweise zur Verwendung eines UrlImageDescriptor.
Die nächste Methode in Zeile 7 ersetzt ein Image durch ein
anderes, welches durch eine Image Konstante
(substitude
) definiert ist. Die Image
Konstante für das substitude
muss zum
Zeitpunkt des Aufrufs
available
sein, was bedeutet, dass bereits ein Image Handle dafür
registriert sein muss. [22]. Es ist für die Ausführung der Methode nicht
notwendig, dass für den Quell key
bereits
ein Handle registriert ist.
Die letzte Methode in Zeile 9 ersetzt auch eine vorhandene
Registrierung. Dazu wird bei Bedarf vorab der Image Provider
provider
(mit seinem eigenen Schlüssel)
registriert, wenn er noch nicht vorhanden ist. Das Image,
welches der Provider liefert ist dadurch sowohl für die Image
Konstante key
als auch für die Image
Konstante des provider
verfügbar. Es ist
für die Ausführung der Methode nicht notwendig, dass für den
Quell key
bereits ein Handle registriert
ist.
Mit allen oben aufgeführten Methoden kann auch ein bereits registriertes Image Handle durch ein anderes ersetzt (substituiert) werden, jedoch nur, wenn dieses nicht bereits initialisiert wurde (nicht initialisierte aber registrierte oder verfügbare Handles stellen kein Problem dar).
Würde man ein bereits initialisiertes Image aus der Registry
entfernen (indem man ein neues Image Handle für den
key
setzt), ohne das bisherige,
initialisierte Handle vorab zu
disposen, würde man
dadurch ein potentielles Speicherleck provozieren, da zum
Beispiel unter SWT das native Image nicht mehr disposed werden
würde, wodurch das SWT Display eine Referenz darauf behält.
Würde man das alte Handle automatisch disposen, würde man
einen potentiellen Folgefehler provozieren, dessen Ursache nur
schwer zu finden ist, da er sich erst später auswirken kann.
Man kann wie folgt prüfen, ob ein Image Handle für eine Image
Konstante initialisiert ist:
if (!registry.isImageInitialized(IconsSmall.DISK)) { registry.registerImageConstant(IconsSmall.DISK, SilkIcons.DISK); }
Hinweis: Um das Problem grundsätzlich zu vermeiden, wird empfohlen, Registrierungen und Substituierungen immer mit Hilfe eines Toolkit Interceptor durchzuführen. Dadurch ist sichergestellt, dass die Registrierung stattfindet, bevor ein Image initialisiert werden kann.
Das folgende Beispiel zeigt, wie logische Icons einer Bibliothek durch konkrete ersetzt werden:
1 registry.registerImageConstant(IconsSmall.OK, IconLib_16x16.TICK); 2 registry.registerImageConstant(IconsSmall.EDIT, IconLib_16x16.PENCIL); 3 registry.registerImageConstant(IconsSmall.REFRESH, IconLib_16x16.RECYCLE); 4 registry.registerImageConstant(IconsSmall.UNDO, IconLib_16x16.ARROW_UNDO); 5 registry.registerImageConstant(IconsSmall.CANCEL, IconLib_16x16.CANCEL); 6 registry.registerImageConstant(IconsSmall.ERROR, IconLib_16x16.ERROR);
Die folgende Methode liefert ein Image Handle für eine Image Konstante:
IImageHandle getImageHandle(IImageConstant key);
Diese Methode wird in der Regel nur von der SPI Implementierung verwendet, um für eine Image Konstante das registrierte Image Handle zu erhalten.
Die folgenden Methoden können verwendet werden, um Einträge aus der Image Registry zu entfernen.
void unRegisterImageConstant(IImageConstant key); void unRegisterImage(IImageCommon image);
Dabei werden auch immer die zugehörigen Image Handles disposed, falls diese bereits initialisiert wurden. Man sollte daher nur Images deregistrieren, wenn diese nicht mehr verwendet werden.
Die Methode unregisterImageConstant()
kann
auch für Images
verwendet werden.
Mit Hilfe der folgenden Methode kann geprüft werden, ob eine Image Konstante verfügbar ist:
boolean isImageAvailable(IImageConstant key);
Dies ist der Fall, wenn entweder ein
Image Handle für den
key
registriert, oder die Konstante ein
IImageProvider ist.
Mit Hilfe der folgenden Methode kann geprüft werden, ob für eine Image Konstante ein Image Handle registriert wurde:
boolean isImageRegistered(IImageConstant key);
Hinweis: Wenn die Methode
false
zurückliefert, folgt daraus
nicht, dass der
key
auch nicht available
ist (da es sich um einen IImageProvider
handeln könnte).
Mit Hilfe der folgenden Methode kann geprüft werden, ob für eine Image Konstante ein initialisiertes Image Handle existiert:
boolean isImageInitialized(IImageConstant key);
Wird true
zurückgegeben, kann das Image
nicht mehr umregistriert werden, ohne es vorher aus der Image
Registry zu entfernen.
Hinweis: Die Methode führt die Prüfung durch, ohne dabei einen Image Provider implizit zu registrieren. Der folgende Aufruf ist daher keine geeignete Alternative:
1 IImageHandle imageHandle = registry.getImageHandle(SilkIcons.ACCEPT); 2 if (imageHandle.isInitialized()){ 3 //do something 4 }
Durch den Aufruf in Zeile 1 wird, wenn noch kein Image Handle existiert, einer erzeugt, da die Image Konstanten der Silk Icons Bibliothek Image Provider sind.
[22]
Oder die Image Konstante des substitude
muss ein selbstbeschreibender
Image Provider sein.
Wird dieser jedoch nicht explizit in eine
IImageConstant
gecastet, wird in diesem Fall die
Signatur in Zeile 9 verwendet.