[543252] Makes Hide/Reveal actions more consistent between each others

* The Show/Hide elements actions are now available if at least one
element is Hidden/Visible.
* The Show/Hide labels actions are now checking the authorization from
the permission authority.

Bug: 543252
Cherry-picked-from Bug: 543540
Change-Id: I01eb2a88562f8aecb75c12b383527196a326d586
Signed-off-by: Florian Barbin <florian.barbin@obeo.fr>
diff --git a/plugins/org.eclipse.sirius.diagram.ui/plugin.xml b/plugins/org.eclipse.sirius.diagram.ui/plugin.xml
index 8e70b51..4dfaf6f 100644
--- a/plugins/org.eclipse.sirius.diagram.ui/plugin.xml
+++ b/plugins/org.eclipse.sirius.diagram.ui/plugin.xml
@@ -1283,7 +1283,7 @@
             <with
                   variable="activeMenuSelection">
                <iterate
-                     operator="and">
+                     operator="or">
                   <instanceof
                         value="org.eclipse.sirius.diagram.ui.edit.api.part.IDiagramElementEditPart">
                   </instanceof>
@@ -1304,7 +1304,7 @@
             <with
                   variable="activeMenuSelection">
                <iterate
-                     operator="and">
+                     operator="or">
                   <instanceof
                         value="org.eclipse.sirius.diagram.ui.edit.api.part.IDiagramElementEditPart">
                   </instanceof>
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/visibility/HideDDiagramElementAction.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/visibility/HideDDiagramElementAction.java
index 70244b3..8f02f9c 100644
--- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/visibility/HideDDiagramElementAction.java
+++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/visibility/HideDDiagramElementAction.java
@@ -154,7 +154,7 @@
                 DDiagram parentDiagram = ddes.iterator().next().getParentDiagram();
                 Predicate<DDiagramElement> allowsHideReveal = allowsHideReveal(parentDiagram);
                 Predicate<DDiagramElement> notDirectlyHidden = dde -> dde.isVisible();
-                return Iterables.all(ddes, Predicates.and(allowsHideReveal, notDirectlyHidden));
+                return Iterables.any(ddes, Predicates.and(allowsHideReveal, notDirectlyHidden));
             }
 
         }
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/visibility/HideDDiagramElementLabelAction.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/visibility/HideDDiagramElementLabelAction.java
index 278946a..7cf976c 100644
--- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/visibility/HideDDiagramElementLabelAction.java
+++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/visibility/HideDDiagramElementLabelAction.java
@@ -21,6 +21,7 @@
 
 import org.eclipse.emf.common.command.Command;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.edit.domain.EditingDomain;
 import org.eclipse.emf.transaction.TransactionalEditingDomain;
 import org.eclipse.emf.transaction.util.TransactionUtil;
@@ -33,6 +34,7 @@
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.sirius.diagram.DDiagram;
 import org.eclipse.sirius.diagram.DDiagramElement;
 import org.eclipse.sirius.diagram.business.api.query.DDiagramElementQuery;
 import org.eclipse.sirius.diagram.tools.api.command.IDiagramCommandFactory;
@@ -42,6 +44,8 @@
 import org.eclipse.sirius.diagram.ui.tools.api.editor.DDiagramEditor;
 import org.eclipse.sirius.diagram.ui.tools.api.image.DiagramImagesPath;
 import org.eclipse.sirius.diagram.ui.tools.internal.editor.DiagramOutlinePage;
+import org.eclipse.sirius.ecore.extender.business.api.permission.IPermissionAuthority;
+import org.eclipse.sirius.ecore.extender.business.api.permission.PermissionAuthorityRegistry;
 import org.eclipse.sirius.ext.base.Option;
 import org.eclipse.ui.IObjectActionDelegate;
 import org.eclipse.ui.IWorkbenchPart;
@@ -139,8 +143,19 @@
     }
 
     private static boolean isEnabled(DDiagramElement diagramElement) {
+        DDiagram dDiagram = diagramElement.getParentDiagram();
         DDiagramElementQuery query = new DDiagramElementQuery(diagramElement);
-        return query.canHideLabel() && !query.isLabelHidden();
+        return (dDiagram != null && isEditable(dDiagram)) && query.canHideLabel() && !query.isLabelHidden();
+    }
+
+    private static boolean isEditable(DDiagram diagram) {
+        boolean isEditable = false;
+        Resource resource = diagram.eResource();
+        if (resource != null) {
+            IPermissionAuthority permissionAuthority = PermissionAuthorityRegistry.getDefault().getPermissionAuthority(resource.getResourceSet());
+            isEditable = permissionAuthority.canEditInstance(diagram);
+        }
+        return isEditable;
     }
 
     /**
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/visibility/RevealElementsAction.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/visibility/RevealElementsAction.java
index dd6353d..c9ef58d 100644
--- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/visibility/RevealElementsAction.java
+++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/visibility/RevealElementsAction.java
@@ -45,7 +45,7 @@
     public RevealElementsAction() {
         super(Messages.RevealOutlineElementsAction_label);
     }
-    
+
     /**
      * Constructor.
      * 
@@ -75,29 +75,22 @@
     }
 
     /**
-     * Tests whether this action should be active. The action is active if the the given selection contains only hidden
-     * diagram graphical element.
+     * Tests whether this action should be active. The action is active if the given selection contains at least one
+     * hidden diagram graphical element.
      * 
      * @param selectedElements
      *            The current selection
      * @return true if all selected elements are hidden.
      */
     public static boolean isActive(IStructuredSelection selectedElements) {
-        boolean result = true;
         final Iterator<?> iterator = selectedElements.iterator();
-
-        if (!iterator.hasNext()) {
-            result = false;
-        }
         while (iterator.hasNext()) {
             final Object selectedElement = iterator.next();
-            if (selectedElement instanceof IDiagramElementEditPart) {
-                result = result && isActive((IDiagramElementEditPart) selectedElement);
-            } else {
-                result = false;
+            if (selectedElement instanceof IDiagramElementEditPart && isActive((IDiagramElementEditPart) selectedElement)) {
+                return true;
             }
         }
-        return result;
+        return false;
     }
 
     /**
@@ -124,13 +117,15 @@
             final DDiagramEditor diagramEditor = (DDiagramEditor) wrapper.getViewer().getProperty(DDiagramEditor.EDITOR_ID);
             runRevealCommand(root, diagramEditor, (DDiagramElement) vpe);
         } else if (vpe instanceof IDiagramElementEditPart) {
-            Optional<DDiagramElement> optionalDiagramElement = Optional.of((IGraphicalEditPart) vpe).map(IGraphicalEditPart::resolveSemanticElement).filter(DDiagramElement.class::isInstance)
-                    .map(DDiagramElement.class::cast);
-            if (optionalDiagramElement.isPresent()) {
-                IDiagramElementEditPart diagramElementEditPart = (IDiagramElementEditPart) vpe;
-                SelectionRequest request = new SelectionRequest();
-                request.setType(RequestConstants.REQ_OPEN);
-                diagramElementEditPart.performRequest(request);
+            if (isActive((IDiagramElementEditPart) vpe)) {
+                Optional<DDiagramElement> optionalDiagramElement = Optional.of((IGraphicalEditPart) vpe).map(IGraphicalEditPart::resolveSemanticElement).filter(DDiagramElement.class::isInstance)
+                        .map(DDiagramElement.class::cast);
+                if (optionalDiagramElement.isPresent()) {
+                    IDiagramElementEditPart diagramElementEditPart = (IDiagramElementEditPart) vpe;
+                    SelectionRequest request = new SelectionRequest();
+                    request.setType(RequestConstants.REQ_OPEN);
+                    diagramElementEditPart.performRequest(request);
+                }
             }
         }
     }
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/visibility/TabbarRevealLabelsAction.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/visibility/TabbarRevealLabelsAction.java
index 8e4c809..0735c70 100644
--- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/visibility/TabbarRevealLabelsAction.java
+++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/visibility/TabbarRevealLabelsAction.java
@@ -14,12 +14,14 @@
 
 import java.util.Collection;
 
+import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.gef.Disposable;
 import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
 import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.sirius.diagram.DDiagram;
 import org.eclipse.sirius.diagram.DDiagramElement;
 import org.eclipse.sirius.diagram.business.api.query.DDiagramElementQuery;
 import org.eclipse.sirius.diagram.ui.business.api.provider.AbstractDDiagramElementLabelItemProvider;
@@ -27,6 +29,8 @@
 import org.eclipse.sirius.diagram.ui.provider.Messages;
 import org.eclipse.sirius.diagram.ui.tools.api.image.DiagramImagesPath;
 import org.eclipse.sirius.diagram.ui.tools.internal.editor.DiagramOutlinePage;
+import org.eclipse.sirius.ecore.extender.business.api.permission.IPermissionAuthority;
+import org.eclipse.sirius.ecore.extender.business.api.permission.PermissionAuthorityRegistry;
 import org.eclipse.sirius.ext.base.Option;
 
 import com.google.common.base.Predicate;
@@ -143,8 +147,19 @@
     }
 
     private static boolean isEnabled(DDiagramElement diagramElement) {
+        DDiagram dDiagram = diagramElement.getParentDiagram();
         DDiagramElementQuery query = new DDiagramElementQuery(diagramElement);
-        return query.isLabelHidden();
+        return (dDiagram != null && isEditable(dDiagram)) && query.isLabelHidden();
+    }
+
+    private static boolean isEditable(DDiagram diagram) {
+        boolean isEditable = false;
+        Resource resource = diagram.eResource();
+        if (resource != null) {
+            IPermissionAuthority permissionAuthority = PermissionAuthorityRegistry.getDefault().getPermissionAuthority(resource.getResourceSet());
+            isEditable = permissionAuthority.canEditInstance(diagram);
+        }
+        return isEditable;
     }
 
     /**