Merge branch 'develop' into wset
authorPatrick Plitzner <p.plitzner@bgbm.org>
Wed, 6 Dec 2017 07:36:09 +0000 (08:36 +0100)
committerPatrick Plitzner <p.plitzner@bgbm.org>
Wed, 6 Dec 2017 07:36:09 +0000 (08:36 +0100)
25 files changed:
eu.etaxonomy.taxeditor.editor/META-INF/MANIFEST.MF
eu.etaxonomy.taxeditor.editor/fragment.e4xmi
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/WorkingSetComposite.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/WorkingSetEditor.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/character/CharacterDragListener.java [moved from eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/CharacterDragListener.java with 96% similarity]
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/character/CharacterDropAdapter.java [moved from eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/CharacterDropAdapter.java with 97% similarity]
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/character/CharacterEditor.java [moved from eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/CharacterEditor.java with 99% similarity]
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/handler/OpenCharacterMatrixHandler.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/handler/OpenWorkingSetEditorHandler.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/matrix/CharacterMatrix.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/matrix/DataSource.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/matrix/DescriptionDisplayConverter.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/matrix/SpecimenColumnPropertyAccessor.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.feature.platform/feature.xml
eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/e4/TaxonNavigatorContentProviderE4.java
eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/e4/TaxonNavigatorLabelProviderE4.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/e4/FeatureTreeEditorComposite.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/combo/TermUuidComboViewer.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/combo/TermUuidContentProvider.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/combo/TermUuidLabelProvider.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/selection/FeatureTreeSelectionDialog.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/selection/WorkingSetSelectionDialog.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/util/TaxonTreeNodeContentProvider.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/util/TaxonTreeNodeLabelProvider.java [new file with mode: 0644]
eu.etaxonomy.taxeditor/rcp.target

index 897e692322ff71c48d4d00bdc3230c8034aa3abc..e6a716a9d2f4eefd0912eb66710a876481a8bfd8 100644 (file)
@@ -38,11 +38,15 @@ Require-Bundle: org.eclipse.ui,
  org.eclipse.e4.ui.di,
  org.eclipse.e4.core.commands,
  org.eclipse.e4.core.services,
- org.eclipse.e4.core.contexts
+ org.eclipse.e4.core.contexts,
+ org.eclipse.nebula.widgets.nattable.core,
+ org.eclipse.nebula.widgets.nattable.extension.glazedlists,
+ ca.odell.glazedlists
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-ActivationPolicy: lazy
 Import-Package: javax.annotation;version="1.0.0";resolution:=optional,
  javax.inject;version="1.0.0",
+ org.apache.commons.collections4.map,
  org.eclipse.core.databinding.beans,
  org.eclipse.core.databinding.observable.list,
  org.eclipse.core.databinding.observable.map,
index 0eeb9c512c8a9da3d8570dd72897b01a319abaae..b9e96ae4f724e2e7ed6f6685af55336f64138118 100644 (file)
@@ -57,7 +57,7 @@
         <children xsi:type="menu:HandledMenuItem" xmi:id="_wg0-oDulEeeOtqC_3qh40A" elementId="eu.etaxonomy.taxeditor.editor.handledmenuitem.commandlabel54" label="%command.label.54" iconURI="platform:/plugin/eu.etaxonomy.taxeditor.editor/icons/deep-delete-16x16-32.png" command="_fKT-wDulEeeOtqC_3qh40A"/>
       </menus>
     </elements>
-    <elements xsi:type="basic:PartDescriptor" xmi:id="_R7vxEECaEeeL5JDzMOYK6g" elementId="eu.etaxonomy.taxeditor.editor.workingSet.CharacterEditor" label="Character Editor" closeable="true" dirtyable="true" contributionURI="bundleclass://eu.etaxonomy.taxeditor.editor/eu.etaxonomy.taxeditor.editor.workingSet.CharacterEditor">
+    <elements xsi:type="basic:PartDescriptor" xmi:id="_R7vxEECaEeeL5JDzMOYK6g" elementId="eu.etaxonomy.taxeditor.editor.workingSet.CharacterEditor" label="Character Editor" closeable="true" dirtyable="true" contributionURI="bundleclass://eu.etaxonomy.taxeditor.editor/eu.etaxonomy.taxeditor.editor.workingSet.character.CharacterEditor">
       <tags>nonRestore</tags>
       <menus xsi:type="menu:PopupMenu" xmi:id="_cHWz8GhvEee3K4uKJljEYg" elementId="eu.etaxonomy.taxeditor.editor.popupmenu.characterEditor">
         <children xsi:type="menu:HandledMenuItem" xmi:id="_eDZC0GhvEee3K4uKJljEYg" elementId="eu.etaxonomy.taxeditor.editor.handledmenuitem.removecharacter" label="Remove Character" command="_oBEz8GhvEee3K4uKJljEYg"/>
       </menus>
     </elements>
     <elements xsi:type="basic:PartDescriptor" xmi:id="_ARZyMKz2EeeBIsZyvYlAaA" elementId="eu.etaxonomy.taxeditor.editor.group.authority.e4.CdmAuthorityEditorE4" label="%editor.name.4" closeable="true" dirtyable="true" contributionURI="bundleclass://eu.etaxonomy.taxeditor.editor/eu.etaxonomy.taxeditor.editor.group.authority.e4.CdmAuthorityEditorE4"/>
+    <elements xsi:type="basic:PartDescriptor" xmi:id="_Fa8l4M7XEeex0rHJ7p8Zdw" elementId="eu.etaxonomy.taxeditor.editor.view.workingSet.WorkingSetEditor" label="Working Set Editor" tooltip="Working Set Editor" allowMultiple="true" closeable="true" dirtyable="true" contributionURI="bundleclass://eu.etaxonomy.taxeditor.editor/eu.etaxonomy.taxeditor.editor.workingSet.WorkingSetEditor"/>
+    <elements xsi:type="basic:PartDescriptor" xmi:id="_rpaDsNK2EeeWSJT7vW9jsw" elementId="eu.etaxonomy.taxeditor.editor.workingSet.matrix.CharacterMatrix" label="Character Matrix" tooltip="Character Matrix" allowMultiple="true" closeable="true" dirtyable="true" contributionURI="bundleclass://eu.etaxonomy.taxeditor.editor/eu.etaxonomy.taxeditor.editor.workingSet.matrix.CharacterMatrix"/>
   </fragments>
   <fragments xsi:type="fragment:StringModelFragment" xmi:id="__mwtMDVpEee_b7RlBzTDRw" featurename="commands" parentElementId="xpath:/">
     <elements xsi:type="commands:Command" xmi:id="_BjF3ADVqEee_b7RlBzTDRw" elementId="eu.etaxonomy.taxeditor.editor.command.specimeneditor.create_field_unit" commandName="%command.commandname.1"/>
     <elements xsi:type="commands:Command" xmi:id="_1CaG8K21EeeykrJkROy5EA" elementId="eu.etaxonomy.taxeditor.editor.command.new.name" commandName="%command.name.24"/>
     <elements xsi:type="commands:Command" xmi:id="_2vSfgK21EeeykrJkROy5EA" elementId="eu.etaxonomy.taxeditor.editor.command.new.team" commandName="%command.name.25"/>
     <elements xsi:type="commands:Command" xmi:id="_4nv18K21EeeykrJkROy5EA" elementId="eu.etaxonomy.taxeditor.editor.command.new.person" commandName="%command.name.26"/>
+    <elements xsi:type="commands:Command" xmi:id="_gtN1MNBAEee0suQUeQx36A" elementId="eu.etaxonomy.taxeditor.editor.command.workingSet.openWorkingSetEditor" commandName="Open Working Set Editor"/>
+    <elements xsi:type="commands:Command" xmi:id="_FnWwMNXoEeeLtdyzt6BEAA" elementId="eu.etaxonomy.taxeditor.editor.command.workingSet.openCharacterMatrix" commandName="Open Character Matrix"/>
   </fragments>
   <fragments xsi:type="fragment:StringModelFragment" xmi:id="_pZmusEalEeeXMc6kSYO7Xg" featurename="children" parentElementId="eu.etaxonomy.taxeditor.menu.showView" positionInList="after:eu.etaxonomy.taxeditor.workbench.menuseparator.navigation">
     <elements xsi:type="menu:HandledMenuItem" xmi:id="_5s52EIZ3EeeOc9DZcjNN7g" elementId="eu.etaxonomy.taxeditor.editor.showViewMenu.concept" label="%command.label.6" tooltip="%command.label.6" command="_WPjpoDSnEeek0dKsFNy--Q">
       <visibleWhen xsi:type="ui:CoreExpression" xmi:id="_WbFAcKNxEeebGZ23ERGMGw" coreExpressionId="isCdmStoreConnectedAndShowExperimental"/>
       <parameters xmi:id="_FPIuUaNwEeebGZ23ERGMGw" elementId="eu.etaxonomy.taxeditor.editor.showView.parameter.conceptGraph" name="eu.etaxonomy.taxeditor.workbench.commandparameter.partName" value="eu.etaxonomy.taxeditor.editor.view.concept.graph.e4.ConceptGraphViewE4"/>
     </elements>
+    <elements xsi:type="menu:HandledMenuItem" xmi:id="_QvOWgM7XEeex0rHJ7p8Zdw" elementId="eu.etaxonomy.taxeditor.editor.showViewMenu.workingSetEditor" label="Working Set Editor" tooltip="Working Set Editor" command="_gtN1MNBAEee0suQUeQx36A"/>
+    <elements xsi:type="menu:HandledMenuItem" xmi:id="_jIucENK2EeeWSJT7vW9jsw" elementId="eu.etaxonomy.taxeditor.editor.showViewMenu.matrixEditor" label="Character Matrix" tooltip="Character Matrix" command="_FnWwMNXoEeeLtdyzt6BEAA"/>
   </fragments>
   <fragments xsi:type="fragment:StringModelFragment" xmi:id="_P9N9YJMkEeeR4YRjNqCKeA" featurename="handlers" parentElementId="xpath:/">
     <elements xsi:type="commands:Handler" xmi:id="_SL3mQJMkEeeR4YRjNqCKeA" elementId="eu.etaxonomy.taxeditor.editor.handler.defaultHandler.DefaultOpenSpecimenEditorForTypeSpecimenHandler" contributionURI="bundleclass://eu.etaxonomy.taxeditor.editor/eu.etaxonomy.taxeditor.editor.handler.defaultHandler.DefaultOpenSpecimenEditorForTypeSpecimenHandler" command="_2Bn-EJMjEeeR4YRjNqCKeA"/>
     <elements xsi:type="commands:Handler" xmi:id="_Xi9w8K22EeeykrJkROy5EA" elementId="eu.etaxonomy.taxeditor.editor.handler.create.NewNameHandler" contributionURI="bundleclass://eu.etaxonomy.taxeditor.editor/eu.etaxonomy.taxeditor.editor.handler.create.NewNameHandler" command="_1CaG8K21EeeykrJkROy5EA"/>
     <elements xsi:type="commands:Handler" xmi:id="_ahCroK22EeeykrJkROy5EA" elementId="eu.etaxonomy.taxeditor.editor.handler.create.NewTeamHandler" contributionURI="bundleclass://eu.etaxonomy.taxeditor.editor/eu.etaxonomy.taxeditor.editor.handler.create.NewTeamHandler" command="_2vSfgK21EeeykrJkROy5EA"/>
     <elements xsi:type="commands:Handler" xmi:id="_c0Ba4K22EeeykrJkROy5EA" elementId="eu.etaxonomy.taxeditor.editor.handler.create.NewPersonHandler" contributionURI="bundleclass://eu.etaxonomy.taxeditor.editor/eu.etaxonomy.taxeditor.editor.handler.create.NewPersonHandler" command="_4nv18K21EeeykrJkROy5EA"/>
+    <elements xsi:type="commands:Handler" xmi:id="_OYb2QNBAEee0suQUeQx36A" elementId="eu.etaxonomy.taxeditor.editor.workingSet.handler.OpenWorkingSetEditorHandler" contributionURI="bundleclass://eu.etaxonomy.taxeditor.editor/eu.etaxonomy.taxeditor.editor.workingSet.handler.OpenWorkingSetEditorHandler" command="_gtN1MNBAEee0suQUeQx36A"/>
+    <elements xsi:type="commands:Handler" xmi:id="_JvYVgNXoEeeLtdyzt6BEAA" elementId="eu.etaxonomy.taxeditor.editor.workingSet.handler.OpenCharacterMatrixHandler" contributionURI="bundleclass://eu.etaxonomy.taxeditor.editor/eu.etaxonomy.taxeditor.editor.workingSet.handler.OpenCharacterMatrixHandler" command="_FnWwMNXoEeeLtdyzt6BEAA"/>
   </fragments>
   <fragments xsi:type="fragment:StringModelFragment" xmi:id="_OyvD8KNOEee5fYT78qEx0A" featurename="children" parentElementId="bulkeditor.menus.openmenu" positionInList="last">
     <elements xsi:type="menu:HandledMenuItem" xmi:id="_SZZBkKNOEee5fYT78qEx0A" elementId="eu.etaxonomy.taxeditor.editor.handledmenuitem.specimen_editor" label="%command.label.DERIVATIVE_EDITOR" tooltip="%command.label.DERIVATIVE_EDITOR" command="_PDjFMLsKEeeQJq8FDGEi1g"/>
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/WorkingSetComposite.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/WorkingSetComposite.java
new file mode 100644 (file)
index 0000000..b4d3f5f
--- /dev/null
@@ -0,0 +1,174 @@
+/**
+ * Copyright (C) 2017 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.workingSet;
+
+import java.util.List;
+
+import org.eclipse.jface.viewers.ITreeSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Tree;
+
+import eu.etaxonomy.cdm.api.service.IClassificationService;
+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.model.taxon.Classification;
+import eu.etaxonomy.cdm.model.taxon.TaxonNode;
+import eu.etaxonomy.taxeditor.featuretree.e4.FeatureTreeEditorComposite;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.taxeditor.ui.combo.TermUuidComboViewer;
+import eu.etaxonomy.taxeditor.ui.dialog.selection.NamedAreaSelectionDialog;
+import eu.etaxonomy.taxeditor.util.TaxonTreeNodeContentProvider;
+import eu.etaxonomy.taxeditor.util.TaxonTreeNodeLabelProvider;
+
+/**
+ * @author pplitzner
+ * @since Nov 21, 2017
+ *
+ */
+public class WorkingSetComposite extends Composite {
+    private Text txtWorkingSetLabel;
+    private TermUuidComboViewer comboRankMin;
+    private TermUuidComboViewer comboRankMax;
+    private FeatureTreeEditorComposite featureTreeEditorComposite;
+    private TreeViewer taxonNodeTree;
+    private NamedArea area;
+    private Label lblAreaLabel;
+
+    public WorkingSetComposite(Composite parent, int style) {
+        super(parent, style);
+        setLayout(new GridLayout(4, false));
+
+        Label lblNewLabel = new Label(this, SWT.NONE);
+        lblNewLabel.setText("Working set label");
+
+        txtWorkingSetLabel = new Text(this, SWT.BORDER);
+        txtWorkingSetLabel.setEditable(false);
+        txtWorkingSetLabel.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1));
+
+        Label lblNewLabel_1 = new Label(this, SWT.NONE);
+        lblNewLabel_1.setText("Taxon filter");
+
+        featureTreeEditorComposite = new FeatureTreeEditorComposite(this, SWT.NONE);
+        featureTreeEditorComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 4));
+        featureTreeEditorComposite.init(null, null, null, null);
+
+        Label lblNewLabel_2 = new Label(this, SWT.NONE);
+        lblNewLabel_2.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
+        lblNewLabel_2.setText("Rank min");
+
+        comboRankMin = new TermUuidComboViewer(this, SWT.NONE);
+        comboRankMin.setInput(TermType.Rank);
+        comboRankMin.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
+
+        Composite composite = new Composite(this, SWT.NONE);
+        composite.setLayout(new FillLayout(SWT.HORIZONTAL));
+        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 3));
+
+        taxonNodeTree = new TreeViewer(new Tree(composite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION));
+
+        taxonNodeTree.setContentProvider(new TaxonTreeNodeContentProvider());
+        taxonNodeTree.setLabelProvider(new TaxonTreeNodeLabelProvider());
+        List<Classification> list = CdmStore.getService(IClassificationService.class).list(Classification.class, null, null, null, null);
+        taxonNodeTree.setInput(list);
+
+        Label lblNewLabel_3 = new Label(this, SWT.NONE);
+        lblNewLabel_3.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
+        lblNewLabel_3.setText("Rank max");
+
+        comboRankMax = new TermUuidComboViewer(this, SWT.NONE);
+        comboRankMax.setInput(TermType.Rank);
+        comboRankMax.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
+
+        Label lblNewLabel_4 = new Label(this, SWT.NONE);
+        lblNewLabel_4.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false, 1, 1));
+        lblNewLabel_4.setText("Area");
+
+        Composite composite_1 = new Composite(this, SWT.NONE);
+        composite_1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));
+        composite_1.setLayout(new GridLayout(2, false));
+
+        lblAreaLabel = new Label(composite_1, SWT.NONE);
+        lblAreaLabel.setText("New Label");
+
+
+        Button btnNewButton = new Button(composite_1, SWT.NONE);
+        btnNewButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1));
+        btnNewButton.setText("Choose");
+        btnNewButton.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                NamedArea area = NamedAreaSelectionDialog.select(parent.getShell(), null, null);
+                setArea(area);
+            }
+
+        });
+
+    }
+
+    @Override
+    protected void checkSubclass() {
+        // Disable the check that prevents subclassing of SWT components
+    }
+    public Text getTxt_label() {
+        return txtWorkingSetLabel;
+    }
+
+    public TermUuidComboViewer getRankMin() {
+        return comboRankMin;
+    }
+    public TermUuidComboViewer getRankMax() {
+        return comboRankMax;
+    }
+
+    public void setRankMin(Rank min) {
+        comboRankMin.setTerm(min);
+    }
+    public void setRankMax(Rank max) {
+        comboRankMax.setTerm(max);
+    }
+
+    public FeatureTree getCharacters(){
+        return featureTreeEditorComposite.getFeatureTree();
+    }
+    public void setCharacters(FeatureTree characters) {
+        featureTreeEditorComposite.setSelectedTree(characters, null);
+    }
+
+    public TaxonNode getTaxonNode(){
+        ITreeSelection selection = (ITreeSelection) taxonNodeTree.getSelection();
+        if(selection!=null && selection.getFirstElement() instanceof TaxonNode){
+            return (TaxonNode) selection.getFirstElement();
+        }
+        return null;
+    }
+    public void setTaxonNode(TaxonNode taxonNode){
+        taxonNodeTree.setSelection(new StructuredSelection(taxonNode), true);
+    }
+
+    public NamedArea getArea(){
+        return area;
+    }
+    public void setArea(NamedArea area) {
+        this.area = area;
+        lblAreaLabel.setText(area.getLabel());
+    }
+}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/WorkingSetEditor.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/WorkingSetEditor.java
new file mode 100644 (file)
index 0000000..bd7109f
--- /dev/null
@@ -0,0 +1,160 @@
+/**
+* Copyright (C) 2017 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.workingSet;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.inject.Inject;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.e4.core.contexts.ContextInjectionFactory;
+import org.eclipse.e4.core.contexts.IEclipseContext;
+import org.eclipse.e4.ui.di.Focus;
+import org.eclipse.e4.ui.di.Persist;
+import org.eclipse.e4.ui.model.application.ui.MDirtyable;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+
+import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
+import eu.etaxonomy.cdm.api.service.IOccurrenceService;
+import eu.etaxonomy.cdm.api.service.IWorkingSetService;
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
+import eu.etaxonomy.cdm.model.common.DefinedTermBase;
+import eu.etaxonomy.cdm.model.description.FeatureTree;
+import eu.etaxonomy.cdm.model.description.SpecimenDescription;
+import eu.etaxonomy.cdm.model.description.WorkingSet;
+import eu.etaxonomy.cdm.model.location.NamedArea;
+import eu.etaxonomy.cdm.model.name.Rank;
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
+import eu.etaxonomy.cdm.model.taxon.Taxon;
+import eu.etaxonomy.cdm.model.taxon.TaxonNode;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
+import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
+
+/**
+ * @author pplitzner
+ * @since Nov 21, 2017
+ *
+ */
+public class WorkingSetEditor implements IE4SavablePart{
+
+    private WorkingSetComposite composite;
+
+    private ConversationHolder conversation;
+
+    private WorkingSet workingSet;
+
+    @Inject
+    private MDirtyable dirty;
+
+    @PostConstruct
+    public void create(Composite parent, IEclipseContext context){
+        if(CdmStore.isActive() && conversation==null){
+            conversation = CdmStore.createConversation();
+        }
+        else{
+            return;
+        }
+        CdmFormFactory cdmFormFactory = new CdmFormFactory(Display.getCurrent());
+        ContextInjectionFactory.inject(cdmFormFactory, context);
+        composite = new WorkingSetComposite(parent, SWT.NONE);
+        dirty.setDirty(true);
+    }
+
+    public void init(WorkingSet workingSet) {
+        this.workingSet = workingSet;
+        if(workingSet.getTitleCache()!=null){
+            composite.getTxt_label().setText(workingSet.getTitleCache());
+        }
+        if(workingSet.getDescriptiveSystem()!=null){
+            composite.setCharacters(workingSet.getDescriptiveSystem());
+        }
+        Rank maxRank = workingSet.getMaxRank();
+        if(maxRank!=null){
+            composite.setRankMax(maxRank);
+        }
+        Rank minRank = workingSet.getMinRank();
+        if(minRank!=null){
+            composite.setRankMin(minRank);
+        }
+        Set<NamedArea> geoFilter = workingSet.getGeoFilter();
+        if(geoFilter!=null && !geoFilter.isEmpty()){
+            composite.setArea(geoFilter.iterator().next());
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Persist
+    @Override
+    public void save(IProgressMonitor monitor) {
+        NamedArea area = composite.getArea();
+        Set<NamedArea> areas = new HashSet<>();
+        if(area!=null){
+            areas.add(area);
+        }
+        TaxonNode taxonNode = composite.getTaxonNode();
+        Set<NamedArea> descriptions;
+        if(taxonNode!=null && taxonNode.getTaxon()!=null){
+            Taxon taxon = HibernateProxyHelper.deproxy(taxonNode.getTaxon(), Taxon.class);
+            Collection<SpecimenOrObservationBase> specimens = CdmStore.getService(IOccurrenceService.class).listByAssociatedTaxon(SpecimenOrObservationBase.class, null, taxon, null, null, null, null, null);
+            for (SpecimenOrObservationBase specimen : specimens) {
+                Set<SpecimenDescription> specimenDescriptions = specimen.getSpecimenDescriptions();
+                for (SpecimenDescription specimenDescription : specimenDescriptions) {
+                    workingSet.addDescription(specimenDescription);
+                }
+            }
+        }
+        FeatureTree characters = composite.getCharacters();
+        DefinedTermBase rankMaxSelection = composite.getRankMax().getSelection();
+        Rank rankMax = null;
+        if(rankMaxSelection instanceof Rank){
+            rankMax = (Rank) rankMaxSelection;
+        }
+        DefinedTermBase rankMinSelection = composite.getRankMin().getSelection();
+        Rank rankMin = null;
+        if(rankMinSelection instanceof Rank){
+            rankMin = (Rank) rankMinSelection;
+        }
+
+        workingSet.setMaxRank(rankMax);
+        workingSet.setMinRank(rankMin);
+        workingSet.setDescriptiveSystem(characters);
+        workingSet.addTaxonSubtree(taxonNode);
+        workingSet.setGeoFilter(areas);
+
+        conversation.commit();
+        CdmStore.getService(IWorkingSetService.class).merge(workingSet, true);
+
+        dirty.setDirty(false);
+    }
+
+    @Focus
+    public void setFocus(){
+        if(conversation!=null){
+            conversation.bind();
+        }
+    }
+
+    @PreDestroy
+    public void dispose(){
+        if(conversation!=null){
+            conversation.close();
+            conversation = null;
+        }
+    }
+
+}
@@ -6,7 +6,7 @@
 * 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.workingSet;
+package eu.etaxonomy.taxeditor.editor.workingSet.character;
 
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.TreeViewer;
@@ -6,7 +6,7 @@
 * 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.workingSet;
+package eu.etaxonomy.taxeditor.editor.workingSet.character;
 
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jface.viewers.ViewerDropAdapter;
similarity index 99%
rename from eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/CharacterEditor.java
rename to eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/character/CharacterEditor.java
index e0c094f7c1c88af4252c4c14ecee3d1caf9fe04f..1de06b85be456bc367d4d51f052d1b98ff7d21dd 100644 (file)
@@ -7,7 +7,7 @@
 * 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.workingSet;
+package eu.etaxonomy.taxeditor.editor.workingSet.character;
 
 import java.util.ArrayList;
 import java.util.Arrays;
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/handler/OpenCharacterMatrixHandler.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/handler/OpenCharacterMatrixHandler.java
new file mode 100644 (file)
index 0000000..3232cda
--- /dev/null
@@ -0,0 +1,39 @@
+
+package eu.etaxonomy.taxeditor.editor.workingSet.handler;
+
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;
+import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
+import org.eclipse.e4.ui.workbench.modeling.EModelService;
+import org.eclipse.e4.ui.workbench.modeling.EPartService;
+import org.eclipse.e4.ui.workbench.modeling.EPartService.PartState;
+import org.eclipse.swt.widgets.Shell;
+
+import eu.etaxonomy.cdm.model.description.WorkingSet;
+import eu.etaxonomy.taxeditor.editor.workingSet.matrix.CharacterMatrix;
+import eu.etaxonomy.taxeditor.ui.dialog.selection.WorkingSetSelectionDialog;
+import eu.etaxonomy.taxeditor.workbench.WorkbenchUtility;
+
+public class OpenCharacterMatrixHandler {
+
+       @Execute
+       public void execute(Shell shell, EPartService partService, MApplication application, EModelService modelService) {
+           WorkingSet workingSet = WorkingSetSelectionDialog.select(shell, null);
+           if(workingSet==null){
+               return;
+           }
+           MPart part = partService.createPart("eu.etaxonomy.taxeditor.editor.workingSet.matrix.CharacterMatrix");
+
+        MPartStack editorAreaPartStack = WorkbenchUtility.getEditorAreaPartStack(application, modelService);
+        if(editorAreaPartStack!=null){
+            editorAreaPartStack.getChildren().add(part);
+        }
+        part = partService.showPart(part, PartState.ACTIVATE);
+
+        CharacterMatrix editor = (CharacterMatrix) part.getObject();
+        editor.init(workingSet);
+
+       }
+
+}
\ No newline at end of file
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/handler/OpenWorkingSetEditorHandler.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/handler/OpenWorkingSetEditorHandler.java
new file mode 100644 (file)
index 0000000..ac7fdd5
--- /dev/null
@@ -0,0 +1,39 @@
+
+package eu.etaxonomy.taxeditor.editor.workingSet.handler;
+
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;
+import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
+import org.eclipse.e4.ui.workbench.modeling.EModelService;
+import org.eclipse.e4.ui.workbench.modeling.EPartService;
+import org.eclipse.e4.ui.workbench.modeling.EPartService.PartState;
+import org.eclipse.swt.widgets.Shell;
+
+import eu.etaxonomy.cdm.model.description.WorkingSet;
+import eu.etaxonomy.taxeditor.editor.workingSet.WorkingSetEditor;
+import eu.etaxonomy.taxeditor.ui.dialog.selection.WorkingSetSelectionDialog;
+import eu.etaxonomy.taxeditor.workbench.WorkbenchUtility;
+
+public class OpenWorkingSetEditorHandler {
+
+       @Execute
+       public void execute(Shell shell, EPartService partService, MApplication application, EModelService modelService) {
+           WorkingSet workingSet = WorkingSetSelectionDialog.select(shell, null);
+           if(workingSet==null){
+               return;
+           }
+           MPart part = partService.createPart("eu.etaxonomy.taxeditor.editor.view.workingSet.WorkingSetEditor");
+
+        MPartStack editorAreaPartStack = WorkbenchUtility.getEditorAreaPartStack(application, modelService);
+        if(editorAreaPartStack!=null){
+            editorAreaPartStack.getChildren().add(part);
+        }
+        part = partService.showPart(part, PartState.ACTIVATE);
+
+        WorkingSetEditor editor = (WorkingSetEditor) part.getObject();
+        editor.init(workingSet);
+
+       }
+
+}
\ No newline at end of file
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/matrix/CharacterMatrix.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/matrix/CharacterMatrix.java
new file mode 100644 (file)
index 0000000..a3b4fd6
--- /dev/null
@@ -0,0 +1,324 @@
+/**
+* Copyright (C) 2017 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.workingSet.matrix;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.inject.Inject;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.e4.ui.di.Focus;
+import org.eclipse.e4.ui.di.Persist;
+import org.eclipse.e4.ui.model.application.ui.MDirtyable;
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;
+import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.nebula.widgets.nattable.NatTable;
+import org.eclipse.nebula.widgets.nattable.config.AbstractRegistryConfiguration;
+import org.eclipse.nebula.widgets.nattable.config.CellConfigAttributes;
+import org.eclipse.nebula.widgets.nattable.config.ConfigRegistry;
+import org.eclipse.nebula.widgets.nattable.config.DefaultNatTableStyleConfiguration;
+import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry;
+import org.eclipse.nebula.widgets.nattable.data.IDataProvider;
+import org.eclipse.nebula.widgets.nattable.data.ListDataProvider;
+import org.eclipse.nebula.widgets.nattable.export.command.ExportCommand;
+import org.eclipse.nebula.widgets.nattable.export.command.ExportCommandHandler;
+import org.eclipse.nebula.widgets.nattable.extension.glazedlists.GlazedListsEventLayer;
+import org.eclipse.nebula.widgets.nattable.extension.glazedlists.GlazedListsSortModel;
+import org.eclipse.nebula.widgets.nattable.grid.data.DefaultColumnHeaderDataProvider;
+import org.eclipse.nebula.widgets.nattable.grid.data.DefaultCornerDataProvider;
+import org.eclipse.nebula.widgets.nattable.grid.data.DefaultRowHeaderDataProvider;
+import org.eclipse.nebula.widgets.nattable.grid.layer.ColumnHeaderLayer;
+import org.eclipse.nebula.widgets.nattable.grid.layer.CornerLayer;
+import org.eclipse.nebula.widgets.nattable.grid.layer.GridLayer;
+import org.eclipse.nebula.widgets.nattable.grid.layer.RowHeaderLayer;
+import org.eclipse.nebula.widgets.nattable.layer.DataLayer;
+import org.eclipse.nebula.widgets.nattable.layer.ILayer;
+import org.eclipse.nebula.widgets.nattable.layer.ILayerListener;
+import org.eclipse.nebula.widgets.nattable.layer.cell.ColumnLabelAccumulator;
+import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;
+import org.eclipse.nebula.widgets.nattable.layer.event.ILayerEvent;
+import org.eclipse.nebula.widgets.nattable.reorder.ColumnReorderLayer;
+import org.eclipse.nebula.widgets.nattable.reorder.RowReorderLayer;
+import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer;
+import org.eclipse.nebula.widgets.nattable.selection.event.CellSelectionEvent;
+import org.eclipse.nebula.widgets.nattable.sort.SortHeaderLayer;
+import org.eclipse.nebula.widgets.nattable.sort.config.SingleClickSortConfiguration;
+import org.eclipse.nebula.widgets.nattable.style.DisplayMode;
+import org.eclipse.nebula.widgets.nattable.viewport.ViewportLayer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+
+import ca.odell.glazedlists.EventList;
+import ca.odell.glazedlists.GlazedLists;
+import ca.odell.glazedlists.SortedList;
+import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
+import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
+import eu.etaxonomy.cdm.api.service.IWorkingSetService;
+import eu.etaxonomy.cdm.model.description.DescriptionBase;
+import eu.etaxonomy.cdm.model.description.SpecimenDescription;
+import eu.etaxonomy.cdm.model.description.WorkingSet;
+import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
+import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
+import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
+
+/**
+ * @author pplitzner
+ * @since Nov 26, 2017
+ *
+ */
+public class CharacterMatrix implements IE4SavablePart, IPartContentHasDetails, IConversationEnabled, IDirtyMarkable{
+
+    private WorkingSet workingSet;
+
+    private Composite parent;
+
+    private ConversationHolder conversation;
+
+    @Inject
+    private ESelectionService selService;
+
+    @Inject
+    private MDirtyable dirty;
+
+    @Inject
+    private MPart thisPart;
+
+    private NatTable natTable;
+
+    @PostConstruct
+    public void create(Composite parent) {
+        if(CdmStore.isActive() && conversation==null){
+            conversation = CdmStore.createConversation();
+        }
+        else{
+            return;
+        }
+        parent.setLayout(new GridLayout());
+        this.parent = parent;
+    }
+
+
+    public void init(WorkingSet workingSet) {
+        this.workingSet = workingSet;
+        thisPart.setLabel(workingSet.getLabel());
+
+        EventList<SpecimenDescription> descriptions = GlazedLists.eventList(getDescriptions(workingSet));
+        SortedList<SpecimenDescription> sortedList = new SortedList<>(descriptions, null);
+
+        // create the data provider
+        SpecimenColumnPropertyAccessor columnPropertyAccessor = new SpecimenColumnPropertyAccessor(workingSet);
+        IDataProvider bodyDataProvider = new ListDataProvider<SpecimenDescription>(sortedList, columnPropertyAccessor);
+
+        DataLayer bodyDataLayer = new DataLayer(bodyDataProvider);
+        GlazedListsEventLayer<SpecimenDescription> eventLayer = new GlazedListsEventLayer<>(bodyDataLayer, sortedList);
+
+        RowReorderLayer rowReorderLayer = new RowReorderLayer(eventLayer);
+        ColumnReorderLayer columnReorderLayer = new ColumnReorderLayer(rowReorderLayer);
+        SelectionLayer selectionLayer = new SelectionLayer(columnReorderLayer);
+        ViewportLayer viewportLayer = new ViewportLayer(selectionLayer);
+
+        // build the column header layer stack
+        IDataProvider columnHeaderDataProvider = new DefaultColumnHeaderDataProvider(
+                columnPropertyAccessor.getPropertyToLabelMap().values().toArray(new String[] {}), columnPropertyAccessor.getPropertyToLabelMap());
+        DataLayer columnHeaderDataLayer = new DataLayer(columnHeaderDataProvider);
+        ILayer columnHeaderLayer = new ColumnHeaderLayer(columnHeaderDataLayer, viewportLayer, selectionLayer);
+
+        ConfigRegistry configRegistry = new ConfigRegistry();
+
+        // add the SortHeaderLayer to the column header layer stack
+        // as we use GlazedLists, we use the GlazedListsSortModel which
+        // delegates the sorting to the SortedList
+        final SortHeaderLayer sortHeaderLayer =
+                new SortHeaderLayer<>(
+                        columnHeaderLayer,
+                        new GlazedListsSortModel<>(
+                                sortedList,
+                                columnPropertyAccessor,
+                                configRegistry,
+                                columnHeaderDataLayer));
+
+        // build the row header layer stack
+        IDataProvider rowHeaderDataProvider = new DefaultRowHeaderDataProvider(bodyDataProvider);
+        DataLayer rowHeaderDataLayer = new DataLayer(rowHeaderDataProvider, 40, 20);
+        ILayer rowHeaderLayer = new RowHeaderLayer(rowHeaderDataLayer, viewportLayer, selectionLayer);
+
+        // build the corner layer stack
+        ILayer cornerLayer = new CornerLayer(
+                new DataLayer(new DefaultCornerDataProvider(columnHeaderDataProvider, rowHeaderDataProvider)),
+                rowHeaderLayer, sortHeaderLayer);
+
+        // create the grid layer composed with the prior created layer stacks
+        GridLayer gridLayer = new GridLayer(viewportLayer, sortHeaderLayer, rowHeaderLayer, cornerLayer);
+
+
+        //Create a ColumnLabelAccumulator to allow adding different configuration for columns
+        //e.g. to add a data converter to a column
+        ColumnLabelAccumulator columnLabelAccumulator = new ColumnLabelAccumulator(bodyDataProvider);
+        bodyDataLayer.setConfigLabelAccumulator(columnLabelAccumulator);
+
+        natTable = new NatTable(parent, gridLayer, false);
+
+        natTable.setConfigRegistry(configRegistry);
+
+
+        //add default configuration because autoconfigure is set to false in constructor
+        natTable.addConfiguration(new DefaultNatTableStyleConfiguration());
+
+        // override the default sort configuration and change the mouse bindings
+        // to sort on a single click
+        natTable.addConfiguration(new SingleClickSortConfiguration());
+
+//        natTable.addConfiguration( new DefaultSortConfiguration());
+
+        // add custom configuration for data conversion
+        viewportLayer.addConfiguration(new AbstractRegistryConfiguration() {
+
+            @Override
+            public void configureRegistry(IConfigRegistry configRegistry) {
+
+                // apply for all columns of the data body region
+                for (int i = 0; i < bodyDataLayer.getColumnCount(); i++) {
+                    configRegistry.registerConfigAttribute(
+                            // attribute to apply
+                            CellConfigAttributes.DISPLAY_CONVERTER,
+                            // value of the attribute
+                            new DescriptionDisplayConverter(),
+                            // apply during normal rendering i.e not
+                            // during selection or edit
+                            DisplayMode.NORMAL,
+                            // apply the above for all cells with this label
+                            ColumnLabelAccumulator.COLUMN_LABEL_PREFIX + i);
+                }
+
+            }
+        });
+
+        // add the ExportCommandHandler to the ViewportLayer in order to make
+        // exporting work
+        viewportLayer.registerCommandHandler(new ExportCommandHandler(viewportLayer));
+
+        //propagate single cell selection
+        natTable.addLayerListener(new ILayerListener() {
+
+            @Override
+            public void handleLayerEvent(ILayerEvent event) {
+                if(event instanceof CellSelectionEvent){
+                    CellSelectionEvent cellSelectionEvent = (CellSelectionEvent)event;
+                    Collection<ILayerCell> selectedCells = cellSelectionEvent.getSelectionLayer().getSelectedCells();
+                    if(selectedCells.size()==1){
+                        ILayerCell cell = selectedCells.iterator().next();
+                        selService.setSelection(cell.getDataValue());
+                    }
+                }
+            }
+        });
+
+        natTable.configure();
+
+        GridDataFactory.fillDefaults().grab(true, true).applyTo(natTable);
+
+        //excel export
+        Button addColumnButton = new Button(parent, SWT.PUSH);
+        addColumnButton.setText("Export");
+        addColumnButton.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                natTable.doCommand(
+                        new ExportCommand(
+                                natTable.getConfigRegistry(),
+                                natTable.getShell()));
+            }
+        });
+
+        parent.layout();
+    }
+
+    private List<SpecimenDescription> getDescriptions(WorkingSet workingSet) {
+        List<SpecimenDescription> descriptions = new ArrayList<>();
+        Set<DescriptionBase> wsDescriptions = workingSet.getDescriptions();
+        for (DescriptionBase descriptionBase : wsDescriptions) {
+            if(descriptionBase instanceof SpecimenDescription){
+                descriptions.add((SpecimenDescription) descriptionBase);
+            }
+        }
+        return descriptions;
+    }
+
+    @Persist
+    @Override
+    public void save(IProgressMonitor monitor) {
+        CdmStore.getService(IWorkingSetService.class).merge(workingSet, true);
+        conversation.commit();
+        dirty.setDirty(false);
+    }
+
+    @Focus
+    public void setFocus(){
+        if(conversation!=null){
+            conversation.bind();
+        }
+    }
+
+    @PreDestroy
+    public void dispose(){
+        if(conversation!=null){
+            conversation.close();
+            conversation = null;
+        }
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void update(CdmDataChangeMap arg0) {
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public ConversationHolder getConversationHolder() {
+        return conversation;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void changed(Object element) {
+        dirty.setDirty(true);
+        natTable.refresh();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void forceDirty() {
+        dirty.setDirty(true);
+    }
+
+}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/matrix/DataSource.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/matrix/DataSource.java
new file mode 100644 (file)
index 0000000..7686a04
--- /dev/null
@@ -0,0 +1,91 @@
+/**
+* Copyright (C) 2017 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.workingSet.matrix;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import eu.etaxonomy.cdm.model.description.CategoricalData;
+import eu.etaxonomy.cdm.model.description.Feature;
+import eu.etaxonomy.cdm.model.description.FeatureTree;
+import eu.etaxonomy.cdm.model.description.QuantitativeData;
+import eu.etaxonomy.cdm.model.description.SpecimenDescription;
+import eu.etaxonomy.cdm.model.description.State;
+import eu.etaxonomy.cdm.model.description.WorkingSet;
+import eu.etaxonomy.cdm.model.name.Rank;
+import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
+
+/**
+ * @author pplitzner
+ * @since Nov 26, 2017
+ *
+ */
+public class DataSource {
+
+    private static final Feature LEAF_COLOR_FEATURE = Feature.NewInstance("color of the leaf", "leaf color", "leaf color");
+    private static final Feature LEAF_LENGTH_FEATURE = Feature.NewInstance("length of the leaf", "Leaf length", "leaf length");
+
+    public static WorkingSet getWorkingSet(){
+        FeatureTree tree = FeatureTree.NewInstance(getFeatures());
+
+        WorkingSet workingSet = WorkingSet.NewInstance();
+        workingSet.setDescriptiveSystem(tree);
+        workingSet.setMaxRank(Rank.GENUS());
+        workingSet.setMinRank(Rank.SUBSPECIES());
+        getDescriptions().forEach(description -> workingSet.addDescription(description));
+        workingSet.setLabel("PP-Wset");
+        return workingSet;
+
+    }
+
+    public static List<SpecimenDescription> getDescriptions(){
+        List<SpecimenDescription> descriptions = new ArrayList<>();
+
+        SpecimenDescription description = createDescription(0.3f, 2.4f, "blue");
+        DerivedUnit derivedUnit = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
+        derivedUnit.setAccessionNumber("B 10 35489");
+        description.setDescribedSpecimenOrObservation(derivedUnit);
+
+        SpecimenDescription description2 = createDescription(1.6f, 6.4f, "red");
+        DerivedUnit derivedUnit2 = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
+        derivedUnit2.setAccessionNumber("B 10 44556");
+        description2.setDescribedSpecimenOrObservation(derivedUnit2);
+
+        descriptions.add(description);
+        descriptions.add(description2);
+        return descriptions;
+    }
+
+    private static List<Feature> getFeatures(){
+        List<Feature> features = new ArrayList<>();
+        features.add(LEAF_LENGTH_FEATURE);
+        features.add(LEAF_COLOR_FEATURE);
+
+        return features;
+    }
+
+    private static SpecimenDescription createDescription(Float min, Float max, String colorLabel) {
+        SpecimenDescription desc = SpecimenDescription.NewInstance();
+
+        QuantitativeData length = QuantitativeData.NewInstance(LEAF_LENGTH_FEATURE);
+        length.setMinimum(min, Collections.emptySet());
+        length.setMaximum(max, Collections.emptySet());
+        desc.addElement(length);
+
+        CategoricalData color = CategoricalData.NewInstance(LEAF_COLOR_FEATURE);
+        color.addStateData(State.NewInstance(colorLabel, colorLabel, colorLabel));
+        desc.addElement(color);
+
+
+        return desc;
+    }
+
+}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/matrix/DescriptionDisplayConverter.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/matrix/DescriptionDisplayConverter.java
new file mode 100644 (file)
index 0000000..7e41b88
--- /dev/null
@@ -0,0 +1,43 @@
+/**
+* Copyright (C) 2017 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.workingSet.matrix;
+
+import org.eclipse.nebula.widgets.nattable.data.convert.DisplayConverter;
+
+import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
+import eu.etaxonomy.taxeditor.model.DescriptionHelper;
+
+/**
+ * @author pplitzner
+ * @since Dec 1, 2017
+ *
+ */
+public class DescriptionDisplayConverter extends DisplayConverter {
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Object canonicalToDisplayValue(Object canonicalValue) {
+        if(canonicalValue instanceof DescriptionElementBase){
+            return DescriptionHelper.getLabel(canonicalValue);
+        }
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Object displayToCanonicalValue(Object displayValue) {
+        return null;
+    }
+
+
+}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/matrix/SpecimenColumnPropertyAccessor.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/matrix/SpecimenColumnPropertyAccessor.java
new file mode 100644 (file)
index 0000000..8432c44
--- /dev/null
@@ -0,0 +1,99 @@
+/**
+* Copyright (C) 2017 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.workingSet.matrix;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.collections4.map.LinkedMap;
+import org.eclipse.nebula.widgets.nattable.data.IColumnPropertyAccessor;
+
+import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
+import eu.etaxonomy.cdm.model.description.Feature;
+import eu.etaxonomy.cdm.model.description.FeatureTree;
+import eu.etaxonomy.cdm.model.description.SpecimenDescription;
+import eu.etaxonomy.cdm.model.description.WorkingSet;
+
+/**
+ * @author pplitzner
+ * @since Nov 26, 2017
+ *
+ */
+public class SpecimenColumnPropertyAccessor implements IColumnPropertyAccessor<SpecimenDescription>{
+
+    private List<Feature> features = new ArrayList<>();
+    private LinkedMap<String, String> propertyToLabelMap = new LinkedMap<>();
+
+
+    public SpecimenColumnPropertyAccessor(WorkingSet workingSet) {
+        FeatureTree tree = workingSet.getDescriptiveSystem();
+        Set<Feature> distinctFeatures = tree.getDistinctFeatures();
+        for (Feature feature : distinctFeatures) {
+            if(feature!=null){
+                features.add(feature);
+                propertyToLabelMap.put(feature.getLabel(), feature.getLabel());
+            }
+        }
+    }
+
+    public Map<String, String> getPropertyToLabelMap() {
+        return propertyToLabelMap;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public DescriptionElementBase getDataValue(SpecimenDescription rowObject, int columnIndex) {
+        Feature feature = features.get(columnIndex);
+        Set<DescriptionElementBase> elements = rowObject.getElements();
+        for (DescriptionElementBase descriptionElementBase : elements) {
+            if(descriptionElementBase.getFeature().equals(feature)){
+                return descriptionElementBase;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setDataValue(SpecimenDescription rowObject, int columnIndex, Object newValue) {
+        features.remove(columnIndex);
+        features.add(columnIndex, (Feature) newValue);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int getColumnCount() {
+        return features.size();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getColumnProperty(int columnIndex) {
+        return features.get(columnIndex).getLabel();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int getColumnIndex(String propertyName){
+        return propertyToLabelMap.indexOf(propertyName);
+    }
+
+}
index b5763642a2d23c84effd1bdb91aee898184ec43d..1ebd2f56c998f8f6ebfe9297b55a09f6346a7432 100644 (file)
          version="0.0.0"
          unpack="false"/>
 
-   <plugin
-         id="org.eclipse.nebula.widgets.compositetable"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
    <plugin
          id="org.hamcrest.core"
          download-size="0"
          version="0.0.0"
          unpack="false"/>
 
+   <plugin
+         id="org.eclipse.nebula.widgets.nattable.core"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="ca.odell.glazedlists"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.nebula.widgets.nattable.extension.glazedlists"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
 </feature>
index 22a1a87b8c7247262bed438f45fffea7d700af82..9ab4129359e72115209a617ff0856ac692933291 100644 (file)
@@ -9,92 +9,25 @@
 */
 package eu.etaxonomy.taxeditor.navigation.navigator.e4;
 
-import java.util.List;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-
-import eu.etaxonomy.cdm.hibernate.HHH_9751_Util;
-import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
-import eu.etaxonomy.cdm.model.taxon.Classification;
-import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode;
-import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 import eu.etaxonomy.taxeditor.navigation.navigator.Root;
+import eu.etaxonomy.taxeditor.util.TaxonTreeNodeContentProvider;
 
 /**
  * @author pplitzner
  * @date 05.09.2017
  *
  */
-public class TaxonNavigatorContentProviderE4 implements ITreeContentProvider {
-
-    private static final Object[] NO_CHILDREN = new Object[0];
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Object[] getElements(Object inputElement) {
-        return this.getChildren(inputElement);
-    }
+public class TaxonNavigatorContentProviderE4 extends TaxonTreeNodeContentProvider {
 
     /**
      * {@inheritDoc}
      */
     @Override
     public Object[] getChildren(Object parentElement) {
-        Object[] children = null;
-
         if (parentElement instanceof Root) {
-            children = ((Root) parentElement).getParentBeans().toArray();
-        }else if(parentElement instanceof Classification){
-            children = ((Classification) parentElement).getChildNodes().toArray();
-        }
-        //FIXME E4 show synonym in navigator?
-//        //synonym
-//        if (parentElement instanceof Synonym) {
-//            children = NO_CHILDREN;
-//        } else if (parentElement instanceof TaxonNode) {
-//            List<TaxonBase> list = new ArrayList<TaxonBase>();
-//
-//            Taxon taxon = ((TaxonNode) parentElement).getTaxon();
-//
-//            for (TaxonBase taxonBase : new IterableSynonymyList(taxon)) {
-//                if (taxonBase instanceof Synonym) {
-//                    list.add(taxonBase);
-//                }
-//            }
-//            children = list.toArray();
-//        }
-        //taxon node
-        if(parentElement instanceof ITaxonTreeNode){
-            ITaxonTreeNode treeNode = (ITaxonTreeNode) HibernateProxyHelper.deproxy(parentElement);
-            List<TaxonNode> childrenSet = treeNode.getChildNodes();
-            HHH_9751_Util.removeAllNull(childrenSet);
-            children = childrenSet.toArray();
-        }
-        return children != null ? children : NO_CHILDREN;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Object getParent(Object element) {
-        if(element instanceof TaxonNode){
-            return ((TaxonNode) element).getParent();
-        }
-        return null;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean hasChildren(Object element) {
-        if(element instanceof TaxonNode){
-            return ((TaxonNode) element).getCountChildren() > 0;
+            return ((Root) parentElement).getParentBeans().toArray();
         }
-        return this.getChildren(element).length > 0;
+        return super.getChildren(parentElement);
     }
 
 }
index ef2d23f8770b7fc9aa767e7c4134cd973a88a33d..abb80d2ad922ae69e4fd3648ea0c0fc46e0217c8 100644 (file)
@@ -9,76 +9,34 @@
  */
 package eu.etaxonomy.taxeditor.navigation.navigator.e4;
 
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
 import org.eclipse.jface.viewers.StyledString;
-import org.eclipse.jface.viewers.StyledString.Styler;
-import org.eclipse.swt.graphics.TextStyle;
 import org.eclipse.ui.navigator.IDescriptionProvider;
-import org.hibernate.LazyInitializationException;
 
-import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
-import eu.etaxonomy.cdm.model.common.CdmBase;
-import eu.etaxonomy.cdm.model.common.IIdentifiableEntity;
 import eu.etaxonomy.cdm.model.taxon.Classification;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
-import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.navigation.l10n.Messages;
-import eu.etaxonomy.taxeditor.preference.Resources;
-import eu.etaxonomy.taxeditor.security.RequiredPermissions;
-import eu.etaxonomy.taxeditor.store.CdmStore;
-import eu.etaxonomy.taxeditor.store.StoreUtil;
+import eu.etaxonomy.taxeditor.util.TaxonTreeNodeLabelProvider;
 
 /**
  * @author pplitzner
  * @date 05.09.2017
  *
  */
-public class TaxonNavigatorLabelProviderE4 extends ColumnLabelProvider
-implements IDescriptionProvider, IStyledLabelProvider {
-
-    private Styler notGrantedStyler = null;
+public class TaxonNavigatorLabelProviderE4 extends TaxonTreeNodeLabelProvider
+implements IDescriptionProvider {
 
     /**
      * {@inheritDoc}
      */
     @Override
     public String getText(Object element) {
-        //classification
-        if(element instanceof Classification){
-            String text = ((Classification) element).getName().getText();
-            return text != null ? text : Messages.ClassificationLabelProvider_UNNAMED_TREE;
-        }
+        return super.getText(element);
         //FIXME E4 show synonym in navigator?
         //synonym
 //        else if (element instanceof Synonym && ((Synonym) element).getName()!=null) {
 //            return "= " + ((Synonym) element).getName().getTitleCache(); //$NON-NLS-1$
 //        }
-        //taxon node
-        else if (element instanceof TaxonNode){
-            TaxonNode taxonNode = (TaxonNode) HibernateProxyHelper.deproxy(element);
-
-            try{
-                Taxon taxon = HibernateProxyHelper.deproxy(taxonNode.getTaxon());
-                if(taxon == null){
-                    String text = taxonNode.getClassification().getName() == null ? null : taxonNode.getClassification().getName().getText();
-                    if(text==null){
-                        text = taxonNode.getClassification().getTitleCache();
-                    }
-                    return text;
-                }else{
-                    try{
-                        return taxon.getName() != null ? ((IIdentifiableEntity) HibernateProxyHelper.deproxy(taxon.getName())).getTitleCache() : new String();
-                    }catch(Exception e){
-                        MessagingUtils.error(getClass(), e);
-                    }
-                }
-            }catch (LazyInitializationException e){
-                MessagingUtils.error(getClass(), e);
-            }
-        }
-        return new String();
     }
 
     /**
@@ -110,37 +68,12 @@ implements IDescriptionProvider, IStyledLabelProvider {
      */
     @Override
     public StyledString getStyledText(Object element) {
-        //classification
-        if(element instanceof Classification){
-            return new StyledString(getText(element), StyledString.DECORATIONS_STYLER);
-        }
+        return super.getStyledText(element);
         //FIXME E4 show synonym in navigator?
         //synonym
 //        else if(element instanceof Synonym){
 //            return new StyledString(getText(element), StyledString.QUALIFIER_STYLER);
 //        }
-        //taxon node
-        else if(element instanceof TaxonNode){
-            // determine style base on  user grants
-            Styler styler = null;
-            if(!CdmStore.currentAuthentiationHasPermission((CdmBase) element, RequiredPermissions.TAXONNODE_EDIT)){
-                styler = getNotGrantedStyler();
-            }
-            return new StyledString(getText(element), styler);
-        }
-        return new StyledString(getText(element));
     }
 
-    private Styler getNotGrantedStyler() {
-        if (notGrantedStyler  == null) {
-            notGrantedStyler = new Styler() {
-                @Override
-                public void applyStyles(TextStyle textStyle) {
-                    textStyle.underline = false;
-                    textStyle.foreground = StoreUtil.getColor(Resources.COLOR_TEXT_DISABLED);
-                }
-            };
-        }
-        return notGrantedStyler;
-    }
 }
index be610a1651dc25c4746befbba35e1b40160745b4..ceeab227d2ce4673e07c6094859eec63fbc29ca1 100644 (file)
@@ -16,12 +16,15 @@ import org.eclipse.swt.dnd.DragSourceListener;
 import org.eclipse.swt.dnd.DropTargetListener;
 import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.swt.widgets.Tree;
 
@@ -32,6 +35,7 @@ import eu.etaxonomy.taxeditor.featuretree.FeatureTreeContentProvider;
 import eu.etaxonomy.taxeditor.featuretree.FeatureTreeLabelProvider;
 import eu.etaxonomy.taxeditor.l10n.Messages;
 import eu.etaxonomy.taxeditor.model.ImageResources;
+import eu.etaxonomy.taxeditor.ui.dialog.selection.FeatureTreeSelectionDialog;
 
 /**
  * @author pplitzner
@@ -94,9 +98,26 @@ public class FeatureTreeEditorComposite extends Composite{
             viewer.addDropSupport(ops, transfers, dropTargetListener);
         }
 
-        viewer.addSelectionChangedListener(viewerSelectionChangedListener);
+        if(viewerSelectionChangedListener!=null){
+            viewer.addSelectionChangedListener(viewerSelectionChangedListener);
+        }
 
-        btnOpenFeatureTree.addSelectionListener(openFeatureTreeSelectionListener);
+        //add specific selection listener
+        if(openFeatureTreeSelectionListener!=null){
+            btnOpenFeatureTree.addSelectionListener(openFeatureTreeSelectionListener);
+        }
+        //add default selection listener
+        btnOpenFeatureTree.addSelectionListener(new SelectionAdapter(){
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                FeatureTree tree = FeatureTreeSelectionDialog.select(getDisplay().getActiveShell(),
+                        null);
+                if(tree!=null){
+                    setSelectedTree(tree, null);
+                    getText_title().setEnabled(false);
+                }
+            }
+        });
     }
 
     public void setSelectedTree(FeatureTree featureTree, ModifyListener modifyListener) {
@@ -104,9 +125,14 @@ public class FeatureTreeEditorComposite extends Composite{
 
         getViewer().setInput(featureTree);
 
-        getText_title().removeModifyListener(modifyListener);
+        Listener[] listeners = getText_title().getListeners(SWT.Modify);
+        for (Listener listener : listeners) {
+            getText_title().removeListener(SWT.Modify, listener);
+        }
         getText_title().setText(featureTree.getTitleCache());
-        getText_title().addModifyListener(modifyListener);
+        for (Listener listener : listeners) {
+            getText_title().addListener(SWT.Modify, listener);
+        }
         getText_title().setEnabled(true);
         text_title.setEnabled(true);
     }
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/combo/TermUuidComboViewer.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/combo/TermUuidComboViewer.java
new file mode 100644 (file)
index 0000000..6966203
--- /dev/null
@@ -0,0 +1,54 @@
+/**
+* Copyright (C) 2017 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.ui.combo;
+
+import org.eclipse.jface.viewers.ComboViewer;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+
+import eu.etaxonomy.cdm.model.common.DefinedTermBase;
+
+/**
+ * @author pplitzner
+ * @since Nov 24, 2017
+ *
+ */
+public class TermUuidComboViewer extends Composite{
+
+    private ComboViewer viewer;
+
+    public TermUuidComboViewer(Composite parent, int style){
+        super(parent, style);
+        setLayout(new FillLayout());
+        viewer = new ComboViewer(new CCombo(this, SWT.READ_ONLY | SWT.SINGLE));
+        viewer.setContentProvider(new TermUuidContentProvider());
+        viewer.setLabelProvider(new TermUuidLabelProvider());
+    }
+
+    public void setInput(Object input){
+        viewer.setInput(input);
+    }
+
+    public DefinedTermBase getSelection(){
+        IStructuredSelection structuredSelection = viewer.getStructuredSelection();
+        if(structuredSelection!=null && !structuredSelection.isEmpty()){
+            return (DefinedTermBase) structuredSelection.getFirstElement();
+        }
+        return null;
+    }
+
+    public void setTerm(DefinedTermBase term){
+        int index = viewer.getCCombo().indexOf(term.getLabel());
+        viewer.getCCombo().select(index);
+    }
+
+}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/combo/TermUuidContentProvider.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/combo/TermUuidContentProvider.java
new file mode 100644 (file)
index 0000000..124c768
--- /dev/null
@@ -0,0 +1,36 @@
+/**
+* Copyright (C) 2017 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.ui.combo;
+
+import java.util.List;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+
+import eu.etaxonomy.cdm.api.service.ITermService;
+import eu.etaxonomy.cdm.model.common.DefinedTermBase;
+import eu.etaxonomy.cdm.model.common.TermType;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+
+/**
+ * @author pplitzner
+ * @since Nov 24, 2017
+ *
+ */
+public class TermUuidContentProvider implements IStructuredContentProvider {
+
+    @Override
+    public Object[] getElements(Object inputElement) {
+        if(inputElement instanceof TermType){
+            List<DefinedTermBase> terms = CdmStore.getService(ITermService.class).listByTermType((TermType) inputElement, null, null, null, null);
+            return terms.toArray();
+        }
+        return null;
+    }
+
+}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/combo/TermUuidLabelProvider.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/combo/TermUuidLabelProvider.java
new file mode 100644 (file)
index 0000000..7510fd3
--- /dev/null
@@ -0,0 +1,33 @@
+/**
+* Copyright (C) 2017 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.ui.combo;
+
+import org.eclipse.jface.viewers.LabelProvider;
+
+import eu.etaxonomy.cdm.model.common.DefinedTerm;
+
+/**
+ * @author pplitzner
+ * @since Nov 24, 2017
+ *
+ */
+public class TermUuidLabelProvider extends LabelProvider {
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getText(Object element) {
+        if(element instanceof DefinedTerm){
+            return ((DefinedTerm) element).getLabel();
+        }
+        return super.getText(element);
+    }
+
+}
index cd536fff3ad1826064813988518411e0af2ddd61..8aff91fac590546e2332dbd34650254bf68014ae 100644 (file)
@@ -13,6 +13,11 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
 
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.widgets.Shell;
 
 import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
@@ -67,32 +72,24 @@ public class FeatureTreeSelectionDialog extends
 
        }
 
-//     /** {@inheritDoc} */
-//     @Override
-//     protected Control createExtendedContentArea(Composite parent) {
-//             Link link = new Link(parent, SWT.NONE);
-//             link.setText(getNewWizardLinkText());
-//             link.addListener (SWT.Selection, new Listener () {
-//                     @Override
-//            public void handleEvent(Event event) {
-//
-//                         InputDialog input = new InputDialog(getShell(), "New feature tree", "Enter label for new feature tree", null, null);
-//                             int status = input.open();
-//                             if (status == IStatus.OK) {
-//                                 String label = input.getValue();
-//                                 if(label!=null){
-//                                     FeatureTree featureTree = FeatureTree.NewInstance();
-//                                     featureTree.setTitleCache(label, false);
-//                                     CdmStore.getService(IFeatureTreeService.class).save(featureTree);
-//                                 UuidAndTitleCache<FeatureTree> uuidAndTitleCache = new UuidAndTitleCache<FeatureTree>(FeatureTree.class, featureTree.getUuid(),featureTree.getId(), featureTree.getTitleCache());
-//                                 model.add(uuidAndTitleCache);
-//                                 setPattern(featureTree);
-//                                 }
-//                             }
-//                     }
-//             });
-//             return link;
-//     }
+       @Override
+    protected SelectionListener getNewWizardButtonSelectionListener(){
+        return new SelectionAdapter() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                InputDialog dialog = new InputDialog(getShell(), "Feature tree label", "Enter label for feature tree", null, null);
+                if (dialog.open() == Window.OK) {
+                    // User clicked OK; update the label with the input
+                    FeatureTree tree = FeatureTree.NewInstance();
+                    CdmStore.getService(IFeatureTreeService.class).merge(tree,true);
+                    tree.setTitleCache(dialog.getValue(), true);
+                    refresh();
+                    setPattern(tree);
+                  }
+            }
+        };
+    }
 
        /** {@inheritDoc} */
        @Override
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/selection/WorkingSetSelectionDialog.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/selection/WorkingSetSelectionDialog.java
new file mode 100644 (file)
index 0000000..edf110b
--- /dev/null
@@ -0,0 +1,125 @@
+/**
+ * Copyright (C) 2014 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.ui.dialog.selection;
+
+import java.util.UUID;
+
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+import eu.etaxonomy.cdm.api.service.IWorkingSetService;
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
+import eu.etaxonomy.cdm.model.description.WorkingSet;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
+import eu.etaxonomy.taxeditor.newWizard.AbstractNewEntityWizard;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+
+/**
+ * @author pplitzner
+ * @date 11.03.2014
+ *
+ */
+public class WorkingSetSelectionDialog extends
+AbstractFilteredCdmResourceSelectionDialog<WorkingSet> {
+
+    public static WorkingSet select(Shell shell, WorkingSet workingSet){
+        WorkingSetSelectionDialog dialog = new WorkingSetSelectionDialog(shell,
+                "Choose working set", false, WorkingSetSelectionDialog.class.getCanonicalName(), workingSet);
+        return getSelectionFromDialog(dialog);
+    }
+
+    /**
+     * <p>Constructor for FilteredDerivedUnitSelectionDialog.</p>
+     */
+    protected WorkingSetSelectionDialog(Shell shell, String title,
+            boolean multi, String settings, WorkingSet cdmObject) {
+        super(shell, title, multi, settings, cdmObject);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected WorkingSet getPersistentObject(UUID uuid) {
+        Object object = CdmStore.getService(IWorkingSetService.class).load(uuid);
+
+        WorkingSet workingSet = (WorkingSet) HibernateProxyHelper.deproxy(object);
+
+        if(workingSet != null){
+            return workingSet;
+        }
+        MessagingUtils.error(this.getClass(), "Selected element is not a working set", null);
+        return null;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected void search() {
+        Control control =getSearchField();
+        String pattern = null;
+        if (control != null){
+            pattern = ((Text)control).getText();
+        }
+
+        if (pattern == null || pattern.equals("?")){
+            model = CdmStore.getService(IWorkingSetService.class).getUuidAndTitleCache(null, null);
+        }else{
+            model = CdmStore.getService(IWorkingSetService.class).getUuidAndTitleCache(limitOfInitialElements, pattern);
+        }
+    }
+
+    @Override
+    protected String getTitle(WorkingSet cdmObject) {
+        if(cdmObject!=null){
+            return cdmObject.getLabel();
+        }
+        return super.getTitle(cdmObject);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected AbstractNewEntityWizard getNewEntityWizard(String parameter) {
+        return null;
+    }
+
+    @Override
+    protected SelectionListener getNewWizardButtonSelectionListener(){
+        return new SelectionAdapter() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                Object source = e.getSource();
+                if (source instanceof Button){
+                    Button sourceButton = (Button) source;
+                }
+                InputDialog dialog = new InputDialog(getShell(), "Working set label", "Enter label for working set", null, null);
+                if (dialog.open() == Window.OK) {
+                    // User clicked OK; update the label with the input
+                    WorkingSet workingSet = WorkingSet.NewInstance();
+                    CdmStore.getService(IWorkingSetService.class).merge(workingSet,true);
+                    workingSet.setLabel(dialog.getValue());
+                    workingSet.setTitleCache(dialog.getValue(), true);
+                    refresh();
+                    setPattern(workingSet);
+                  }
+            }
+        };
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected String[] getNewWizardText() {
+        return new String[]{"Working set "};
+    }
+}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/util/TaxonTreeNodeContentProvider.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/util/TaxonTreeNodeContentProvider.java
new file mode 100644 (file)
index 0000000..050cb95
--- /dev/null
@@ -0,0 +1,85 @@
+// $Id$
+/**
+* Copyright (C) 2017 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.util;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ITreeContentProvider;
+
+import eu.etaxonomy.cdm.hibernate.HHH_9751_Util;
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
+import eu.etaxonomy.cdm.model.taxon.Classification;
+import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode;
+import eu.etaxonomy.cdm.model.taxon.TaxonNode;
+
+/**
+ * @author pplitzner
+ * @date 05.09.2017
+ *
+ */
+public class TaxonTreeNodeContentProvider implements ITreeContentProvider {
+
+    private static final Object[] NO_CHILDREN = new Object[0];
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Object[] getElements(Object inputElement) {
+        if(inputElement instanceof Collection){
+            return ((Collection) inputElement).toArray();
+        }
+        return this.getChildren(inputElement);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Object[] getChildren(Object parentElement) {
+        Object[] children = null;
+
+        if(parentElement instanceof Classification){
+            children = ((Classification) parentElement).getChildNodes().toArray();
+        }
+        //taxon node
+        if(parentElement instanceof ITaxonTreeNode){
+            ITaxonTreeNode treeNode = (ITaxonTreeNode) HibernateProxyHelper.deproxy(parentElement);
+            List<TaxonNode> childrenSet = treeNode.getChildNodes();
+            HHH_9751_Util.removeAllNull(childrenSet);
+            children = childrenSet.toArray();
+        }
+        return children != null ? children : NO_CHILDREN;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Object getParent(Object element) {
+        if(element instanceof TaxonNode){
+            return ((TaxonNode) element).getParent();
+        }
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean hasChildren(Object element) {
+        if(element instanceof TaxonNode){
+            return ((TaxonNode) element).getCountChildren() > 0;
+        }
+        return this.getChildren(element).length > 0;
+    }
+
+}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/util/TaxonTreeNodeLabelProvider.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/util/TaxonTreeNodeLabelProvider.java
new file mode 100644 (file)
index 0000000..8088c57
--- /dev/null
@@ -0,0 +1,110 @@
+// $Id$
+/**
+ * Copyright (C) 2017 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.util;
+
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.jface.viewers.StyledString.Styler;
+import org.eclipse.swt.graphics.TextStyle;
+import org.hibernate.LazyInitializationException;
+
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
+import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.IIdentifiableEntity;
+import eu.etaxonomy.cdm.model.taxon.Classification;
+import eu.etaxonomy.cdm.model.taxon.Taxon;
+import eu.etaxonomy.cdm.model.taxon.TaxonNode;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
+import eu.etaxonomy.taxeditor.preference.Resources;
+import eu.etaxonomy.taxeditor.security.RequiredPermissions;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.taxeditor.store.StoreUtil;
+
+/**
+ * @author pplitzner
+ * @date 05.09.2017
+ *
+ */
+public class TaxonTreeNodeLabelProvider extends ColumnLabelProvider
+implements IStyledLabelProvider {
+
+    private Styler notGrantedStyler = null;
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getText(Object element) {
+        //classification
+        if(element instanceof Classification){
+            String text = ((Classification) element).getName().getText();
+            return text != null ? text : "Unnamed Taxonomic Tree";
+        }
+        //taxon node
+        else if (element instanceof TaxonNode){
+            TaxonNode taxonNode = (TaxonNode) HibernateProxyHelper.deproxy(element);
+
+            try{
+                Taxon taxon = HibernateProxyHelper.deproxy(taxonNode.getTaxon());
+                if(taxon == null){
+                    String text = taxonNode.getClassification().getName() == null ? null : taxonNode.getClassification().getName().getText();
+                    if(text==null){
+                        text = taxonNode.getClassification().getTitleCache();
+                    }
+                    return text;
+                }else{
+                    try{
+                        return taxon.getName() != null ? ((IIdentifiableEntity) HibernateProxyHelper.deproxy(taxon.getName())).getTitleCache() : new String();
+                    }catch(Exception e){
+                        MessagingUtils.error(getClass(), e);
+                    }
+                }
+            }catch (LazyInitializationException e){
+                MessagingUtils.error(getClass(), e);
+            }
+        }
+        return new String();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public StyledString getStyledText(Object element) {
+        //classification
+        if(element instanceof Classification){
+            return new StyledString(getText(element), StyledString.DECORATIONS_STYLER);
+        }
+        //taxon node
+        else if(element instanceof TaxonNode){
+            // determine style base on  user grants
+            Styler styler = null;
+            if(!CdmStore.currentAuthentiationHasPermission((CdmBase) element, RequiredPermissions.TAXONNODE_EDIT)){
+                styler = getNotGrantedStyler();
+            }
+            return new StyledString(getText(element), styler);
+        }
+        return new StyledString(getText(element));
+    }
+
+    private Styler getNotGrantedStyler() {
+        if (notGrantedStyler  == null) {
+            notGrantedStyler = new Styler() {
+                @Override
+                public void applyStyles(TextStyle textStyle) {
+                    textStyle.underline = false;
+                    textStyle.foreground = StoreUtil.getColor(Resources.COLOR_TEXT_DISABLED);
+                }
+            };
+        }
+        return notGrantedStyler;
+    }
+}
index 5330adfcfcbcaac1b9e71886a763d5b3a206781c..0e7ba33a9ee4095897b6c4367b15e7ed0c97935e 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?pde version="3.8"?><target includeMode="feature" name="Eclipse Neon Target" sequenceNumber="43">
+<?pde version="3.8"?><target includeMode="feature" name="Eclipse Neon Target" sequenceNumber="45">
 <locations>
 <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="org.eclipse.equinox.sdk.feature.group" version="3.12.0.v20170209-1843"/>
 <unit id="org.eclipse.oomph.setup.sdk.feature.group" version="1.7.0.v20170305-1123"/>
 <repository location="http://download.eclipse.org/releases/neon"/>
 </location>
+<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
+<unit id="org.eclipse.nebula.widgets.nattable.extension.glazedlists.feature.feature.group" version="1.5.0.201703192131"/>
+<unit id="org.eclipse.nebula.widgets.nattable.extension.nebula.source.feature.feature.group" version="1.1.0.201703192131"/>
+<unit id="org.eclipse.nebula.widgets.nattable.core.feature.feature.group" version="1.5.0.201703192131"/>
+<unit id="org.eclipse.nebula.widgets.nattable.core.source.feature.feature.group" version="1.5.0.201703192131"/>
+<unit id="org.eclipse.nebula.widgets.nattable.extension.poi.feature.feature.group" version="1.5.0.201703192131"/>
+<unit id="org.eclipse.nebula.widgets.nattable.extension.nebula.feature.feature.group" version="1.1.0.201703192131"/>
+<unit id="org.eclipse.nebula.widgets.nattable.extension.e4.source.feature.feature.group" version="1.1.0.201703192131"/>
+<unit id="org.eclipse.nebula.widgets.nattable.extension.e4.feature.feature.group" version="1.1.0.201703192131"/>
+<unit id="org.eclipse.nebula.widgets.nattable.extension.poi.source.feature.feature.group" version="1.5.0.201703192131"/>
+<unit id="org.eclipse.nebula.widgets.nattable.extension.glazedlists.source.feature.feature.group" version="1.5.0.201703192131"/>
+<repository location="http://download.eclipse.org/nattable/releases/1.5.0/repository/"/>
+</location>
 </locations>
 <includeBundles>
 <feature id="org.eclipse.core.runtime.feature"/>
 <feature id="org.eclipse.help.source"/>
 <feature id="org.eclipse.jdt"/>
 <feature id="org.eclipse.jdt.source"/>
-<feature id="org.eclipse.nebula.widgets.compositetable.feature"/>
+<feature id="org.eclipse.nebula.widgets.nattable.core.feature"/>
+<feature id="org.eclipse.nebula.widgets.nattable.core.source.feature"/>
+<feature id="org.eclipse.nebula.widgets.nattable.extension.e4.feature"/>
+<feature id="org.eclipse.nebula.widgets.nattable.extension.e4.source.feature"/>
+<feature id="org.eclipse.nebula.widgets.nattable.extension.glazedlists.feature"/>
+<feature id="org.eclipse.nebula.widgets.nattable.extension.glazedlists.source.feature"/>
+<feature id="org.eclipse.nebula.widgets.nattable.extension.nebula.feature"/>
+<feature id="org.eclipse.nebula.widgets.nattable.extension.nebula.source.feature"/>
+<feature id="org.eclipse.nebula.widgets.nattable.extension.poi.feature"/>
+<feature id="org.eclipse.nebula.widgets.nattable.extension.poi.source.feature"/>
 <feature id="org.eclipse.objectteams.otequinox"/>
 <feature id="org.eclipse.oomph.p2"/>
 <feature id="org.eclipse.oomph.setup"/>