1) Re-arranged packages:
authorp.ciardelli <p.ciardelli@localhost>
Mon, 15 Sep 2008 08:09:39 +0000 (08:09 +0000)
committerp.ciardelli <p.ciardelli@localhost>
Mon, 15 Sep 2008 08:09:39 +0000 (08:09 +0000)
search, tax. tree, favorites, recent names
-> eu.etaxonomy.taxeditor.navigation

all free-text editing classes
-> eu.etaxonomy.taxeditor.editor

property sheet classes
-> eu.etaxonomy.taxeditor.propertysheet

2) eu.etaxonomy.taxeditor.editor.description - can now create a description, add elements, save, and partially display saved descriptions

.gitattributes
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/DescriptionElementComposite.java [new file with mode: 0644]
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/DescriptionLabelComposite.java [new file with mode: 0644]
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/ElementWithDescription.java [new file with mode: 0644]
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/FeatureGroupComposite.java [new file with mode: 0644]
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/IterableDescriptionList.java [new file with mode: 0644]
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/TaxonDescriptionComposite.java [new file with mode: 0644]
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/TaxonDescriptionEditorView.java [new file with mode: 0644]

index d9f7a78129adb18006d63fd505346919d9816721..87910852e4ce13796e5bbcf5ababfb8bcffb7b90 100644 (file)
@@ -457,6 +457,13 @@ eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/Registe
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/SelectTaxonDialog.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/TaxonNameEditorView.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/UndoView.java -text
+eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/DescriptionElementComposite.java -text
+eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/DescriptionLabelComposite.java -text
+eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/ElementWithDescription.java -text
+eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/FeatureGroupComposite.java -text
+eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/IterableDescriptionList.java -text
+eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/TaxonDescriptionComposite.java -text
+eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/TaxonDescriptionEditorView.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/model/CdmUtil.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/model/NameEditorInput.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/model/NameTreeContentProvider.java -text
diff --git a/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/DescriptionElementComposite.java b/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/DescriptionElementComposite.java
new file mode 100644 (file)
index 0000000..9a01c9d
--- /dev/null
@@ -0,0 +1,227 @@
+/**\r
+ * Copyright (C) 2007 EDIT\r
+ * European Distributed Institute of Taxonomy \r
+ * http://www.e-taxonomy.eu\r
+ * \r
+ * 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.editor.description;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.eclipse.jface.action.Action;\r
+import org.eclipse.swt.events.FocusAdapter;\r
+import org.eclipse.swt.events.FocusEvent;\r
+import org.eclipse.swt.graphics.Font;\r
+import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.ui.forms.IManagedForm;\r
+\r
+import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+import eu.etaxonomy.taxeditor.ITaxEditorConstants;\r
+import eu.etaxonomy.taxeditor.TaxEditorPlugin;\r
+import eu.etaxonomy.taxeditor.actions.ui.description.DeleteElementCompositeAction;\r
+import eu.etaxonomy.taxeditor.editor.ContextMenu;\r
+import eu.etaxonomy.taxeditor.editor.NameViewer;\r
+import eu.etaxonomy.taxeditor.editor.name.EditorGroupedComposite;\r
+import eu.etaxonomy.taxeditor.editor.name.LineBreakListener;\r
+import eu.etaxonomy.taxeditor.editor.name.LineWrapSupport;\r
+\r
+/**\r
+ * @author p.ciardelli\r
+ * @created 02.06.2008\r
+ * @version 1.0\r
+ */\r
+public class DescriptionElementComposite extends EditorGroupedComposite {\r
+       private static final Logger logger = Logger.getLogger(DescriptionElementComposite.class);\r
+\r
+       /**\r
+        * ************ COMPOSITE TYPES ************\r
+        */\r
+       public String compositeType;\r
+       public static final String TEXT_DATA = "text_data";\r
+       public static final String COMMON_TAXON_NAME = "common_taxon_name";\r
+       public static final String DISTRIBUTION = "distribution";\r
+\r
+       /**\r
+        * ************ INDENTATIONS ************\r
+        */\r
+//     public static final int ACCEPTED_INDENT = 0;\r
+\r
+       /**\r
+        * ************ FONTS ************\r
+        */\r
+//     public static final Font ACCEPTED_FONT = TaxEditorPlugin.getDefault()\r
+//                     .getFont(ITaxEditorConstants.ACCEPTED_TAXON_FONT);\r
+\r
+       /**\r
+        * ************ ICONS ************\r
+        */\r
+       public static final Image BLACK_SQUARE_ICON = TaxEditorPlugin.getDefault()\r
+                       .getImage(ITaxEditorConstants.BLACK_SQUARE_ICON);\r
+\r
+       /**\r
+        * ************ TRANSFORMATIONS ************\r
+        */\r
+//     public static final String ADD_GROUP_BASIONYM = "add_group_basionym";\r
+\r
+       /**\r
+        * ************ MENU ACTIONS ************\r
+        */\r
+       public Action CHANGE_TAXON_TO_SYNONYM_ACTION;\r
+\r
+       /**\r
+        * The constructor for a DescriptionElementComposite. Takes a parent Composite on which to\r
+        * create itself, and an IManagedForm for Composite life cycle methods, i.e.\r
+        * drawing borders, creating other Composites, creating line wrap support,\r
+        * etc.\r
+        * \r
+        * @param parent\r
+        * @param managedForm\r
+        */\r
+       public DescriptionElementComposite(Composite parent, IManagedForm managedForm, \r
+                       String compositeType, Object data) {\r
+               super(parent, managedForm);\r
+\r
+               createNameViewer();\r
+               createBorderSupport();\r
+               createLineWrapSupport();\r
+\r
+               setData(data);\r
+               transform(compositeType);\r
+               \r
+               setFocus();\r
+       }\r
+\r
+       protected void createLineWrapSupport() {\r
+               new LineWrapSupport(getTextViewer(), managedForm);\r
+       }\r
+\r
+       /**\r
+        * All cosmetic - non-data-related, i.e. icons, fonts, etc. -\r
+        * transformations take place in this method.\r
+        * \r
+        * @param transformation\r
+        */\r
+       public void transform(String transformation) {\r
+\r
+               setIcon(BLACK_SQUARE_ICON);\r
+               createMenu();\r
+\r
+               setDirty(true);\r
+               managedForm.getForm().layout();\r
+       }\r
+\r
+       /**\r
+        * Override of Composite.setData() which passes data along to\r
+        * DescriptionElementComposite's TextViewer where appropriate.\r
+        * \r
+        * @see org.eclipse.swt.widgets.Widget#setData(java.lang.Object)\r
+        */\r
+       public void setData(Object data) {\r
+               super.setData(data);\r
+               if (data instanceof DescriptionElementBase) {\r
+\r
+                       String text = "";\r
+//                     ((DescriptionElementBase) data).getFeature();\r
+                       getTextViewer().getTextWidget().setText(text);\r
+\r
+                       if (getTextViewer() instanceof NameViewer) {\r
+                               ((NameViewer) getTextViewer()).setCursorToEOL();\r
+\r
+                       }\r
+               }\r
+       }\r
+\r
+       private NameViewer createNameViewer() {\r
+               final NameViewer nameViewer = new NameViewer(this);\r
\r
+               nameViewer.setLineBreakListener(new LineBreakListener() {\r
+\r
+                       @Override\r
+                       public void handleSplitText(String text) {\r
+\r
+                               // Line breaks are allowed in DescriptionElements\r
+\r
+                       }\r
+\r
+               });\r
+               /*\r
+               nameViewer.setParseListener(new ParseListener() {\r
+\r
+                       @Override\r
+                       public void parse(String text) {\r
+\r
+                               TaxonBase taxonBase = (TaxonBase) getData();\r
+\r
+                               NonViralName nonViralName = (NonViralName) taxonBase.getName();\r
+                               if (nonViralName != null) {\r
+                                       CdmUtil.parseFullName(nonViralName, text, null, true);\r
+                                       nameViewer.setShowError(nonViralName.getHasProblem());\r
+                               }\r
+\r
+                               setDirty(true);\r
+                       }\r
+               });\r
+               */\r
+\r
+               nameViewer.getTextWidget().addFocusListener(new FocusAdapter() {\r
+                       public void focusGained(FocusEvent e) {\r
+                               setFocus();\r
+                       }\r
+               });\r
+\r
+               this.textViewer = nameViewer;\r
+               return nameViewer;\r
+       }\r
+\r
+       private void createMenu() {\r
+               ContextMenu contextMenu = new ContextMenu(getDraggableLabel());\r
+               \r
+               // Delete this description element\r
+//             Action deleteElementAction = new DeleteElementCompositeAction(\r
+//                             this, getTaxon());\r
+//             contextMenu.addAction(deleteElementAction);\r
+               \r
+               // Add new text \r
+       }\r
+       \r
+       \r
+       public boolean setParent(Composite parent) {\r
+\r
+               return super.setParent(parent);\r
+//             if (super.setParent(parent)) {\r
+//\r
+//                     // Has this been moved to the misapplied names group?\r
+//                     if (parent.getData(ITaxEditorConstants.MISAPPLIED_NAME) != null) {\r
+//                             new ChangeCompositeToMisappliedNameAction(this, managedForm)\r
+//                                             .run();\r
+//                     }\r
+//\r
+//                     // Has this been moved to a HomotypicalGroup?\r
+//                     if (parent.getData() instanceof HomotypicalGroup) {\r
+//                             new AdaptCompositeToGroupAction(this,\r
+//                                             (EditorGroupComposite) parent).run();\r
+//                     }\r
+//                     return true;\r
+//\r
+//             }\r
+//             return false;\r
+       }\r
+\r
+       private Taxon getTaxon() {\r
+               Composite parent = getParent();\r
+               Composite grandParent = parent.getParent();\r
+               if (grandParent != null) {\r
+                       Object parentData = grandParent.getData();\r
+                       if (parentData instanceof Taxon) {\r
+                               return (Taxon) parentData;\r
+                       }\r
+               }\r
+               throw new IllegalArgumentException(\r
+                               "The parent of the DescriptionElementComposite's parent does not have a Taxon in its data field as required.");\r
+       }\r
+       \r
+}
\ No newline at end of file
diff --git a/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/DescriptionLabelComposite.java b/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/DescriptionLabelComposite.java
new file mode 100644 (file)
index 0000000..c1003af
--- /dev/null
@@ -0,0 +1,106 @@
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* 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.editor.description;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.eclipse.jface.action.Action;\r
+import org.eclipse.jface.action.MenuManager;\r
+import org.eclipse.jface.text.Document;\r
+import org.eclipse.jface.text.source.SourceViewer;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.graphics.Font;\r
+import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.ui.forms.IManagedForm;\r
+import org.eclipse.ui.forms.widgets.TableWrapData;\r
+\r
+import eu.etaxonomy.cdm.api.service.IDescriptionService;\r
+import eu.etaxonomy.cdm.model.common.TermVocabulary;\r
+import eu.etaxonomy.cdm.model.description.Feature;\r
+import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
+import eu.etaxonomy.taxeditor.ITaxEditorConstants;\r
+import eu.etaxonomy.taxeditor.TaxEditorPlugin;\r
+import eu.etaxonomy.taxeditor.actions.ui.description.AddDescriptionElementCompositeAction;\r
+import eu.etaxonomy.taxeditor.editor.ContextMenu;\r
+import eu.etaxonomy.taxeditor.editor.name.EditorGroupedComposite;\r
+\r
+/**\r
+ * Composite for editing a description's label / Title Cache information\r
+ * \r
+ * @author p.ciardelli\r
+ * @created 09.09.2008\r
+ * @version 1.0\r
+ */\r
+public class DescriptionLabelComposite extends EditorGroupedComposite {\r
+       private static final Logger logger = Logger\r
+                       .getLogger(DescriptionLabelComposite.class);\r
+\r
+       /**\r
+        * ************ FONTS ************\r
+        */\r
+       public static final Font DESCRIPTION_LABEL_FONT = TaxEditorPlugin.getDefault()\r
+                       .getFont(ITaxEditorConstants.ACCEPTED_TAXON_FONT);\r
+       \r
+       /**\r
+        * ************ ICONS ************\r
+        */\r
+       public static final Image DESCRIPTION_LABEL_ICON = TaxEditorPlugin.getDefault()\r
+                       .getImage(ITaxEditorConstants.BLACK_SQUARE_ICON);       \r
+       \r
+       public DescriptionLabelComposite(Composite parent, IManagedForm managedForm, TaxonDescription taxonDescription) {\r
+               super(parent, managedForm);\r
+\r
+               createLabelViewer();\r
+               createBorderSupport();\r
+               createLineWrapSupport();\r
+\r
+               setData(taxonDescription);\r
+               transform(null);\r
+               \r
+               setFocus();\r
+       }\r
+\r
+       @Override\r
+       public void transform(String transformation) {\r
+               setDraggable(false);\r
+               setFont(DESCRIPTION_LABEL_FONT);\r
+               setIcon(DESCRIPTION_LABEL_ICON);\r
+               \r
+               createMenu();\r
+       }       \r
+       \r
+       private void createMenu() {\r
+               ContextMenu contextMenu = createContextMenu();\r
+               \r
+               MenuManager menuManager = new MenuManager("Add description element");\r
+               \r
+//             if (!(this.getParent() instanceof TaxonDescriptionComposite)) {\r
+//                     throw new ClassCastException(\r
+//                             "The DescriptionLabelComposite's parent is not a TaxonDescriptionComposite as expected.");\r
+//             }\r
+//             TaxonDescriptionComposite parentComposite = (TaxonDescriptionComposite) this.getParent();\r
+               Composite parentComposite = this.getParent();\r
+                               \r
+               IDescriptionService descriptionService = TaxEditorPlugin.getDefault().getDescriptionService();\r
+               TermVocabulary<Feature> features = descriptionService.getDefaultFeatureVocabulary();\r
+               for (Feature feature : features) {\r
+                       Action action = new AddDescriptionElementCompositeAction(parentComposite, managedForm, feature);\r
+                       menuManager.add(action);\r
+               }\r
+               contextMenu.addSubmenu(menuManager);\r
+       }\r
+\r
+       private void createLabelViewer() {              \r
+               this.textViewer = new SourceViewer(this, null, SWT.WRAP | SWT.MULTI | SWT.RESIZE);\r
+               this.textViewer.setDocument(new Document("Test me"));\r
+               this.textViewer.getTextWidget().setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));\r
+       }\r
+\r
+}\r
diff --git a/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/ElementWithDescription.java b/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/ElementWithDescription.java
new file mode 100644 (file)
index 0000000..e7c91cf
--- /dev/null
@@ -0,0 +1,47 @@
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* 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.editor.description;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
+import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
+\r
+/**\r
+ * @author p.ciardelli\r
+ * @created 08.09.2008\r
+ * @version 1.0\r
+ * \r
+ * Contains DescriptionElementBase and the Description to which the element\r
+ * belongs. Used as a helper class in the IterableDescriptionList, to tell when\r
+ * the iterator is returning elements from a different description. \r
+ */\r
+public class ElementWithDescription {\r
+       private static final Logger logger = Logger\r
+                       .getLogger(ElementWithDescription.class);\r
+       \r
+       DescriptionElementBase element;\r
+       TaxonDescription description;\r
+       \r
+       public DescriptionElementBase getElement() {\r
+               return element;\r
+       }\r
+       public void setElement(DescriptionElementBase element) {\r
+               this.element = element;\r
+       }\r
+       public TaxonDescription getDescription() {\r
+               return description;\r
+       }\r
+       public void setDescription(TaxonDescription description) {\r
+               this.description = description;\r
+       }\r
+       \r
+       \r
+}\r
diff --git a/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/FeatureGroupComposite.java b/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/FeatureGroupComposite.java
new file mode 100644 (file)
index 0000000..9dd6d21
--- /dev/null
@@ -0,0 +1,41 @@
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* 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.editor.description;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.ui.forms.IManagedForm;\r
+import org.eclipse.ui.forms.widgets.TableWrapLayout;\r
+\r
+import eu.etaxonomy.cdm.model.description.Feature;\r
+import eu.etaxonomy.taxeditor.editor.GroupCompositeLabel;\r
+import eu.etaxonomy.taxeditor.editor.name.EditorGroupComposite;\r
+\r
+/**\r
+ * @author p.ciardelli\r
+ * @created 11.09.2008\r
+ * @version 1.0\r
+ */\r
+public class FeatureGroupComposite extends EditorGroupComposite {\r
+       private static final Logger logger = Logger\r
+                       .getLogger(FeatureGroupComposite.class);\r
+\r
+       public FeatureGroupComposite(Composite parent, IManagedForm managedForm,\r
+                       Feature feature) {\r
+               super(parent, managedForm, feature);\r
+\r
+               TableWrapLayout tlLayout = new TableWrapLayout();\r
+               tlLayout.topMargin = 0;\r
+               tlLayout.leftMargin = 10;\r
+               setLayout(tlLayout);\r
+               \r
+               Composite groupCompositeLabel = new GroupCompositeLabel(this, feature.getLabel());\r
+       }\r
+}\r
diff --git a/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/IterableDescriptionList.java b/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/IterableDescriptionList.java
new file mode 100644 (file)
index 0000000..312e816
--- /dev/null
@@ -0,0 +1,84 @@
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* 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.editor.description;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
+import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+\r
+/**\r
+ * Retrieves a taxon's descriptive elements, grouped by TaxonDescription, then\r
+ * returns them using an iterator and a sort order optionally passed in.\r
+ * \r
+ * @author p.ciardelli\r
+ * @created 09.05.2008\r
+ * @version 1.0\r
+ */\r
+public class IterableDescriptionList implements Iterable<ElementWithDescription> {\r
+       private static final Logger logger = Logger\r
+                       .getLogger(IterableDescriptionList.class);\r
+       \r
+       private Taxon taxon;\r
+\r
+       public IterableDescriptionList(Taxon taxon) {\r
+               this.taxon = taxon;\r
+       }\r
+\r
+       @Override\r
+       public Iterator<ElementWithDescription> iterator() {\r
+               return new DescriptionElementIterator(taxon);\r
+       }\r
+       \r
+       class DescriptionElementIterator implements Iterator<ElementWithDescription> {\r
+\r
+               List<ElementWithDescription> elementList;\r
+               int index = 0;\r
+               \r
+               public DescriptionElementIterator(Taxon taxon) {\r
+                       elementList = new ArrayList<ElementWithDescription>();\r
+                       \r
+                       for (TaxonDescription taxonDescription : taxon.getDescriptions()) {\r
+                               for (DescriptionElementBase descriptionElement : taxonDescription.getElements()) {\r
+                                       \r
+                                       // TODO ask Andreas M. to add a descriptionElement.getTaxonDescription\r
+                                       ElementWithDescription element = new ElementWithDescription();\r
+                                       element.setDescription(taxonDescription);\r
+                                       element.setElement(descriptionElement);\r
+                                       \r
+                                       elementList.add(element);\r
+                               }\r
+                       }\r
+               }\r
+\r
+               @Override\r
+               public boolean hasNext() {\r
+                       if (elementList.size() == index) {\r
+                               return false;\r
+                       }\r
+                       return true;\r
+               }\r
+\r
+               @Override\r
+               public ElementWithDescription next() {\r
+                       ElementWithDescription next = elementList.get(index);\r
+                       index++;\r
+                       return next;\r
+               }\r
+\r
+               @Override\r
+               public void remove() {}\r
+       }\r
+}\r
diff --git a/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/TaxonDescriptionComposite.java b/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/TaxonDescriptionComposite.java
new file mode 100644 (file)
index 0000000..9540440
--- /dev/null
@@ -0,0 +1,34 @@
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* 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.editor.description;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.widgets.Composite;\r
+\r
+/**\r
+ * @author p.ciardelli\r
+ * @created 08.09.2008\r
+ * @version 1.0\r
+ */\r
+public class TaxonDescriptionComposite extends Composite {\r
+       private static final Logger logger = Logger\r
+                       .getLogger(TaxonDescriptionComposite.class);\r
+\r
+       TaxonDescriptionComposite(Composite parent) {\r
+               super(parent, SWT.NONE);\r
+\r
+               // TODO take all formatting info out of GroupComposite,\r
+               //      EditorGroupComposite, merge this class with one of those\r
+               \r
+               \r
+       }\r
+\r
+}
\ No newline at end of file
diff --git a/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/TaxonDescriptionEditorView.java b/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/descriptionviewersupport/TaxonDescriptionEditorView.java
new file mode 100644 (file)
index 0000000..020a390
--- /dev/null
@@ -0,0 +1,210 @@
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* 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.editor.description;\r
+\r
+import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.eclipse.jface.text.Document;\r
+import org.eclipse.jface.text.TextViewer;\r
+import org.eclipse.jface.text.source.SourceViewer;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.widgets.Composite;\r
+\r
+import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
+import eu.etaxonomy.cdm.model.description.Feature;\r
+import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+import eu.etaxonomy.taxeditor.ITaxEditorConstants;\r
+import eu.etaxonomy.taxeditor.TaxEditorPlugin;\r
+import eu.etaxonomy.taxeditor.editor.AbstractTaxonEditorView;\r
+import eu.etaxonomy.taxeditor.editor.name.EditorGroupComposite;\r
+import eu.etaxonomy.taxeditor.editor.name.EditorGroupedComposite;\r
+\r
+/**\r
+ * @author p.ciardelli\r
+ * @created 25.08.2008\r
+ * @version 1.0\r
+ */\r
+public class TaxonDescriptionEditorView extends AbstractTaxonEditorView {\r
+       private static final Logger logger = Logger\r
+                       .getLogger(TaxonDescriptionEditorView.class);\r
+       \r
+\r
+       @Override\r
+       public void doSave(IProgressMonitor monitor) {\r
+               // TODO Auto-generated method stub\r
+               \r
+       }\r
+\r
+       @Override\r
+       public void doSaveAs() {\r
+               // TODO Auto-generated method stub\r
+               \r
+       }\r
+\r
+       @Override\r
+       public boolean isDirty() {\r
+               // TODO Auto-generated method stub\r
+               return false;\r
+       }\r
+\r
+       @Override\r
+       public boolean isSaveAsAllowed() {\r
+               // TODO Auto-generated method stub\r
+               return false;\r
+       }\r
+       \r
+       @Override\r
+       public void createPartControl(Composite composite) {\r
+\r
+               super.createPartControl(composite);\r
+               \r
+               Taxon taxon = getTaxon();\r
+               \r
+               Set<TaxonDescription> descriptions = taxon.getDescriptions();\r
+               \r
+               // If the Taxon has no descriptions, give it an empty one to display\r
+               if (descriptions == null || descriptions.size() == 0) {\r
+                       descriptions.add(TaxonDescription.NewInstance(taxon));  \r
+               }\r
+               \r
+               // Iterate through taxon's descriptions\r
+               for (TaxonDescription description : descriptions) {\r
+                       \r
+                       // The property sheet should show the first Description upon this EditorView\r
+                       //      receiving focus\r
+                       if (defaultPropertySheetObject == null) {\r
+                               setDefaultPropertySheetObject(description);\r
+                       }\r
+                       \r
+                       // Create a composite for the description\r
+                       EditorGroupComposite descriptionComposite = new EditorGroupComposite(\r
+                                       parent, managedForm, description);\r
+                       descriptionComposite.setDroppable(false);\r
+                       \r
+                       // Add a grouped composite for the description's label\r
+                       EditorGroupedComposite descriptionLabelComposite = new DescriptionLabelComposite(\r
+                                       descriptionComposite, managedForm, description);\r
+                       \r
+                       // Iterate through description's elements, group by feature\r
+                       Map<Feature, Set<DescriptionElementBase>> features =  \r
+                                       new HashMap<Feature, Set<DescriptionElementBase>>(); \r
+                       for (DescriptionElementBase element : description.getElements()) {\r
+                               Feature feature = element.getFeature();\r
+                               Set<DescriptionElementBase> elements = features.get(feature);\r
+                               if (elements == null) {\r
+                                       elements = new HashSet<DescriptionElementBase>();\r
+                                       features.put(feature, elements);\r
+                               }\r
+                               elements.add(element);\r
+                       }\r
+                       \r
+                       // Create a composite for each feature, composites for its elements\r
+                       for (Feature feature : features.keySet()) {\r
+                               EditorGroupComposite featureComposite = new FeatureGroupComposite(\r
+                                               descriptionComposite, managedForm, feature);\r
+                               \r
+                               for (DescriptionElementBase element : features.get(feature)) {\r
+                                       new DescriptionElementComposite(\r
+                                                       featureComposite, managedForm, null, element);\r
+                               }\r
+                       }\r
+               }\r
+                               \r
+               \r
+               \r
+//             addFeatureComposite(descriptionComposite, "Ecology");\r
+//             addFeatureComposite(descriptionComposite, "Etymology");         \r
+               \r
+//              Make a Description group to hold all elements\r
+//             IterableDescriptionList elementList = new IterableDescriptionList(taxon);\r
+//             \r
+//             boolean hasElements = false;\r
+//             \r
+//             for (ElementWithDescription descriptionElement : elementList) {\r
+//                     \r
+//                     // Display first DescriptionElement in property sheet \r
+//                     if (!hasElements) {\r
+//                             hasElements = true;\r
+//                     }\r
+//                     hasElements = true;\r
+//                     new DescriptionElementComposite(descriptionComposite, managedForm, DescriptionElementComposite.TEXT_DATA, descriptionElement);\r
+//             }\r
+//             \r
+//             // If taxon has no DescriptionElements, create an empty DescriptionElementComposite\r
+//             if (!hasElements) {\r
+//                     DescriptionElementBase newElement = TextData.NewInstance(); \r
+//                     new DescriptionElementComposite(descriptionComposite, managedForm, DescriptionElementComposite.TEXT_DATA, newElement);\r
+//                     provider.setSelection(\r
+//                             new StructuredSelection(\r
+//                                             new PropertySourceAdapter(newElement).getPropertySource()\r
+//                     ));\r
+//             }\r
+\r
+               // Listen for names being dragged outside of existing homotypic groups -\r
+               //  user wants to create a new group\r
+//             Transfer[] types = new Transfer[] {WidgetTransfer.getInstance()};\r
+//             int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT;\r
+//             DropTarget target = new DropTarget(parent, operations);\r
+//             target.setTransfer(types);\r
+//             target.addDropListener(new DropTargetAdapter() {\r
+//                     \r
+//                     public void drop(DropTargetEvent event) {\r
+//                             \r
+//                             EditorGroupComposite newGroupComposite = new EditorGroupComposite(parent, managedForm, new HomotypicalGroup());                                                 \r
+//                             \r
+//                             NameComposite nameComposite = (NameComposite) event.data;\r
+//                             nameComposite.setParent(newGroupComposite);                             \r
+//                             \r
+//                             new AdaptCompositeToGroupAction(nameComposite, newGroupComposite).run();\r
+//                     }               \r
+//             });\r
+               \r
+               // We've added elements to the managed form, so redraw it\r
+               scrolledForm.reflow(true);\r
+       }\r
+       \r
+       private void addFeatureComposite (Composite composite, String featureString) {\r
+               \r
+               // Add a group composite for a feature type\r
+               Feature feature = Feature.NewInstance();\r
+               EditorGroupComposite featureComposite = new FeatureGroupComposite(composite, managedForm, feature);\r
+                               \r
+               addFeatureComposite(featureComposite);\r
+               addFeatureComposite(featureComposite);\r
+       }\r
+       \r
+       private void addFeatureComposite (Composite composite) {\r
+               // Add a feature composite\r
+               EditorGroupedComposite featureComposite = new EditorGroupedComposite(composite, managedForm) {\r
+\r
+                       @Override\r
+                       public void transform(String transformation) {\r
+                               // TODO Auto-generated method stub\r
+                               \r
+                       }\r
+               };\r
+               \r
+               featureComposite.setIcon(TaxEditorPlugin.getDefault()\r
+                               .getImage(ITaxEditorConstants.BLACK_SQUARE_ICON));\r
+               \r
+               TextViewer featureTypeSourceViewer = new SourceViewer(featureComposite, null, SWT.NONE);\r
+               featureTypeSourceViewer.setDocument(new Document(""));\r
+               featureComposite.setTextViewer(featureTypeSourceViewer);\r
+               featureTypeSourceViewer.getTextWidget().setText("Test me");\r
+               \r
+               featureComposite.setDraggable(true);\r
+       }\r
+}\r