1 package eu
.etaxonomy
.taxeditor
.prototype2
.model
;
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
;
20 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
21 import eu
.etaxonomy
.taxeditor
.prototype2
.view
.TaxonomicTreeViewer
;
23 public class NameTreeContentProvider
extends ObservableListContentProvider
24 implements ITreeContentProvider
{
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();
32 public Object
getParent(Object element
) {
33 return ((Taxon
) element
).getTaxonomicParent();
36 public boolean hasChildren(Object element
) {
37 return ((Taxon
) element
).hasTaxonomicChildren();
40 private IObservableList observableList
;
42 private Viewer viewer
;
44 private IListChangeListener listener
= new IListChangeListener() {
45 public void handleListChange(ListChangeEvent event
) {
46 if (viewer
.getControl().isDisposed()) {
49 ListDiffEntry
[] differences
= event
.diff
.getDifferences();
50 for (int i
= 0; i
< differences
.length
; i
++) {
51 ListDiffEntry entry
= differences
[i
];
53 if (entry
.isAddition()) {
55 knownElements
.add(entry
.getElement());
57 ((TaxonomicTreeViewer
) viewer
).add(
58 ((Taxon
) entry
.getElement()).getTaxonomicParent(),
62 knownElements
.remove(entry
.getElement());
64 ((TaxonomicTreeViewer
) viewer
).remove(entry
.getElement());
70 private IObservableSet knownElements
;
75 public NameTreeContentProvider() {
77 Assert
.isNotNull(Realm
.getDefault());
79 observableList
= new WritableList(SWTObservables
.getRealm(Display
.getDefault()));
80 knownElements
= new WritableSet(SWTObservables
.getRealm(Display
.getDefault()));
83 public Object
[] getElements(Object inputElement
) {
84 return observableList
.toArray();
87 public void dispose() {
88 observableList
.removeListChangeListener(listener
);
91 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
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$
99 setInput((IObservableList
) newInput
);
105 private void setInput(IObservableList list
) {
108 list
= new WritableList(SWTObservables
.getRealm(Display
.getDefault()));
111 if (observableList
!= null) {
112 observableList
.removeListChangeListener(listener
);
115 knownElements
.clear();
117 observableList
= list
;
119 knownElements
.addAll(list
);
122 observableList
.addListChangeListener(listener
);
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.
130 public IObservableSet
getKnownElements() {
131 return knownElements
;