]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.issues.ui/src/org/simantics/issues/ui/handler/MenuActions.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.issues.ui / src / org / simantics / issues / ui / handler / MenuActions.java
diff --git a/bundles/org.simantics.issues.ui/src/org/simantics/issues/ui/handler/MenuActions.java b/bundles/org.simantics.issues.ui/src/org/simantics/issues/ui/handler/MenuActions.java
new file mode 100644 (file)
index 0000000..cd73395
--- /dev/null
@@ -0,0 +1,193 @@
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2011 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ *     VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.issues.ui.handler;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+import org.eclipse.jface.action.ActionContributionItem;\r
+import org.eclipse.jface.action.ContributionItem;\r
+import org.eclipse.jface.action.IAction;\r
+import org.eclipse.jface.action.IContributionItem;\r
+import org.eclipse.jface.resource.ImageDescriptor;\r
+import org.eclipse.jface.viewers.ISelection;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.SelectionAdapter;\r
+import org.eclipse.swt.events.SelectionEvent;\r
+import org.eclipse.swt.widgets.Menu;\r
+import org.eclipse.swt.widgets.MenuItem;\r
+import org.simantics.Simantics;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.request.WriteRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.SelectionHints;\r
+import org.simantics.issues.Severity;\r
+import org.simantics.issues.common.IssueConstants;\r
+import org.simantics.issues.common.IssueUtils;\r
+import org.simantics.issues.ontology.IssueResource;\r
+import org.simantics.issues.ui.internal.Activator;\r
+import org.simantics.ui.contribution.DynamicMenuContribution;\r
+import org.simantics.utils.datastructures.Callback;\r
+import org.simantics.utils.ui.ErrorLogger;\r
+import org.simantics.utils.ui.ISelectionUtils;\r
+\r
+/**\r
+ * @author Tuukka Lehtonen\r
+ */\r
+public class MenuActions extends DynamicMenuContribution {\r
+\r
+    @Override\r
+    protected Object[] getSelectedObjects() {\r
+        ISelection sel = getSelection();\r
+        List<Resource> resources = ISelectionUtils.getPossibleKeys(sel, SelectionHints.KEY_MAIN, Resource.class);\r
+        return resources.toArray();\r
+    }\r
+\r
+    List<Resource> toResources(Object[] array) {\r
+        Resource[] a = new Resource[array.length];\r
+        for (int i = 0; i < array.length; ++i)\r
+            a[i] = (Resource) array[i];\r
+        return Arrays.asList(a);\r
+    }\r
+\r
+    @Override\r
+    protected IContributionItem[] getContributionItems(ReadGraph graph, Object[] selection) throws DatabaseException {\r
+        if (selection.length == 0)\r
+            return new IContributionItem[0];\r
+\r
+        List<Resource> input = toResources(selection);\r
+\r
+        @SuppressWarnings("unused")\r
+        boolean issues = false;\r
+        @SuppressWarnings("unused")\r
+        boolean userIssues = false;\r
+\r
+        IssueResource ISSUE = IssueResource.getInstance(graph);\r
+        int issueCount = 0;\r
+        int hiddenCount = 0; \r
+        int resolvedCount = 0;\r
+        int userIssueCount = 0;\r
+        for (Resource r : input) {\r
+            boolean isIssue = graph.isInstanceOf(r, ISSUE.Issue);\r
+            issues |= isIssue;\r
+            if (isIssue) {\r
+                ++issueCount;\r
+                if (graph.hasStatement(r, ISSUE.Hidden))\r
+                    ++hiddenCount;\r
+                if (graph.hasStatement(r, ISSUE.Resolved))\r
+                    ++resolvedCount;\r
+            }\r
+\r
+            boolean userIssue = graph.hasStatement(r, ISSUE.UserIssue);\r
+            userIssues |= userIssue;\r
+            if (userIssue) {\r
+                ++userIssueCount;\r
+            }\r
+        }\r
+        boolean allHidden = hiddenCount == selection.length;\r
+        boolean allResolved = resolvedCount == selection.length;\r
+        boolean allUserIssues = userIssueCount == selection.length;\r
+        boolean allIssueSelection = issueCount == selection.length;\r
+\r
+        List<IContributionItem> actions = new ArrayList<IContributionItem>(2); \r
+        if (!allHidden && allIssueSelection)\r
+            actions.add(new ActionContributionItem(hideAction(input)));\r
+        if (hiddenCount > 0 || allHidden && allIssueSelection)\r
+            actions.add(new ActionContributionItem(unhideAction(input)));\r
+        if (!allResolved && allIssueSelection)\r
+            actions.add(new ActionContributionItem(resolveAction(input)));\r
+        if (resolvedCount > 0 || allResolved && allIssueSelection)\r
+            actions.add(new ActionContributionItem(unresolveAction(input)));\r
+        if (allUserIssues)\r
+            actions.add(setSeverityAction(input));\r
+\r
+        return actions.toArray(new IContributionItem[actions.size()]);\r
+    }\r
+\r
+    private IAction unhideAction(List<Resource> input) {\r
+        return tagAction("Unhide", Activator.UNHIDE_ICON, IssueResource.URIs.Hidden, false, input);\r
+    }\r
+\r
+    private IAction hideAction(List<Resource> input) {\r
+        return tagAction("Hide", Activator.HIDE_ICON, IssueResource.URIs.Hidden, true, input);\r
+    }\r
+\r
+    private IAction resolveAction(List<Resource> input) {\r
+        return tagAction("Mark Resolved", Activator.RESOLVE_ICON, IssueResource.URIs.Resolved, true, input);\r
+    }\r
+\r
+    private IAction unresolveAction(List<Resource> input) {\r
+        return tagAction("Mark Unresolved", Activator.UNRESOLVE_ICON, IssueResource.URIs.Resolved, false, input);\r
+    }\r
+\r
+    private IAction tagAction(String label, ImageDescriptor image, String tagURI, boolean tag, List<Resource> input) {\r
+        return new TagAction(label, image, IssueConstants.ISSUE_VG, tagURI, tag, input);\r
+        //return new TagAction(label, image, null, tagURI, tag, input);\r
+    }\r
+\r
+    private IContributionItem setSeverityAction(final List<Resource> userIssues) {\r
+        return new ContributionItem() {\r
+            @Override\r
+            public void fill(Menu menu, int index) {\r
+                MenuItem setSeverityItem = new MenuItem(menu, SWT.CASCADE);\r
+                setSeverityItem.setText("Set Severity");\r
+                Menu setSeverity = new Menu(menu);\r
+                setSeverityItem.setMenu(setSeverity);\r
+                for (final Severity sev : Severity.values()) {\r
+                    if (sev.equals(Severity.UNKNOWN))\r
+                        continue;\r
+\r
+                    MenuItem item = new MenuItem(setSeverity, SWT.PUSH);\r
+                    item.setText(sev.toString().toLowerCase());\r
+                    item.setImage(Activator.getDefault().getImageRegistry().get(sev.toString() + "-full"));\r
+                    item.addSelectionListener(new SelectionAdapter() {\r
+                        @Override\r
+                        public void widgetSelected(SelectionEvent e) {\r
+                            setSeverity(userIssues, sev);\r
+                        }\r
+                    });\r
+                }\r
+            }\r
+        };\r
+    }\r
+\r
+    private void setSeverity(final List<Resource> userIssues, final Severity severity) {\r
+        Simantics.getSession().asyncRequest(new WriteRequest() {\r
+            @Override\r
+            public void perform(WriteGraph graph) throws DatabaseException {\r
+                IssueResource ISSUE = IssueResource.getInstance(graph);\r
+                Resource sev = IssueUtils.toSeverityResource(ISSUE, severity);\r
+                if (sev != null) {\r
+                    for (Resource issue : userIssues) {\r
+                        if (!graph.hasStatement(issue, ISSUE.Issue_HasSeverity, sev)) {\r
+                            graph.deny(issue, ISSUE.Issue_HasSeverity);\r
+                            graph.claim(issue, ISSUE.Issue_HasSeverity, null, sev);\r
+                        }\r
+                    }\r
+                } else {\r
+                    for (Resource issue : userIssues)\r
+                        graph.deny(issue, ISSUE.Issue_HasSeverity);\r
+                }\r
+            }\r
+        }, new Callback<DatabaseException>() {\r
+            @Override\r
+            public void run(DatabaseException e) {\r
+                if (e != null)\r
+                    ErrorLogger.defaultLogError(e);\r
+            }\r
+        });\r
+    }\r
+\r
+}
\ No newline at end of file