JavaScript fuer Eclipse-Entwickler
Stabilität der Anwendung dar.
Abbildung 3.1: Funktionsweise des Browser-Widgets
Die Methode evaluate führt einen gegebenen String unmittelbar innerhalb des Browser-Widgets als JavaScript-Code aus. Sie gibt ein Java-Objekt zurück, das einen JavaScript-Wert repräsentiert, beispielsweise als String , Double oder Boolean. Wird im JavaScript-Code kein return -Statement verwendet, ist das Ergebnis null . Sollte beim Ausführen ein Fehler auftreten, wirft evaluate eine SWTException . Leider gibt die Exception keine Auskunft über den Fehler selbst, womit die gelegentliche Fehlersuche nicht unbedingt erleichtert wird. Es gibt eine weitere, sehr ähnliche Methode namens execute (seit RAP 1.1), sie bietet jedoch keinen Rückgabewert, wirft im Fehlerfall keine Exception und ist daher nicht zu empfehlen.
Die Klasse BrowserFunction bietet die Möglichkeit, Java-Code aus JavaScript heraus aufzurufen. Dazu erzeugt man eine neue Instanz von BrowserFunction und überschreibt dabei die Methode function . Der Konstruktor erhält als erstes Argument das Browser-Widget und als zweites den Namen, über den die Funktion in JavaScript aufgerufen werden kann. Es ist möglich, einer Browserfunktion beim Aufruf beliebig viele Argumente zu übergeben oder ein Java-Objekt an den Aufrufer der JavaScript-Funktion zurückzugeben, zum Beispiel folgendermaßen:
new BrowserFunction( browser, "callJava" ) {
public Object function( Object[] arguments ) {
System.out.println( ( String )arguments[ 0 ] );
return "bar";
}
};
In JavaScript könnte nun folgender Aufruf ausgeführt werden: alert( callJava( "foo" ) ); . Dadurch würde "foo" auf der Java-Konsole und "bar" im Browser ausgegeben.
3.2 Anlegen des Custom Widgets
Auch wenn RAP-Anwendungen ohne OSGi betrieben werden können, ist es eine gute Praxis, wiederverwendbare Komponenten für die Verwendung im OSGi-Umfeld vorzubereiten. Deshalb sollte das Custom Widget in einem OSGi Bundle verpackt werden. Wir erzeugen dazu ein neues Plug-in-Projekt und definieren eine Bundle Dependency auf org.eclipse.rap.rwt . In diesem Bundle legen wir eine neue Klasse CKEditor an, die sich von org.eclipse.swt.widgets.Composite ableitet. Diese Vorgehensweise entspricht den Richtlinien für Custom-Widget-Entwicklung mit SWT [2]. Im Konstruktor erzeugen wir als einziges Kind ein Browser-Widget und passen es mittels FillLayout an die volle Größe seines Parents an. Damit das Browser-Widget nicht den Hintergrund des Composites überschreibt, wird die Eigenschaft BackgroundMode auf SWT.INHERIT_FORCE gesetzt. Dadurch wirkt die setBackground -Methode des Custom Widgets weiterhin wie erwartet. Der URL wird von einer Methode ermittelt, die wir später implementieren (Listing 3.1).
public CKEditor( Composite parent, int style ) {
super( parent, style );
super.setLayout( new FillLayout() );
this.setBackgroundMode( SWT.INHERIT_FORCE );
browser = new Browser( this, SWT.BORDER );
browser.setUrl( getURL() );
}
Listing 3.1
3.3 Laden der JavaScript-Komponente
Mit setUrl wird ein HTML-Dokument geladen, das den eigentlichen Editor enthält. Wir erstellen es selbst mit einem beliebigen Texteditor. Es besteht mindestens aus dem HTML-Grundgerüst und zwei SCRIPT Tags. Das erste Tag wird zum Laden des JavaScript-Projekts (bei uns der CKEditor) benötigt, und das zweite beinhaltet ein minimales Initialisierungsskript. Dieses sorgt in unserem Beispiel dafür, dass eine neue Editorinstanz erzeugt und an die volle Größe des Dokuments angepasst wird. Damit es zum richtigen Zeitpunkt (nach dem Laden des restlichen Dokuments) ausgeführt wird, benutzen wir das "load"- Event des BODY Tags (Listing 3.2).