ref #7887 Use DTOs in term editor
authorPatrick Plitzner <p.plitzner@bgbm.org>
Fri, 9 Nov 2018 08:16:44 +0000 (09:16 +0100)
committerPatrick Plitzner <p.plitzner@bgbm.org>
Fri, 9 Nov 2018 08:16:44 +0000 (09:16 +0100)
48 files changed:
eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/e4/BulkEditorE4.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/AreasSelectionDialog.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/DescriptiveDataSetComposite.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/DescriptiveDataSetEditor.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/e4/AbstractGraphKeyEditorE4.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/polytomous/e4/PolytomousKeyListEditorE4.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/e4/TaxonNameEditorE4.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/e4/container/AbstractGroupE4.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/e4/handler/ChangeSynonymToAcceptedTaxonHandlerE4.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/e4/handler/DeleteTaxonBaseHandlerE4.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/e4/handler/MoveSynonymToAnotherAcceptedTaxonHandlerE4.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/e4/handler/SwapSynonymAndAcceptedHandlerE4.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateView.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/e4/handler/MoveDescriptionElementsHandlerE4.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/e4/handler/MoveDescriptionToOtherTaxonHandlerE4.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/uses/e4/UsesViewPartE4.java
eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/key/polytomous/e4/PolytomousKeyViewPartE4.java
eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/e4/TaxonNavigatorE4.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/DefinedTermSorter.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/TermBasePropertyTester.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/TermDtoContentProvider.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/TermDtoLabelProvider.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/TermLabelProvider.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/e4/DefinedTermDragListenerE4.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/e4/DefinedTermDropAdapterE4.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/e4/DefinedTermEditorE4.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/e4/handler/CreateDefinedTermHandlerE4.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/e4/handler/CreateTermVocabularyHandlerE4.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/e4/handler/DeleteTermBaseHandlerE4.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/input/TermEditorInput.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/operation/CreateDefinedTermOperation.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/operation/CreateTermVocabularyOperation.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/operation/DeleteTermBaseOperation.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/operation/MoveDefinedTermOperation.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/AvailableFeaturesWizardPage.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/e4/FeatureTreeEditor.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/l10n/Messages.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/l10n/messages.properties
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/l10n/messages_de.properties
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/operation/AbstractPersistentPostOperation.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/operation/AbstractPostOperation.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/operation/IPostOperationEnabled.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/wizard/AreaLabelProvider.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/wizard/AvailableDistributionPage.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/wizard/AvailableDistributionStatusPage.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/wizard/CheckBoxTreeComposite.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/e4/AbstractCdmEditorPartE4.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/e4/details/DetailsViewerE4.java

index 6bb6308aa850c9f17c417c9d4abe0423bc8c0288..0e4ecd9bc36a0bc9dde07634ab3738619d3fbbfc 100644 (file)
@@ -236,7 +236,7 @@ public class BulkEditorE4 implements IPartContentHasDetails, IConversationEnable
     }
 
     @Override
-    public boolean postOperation(CdmBase objectAffectedByOperation) {
+    public boolean postOperation(Object objectAffectedByOperation) {
         return false;
     }
 
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/AreasSelectionDialog.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/AreasSelectionDialog.java
new file mode 100644 (file)
index 0000000..e945753
--- /dev/null
@@ -0,0 +1,92 @@
+/**
+* Copyright (C) 2018 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.editor.descriptiveDataSet;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+import eu.etaxonomy.cdm.api.service.IVocabularyService;
+import eu.etaxonomy.cdm.model.common.TermType;
+import eu.etaxonomy.cdm.model.common.TermVocabulary;
+import eu.etaxonomy.cdm.model.location.NamedArea;
+import eu.etaxonomy.cdm.persistence.dto.TermDto;
+import eu.etaxonomy.taxeditor.editor.definedterm.TermDtoContentProvider;
+import eu.etaxonomy.taxeditor.editor.definedterm.TermDtoLabelProvider;
+import eu.etaxonomy.taxeditor.preference.wizard.CheckBoxTreeComposite;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+
+/**
+ * @author pplitzner
+ * @since Oct 29, 2018
+ *
+ */
+public class AreasSelectionDialog extends Dialog{
+
+    private CheckBoxTreeComposite treeComposite;
+
+    private Set<TermDto> selectedAreas = new HashSet<>();
+
+    private Collection<TermVocabulary<NamedArea>> areaVocabularies;
+
+
+    protected AreasSelectionDialog(Shell parentShell, Set<TermDto> selectedAreas) {
+        super(parentShell);
+        this.selectedAreas = selectedAreas;
+        this.areaVocabularies = CdmStore.getService(IVocabularyService.class).findByTermType(TermType.NamedArea, null);
+    }
+
+    @Override
+    protected Control createDialogArea(Composite parent) {
+        parent.setLayout(new GridLayout());
+        treeComposite = new CheckBoxTreeComposite(parent, new TermDtoContentProvider(), new TermDtoLabelProvider(), SWT.NONE);
+        treeComposite.getViewer().setInput(areaVocabularies);
+        treeComposite.setCheckedElements(selectedAreas.toArray());
+        GridLayoutFactory.fillDefaults().applyTo(treeComposite);
+        return treeComposite;
+    }
+
+    @Override
+    protected void configureShell(Shell newShell) {
+        super.configureShell(newShell);
+        newShell.setText("Choose areas");
+        newShell.setSize(400, 600);
+    }
+
+    @Override
+    protected void okPressed() {
+        selectedAreas.clear();
+        List<Object> checkedElements = Arrays.asList(treeComposite.getViewer().getCheckedElements());
+        checkedElements = checkedElements.stream().filter(element->element instanceof TermDto).collect(Collectors.toList());
+        Collections.sort(checkedElements, (o1, o2)->((TermDto)o1).getOrderIndex()-((TermDto)o2).getOrderIndex());
+        selectedAreas = new HashSet(checkedElements);
+        super.okPressed();
+    }
+
+    @Override
+    protected boolean isResizable() {
+        return true;
+    }
+
+    public Set<TermDto> getSelectedAreas(){
+        return selectedAreas;
+    }
+}
index 58810580ce46788171d38956800923aa173a59ea..4ad5a73fd5d1a104d57a9469944a4e2403a1e097 100644 (file)
@@ -8,6 +8,10 @@
  */
 package eu.etaxonomy.taxeditor.editor.descriptiveDataSet;
 
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
@@ -20,8 +24,9 @@ import org.eclipse.swt.widgets.Tree;
 
 import eu.etaxonomy.cdm.model.common.TermType;
 import eu.etaxonomy.cdm.model.description.FeatureTree;
-import eu.etaxonomy.cdm.model.location.NamedArea;
 import eu.etaxonomy.cdm.model.name.Rank;
+import eu.etaxonomy.cdm.persistence.dto.TermDto;
+import eu.etaxonomy.cdm.remote.l10n.TermRepresentation_L10n;
 import eu.etaxonomy.taxeditor.editor.l10n.Messages;
 import eu.etaxonomy.taxeditor.featuretree.e4.FeatureTreeEditorComposite;
 import eu.etaxonomy.taxeditor.model.ImageResources;
@@ -40,10 +45,9 @@ public class DescriptiveDataSetComposite extends Composite {
     private TermUuidComboViewer comboRankMax;
     private FeatureTreeEditorComposite featureTreeEditorComposite;
     private TreeViewer taxonNodeTree;
-    private NamedArea area;
+    private Set<TermDto> areas = new HashSet<>();
     private Text textAreaText;
     private Button btnChooseArea;
-    private Button btnRemoveArea;
     private Button btnRemoveRankMin;
     private Button btnRemoveRankMax;
 
@@ -115,7 +119,7 @@ public class DescriptiveDataSetComposite extends Composite {
 
         Composite composite = new Composite(this, SWT.NONE);
         composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));
-        GridLayout gl_composite = new GridLayout(3, false);
+        GridLayout gl_composite = new GridLayout(2, false);
         gl_composite.horizontalSpacing = 0;
         gl_composite.verticalSpacing = 0;
         gl_composite.marginHeight = 0;
@@ -130,9 +134,6 @@ public class DescriptiveDataSetComposite extends Composite {
         btnChooseArea = new Button(composite, SWT.NONE);
         btnChooseArea.setImage(ImageResources.getImage(ImageResources.BROWSE_ICON));
 
-        btnRemoveArea = new Button(composite, SWT.NONE);
-        btnRemoveArea.setImage(ImageResources.getImage(ImageResources.TRASH_ICON));
-
         featureTreeEditorComposite = new FeatureTreeEditorComposite(this, SWT.NONE);
         featureTreeEditorComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
     }
@@ -173,24 +174,19 @@ public class DescriptiveDataSetComposite extends Composite {
     public TreeViewer getTaxonNodeTree() {
         return taxonNodeTree;
     }
-
-    public NamedArea getArea(){
-        return area;
+    public Set<TermDto> getAreas() {
+        return areas;
     }
-    public void setArea(NamedArea area) {
-        this.area = area;
-        textAreaText.setText(area.getLabel());
-    }
-    public void removeArea() {
-        this.area = null;
-        textAreaText.setText(""); //$NON-NLS-1$
+    public void setAreas(Set<TermDto> areas) {
+        this.areas = areas;
+        textAreaText.setText(areas.stream().map(area->{
+            area.localize(new TermRepresentation_L10n());
+            return area.getRepresentation_L10n();
+        }).collect(Collectors.joining(", ")));
     }
     public Button getBtnChooseArea() {
         return btnChooseArea;
     }
-    public Button getBtnRemoveArea() {
-        return btnRemoveArea;
-    }
     public Button getBtnRemoveRankMin() {
         return btnRemoveRankMin;
     }
index ea1567ec14a4b53c6aa0570a48b77dddc1b7668b..d4b4a9dab8ee97b742b90f5d4f18b419cf5feea7 100644 (file)
@@ -17,6 +17,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
+import java.util.stream.Collectors;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
@@ -36,6 +37,7 @@ import org.eclipse.jface.util.LocalSelectionTransfer;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.dnd.DND;
 import org.eclipse.swt.dnd.Transfer;
@@ -63,6 +65,7 @@ import eu.etaxonomy.cdm.model.name.Rank;
 import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode;
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto;
+import eu.etaxonomy.cdm.persistence.dto.TermDto;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
 import eu.etaxonomy.taxeditor.editor.l10n.Messages;
 import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
@@ -72,7 +75,6 @@ import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
 import eu.etaxonomy.taxeditor.store.CdmStore;
-import eu.etaxonomy.taxeditor.ui.dialog.selection.NamedAreaSelectionDialog;
 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
 import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
 
@@ -152,19 +154,14 @@ IPartContentHasDetails, IPartContentHasSupplementalData, IDirtyMarkable {
 
             @Override
             public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
-                NamedArea area = NamedAreaSelectionDialog.select(shell, null, null);
-                if(area!=null){
-                    composite.setArea(area);
+                AreasSelectionDialog areasSelectionDialog = new AreasSelectionDialog(composite.getShell(), composite.getAreas());
+                if(areasSelectionDialog.open()==Window.OK){
+                    Set<TermDto> selectedAreas = areasSelectionDialog.getSelectedAreas();
+                    if(selectedAreas!=null){
+                        composite.setAreas(selectedAreas);
+                        dirty.setDirty(true);
+                    }
                 }
-                dirty.setDirty(true);
-            }
-        });
-        composite.getBtnRemoveArea().addSelectionListener(new SelectionAdapter() {
-
-            @Override
-            public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
-                composite.removeArea();
-                dirty.setDirty(true);
             }
         });
 
@@ -207,7 +204,13 @@ IPartContentHasDetails, IPartContentHasSupplementalData, IDirtyMarkable {
         }
         Set<NamedArea> geoFilter = descriptiveDataSet.getGeoFilter();
         if(geoFilter!=null && !geoFilter.isEmpty()){
-            composite.setArea(geoFilter.iterator().next());
+            Set<TermDto> terms = geoFilter.stream().map(filter->new TermDto(
+                    filter.getUuid(),
+                    filter.getRepresentations(),
+                    filter.getPartOf()!=null?filter.getPartOf().getUuid():null,
+                    filter.getVocabulary().getUuid(),
+                    filter.getOrderIndex())).collect(Collectors.toSet());
+            composite.setAreas(terms);
         }
         Set<TaxonNode> taxonSubtreeFilter = descriptiveDataSet.getTaxonSubtreeFilter();
         if(taxonSubtreeFilter!=null){
@@ -271,11 +274,7 @@ IPartContentHasDetails, IPartContentHasSupplementalData, IDirtyMarkable {
     @Persist
     @Override
     public void save(IProgressMonitor monitor) {
-        NamedArea area = composite.getArea();
-        Set<NamedArea> areas = new HashSet<>();
-        if(area!=null){
-            areas.add(area);
-        }
+        Set<TermDto> areas = composite.getAreas();
         Object input = composite.getTaxonNodeTree().getInput();
         if(input!=null){
             descriptiveDataSet.setTaxonSubtreeFilter(new HashSet<>());//clear existing filter
@@ -308,7 +307,11 @@ IPartContentHasDetails, IPartContentHasSupplementalData, IDirtyMarkable {
         descriptiveDataSet.setMaxRank(rankMax);
         descriptiveDataSet.setMinRank(rankMin);
         descriptiveDataSet.setDescriptiveSystem(characters);
-        descriptiveDataSet.setGeoFilter(areas);
+        List<DefinedTermBase> terms = CdmStore.getService(ITermService.class)
+                .load(areas.stream().map(area -> area.getUuid()).collect(Collectors.toList()), null);
+        Set<NamedArea> areaTerms = new HashSet<>();
+        terms.forEach(term->areaTerms.add((NamedArea) term));
+        descriptiveDataSet.setGeoFilter(areaTerms);
 
         conversation.commit();
         CdmStore.getService(IDescriptiveDataSetService.class).merge(descriptiveDataSet, true);
index a9ade8cc2297661e5c84c656b2978efdc5fa73ca..be834f8839300052dc2026326e4ea8bdcee98ae4 100644 (file)
@@ -26,7 +26,6 @@ import org.eclipse.zest.layouts.LayoutStyles;
 import org.eclipse.zest.layouts.algorithms.TreeLayoutAlgorithm;
 
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
-import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.description.IIdentificationKey;
 import eu.etaxonomy.cdm.model.description.PolytomousKeyNode;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
@@ -157,7 +156,7 @@ implements IConversationEnabled, IE4SavablePart,
        }
 
        @Override
-       public boolean postOperation(CdmBase objectAffectedByOperation) {
+       public boolean postOperation(Object objectAffectedByOperation) {
                setDirty(true);
                refresh();
 
index ae1fc1dd0bb5f33e7eba560047f79e8faf753de6..a4cfd124e78fd1f45678319238bd3aa8141619af 100644 (file)
@@ -42,7 +42,6 @@ import org.eclipse.swt.widgets.TableItem;
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
-import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.description.PolytomousKey;
 import eu.etaxonomy.cdm.model.description.PolytomousKeyNode;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
@@ -314,7 +313,7 @@ public class PolytomousKeyListEditorE4 implements
     }
 
        @Override
-       public boolean postOperation(CdmBase objectAffectedByOperation) {
+       public boolean postOperation(Object objectAffectedByOperation) {
                viewer.refresh();
 
                if (objectAffectedByOperation != null) {
index c74ebfbdb55be80c5763706bda71dd43af6faf71..11c5d802c01a73c642dad605bed97510dc53c2bc 100644 (file)
@@ -313,7 +313,7 @@ public class TaxonNameEditorE4 implements IConversationEnabled, IDirtyMarkable,
        }
 
        @Override
-    public boolean postOperation(CdmBase objectAffectedByOperation) {
+    public boolean postOperation(Object objectAffectedByOperation) {
 
                changed(objectAffectedByOperation);
 
index c4e636f1c846cac2b9b35feebe79266b7dfc4c15..95678e450aa27d2d72800eb45228cec7427174fe 100644 (file)
@@ -24,7 +24,6 @@ import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.forms.widgets.TableWrapData;
 import org.eclipse.ui.forms.widgets.TableWrapLayout;
 
-import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.taxeditor.editor.CdmDataTransfer;
 import eu.etaxonomy.taxeditor.editor.name.e4.IDropTargetableE4;
 import eu.etaxonomy.taxeditor.editor.name.e4.TaxonNameEditorE4;
@@ -150,7 +149,7 @@ public abstract class AbstractGroupE4 implements IDropTargetableE4{
 
        /** {@inheritDoc} */
        @Override
-    public boolean postOperation(CdmBase objectAffectedByOperation) {
+    public boolean postOperation(Object objectAffectedByOperation) {
                editor.changed(objectAffectedByOperation);
                redraw();
                return true;
index 6d6a998e68c4058a5b404478a7bd86da9d56c1f8..fb35f73895adf4e81de75b6d628d7f59630a316f 100644 (file)
@@ -26,7 +26,6 @@ import org.eclipse.e4.ui.workbench.modeling.EPartService;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.swt.widgets.Shell;
 
-import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
 import eu.etaxonomy.cdm.model.name.TaxonName;
 import eu.etaxonomy.cdm.model.taxon.Synonym;
@@ -108,7 +107,7 @@ public class ChangeSynonymToAcceptedTaxonHandlerE4 implements IPostOperationEnab
 
        /** {@inheritDoc} */
        @Override
-    public boolean postOperation(CdmBase objectAffectedByOperation) {
+    public boolean postOperation(Object objectAffectedByOperation) {
 
                // Redraw existing editor
                ((IPostOperationEnabled) editor).postOperation(null);
index bb2501a7e854224e92659573415af75619cf3a45..e14fbc82755eb358b00f6f239e6acc4f4fb4257c 100644 (file)
@@ -25,7 +25,6 @@ import eu.etaxonomy.cdm.api.service.ITaxonService;
 import eu.etaxonomy.cdm.api.service.config.SynonymDeletionConfigurator;
 import eu.etaxonomy.cdm.api.service.config.TaxonBaseDeletionConfigurator;
 import eu.etaxonomy.cdm.api.service.config.TaxonDeletionConfigurator;
-import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.taxon.Synonym;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
@@ -167,7 +166,7 @@ public class DeleteTaxonBaseHandlerE4 implements IPostOperationEnabled {
     }
 
        @Override
-       public boolean postOperation(CdmBase objectAffectedByOperation) {
+       public boolean postOperation(Object objectAffectedByOperation) {
            editor.redraw();
                return true;
        }
index 1e18382fc851d118ec17a248649de32a695b9326..1e3a8e8822ac1b874b7612cb9ac480071b469f6b 100644 (file)
@@ -20,7 +20,6 @@ import org.eclipse.e4.ui.workbench.modeling.EPartService;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.swt.widgets.Shell;
 
-import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.taxon.Synonym;
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
@@ -108,7 +107,7 @@ public class MoveSynonymToAnotherAcceptedTaxonHandlerE4 implements IPostOperatio
     }
 
        @Override
-       public boolean postOperation(CdmBase objectAffectedByOperation) {
+       public boolean postOperation(Object objectAffectedByOperation) {
            editor.redraw();
                return false;
        }
index dc402f4ab844803e2ebac0a8bafc4f376520cea0..52c2ae515e40959dc9dbe5471a397a310cc57d28 100644 (file)
@@ -24,7 +24,6 @@ import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 
-import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.taxon.Synonym;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
@@ -92,7 +91,7 @@ public class SwapSynonymAndAcceptedHandlerE4 implements IPostOperationEnabled {
     }
 
     @Override
-    public boolean postOperation(CdmBase objectAffectedByOperation) {
+    public boolean postOperation(Object objectAffectedByOperation) {
         // Redraw existing editor
         // ((IPostOperationEnabled) editor).postOperation(null);
 
index 51ead9f5f0f9fc6db46063d848654741849c2c51..de003d5ecd63a4143656ad60c9479e786e35dab7 100644 (file)
@@ -49,7 +49,6 @@ import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
 import eu.etaxonomy.cdm.api.service.ITaxonService;
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
-import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.molecular.SingleRead;
 import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
@@ -466,7 +465,7 @@ public class DerivateView implements IPartContentHasFactualData, IConversationEn
     }
 
     @Override
-    public boolean postOperation(CdmBase objectAffectedByOperation) {
+    public boolean postOperation(Object objectAffectedByOperation) {
         refreshTree();
         if(objectAffectedByOperation!=null){
             changed(objectAffectedByOperation);
index bc4db68675c5a3ffcb6acfcca8bcd34c7950b2f8..b9ea1f4f6c4781131ab470e5abdaba1c73f1295f 100644 (file)
@@ -37,7 +37,6 @@ import org.eclipse.swt.widgets.Shell;
 
 import eu.etaxonomy.cdm.api.service.IDescriptionService;
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
-import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.description.DescriptionBase;
 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
 import eu.etaxonomy.cdm.model.description.TaxonDescription;
@@ -187,7 +186,7 @@ public class MoveDescriptionElementsHandlerE4 implements IPostOperationEnabled{
 
     /** {@inheritDoc} */
     @Override
-    public boolean postOperation(CdmBase objectAffectedByOperation) {
+    public boolean postOperation(Object objectAffectedByOperation) {
 
         editor.getConversationHolder().bind();
         editor.getConversationHolder().commit(true);
index 2be1e622efcd77fc69c467c804a68f956e5683e9..3bca4e67d549ab001c26ba1d24e7e224cc4c93c6 100644 (file)
@@ -28,7 +28,6 @@ import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 
-import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.description.DescriptionBase;
 import eu.etaxonomy.cdm.model.description.TaxonDescription;
 import eu.etaxonomy.cdm.model.taxon.Classification;
@@ -154,7 +153,7 @@ public class MoveDescriptionToOtherTaxonHandlerE4 implements IPostOperationEnabl
 
     /** {@inheritDoc} */
     @Override
-    public boolean postOperation(CdmBase objectAffectedByOperation) {
+    public boolean postOperation(Object objectAffectedByOperation) {
         Display.getDefault().asyncExec(new Runnable(){
 
             @Override
index 91e617b533cf87d111e5c2bda21c000d635de552..dd85ee44cb44504c7151eec2598677495b84e30a 100644 (file)
@@ -20,7 +20,6 @@ import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Tree;
 
-import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.taxeditor.editor.l10n.Messages;
 import eu.etaxonomy.taxeditor.editor.view.descriptive.DescriptionElementDragListener;
 import eu.etaxonomy.taxeditor.editor.view.descriptive.DescriptionElementDropAdapter;
@@ -80,7 +79,7 @@ public class UsesViewPartE4 extends FactualDataPartE4 {
 
     /** {@inheritDoc} */
     @Override
-    public boolean postOperation(CdmBase objectAffectedByOperation) {
+    public boolean postOperation(Object objectAffectedByOperation) {
         viewer.refresh();
         return super.postOperation(objectAffectedByOperation);
     }
index 40f425519b8bb7b39f2095f1e6ded9ae4b76cf86..1b37170eb317d78154830cd44afc7aa3de495720 100644 (file)
@@ -47,7 +47,6 @@ import eu.etaxonomy.cdm.api.application.ICdmDataChangeService;
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
 import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
-import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.description.PolytomousKey;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
 import eu.etaxonomy.taxeditor.model.ContextListenerAdapter;
@@ -262,7 +261,7 @@ ICdmChangeListener {
     }
 
     @Override
-    public boolean postOperation(CdmBase objectAffectedByOperation) {
+    public boolean postOperation(Object objectAffectedByOperation) {
         getConversationHolder().bind();
         getConversationHolder().commit(true);
         viewer.refresh();
index b4b6a70bec8012fbd7a99201e60cba1cf7d94238..9c7854d55395dd0f423efed40abd9fd576831c4f 100644 (file)
@@ -499,7 +499,7 @@ public class TaxonNavigatorE4 implements
 
        /** {@inheritDoc} */
        @Override
-       public boolean postOperation(CdmBase objectAffectedByOperation) {
+       public boolean postOperation(Object objectAffectedByOperation) {
            viewer.refresh();
                return true;
        }
index 0918f50ecefa7960780e8b2cbc7b995327475fb6..11a13ef0967e53cbeea6689421cc93117965ef06 100644 (file)
 package eu.etaxonomy.taxeditor.editor.definedterm;
 
 import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.jface.viewers.ViewerComparator;
 
 import eu.etaxonomy.cdm.model.common.OrderedTermBase;
+import eu.etaxonomy.cdm.persistence.dto.TermDto;
 
 /**
  * @author pplitzner
  * @date 13.02.2018
  *
  */
-public class DefinedTermSorter extends ViewerSorter {
+public class DefinedTermSorter extends ViewerComparator {
 
     @Override
     public int compare(Viewer viewer, Object e1, Object e2) {
-        // the comparison value in this method determines the
+     // the comparison value in this method determines the
         // location <-> add term method used in the MoveDefinedTermOperation
         // execute call
+        //FIXME: remove this when all viewer are changed to use DTOs
         if(e1 instanceof OrderedTermBase && e2 instanceof OrderedTermBase) {
             OrderedTermBase otbe1 = (OrderedTermBase)e1;
             OrderedTermBase otbe2 = (OrderedTermBase)e2;
@@ -36,7 +38,19 @@ public class DefinedTermSorter extends ViewerSorter {
             } else{
                 return 1;
             }
-        } else {
+        }
+        else if(e1 instanceof TermDto && e2 instanceof TermDto) {
+            TermDto termDto1 = (TermDto)e1;
+            TermDto termDto2 = (TermDto)e2;
+            if(termDto1.getOrderIndex() == termDto2.getOrderIndex()) {
+                return 0;
+            } else if (termDto1.getOrderIndex() < termDto2.getOrderIndex()){
+                return -1;
+            } else{
+                return 1;
+            }
+        }
+        else {
             return super.compare(viewer, e1, e2);
         }
     }
index c9d8d0884f0f73a6eb6ecc89aaabc265f3b85c0e..e9a2675d056fe46912d263d62a6d52b2f4ebf929 100644 (file)
@@ -1,8 +1,8 @@
 /**\r
 * Copyright (C) 2009 EDIT\r
-* European Distributed Institute of Taxonomy \r
+* European Distributed Institute of Taxonomy\r
 * http://www.e-taxonomy.eu\r
-* \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
@@ -11,12 +11,16 @@ package eu.etaxonomy.taxeditor.editor.definedterm;
 import org.eclipse.core.expressions.PropertyTester;\r
 import org.eclipse.jface.viewers.IStructuredSelection;\r
 \r
+import eu.etaxonomy.cdm.api.service.IVocabularyService;\r
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
 import eu.etaxonomy.cdm.model.common.DefinedTermBase;\r
 import eu.etaxonomy.cdm.model.common.Marker;\r
 import eu.etaxonomy.cdm.model.common.MarkerType;\r
 import eu.etaxonomy.cdm.model.common.TermBase;\r
 import eu.etaxonomy.cdm.model.common.TermVocabulary;\r
+import eu.etaxonomy.cdm.persistence.dto.TermDto;\r
+import eu.etaxonomy.cdm.persistence.dto.TermVocabularyDto;\r
+import eu.etaxonomy.taxeditor.store.CdmStore;\r
 \r
 /**\r
  * @author l.morris\r
@@ -26,7 +30,7 @@ import eu.etaxonomy.cdm.model.common.TermVocabulary;
 public class TermBasePropertyTester extends PropertyTester {\r
 \r
        private static final String IS_MODIFIABLE = "isModifiable";\r
-       \r
+\r
 \r
        /* (non-Javadoc)\r
         * @see org.eclipse.core.expressions.IPropertyTester#test(java.lang.Object, java.lang.String, java.lang.Object[], java.lang.Object)\r
@@ -34,7 +38,7 @@ public class TermBasePropertyTester extends PropertyTester {
        @Override\r
        public boolean test(Object receiver, String property, Object[] args,\r
                        Object expectedValue) {\r
-               \r
+\r
                IStructuredSelection selection = (IStructuredSelection) receiver;\r
                Object selectedElement = selection.getFirstElement();\r
                if (selectedElement != null && HibernateProxyHelper.isInstanceOf(selectedElement, TermBase.class)){\r
@@ -44,39 +48,43 @@ public class TermBasePropertyTester extends PropertyTester {
                                return isModifiable(term);\r
                        }\r
                }\r
-               \r
+\r
                return false;\r
        }\r
 \r
 \r
        /**\r
         * Checks whether there is a {@link Marker} with the type {@link MarkerType#MODIFIABLE()} and if there is then return its value.\r
-        * \r
-        * @return The markers value if it exists \r
+        *\r
+        * @return The markers value if it exists\r
         */\r
-       public static boolean isModifiable(TermBase termBase) {\r
-               if (termBase == null){\r
+       public static boolean isModifiable(Object object) {\r
+               if (object == null){\r
                        return true;\r
                }\r
-               \r
+\r
                TermVocabulary vocabulary = null;\r
-               \r
-               if(termBase instanceof DefinedTermBase){\r
-                       vocabulary = ((DefinedTermBase) termBase).getVocabulary();\r
-               }else if(termBase instanceof TermVocabulary){\r
-                       vocabulary = (TermVocabulary) termBase;\r
-               }\r
-               \r
+\r
+               if(object instanceof DefinedTermBase){\r
+                       vocabulary = ((DefinedTermBase) object).getVocabulary();\r
+               }else if(object instanceof TermVocabulary){\r
+                       vocabulary = (TermVocabulary) object;\r
+               }else if(object instanceof TermDto){\r
+            vocabulary = CdmStore.getService(IVocabularyService.class).load(((TermDto) object).getVocabularyUuid());\r
+        }else if(object instanceof TermVocabularyDto){\r
+            vocabulary = CdmStore.getService(IVocabularyService.class).load(((TermVocabularyDto) object).getUuid());\r
+        }\r
+\r
                if(vocabulary == null){\r
                        return true;\r
                }\r
-               \r
+\r
                for(Marker vocabularyMarker : vocabulary.getMarkers()){\r
                        if(vocabularyMarker.getMarkerType().equals(MarkerType.MODIFIABLE())){\r
-                               return vocabularyMarker.getValue();                     \r
+                               return vocabularyMarker.getValue();\r
                        }\r
                }\r
-                               \r
+\r
                return true;\r
        }\r
 \r
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/TermDtoContentProvider.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/TermDtoContentProvider.java
new file mode 100644 (file)
index 0000000..ba34a21
--- /dev/null
@@ -0,0 +1,77 @@
+/**
+* Copyright (C) 2009 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.editor.definedterm;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.UUID;
+
+import org.eclipse.jface.viewers.TreeNodeContentProvider;
+
+import eu.etaxonomy.cdm.api.service.IVocabularyService;
+import eu.etaxonomy.cdm.persistence.dto.TermDto;
+import eu.etaxonomy.cdm.persistence.dto.TermVocabularyDto;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+
+/**
+ *
+ * @author pplitzner
+ * @since Oct 29, 2018
+ *
+ */
+public class TermDtoContentProvider extends TreeNodeContentProvider {
+
+       @Override
+       public Object[] getElements(Object inputElement) {
+               Collection<TermVocabularyDto> inputElements = (Collection<TermVocabularyDto>) inputElement;
+               return inputElements.toArray();
+       }
+
+       @Override
+       public Object[] getChildren(Object parentElement) {
+           Collection<Object> children = new HashSet<>();
+           if(parentElement instanceof TermVocabularyDto){
+               children.addAll(CdmStore.getService(IVocabularyService.class).getCompleteTermHierarchy(((TermVocabularyDto)parentElement).getUuid()));
+           } else if(parentElement instanceof TermDto){
+                   if(((TermDto) parentElement).getIncludes()!=null){
+                       children.addAll(((TermDto) parentElement).getIncludes());
+                   }
+                if(((TermDto) parentElement).getGeneralizationOf()!=null){
+                    children.addAll(((TermDto) parentElement).getGeneralizationOf());
+                }
+           }
+           return children.toArray();
+       }
+
+       @Override
+       public Object getParent(Object element) {
+               if(element instanceof TermDto){
+                   UUID partOfUuid = ((TermDto) element).getPartOfUuid();
+                   if(partOfUuid==null){
+                       return CdmStore.getService(IVocabularyService.class).load(((TermDto) element).getVocabularyUuid());
+                   }
+                   return new TermDto(partOfUuid, null, null);
+               }
+               return null;
+
+       }
+
+       @Override
+       public boolean hasChildren(Object element) {
+           if(element instanceof TermVocabularyDto){
+               //performance optimization
+               return true;
+           }
+               if (getChildren(element) != null){
+                       return getChildren(element).length > 0;
+               }
+               return false;
+       }
+
+}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/TermDtoLabelProvider.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/TermDtoLabelProvider.java
new file mode 100644 (file)
index 0000000..a465ada
--- /dev/null
@@ -0,0 +1,112 @@
+/**
+ * Copyright (C) 2009 EDIT
+ * European Distributed Institute of Taxonomy
+ * http://www.e-taxonomy.eu
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * See LICENSE.TXT at the top of this package for the full license terms.
+ */
+package eu.etaxonomy.taxeditor.editor.definedterm;
+
+import org.eclipse.jface.viewers.StyledCellLabelProvider;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.jface.viewers.StyledString.Styler;
+import org.eclipse.jface.viewers.ViewerCell;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.TextStyle;
+import org.eclipse.swt.widgets.Display;
+
+import eu.etaxonomy.cdm.common.CdmUtils;
+import eu.etaxonomy.cdm.persistence.dto.AbstractTermDto;
+import eu.etaxonomy.cdm.persistence.dto.TermDto;
+import eu.etaxonomy.cdm.persistence.dto.TermVocabularyDto;
+import eu.etaxonomy.cdm.remote.l10n.TermRepresentation_L10n;
+
+/**
+ *
+ * @author pplitzner
+ * @since Oct 29, 2018
+ *
+ */
+public class TermDtoLabelProvider extends StyledCellLabelProvider {
+
+    private static Color vocColor = Display.getCurrent().getSystemColor(SWT.COLOR_BLUE);
+    private static Color kindOfColor = Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GRAY);
+    private Styler vocStyler;
+    private Styler kindOfStyler;
+
+    public TermDtoLabelProvider() {
+    }
+
+    public TermDtoLabelProvider(Styler vocStyler){
+        this.vocStyler = vocStyler;
+    }
+
+    @Override
+    public void update(ViewerCell cell) {
+        Object element = cell.getElement();
+
+        String text = getText(element);
+        cell.setText(text);
+
+        Styler styler = null;
+        if (element instanceof TermVocabularyDto && text != null) {
+            styler = getVocabularyStyler();
+        }
+        else if(element instanceof TermDto && ((TermDto) element).getKindOfUuid()!=null){
+            styler = getKindOfStyler();
+        }
+        if(styler!=null){
+            StyledString styledString = new StyledString(text, styler);
+            StyleRange[] styleRanges;
+            styleRanges = styledString.getStyleRanges();
+            cell.setStyleRanges(styleRanges);
+        }
+        super.update(cell);
+    }
+
+    public String getText(Object element) {
+        String label = null;
+        if(element instanceof AbstractTermDto){
+            AbstractTermDto termDto = (AbstractTermDto)element;
+            termDto.localize(new TermRepresentation_L10n());
+            label = termDto.getRepresentation_L10n();
+
+            if(element instanceof TermDto && ((TermDto) termDto).getIdInVocabulary()!=null){
+                label = CdmUtils.concat(" : ", ((TermDto) termDto).getIdInVocabulary(), label);
+            }
+        }
+        // TODO add fallback for label
+        if(label==null){
+            label = element.toString();
+        }
+        return label;
+    }
+
+    protected Styler getVocabularyStyler() {
+        if (vocStyler == null) {
+            vocStyler = new Styler() {
+                @Override
+                public void applyStyles(TextStyle textStyle) {
+                    textStyle.foreground = vocColor;
+                }
+            };
+        }
+        return vocStyler;
+    }
+
+    protected Styler getKindOfStyler() {
+        if (kindOfStyler == null) {
+            kindOfStyler = new Styler() {
+                @Override
+                public void applyStyles(TextStyle textStyle) {
+                    textStyle.foreground = kindOfColor;
+                }
+            };
+        }
+        return kindOfStyler;
+    }
+
+}
index 51d2396b8e3c82fd6453f0b46700f0097c149805..e776dae49a2d08d9974c24308920ae66d4934c13 100644 (file)
@@ -41,6 +41,12 @@ public class TermLabelProvider extends StyledCellLabelProvider {
     private Styler kindOfStyler;
 
     public TermLabelProvider() {
+        this.vocStyler = new Styler() {
+            @Override
+            public void applyStyles(TextStyle textStyle) {
+                textStyle.foreground = Display.getCurrent().getSystemColor(SWT.COLOR_BLACK);
+            }
+        };
     }
 
     public TermLabelProvider(Styler vocStyler){
index 08d8b4b09a324d9d999f7188c10a2ed360f70aec..4439ac982d3b45e705999c2317f9358f0fd231a1 100644 (file)
@@ -8,16 +8,15 @@
 */
 package eu.etaxonomy.taxeditor.editor.definedterm.e4;
 
-import java.util.ArrayList;
 import java.util.List;
 
+import org.eclipse.jface.util.LocalSelectionTransfer;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.dnd.DragSourceAdapter;
 import org.eclipse.swt.dnd.DragSourceEvent;
 
-import eu.etaxonomy.cdm.model.common.DefinedTermBase;
-import eu.etaxonomy.taxeditor.editor.definedterm.TermTransfer;
+import eu.etaxonomy.cdm.persistence.dto.TermDto;
 
 /**
  *
@@ -38,7 +37,7 @@ public class DefinedTermDragListenerE4 extends DragSourceAdapter {
            IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
            List list = selection.toList();
            for (Object object : list) {
-            if(!(object instanceof DefinedTermBase)){
+            if(!(object instanceof TermDto)){
                 event.doit = false;
                 return;
             }
@@ -48,18 +47,11 @@ public class DefinedTermDragListenerE4 extends DragSourceAdapter {
 
        @Override
        public void dragSetData(DragSourceEvent event) {
+           IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+        if (LocalSelectionTransfer.getTransfer().isSupportedType(event.dataType)) {
+            LocalSelectionTransfer.getTransfer().setSelection(selection);
+        }
 
-               IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
-               List<DefinedTermBase> definedTerms = new ArrayList<DefinedTermBase>();
-
-               for (Object object : selection.toList()){
-                               definedTerms.add((DefinedTermBase)object);
-                       }
-
-               if (TermTransfer.getInstance().isSupportedType(
-                               event.dataType)) {
-                       event.data = definedTerms.toArray(new DefinedTermBase[definedTerms.size()]);
-               }
        }
 
 }
index b747f460e8a3aef1c0a1b577a24d7eb4884b0a48..d9c758a78acdc41214db5526115bb1ae671b58cf 100644 (file)
@@ -14,16 +14,15 @@ import java.util.Collection;
 import javax.inject.Inject;
 
 import org.eclipse.e4.ui.di.UISynchronize;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
 import org.eclipse.swt.dnd.TransferData;
 
-import eu.etaxonomy.cdm.model.common.DefinedTermBase;
-import eu.etaxonomy.cdm.model.common.OrderedTermBase;
-import eu.etaxonomy.cdm.model.common.TermBase;
-import eu.etaxonomy.taxeditor.editor.definedterm.TermTransfer;
+import eu.etaxonomy.cdm.persistence.dto.AbstractTermDto;
+import eu.etaxonomy.cdm.persistence.dto.TermDto;
 import eu.etaxonomy.taxeditor.editor.definedterm.operation.MoveDefinedTermOperation;
+import eu.etaxonomy.taxeditor.model.AbstractUtility;
 import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.store.StoreUtil;
 import eu.etaxonomy.taxeditor.ui.EditViewerDropAdapter;
@@ -49,14 +48,16 @@ public class DefinedTermDropAdapterE4 extends EditViewerDropAdapter {
 
        @Override
        public boolean performDrop(Object data) {
-
-               TermBase target = (TermBase) getCurrentTarget();//can be vocab
+           if(editor.checkDirty()){
+               return false;
+           }
+               AbstractTermDto target = (AbstractTermDto) getCurrentTarget();//can be vocab
                int currentLocation = getCurrentLocation();
-               Object[] droppedTerms = (Object[]) data;
-               Collection<DefinedTermBase> sourceTerms = new ArrayList<DefinedTermBase>(); //Arrays.asList(droppedElements)
+               IStructuredSelection droppedTerms = (IStructuredSelection) data;
+               Collection<TermDto> sourceTerms = new ArrayList<>(); //Arrays.asList(droppedElements)
 
-               for (Object droppedTerm : droppedTerms) {
-                       DefinedTermBase term = (DefinedTermBase) droppedTerm;
+               for (Object droppedTerm : droppedTerms.toList()) {
+                   TermDto term = (TermDto) droppedTerm;
                        sourceTerms.add(term);
                }
 
@@ -66,10 +67,9 @@ public class DefinedTermDropAdapterE4 extends EditViewerDropAdapter {
                        sourceTerms,
                        editor,
                        currentLocation);
-               //TODO: implement execute
-               StoreUtil.executeOperation(operation, sync);
+               AbstractUtility.executeOperation(operation, sync);
                // select the newly moved objects
-               editor.getViewer().setSelection(new StructuredSelection(sourceTerms.toArray(new TermBase[sourceTerms.size()])));
+               editor.getViewer().setSelection(new StructuredSelection(sourceTerms));
 
                return true;
        }
@@ -77,21 +77,7 @@ public class DefinedTermDropAdapterE4 extends EditViewerDropAdapter {
        @Override
        public boolean validateDrop(Object target, int operation,
                        TransferData transferType) {
-               boolean transferDataIsSupported = TermTransfer.getInstance().isSupportedType(transferType);
-               // maybe don't need this - they will be all TermBase anyway
-               return target instanceof TermBase && transferDataIsSupported;
-       }
-
-       @Override
-       public void dragOver(DropTargetEvent event) {
-           super.dragOver(event);
-           TermBase target = (TermBase) getCurrentTarget();
-           if(!(target instanceof OrderedTermBase)) {
-               // this is to only disable insert between items
-               event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL;
-           }
-
-
+        return LocalSelectionTransfer.getTransfer().isSupportedType(transferType) && target instanceof AbstractTermDto;
        }
 
 }
index 909de8b08ff40b0dbf9f994db198ad2c1f4364e3..f18ab9088db359fd0dea746c5c8bdfd0c7f8ba18 100644 (file)
@@ -8,6 +8,9 @@
  */
 package eu.etaxonomy.taxeditor.editor.definedterm.e4;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
@@ -22,6 +25,8 @@ import org.eclipse.e4.ui.model.application.ui.basic.MPart;
 import org.eclipse.e4.ui.services.EMenuService;
 import org.eclipse.e4.ui.workbench.modeling.EPartService;
 import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.util.LocalSelectionTransfer;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TreeViewer;
@@ -35,18 +40,19 @@ import org.eclipse.ui.IMemento;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
-import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
-import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.api.service.ITermService;
 import eu.etaxonomy.cdm.model.common.DefinedTermBase;
 import eu.etaxonomy.cdm.model.common.TermVocabulary;
+import eu.etaxonomy.cdm.persistence.dto.TermDto;
+import eu.etaxonomy.cdm.persistence.dto.TermVocabularyDto;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
 import eu.etaxonomy.taxeditor.editor.definedterm.DefinedTermSorter;
-import eu.etaxonomy.taxeditor.editor.definedterm.TermContentProvider;
-import eu.etaxonomy.taxeditor.editor.definedterm.TermLabelProvider;
-import eu.etaxonomy.taxeditor.editor.definedterm.TermTransfer;
+import eu.etaxonomy.taxeditor.editor.definedterm.TermDtoContentProvider;
+import eu.etaxonomy.taxeditor.editor.definedterm.TermDtoLabelProvider;
 import eu.etaxonomy.taxeditor.editor.definedterm.input.TermEditorInput;
 import eu.etaxonomy.taxeditor.event.EventUtility;
 import eu.etaxonomy.taxeditor.event.WorkbenchEventConstants;
+import eu.etaxonomy.taxeditor.l10n.Messages;
 import eu.etaxonomy.taxeditor.model.IContextListener;
 import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
 import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
@@ -65,7 +71,7 @@ import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
 public class DefinedTermEditorE4 implements IConversationEnabled, IDirtyMarkable, IPostOperationEnabled,
 IPartContentHasDetails, IPartContentHasSupplementalData, IE4SavablePart, IContextListener {
 
-       public static final String OPEN_COMMAND_ID = "eu.etaxonomy.taxeditor.store.openDefinedTermEditor";
+       public static final String OPEN_COMMAND_ID = "eu.etaxonomy.taxeditor.store.openDefinedTermEditor"; //$NON-NLS-1$
 
        protected TreeViewer viewer;
 
@@ -85,6 +91,8 @@ IPartContentHasDetails, IPartContentHasSupplementalData, IE4SavablePart, IContex
     @Inject
     private MPart thisPart;
 
+    private List<DefinedTermBase> changedTerms = new ArrayList<>();
+
        @Inject
        public DefinedTermEditorE4() {
            CdmStore.getContextManager().addContextListener(this);
@@ -109,11 +117,11 @@ IPartContentHasDetails, IPartContentHasSupplementalData, IE4SavablePart, IContex
            parent.setLayout(layout);
            viewer = new TreeViewer(new Tree(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI));
            viewer.getControl().setLayoutData(LayoutConstants.FILL());
-           viewer.setContentProvider(new TermContentProvider());
-           viewer.setLabelProvider(new TermLabelProvider());
-           viewer.setSorter(new DefinedTermSorter());
+           viewer.setContentProvider(new TermDtoContentProvider());
+           viewer.setLabelProvider(new TermDtoLabelProvider());
+           viewer.setComparator(new DefinedTermSorter());
 
-           Transfer[] transfers = new Transfer[] { TermTransfer.getInstance() };
+           Transfer[] transfers = new Transfer[] { LocalSelectionTransfer.getTransfer() };
            viewer.addDragSupport(dndOperations, transfers, new DefinedTermDragListenerE4(viewer));
            DefinedTermDropAdapterE4 dropListener = new DefinedTermDropAdapterE4(this);
            ContextInjectionFactory.inject(dropListener, context);
@@ -124,25 +132,18 @@ IPartContentHasDetails, IPartContentHasSupplementalData, IE4SavablePart, IContex
            viewer.addSelectionChangedListener(selectionChangedListener);
 
            //create context menu
-           menuService.registerContextMenu(viewer.getControl(), "eu.etaxonomy.taxeditor.store.popupmenu.termeditor");
+           menuService.registerContextMenu(viewer.getControl(), "eu.etaxonomy.taxeditor.store.popupmenu.termeditor"); //$NON-NLS-1$
 
        }
 
        @Override
-       public boolean postOperation(CdmBase objectAffectedByOperation) {
-           if(objectAffectedByOperation.isInstanceOf(DefinedTermBase.class)){
-               TermVocabulary vocabulary = HibernateProxyHelper.deproxy(objectAffectedByOperation, DefinedTermBase.class).getVocabulary();
-               viewer.refresh(vocabulary);
-           }
-           else{
-               viewer.refresh();
-           }
-
+       public boolean postOperation(Object objectAffectedByOperation) {
+           viewer.refresh();
                if(objectAffectedByOperation != null){
-                       viewer.setSelection(new StructuredSelection(objectAffectedByOperation));
+                       StructuredSelection selection = new StructuredSelection(objectAffectedByOperation);
+            viewer.setSelection(selection);
+                       viewer.expandToLevel(objectAffectedByOperation, 1);
                }
-               setDirty(true);
-
                return true;
        }
 
@@ -154,10 +155,37 @@ IPartContentHasDetails, IPartContentHasSupplementalData, IE4SavablePart, IContex
         thisPart.setLabel(input.getName());
        }
 
+    /**
+     * Checks the dirty flag and, if set, prompts the user to optionally save
+     * the editor
+     *
+     * @return <code>false</code> if the editor is not dirty anymore, either
+     *         because it wasn't beforehand or because it has been saved.
+     *         <code>true</code> otherwise
+     */
+       public boolean checkDirty(){
+           if (isDirty()){
+               boolean proceed = MessageDialog.openQuestion(null,
+                       Messages.DefinedTermEditorE4_SAVE_TITLE, Messages.DefinedTermEditorE4_SAVE_MESSAGE);
+               if (proceed) {
+                   save(null);
+                   return false;
+               }
+               else{
+                   return true;
+               }
+           }
+           else{
+               return false;
+           }
+       }
+
        @Override
     @Persist
        public void save(IProgressMonitor monitor) {
                getConversationHolder().commit();
+        changedTerms.forEach(term->CdmStore.getService(ITermService.class).merge(term));
+        changedTerms.clear();
                input.merge();
                setDirty(false);
                input.initialiseVocabularies();
@@ -193,6 +221,21 @@ IPartContentHasDetails, IPartContentHasSupplementalData, IE4SavablePart, IContex
 
        @Override
        public void changed(Object element) {
+           if(element instanceof DefinedTermBase){
+               DefinedTermBase definedTermBase = (DefinedTermBase) element;
+            TermDto termDto = new TermDto(definedTermBase.getUuid(),
+                       definedTermBase.getRepresentations(),
+                       null,
+                       null,
+                       null);
+               viewer.update(termDto, null);
+               changedTerms.add(definedTermBase);
+           }
+           else if(element instanceof TermVocabulary){
+               TermVocabulary vocabulary = (TermVocabulary)element;
+               TermVocabularyDto vocabularyDto = new TermVocabularyDto(vocabulary.getUuid(), vocabulary.getRepresentations());
+               viewer.update(vocabularyDto, null);
+           }
                setDirty(true);
                viewer.update(element, null);
        }
index 8d25e4a6bf708667cc2cf7f18e77fcf549b34598..d25d55195956a30ec5537c5d795576bb53120548 100644 (file)
@@ -8,6 +8,8 @@
  */
 package eu.etaxonomy.taxeditor.editor.definedterm.e4.handler;
 
+import java.util.UUID;
+
 import javax.inject.Named;
 
 import org.eclipse.core.commands.operations.IUndoContext;
@@ -19,13 +21,14 @@ import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem;
 import org.eclipse.e4.ui.services.IServiceConstants;
 import org.eclipse.jface.viewers.IStructuredSelection;
 
-import eu.etaxonomy.cdm.model.common.DefinedTermBase;
-import eu.etaxonomy.cdm.model.common.TermBase;
-import eu.etaxonomy.cdm.model.common.TermVocabulary;
+import eu.etaxonomy.cdm.persistence.dto.AbstractTermDto;
+import eu.etaxonomy.cdm.persistence.dto.TermDto;
+import eu.etaxonomy.cdm.persistence.dto.TermVocabularyDto;
 import eu.etaxonomy.taxeditor.editor.definedterm.e4.DefinedTermEditorE4;
 import eu.etaxonomy.taxeditor.editor.definedterm.operation.CreateDefinedTermOperation;
 import eu.etaxonomy.taxeditor.model.AbstractUtility;
 import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
+import eu.etaxonomy.taxeditor.store.AppModelId;
 import eu.etaxonomy.taxeditor.store.StoreUtil;
 
 /**
@@ -40,19 +43,22 @@ public class CreateDefinedTermHandlerE4 {
     public void execute(@Named(IServiceConstants.ACTIVE_PART) MPart activePart,
             @Named(IServiceConstants.ACTIVE_SELECTION) IStructuredSelection selection, MHandledMenuItem menuItem,
             UISynchronize sync) {
-
         DefinedTermEditorE4 termEditor = (DefinedTermEditorE4) activePart.getObject();
-
+        if(termEditor.checkDirty()){
+            return;
+        }
         boolean addTermAsKindOf =
-                menuItem.getCommand().getElementId().equals("eu.etaxonomy.taxeditor.editor.definedTerms.newKindOfTerm")?true:false;
+                menuItem.getCommand().getElementId()
+                .equals(AppModelId.COMMAND_EU_ETAXONOMY_TAXEDITOR_EDITOR_DEFINEDTERMS_NEWKINDOFTERM)?true:false;
 
         String label = menuItem.getLocalizedLabel();
         IUndoContext undoContext = StoreUtil.getUndoContext();
 
+        AbstractTermDto parent = (AbstractTermDto) selection.getFirstElement();
         AbstractPostOperation operation =
                 new CreateDefinedTermOperation(label,
                         undoContext,
-                        (TermBase) selection.getFirstElement(),
+                        parent,
                         termEditor.getDefinedTermEditorInput(),
                         termEditor, addTermAsKindOf);
         AbstractUtility.executeOperation(operation, sync);
@@ -66,16 +72,18 @@ public class CreateDefinedTermHandlerE4 {
         Object firstElement = selection.getFirstElement();
         canExecute = selection.size()==1
                 &&
-                (firstElement instanceof DefinedTermBase
-                        || firstElement instanceof TermVocabulary);
-        TermVocabulary vocabulary = null;
+                (firstElement instanceof TermDto
+                        || firstElement instanceof TermVocabularyDto);
+        UUID vocabularyUuid = null;
 
-        if(firstElement instanceof DefinedTermBase){
-            vocabulary = ((DefinedTermBase) firstElement).getVocabulary();
-        }else if(firstElement instanceof TermVocabulary){
-            vocabulary = (TermVocabulary) firstElement;
+        if(firstElement instanceof TermDto){
+            vocabularyUuid = ((TermDto) firstElement).getVocabularyUuid();
+        }else if(firstElement instanceof TermVocabularyDto
+                && !menuItem.getCommand().getElementId()
+                .equals(AppModelId.COMMAND_EU_ETAXONOMY_TAXEDITOR_EDITOR_DEFINEDTERMS_NEWKINDOFTERM)){
+            vocabularyUuid = ((TermVocabularyDto) firstElement).getUuid();
         }
-        canExecute &= vocabulary!=null;
+        canExecute &= vocabularyUuid!=null;
         menuItem.setVisible(canExecute);
         return canExecute;
     }
index 13a2dc9d958cb82d1aa6fb9d5eccd02e33c6f0c3..14250dc9ca193b03de3987efab2fd592364d6ca7 100644 (file)
@@ -35,9 +35,10 @@ public class CreateTermVocabularyHandlerE4 {
     public void execute(@Named(IServiceConstants.ACTIVE_PART) MPart activePart,
             MMenuItem menuItem,
             UISynchronize sync) {
-
         DefinedTermEditorE4 termEditor = (DefinedTermEditorE4) activePart.getObject();
-
+        if(termEditor.checkDirty()){
+            return;
+        }
         String label = menuItem.getLocalizedLabel();
         IUndoContext undoContext = StoreUtil.getUndoContext();
 
index 73de51e38bc54fde8b8bfd7d450bb1c488761d4b..e80da3bdb6fc44fe09d1c1867a8b66431d8a6bed 100644 (file)
@@ -8,6 +8,8 @@
  */
 package eu.etaxonomy.taxeditor.editor.definedterm.e4.handler;
 
+import java.util.UUID;
+
 import javax.inject.Named;
 
 import org.eclipse.core.commands.operations.IUndoContext;
@@ -18,12 +20,11 @@ import org.eclipse.e4.ui.model.application.ui.basic.MPart;
 import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem;
 import org.eclipse.e4.ui.model.application.ui.menu.MMenuItem;
 import org.eclipse.e4.ui.services.IServiceConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.viewers.IStructuredSelection;
 
-import eu.etaxonomy.cdm.model.common.DefinedTermBase;
-import eu.etaxonomy.cdm.model.common.TermBase;
-import eu.etaxonomy.cdm.model.common.TermVocabulary;
+import eu.etaxonomy.cdm.persistence.dto.AbstractTermDto;
+import eu.etaxonomy.cdm.persistence.dto.TermDto;
+import eu.etaxonomy.cdm.persistence.dto.TermVocabularyDto;
 import eu.etaxonomy.taxeditor.editor.definedterm.e4.DefinedTermEditorE4;
 import eu.etaxonomy.taxeditor.editor.definedterm.operation.DeleteTermBaseOperation;
 import eu.etaxonomy.taxeditor.model.AbstractUtility;
@@ -42,24 +43,16 @@ public class DeleteTermBaseHandlerE4 {
     public void execute(@Named(IServiceConstants.ACTIVE_PART) MPart activePart,
             @Named(IServiceConstants.ACTIVE_SELECTION) IStructuredSelection selection, MMenuItem menuItem,
             UISynchronize sync) {
-
         DefinedTermEditorE4 termEditor = (DefinedTermEditorE4) activePart.getObject();
-
-        if (termEditor.isDirty()){
-            boolean proceed = MessageDialog.openQuestion(null,
-                    "Save changes", "You have made changes that must be saved before this query can be executed. Would you like to proceed?");
-            if (proceed) {
-                termEditor.save(null);
-            } else {
-                return;
-            }
+        if(termEditor.checkDirty()){
+            return;
         }
         String label = menuItem.getLocalizedLabel();
         IUndoContext undoContext = StoreUtil.getUndoContext();
         AbstractPostOperation operation =
                 new DeleteTermBaseOperation(label,
                         undoContext,
-                        (TermBase) selection.getFirstElement(),
+                        (AbstractTermDto) selection.getFirstElement(),
                         termEditor.getDefinedTermEditorInput(),
                         termEditor);
         AbstractUtility.executeOperation(operation, sync);
@@ -71,16 +64,14 @@ public class DeleteTermBaseHandlerE4 {
         boolean canExecute = false;
         Object firstElement = selection.getFirstElement();
         canExecute = selection.size()==1
-                &&
-                (firstElement instanceof DefinedTermBase
-                        || firstElement instanceof TermVocabulary);
-        TermVocabulary vocabulary = null;
-        if(firstElement instanceof DefinedTermBase){
-            vocabulary = ((DefinedTermBase) firstElement).getVocabulary();
-        }else if(firstElement instanceof TermVocabulary){
-            vocabulary = (TermVocabulary) firstElement;
+                && (firstElement instanceof AbstractTermDto);
+        UUID vocabularyUuid = null;
+        if(firstElement instanceof TermDto){
+            vocabularyUuid = ((TermDto) firstElement).getVocabularyUuid();
+        }else if(firstElement instanceof TermVocabularyDto){
+            vocabularyUuid = ((TermVocabularyDto) firstElement).getUuid();
         }
-        canExecute &= vocabulary!=null;
+        canExecute &= vocabularyUuid!=null;
         menuItem.setVisible(canExecute);
         return canExecute;
     }
index 8e478c673a2707ac07064b5ce7ca7afd38bbf675..12787d46825f47df378870c01707225100b236c8 100644 (file)
@@ -16,11 +16,11 @@ import java.util.Set;
 
 import eu.etaxonomy.cdm.api.service.IVocabularyService;
 import eu.etaxonomy.cdm.model.common.DefinedTerm;
-import eu.etaxonomy.cdm.model.common.DefinedTermBase;
 import eu.etaxonomy.cdm.model.common.TermType;
 import eu.etaxonomy.cdm.model.common.TermVocabulary;
 import eu.etaxonomy.cdm.model.description.Feature;
 import eu.etaxonomy.cdm.model.description.FeatureTree;
+import eu.etaxonomy.cdm.persistence.dto.TermVocabularyDto;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 import eu.etaxonomy.taxeditor.store.TermStore;
 
@@ -34,7 +34,7 @@ import eu.etaxonomy.taxeditor.store.TermStore;
 public class TermEditorInput extends AbstractDefinedTermEditorInput<DefinedTerm> {
 
        private TermType termType;
-       private Set<TermVocabulary<DefinedTermBase>> vocabularies;
+       private Set<TermVocabularyDto> vocabularies;
 
        // FIXME: the default feature should be move to CdmApplicationState
        //        where it is a singleton instance variable
@@ -46,7 +46,7 @@ public class TermEditorInput extends AbstractDefinedTermEditorInput<DefinedTerm>
 
        public TermEditorInput(TermType termType) {
                this.termType = termType;
-               vocabularies = new HashSet<TermVocabulary<DefinedTermBase>>();
+               vocabularies = new HashSet<TermVocabularyDto>();
                initialiseVocabularies();
        }
        public String getName() {
@@ -66,17 +66,16 @@ public class TermEditorInput extends AbstractDefinedTermEditorInput<DefinedTerm>
                if(vocabularies != null) {
                        vocabularies.clear();
                }
-               List<TermVocabulary<DefinedTermBase>> vocs = CdmStore.getService(IVocabularyService.class).findByTermType(termType,
-                       Arrays.asList("terms", "terms.level"));
+               List<TermVocabularyDto> vocs = CdmStore.getService(IVocabularyService.class).findVocabularyDtoByTermType(termType);
                vocabularies.addAll(vocs);
        }
 
-       public Set<TermVocabulary<DefinedTermBase>> getVocabularies() {
+       public Set<TermVocabularyDto> getVocabularies() {
                return vocabularies;
        }
 
        public void updateDefaultFeatureTree() {
-           for(TermVocabulary vocab : getVocabularies()) {
+           for(TermVocabularyDto vocab : getVocabularies()) {
                if(vocab != null && TermType.Feature.equals(vocab.getTermType())) {
                    defaultFeatureTree = null;
                    return;
@@ -85,13 +84,15 @@ public class TermEditorInput extends AbstractDefinedTermEditorInput<DefinedTerm>
        }
 
        @Override
-    public Set<TermVocabulary<DefinedTermBase>>  getRootEntities() {
+    public Set<TermVocabularyDto>  getRootEntities() {
         return getVocabularies();
     }
 
        @Override
     public void merge() {
-        CdmStore.getService(IVocabularyService.class).merge(new ArrayList<TermVocabulary>(getRootEntities()), true);
+           List<TermVocabulary> vocabularies = new ArrayList<>();
+           getRootEntities().forEach(vocDto->vocabularies.add(CdmStore.getService(IVocabularyService.class).load(vocDto.getUuid())));
+        CdmStore.getService(IVocabularyService.class).merge(vocabularies, true);
         updateDefaultFeatureTree();
     }
 
index d5e5c9744934f3cbad2686d87c883a5a0fb144a3..fa5f5a610b0334786406fa44871ce848f250ab72 100644 (file)
@@ -13,102 +13,61 @@ import org.eclipse.core.commands.operations.IUndoContext;
 import org.eclipse.core.runtime.IAdaptable;\r
 import org.eclipse.core.runtime.IProgressMonitor;\r
 import org.eclipse.core.runtime.IStatus;\r
-import org.eclipse.core.runtime.Status;\r
 \r
-import eu.etaxonomy.cdm.model.common.DefinedTermBase;\r
-import eu.etaxonomy.cdm.model.common.TermBase;\r
-import eu.etaxonomy.cdm.model.common.TermVocabulary;\r
+import eu.etaxonomy.cdm.api.service.ITermService;\r
+import eu.etaxonomy.cdm.api.service.IVocabularyService;\r
+import eu.etaxonomy.cdm.persistence.dto.AbstractTermDto;\r
+import eu.etaxonomy.cdm.persistence.dto.TermDto;\r
+import eu.etaxonomy.cdm.persistence.dto.TermVocabularyDto;\r
 import eu.etaxonomy.taxeditor.editor.definedterm.input.TermEditorInput;\r
-import eu.etaxonomy.taxeditor.model.MessagingUtils;\r
-import eu.etaxonomy.taxeditor.operation.AbstractPostTaxonOperation;\r
+import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;\r
 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;\r
 import eu.etaxonomy.taxeditor.store.CdmStore;\r
-import eu.etaxonomy.taxeditor.store.StoreUtil;\r
 \r
 /**\r
  * @author l.morris\r
  * @date 21 Dec 2011\r
  *\r
  */\r
-public class CreateDefinedTermOperation extends AbstractPostTaxonOperation {\r
+public class CreateDefinedTermOperation extends AbstractPostOperation {\r
 \r
-\r
-\r
-       private final TermBase parentTermBase;\r
+       private final AbstractTermDto parent;\r
        private final TermEditorInput definedTermInput;\r
     private boolean addTermAsKindOf;\r
 \r
 \r
-       /**\r
-        * @param label\r
-        * @param undoContext\r
-        * @param postOperationEnabled\r
-        * @param addTermAsKindOf\r
-        */\r
        public CreateDefinedTermOperation(String label,\r
                        IUndoContext undoContext,\r
-                       TermBase termBase,\r
+                       AbstractTermDto parent,\r
                        TermEditorInput definedTermInput,\r
                        IPostOperationEnabled postOperationEnabled, boolean addTermAsKindOf) {\r
-               super(label, undoContext, postOperationEnabled);\r
-               this.parentTermBase = termBase;\r
+               super(label, undoContext, null, postOperationEnabled);\r
+               this.parent = parent;\r
                this.definedTermInput = definedTermInput;\r
                this.addTermAsKindOf = addTermAsKindOf;\r
        }\r
 \r
-       /* (non-Javadoc)\r
-        * @see org.eclipse.core.commands.operations.AbstractOperation#execute(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)\r
-        */\r
        @Override\r
        public IStatus execute(IProgressMonitor monitor, IAdaptable info)\r
                        throws ExecutionException {\r
-\r
-               DefinedTermBase newTerm = definedTermInput.getTermType().getEmptyDefinedTermBase();\r
-               if (newTerm == null) {\r
-                       IStatus status =\r
-                                       new Status(IStatus.CANCEL,\r
-                                                       StoreUtil.getPluginId(),\r
-                                                       "Creation of term corresponding to type '" + definedTermInput.getTermType().getMessage() + "' is not yet supported");\r
-                       MessagingUtils.warningDialog("Cannot create term", newTerm, status);\r
-                       return status;\r
-               }\r
-               newTerm = CdmStore.getCurrentApplicationConfiguration().getTermService().save(newTerm);\r
-\r
-               if (parentTermBase instanceof TermVocabulary){\r
-                       TermVocabulary vocabulary = (TermVocabulary) parentTermBase;\r
-                       vocabulary.addTerm(newTerm);\r
-               } else if (parentTermBase instanceof DefinedTermBase) {\r
-                       DefinedTermBase parent = (DefinedTermBase) parentTermBase;\r
-                       if(addTermAsKindOf){\r
-                           parent.addGeneralizationOf(newTerm);\r
-                       }\r
-                       else{\r
-                           parent.addIncludes(newTerm);\r
-                       }\r
-                       TermVocabulary vocabulary = parent.getVocabulary();\r
-                       vocabulary.addTerm(newTerm);\r
-               }\r
-\r
-               return postExecute(newTerm);\r
+           if(parent instanceof TermDto){\r
+               CdmStore.getService(ITermService.class).addNewTerm(definedTermInput.getTermType(), parent.getUuid(), addTermAsKindOf);\r
+           }\r
+           else if(parent instanceof TermVocabularyDto){\r
+               CdmStore.getService(IVocabularyService.class).addNewTerm(definedTermInput.getTermType(), parent.getUuid());\r
+           }\r
+               return postExecute(parent);\r
        }\r
 \r
-       /* (non-Javadoc)\r
-        * @see org.eclipse.core.commands.operations.AbstractOperation#redo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)\r
-        */\r
        @Override\r
        public IStatus redo(IProgressMonitor monitor, IAdaptable info)\r
                        throws ExecutionException {\r
-               // TODO Auto-generated method stub\r
                return null;\r
        }\r
 \r
-       /* (non-Javadoc)\r
-        * @see org.eclipse.core.commands.operations.AbstractOperation#undo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)\r
-        */\r
        @Override\r
        public IStatus undo(IProgressMonitor monitor, IAdaptable info)\r
                        throws ExecutionException {\r
-               // TODO Auto-generated method stub\r
                return null;\r
        }\r
 \r
index ae55c0e34609a1cd8d5d303e5a74bb38f328410d..25b0f3946c4b220f197f61eb8d72fda961a1dbc8 100644 (file)
@@ -75,7 +75,8 @@ public class CreateTermVocabularyOperation extends AbstractPostTaxonOperation {
           }\r
 \r
                termVocabulary = CdmStore.getService(IVocabularyService.class).save(termVocabulary);\r
-               definedEditorInput.getVocabularies().add(termVocabulary);\r
+               //FIXME: implement creation of term vocabularies\r
+//             definedEditorInput.getVocabularies().add(termVocabulary);\r
 \r
                return postExecute(termVocabulary);\r
        }\r
index 91da3303c7609a67a44e0aff5bfd5929cbf8d720..7e3d28b7e05543fd3e76160b5fcd540542723148 100644 (file)
@@ -18,9 +18,9 @@ import org.eclipse.core.runtime.Status;
 import eu.etaxonomy.cdm.api.service.DeleteResult;\r
 import eu.etaxonomy.cdm.api.service.ITermService;\r
 import eu.etaxonomy.cdm.api.service.IVocabularyService;\r
-import eu.etaxonomy.cdm.model.common.DefinedTermBase;\r
-import eu.etaxonomy.cdm.model.common.TermBase;\r
-import eu.etaxonomy.cdm.model.common.TermVocabulary;\r
+import eu.etaxonomy.cdm.persistence.dto.AbstractTermDto;\r
+import eu.etaxonomy.cdm.persistence.dto.TermDto;\r
+import eu.etaxonomy.cdm.persistence.dto.TermVocabularyDto;\r
 import eu.etaxonomy.taxeditor.editor.definedterm.input.TermEditorInput;\r
 import eu.etaxonomy.taxeditor.l10n.Messages;\r
 import eu.etaxonomy.taxeditor.model.MessagingUtils;\r
@@ -38,11 +38,11 @@ import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
 public class DeleteTermBaseOperation extends AbstractPostTaxonOperation {\r
 \r
        private final TermEditorInput definedEditorInput;\r
-       private final TermBase termBase;\r
+       private final AbstractTermDto termBase;\r
 \r
        public DeleteTermBaseOperation(String label,\r
                        IUndoContext undoContext,\r
-                       TermBase termBase,\r
+                       AbstractTermDto termBase,\r
                        TermEditorInput definedEditorInput,\r
                        IPostOperationEnabled postOperationEnabled) {\r
                super(label, undoContext, postOperationEnabled);\r
@@ -53,19 +53,7 @@ public class DeleteTermBaseOperation extends AbstractPostTaxonOperation {
        @Override\r
        public IStatus execute(IProgressMonitor monitor, IAdaptable info)\r
                        throws ExecutionException {\r
-               if (termBase instanceof TermVocabulary) {\r
-                       if (((TermVocabulary)termBase).getCreatedBy() == null) {\r
-                               IStatus status = new Status(IStatus.CANCEL, StoreUtil.getPluginId(), Messages.DeleteTermBaseOperation_SYSTEM_VOC);\r
-                               MessagingUtils.warningDialog(Messages.DeleteTermBaseOperation_CANNOT_DELETE_VOC, termBase, status);\r
-                               return status;\r
-                       }\r
-\r
-                       if (!((TermVocabulary)termBase).getTerms().isEmpty()) {\r
-                               IStatus status = new Status(IStatus.CANCEL, StoreUtil.getPluginId(), Messages.DeleteTermBaseOperation_DELETE_ALL_TERMS_BEFORE);\r
-                               MessagingUtils.warningDialog(Messages.DeleteTermBaseOperation_VOC_NOT_EMPTY, termBase, status);\r
-                               return status;\r
-                       }\r
-\r
+               if (termBase instanceof TermVocabularyDto) {\r
                        definedEditorInput.getVocabularies().remove(termBase);\r
 \r
                        DeleteResult result =   CdmStore.getService(IVocabularyService.class).delete(termBase.getUuid());\r
@@ -73,28 +61,12 @@ public class DeleteTermBaseOperation extends AbstractPostTaxonOperation {
                            return showErrorMessage(result);\r
                        }\r
 \r
-               } else if (termBase instanceof DefinedTermBase) {\r
-\r
-\r
-                       DefinedTermBase definedTermBase = (DefinedTermBase) termBase;\r
-\r
-                       if (((DefinedTermBase)termBase).getCreatedBy() == null) {\r
-                               IStatus status = new Status(IStatus.CANCEL, StoreUtil.getPluginId(), Messages.DeleteTermBaseOperation_SYSTEM_TERM);\r
-                               MessagingUtils.warningDialog(Messages.DeleteTermBaseOperation_CANNOT_DELETE_TERM, termBase, status);\r
-                               return status;\r
-                       }\r
-                       if(!definedTermBase.getIncludes().isEmpty()){\r
-                               IStatus status = new Status(IStatus.CANCEL, StoreUtil.getPluginId(), Messages.DeleteTermBaseOperation_TERM_INCLUDES_OTHERS);\r
-                               MessagingUtils.warningDialog(Messages.DeleteTermBaseOperation_TERM_INLCUDES, termBase, status);\r
-                               return status;\r
-                       }\r
-\r
+               } else if (termBase instanceof TermDto) {\r
                        DeleteResult result =   CdmStore.getService(ITermService.class).delete(termBase.getUuid());\r
                        if (!result.isOk()){\r
                            return showErrorMessage(result);\r
             }\r
                }\r
-\r
                return postExecute(termBase);\r
        }\r
 \r
index 2bffa234182020df65e500812a454359115156a7..eb579cae5ff317aaa74f4b6b7ffadb960b8a3b48 100644 (file)
@@ -9,24 +9,22 @@
 package eu.etaxonomy.taxeditor.editor.definedterm.operation;\r
 \r
 import java.util.Collection;\r
+import java.util.UUID;\r
 \r
 import org.eclipse.core.commands.ExecutionException;\r
 import org.eclipse.core.commands.operations.IUndoContext;\r
 import org.eclipse.core.runtime.IAdaptable;\r
 import org.eclipse.core.runtime.IProgressMonitor;\r
 import org.eclipse.core.runtime.IStatus;\r
-import org.eclipse.core.runtime.Status;\r
 import org.eclipse.jface.viewers.ViewerDropAdapter;\r
 \r
-import eu.etaxonomy.cdm.model.common.DefinedTermBase;\r
-import eu.etaxonomy.cdm.model.common.OrderedTermBase;\r
-import eu.etaxonomy.cdm.model.common.OrderedTermVocabulary;\r
-import eu.etaxonomy.cdm.model.common.TermBase;\r
-import eu.etaxonomy.cdm.model.common.TermVocabulary;\r
-import eu.etaxonomy.taxeditor.model.MessagingUtils;\r
+import eu.etaxonomy.cdm.api.service.ITermService;\r
+import eu.etaxonomy.cdm.api.service.TermServiceImpl.TermMovePosition;\r
+import eu.etaxonomy.cdm.persistence.dto.AbstractTermDto;\r
+import eu.etaxonomy.cdm.persistence.dto.TermDto;\r
 import eu.etaxonomy.taxeditor.operation.AbstractPostTaxonOperation;\r
 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;\r
-import eu.etaxonomy.taxeditor.store.StoreUtil;\r
+import eu.etaxonomy.taxeditor.store.CdmStore;\r
 \r
 /**\r
  * @author l.morris\r
@@ -35,14 +33,14 @@ import eu.etaxonomy.taxeditor.store.StoreUtil;
  */\r
 public class MoveDefinedTermOperation extends AbstractPostTaxonOperation {\r
 \r
-       private final Collection<DefinedTermBase> sourceTerms;// the actual DefinedTermBase(s) we are moving\r
-       private final TermBase targetTermOrVocabulary;// the target VOCABULARY or DefinedTerm we are moving these to\r
+       private final Collection<TermDto> sourceTerms;// the actual DefinedTermBase(s) we are moving\r
+       private final AbstractTermDto targetTermOrVocabulary;// the target VOCABULARY or DefinedTerm we are moving these to\r
        private final int currentLocation;\r
 \r
        public MoveDefinedTermOperation(String label,\r
                IUndoContext undoContext,\r
-               TermBase target,\r
-               Collection<DefinedTermBase> sourceTerms,\r
+               AbstractTermDto target,\r
+               Collection<TermDto> sourceTerms,\r
                        IPostOperationEnabled postOperationEnabled,\r
                        int currentLocation) {\r
                super(label, undoContext, postOperationEnabled);\r
@@ -55,94 +53,21 @@ public class MoveDefinedTermOperation extends AbstractPostTaxonOperation {
        @Override\r
        public IStatus execute(IProgressMonitor monitor, IAdaptable info)\r
                        throws ExecutionException {\r
-\r
-               // need to make the moved DefinedTerm part of another DefinedTerm or Vocabulary (target)\r
-               // and remove it from old associations\r
-\r
-               //TODO move to ITermService\r
-\r
-               for (DefinedTermBase term : sourceTerms) {\r
-                       // do nothing when moving it on itself\r
-                       if(targetTermOrVocabulary.equals(term)){\r
-                               Status status = new Status(IStatus.CANCEL, StoreUtil.getPluginId(), "Term can not be added to itself");\r
-                               MessagingUtils.informationDialog("", status);\r
-                               return status;\r
-                       }\r
-\r
-                       if (targetTermOrVocabulary instanceof TermVocabulary) {\r
-                               TermVocabulary termVocabulary = (TermVocabulary)targetTermOrVocabulary;\r
-\r
-                               // do nothing when term is top level and gets added to the same vocabulary\r
-                               if(term.getPartOf() == null && termVocabulary.equals(term.getVocabulary())){\r
-                                       Status status = new Status(IStatus.CANCEL, StoreUtil.getPluginId(), "Term is already in this vocabulary");\r
-                                       MessagingUtils.informationDialog("", status);\r
-                                       return status;\r
-                               }\r
-\r
-                               cleanTerm(term);\r
-                               termVocabulary.addTerm(term);\r
-\r
-                       } else if (targetTermOrVocabulary instanceof DefinedTermBase) {\r
-                               cleanTerm(term);\r
-                               DefinedTermBase targetDefinedTerm = (DefinedTermBase) targetTermOrVocabulary;\r
-\r
-                               if(targetDefinedTerm instanceof OrderedTermBase && term instanceof OrderedTermBase) {\r
-                                   OrderedTermBase targetOrderedDefinedTerm = (OrderedTermBase)targetDefinedTerm;\r
-                                   TermVocabulary tVoc = targetOrderedDefinedTerm.getVocabulary();\r
-                                   if(tVoc instanceof OrderedTermVocabulary) {\r
-                                       OrderedTermVocabulary otVoc = (OrderedTermVocabulary)tVoc;\r
-                                       // the link between the location and the add term (below / above)\r
-                                       // method is determined by the compare method in the\r
-                                       // DefinedTermEditor's ViewerSorter (DefinedTermSorter) class\r
-                                       if(currentLocation == ViewerDropAdapter.LOCATION_BEFORE) {\r
-                                           otVoc.addTermAbove((OrderedTermBase)term, (OrderedTermBase)targetTermOrVocabulary);\r
-                                           if (targetOrderedDefinedTerm.getPartOf() != null){\r
-                                               targetOrderedDefinedTerm.getPartOf().addIncludes(term);\r
-                                           }\r
-                                       }\r
-\r
-                                       if(currentLocation == ViewerDropAdapter.LOCATION_AFTER) {\r
-                                           otVoc.addTermBelow((OrderedTermBase)term, (OrderedTermBase)targetTermOrVocabulary);\r
-                                           if (targetOrderedDefinedTerm.getPartOf() != null){\r
-                                               targetOrderedDefinedTerm.getPartOf().addIncludes(term);\r
-                            }\r
-                                       }\r
-                                       if(currentLocation == ViewerDropAdapter.LOCATION_ON) {\r
-                                           targetOrderedDefinedTerm.addIncludes(term);\r
-                                           targetOrderedDefinedTerm.getVocabulary().addTerm(term);\r
-                                               }\r
-                                   }\r
-                               } else{\r
-                                       targetDefinedTerm.addIncludes(term);\r
-                                   targetDefinedTerm.getVocabulary().addTerm(term);\r
-                               }\r
-\r
-                       }\r
-\r
-               }\r
+           sourceTerms.forEach(term->\r
+           {\r
+            UUID parentUuid = targetTermOrVocabulary.getUuid();\r
+            TermMovePosition termMovePosition = TermMovePosition.ON;\r
+            if(currentLocation == ViewerDropAdapter.LOCATION_BEFORE) {\r
+                termMovePosition = TermMovePosition.BEFORE;\r
+            }\r
+            else if(currentLocation == ViewerDropAdapter.LOCATION_AFTER) {\r
+                termMovePosition = TermMovePosition.AFTER;\r
+            }\r
+            CdmStore.getService(ITermService.class).moveTerm(term, parentUuid, termMovePosition);\r
+        });\r
                return postExecute(targetTermOrVocabulary);\r
        }\r
 \r
-       private DefinedTermBase cleanTerm(DefinedTermBase term){\r
-\r
-               DefinedTermBase partOf = term.getPartOf();\r
-               if(partOf != null){\r
-                       partOf.removeIncludes(term);\r
-               }\r
-               DefinedTermBase kindOf = term.getKindOf();\r
-               if(kindOf!=null){\r
-                   kindOf.removeGeneralization(term);\r
-               }\r
-\r
-\r
-               TermVocabulary vocabulary = term.getVocabulary();\r
-               if(vocabulary != null){\r
-                       vocabulary.removeTerm(term);\r
-               }\r
-\r
-               return term;\r
-       }\r
-\r
        @Override\r
        public IStatus redo(IProgressMonitor monitor, IAdaptable info)\r
                        throws ExecutionException {\r
index 6728e991766fd8420518f76c34959a0bcff6c120..197a94e716aad6f7aa478850d657b4e87291654d 100644 (file)
@@ -57,7 +57,7 @@ public class AvailableFeaturesWizardPage extends WizardPage {
 
                viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
 
-               viewer.setSorter(new DefinedTermSorter());
+               viewer.setComparator(new DefinedTermSorter());
 
         viewer.setContentProvider(new TermContentProvider());
         viewer.setLabelProvider(new TermLabelProvider());
index 44e09fe893baf73d548d6ab81181723c34851c61..12819c592f18401a2fe0e5a5173d73c37766450a 100644 (file)
@@ -42,7 +42,6 @@ import org.eclipse.ui.IMemento;
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
 import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
-import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.description.FeatureNode;
 import eu.etaxonomy.cdm.model.description.FeatureTree;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
@@ -311,7 +310,7 @@ public class FeatureTreeEditor implements ICdmEntitySessionEnabled, ISelectionCh
      * {@inheritDoc}
      */
     @Override
-    public boolean postOperation(CdmBase objectAffectedByOperation) {
+    public boolean postOperation(Object objectAffectedByOperation) {
         return false;
     }
 
index d7904f5b5dc5942c1b4cd9c2849bacee66ca8e12..3ce93cd05b77e39d1a28e09feff17c26c7e11b3f 100644 (file)
@@ -134,7 +134,13 @@ public class Messages extends NLS {
 
 
     public static String ConfiguratorComposite_CONFIGURE;
-       public static String DefinedTermMenu_FEATURE_TREE;
+       public static String DefinedTermEditorE4_SAVE_MESSAGE;
+
+
+    public static String DefinedTermEditorE4_SAVE_TITLE;
+
+
+    public static String DefinedTermMenu_FEATURE_TREE;
 
 
     public static String DefinedTermMenu_MENU;
index ab092372bcc983452cd19883ade26a8d107e7110..7ad54997b18dcacf686305593d0f6849dbc57b92 100644 (file)
@@ -149,6 +149,8 @@ SearchManager_LARGE_RESULT_EXPECTED=Large result expected
 SearchManager_LONG_SEARCH_WARNING=The current search will return %s objects. This will take a long time and/or might render the editor unusable. Please consider refining your search.\nSearch anyway?
 
 SupplementalDataViewPart_VIEWER_NAME=Supplemental Data
+DefinedTermEditorE4_SAVE_MESSAGE=You have made changes that must be saved before this query can be executed. Would you like to save?
+DefinedTermEditorE4_SAVE_TITLE=Save changes
 DefinedTermMenu_FEATURE_TREE=Feature Tree
 DefinedTermMenu_MENU=Menu
 DefinedTermMenu_OTHER_S=Other %ss
index cbfd9d1a92639e8965d0df1eaa88e23b937fad08..f80f878bcb33ef3cb4578d6da11e4a530296df89 100644 (file)
@@ -149,6 +149,8 @@ SearchManager_LARGE_RESULT_EXPECTED=Gro
 SearchManager_LONG_SEARCH_WARNING=Die aktuelle Suche wird %s Objekte laden. Dies kann einige Zeit dauern und den Editor währenddessen unbedienbar machen. Bitte erstellen sie eine detailliertere Suche.\nTrotzdem suchen?
 
 SupplementalDataViewPart_VIEWER_NAME=Zusatzdaten
+DefinedTermEditorE4_SAVE_MESSAGE=Sie haben Änderungen, die gespeichert werden müssen, bevor die Operation ausgeführt werden kann. Möchten Sie speichern?
+DefinedTermEditorE4_SAVE_TITLE=Änderungen speichern
 DefinedTermMenu_FEATURE_TREE=Merkmalsbaum
 DefinedTermMenu_MENU=Menü
 DefinedTermMenu_OTHER_S=Weitere %ss
index 7da7b70dc8d5cc62323057a6d0ddcb4de5e65fe4..7c949d73115b821cc5a7efdcb0ce15b90a23d1ae 100644 (file)
@@ -14,7 +14,6 @@ import org.eclipse.core.runtime.Assert;
 import org.eclipse.core.runtime.IStatus;
 
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
-import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
 
@@ -108,7 +107,7 @@ public abstract class AbstractPersistentPostOperation extends AbstractPostTaxonO
         */
        /** {@inheritDoc} */
        @Override
-    protected IStatus postExecute(CdmBase objectAffectedByOperation) {
+    protected IStatus postExecute(Object objectAffectedByOperation) {
                Assert.isNotNull(conversationEnabled, "Operation has to have a valid conversation attached.");
 
 
index baf6e5bd908770cdc454ec2f96aa67a9ac94cf25..b3d2b318b5529476b577a7d57e9362a9a9052cce 100644 (file)
@@ -13,7 +13,6 @@ import org.eclipse.core.commands.operations.IUndoContext;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 
-import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.common.ICdmBase;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
 
@@ -66,7 +65,7 @@ public abstract class AbstractPostOperation<T extends ICdmBase> extends Abstract
      * @param objectAffectedByOperation the affected object. Should be <code>null</code> if not needed
      * @return a {@link org.eclipse.core.runtime.IStatus} object.
      */
-    protected IStatus postExecute(CdmBase objectAffectedByOperation) {
+    protected IStatus postExecute(Object objectAffectedByOperation) {
 
         if(postOperationEnabled != null){
             return postOperationEnabled.postOperation(objectAffectedByOperation) ? Status.OK_STATUS : Status.CANCEL_STATUS;
index 40e533a0ff457cc3e5291601ed3f1ee276241aa8..95ed2b49573c999844b862f669c8e3b2ed502c61 100644 (file)
@@ -1,8 +1,8 @@
 /**
  * Copyright (C) 2007 EDIT
- * European Distributed Institute of Taxonomy 
+ * European Distributed Institute of Taxonomy
  * http://www.e-taxonomy.eu
- * 
+ *
  * The contents of this file are subject to the Mozilla Public License Version 1.1
  * See LICENSE.TXT at the top of this package for the full license terms.
  */
@@ -11,12 +11,10 @@ package eu.etaxonomy.taxeditor.operation;
 
 import org.eclipse.core.runtime.Status;
 
-import eu.etaxonomy.cdm.model.common.CdmBase;
-
 /**
  * Implementors may register to operations. The postOperation method will get
  * called after any post operation
- * 
+ *
  * @author n.hoffmann
  * @created 24.03.2009
  * @version 1.0
@@ -29,21 +27,21 @@ public interface IPostOperationEnabled {
         * created a new object and the {@link IPostOperationEnabled} has to know
         * about the object it should be passed to the {@link IPostOperationEnabled}
         * </p>
-        * 
+        *
         * @param objectAffectedByOperation
         *            a newly created object for example. May be <code>null</code>
         * @return true if the method executed successfully. Returning false will
         *         set the operations status to {@link Status.CANCEL_STATUS} which
         *         might not be what you want.
         */
-       public boolean postOperation(CdmBase objectAffectedByOperation);
-       
+       public boolean postOperation(Object objectAffectedByOperation);
+
        /**
         * This method will get called after the execution took place and occasional
         * cleanups were performed. This is typically the last thing to happen.
-        * 
+        *
         * @return a boolean.
         */
        public boolean onComplete();
-       
+
 }
index 283afd371b5a52c8abc3d6bb4cf0631b0110de2f..7a277c4b36f861d1b12fbda2808e8253ff00cb3d 100755 (executable)
@@ -26,6 +26,10 @@ import eu.etaxonomy.taxeditor.editor.definedterm.TermLabelProvider;
  */
 public class AreaLabelProvider extends TermLabelProvider implements ILabelProvider{
 
+    public AreaLabelProvider(){
+        super();
+    }
+
     public AreaLabelProvider(Styler vocStyler){
         super(vocStyler);
     }
index 655a96acf790907fc2bf1885859afb6d7a9e65b8..8994f95125f95f6e2da25f2c783fc755f9e2b520 100755 (executable)
@@ -23,14 +23,11 @@ import org.eclipse.jface.viewers.CheckStateChangedEvent;
 import org.eclipse.jface.viewers.CheckboxTreeViewer;
 import org.eclipse.jface.viewers.ICheckStateListener;
 import org.eclipse.jface.viewers.ITreeViewerListener;
-import org.eclipse.jface.viewers.StyledString.Styler;
 import org.eclipse.jface.viewers.TreeExpansionEvent;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.TextStyle;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
 
 import eu.etaxonomy.cdm.api.service.IVocabularyService;
 import eu.etaxonomy.cdm.model.common.CdmBase;
@@ -74,13 +71,7 @@ public class AvailableDistributionPage extends AbstractTermSelectionWizardPage i
         setViewer(new CheckboxTreeViewer(composite, SWT.NULL));
         ((CheckboxTreeViewer)getViewer()).getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
         getViewer().setContentProvider(new DistributionContentProvider());
-        Styler styler = new Styler() {
-            @Override
-            public void applyStyles(TextStyle textStyle) {
-                textStyle.foreground = Display.getCurrent().getSystemColor(SWT.COLOR_BLACK);
-            }
-        };
-        getViewer().setLabelProvider(new AreaLabelProvider(styler));
+        getViewer().setLabelProvider(new AreaLabelProvider());
         getViewer().setComparator(new AreaViewerComparator());
         ((CheckboxTreeViewer)getViewer()).addCheckStateListener(new ICheckStateListener() {
 
index d90c579bef17fed68176eeabd5217a91484caac2..95d5e8a195d792aa7ac0aae4dd918ceac46ad52a 100755 (executable)
@@ -17,14 +17,11 @@ import org.eclipse.jface.viewers.CheckStateChangedEvent;
 import org.eclipse.jface.viewers.CheckboxTreeViewer;
 import org.eclipse.jface.viewers.ColumnViewer;
 import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.StyledString.Styler;
 import org.eclipse.jface.viewers.ViewerComparator;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.TextStyle;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
 
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.common.DefinedTermBase;
@@ -72,14 +69,8 @@ public class AvailableDistributionStatusPage extends AbstractTermSelectionWizard
         setViewer(new CheckboxTreeViewer(composite, SWT.NULL));
         ((CheckboxTreeViewer)getViewer()).getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
 //        viewer.setContentProvider(new TermContentProvider());
-        Styler styler = new Styler() {
-            @Override
-            public void applyStyles(TextStyle textStyle) {
-                textStyle.foreground = Display.getCurrent().getSystemColor(SWT.COLOR_BLACK);
-            }
-        };
         getViewer().setContentProvider(new TermContentProvider());
-        getViewer().setLabelProvider(new TermLabelProvider(styler));
+        getViewer().setLabelProvider(new TermLabelProvider());
         getViewer().setComparator(new ViewerComparator());
         ((CheckboxTreeViewer)getViewer()).addCheckStateListener(new ICheckStateListener() {
 
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/wizard/CheckBoxTreeComposite.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/wizard/CheckBoxTreeComposite.java
new file mode 100644 (file)
index 0000000..8dc3075
--- /dev/null
@@ -0,0 +1,104 @@
+/**
+ * Copyright (C) 2018 EDIT
+ * European Distributed Institute of Taxonomy
+ * http://www.e-taxonomy.eu
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * See LICENSE.TXT at the top of this package for the full license terms.
+ */
+package eu.etaxonomy.taxeditor.preference.wizard;
+
+import org.eclipse.jface.viewers.AbstractTreeViewer;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author pplitzner
+ * @since Oct 26, 2018
+ *
+ */
+public class CheckBoxTreeComposite extends Composite {
+
+    private CheckboxTreeViewer viewer;
+
+    public CheckBoxTreeComposite(Composite parent, ITreeContentProvider contentProvider, IBaseLabelProvider labelProvider, int style) {
+        super(parent, style);
+        Composite composite = new Composite(parent, SWT.NULL);
+        composite.setLayout(new GridLayout());
+        Tree tree = new Tree(parent, SWT.BORDER | SWT.CHECK);
+        tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+        tree.addListener(SWT.Selection, event -> {
+            if (event.detail == SWT.CHECK) {
+                TreeItem item = (TreeItem) event.item;
+                Object data = item.getData();
+                boolean checked = item.getChecked();
+                if(checked){
+                    viewer.expandToLevel(data, AbstractTreeViewer.ALL_LEVELS);
+                }
+                checkItems(item, checked);
+                checkPath(item.getParentItem(), checked, false);
+            }
+        });
+        viewer = new CheckboxTreeViewer(tree);
+        viewer.setContentProvider(contentProvider);
+        viewer.setLabelProvider(labelProvider);
+    }
+
+    private void checkPath(TreeItem item, boolean checked, boolean grayed) {
+        if (item == null) {
+            return;
+        }
+        if (grayed) {
+            checked = true;
+        } else {
+            int index = 0;
+            TreeItem[] items = item.getItems();
+            while (index < items.length) {
+                TreeItem child = items[index];
+                if (child.getGrayed() || checked != child.getChecked()) {
+                    checked = grayed = true;
+                    break;
+                }
+                index++;
+            }
+        }
+        item.setChecked(checked);
+        item.setGrayed(grayed);
+        checkPath(item.getParentItem(), checked, grayed);
+    }
+
+    private void checkItems(TreeItem item, boolean checked) {
+        item.setGrayed(false);
+        item.setChecked(checked);
+        TreeItem[] items = item.getItems();
+        for (int i = 0; i < items.length; i++) {
+            checkItems(items[i], checked);
+        }
+    }
+
+    public CheckboxTreeViewer getViewer() {
+        return viewer;
+    }
+
+    /**
+     * Checks the tree items corresponding to the given elements.<br>
+     * <br>
+     * <b>Note:</b> In order to fully reveal the checked elements they
+     * have to be sorted according to the tree hierarchy.
+     * @param elements
+     */
+    public void setCheckedElements(Object[] elements) {
+        for (Object object : elements) {
+            viewer.reveal(object);
+            viewer.setChecked(object, true);
+        }
+    }
+
+}
index 32307f1d0756643507db234ece5d6c77d845c3ae..8d160ca71be5fcba832d0c404ef617dc02696277 100644 (file)
@@ -32,18 +32,20 @@ import org.eclipse.swt.SWTException;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
+import eu.etaxonomy.cdm.api.service.ITermService;
+import eu.etaxonomy.cdm.api.service.IVocabularyService;
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
-import eu.etaxonomy.cdm.model.common.CdmBase;
-import eu.etaxonomy.cdm.model.description.Distribution;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
+import eu.etaxonomy.cdm.persistence.dto.TermDto;
+import eu.etaxonomy.cdm.persistence.dto.TermVocabularyDto;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
-import eu.etaxonomy.taxeditor.editor.IDistributionEditor;
 import eu.etaxonomy.taxeditor.editor.ITaxonEditor;
 import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
+import eu.etaxonomy.taxeditor.store.CdmStore;
 import eu.etaxonomy.taxeditor.view.e4.details.DetailsViewerE4;
 import eu.etaxonomy.taxeditor.workbench.WorkbenchUtility;
 import eu.etaxonomy.taxeditor.workbench.part.ISelectionElementEditingPart;
@@ -225,14 +227,19 @@ public abstract class AbstractCdmEditorPartE4
 
                     }
                 }
-                if (element instanceof Distribution && part instanceof IDistributionEditor && viewer instanceof DetailsViewerE4){
-
+                //unwrap term DTOs
+                if(element instanceof TermDto){
+                    element = CdmStore.getService(ITermService.class).load(((TermDto) element).getUuid());
+                }
+                else if(element instanceof TermVocabularyDto){
+                    element = CdmStore.getService(IVocabularyService.class).load(((TermVocabularyDto) element).getUuid());
+                }
+                if (viewer instanceof DetailsViewerE4){
                     ((DetailsViewerE4)viewer).setInput(element, part);
-                }else{
+                    ((DetailsViewerE4)viewer).setDetailsEnabled(true);
+                }
+                else{
                     viewer.setInput(element);
-                    if (viewer instanceof DetailsViewerE4){
-                       ((DetailsViewerE4)viewer).setDetailsEnabled(true);
-                    }
                 }
                 selectionProvidingPart = activePart;
             }
@@ -303,7 +310,7 @@ public abstract class AbstractCdmEditorPartE4
      * {@inheritDoc}
      */
     @Override
-    public boolean postOperation(CdmBase objectAffectedByOperation) {
+    public boolean postOperation(Object objectAffectedByOperation) {
         changed(objectAffectedByOperation);
         return true;
     }
index f93089651f35ce86c27d038b73baf0afd91e65ea..13edf0f50f28c848ccce1a77fbc35bfe09f618e6 100755 (executable)
@@ -130,7 +130,7 @@ import eu.etaxonomy.taxeditor.view.e4.AbstractCdmDataViewerE4;
 /**
  *
  * The DetailsViewer handles the content of the details view (
- * {@link DetailsViewerE4}).<br>
+ * {@link DetailsPartE4}).<br>
  * Depending on the type of the selected element the section of the details view
  * are created.
  *