commit 4e514541a392a5ef4b338956d1f2174c692e0e82
Author: Patrick Plitzner
Date: Fri Oct 26 16:08:05 2018 +0200
ref #7875 first implementation of multiple area select (experimental)
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/DescriptiveDataSetComposite.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/DescriptiveDataSetComposite.java
index 58810580c..8c7169f02 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/DescriptiveDataSetComposite.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/DescriptiveDataSetComposite.java
@@ -8,6 +8,10 @@
*/
package eu.etaxonomy.taxeditor.editor.descriptiveDataSet;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.lang.StringUtils;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
@@ -40,7 +44,7 @@ public class DescriptiveDataSetComposite extends Composite {
private TermUuidComboViewer comboRankMax;
private FeatureTreeEditorComposite featureTreeEditorComposite;
private TreeViewer taxonNodeTree;
- private NamedArea area;
+ private Set areas = new HashSet<>();
private Text textAreaText;
private Button btnChooseArea;
private Button btnRemoveArea;
@@ -173,16 +177,15 @@ public class DescriptiveDataSetComposite extends Composite {
public TreeViewer getTaxonNodeTree() {
return taxonNodeTree;
}
-
- public NamedArea getArea(){
- return area;
+ public Set getAreas() {
+ return areas;
}
- public void setArea(NamedArea area) {
- this.area = area;
- textAreaText.setText(area.getLabel());
+ public void setAreas(Set areas) {
+ this.areas = areas;
+ textAreaText.setText(StringUtils.join(areas, ", "));
}
public void removeArea() {
- this.area = null;
+ this.areas = null;
textAreaText.setText(""); //$NON-NLS-1$
}
public Button getBtnChooseArea() {
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/DescriptiveDataSetEditor.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/DescriptiveDataSetEditor.java
index ea1567ec1..036796f0c 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/DescriptiveDataSetEditor.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/DescriptiveDataSetEditor.java
@@ -9,6 +9,7 @@
package eu.etaxonomy.taxeditor.editor.descriptiveDataSet;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
@@ -32,9 +33,11 @@ import org.eclipse.e4.ui.model.application.ui.MDirtyable;
import org.eclipse.e4.ui.services.EMenuService;
import org.eclipse.e4.ui.services.IServiceConstants;
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
+import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StyledString.Styler;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
@@ -46,7 +49,9 @@ import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.graphics.TextStyle;
import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
@@ -55,7 +60,10 @@ import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
import eu.etaxonomy.cdm.api.service.IDescriptiveDataSetService;
import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
import eu.etaxonomy.cdm.api.service.ITermService;
+import eu.etaxonomy.cdm.api.service.IVocabularyService;
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
+import eu.etaxonomy.cdm.model.common.TermType;
+import eu.etaxonomy.cdm.model.common.TermVocabulary;
import eu.etaxonomy.cdm.model.description.DescriptiveDataSet;
import eu.etaxonomy.cdm.model.description.FeatureTree;
import eu.etaxonomy.cdm.model.location.NamedArea;
@@ -69,10 +77,12 @@ import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
import eu.etaxonomy.taxeditor.model.MessagingUtils;
+import eu.etaxonomy.taxeditor.preference.wizard.AreaLabelProvider;
+import eu.etaxonomy.taxeditor.preference.wizard.CheckBoxTreeComposite;
+import eu.etaxonomy.taxeditor.preference.wizard.DistributionContentProvider;
import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
import eu.etaxonomy.taxeditor.store.CdmStore;
-import eu.etaxonomy.taxeditor.ui.dialog.selection.NamedAreaSelectionDialog;
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
@@ -152,11 +162,13 @@ IPartContentHasDetails, IPartContentHasSupplementalData, IDirtyMarkable {
@Override
public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
- NamedArea area = NamedAreaSelectionDialog.select(shell, null, null);
- if(area!=null){
- composite.setArea(area);
+ AreasSelectionDialog areasSelectionDialog = new AreasSelectionDialog(composite.getShell(), composite.getAreas());
+ areasSelectionDialog.open();
+ Set selectedAreas = areasSelectionDialog.getSelectedAreas();
+ if(selectedAreas!=null){
+ composite.setAreas(selectedAreas);
+ dirty.setDirty(true);
}
- dirty.setDirty(true);
}
});
composite.getBtnRemoveArea().addSelectionListener(new SelectionAdapter() {
@@ -207,7 +219,7 @@ IPartContentHasDetails, IPartContentHasSupplementalData, IDirtyMarkable {
}
Set geoFilter = descriptiveDataSet.getGeoFilter();
if(geoFilter!=null && !geoFilter.isEmpty()){
- composite.setArea(geoFilter.iterator().next());
+ composite.setAreas(geoFilter);
}
Set taxonSubtreeFilter = descriptiveDataSet.getTaxonSubtreeFilter();
if(taxonSubtreeFilter!=null){
@@ -271,11 +283,7 @@ IPartContentHasDetails, IPartContentHasSupplementalData, IDirtyMarkable {
@Persist
@Override
public void save(IProgressMonitor monitor) {
- NamedArea area = composite.getArea();
- Set areas = new HashSet<>();
- if(area!=null){
- areas.add(area);
- }
+ Set areas = composite.getAreas();
Object input = composite.getTaxonNodeTree().getInput();
if(input!=null){
descriptiveDataSet.setTaxonSubtreeFilter(new HashSet<>());//clear existing filter
@@ -384,4 +392,55 @@ IPartContentHasDetails, IPartContentHasSupplementalData, IDirtyMarkable {
dirty.setDirty(true);
}
+ private class AreasSelectionDialog extends Dialog{
+
+ private CheckBoxTreeComposite treeComposite;
+
+ private Set selectedAreas = new HashSet<>();
+
+ private Collection> namedAreas;
+
+
+ protected AreasSelectionDialog(Shell parentShell, Set selectedAreas) {
+ super(parentShell);
+ this.selectedAreas = selectedAreas;
+ this.namedAreas = CdmStore.getService(IVocabularyService.class).findByTermType(TermType.NamedArea, null);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Styler styler = new Styler() {
+ @Override
+ public void applyStyles(TextStyle textStyle) {
+ textStyle.foreground = Display.getCurrent().getSystemColor(SWT.COLOR_BLACK);
+ }
+ };
+ treeComposite = new CheckBoxTreeComposite(parent, new DistributionContentProvider(), new AreaLabelProvider(styler), SWT.NONE);
+ treeComposite.getViewer().setInput(namedAreas);
+ treeComposite.getViewer().setCheckedElements(selectedAreas.toArray());
+ return treeComposite;
+ }
+
+ @Override
+ protected void configureShell(Shell newShell) {
+ super.configureShell(newShell);
+ newShell.setText("Choose areas");
+ }
+
+ @Override
+ protected void okPressed() {
+ selectedAreas.clear();
+ selectedAreas = new HashSet(Arrays.asList(treeComposite.getViewer().getCheckedElements()));
+ super.okPressed();
+ }
+
+ @Override
+ protected boolean isResizable() {
+ return true;
+ }
+
+ public Set getSelectedAreas(){
+ return selectedAreas;
+ }
+ }
}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/wizard/CheckBoxTreeComposite.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/wizard/CheckBoxTreeComposite.java
new file mode 100644
index 000000000..1c0d9ed5f
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/wizard/CheckBoxTreeComposite.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright (C) 2018 EDIT
+ * European Distributed Institute of Taxonomy
+ * http://www.e-taxonomy.eu
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * See LICENSE.TXT at the top of this package for the full license terms.
+ */
+package eu.etaxonomy.taxeditor.preference.wizard;
+
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.jface.viewers.IContentProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author pplitzner
+ * @since Oct 26, 2018
+ *
+ */
+public class CheckBoxTreeComposite extends Composite {
+
+ private CheckboxTreeViewer viewer;
+
+ public CheckBoxTreeComposite(Composite parent, IContentProvider contentProvider, IBaseLabelProvider labelProvider, int style) {
+ super(parent, style);
+ Composite composite = new Composite(parent, SWT.NULL);
+ composite.setLayout(new GridLayout());
+ Tree tree = new Tree(parent, SWT.BORDER | SWT.CHECK);
+ tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ tree.addListener(SWT.Selection, event -> {
+ if (event.detail == SWT.CHECK) {
+ TreeItem item = (TreeItem) event.item;
+ boolean checked = item.getChecked();
+ checkItems(item, checked);
+ checkPath(item.getParentItem(), checked, false);
+ }
+ });
+ viewer = new CheckboxTreeViewer(tree);
+ viewer.setContentProvider(contentProvider);
+ viewer.setLabelProvider(labelProvider);
+
+ }
+
+ private void checkPath(TreeItem item, boolean checked, boolean grayed) {
+ if (item == null) {
+ return;
+ }
+ if (grayed) {
+ checked = true;
+ } else {
+ int index = 0;
+ TreeItem[] items = item.getItems();
+ while (index < items.length) {
+ TreeItem child = items[index];
+ if (child.getGrayed() || checked != child.getChecked()) {
+ checked = grayed = true;
+ break;
+ }
+ index++;
+ }
+ }
+ item.setChecked(checked);
+ item.setGrayed(grayed);
+ checkPath(item.getParentItem(), checked, grayed);
+ }
+
+ private void checkItems(TreeItem item, boolean checked) {
+ item.setGrayed(false);
+ item.setChecked(checked);
+ TreeItem[] items = item.getItems();
+ for (int i = 0; i < items.length; i++) {
+ checkItems(items[i], checked);
+ }
+ }
+
+ public CheckboxTreeViewer getViewer() {
+ return viewer;
+ }
+
+}