Mittwoch, 5. Dezember 2012

Eclipse RCP / SWT - TreeViewer Sortierreihenfolge Teil 2

Eclipse 3.7

Problem: Knoten im TreeViewer sollen sortiert werden.

Lösung: Der ViewSorter erledigt die Sortierung. In unserem Beispiel werden die Knoten alphabetisch sortiert. Im ersten Teil dieses Artikels wurde ein Beispiel vorbereitet. Im diesem Teil soll die Sortierung hinzugefügt werden.

Schritt 1: Erzeuge die Klasse StructureViewerComparator.

import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;

public class StructureViewerComparator extends ViewerComparator {

  @Override
  public int compare(Viewer viewer, Object e1, Object e2) {
    if ((e1 instanceof MyTreeNode) && (e2 instanceof MyTreeNode)){
      return e2.toString().compareTo(e1.toString());
    }
    return 0;
  }
}

Schritt 2: In der View Klasse, wird in der createPartControl Methode dem Viewer ein neuer Comparator vom Typ StructureViewerComparator hinzugefügt.

 
public void createPartControl(Composite parent) {
  viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL
    | SWT.V_SCROLL);
  viewer.setContentProvider(new TreeContentProvider());
  viewer.setInput(new MyTreeNode(0,""));
  viewer.setComparator(new StructureViewerComparator()); //Comparator hinzugefügt
}

Schritt 3: Code ausführen!

Eclipse RCP / SWT - TreeViewer Sortierreihenfolge Teil 1

Eclipse 3.7

Problem: Knoten im TreeViewer sollen sortiert werden.

Lösung: Der ViewSorter erledigt die Sortierung. In unserem Beispiel werden die Knoten alphabetisch sortiert. Im ersten Teil dieses Artikels wird ein Beispiel vorbereitet. Im zweiten die Sortierung hinzugefügt.

Schritt 1: Erstelle die einfache TreeViewer Anwendung aus diesem Blog.

Schritt 2: Im zweiten Schritt wird das Modell der Knoten etwas abgeändert, damit eine Sortierung später nötig wird. Dazu wird der Klasse MyTreeNode ein Attribut prefix hinzugefügt, welches im Konstruktor initialisiert wird.


public class MyTreeNode {
 private int depth;
 private MyTreeNode parent = null;
 private ArrayList children;
 private String prefix; // neues Attribut

        //Übergabeparameter an den Konstruktor werden geändert 
 public MyTreeNode(int depth, String prefix) { 
  children = new ArrayList();
  this.prefix = prefix; // Initialisierung
  this.depth = depth;
 }

 ...

 public String toString() {
  StringBuffer sb = new StringBuffer();
  sb.append(prefix + " Knoten mit Tiefe ");
  sb.append(String.valueOf(depth));
  return sb.toString();
 }
        ...
}
Schritt 3: Im letzten Schritt wird an allen Stellen, an denen der Konstruktor aufgerufen wird der zweite Übergabeparameter mit einem willkürlichem String gefüllt. Dazu wird in der Klasse TreeContentProvider die Methode createChildNodes(Object parent) wie folgt geändert.

public class TreeContentProvider implements ITreeContentProvider {

...         

  public void createChildNodes(Object parent) {
    if (parent instanceof MyTreeNode) {
      MyTreeNode node = (MyTreeNode)parent;
      node.addChild(new MyTreeNode(node.getDepth() + 1, "1")); // zweiter 
      node.addChild(new MyTreeNode(node.getDepth() + 1, "5")); // Parameter 
      node.addChild(new MyTreeNode(node.getDepth() + 1, "3")); // mit beliebigen 
      node.addChild(new MyTreeNode(node.getDepth() + 1, "z")); // Werten
    }
  }
}
und zuletzt in der View Klasse die Methode createPartControl wie folgt geändert:

public void createPartControl(Composite parent) {
  viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL
    | SWT.V_SCROLL);
  viewer.setContentProvider(new TreeContentProvider());
  viewer.setInput(new MyTreeNode(0,"")); // hier ebenfalls aktualisiert
}