--- /dev/null
+/*******************************************************************************\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