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,
<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"/>
--- /dev/null
+/**
+ * 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());
+ }
+}
--- /dev/null
+/**
+* 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;
+ }
+ }
+
+}
* 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;
* 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;
* 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;
--- /dev/null
+
+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
--- /dev/null
+
+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
--- /dev/null
+/**
+* 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);
+ }
+
+}
--- /dev/null
+/**
+* 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;
+ }
+
+}
--- /dev/null
+/**
+* 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;
+ }
+
+
+}
--- /dev/null
+/**
+* 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);
+ }
+
+}
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>
*/
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);
}
}
*/
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();
}
/**
*/
@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;
- }
}
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;
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
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) {
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);
}
--- /dev/null
+/**
+* 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);
+ }
+
+}
--- /dev/null
+/**
+* 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;
+ }
+
+}
--- /dev/null
+/**
+* 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);
+ }
+
+}
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;
}
-// /** {@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
--- /dev/null
+/**
+ * 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 "};
+ }
+}
--- /dev/null
+// $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;
+ }
+
+}
--- /dev/null
+// $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;
+ }
+}
<?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"/>