2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.taxeditor
.model
;
12 import java
.util
.ArrayList
;
13 import java
.util
.Collection
;
14 import java
.util
.List
;
17 import org
.apache
.log4j
.Logger
;
18 import org
.eclipse
.core
.databinding
.observable
.set
.IObservableSet
;
19 import org
.eclipse
.core
.databinding
.observable
.set
.ISetChangeListener
;
20 import org
.eclipse
.core
.databinding
.observable
.set
.SetChangeEvent
;
21 import org
.eclipse
.jface
.viewers
.ITreeContentProvider
;
22 import org
.eclipse
.jface
.viewers
.TreeViewer
;
23 import org
.eclipse
.jface
.viewers
.Viewer
;
25 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
26 import eu
.etaxonomy
.taxeditor
.TaxEditorPlugin
;
29 * An implementation of ITreeContentProvider which adds taxa displayed in the tree
30 * to the Editor session on an as-loaded basis. Listens for any changes to the
31 * set of session taxa, updates the TreeViewer accordingly.
33 * Could be re-written to implement ILazyTreeContentProvider at some point in the future.
34 * NO: sorting not possible with lazy tree.
40 public class TaxonomicTreeContentProvider
implements ITreeContentProvider
{
41 private static final Logger logger
= Logger
42 .getLogger(TaxonomicTreeContentProvider
.class);
47 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
50 public Object
[] getChildren(Object parentElement
) {
51 if (!(parentElement
instanceof Taxon
)) {
52 logger
.error("Method getChildren() expects a parentElement of type Taxon");
56 Taxon parentTaxon
= (Taxon
) parentElement
;
58 // If this does not return null, the taxon's children have already
59 // been requested during this session
60 Set
<Taxon
> childTaxa
= TaxEditorPlugin
.getDefault()
61 .getSessionTaxonomicChildren(parentTaxon
);
62 if (childTaxa
== null) {
64 removeSessionTaxaListener();
66 // Request this taxon's children for the first time
67 // during this session
68 childTaxa
= parentTaxon
.getTaxonomicChildren();
69 TaxEditorPlugin
.getDefault().addSessionTaxa(childTaxa
);
71 addSessionTaxaListener();
74 logger
.warn("returning " + childTaxa
.toString());
75 return childTaxa
.toArray();
79 public Object
getParent(Object element
) {
80 if (!(element
instanceof Taxon
)) {
83 return ((Taxon
) element
).getTaxonomicParent();
87 public boolean hasChildren(Object element
) {
88 if (!(element
instanceof Taxon
)) {
91 return ((Taxon
) element
).hasTaxonomicChildren();
95 public Object
[] getElements(Object inputElement
) {
96 // logger.warn("Get elements for " + inputElement.toString() + " with class " + inputElement.getClass());
97 // List elements = new ArrayList();
98 // if (inputElement instanceof Collection) {
99 // logger.warn("instanceof collection");
100 //// elements.addAll((Collection) inputElement);
101 // for (Object parentElement : (Collection) inputElement) {
102 // if (parentElement instanceof Taxon) {
103 // for (Object childElement : getChildren(parentElement)) {
104 // elements.add(childElement);
109 //// return TaxEditorPlugin.getDefault().getSessionRootTaxa().toArray();
110 //// return getChildren(inputElement);
111 // logger.warn("elements have " + elements.size());
112 // return elements.toArray();
117 public void dispose() {
118 removeSessionTaxaListener();
122 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
123 if (!(viewer
instanceof TreeViewer
)) {
124 throw new IllegalArgumentException(
125 "This content provider only works with viewer of type TreeViewer"); //$NON-NLS-1$
127 this.viewer
= (TreeViewer
) viewer
;
129 if (newInput
!= null && !(newInput
instanceof Collection
)) {
130 throw new IllegalArgumentException(
131 "This content provider only works with input of type Collection<Taxon>"); //$NON-NLS-1$
135 Collection
<Taxon
> input
= (Collection
<Taxon
>) newInput
;
137 } catch (ClassCastException e
) {
138 throw new IllegalArgumentException(
139 "This content provider only works with input of type Collection<Taxon>"); //$NON-NLS-1$
143 private void setInput(Collection
<Taxon
> input
) {
145 removeSessionTaxaListener();
148 TaxEditorPlugin
.getDefault().addSessionTaxa(input
);
151 addSessionTaxaListener();
154 private IObservableSet
getObservableSessionTaxonSet() {
155 return TaxEditorPlugin
.getDefault().getObservableSessionTaxa();
158 private void addSessionTaxaListener() {
159 getObservableSessionTaxonSet().addSetChangeListener(listener
);
162 private void removeSessionTaxaListener() {
163 getObservableSessionTaxonSet().removeSetChangeListener(listener
);
166 private ISetChangeListener listener
= new ISetChangeListener() {
168 public void handleSetChange(SetChangeEvent event
) {
169 if (viewer
.getControl().isDisposed()) {
172 for (Object addition
: event
.diff
.getAdditions()) {
173 if (addition
instanceof Taxon
) {
174 Taxon taxon
= (Taxon
) addition
;
175 Taxon parentTaxon
= taxon
.getTaxonomicParent();
176 if (parentTaxon
== null) {
178 // If a new root item has been added,
179 // set it as the viewer's input
180 List
<Taxon
> newInput
= new ArrayList
<Taxon
>();
182 viewer
.setInput(newInput
);
183 // viewer.setInput(TaxEditorPlugin.getDefault().getSessionRootTaxa());
185 viewer
.add(parentTaxon
, taxon
);
189 for (Object removal
: event
.diff
.getRemovals()) {
190 if (removal
instanceof Taxon
) {
191 Taxon taxon
= (Taxon
) removal
;
192 viewer
.remove(taxon
);
195 // viewer.getControl().setRedraw(true);