Eclipse RCP: Designfrage

Vatar

Erfahrenes Mitglied
Hallo alle zusammen

Ich hätte wieder mal eine Frage zum RCP-Framework. Ich habe eine View welche mir meine Objekte in einer Liste anzeigt und die Aktionen Löschen und Neu anbietet. Für jede dieser Aktionen habe ich ActionClass definiert (abgeleitet von org.eclipse.jface.action.Action).

Mein Problem ist jetzt, dass nach dem löschen oder hinzufügen von Objekten die Liste aktualisiert werden müsste (also irgenwas wie inputchanged und ein refresh), ich aber keine Ahnung habe wie ich darauf zugreifen soll da diese ja in einer anderen Klasse hängt. Ich finde es unschön irgendwelche Referenzen auf Objekte durch 3 Klassen mitzuschleifen und deshalb wollte ich mal wissen was für ein Design ihr empfehlen würdet.

Ich dachte da eventuell an eine Art Registry in der Plugin-Klasse (da man diese ja von überall her aufrufen kann - Thema singleton).

Danke
 
Hallo,

schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;

/**
 * @author Tom
 */
public class JFaceContentChangeAwarenessExample extends ApplicationWindow {

  public JFaceContentChangeAwarenessExample(Shell parentShell) {
    super(parentShell);
    setBlockOnOpen(true);
  }

  ListViewer listViewer;


  @Override
  protected boolean showTopSeperator() {
    return false;
  }


  @Override
  protected Control createContents(Composite parent) {
    parent.setLayout(new FillLayout());
    this.listViewer = createListViewer(parent);
    createCreateButton(parent);
    createRemoveButton(parent);
    return parent;
  }


  private void createCreateButton(Composite parent) {
    Button button = new Button(parent, SWT.PUSH);
    button.setText("create");
    button.addSelectionListener(new SelectionAdapter() {
      @Override
      public void widgetSelected(SelectionEvent e) {
        listViewer.add(String.valueOf(System.currentTimeMillis()));
      }
    });
  }


  /**
   * @param parent
   */
  private void createRemoveButton(Composite parent) {
    Button button = new Button(parent, SWT.PUSH);
    button.setText("remove");
    button.addSelectionListener(new SelectionAdapter() {
      @Override
      public void widgetSelected(SelectionEvent e) {
        Object selectedElement = ((IStructuredSelection) listViewer.getSelection()).getFirstElement();
        if (null != selectedElement) {
          listViewer.remove(selectedElement);
        }
      }
    });
  }


  /**
   * @param parent
   */
  private ListViewer createListViewer(Composite parent) {
    ListViewer listViewer = new ListViewer(parent);
    listViewer.setContentProvider(createListContentProvider());
    listViewer.setInput(createListInput());
    return listViewer;
  }


  private Object[] createListInput() {
    return new Object[] { "AAA", "BBB", "CCC" };
  }


  private IContentProvider createListContentProvider() {
    IStructuredContentProvider contentProvider = new ArrayContentProvider();
    return contentProvider;
  }


  /**
   * @param args
   */
  public static void main(String[] args) {
    new JFaceContentChangeAwarenessExample(new Shell(SWT.MIN)).open();
  }
}
Reicht dir das in den Viewern "eingebaute" add/remove/update nicht? Welche ContentProvider / LabelProvider verwendest du denn? Musst du bei einer Änderung noch andere Sachen machen ausser das Control zu aktualisieren? Mit JFace Databinding hast du hier etwas mehr Kontrolle.

Gruß Tom
 
Danke

Die add und remove Methoden hab ich doch glatt übersehen :rolleyes:

@ Thom
Dein Ansatz nützt mir leider nichts, da meine Action in einer seperaten Klasse liegt und somit keinen Zugriff auf den Viewer hat. Ich habe mich in der Mailingliste umgehört und ich werde es jetzt mal über Commands (werden in der plugin.xml deklariert) versuchen. Damit soll es kaum Abhängigkeiten geben.
 
Zurück