6.1.3. Jowidgets Code in Swt / RCP Projekte integrieren

Es folgen spezielle Informationen und Beispiele für die Integration von jowidgets Code in Projekte, welche auf dem Standard Widget Toolkit (Swt) basieren.

SwtToJoFramesSnipped

Das SwtToJoFramesSnipped demonstriert die Erzeugung von Fenstern innerhalb einer nativen SWT Applikation:

  1  package org.jowidgets.examples.swt.snipped;
  2  
  3  import net.miginfocom.swt.MigLayout;
  4  
  5  import org.eclipse.swt.SWT;
  6  import org.eclipse.swt.events.SelectionAdapter;
  7  import org.eclipse.swt.events.SelectionEvent;
  8  import org.eclipse.swt.widgets.Button;
  9  import org.eclipse.swt.widgets.Display;
 10  import org.eclipse.swt.widgets.Shell;
 11  import org.jowidgets.api.toolkit.Toolkit;
 12  import org.jowidgets.api.widgets.IFrame;
 13  import org.jowidgets.api.widgets.blueprint.IDialogBluePrint;
 14  import org.jowidgets.api.widgets.blueprint.IFrameBluePrint;
 15  import org.jowidgets.common.types.Dimension;
 16  import org.jowidgets.tools.widgets.blueprint.BPF;
 17  
 18  public final class SwtToJoFramesSnipped {
 19  
 20      private SwtToJoFramesSnipped() {}
 21  
 22      public static void main(final String[] args) throws Exception {
 23          final Display display = new Display();
 24  
 25          final Shell shell = new Shell(display);
 26          shell.setSize(1024, 768);
 27          shell.setLayout(new MigLayout("", "[]", "[][]"));
 28  
 29          //add button to open a jowidgets root frame
 30          final Button frameButton = new Button(shell, SWT.NONE);
 31          frameButton.setText("Create root frame");
 32          frameButton.addSelectionListener(new SelectionAdapter() {
 33  
 34              @Override
 35              public void widgetSelected(final SelectionEvent e) {
 36                  final IFrameBluePrint frameBp = BPF.frame("Jowidgets Root Frame");
 37                  frameBp.setSize(new Dimension(400, 300));
 38                  frameBp.setAutoDispose(true);
 39                  final IFrame frame = Toolkit.createRootFrame(frameBp);
 40                  frame.add(BPF.textLabel("This is a jowidgets root frame"));
 41                  frame.setVisible(true);
 42              }
 43  
 44          });
 45  
 46          //add button to open a jowidgets modal dialog
 47          final Button dialogButton = new Button(shell, SWT.NONE);
 48          dialogButton.setText("Create dialog");
 49          dialogButton.addSelectionListener(new SelectionAdapter() {
 50  
 51              @Override
 52              public void widgetSelected(final SelectionEvent e) {
 53                  final IDialogBluePrint dialogBp = BPF.dialog("Jowidgets dialog");
 54                  dialogBp.setSize(new Dimension(400, 300));
 55                  final IFrame dialog = Toolkit.getWidgetFactory().create(shell, dialogBp);
 56                  dialog.add(BPF.textLabel("This is a jowidgets modal dialog"));
 57                  dialog.setVisible(true);
 58              }
 59  
 60          });
 61  
 62          shell.open();
 63          while (!shell.isDisposed()) {
 64              if (!display.readAndDispatch()) {
 65                  display.sleep();
 66              }
 67          }
 68          display.dispose();
 69      }
 70  
 71  }
SwtToJoWrapper

Um für ein Swt Composite ein IComposite Wrapper zu erzeugen, kann man die Utility Klasse SwtToJoWrapper verwenden, welche sich im Modul org.jowidgets.spi.impl.swt.addons befindet. Der folgende Code zeigt einen Teil der Implementierung:

  1  public final class SwtToJoWrapper {
  2  
  3      private SwtToJoWrapper() {}
  4  
  5      public static IComposite create(final Composite composite) {
  6          Assert.paramNotNull(composite, "composite");
  7          final IComposite result = Toolkit.getWidgetWrapperFactory().createComposite(composite);
  8          composite.addDisposeListener(new DisposeListener() {
  9              @Override
 10              public void widgetDisposed(final DisposeEvent e) {
 11                  result.dispose();
 12              }
 13          });
 14          return result;
 15      }
 16  
 17  }

In Zeile 8 wird auf dem SWT Composite ein DisposeListener hinzugefügt, der dasIComposite Wrapper disposed, sobald das SWT Composite disposed wird. Dies ist im Normalfall genau da gewünschte Verhalten.

Das folgende Beispiel demonstriert die Verwendung:

  1      final IComposite joComposite = SwtToJoWrapper.create(swtComposite);
SwtToJoCompositeSnipped

Das SwtToJoCompositeSnipped demonstriert die Erzeugung eines IComposite Wrapper innerhalb einer nativen SWT Applikation:

  1  import org.eclipse.swt.SWT;
  2  import org.eclipse.swt.layout.FillLayout;
  3  import org.eclipse.swt.widgets.Composite;
  4  import org.eclipse.swt.widgets.Display;
  5  import org.eclipse.swt.widgets.Shell;
  6  import org.jowidgets.api.widgets.IComposite;
  7  import org.jowidgets.api.widgets.IInputField;
  8  import org.jowidgets.common.widgets.controller.IInputListener;
  9  import org.jowidgets.common.widgets.layout.MigLayoutDescriptor;
 10  import org.jowidgets.spi.impl.swt.addons.SwtToJoWrapper;
 11  import org.jowidgets.tools.widgets.blueprint.BPF;
 12  
 13  public final class SwtToJoCompositeSnipped {
 14  
 15      private SwtToJoCompositeSnipped() {}
 16  
 17      public static void main(final String[] args) throws Exception {
 18          //create a swt display
 19          final Display display = new Display();
 20  
 21          //create a swt shell
 22          final Shell shell = new Shell(display);
 23          shell.setSize(400, 300);
 24          shell.setText("SwtToJo composite snipped");
 25          shell.setLayout(new FillLayout());
 26  
 27          //create a swt composite
 28          final Composite swtComposite = new Composite(shell, SWT.NONE);
 29  
 30          //create a jowidgets composite wrapper and do some jowidgets stuff
 31          final IComposite joComposite = SwtToJoWrapper.create(swtComposite);
 32          joComposite.setLayout(new MigLayoutDescriptor("[][grow]", "[]"));
 33  
 34          //add a label
 35          joComposite.add(BPF.textLabel("Name"));
 36  
 37          //add a input field for double values
 38          final IInputField<String> nameField = joComposite.add(BPF.inputFieldString(), "grow x");
 39          nameField.addInputListener(new IInputListener() {
 40              @Override
 41              public void inputChanged() {
 42                  //CHECKSTYLE:OFF
 43                  System.out.println("Hello " + nameField.getValue());
 44                  //CHECKSTYLE:ON
 45              }
 46          });
 47  
 48          //open the swt shell and start event dispatching
 49          shell.open();
 50          while (!shell.isDisposed()) {
 51              if (!display.readAndDispatch()) {
 52                  display.sleep();
 53              }
 54          }
 55          display.dispose();
 56      }
 57  }

Siehe auch PDF Version dieses Dokuments, Jowidgets API Spezifikation