Pretty much everything in new Descriptive Tree up to references implemented.
authorp.ciardelli <p.ciardelli@localhost>
Wed, 26 Aug 2009 13:18:05 +0000 (13:18 +0000)
committerp.ciardelli <p.ciardelli@localhost>
Wed, 26 Aug 2009 13:18:05 +0000 (13:18 +0000)
17 files changed:
.gitattributes
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/AbstractDescriptionDetailsPage.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/CommonNameDetailsPage.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/DescriptionContentProvider.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/DescriptionLabelProvider.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/DescriptionMasterDetailsBlock.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/DescriptiveInformationProvider.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/DistributionDetailsPage.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/DistributionMapDetailsPage.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/IDescriptiveInformationProvider.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/ImageDetailsPage.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/TaxonDescriptionDetailsPage.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/TaxonDescriptionFeature.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/TaxonDescriptionTreeEditor.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/TextDataDetailsPage.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/handler/AddDescriptionHandler.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/handler/DeleteDescriptionHandler.java

index de995765c4abb6abff39773c33392a12c52e9a6b..7a13a2cdacc365fc575c2d1bf8535c2c85443a1e 100644 (file)
@@ -766,6 +766,7 @@ taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/Des
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/DescriptionMasterDetailsBlock.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/DescriptiveInformationProvider.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/DistributionDetailsPage.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/DistributionMapDetailsPage.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/IDescriptiveInformationProvider.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/ImageDetailsPage.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/TaxonDescriptionDetailsPage.java -text
index df96281377c746ebdf8625e6f390304d9f548718..a84fa9f16c207766c546bf2f7df1a2da884da501 100644 (file)
@@ -3,6 +3,7 @@
  */\r
 package eu.etaxonomy.taxeditor.editor.descriptiontree;\r
 \r
+import org.apache.log4j.Logger;\r
 import org.eclipse.jface.viewers.ISelection;\r
 import org.eclipse.jface.viewers.IStructuredSelection;\r
 import org.eclipse.swt.SWT;\r
@@ -22,7 +23,9 @@ import org.eclipse.ui.forms.widgets.TableWrapLayout;
  * @author p.ciardelli\r
  *\r
  */\r
-abstract public class AbstractDescriptionDetailsPage implements IDetailsPage {\r
+abstract public class AbstractDescriptionDetailsPage implements IDetailsPage { \r
+       private static final Logger logger = Logger.getLogger(AbstractDescriptionDetailsPage.class);\r
+\r
 \r
        protected IManagedForm mform;\r
        protected Object input;\r
@@ -39,28 +42,57 @@ abstract public class AbstractDescriptionDetailsPage implements IDetailsPage {
                layout.rightMargin = 2;\r
                layout.bottomMargin = 2;\r
                parent.setLayout(layout);\r
-               TableWrapData td2 = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP);\r
+               TableWrapData td2 = new TableWrapData(TableWrapData.FILL, TableWrapData.FILL_GRAB);\r
                td2.grabHorizontal = true;\r
-               parent.setLayoutData(td2);\r
-               \r
+               parent.setLayoutData(td2);              \r
                \r
                FormToolkit toolkit = mform.getToolkit();\r
                section = toolkit.createSection(parent, Section.DESCRIPTION|Section.TITLE_BAR);\r
                section.marginWidth = 10;\r
-               TableWrapData td = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP);\r
+               TableWrapData td = new TableWrapData(TableWrapData.FILL, TableWrapData.FILL_GRAB);\r
                td.grabHorizontal = true;\r
                section.setLayoutData(td);\r
                \r
                client = toolkit.createComposite(section);\r
+//             client = new Composite(section, SWT.BORDER);\r
                GridLayout glayout = new GridLayout();\r
                glayout.marginWidth = glayout.marginHeight = 0;\r
-//             glayout.numColumns = 2;\r
                client.setLayout(glayout);\r
+               TableWrapData tdclient = new TableWrapData(TableWrapData.FILL, TableWrapData.FILL_GRAB);\r
+               client.setLayoutData(tdclient);\r
                \r
                section.setClient(client);\r
+               \r
+//             section.addFocusListener(new FocusAdapter() {\r
+//                     /* (non-Javadoc)\r
+//                      * @see org.eclipse.swt.events.FocusAdapter#focusGained(org.eclipse.swt.events.FocusEvent)\r
+//                      */\r
+//                     @Override\r
+//                     public void focusGained(FocusEvent e) {\r
+//                             logger.warn("focus gained");\r
+//                     }\r
+//                     /* (non-Javadoc)\r
+//                      * @see org.eclipse.swt.events.FocusAdapter#focusLost(org.eclipse.swt.events.FocusEvent)\r
+//                      */\r
+//                     @Override\r
+//                     public void focusLost(FocusEvent e) {\r
+//                             logger.warn("focus lost");\r
+//                     }\r
+//             });\r
 \r
+       }\r
+       \r
+       private void createReferenceControls() {\r
+               \r
        }\r
 \r
+       /**\r
+        * Alerts editor that dirty state has changed.\r
+        */\r
+       protected void fireStateChanged() {\r
+               mform.dirtyStateChanged();\r
+       }\r
+       \r
        /* (non-Javadoc)\r
         * @see org.eclipse.ui.forms.IFormPart#commit(boolean)\r
         */\r
@@ -127,13 +159,13 @@ abstract public class AbstractDescriptionDetailsPage implements IDetailsPage {
        /* (non-Javadoc)\r
         * @see org.eclipse.ui.forms.IPartSelectionListener#selectionChanged(org.eclipse.ui.forms.IFormPart, org.eclipse.jface.viewers.ISelection)\r
         */\r
-       public void selectionChanged(IFormPart part, ISelection selection) {\r
+       public void selectionChanged(IFormPart part, ISelection selection) {    \r
                IStructuredSelection ssel = (IStructuredSelection)selection;\r
                if (ssel.size()==1) {\r
                        input = ssel.getFirstElement();\r
-               }\r
-               else\r
+               } else {\r
                        input = null;\r
+               }\r
        }\r
 \r
        protected Label createLabel(String string, Composite composite, Composite parent) {\r
index 3b166b42de6c4294f0e94a19ff978318f399897f..cf5959043d3d8e524501d33d94f92fcf681ba45e 100644 (file)
@@ -4,6 +4,7 @@
 package eu.etaxonomy.taxeditor.editor.descriptiontree;\r
 \r
 import java.util.ArrayList;\r
+import java.util.Collections;\r
 import java.util.List;\r
 \r
 import org.apache.log4j.Logger;\r
@@ -12,7 +13,6 @@ import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CCombo;\r
 import org.eclipse.swt.events.ModifyEvent;\r
 import org.eclipse.swt.events.ModifyListener;\r
-import org.eclipse.swt.events.SelectionAdapter;\r
 import org.eclipse.swt.events.SelectionEvent;\r
 import org.eclipse.swt.events.SelectionListener;\r
 import org.eclipse.swt.layout.GridData;\r
@@ -21,10 +21,11 @@ import org.eclipse.swt.widgets.Text;
 import org.eclipse.ui.forms.IFormPart;\r
 \r
 import eu.etaxonomy.cdm.model.common.Language;\r
+import eu.etaxonomy.cdm.model.common.TermLanguageComparator;\r
 import eu.etaxonomy.cdm.model.description.CommonTaxonName;\r
 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
 import eu.etaxonomy.taxeditor.model.DescriptionHelper;\r
-import eu.etaxonomy.taxeditor.store.VocabularyStore;\r
+import eu.etaxonomy.taxeditor.preference.PreferencesUtil;\r
 \r
 /**\r
  * If this is a common name whose language has not been chosen yet, the last explicitly\r
@@ -33,27 +34,54 @@ import eu.etaxonomy.taxeditor.store.VocabularyStore;
  * @author p.ciardelli\r
  *\r
  */\r
-public class CommonNameDetailsPage extends AbstractDescriptionDetailsPage implements ModifyListener {\r
+public class CommonNameDetailsPage extends AbstractDescriptionDetailsPage implements ModifyListener, SelectionListener {\r
+       \r
        private static final Logger logger = Logger.getLogger(CommonNameDetailsPage.class);\r
        \r
        private Text text;\r
-\r
        private CCombo combo;\r
        \r
        private static final int VISIBLE_ITEMS = 20;\r
        \r
-       private Language language;\r
-       protected Language languageTemp;\r
-       private List<Language> languages;       \r
-\r
+       /**\r
+        * Language selected last time the dialog was used.\r
+        */\r
+       private static Language lastLanguage;   \r
+       \r
+       private List<Language> languages;\r
+       \r
        /* (non-Javadoc)\r
         * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)\r
         */\r
        public void modifyText(ModifyEvent e) {\r
                DescriptionHelper.setCache((DescriptionElementBase) input, text.getText());\r
-               mform.dirtyStateChanged();\r
+               fireStateChanged();\r
        }       \r
        \r
+       /**\r
+        * @param language\r
+        */\r
+       private void modifyLanguage(Language language) {\r
+               ((CommonTaxonName) input).setLanguage(language);\r
+               fireStateChanged();             \r
+       }\r
+       \r
+       /* (non-Javadoc)\r
+        * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)\r
+        */\r
+       public void widgetDefaultSelected(SelectionEvent e) {}\r
+\r
+       /* (non-Javadoc)\r
+        * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)\r
+        */\r
+       \r
+       public void widgetSelected(SelectionEvent e) {\r
+               Language language = languages.get(combo.getSelectionIndex());\r
+               \r
+               modifyLanguage(language);                               \r
+               setLastSelectedLanguage(language);\r
+       }\r
+       \r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.taxeditor.editor.descriptionnew.AbstractDescriptionDetailsPage#createContents(org.eclipse.swt.widgets.Composite)\r
         */\r
@@ -64,18 +92,26 @@ public class CommonNameDetailsPage extends AbstractDescriptionDetailsPage implem
                \r
                createLabel("Language:", client, parent);\r
                \r
+//             Hyperlink hyperlink = new Hyperlink(parent, SWT.NONE);\r
+//             hyperlink.setText("Edit language menu");\r
+//             hyperlink.setUnderlined(true);\r
+//             hyperlink.setBackground(section.getBackground());\r
+//             hyperlink.addMouseListener(new MouseAdapter() {\r
+//                     /* (non-Javadoc)\r
+//                      * @see org.eclipse.swt.events.MouseAdapter#mouseUp(org.eclipse.swt.events.MouseEvent)\r
+//                      */\r
+//                     @Override\r
+//                     public void mouseUp(MouseEvent e) {\r
+//                             org.eclipse.ui.dialogs.PreferencesUtil.createPreferenceDialogOn(client.getShell(), \r
+//                                             LanguageMenuPreferences.ID, null, null).open();\r
+//                     }\r
+//             });\r
+               \r
         // create combo\r
         combo = new CCombo(client, SWT.BORDER);\r
         combo.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL\r
                 | GridData.HORIZONTAL_ALIGN_FILL));\r
         combo.setVisibleItemCount(VISIBLE_ITEMS);\r
-        combo.addSelectionListener(new SelectionAdapter() {\r
-                       @Override\r
-                       public void widgetSelected(SelectionEvent e) {\r
-                               int i = combo.getSelectionIndex();\r
-                               languageTemp = languages.get(i);\r
-                       }\r
-               });\r
         \r
         createLabel("Common name:", client, parent);\r
         \r
@@ -87,17 +123,22 @@ public class CommonNameDetailsPage extends AbstractDescriptionDetailsPage implem
                text.setLayoutData(gd);\r
         \r
         populateLanguages();\r
-\r
-//        applyDialogFont(composite);\r
-               \r
-\r
        }\r
        \r
+       /**\r
+        * @param language\r
+        */\r
+       private void setLastSelectedLanguage(Language language) {\r
+               lastLanguage = language;\r
+       }\r
+\r
        private void populateLanguages() {\r
                languages = new ArrayList<Language>();\r
                int i = 0;              \r
                int index = 0;\r
-               for (Language language : VocabularyStore.getLanguages()) {\r
+               List<Language> languagesTemp = PreferencesUtil.getPreferredLanguages();\r
+               Collections.sort(languagesTemp, new TermLanguageComparator<Language>());\r
+               for (Language language : languagesTemp) {\r
                                                \r
                        String description = language.getDescription(); \r
                        if (description == null) {\r
@@ -107,7 +148,7 @@ public class CommonNameDetailsPage extends AbstractDescriptionDetailsPage implem
                        combo.add(description);\r
                        languages.add(language);\r
                        \r
-                       if (this.language != null && this.language.equals(language)) {\r
+                       if (lastLanguage != null && lastLanguage.equals(language)) {\r
                                index = i;  \r
                        }\r
                        i++;\r
@@ -121,10 +162,38 @@ public class CommonNameDetailsPage extends AbstractDescriptionDetailsPage implem
        @Override\r
        public void selectionChanged(IFormPart part, ISelection selection) {\r
                super.selectionChanged(part, selection);\r
-               combo.removeModifyListener(this);\r
+               combo.removeSelectionListener(this);\r
                text.removeModifyListener(this);\r
                text.setText(((CommonTaxonName) input).getName());\r
-               combo.addModifyListener(this);\r
+               setLanguage(((CommonTaxonName) input).getLanguage());\r
+               combo.addSelectionListener(this);\r
                text.addModifyListener(this);\r
        }\r
+\r
+       /**\r
+        * @param language\r
+        */\r
+       private void setLanguage(Language selectedLanguage) {\r
+               \r
+               if (selectedLanguage == null) {\r
+                       if (lastLanguage != null) {\r
+                               // Use last explicitly selected language\r
+                               selectedLanguage = lastLanguage;\r
+                       } else {\r
+                               // Use first entry in language dropdown\r
+                               selectedLanguage = languages.get(0);\r
+                               combo.select(0);\r
+                               return;\r
+                       }\r
+               }\r
+               \r
+               int i = 0;\r
+               for (Language language : languages) {\r
+                       if (language.equals(selectedLanguage)) {\r
+                               combo.select(i);\r
+                               return;\r
+                       }\r
+                       i++;\r
+               }\r
+       }\r
 }
\ No newline at end of file
index 1251f365ae7258e13d0206b7804a1eca715c010a..afd002bb39dc70573829e58262f0568e19a0eaa5 100644 (file)
@@ -3,13 +3,10 @@
  */\r
 package eu.etaxonomy.taxeditor.editor.descriptiontree;\r
 \r
-import java.util.SortedSet;\r
-\r
 import org.apache.log4j.Logger;\r
 import org.eclipse.jface.viewers.ITreeContentProvider;\r
 import org.eclipse.jface.viewers.Viewer;\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
@@ -25,7 +22,7 @@ public class DescriptionContentProvider implements ITreeContentProvider {
                        .getLogger(DescriptionContentProvider.class);\r
 \r
        private static final Object[] NO_CHILDREN = new Object[0];\r
-\r
+       \r
        private IDescriptiveInformationProvider infoProvider;\r
 \r
        public DescriptionContentProvider(IDescriptiveInformationProvider infoProvider) {\r
@@ -53,9 +50,6 @@ public class DescriptionContentProvider implements ITreeContentProvider {
                                return infoProvider.getDescriptionElements(description, feature).toArray();\r
                        }\r
                }\r
-//             if (parentElement instanceof DescriptionElementBase) {\r
-//                     return infoProvider.getDescriptionFeatures((TaxonDescription) parentElement).toArray();\r
-//             }\r
                return NO_CHILDREN;\r
        }\r
 \r
@@ -63,9 +57,6 @@ public class DescriptionContentProvider implements ITreeContentProvider {
         * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)\r
         */\r
        public Object getParent(Object element) {\r
-//             if (element instanceof DescriptionElementBase) {\r
-//                     ((DescriptionElementBase) element).get\r
-//             }\r
                return null;\r
        }\r
 \r
index 257921a3cc00a3b23236ed4195452213163a0ea6..10ed6256c45a2e63853c00d2b2fd8036ce3f52f4 100644 (file)
@@ -11,7 +11,10 @@ import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelP
 import eu.etaxonomy.cdm.model.common.Language;\r
 import eu.etaxonomy.cdm.model.description.CommonTaxonName;\r
 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
+import eu.etaxonomy.cdm.model.description.Distribution;\r
+import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;\r
 import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
+import eu.etaxonomy.cdm.model.location.NamedArea;\r
 import eu.etaxonomy.cdm.model.media.ImageFile;\r
 import eu.etaxonomy.taxeditor.model.DescriptionHelper;\r
 \r
@@ -25,6 +28,7 @@ public class DescriptionLabelProvider extends LabelProvider implements IStyledLa
                        .getLogger(DescriptionLabelProvider.class);\r
 \r
        public String getText(Object element) {\r
+               // TODO move to DescriptiveInformationProvider?\r
                if (element instanceof TaxonDescription) {\r
                        return getTaxonDescriptionText((TaxonDescription) element);\r
                }\r
@@ -34,6 +38,9 @@ public class DescriptionLabelProvider extends LabelProvider implements IStyledLa
                if (element instanceof CommonTaxonName) {\r
                        return getCommonNameText((CommonTaxonName) element);                    \r
                }\r
+               if (element instanceof Distribution) {\r
+                       return getDistributionText((Distribution) element);                     \r
+               }               \r
                if (element instanceof DescriptionElementBase) {\r
                        return getElementText((DescriptionElementBase) element);\r
                }\r
@@ -43,6 +50,25 @@ public class DescriptionLabelProvider extends LabelProvider implements IStyledLa
                return element.toString();\r
        }       \r
        \r
+       /**\r
+        * @param element\r
+        * @return\r
+        */\r
+       private String getDistributionText(Distribution element) {\r
+               \r
+               String text = "No text provided";\r
+               \r
+               Distribution distribution = (Distribution) element;\r
+               \r
+               NamedArea area = distribution.getArea();\r
+               PresenceAbsenceTermBase<?> status = distribution.getStatus();\r
+               \r
+               if (status != null) {\r
+                       text = area.getLabel() + ", " + status.getLabel();\r
+               }\r
+               return text;\r
+       }\r
+\r
        /**\r
         * @param element\r
         * @return\r
index 6289e4452c1484eb059b1a1fb4865178e79b31bd..3f2a22e6034f79b4f4cebbacac4a75c99bdb553a 100644 (file)
@@ -5,11 +5,13 @@ package eu.etaxonomy.taxeditor.editor.descriptiontree;
 \r
 import org.apache.log4j.Logger;\r
 import org.eclipse.jface.action.MenuManager;\r
+import org.eclipse.jface.viewers.ISelection;\r
 import org.eclipse.jface.viewers.ISelectionChangedListener;\r
 import org.eclipse.jface.viewers.SelectionChangedEvent;\r
 import org.eclipse.jface.viewers.TreePath;\r
 import org.eclipse.jface.viewers.TreeSelection;\r
 import org.eclipse.jface.viewers.TreeViewer;\r
+import org.eclipse.jface.viewers.ViewerComparator;\r
 import org.eclipse.swt.SWT;\r
 import org.eclipse.swt.layout.GridData;\r
 import org.eclipse.swt.layout.GridLayout;\r
@@ -25,7 +27,6 @@ import org.eclipse.ui.forms.SectionPart;
 import org.eclipse.ui.forms.editor.FormPage;\r
 import org.eclipse.ui.forms.widgets.FormToolkit;\r
 import org.eclipse.ui.forms.widgets.Section;\r
-import org.eclipse.ui.navigator.CommonViewer;\r
 \r
 import eu.etaxonomy.cdm.model.description.CommonTaxonName;\r
 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
@@ -34,6 +35,7 @@ import eu.etaxonomy.cdm.model.description.Feature;
 import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
 import eu.etaxonomy.cdm.model.description.TextData;\r
 import eu.etaxonomy.cdm.model.media.ImageFile;\r
+import eu.etaxonomy.taxeditor.model.ImagesHelper;\r
 \r
 /**\r
  * @author p.ciardelli\r
@@ -46,9 +48,11 @@ public class DescriptionMasterDetailsBlock extends MasterDetailsBlock {
        private FormPage page;\r
 \r
        private TreeViewer descriptionViewer;\r
+\r
+       private IDescriptiveInformationProvider descriptiveInformationProvider = new DescriptiveInformationProvider();\r
        \r
        public DescriptionMasterDetailsBlock(FormPage page) {\r
-               this.page = page;\r
+               this.page = page; \r
        }\r
 \r
        /* (non-Javadoc)\r
@@ -79,16 +83,30 @@ public class DescriptionMasterDetailsBlock extends MasterDetailsBlock {
                descriptionViewer = new TreeViewer(tree);\r
                \r
                descriptionViewer.addSelectionChangedListener(new ISelectionChangedListener() {\r
+                       private ISelection lastSelection;\r
+\r
                        public void selectionChanged(SelectionChangedEvent event) {\r
-                               managedForm.fireSelectionChanged(spart, event.getSelection());\r
+                               if (lastSelection != null) {\r
+                                       // Update label of last selection\r
+                                       Object item;\r
+                                       TreePath[] paths = ((TreeSelection) lastSelection).getPaths();\r
+                                       if (paths.length > 0) {\r
+                                               item = ((TreeSelection) lastSelection).getPaths()[0].getLastSegment();\r
+                                               descriptionViewer.update(item, null);\r
+                                       }\r
+                               }\r
+                               managedForm.fireSelectionChanged(spart, event.getSelection());\r
+                               lastSelection = event.getSelection();\r
                        }\r
                });\r
 \r
-               descriptionViewer.setAutoExpandLevel(2);\r
-               descriptionViewer.setContentProvider(new DescriptionContentProvider(new DescriptiveInformationProvider()));\r
+//             descriptionViewer.setAutoExpandLevel(TreeViewer.ALL_LEVELS);\r
+               descriptionViewer.setAutoExpandLevel(2); // Show descriptions and features\r
+               descriptionViewer.setContentProvider(new DescriptionContentProvider(descriptiveInformationProvider));\r
                descriptionViewer.setLabelProvider(new DescriptionLabelProvider());\r
                descriptionViewer.setInput(page.getEditor().getEditorInput());\r
-               \r
+               descriptionViewer.setComparator(new ViewerComparator());\r
+                               \r
                // Set tree as page's selection provider\r
                page.getSite().setSelectionProvider(descriptionViewer);\r
                \r
@@ -113,38 +131,52 @@ public class DescriptionMasterDetailsBlock extends MasterDetailsBlock {
                detailsPart.registerPage(Distribution.class, new DistributionDetailsPage());\r
                detailsPart.registerPage(TextData.class, new TextDataDetailsPage());\r
                detailsPart.registerPage(ImageFile.class, new ImageDetailsPage());\r
-//             detailsPart.setPageProvider(new PageProvider());\r
+               detailsPart.setPageProvider(new PageProvider());\r
        }\r
 \r
        /**\r
-        * @param objectAffectedByOperation \r
-        * \r
+        * @param objectAffectedByOperation\r
         */\r
-       public void refreshTree(Object revealObject) {\r
-               // TODO replace all this crap w CNF\r
-               descriptionViewer.setInput(page.getEditor().getEditorInput());\r
+       public synchronized void refreshTree(Object revealObject) {             \r
+               descriptionViewer.refresh(true);\r
+               \r
                if (revealObject instanceof DescriptionElementBase) {\r
                        DescriptionElementBase element = (DescriptionElementBase) revealObject;\r
                        Object[] segments = new Object[3];\r
                        segments[0] = element.getInDescription();\r
                        segments[1] = element.getFeature();\r
-                       segments[2] = element;\r
+                       \r
+                       TaxonDescriptionFeature tdf = descriptiveInformationProvider.getDescriptionFeature(element);\r
+                       segments[1] = tdf;\r
+                       \r
+                       if (tdf.getFeature().equals(Feature.IMAGE())) {\r
+                               segments[2] = ImagesHelper.getImage(element);\r
+                       } else {\r
+                               segments[2] = element;\r
+                       }                               \r
                        TreePath treePath = new TreePath(segments);\r
                        descriptionViewer.setSelection(new TreeSelection(treePath), true);\r
                }\r
+               \r
+               if (revealObject instanceof TaxonDescription) {\r
+                       TaxonDescription description = (TaxonDescription) revealObject;\r
+                       Object[] segments = new Object[] {(TaxonDescription) revealObject};\r
+                       TreePath treePath = new TreePath(segments);\r
+                       descriptionViewer.setSelection(new TreeSelection(treePath), true);      \r
+               }\r
        }\r
        \r
+       /**\r
+        * @author p.ciardelli\r
+        */\r
        class PageProvider implements IDetailsPageProvider {\r
 \r
                /* (non-Javadoc)\r
                 * @see org.eclipse.ui.forms.IDetailsPageProvider#getPage(java.lang.Object)\r
                 */\r
                public IDetailsPage getPage(Object key) {\r
-                       if (key.equals(ImageFile.class)) {\r
-                               return new ImageDetailsPage();\r
-                       }\r
-                       if (key.equals(TextData.class)) {\r
-                               return new TextDataDetailsPage();\r
+                       if (Feature.DISTRIBUTION().equals(key)) {\r
+                               return new DistributionMapDetailsPage();\r
                        }\r
                        return null;\r
                }\r
@@ -153,13 +185,8 @@ public class DescriptionMasterDetailsBlock extends MasterDetailsBlock {
                 * @see org.eclipse.ui.forms.IDetailsPageProvider#getPageKey(java.lang.Object)\r
                 */\r
                public Object getPageKey(Object object) {\r
-                       if (object instanceof TextData) {\r
-                               TextData textData = (TextData) object;\r
-                               if (textData.getFeature().equals(Feature.IMAGE())) {\r
-                                       return ImageFile.class;\r
-                               } else {\r
-                                       return TextData.class;\r
-                               }\r
+                       if (object instanceof TaxonDescriptionFeature) {\r
+                               return ((TaxonDescriptionFeature) object).getFeature();\r
                        }\r
                        return null;\r
                }\r
index 0314dcbd6fb255e182be9761bd064da66504121f..2648fd4e9aa3d4d49a27bd6bfa0d5be1c47ae140 100644 (file)
@@ -4,11 +4,13 @@
 package eu.etaxonomy.taxeditor.editor.descriptiontree;\r
 \r
 import java.util.ArrayList;\r
-import java.util.HashSet;\r
+import java.util.HashMap;\r
 import java.util.List;\r
+import java.util.Map;\r
 import java.util.Set;\r
 \r
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
+import eu.etaxonomy.cdm.model.description.DescriptionBase;\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
@@ -38,23 +40,55 @@ public class DescriptiveInformationProvider implements
                return featureElements;\r
        }\r
 \r
+       /**\r
+        * TaxonDescriptionFeature objects are cached so that they pass description tree viewer's equality test.\r
+        */\r
+       private Map<TaxonDescription, Map<Feature, TaxonDescriptionFeature>> descriptionFeatureCache = new HashMap<TaxonDescription, Map<Feature, TaxonDescriptionFeature>>();\r
+               \r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.taxeditor.editor.descriptionnew.IDescriptiveInformationProvider#getDescriptionFeatures(eu.etaxonomy.cdm.model.description.TaxonDescription)\r
         */\r
        public List<TaxonDescriptionFeature> getDescriptionFeatures(TaxonDescription description) {\r
                \r
-               List<TaxonDescriptionFeature> features = new ArrayList<TaxonDescriptionFeature>();\r
-               \r
+               Map<Feature, TaxonDescriptionFeature> featureCache = getFeatureCache(description);\r
+                               \r
                Set<DescriptionElementBase> elements = description.getElements();\r
                if (elements != null) {\r
                        for (DescriptionElementBase element : elements) {\r
-                               TaxonDescriptionFeature taxonDescriptionFeature = new TaxonDescriptionFeature(description, element.getFeature());\r
-//                             Feature feature = HibernateProxyHelper.deproxy(element.getFeature(), Feature.class);\r
-                               if (!features.contains(taxonDescriptionFeature)) {\r
-                                       features.add(taxonDescriptionFeature);\r
-                               }\r
+                               Feature feature = HibernateProxyHelper.deproxy(element.getFeature(), Feature.class);\r
+                               \r
+                               // Is there already an entry in map for this Feature?\r
+                               if (!(featureCache.containsKey(feature))) {\r
+                                       featureCache.put(feature, new TaxonDescriptionFeature(description, feature));\r
+                               }                               \r
                        }\r
                }\r
-               return features;\r
+               return new ArrayList<TaxonDescriptionFeature>(featureCache.values());\r
+       }\r
+\r
+       private Map<Feature, TaxonDescriptionFeature> getFeatureCache(TaxonDescription description) {\r
+               Map<Feature, TaxonDescriptionFeature> featureCache = descriptionFeatureCache.get(description);\r
+               if (featureCache == null) {\r
+                       featureCache = new HashMap<Feature, TaxonDescriptionFeature>();\r
+                       descriptionFeatureCache.put(description, featureCache);\r
+               }\r
+               return featureCache;\r
+       }\r
+       \r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.taxeditor.editor.descriptiontree.IDescriptiveInformationProvider#getDescriptionFeature(eu.etaxonomy.cdm.model.description.DescriptionElementBase)\r
+        */\r
+       public TaxonDescriptionFeature getDescriptionFeature(DescriptionElementBase element) {\r
+               \r
+               TaxonDescription description = (TaxonDescription) element.getInDescription();\r
+               Feature feature = HibernateProxyHelper.deproxy(element.getFeature(), Feature.class);\r
+               \r
+               Map<Feature, TaxonDescriptionFeature> featureCache = getFeatureCache(description);\r
+               TaxonDescriptionFeature tdf = featureCache.get(feature);\r
+               if (tdf == null) {\r
+                       tdf = new TaxonDescriptionFeature(description, feature);\r
+                       featureCache.put(feature, tdf);\r
+               }\r
+               return tdf;\r
        }\r
 }\r
index 99bbe6cc1c91a656aa028b32a876a937442f49c5..b1428f0a7581195710144c294e330ae018c968ea 100644 (file)
@@ -65,14 +65,14 @@ public class DistributionDetailsPage extends AbstractDescriptionDetailsPage {
         * Lists to populate drop downs\r
         */\r
        private ArrayList<NamedAreaVocabularyType> vocabularyTypes;  \r
-       private List<PresenceAbsenceTermBase<?>> presenceAbsenceTerms;\r
+       private List<PresenceAbsenceTermBase> statusTerms;\r
        private List<List<NamedArea>> areas = new ArrayList<List<NamedArea>>();\r
        private NamedArea[] selectedAreas = new NamedArea[NUM_AREA_MENUS];\r
        /**\r
         * Static fields to persist default values\r
         */\r
        private static ReferenceBase<?> lastReference;\r
-       private static PresenceAbsenceTermBase<?> lastPresenceAbsence;\r
+       private static PresenceAbsenceTermBase<?> lastStatusTerm;\r
        private static NamedAreaVocabularyType lastVocabType;\r
        private static NamedArea lastNamedArea;\r
        /**\r
@@ -94,6 +94,41 @@ public class DistributionDetailsPage extends AbstractDescriptionDetailsPage {
                initTopLevelVocabularies();\r
        }\r
 \r
+       /**\r
+        * There is no mechanism to retrieve a NamedArea's vocabulary type. Therefore, we\r
+        * store all top-level NamedAreas with their vocabulary types. \r
+        */\r
+       private void initTopLevelVocabularies() {\r
+               for (NamedAreaVocabularyType vocabType : getVocabularyTypes()) {\r
+                       List<NamedArea> list = new ArrayList<NamedArea>();\r
+                       for (NamedArea topLevelArea : locationService.getTopLevelNamedAreasByVocabularyType(vocabType)) {\r
+                               topLevelAreasByArea.put(topLevelArea, vocabType);\r
+                               list.add(topLevelArea);\r
+                       }\r
+                       topLevelAreasByType.put(vocabType, list);\r
+               }\r
+       }\r
+       \r
+//     /**\r
+//      * Set inputs to selections from last time dialog was used.\r
+//      */\r
+//     private void recallPreviousSelections() {\r
+//             if (lastVocabType != null)  {\r
+//                     selectedVocabType = lastVocabType;\r
+//\r
+//                     // Last named area don't make much sense w/out a vocab type\r
+//                     if (lastNamedArea != null) {\r
+//                             selectedArea = lastNamedArea;\r
+//                     }\r
+//             }\r
+//             if (lastStatusTerm != null) {\r
+//                     selectedStatus = lastStatusTerm; \r
+//             }\r
+//             if (lastReference != null) {\r
+//                     selectedReference = lastReference;\r
+//             }\r
+//     }\r
+       \r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.taxeditor.editor.descriptionnew.AbstractDescriptionDetailsPage#selectionChanged(org.eclipse.ui.forms.IFormPart, org.eclipse.jface.viewers.ISelection)\r
         */\r
@@ -115,7 +150,7 @@ public class DistributionDetailsPage extends AbstractDescriptionDetailsPage {
        }\r
        \r
        /**\r
-        * @param b\r
+        * @param enabled\r
         */\r
        private void setSelectionListenersEnabled(boolean enabled) {\r
                this.selectionListenersEnabled = enabled;\r
@@ -126,8 +161,6 @@ public class DistributionDetailsPage extends AbstractDescriptionDetailsPage {
         */\r
        public void createContents(Composite parent) {\r
                super.createContents(parent);\r
-\r
-//             FormToolkit toolkit = mform.getToolkit();\r
                \r
                section.setText("Distribution Details"); //$NON-NLS-1$\r
                \r
@@ -149,9 +182,10 @@ public class DistributionDetailsPage extends AbstractDescriptionDetailsPage {
                areaCombos[i] = createCombo(client); \r
             areaCombos[i].addSelectionListener(new AreaComboListener(i));\r
             areaCombos[i].setEnabled(false);\r
+            areaCombos[i].setVisibleItemCount(20);\r
         }\r
         \r
-        // create presence / absence\r
+        // create status\r
         createLabel("Select status:", client, parent);\r
                statusCombo =  new Combo(client, SWT.BORDER);\r
                statusCombo.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL\r
@@ -173,43 +207,16 @@ public class DistributionDetailsPage extends AbstractDescriptionDetailsPage {
 //             populateReference();\r
        }\r
        \r
-\r
-       \r
        /**\r
-        * There is no mechanism to retrieve a NamedArea's vocabulary type. Therefore, we\r
-        * store all top-level NamedAreas with their vocabulary types. \r
+        * @return\r
         */\r
-       private void initTopLevelVocabularies() {\r
-               for (NamedAreaVocabularyType vocabType : getVocabularyTypes()) {\r
-                       List<NamedArea> list = new ArrayList<NamedArea>();\r
-                       for (NamedArea topLevelArea : locationService.getTopLevelNamedAreasByVocabularyType(vocabType)) {\r
-                               topLevelAreasByArea.put(topLevelArea, vocabType);\r
-                               list.add(topLevelArea);\r
-                       }\r
-                       topLevelAreasByType.put(vocabType, list);\r
-               }\r
+       private Combo createCombo(Composite composite) {\r
+               Combo combo = new Combo(composite, SWT.BORDER);\r
+               combo.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL\r
+                               | GridData.HORIZONTAL_ALIGN_FILL));\r
+               return combo;\r
        }\r
        \r
-       /**\r
-        * Set inputs to selections from last time dialog was used.\r
-        */\r
-       private void recallPreviousSelections() {\r
-               if (lastVocabType != null)  {\r
-                       selectedVocabType = lastVocabType;\r
-\r
-                       // Last named area don't make much sense w/out a vocab type\r
-                       if (lastNamedArea != null) {\r
-                               selectedArea = lastNamedArea;\r
-                       }\r
-               }\r
-               if (lastPresenceAbsence != null) {\r
-                       selectedStatus = lastPresenceAbsence; \r
-               }\r
-               if (lastReference != null) {\r
-                       selectedReference = lastReference;\r
-               }\r
-       }\r
-\r
        class AreaComboListener extends SelectionAdapter {\r
        private int i;\r
                AreaComboListener(int i) {\r
@@ -224,19 +231,25 @@ public class DistributionDetailsPage extends AbstractDescriptionDetailsPage {
     }\r
     \r
        /**\r
+        * @param selectedVocabType\r
         * @return\r
         */\r
-       private Combo createCombo(Composite composite) {\r
-               Combo combo = new Combo(composite, SWT.BORDER);\r
-               combo.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL\r
-                               | GridData.HORIZONTAL_ALIGN_FILL));\r
-               return combo;\r
+       private List<NamedArea> getNamedAreas(NamedAreaVocabularyType vocabularyType) {\r
+               List<NamedArea> topLevelTerms = topLevelAreasByType.get(vocabularyType);\r
+       \r
+               Collections.reverse(topLevelTerms);\r
+               \r
+               areas.add(0, topLevelTerms);\r
+               return topLevelTerms;\r
        }\r
-    \r
+       \r
        /**\r
         * \r
         */\r
        private void populateVocabTypes() {\r
+               \r
+               vocabTypeCombo.removeAll();\r
+               \r
                int i = 0;              \r
                int index = -1;\r
                for (NamedAreaVocabularyType vocabularyType : getVocabularyTypes()) {\r
@@ -253,47 +266,84 @@ public class DistributionDetailsPage extends AbstractDescriptionDetailsPage {
                        vocabTypeCombo.select(index);\r
                }\r
        }\r
-       \r
-       /**\r
-        * @param namedArea\r
-        * @return\r
+\r
+    /**\r
+        * \r
         */\r
-       private List<NamedArea> getNamedAreas(NamedArea namedArea, int depth) {\r
-               List<NamedArea> terms = new ArrayList<NamedArea>();\r
-//             Set<NamedArea> terms = namedArea.getIncludes();\r
-               terms.addAll(namedArea.getIncludes());\r
-               \r
+       private void populateAreas() {\r
+               if (selectedArea == null) {\r
+                       return;\r
+               }\r
                \r
-               areas.add(depth, terms);\r
+               for (int i = 0; i < NUM_AREA_MENUS; i++) {\r
+                       areaCombos[i].removeAll();\r
+                       areaCombos[i].setEnabled(false);\r
+               }\r
                \r
-               return terms;\r
+               List<NamedArea> areasTmp = new ArrayList<NamedArea>();\r
+               NamedArea namedAreaTmp = selectedArea;\r
+               NamedArea parentArea = null;\r
+               do {\r
+                       areasTmp.add(namedAreaTmp);\r
+                       parentArea = getPartOf(namedAreaTmp);  //HibernateProxyHelper.deproxy(namedAreaTmp.getPartOf(), NamedArea.class);\r
+                       if (parentArea == null) {\r
+                               selectedVocabType = getVocabularyTypeForTopLevelArea(namedAreaTmp);                             \r
+                       }\r
+                       namedAreaTmp = parentArea;\r
+               } while (parentArea != null);\r
+               Collections.reverse(areasTmp);\r
+               int depth = 0;\r
+               for (NamedArea namedArea : areasTmp) {\r
+                       selectedAreas[depth] = namedArea;\r
+                       populateAreas(depth);\r
+                       depth++;\r
+               }\r
        }\r
-\r
+       \r
        /**\r
-        * @param selectedVocabType\r
-        * @return\r
+        * @param depth\r
         */\r
-       private List<NamedArea> getNamedAreas(NamedAreaVocabularyType vocabularyType) {\r
-               List<NamedArea> topLevelTerms = topLevelAreasByType.get(vocabularyType);\r
-       \r
-               Collections.reverse(topLevelTerms);\r
+       private void populateAreas(int depth) {\r
+                               \r
+               List<NamedArea> areasTmp;\r
+               if(depth == 0){\r
+                        areasTmp = getNamedAreas(selectedVocabType);\r
+               }else{\r
+                       areasTmp = getNamedAreas(selectedAreas[depth - 1], depth);\r
+               }\r
                \r
-               areas.add(0, topLevelTerms);\r
-               return topLevelTerms;\r
+               int index = -1;\r
+               int i = 0;\r
+               if (areasTmp.size() > 0) {\r
+                       for(NamedArea areaTmp : areasTmp){\r
+                               String areaLabel = areaTmp == null ? "" : areaTmp.getLabel();\r
+                               areaCombos[depth].add(areaLabel);\r
+                               \r
+                               if (selectedAreas[depth] != null && selectedAreas[depth].equals(areaTmp)) {\r
+                                       index = i;\r
+                               }\r
+                               i++;\r
+                       }\r
+                       areaCombos[depth].setEnabled(true);\r
+                       if (index > -1) {\r
+                               areaCombos[depth].select(index);\r
+                       }\r
+               }\r
        }\r
-\r
+       \r
        /**\r
         * \r
         */\r
        private void populateStatus() {\r
-//             logger.info("Updating status menu with " + selectedStatus.getDescription());\r
+\r
+               statusCombo.removeAll();\r
+               \r
                int selectedIndex = -1;\r
                int i = 0;\r
-               for (PresenceAbsenceTermBase<?> term : getPresenceAbsenceTerms()) {\r
+               for (PresenceAbsenceTermBase<?> term : getStatusTerms()) {\r
                        if (term == null) {\r
                        } else {\r
                                statusCombo.add(term.getLabel(CdmStore.getDefaultLanguage()));          \r
-//                             logger.info("Comparing " + term.getDescription() + " with " + selectedStatus.getDescription());\r
                                if (this.selectedStatus != null && this.selectedStatus.equals(term)) {\r
                                        selectedIndex = i;\r
                                }\r
@@ -314,23 +364,6 @@ public class DistributionDetailsPage extends AbstractDescriptionDetailsPage {
                }\r
        }\r
        \r
-       /**\r
-        * @return\r
-        */\r
-       private List<NamedAreaVocabularyType> getVocabularyTypes() {\r
-               if (vocabularyTypes == null) {\r
-                       vocabularyTypes = new ArrayList<NamedAreaVocabularyType>();\r
-                       vocabularyTypes.addAll(locationService.getNamedAreaVocabularyTypes());\r
-               }\r
-               return vocabularyTypes;\r
-       }\r
-       \r
-       /**\r
-        * @return\r
-        */\r
-       private List<PresenceAbsenceTermBase<PresenceAbsenceTermBase<?>>> getPresenceAbsenceTerms() {\r
-               return PreferencesUtil.getPreferredPresenceAbsenceTerms();\r
-       }\r
 \r
        /**\r
         * \r
@@ -338,10 +371,11 @@ public class DistributionDetailsPage extends AbstractDescriptionDetailsPage {
        protected void selectVocabType() {\r
                int i = vocabTypeCombo.getSelectionIndex();\r
                selectedVocabType = getVocabularyTypes().get(i);\r
-               \r
                clearAreas();\r
                \r
                populateAreas(0);\r
+               \r
+//             lastVocabType = selectedVocabType;\r
        }\r
        \r
        /**\r
@@ -357,52 +391,37 @@ public class DistributionDetailsPage extends AbstractDescriptionDetailsPage {
                \r
                clearArea(depth + 1);\r
                populateAreas(depth + 1);\r
+               \r
+               setInputArea(selectedArea);\r
+               \r
+//             lastVocabType = selectedVocabType;\r
+//             lastNamedArea = selectedArea;\r
        }\r
-       \r
+\r
        /**\r
         * \r
         */\r
        protected void selectStatusTerm() {\r
                int i = statusCombo.getSelectionIndex();\r
-               selectedStatus = presenceAbsenceTerms.get(i);\r
+               selectedStatus = statusTerms.get(i);\r
+               \r
+               setInputStatus(selectedStatus);\r
+               \r
+//             lastStatusTerm = selectedStatus;\r
        }\r
 \r
        /**\r
-        * @param i\r
-        * @param index\r
-        * @return\r
+        * @param area\r
         */\r
-       private NamedArea getSelectedArea(int depth, int index) {\r
-               return areas.get(depth).get(index);\r
-       }\r
-\r
-\r
-    /**\r
-        * \r
+       private void setInputArea(NamedArea area) {\r
+               ((Distribution) input).setArea(area);\r
+       }       \r
+       \r
+       /**\r
+        * @param status\r
         */\r
-       private void populateAreas() {\r
-               if (selectedArea == null) {\r
-                       return;\r
-               }\r
-               logger.info("Updating area menu with " + selectedArea.getDescription());\r
-               List<NamedArea> areasTmp = new ArrayList<NamedArea>();\r
-               NamedArea namedAreaTmp = selectedArea;\r
-               NamedArea parentArea = null;\r
-               do {\r
-                       areasTmp.add(namedAreaTmp);\r
-                       parentArea = getPartOf(namedAreaTmp);  //HibernateProxyHelper.deproxy(namedAreaTmp.getPartOf(), NamedArea.class);\r
-                       if (parentArea == null) {\r
-                               selectedVocabType = getVocabularyTypeForTopLevelArea(namedAreaTmp);                             \r
-                       }\r
-                       namedAreaTmp = parentArea;\r
-               } while (parentArea != null);\r
-               Collections.reverse(areasTmp);\r
-               int depth = 0;\r
-               for (NamedArea namedArea : areasTmp) {\r
-                       selectedAreas[depth] = namedArea;\r
-                       populateAreas(depth);\r
-                       depth++;\r
-               }\r
+       private void setInputStatus(PresenceAbsenceTermBase<?> status) {\r
+               ((Distribution) input).setStatus(status);\r
        }\r
        \r
        /**\r
@@ -414,83 +433,78 @@ public class DistributionDetailsPage extends AbstractDescriptionDetailsPage {
        }\r
 \r
        /**\r
-        * @param namedArea\r
         * @return\r
         */\r
-       private NamedArea getPartOf(NamedArea namedArea) {\r
-               if (namedArea instanceof TdwgArea) {\r
-                       return HibernateProxyHelper.deproxy(((NamedArea) namedArea).getPartOfWorkaround(), TdwgArea.class);\r
+       private List<NamedAreaVocabularyType> getVocabularyTypes() {\r
+               if (vocabularyTypes == null) {\r
+                       vocabularyTypes = new ArrayList<NamedAreaVocabularyType>();\r
+                       vocabularyTypes.addAll(locationService.getNamedAreaVocabularyTypes());\r
                }\r
-               return null;\r
+               return vocabularyTypes;\r
        }\r
-\r
+       \r
        /**\r
-        * @param i\r
+        * @param namedArea\r
+        * @return\r
         */\r
-       private void populateAreas(int depth) {\r
-               List<NamedArea> areasTmp;\r
-               if(depth == 0){\r
-                        areasTmp = getNamedAreas(selectedVocabType);\r
-               }else{\r
-                       areasTmp = getNamedAreas(selectedAreas[depth - 1], depth);\r
-               }\r
+       private List<NamedArea> getNamedAreas(NamedArea namedArea, int depth) {\r
+               List<NamedArea> terms = new ArrayList<NamedArea>();\r
+               terms.addAll(namedArea.getIncludes());\r
                \r
-               int index = -1;\r
-               int i = 0;\r
-               if (areasTmp.size() > 0) {\r
-                       for(NamedArea areaTmp : areasTmp){\r
-                               String areaLabel = areaTmp == null ? "" : areaTmp.getLabel();\r
-                               areaCombos[depth].add(areaLabel);\r
-                               \r
-                               if (selectedAreas[depth] != null && selectedAreas[depth].equals(areaTmp)) {\r
-                                       index = i;\r
-                               }\r
-                               i++;\r
-                       }\r
-                       areaCombos[depth].setEnabled(true);\r
-                       if (index > -1) {\r
-                               areaCombos[depth].select(index);\r
+               areas.add(depth, terms);\r
+               \r
+               return terms;\r
+       }\r
+       \r
+       /**\r
+        * @return\r
+        */\r
+       private List<PresenceAbsenceTermBase> getStatusTerms() {\r
+               if (statusTerms == null) {\r
+                       statusTerms = new ArrayList<PresenceAbsenceTermBase>();\r
+                       for (PresenceAbsenceTermBase statusTerm : PreferencesUtil.getPreferredPresenceAbsenceTerms()) {\r
+                               statusTerms.add(statusTerm);\r
                        }\r
                }\r
+               return statusTerms;\r
        }\r
-\r
        \r
        /**\r
-        * @param i\r
+        * @return\r
         */\r
-       private void clearArea(int i) {\r
-               for (int j = i; j < NUM_AREA_MENUS; j++) {\r
-                       // TODO add clear selectedArea\r
-                       areaCombos[j].removeAll();\r
-                       areaCombos[j].setEnabled(false);\r
-               }\r
+       private NamedAreaVocabularyType getVocabType() {\r
+               int i = vocabTypeCombo.getSelectionIndex();\r
+               return vocabularyTypes.get(i);\r
        }\r
 \r
        /**\r
-        * \r
+        * @param i\r
+        * @param index\r
+        * @return\r
         */\r
-       private void clearAreas() {\r
-               clearArea(0);\r
+       private NamedArea getSelectedArea(int depth, int index) {\r
+               return areas.get(depth).get(index);\r
        }\r
-               \r
+       \r
        /**\r
-        * \r
+        * @return\r
         */\r
-       private void setStaticFields() {\r
-               lastPresenceAbsence = getPresenceAbsenceTerm();\r
-               lastNamedArea = selectedArea;\r
-               lastReference = getReference(); \r
-               lastVocabType = getVocabType();\r
+       private PresenceAbsenceTermBase<?> getStatusTerm() {\r
+               int i = statusCombo.getSelectionIndex();\r
+               return statusTerms.get(i);\r
        }\r
-\r
+       \r
        /**\r
+        * @param namedArea\r
         * @return\r
         */\r
-       private NamedAreaVocabularyType getVocabType() {\r
-               int i = vocabTypeCombo.getSelectionIndex();\r
-               return vocabularyTypes.get(i);\r
+       private NamedArea getPartOf(NamedArea namedArea) {\r
+               if (namedArea instanceof TdwgArea) {\r
+                       return HibernateProxyHelper.deproxy(((NamedArea) namedArea).getPartOfWorkaround(), TdwgArea.class);\r
+               }\r
+               return null;\r
        }\r
-\r
+       \r
        /**\r
         * @return\r
         */\r
@@ -503,14 +517,23 @@ public class DistributionDetailsPage extends AbstractDescriptionDetailsPage {
         */\r
        private String getMicroReference() {\r
                return referenceComposite.getMicroReference();\r
-       }\r
+       }       \r
        \r
        /**\r
-        * @return\r
+        * @param i\r
         */\r
-       private PresenceAbsenceTermBase<?> getPresenceAbsenceTerm() {\r
-               int i = statusCombo.getSelectionIndex();\r
-               return presenceAbsenceTerms.get(i);\r
+       private void clearArea(int i) {\r
+               for (int j = i; j < NUM_AREA_MENUS; j++) {\r
+                       // TODO add clear selectedArea\r
+                       areaCombos[j].removeAll();\r
+                       areaCombos[j].setEnabled(false);\r
+               }\r
+       }\r
+\r
+       /**\r
+        * \r
+        */\r
+       private void clearAreas() {\r
+               clearArea(0);\r
        }\r
-       \r
 }\r
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/DistributionMapDetailsPage.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/DistributionMapDetailsPage.java
new file mode 100644 (file)
index 0000000..918d439
--- /dev/null
@@ -0,0 +1,141 @@
+/**\r
+ * \r
+ */\r
+package eu.etaxonomy.taxeditor.editor.descriptiontree;\r
+\r
+import java.awt.Color;\r
+import java.util.Map;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.eclipse.jface.viewers.ISelection;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.browser.Browser;\r
+import org.eclipse.swt.browser.ProgressEvent;\r
+import org.eclipse.swt.browser.ProgressListener;\r
+import org.eclipse.swt.events.ControlEvent;\r
+import org.eclipse.swt.events.ControlListener;\r
+import org.eclipse.swt.layout.GridData;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.ProgressBar;\r
+import org.eclipse.ui.forms.IFormPart;\r
+\r
+import eu.etaxonomy.cdm.ext.EditGeoService;\r
+import eu.etaxonomy.cdm.ext.IEditGeoService;\r
+import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+\r
+/**\r
+ * @author p.ciardelli\r
+ *\r
+ */\r
+public class DistributionMapDetailsPage extends AbstractDescriptionDetailsPage {\r
+       private static final Logger logger = Logger\r
+                       .getLogger(DistributionMapDetailsPage.class);\r
+       \r
+       private Browser browser;\r
+       private IEditGeoService geoService;\r
+\r
+       private Taxon taxon;\r
+       private Composite parent;\r
+       \r
+       public DistributionMapDetailsPage() {\r
+               geoService = new EditGeoService();              \r
+       }\r
+       \r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.taxeditor.editor.descriptiontree.AbstractDescriptionDetailsPage#createContents(org.eclipse.swt.widgets.Composite)\r
+        */\r
+       @Override\r
+       public void createContents(Composite parent) {\r
+               super.createContents(parent);\r
+               \r
+               this.parent = parent;\r
+               \r
+               section.setText("Distribution Overview"); //$NON-NLS-1$\r
+               \r
+//             GridLayout gridLayout = new GridLayout();\r
+//             gridLayout.numColumns = 1;\r
+//             shell.setLayout(gridLayout);\r
+               \r
+               browser = new Browser(parent, SWT.NONE);\r
+               \r
+               GridData data = new GridData();\r
+               data.horizontalAlignment = GridData.FILL;\r
+               data.verticalAlignment = GridData.FILL;\r
+               data.grabExcessHorizontalSpace = true;\r
+               data.grabExcessVerticalSpace = true;\r
+               \r
+               browser.setLayoutData(data);\r
+               \r
+               final ProgressBar progressBar = new ProgressBar(parent, SWT.NONE);\r
+               data = new GridData();\r
+               data.horizontalAlignment = GridData.END;\r
+               progressBar.setLayoutData(data);\r
+               \r
+\r
+               browser.addProgressListener(new ProgressListener() {\r
+                       public void changed(ProgressEvent event) {\r
+                                       if (event.total == 0) return;                            \r
+                                       int ratio = event.current * 100 / event.total;\r
+                                       progressBar.setSelection(ratio);\r
+                       }\r
+                       public void completed(ProgressEvent event) {\r
+                               progressBar.setSelection(0);\r
+                       }\r
+               });\r
+               \r
+               parent.addControlListener(new ControlListener(){\r
+\r
+                       public void controlMoved(ControlEvent e) {\r
+                               // do nothing\r
+                       }\r
+\r
+                       public void controlResized(ControlEvent e) {\r
+                               loadMap();\r
+                       }\r
+                       \r
+               });\r
+       }\r
+       \r
+       private void loadMap(){\r
+               if (taxon != null) {\r
+                       browser.setUrl(getMapUrl());\r
+               }\r
+       }\r
+       \r
+       private String getMapUrl(){\r
+               // FIXME make these hardcoded parameters configurable via preferences\r
+               String url = "http://edit.csic.es/v1/areas.php";\r
+               Map<PresenceAbsenceTermBase<?>,Color> presenceAbsenceTermColors = null;\r
+               int width = calculateWidth();\r
+               int height = 0; \r
+               String bbox = "-180,-90,180,90"; \r
+               String backLayer = null;\r
+               \r
+               String parameter = geoService.getEditGeoServiceUrlParameterString(\r
+                               taxon, \r
+                               presenceAbsenceTermColors, \r
+                               width, \r
+                               height, \r
+                               bbox, \r
+                               backLayer);\r
+               \r
+               return url + "?" + parameter;\r
+       }\r
+\r
+       /**\r
+        * @return\r
+        */\r
+       private int calculateWidth(){\r
+               return parent.getSize().x - 10;\r
+       }\r
+       \r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.taxeditor.editor.descriptiontree.AbstractDescriptionDetailsPage#selectionChanged(org.eclipse.ui.forms.IFormPart, org.eclipse.jface.viewers.ISelection)\r
+        */\r
+       @Override\r
+       public void selectionChanged(IFormPart part, ISelection selection) {\r
+               super.selectionChanged(part, selection);\r
+               taxon = ((TaxonDescriptionFeature) input).getDescription().getTaxon();\r
+       }\r
+}\r
index aca717d18a53db59ef9befd073390de7ead5583f..8033cbfa17965bfbac2a71896783a10d1c718b0d 100644 (file)
@@ -18,5 +18,6 @@ public interface IDescriptiveInformationProvider {
        List<TaxonDescriptionFeature> getDescriptionFeatures(TaxonDescription description);\r
        \r
        List<DescriptionElementBase> getDescriptionElements(TaxonDescription description, Feature feature);\r
-       \r
+\r
+       TaxonDescriptionFeature getDescriptionFeature(DescriptionElementBase element);\r
 }\r
index 0aedac88ca95396b8c89c178b8f9cd963d601d9f..8c3008eabeb5b6462fea9968b1aa66337c58299c 100644 (file)
@@ -14,7 +14,9 @@ import org.eclipse.swt.events.MouseAdapter;
 import org.eclipse.swt.events.MouseEvent;\r
 import org.eclipse.swt.events.PaintEvent;\r
 import org.eclipse.swt.events.PaintListener;\r
+import org.eclipse.swt.graphics.GC;\r
 import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.graphics.Rectangle;\r
 import org.eclipse.swt.layout.GridData;\r
 import org.eclipse.swt.layout.GridLayout;\r
 import org.eclipse.swt.widgets.Button;\r
@@ -42,7 +44,7 @@ public class ImageDetailsPage extends AbstractDescriptionDetailsPage implements
         */\r
        public void modifyText(ModifyEvent e) {\r
                ((ImageFile) input).setUri(text.getText());\r
-               mform.dirtyStateChanged();\r
+               fireStateChanged();\r
        }       \r
        \r
        /* (non-Javadoc)\r
@@ -83,18 +85,21 @@ public class ImageDetailsPage extends AbstractDescriptionDetailsPage implements
                });\r
                \r
                // Create composite for search text, search term input, and "Search" button\r
-               final Composite imageComposite = new Composite(client, SWT.BORDER);\r
+               final Composite imageComposite = new Composite(client, SWT.NONE);\r
                imageComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));\r
                imageComposite.setLayout(new GridLayout());\r
                 \r
-//             canvas = new Canvas(this, SWT.NO_REDRAW_RESIZE);\r
-               canvas = new Canvas(imageComposite, SWT.NONE);\r
-                               \r
+               canvas = new Canvas(imageComposite, SWT.NO_REDRAW_RESIZE);\r
+//             canvas = new Canvas(imageComposite, SWT.BORDER);\r
+               GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);\r
+               \r
+               // TODO this is a quick fix, couldnt figure out how to get the window to resize for new images\r
+               gd.heightHint = 1000;\r
+               canvas.setLayoutData(gd);                               \r
+               \r
                canvas.addPaintListener (new PaintListener () {\r
                        public void paintControl (PaintEvent e) {\r
                                if (image != null) {\r
-//                                     canvas.setBounds(image.getBounds());\r
-//                                     e.gc.drawImage (image, canvas.getLocation().x, canvas.getLocation().y);\r
                                        e.gc.drawImage (image, 0, 0);\r
                                }\r
                        }\r
@@ -108,17 +113,25 @@ public class ImageDetailsPage extends AbstractDescriptionDetailsPage implements
                String uriString = ((ImageFile) input).getUri();\r
                if (uriString == null || uriString.length() == 0) {\r
                        // TODO draw empty image\r
+                       showImageNotFound();\r
                        return;\r
                }\r
                try {\r
                        URI uri = new URI (uriString);\r
                        image = ImageResources.getImage(uri);\r
-                       canvas.setBounds(image.getBounds());    \r
+                       mform.reflow(true);\r
                } catch (URISyntaxException e) {\r
                        // TODO Auto-generated catch block\r
                        e.printStackTrace();\r
+                       showImageNotFound();\r
                }\r
        }\r
+       \r
+       private void showImageNotFound() {\r
+               image = ImageResources.getImageNotFound();\r
+               image = ImageResources.getImage(ImageResources.IMG_NOT_FOUND);\r
+               canvas.setBounds(image.getBounds());\r
+       }\r
 \r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.taxeditor.editor.descriptionnew.AbstractDescriptionDetailsPage#selectionChanged(org.eclipse.ui.forms.IFormPart, org.eclipse.jface.viewers.ISelection)\r
@@ -130,6 +143,7 @@ public class ImageDetailsPage extends AbstractDescriptionDetailsPage implements
                text.removeModifyListener(this);\r
                text.setText(\r
                                CdmUtils.Nz(((ImageFile) input).getUri()));\r
+               showImage();\r
                text.addModifyListener(this);\r
                \r
                showImage();\r
index fd554f5ad83ab849c49fa126e324324e5c0faace..e3d35c8e3b15f99f2095512d8256989831b6caca 100644 (file)
@@ -29,7 +29,7 @@ public class TaxonDescriptionDetailsPage extends AbstractDescriptionDetailsPage
         */\r
        public void modifyText(ModifyEvent e) {\r
                ((TaxonDescription) input).setTitleCache(text.getText());\r
-               mform.dirtyStateChanged();\r
+               fireStateChanged();\r
        }       \r
        \r
        /* (non-Javadoc)\r
index e28132e42a0ced1fb0b42b3ef6b7239214ab8dc2..b14a1dd4c9e79b1015cbd972a7c33bcf8a37cd93 100644 (file)
@@ -3,6 +3,8 @@
  */\r
 package eu.etaxonomy.taxeditor.editor.descriptiontree;\r
 \r
+import org.apache.log4j.Logger;\r
+\r
 import eu.etaxonomy.cdm.model.description.Feature;\r
 import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
 \r
@@ -13,6 +15,8 @@ import eu.etaxonomy.cdm.model.description.TaxonDescription;
  *\r
  */\r
 public class TaxonDescriptionFeature {\r
+       private static final Logger logger = Logger.getLogger(TaxonDescriptionFeature.class);\r
+       \r
        private TaxonDescription description;\r
        private Feature feature;\r
 \r
@@ -34,19 +38,4 @@ public class TaxonDescriptionFeature {
        public Feature getFeature() {\r
                return feature;\r
        }\r
-       \r
-       /* (non-Javadoc)\r
-        * @see java.lang.Object#equals(java.lang.Object)\r
-        */\r
-       @Override\r
-       public boolean equals(Object obj) {\r
-               if (obj == null || !(obj instanceof TaxonDescriptionFeature)) {\r
-                       return false;\r
-               }\r
-               TaxonDescriptionFeature tdf = (TaxonDescriptionFeature) obj;\r
-               if (feature.equals(tdf.getFeature()) && description.equals(tdf.getDescription())) {\r
-                       return true;\r
-               }\r
-               return super.equals(obj);\r
-       }\r
 }
\ No newline at end of file
index d3b847426412bf87a2353f52dbd93f1f18b4d4b7..e49b7683c0d631b8d8ffc2c36a5efdfd58461191 100644 (file)
@@ -73,6 +73,7 @@ public class TaxonDescriptionTreeEditor extends FormPage implements IPostOperati
         * @see eu.etaxonomy.taxeditor.operations.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)\r
         */\r
        public boolean postOperation(CdmBase objectAffectedByOperation) {\r
+               getManagedForm().dirtyStateChanged();\r
                block.refreshTree(objectAffectedByOperation);\r
                return true;\r
        }\r
index 74307ffc171257e1b7a624940ce5064c83ff2135..0e7e2dae0d7dfaf8d1b3bb87262ea9f1934005f7 100644 (file)
@@ -28,7 +28,7 @@ public class TextDataDetailsPage extends AbstractDescriptionDetailsPage implemen
         */\r
        public void modifyText(ModifyEvent e) {\r
                DescriptionHelper.setCache((DescriptionElementBase) input, text.getText());\r
-               mform.dirtyStateChanged();\r
+               fireStateChanged();\r
        }       \r
        \r
        /* (non-Javadoc)\r
index 22e9959834d10129f58e15a7219eceac42828c17..b49fad3e91ab703fe2aab801416241f008932e93 100644 (file)
@@ -16,6 +16,7 @@ import org.eclipse.core.commands.common.NotDefinedException;
 import org.eclipse.core.commands.operations.IUndoableOperation;\r
 import org.eclipse.ui.IEditorInput;\r
 import org.eclipse.ui.IEditorPart;\r
+import org.eclipse.ui.forms.editor.FormEditor;\r
 import org.eclipse.ui.handlers.HandlerUtil;\r
 \r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
@@ -40,6 +41,9 @@ public class AddDescriptionHandler extends AbstractHandler {
        public Object execute(ExecutionEvent event) throws ExecutionException {\r
                \r
                IEditorPart editor = HandlerUtil.getActiveEditor(event);\r
+               if (editor instanceof FormEditor) {\r
+                       editor = ((FormEditor) editor).getActiveEditor();\r
+               }\r
                IEditorInput input = editor.getEditorInput();\r
                if (input instanceof TaxonEditorInput) {\r
                        Taxon taxon = ((TaxonEditorInput) input).getTaxon();    \r
index c32250404b37a018efcb21994d026626da697cfd..718678f924d8c3e6da9ca91c99fe55e91b1bee47 100644 (file)
@@ -15,6 +15,7 @@ import org.eclipse.jface.viewers.TreeSelection;
 import org.eclipse.swt.widgets.Event;\r
 import org.eclipse.ui.IEditorInput;\r
 import org.eclipse.ui.IEditorPart;\r
+import org.eclipse.ui.forms.editor.FormEditor;\r
 import org.eclipse.ui.handlers.HandlerUtil;\r
 \r
 import eu.etaxonomy.cdm.model.description.Feature;\r
@@ -40,6 +41,9 @@ public class DeleteDescriptionHandler extends AbstractHandler {
         */\r
        public Object execute(ExecutionEvent event) throws ExecutionException {\r
                IEditorPart editor = HandlerUtil.getActiveEditor(event);\r
+               if (editor instanceof FormEditor) {\r
+                       editor = ((FormEditor) editor).getActiveEditor();\r
+               }\r
                IEditorInput input = editor.getEditorInput();\r
                if (input instanceof TaxonEditorInput) {\r
                        Taxon taxon = ((TaxonEditorInput) input).getTaxon();\r