* The contents of this file are subject to the Mozilla Public License Version 1.1\r
* See LICENSE.TXT at the top of this package for the full license terms.\r
*/\r
-\r
package eu.etaxonomy.taxeditor.model;\r
\r
import java.util.ArrayList;\r
import java.util.Collection;\r
+import java.util.List;\r
import java.util.Set;\r
\r
import org.apache.log4j.Logger;\r
-import org.eclipse.core.databinding.observable.set.IObservableSet;\r
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;\r
-import org.eclipse.core.databinding.observable.set.SetChangeEvent;\r
import org.eclipse.jface.viewers.ITreeContentProvider;\r
-import org.eclipse.jface.viewers.TreePath;\r
-import org.eclipse.jface.viewers.TreeViewer;\r
import org.eclipse.jface.viewers.Viewer;\r
\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
import eu.etaxonomy.taxeditor.TaxEditorPlugin;\r
\r
/**\r
- * An implementation of ITreeContentProvider which adds taxa displayed in the tree\r
- * to the Editor session on an as-loaded basis. Listens for any changes to the \r
- * set of session taxa, updates the TreeViewer accordingly.\r
- * <p> \r
- * Could be re-written to implement ILazyTreeContentProvider at some point in the future.\r
- * \r
* @author p.ciardelli\r
- * @created 28.05.2008\r
+ * @created 27.06.2008\r
* @version 1.0\r
*/\r
public class TaxonomicTreeContentProvider implements ITreeContentProvider {\r
private static final Logger logger = Logger\r
.getLogger(TaxonomicTreeContentProvider.class);\r
\r
- Collection<Taxon> elements = new ArrayList<Taxon>();\r
- private IObservableSet observableSessionTaxonSet;\r
- TreeViewer viewer;\r
- \r
- /* (non-Javadoc)\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)\r
*/\r
- @Override\r
public Object[] getChildren(Object parentElement) {\r
- if (!(parentElement instanceof Taxon)) {\r
- return new Object[0];\r
+ \r
+ if (parentElement instanceof Taxon) {\r
+ return getTaxonChildren((Taxon) parentElement).toArray();\r
}\r
-\r
- Taxon parentTaxon = (Taxon) parentElement;\r
-\r
- // If this returns null, the taxon's children have already\r
- // been requested during this session\r
- Set<Taxon> childTaxa = TaxEditorPlugin.getDefault()\r
- .getSessionTaxonomicChildren(parentTaxon);\r
- if (childTaxa == null) {\r
- \r
- removeSessionTaxaListener();\r
- \r
- // Request this taxon's children for the first time \r
- // during this session\r
- childTaxa = parentTaxon.getTaxonomicChildren();\r
- TaxEditorPlugin.getDefault().addSessionTaxa(childTaxa);\r
+ \r
+ if (!(parentElement instanceof Collection)) {\r
+ throw new IllegalArgumentException(\r
+ "getChildren() expects either a Collection or a Taxon object."); //$NON-NLS-1$ \r
+ }\r
+ \r
+ List<Taxon> children = new ArrayList<Taxon>();\r
+ for (Object parent : (Collection) parentElement) {\r
+ if (!(parent instanceof Taxon)) {\r
+ throw new IllegalArgumentException(\r
+ "parentElement Collection can only contain Taxon objects."); //$NON-NLS-1$ \r
+ }\r
\r
- addSessionTaxaListener();\r
+ children.addAll(getTaxonChildren((Taxon) parent));\r
}\r
+ return children.toArray();\r
+ }\r
+\r
+ public Set<Taxon> getTaxonChildren(Taxon parentTaxon) {\r
\r
- return childTaxa.toArray();\r
+ return TaxEditorPlugin.getDefault().getSessionTaxonomicChildren(\r
+ parentTaxon);\r
}\r
\r
- @Override\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)\r
+ */\r
public Object getParent(Object element) {\r
if (!(element instanceof Taxon)) {\r
- return null; \r
+ throw new IllegalArgumentException(\r
+ "getParent() expects a Taxon object."); //$NON-NLS-1$ \r
}\r
return ((Taxon) element).getTaxonomicParent();\r
}\r
\r
- @Override\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)\r
+ */\r
public boolean hasChildren(Object element) {\r
if (!(element instanceof Taxon)) {\r
- return false; \r
- }\r
- return ((Taxon) element).hasTaxonomicChildren();\r
- }\r
-\r
- @Override\r
- public Object[] getElements(Object inputElement) {\r
- return elements.toArray();\r
- }\r
-\r
- @Override\r
- public void dispose() {\r
- removeSessionTaxaListener();\r
- }\r
-\r
- @Override\r
- public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
- if (!(viewer instanceof TreeViewer)) {\r
- throw new IllegalArgumentException(\r
- "This content provider only works with viewer of type TreeViewer"); //$NON-NLS-1$ \r
- }\r
- this.viewer = (TreeViewer) viewer;\r
- \r
- if (newInput != null && !(newInput instanceof Collection)) {\r
throw new IllegalArgumentException(\r
- "This content provider only works with input of type Collection<Taxon>"); //$NON-NLS-1$\r
+ "getParent() expects a Taxon object."); //$NON-NLS-1$ \r
}\r
\r
- try {\r
- Collection<Taxon> input = (Collection<Taxon>) newInput;\r
- setInput(input);\r
- } catch (ClassCastException e) {\r
- throw new IllegalArgumentException(\r
- "This content provider only works with input of type Collection<Taxon>"); //$NON-NLS-1$\r
- }\r
+ return getChildren(element).length > 0;\r
}\r
- \r
- private void setInput(Collection<Taxon> input) {\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)\r
+ */\r
+ public Object[] getElements(Object inputElement) {\r
\r
- if (input != null) {\r
- elements.addAll(input);\r
- TaxEditorPlugin.getDefault().addSessionTaxa(input);\r
- }\r
+ // BIG QUESTION: should getElements return only root taxa, or all taxa?\r
+ // CONFLICTING INFO ONLINE!!!\r
+// return TaxEditorPlugin.getDefault().getObservableSessionTaxa().toArray();\r
\r
- removeSessionTaxaListener();\r
- addSessionTaxaListener();\r
+ return TaxEditorPlugin.getDefault().getSessionRootTaxa().toArray();\r
}\r
\r
- private IObservableSet getObservableSessionTaxonSet() {\r
- if (observableSessionTaxonSet == null) {\r
- observableSessionTaxonSet = TaxEditorPlugin.getDefault().getObservableSessionTaxa();\r
- }\r
- return observableSessionTaxonSet;\r
- }\r
- \r
- private void addSessionTaxaListener() {\r
- getObservableSessionTaxonSet().addSetChangeListener(listener);\r
- }\r
- \r
- private void removeSessionTaxaListener() {\r
- getObservableSessionTaxonSet().removeSetChangeListener(listener);\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see org.eclipse.jface.viewers.IContentProvider#dispose()\r
+ */\r
+ public void dispose() {}\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,\r
+ * java.lang.Object, java.lang.Object)\r
+ */\r
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
+ // TODO Auto-generated method stub\r
}\r
- \r
- private ISetChangeListener listener = new ISetChangeListener() {\r
- @Override\r
- public void handleSetChange(SetChangeEvent event) {\r
- if (viewer.getControl().isDisposed()) {\r
- return;\r
- }\r
- for (Object addition : event.diff.getAdditions()) {\r
- if (addition instanceof Taxon) {\r
- Taxon taxon = (Taxon) addition;\r
- Taxon parentTaxon = taxon.getTaxonomicParent();\r
- if (parentTaxon == null) {\r
- viewer.add(TreePath.EMPTY, taxon); \r
- } else {\r
- viewer.add(parentTaxon, taxon);\r
- }\r
- }\r
- }\r
- for (Object removal : event.diff.getRemovals()) {\r
- if (removal instanceof Taxon) {\r
- Taxon taxon = (Taxon) removal;\r
- viewer.remove(taxon);\r
- }\r
- }\r
- }\r
- };\r
-}\r
+}
\ No newline at end of file