Thema dieser Dokumentation / Das FirstSpirit 5 Modul- / Komponenten-Modell / Von Gadgets, Aspects, Brokern und Agents / Aspekte (SwingGadget) / Aspekt: TransferSupplying
Aspekt: TransferSupplying
Aspect: TransferSupplying
Package: de.espirit.firstspirit.ui.gadgets.aspects.transfer
Abhängig von der SwingGadget-Implementierung kann eine grafische Eingabekomponente (d.h. die Komponente muss java.awt.Component implementieren) einen generischen Zugriff auf ihre Inhalte bieten, um Objekte eines bestimmten Typs (Transfer-Typ) per Drag & Drop in andere Eingabekomponenten zu übernehmen. Dabei unterscheidet man zwei Aspekte, das Liefern und das Empfangen eines Objekts. Der Aspekt TransferSupplying ist für das Liefern eines Objekts per „Drag“ verantwortlich.
Dieser Aspekt kann der SwingGadget-Implementierung über die Implements-Bedingung und den Aufruf von addAspect(…) im öffentlichen Konstruktor der SwingGadget-Implementierung hinzugefügt werden:
public class mySwingGadget implements TransferSupplying {
...
public mySwingGadget(final SwingGadgetContext<myGomForm> context) {
super(context);
addAspect(TransferSupplying.TYPE, this);
}
...
}
Mithilfe der Methode void registerSuppliers(@NotNull SupplierHost host) muss die Komponente (oder ein Teil der Komponente, beispielsweise ein Eingabefeld) zunächst als Lieferant (Supplier) für die zu transferierenden Objekte registriert werden. Dazu werden vorab ein (oder mehrere) neue Supplier-Objekte erzeugt. Das Interface Supplier<T> stellt die Methode List<T> supply() für die Transferbehandlung zur Verfügung. Das Interface ist typisiert, d. h. der zu verwaltende Wertetyp (beispielsweise Media) wird über die (Java 5) Generics-Funktionalität innerhalb der Implementierung festgelegt.
Der Methode void registerSuppliers(@NotNull SupplierHost host) wird ein Objekt vom Typ SupplierHost übergeben, auf dem die erzeugten Supplier anschließend registriert werden müssen. Bei der Registrierung eines Suppliers muss ein Transfer-Typ übergeben werden. Der übergebene Transfer-Typ muss zum Daten-Container-Typ T des Suppliers passen.
Ein Transfer-Typ wird über einen TransferAgent erzeugt. Über den SwingGadgetContext (siehe SwingGadgetContext) kann eine Instanz vom Typ SpecialistsBroker (siehe Das Interface SpecialistsBroker) angefordert werden. Ein SpecialistsBroker bietet über unterschiedliche „Spezialisten“ Zugriff auf bestimmte Dienste oder Informationen. Für das Erzeugen von Transfer-Typen, wird ein Spezialist vom Typ TransferAgent benötigt. Dieser kann auf dem SpecialistsBroker mithilfe der Methode <S> S requireSpecialist (SpecialistType<S> type) angefordert werden. Bei der Registrierung eines Suppliers (auf dem SupplierHost) wird neben dem Transfer-Typ noch das Ziel der Drag-Aktion und der entsprechende Supplier übergeben:
public void registerSuppliers(@NotNull final SupplierHost host) {
final SupplierHost.Supplier<Media> supplier =
new SupplierHost.Supplier<Media>() {
public List<Media> supply() {
final IDProvider element = _referenceField.getValue();
return element instanceof Media ?
Collections.singletonList((Media) element) :
Collections.<Media>emptyList();
}
};
final TransferAgent transferAgent =
getBroker().requireSpecialist(TransferAgent.TYPE);
final TransferType<Media> pictureType =
transferAgent.getMediaType(Picture.class);
host.register(_preview, pictureType, supplier);
host.register(_referenceField, pictureType, supplier);
}
Im Beispiel werden zwei Ziele, ein Eingabefeld (_referenceField) und ein Vorschaubereich (_preview), innerhalb der Eingabekomponente sowie ein Transfer-Typ für Objekte vom Typ PICTURE registriert. Damit können die enthaltenen Medien (ausschließlich Bilder) aus dem Eingabefeld oder dem Vorschaubereich der Eingabekomponente auf andere Komponenten gezogen werden („Drag“).
Die Drag- & Drop-Funktionalität einer Eingabekomponente kann ausschließlich über die Aspekte TransferHandling und TransferSupplying behandelt werden. Dazu müssen lediglich die dafür vorgesehenen Lieferanten und Empfänger registriert werden. Das umliegende FirstSpirit-Gadget-Framework behandelt dann alle weiteren Funktionen, beispielsweise das Drop-Handling. Beide Aspekte sind eigenständig, können also getrennt voneinander implementiert werden.