Package de.willuhn.jameica.gui.extension

Extension-System von Jameica.

Jameica kann zwar beliebig mit Plugins erweitert werden. Diese Plugins teilen auch einen ClassPath und können über die ServiceFactory sowie das Messaging-System miteinander kommunizieren. Sie können jedoch nicht die GUI eines anderen Plugins ändern. So kann z.Bsp. Plugin A nicht die Context-Menus von Plugin B ändern oder die Navigation eines anderen Plugins erweitern. Dies ist jedoch sinnvoll, wenn ein Plugin durch ein weiteres möglichst nahtlos um Funktionalität erweitert werden soll. Sprich: Das erweiternde Plugin soll keine eigene Navigation oder eigene Menus mitbringen sondern stattdessen die existierenden um Funktionen erweitern.
Genau für diesen Zweck existiert das Extension-System.

Auf der einen Seite befinden sich Komponenten, die sich erweitern lassen (werden durch das Interface Extandable repräsentiert). Auf der anderen Seite existieren Erweiterungen (müssen das Interface Extension implementieren), welche die Extendables um zusätzliche Funktionalität erweitern.

Schritt 1 (Registrierung der Erweiterungen):

Bevor eine erweiterbare Komponente (also ein Extendable) erweitert werden kann, muss Jameica herausfinden, welche Erweiterungen überhaupt existieren.
Bsp.: Bevor der Navigations-Baum (linkes Frame in Jameica) gezeichnet wird, prüft Jameica für jedes Element des Baumes, ob Erweiterungen vorliegen. Ist dies der Fall, wird jeweils deren Methode extend(Extendable) aufgerufen.
Eine Extension muss im System registriert sein, um angesprochen werden zu können. Dies geschieht wiederrum automatisch (durch Definition der Erweiterungen in der Manifest-Datei (plugin.xml)) oder manuell durch Aufruf von ExtensionRegistry#register(Extension e, String[] extendableIDs)).
Format der Registrierung in plugin.xml:


<plugin>
  [...]
  
  <menu>
    <item id="id.menu.erweiterbar" name=...../>
  </menu>

  <navigation>
    <item name=...../>
  </navigation>

  <services>
    <service name=...../>
  </services>
  
  
  <extensions>
    <extension class="name.der.java.Klasse" extends="id.menu.erweiterbar,id.extendable2,..." />
  </extensions>
  
</plugin>
    

Schritt 2 (Durchführung der Erweiterung):

Jedes Extendable besitzt eine ID (Funktion getExtendableID()), über die es in ganz Jameica eindeutig identifizierbar ist. Bevor die erweiterbare Komponente nun aktiviert wird (bei Context-Menus ist das z.Bsp. der Moment unmittelbar vor dem Zeichnen auf dem Bildschirm) muss sie der ExtensionRegistry Bescheid geben, dass sie nun noch erweitert werden kann. Bsp:


public class AddressList extends ContextMenu implements Extendable
{
  public AddressList()
  {
    addItem(new CheckedContextMenuItem(i18n.tr("Öffnen"),new AddressNew()));
    addItem(ContextMenuItem.SEPARATOR);
    addItem(new CheckedContextMenuItem(i18n.tr("Löschen..."), new AddressDelete()));
    addItem(ContextMenuItem.SEPARATOR);
    addItem(new ContextMenuItem(i18n.tr("Neue Adresse..."), new AddressNeu()));
    
    // Uebergabe an Extension-Registry zur eventuellen Erweiterung um weitere Eintraege.
    ExtensionRegistry.extend(this);
  }
}