Taxonomic tree and recent name data binding works, including for adding taxonomic...
[taxeditor.git] / eclipseprojects / eu.etaxonomy.taxeditor.prototype2 / src / eu / etaxonomy / taxeditor / prototype2 / model / NameTreeContentProvider.java
1 package eu.etaxonomy.taxeditor.prototype2.model;
2
3 import java.util.Set;
4
5 import org.eclipse.core.databinding.observable.Realm;
6 import org.eclipse.core.databinding.observable.list.IListChangeListener;
7 import org.eclipse.core.databinding.observable.list.IObservableList;
8 import org.eclipse.core.databinding.observable.list.ListChangeEvent;
9 import org.eclipse.core.databinding.observable.list.ListDiffEntry;
10 import org.eclipse.core.databinding.observable.list.WritableList;
11 import org.eclipse.core.databinding.observable.set.IObservableSet;
12 import org.eclipse.core.databinding.observable.set.WritableSet;
13 import org.eclipse.core.runtime.Assert;
14 import org.eclipse.jface.databinding.swt.SWTObservables;
15 import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
16 import org.eclipse.jface.viewers.ITreeContentProvider;
17 import org.eclipse.jface.viewers.Viewer;
18 import org.eclipse.swt.widgets.Display;
19
20 import eu.etaxonomy.cdm.model.taxon.Taxon;
21 import eu.etaxonomy.taxeditor.prototype2.view.TaxonomicTreeViewer;
22
23 public class NameTreeContentProvider extends ObservableListContentProvider
24 implements ITreeContentProvider {
25
26 public Object[] getChildren(Object parentElement) {
27 Set<Taxon> children = ((Taxon) parentElement).getTaxonomicChildren();
28 observableList.addAll(children);
29 return children == null ? new Object[0] : children.toArray();
30 }
31
32 public Object getParent(Object element) {
33 return ((Taxon) element).getTaxonomicParent();
34 }
35
36 public boolean hasChildren(Object element) {
37 return ((Taxon) element).hasTaxonomicChildren();
38 }
39
40 private IObservableList observableList;
41
42 private Viewer viewer;
43
44 private IListChangeListener listener = new IListChangeListener() {
45 public void handleListChange(ListChangeEvent event) {
46 if (viewer.getControl().isDisposed()) {
47 return;
48 }
49 ListDiffEntry[] differences = event.diff.getDifferences();
50 for (int i = 0; i < differences.length; i++) {
51 ListDiffEntry entry = differences[i];
52
53 if (entry.isAddition()) {
54
55 knownElements.add(entry.getElement());
56
57 ((TaxonomicTreeViewer) viewer).add(
58 ((Taxon) entry.getElement()).getTaxonomicParent(),
59 entry.getElement());
60 } else {
61
62 knownElements.remove(entry.getElement());
63
64 ((TaxonomicTreeViewer) viewer).remove(entry.getElement());
65 }
66 }
67 }
68 };
69
70 private IObservableSet knownElements;
71
72 /**
73 *
74 */
75 public NameTreeContentProvider() {
76
77 Assert.isNotNull(Realm.getDefault());
78
79 observableList = new WritableList(SWTObservables.getRealm(Display.getDefault()));
80 knownElements = new WritableSet(SWTObservables.getRealm(Display.getDefault()));
81 }
82
83 public Object[] getElements(Object inputElement) {
84 return observableList.toArray();
85 }
86
87 public void dispose() {
88 observableList.removeListChangeListener(listener);
89 }
90
91 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
92 this.viewer = viewer;
93
94 if (newInput != null && !(newInput instanceof IObservableList)) {
95 throw new IllegalArgumentException(
96 "This content provider only works with input of type IObservableList"); //$NON-NLS-1$
97 }
98
99 setInput((IObservableList) newInput);
100 }
101
102 /**
103 * @param list
104 */
105 private void setInput(IObservableList list) {
106
107 if (list == null) {
108 list = new WritableList(SWTObservables.getRealm(Display.getDefault()));
109 }
110
111 if (observableList != null) {
112 observableList.removeListChangeListener(listener);
113 }
114
115 knownElements.clear();
116
117 observableList = list;
118
119 knownElements.addAll(list);
120
121
122 observableList.addListChangeListener(listener);
123 }
124
125 /**
126 * @return the set of elements known to this content provider. Label providers may track
127 * this set if they need to be notified about additions before the viewer sees the added
128 * element, and notified about removals after the element was removed from the viewer.
129 */
130 public IObservableSet getKnownElements() {
131 return knownElements;
132 }
133 }