Es folgt eine Beschreibung der Methoden der Schnittstelle
IGenericWidgetFactory
:
Die folgenden Methoden dienen der Erzeugung von Widgets:
<WIDGET_TYPE extends IWidgetCommon, DESCRIPTOR_TYPE extends IWidgetDescriptor<WIDGET_TYPE>> WIDGET_TYPE create(DESCRIPTOR_TYPE descriptor); <WIDGET_TYPE extends IWidgetCommon, DESCRIPTOR_TYPE extends IWidgetDescriptor<WIDGET_TYPE>> WIDGET_TYPE create(Object parentUiReference, DESCRIPTOR_TYPE descriptor);
Die erste Methode erzeugt Root Widgets, welche keinen Parent
hat, die zweite Methode erzeugt ein Kind Widget, wobei die
native UI Refrenz des Vaters übergeben wird. Client Code ruft
die zweite Methode im Normalfall nicht direkt auf, außer bei
der Erstellung eigener
Widget Bibliotheken in einer
IWidgetFactory
.
Die erste Methode kann zum Beispiel für die Erzeugung eines Root Frame verwendet werden:
final IFrame rootFrame = Toolkit.getWidgetFactory().create(BPF.frame());
Das gleiche kann man aber auch wie folgt schreiben:
final IFrame rootFrame = Toolkit.createRootFrame(BPF.frame());
<WIDGET_TYPE extends IWidgetCommon, DESCRIPTOR_TYPE extends IWidgetDescriptor<WIDGET_TYPE>> void register( Class<? extends DESCRIPTOR_TYPE> descriptorClass, IWidgetFactory<WIDGET_TYPE, ? extends DESCRIPTOR_TYPE> widgetFactory); <WIDGET_TYPE extends IWidgetCommon, DESCRIPTOR_TYPE extends IWidgetDescriptor<WIDGET_TYPE>> void unRegister(Class<? extends DESCRIPTOR_TYPE> descriptorClass);
Die erste Methode registriert eine
IWidgetFactory
für einen definierten
BluePrint Typ. Dabei darf für diesen Typ noch kein Widget
registriert sein. Möchte man explizit eine Widget Factory
ersetzen, um zum Beispiel eine
vorhandene
Widget Implementierung auszutauschen, muss man den
BluePrint Typ vorab per unRegister()
deregistrieren.
Die Schnittstelle IWidgetFactory
ist wie
folgt definiert:
1 public interface IWidgetFactory 2 <WIDGET_TYPE extends IWidgetCommon, 3 DESCRIPTOR_TYPE extends IWidgetDescriptor<WIDGET_TYPE>> { 4 5 WIDGET_TYPE create(Object parentUiReference, DESCRIPTOR_TYPE descriptor); 6 }
Das folgende Beispiel zeigt eine typische Implementierung:
1 final class BeanFormFactory<BEAN_TYPE> implements
2 IWidgetFactory<IBeanForm<BEAN_TYPE>, IBeanFormBluePrint<BEAN_TYPE>> {
3
4 @Override
5 public IBeanForm<BEAN_TYPE> create(
6 final Object parentUiReference,
7 final IBeanFormBluePrint<BEAN_TYPE> bluePrint) {
8
9 final IComposite composite = Toolkit.getWidgetFactory().create(
10 parentUiReference,
11 BPF.composite());
12
13 return new BeanFormImpl<BEAN_TYPE>(composite, bluePrint);
14 }
15 }
In Zeile 9 wird mit Hilfe der Generic Widget Factory ein
Composite erzeugt. Dieses wird in Zeile 13 der
BeanFormImpl
übergeben. Diese verwendet das
IComposite
um das Formular darin
darzustellen.
Die folgende Methode liefert eine
IWidgetFactory
für einen BluePrint Typ:
<WIDGET_TYPE extends IWidgetCommon, DESCRIPTOR_TYPE extends IWidgetDescriptor<WIDGET_TYPE>> IWidgetFactory<WIDGET_TYPE, DESCRIPTOR_TYPE> getFactory( Class<? extends DESCRIPTOR_TYPE> descriptorClass);
Falls für den BluePrint Typ keine Factory registriert ist,
wird null
zurückgegeben.
Die folgenden Methoden können verwendet werden, um alle Widgets oder Widget Factories für einen bestimmten Typ zu dekorieren:
<WIDGET_TYPE extends IWidgetCommon, DESCRIPTOR_TYPE extends IWidgetDescriptor<WIDGET_TYPE>> void addWidgetDecorator( Class<? extends DESCRIPTOR_TYPE> descriptorClass, IDecorator<WIDGET_TYPE> decorator); <WIDGET_TYPE extends IWidgetCommon, DESCRIPTOR_TYPE extends IWidgetDescriptor<WIDGET_TYPE>> void addWidgetFactoryDecorator( Class<? extends DESCRIPTOR_TYPE> descriptorClass, IDecorator<IWidgetFactory<WIDGET_TYPE, ? extends DESCRIPTOR_TYPE>> decorator);
Weitere Information finden sich im Abschnitt Austauschen und Dekorieren von Widgets.
Die folgenden Methoden können verwendet werden, um einen Widget Factory Listener hinzuzufügen und zu entfernen:
void addWidgetFactoryListener(IWidgetFactoryListener listener); void removeWidgetFactoryListener(IWidgetFactoryListener listener);
Ein IWidgetFactoryListener
hat die folgende
Methode:
void widgetCreated(IWidgetCommon widget);
Diese Methode wird immer aufgerufen, wenn ein Widget erzeugt wird. Dies kann zum Beispiel für Debugging Zwecke oder für JUnit Tests interessant sein. Der folgende Listener wurde einer Applikation vor dem Start hinzugefügt:
1 public final class WidgetFactoryListener implements IWidgetFactoryListener { 2 3 private final Set<IWidget> allWidgets; 4 private final Set<IWidget> undisposedWidgets; 5 6 public WidgetFactoryListener() { 7 this.allWidgets = new HashSet<IWidget>(); 8 this.undisposedWidgets = new HashSet<IWidget>(); 9 } 10 11 @Override 12 public void widgetCreated(final IWidgetCommon widgetCommon) { 13 if (widgetCommon instanceof IWidget) { 14 final IWidget widget = (IWidget) widgetCommon; 15 allWidgets.add(widget); 16 undisposedWidgets.add(widget); 17 widget.addDisposeListener(new IDisposeListener() { 18 @Override 19 public void onDispose() { 20 undisposedWidgets.remove(widget); 21 } 22 }); 23 } 24 } 25 26 @Override 27 public String toString() { 28 return "allWidgetsCount=" 29 + allWidgets.size() 30 + ", undisposedWidgetsCount=" 31 + undisposedWidgets.size(); 32 } 33 34 }
Nach dem Beenden wurde die toString()
Methode aufgerufen. Das führte zu folgender Ausgabe:
allWidgetsCount=48, undisposedWidgetsCount=0
Anschließend wurde in der Implementierung von
IContainer
ein Fehler eingebaut, so dass
die Kinder eines Containers nicht mehr disposed wurden. Nach
erneutem Start und Beenden ergab sich die folgende Ausgabe:
allWidgetsCount=48, undisposedWidgetsCount=45