Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPierre Guilet2018-07-09 12:35:14 +0000
committerPierre Guilet2018-08-09 13:35:07 +0000
commit254f806c763563051ced8e39ae9defd1c9cb1d10 (patch)
tree18f6e69745440638b3c6e894243eaca3d285b571
parent3c77de0e6e1dd01a9887e6b8a6867e4857d49967 (diff)
downloadorg.eclipse.sirius-254f806c763563051ced8e39ae9defd1c9cb1d10.tar.gz
org.eclipse.sirius-254f806c763563051ced8e39ae9defd1c9cb1d10.tar.xz
org.eclipse.sirius-254f806c763563051ced8e39ae9defd1c9cb1d10.zip
[527109] Layer and filter visibility handling
In show/hide mode, when a double click is done on an invisible element that is not visible because some filter(s) are activated, then a confirm dialog is opened and asks user if he wants to continue by removing the filter. Also when the element is not visible because the layer showing it is not activated, then a confirm dialog is opened and asks user if he wants to continue by activating the layer. Bug: 527109 Change-Id: Idbbaedede002e90529b6bbdb07a1f42c6f8e842d Signed-off-by: Pierre Guilet <pierre.guilet@obeo.fr>
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/plugin.properties6
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/DoubleClickEditPolicy.java131
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/handler/ChangeFilterActivation.java92
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/handler/FilterUpdateTask.java123
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src/org/eclipse/sirius/diagram/ui/provider/Messages.java12
5 files changed, 265 insertions, 99 deletions
diff --git a/plugins/org.eclipse.sirius.diagram.ui/plugin.properties b/plugins/org.eclipse.sirius.diagram.ui/plugin.properties
index 6255a7169a..fd11ce1513 100644
--- a/plugins/org.eclipse.sirius.diagram.ui/plugin.properties
+++ b/plugins/org.eclipse.sirius.diagram.ui/plugin.properties
@@ -801,7 +801,7 @@ ChangeBendpointsOfEdgesCommand_mapGmfToDraw2dCommandLabel = Map GMF to Draw2D
ChangeBendpointsOfEdgesCommand_updateLabelsOffsetCmdLabel = Update offset of labels
ChangeBendpointsOfEdgesCommand_warningCommandResultMessage = The adaptation of edges according to shape move can not be done.
ChangeFilterActivation_activateFilter = Activate {0} filter
-ChangeFilterActivation_deactivateFilter = Dectivate {0} filter
+ChangeFilterActivation_deactivateFilter = Deactivate {0} filter
ChangeFilterActivation_label = hide or show filter
ChangeSynchronizedDagramStatusCommand_label = Change Synchronized status
ChildrenAdjustmentCommand_errorMsg = The adaptation of children location to shape move can not be done.
@@ -921,6 +921,10 @@ DistributeMenuAction_text = &Distribute
DistributeMenuAction_tooltip = Distribute selected shapes
DocumentationPropertySection_defaultLabel = Documentation:
DocumentationPropertySection_description = Use this field to save notes about this representation.
+DoubleClickEditPolicy_layerConfirmDialogTitle=Layer activation confirmation
+DoubleClickEditPolicy_layerConfirmDialogBody=Making visible this diagram element will activate the layer ''{0}''. Do you still want to make it visible?"
+DoubleClickEditPolicy_filterConfirmDialogTitle=Filter deactivation confirmation
+DoubleClickEditPolicy_filterConfirmDialogBody=Making visible this diagram element will deactivate the filter(s) ''{0}''. Do you still want to make it visible?"
EclipseImageSelectorDescriptor_extensionLoadingError = Error while loading the extension {0}
EdgeGroupMoveMessage = Move edge group
EdgeReconnectionHelper_invalidReconnectionKind = reconnectionKind must be ReconnectionKind.RECONNECT_SOURCE or ReconnectionKind.RECONNECT_TARGET
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/DoubleClickEditPolicy.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/DoubleClickEditPolicy.java
index cbceea465b..c13969e565 100644
--- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/DoubleClickEditPolicy.java
+++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/DoubleClickEditPolicy.java
@@ -10,11 +10,20 @@
*******************************************************************************/
package org.eclipse.sirius.diagram.ui.graphical.edit.policies;
+import java.text.MessageFormat;
+import java.util.Collection;
import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
import java.util.Set;
+import java.util.stream.Collectors;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.common.command.CompoundCommand;
+import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.emf.transaction.util.TransactionUtil;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.commands.Command;
@@ -22,18 +31,37 @@ import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editpolicies.OpenEditPolicy;
import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.sirius.business.api.session.Session;
+import org.eclipse.sirius.common.tools.api.util.EqualityHelper;
+import org.eclipse.sirius.diagram.AppliedCompositeFilters;
import org.eclipse.sirius.diagram.DDiagram;
import org.eclipse.sirius.diagram.DDiagramElement;
import org.eclipse.sirius.diagram.DEdge;
import org.eclipse.sirius.diagram.EdgeTarget;
+import org.eclipse.sirius.diagram.GraphicalFilter;
+import org.eclipse.sirius.diagram.business.api.componentization.DiagramMappingsManager;
+import org.eclipse.sirius.diagram.business.api.componentization.DiagramMappingsManagerRegistry;
import org.eclipse.sirius.diagram.business.api.query.DDiagramElementQuery;
+import org.eclipse.sirius.diagram.business.internal.metamodel.helper.LayerHelper;
+import org.eclipse.sirius.diagram.description.ContainerMapping;
import org.eclipse.sirius.diagram.description.DiagramElementMapping;
+import org.eclipse.sirius.diagram.description.EdgeMapping;
+import org.eclipse.sirius.diagram.description.Layer;
+import org.eclipse.sirius.diagram.description.NodeMapping;
+import org.eclipse.sirius.diagram.description.filter.CompositeFilterDescription;
+import org.eclipse.sirius.diagram.tools.api.command.ChangeLayerActivationCommand;
import org.eclipse.sirius.diagram.tools.api.command.IDiagramCommandFactory;
import org.eclipse.sirius.diagram.tools.api.command.IDiagramCommandFactoryProvider;
import org.eclipse.sirius.diagram.ui.internal.edit.parts.AbstractGeneratedDiagramNameEditPart;
import org.eclipse.sirius.diagram.ui.internal.edit.parts.DNodeListElementEditPart;
+import org.eclipse.sirius.diagram.ui.provider.Messages;
import org.eclipse.sirius.diagram.ui.tools.api.command.GMFCommandWrapper;
import org.eclipse.sirius.diagram.ui.tools.api.editor.DDiagramEditor;
+import org.eclipse.sirius.diagram.ui.tools.internal.handler.FilterUpdateTask;
+import org.eclipse.sirius.tools.api.command.DCommand;
+import org.eclipse.sirius.tools.api.command.SiriusCommand;
+import org.eclipse.swt.widgets.Display;
/**
* An edit policy which launch an action after double-clicking an edit part.
@@ -63,8 +91,8 @@ public class DoubleClickEditPolicy extends OpenEditPolicy {
DDiagramElementQuery query = new DDiagramElementQuery(ddiagramElement);
// CHECKSTYLE:OFF
if (query.canHideLabel()) {
- if (query.isLabelHidden()) {
- cmd = revealElement(ddiagramElement, emfCommandFactory, true);
+ if (query.isLabelHidden() || !ddiagramElement.isVisible()) {
+ cmd = revealElement(parentDiagram, ddiagramElement, emfCommandFactory, true);
} else {
cmd = hideElement(ddiagramElement, emfCommandFactory, true);
}
@@ -72,7 +100,7 @@ public class DoubleClickEditPolicy extends OpenEditPolicy {
// CHECKSTYLE:ON
} else {
if (!ddiagramElement.isVisible()) {
- cmd = revealElement(ddiagramElement, emfCommandFactory, false);
+ cmd = revealElement(parentDiagram, ddiagramElement, emfCommandFactory, false);
} else {
cmd = hideElement(ddiagramElement, emfCommandFactory, false);
}
@@ -125,8 +153,8 @@ public class DoubleClickEditPolicy extends OpenEditPolicy {
* true if we are hiding a label. False for any other element.
* @return the command doing the revelation.
*/
- private org.eclipse.emf.common.command.Command revealElement(final DDiagramElement ddiagramElement, final IDiagramCommandFactory emfCommandFactory, boolean hideLabel) {
- org.eclipse.emf.common.command.Command cmd;
+ private org.eclipse.emf.common.command.Command revealElement(DDiagram parentDiagram, final DDiagramElement ddiagramElement, final IDiagramCommandFactory emfCommandFactory, boolean hideLabel) {
+ CompoundCommand compoundCommand = new CompoundCommand();
Set<DDiagramElement> elementSet = new HashSet<>();
elementSet.add(ddiagramElement);
if (ddiagramElement instanceof DEdge) {
@@ -143,13 +171,100 @@ public class DoubleClickEditPolicy extends OpenEditPolicy {
} else {
addAllParentRecursively(elementSet, ddiagramElement);
}
+ org.eclipse.emf.common.command.Command cmd;
if (hideLabel) {
- cmd = emfCommandFactory.buildRevealLabelCommand(ddiagramElement);
+ compoundCommand.append(emfCommandFactory.buildRevealLabelCommand(ddiagramElement));
+ compoundCommand.append(emfCommandFactory.buildRevealElementsCommand(elementSet));
} else {
+ getCommandToDeactivateFiltersHidingElement(parentDiagram, compoundCommand, elementSet);
+ getCommandToActivateLayerIfNeeded(parentDiagram, ddiagramElement, compoundCommand);
+ compoundCommand.append(emfCommandFactory.buildRevealElementsCommand(elementSet));
+ }
+ return compoundCommand;
+
+ }
+
+ /**
+ * If no activated layer contains the mapping to make visible, then we search for the layer containing it and we
+ * create a command to activate it.
+ *
+ * @param parentDiagram
+ * @param ddiagramElement
+ * @param compoundCommand
+ */
+ private void getCommandToActivateLayerIfNeeded(DDiagram parentDiagram, final DDiagramElement ddiagramElement, CompoundCommand compoundCommand) {
+ Optional<Session> optionalSession = Session.of(parentDiagram);
+ optionalSession.ifPresent(session -> {
+ DiagramMappingsManager mappingManager = DiagramMappingsManagerRegistry.INSTANCE.getDiagramMappingsManager(session, parentDiagram);
+ if (mappingManager.getActiveParentLayers(ddiagramElement.getDiagramElementMapping()).size() <= 0) {
+ Layer layerToActivate = getLayerToActivate(parentDiagram, ddiagramElement, mappingManager);
+ if (layerToActivate != null) {
+ boolean confirm = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), Messages.DoubleClickEditPolicy_layerConfirmDialogTitle,
+ MessageFormat.format(Messages.DoubleClickEditPolicy_layerConfirmDialogBody, layerToActivate.getName()));
+ if (confirm) {
+ final TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(parentDiagram);
+ ChangeLayerActivationCommand changeLayerActivationCommand = new ChangeLayerActivationCommand(domain, parentDiagram, layerToActivate, new NullProgressMonitor());
+ compoundCommand.append(changeLayerActivationCommand);
+ }
+ }
+ }
+ });
+ }
+
+ private void getCommandToDeactivateFiltersHidingElement(DDiagram parentDiagram, CompoundCommand compoundCommand, Set<DDiagramElement> elementSet) {
+ Set<GraphicalFilter> graphicalFilters = elementSet.stream().flatMap(element -> element.getGraphicalFilters().stream()).filter(elmt -> elmt instanceof AppliedCompositeFilters)
+ .collect(Collectors.toSet());
+
+ if (graphicalFilters.size() > 0) {
+ String filterStrings = graphicalFilters.stream().flatMap(elmt -> ((AppliedCompositeFilters) elmt).getCompositeFilterDescriptions().stream()).map(elt -> elt.getName())
+ .collect(Collectors.joining(", ")); //$NON-NLS-1$
+ boolean confirm = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), Messages.DoubleClickEditPolicy_filterConfirmDialogTitle,
+ MessageFormat.format(Messages.DoubleClickEditPolicy_filterConfirmDialogBody, filterStrings));
+ if (confirm) {
+ final TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(parentDiagram);
+ final DCommand command = new SiriusCommand(domain, null);
+ for (GraphicalFilter graphicalFilter : graphicalFilters) {
+ EList<CompositeFilterDescription> compositeFilterDescriptions = ((AppliedCompositeFilters) graphicalFilter).getCompositeFilterDescriptions();
+ for (CompositeFilterDescription compositeFilterDescription : compositeFilterDescriptions) {
+ command.getTasks().add(new FilterUpdateTask(parentDiagram, compositeFilterDescription, false));
+ }
+ }
+ command.setLabel(MessageFormat.format(Messages.ChangeFilterActivation_deactivateFilter, filterStrings));
+ compoundCommand.append(command);
- cmd = emfCommandFactory.buildRevealElementsCommand(elementSet);
+ }
}
- return cmd;
+ }
+
+ private Layer getLayerToActivate(DDiagram parentDiagram, final DDiagramElement ddiagramElement, DiagramMappingsManager mappingManager) {
+ Layer layerToActivate = null;
+ Collection<Layer> layers = mappingManager.getActiveParentLayers(ddiagramElement.getDiagramElementMapping());
+ List<Layer> allLayers = LayerHelper.getAllLayers(parentDiagram.getDescription());
+ Set<Layer> deactivatedLayers = allLayers.stream().filter(elmt -> !layers.contains(elmt)).collect(Collectors.toSet());
+ for (Layer layer : deactivatedLayers) {
+ List<NodeMapping> nodeMappings = layer.getNodeMappings();
+ for (NodeMapping nodeMapping : nodeMappings) {
+ DiagramElementMapping diagramElementMapping = ddiagramElement.getDiagramElementMapping();
+ if (EqualityHelper.areEquals(nodeMapping, diagramElementMapping)) {
+ layerToActivate = layer;
+ }
+ }
+ List<EdgeMapping> allEdgeMappings = layer.getAllEdgeMappings();
+ for (EdgeMapping edgeMapping : allEdgeMappings) {
+ DiagramElementMapping diagramElementMapping = ddiagramElement.getDiagramElementMapping();
+ if (EqualityHelper.areEquals(edgeMapping, diagramElementMapping)) {
+ layerToActivate = layer;
+ }
+ }
+ List<ContainerMapping> containerMappings = layer.getContainerMappings();
+ for (ContainerMapping containerMapping : containerMappings) {
+ DiagramElementMapping diagramElementMapping = ddiagramElement.getDiagramElementMapping();
+ if (EqualityHelper.areEquals(containerMapping, diagramElementMapping)) {
+ layerToActivate = layer;
+ }
+ }
+ }
+ return layerToActivate;
}
/**
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/handler/ChangeFilterActivation.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/handler/ChangeFilterActivation.java
index 30425f9ec0..6c67747e8c 100644
--- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/handler/ChangeFilterActivation.java
+++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/handler/ChangeFilterActivation.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2015 THALES GLOBAL SERVICES and others.
+ * Copyright (c) 2010, 2018 THALES GLOBAL SERVICES and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -11,25 +11,13 @@
package org.eclipse.sirius.diagram.ui.tools.internal.handler;
import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.emf.transaction.util.TransactionUtil;
import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramWorkbenchPart;
-import org.eclipse.sirius.business.api.helper.task.AbstractCommandTask;
-import org.eclipse.sirius.common.tools.api.listener.NotificationUtil;
import org.eclipse.sirius.diagram.DDiagram;
-import org.eclipse.sirius.diagram.DSemanticDiagram;
-import org.eclipse.sirius.diagram.business.api.helper.concern.ConcernService;
-import org.eclipse.sirius.diagram.description.concern.ConcernDescription;
-import org.eclipse.sirius.diagram.description.filter.CompositeFilterDescription;
-import org.eclipse.sirius.diagram.description.filter.Filter;
import org.eclipse.sirius.diagram.description.filter.FilterDescription;
-import org.eclipse.sirius.diagram.description.filter.VariableFilter;
import org.eclipse.sirius.diagram.ui.provider.Messages;
-import org.eclipse.sirius.diagram.ui.tools.internal.filter.FilterTools;
import org.eclipse.sirius.tools.api.command.DCommand;
import org.eclipse.sirius.tools.api.command.SiriusCommand;
@@ -71,36 +59,7 @@ public class ChangeFilterActivation extends AbstractChangeActivation {
final TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(diagram);
final DCommand command = new SiriusCommand(domain, null);
- command.getTasks().add(new AbstractCommandTask() {
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.sirius.business.api.helper.task.ICommandTask#execute()
- */
- @Override
- public void execute() {
- NotificationUtil.sendNotification(diagram, org.eclipse.sirius.common.tools.api.listener.Notification.Kind.START,
- org.eclipse.sirius.common.tools.api.listener.Notification.VISIBILITY_UPDATE);
-
- if (activate) {
- handleActivation(diagram, filter);
- } else {
- diagram.getActivatedFilters().remove(filter);
- ConcernService.resetCurrentConcern(diagram);
- }
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.sirius.business.api.helper.task.ICommandTask#getLabel()
- */
- @Override
- public String getLabel() {
- return Messages.ChangeFilterActivation_label;
- }
-
- });
+ command.getTasks().add(new FilterUpdateTask(diagram, filter, activate));
// This DDiagramSynchronizer.refesh is useless
// command.getTasks().add(new RefreshDElementTask((DDiagram)
@@ -111,51 +70,4 @@ public class ChangeFilterActivation extends AbstractChangeActivation {
domain.getCommandStack().execute(command);
}
- private static boolean handleVariableInit(final CompositeFilterDescription composite, final DSemanticDiagram vp) throws InterruptedException {
- boolean containsVariableFilters = false;
- final Iterator<Filter> it = composite.getFilters().iterator();
- while (it.hasNext()) {
- final Filter objFilter = it.next();
- /*
- * If we have a variable filter we need to open the dialog and set
- * the different variables..
- */
- if (objFilter instanceof VariableFilter) {
- final VariableFilter filter = (VariableFilter) objFilter;
- FilterTools.askForFilterValues(vp, filter);
- containsVariableFilters = true;
- }
- }
- return containsVariableFilters;
- }
-
- private void handleActivation(final DDiagram diagram, final FilterDescription filterDescription) {
- ConcernDescription oldConcern = null;
- boolean containsVariableFilters = false;
- final List<FilterDescription> activatedFilters = diagram.getActivatedFilters();
- final List<FilterDescription> activatedFiltersCopy = new ArrayList<FilterDescription>(activatedFilters);
- if (diagram.getCurrentConcern() != null) {
- oldConcern = diagram.getCurrentConcern();
- ConcernService.resetCurrentConcern(diagram);
- }
- try {
-
- if (filterDescription instanceof CompositeFilterDescription && diagram instanceof DSemanticDiagram) {
- containsVariableFilters = ChangeFilterActivation.handleVariableInit((CompositeFilterDescription) filterDescription, (DSemanticDiagram) diagram);
- }
- // need to remove previous filters to handle creation of new
- // graphical elements on variable filters activation.
- if (containsVariableFilters && activatedFiltersCopy.size() > 0) {
- activatedFilters.clear();
- }
- activatedFilters.add(filterDescription);
- // reactivation of previous activated filters.
- if (containsVariableFilters && activatedFiltersCopy.size() > 0) {
- activatedFilters.addAll(activatedFiltersCopy);
- }
- } catch (final InterruptedException e) {
- ConcernService.setCurrentConcern(diagram, oldConcern);
- }
- }
-
}
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/handler/FilterUpdateTask.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/handler/FilterUpdateTask.java
new file mode 100644
index 0000000000..3e4426f187
--- /dev/null
+++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/handler/FilterUpdateTask.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2018 THALES GLOBAL SERVICES and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.sirius.diagram.ui.tools.internal.handler;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.sirius.business.api.helper.task.AbstractCommandTask;
+import org.eclipse.sirius.common.tools.api.listener.NotificationUtil;
+import org.eclipse.sirius.diagram.DDiagram;
+import org.eclipse.sirius.diagram.DSemanticDiagram;
+import org.eclipse.sirius.diagram.business.api.helper.concern.ConcernService;
+import org.eclipse.sirius.diagram.description.concern.ConcernDescription;
+import org.eclipse.sirius.diagram.description.filter.CompositeFilterDescription;
+import org.eclipse.sirius.diagram.description.filter.Filter;
+import org.eclipse.sirius.diagram.description.filter.FilterDescription;
+import org.eclipse.sirius.diagram.description.filter.VariableFilter;
+import org.eclipse.sirius.diagram.ui.provider.Messages;
+import org.eclipse.sirius.diagram.ui.tools.internal.filter.FilterTools;
+
+/**
+ * A task adding or removing a VSM filter.
+ *
+ * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a>
+ *
+ */
+public final class FilterUpdateTask extends AbstractCommandTask {
+
+ private DDiagram diagram;
+
+ private FilterDescription filter;
+
+ private boolean activate;
+
+ /**
+ * Init the task.
+ *
+ * @param diagram
+ * the {@link DDiagram} that from which filters will be handled.
+ * @param filter
+ * the filter to add or remove.
+ * @param activate
+ * true if the filter should be added. False if it should be rmeoved.
+ */
+ public FilterUpdateTask(DDiagram diagram, FilterDescription filter, boolean activate) {
+ this.diagram = diagram;
+ this.filter = filter;
+ this.activate = activate;
+ }
+
+ @Override
+ public void execute() {
+ NotificationUtil.sendNotification(diagram, org.eclipse.sirius.common.tools.api.listener.Notification.Kind.START, org.eclipse.sirius.common.tools.api.listener.Notification.VISIBILITY_UPDATE);
+
+ if (activate) {
+ handleActivation();
+ } else {
+ diagram.getActivatedFilters().remove(filter);
+ ConcernService.resetCurrentConcern(diagram);
+ }
+ }
+
+ @Override
+ public String getLabel() {
+ return Messages.ChangeFilterActivation_label;
+ }
+
+ private boolean handleVariableInit(final CompositeFilterDescription composite, final DSemanticDiagram vp) throws InterruptedException {
+ boolean containsVariableFilters = false;
+ final Iterator<Filter> it = composite.getFilters().iterator();
+ while (it.hasNext()) {
+ final Filter objFilter = it.next();
+ /*
+ * If we have a variable filter we need to open the dialog and set the different variables..
+ */
+ if (objFilter instanceof VariableFilter) {
+ final VariableFilter theFilter = (VariableFilter) objFilter;
+ FilterTools.askForFilterValues(vp, theFilter);
+ containsVariableFilters = true;
+ }
+ }
+ return containsVariableFilters;
+ }
+
+ private void handleActivation() {
+ ConcernDescription oldConcern = null;
+ boolean containsVariableFilters = false;
+ final List<FilterDescription> activatedFilters = diagram.getActivatedFilters();
+ final List<FilterDescription> activatedFiltersCopy = new ArrayList<FilterDescription>(activatedFilters);
+ if (diagram.getCurrentConcern() != null) {
+ oldConcern = diagram.getCurrentConcern();
+ ConcernService.resetCurrentConcern(diagram);
+ }
+ try {
+
+ if (filter instanceof CompositeFilterDescription && diagram instanceof DSemanticDiagram) {
+ containsVariableFilters = handleVariableInit((CompositeFilterDescription) filter, (DSemanticDiagram) diagram);
+ }
+ // need to remove previous filters to handle creation of new
+ // graphical elements on variable filters activation.
+ if (containsVariableFilters && activatedFiltersCopy.size() > 0) {
+ activatedFilters.clear();
+ }
+ activatedFilters.add(filter);
+ // reactivation of previous activated filters.
+ if (containsVariableFilters && activatedFiltersCopy.size() > 0) {
+ activatedFilters.addAll(activatedFiltersCopy);
+ }
+ } catch (final InterruptedException e) {
+ ConcernService.setCurrentConcern(diagram, oldConcern);
+ }
+ }
+
+}
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src/org/eclipse/sirius/diagram/ui/provider/Messages.java b/plugins/org.eclipse.sirius.diagram.ui/src/org/eclipse/sirius/diagram/ui/provider/Messages.java
index 615c871041..fe3ff7892c 100644
--- a/plugins/org.eclipse.sirius.diagram.ui/src/org/eclipse/sirius/diagram/ui/provider/Messages.java
+++ b/plugins/org.eclipse.sirius.diagram.ui/src/org/eclipse/sirius/diagram/ui/provider/Messages.java
@@ -1541,6 +1541,18 @@ public final class Messages {
@TranslatableMessage
public static String LayoutAlgorithmProviderRegistry_classInitialization;
+ @TranslatableMessage
+ public static String DoubleClickEditPolicy_filterConfirmDialogTitle;
+
+ @TranslatableMessage
+ public static String DoubleClickEditPolicy_filterConfirmDialogBody;
+
+ @TranslatableMessage
+ public static String DoubleClickEditPolicy_layerConfirmDialogBody;
+
+ @TranslatableMessage
+ public static String DoubleClickEditPolicy_layerConfirmDialogTitle;
+
// CHECKSTYLE:ON
private Messages() {

Back to the top