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
;
24 * Adds tree functionality (get parent, get children) to ObservableListContentProvider;
25 * much code was copied almost in tact from parent class due to
26 * viewer type restrictions and private settings of variables and methods
31 public class NameTreeContentProvider
extends ObservableListContentProvider
32 implements ITreeContentProvider
{
34 public Object
[] getChildren(Object parentElement
) {
35 Set
<Taxon
> children
= ((Taxon
) parentElement
).getTaxonomicChildren();
36 observableList
.addAll(children
);
37 return children
== null ?
new Object
[0] : children
.toArray();
40 public Object
getParent(Object element
) {
41 return ((Taxon
) element
).getTaxonomicParent();
44 public boolean hasChildren(Object element
) {
45 return ((Taxon
) element
).hasTaxonomicChildren();
48 private IObservableList observableList
;
50 private Viewer viewer
;
52 private IListChangeListener listener
= new IListChangeListener() {
53 public void handleListChange(ListChangeEvent event
) {
54 if (viewer
.getControl().isDisposed()) {
57 ListDiffEntry
[] differences
= event
.diff
.getDifferences();
58 for (int i
= 0; i
< differences
.length
; i
++) {
59 ListDiffEntry entry
= differences
[i
];
61 if (entry
.isAddition()) {
63 knownElements
.add(entry
.getElement());
65 ((TaxonomicTreeViewer
) viewer
).add(
66 ((Taxon
) entry
.getElement()).getTaxonomicParent(),
70 knownElements
.remove(entry
.getElement());
72 ((TaxonomicTreeViewer
) viewer
).remove(entry
.getElement());
78 private IObservableSet knownElements
;
83 public NameTreeContentProvider() {
85 Assert
.isNotNull(Realm
.getDefault());
87 observableList
= new WritableList(SWTObservables
.getRealm(Display
.getDefault()));
88 knownElements
= new WritableSet(SWTObservables
.getRealm(Display
.getDefault()));
91 public Object
[] getElements(Object inputElement
) {
92 return observableList
.toArray();
95 public void dispose() {
96 observableList
.removeListChangeListener(listener
);
99 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
100 this.viewer
= viewer
;
102 if (newInput
!= null && !(newInput
instanceof IObservableList
)) {
103 throw new IllegalArgumentException(
104 "This content provider only works with input of type IObservableList"); //$NON-NLS-1$
107 setInput((IObservableList
) newInput
);
113 private void setInput(IObservableList list
) {
116 list
= new WritableList(SWTObservables
.getRealm(Display
.getDefault()));
119 if (observableList
!= null) {
120 observableList
.removeListChangeListener(listener
);
123 knownElements
.clear();
125 observableList
= list
;
127 knownElements
.addAll(list
);
130 observableList
.addListChangeListener(listener
);
134 * @return the set of elements known to this content provider. Label providers may track
135 * this set if they need to be notified about additions before the viewer sees the added
136 * element, and notified about removals after the element was removed from the viewer.
138 public IObservableSet
getKnownElements() {
139 return knownElements
;