3.14.5. Die Image Registry

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.

Image Registry Instanz

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:

Methoden zur Registrierung und zum Austauschen von Image Handles

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.

Austauschen von Images

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);
Zugriff auf ein Image Handle

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.

Deregistrierung von Objekten

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.

Der Available Status

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.

Der Registered Status

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).

Der Initialized Status

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.


Siehe auch PDF Version dieses Dokuments, Jowidgets API Spezifikation