1 package org.simantics.issues.ui.property;
3 import java.util.ArrayList;
4 import java.util.Collections;
9 import org.eclipse.jface.layout.GridDataFactory;
10 import org.eclipse.jface.layout.GridLayoutFactory;
11 import org.eclipse.jface.viewers.CellLabelProvider;
12 import org.eclipse.jface.viewers.ISelection;
13 import org.eclipse.jface.viewers.IStructuredContentProvider;
14 import org.eclipse.jface.viewers.TableViewer;
15 import org.eclipse.jface.viewers.TableViewerColumn;
16 import org.eclipse.jface.viewers.ViewerCell;
17 import org.eclipse.swt.SWT;
18 import org.eclipse.swt.widgets.Composite;
19 import org.eclipse.ui.IWorkbenchSite;
20 import org.simantics.browsing.ui.swt.widgets.impl.WidgetSupport;
21 import org.simantics.databoard.Bindings;
22 import org.simantics.db.ReadGraph;
23 import org.simantics.db.Resource;
24 import org.simantics.db.common.procedure.adapter.TransientCacheListener;
25 import org.simantics.db.common.request.ResourceRead;
26 import org.simantics.db.common.utils.NameUtils;
27 import org.simantics.db.exception.DatabaseException;
28 import org.simantics.db.management.ISessionContext;
29 import org.simantics.db.request.Read;
30 import org.simantics.issues.Severity;
31 import org.simantics.issues.common.IssueResourceContexts;
32 import org.simantics.issues.common.ListModelIssuesBySeverity;
33 import org.simantics.issues.common.SimpleIssue;
34 import org.simantics.layer0.Layer0;
35 import org.simantics.modeling.ModelingResources;
36 import org.simantics.selectionview.PropertyTabContributorImpl;
39 * A very simple property tab for listing issues of a selected object.
44 public class IssuesTab extends PropertyTabContributorImpl{
47 private TableViewer viewer;
48 private Resource model;
49 private Resource element;
51 private List<SimpleIssue> result;
53 public IssuesTab(ReadGraph graph, Resource model, Resource element) throws DatabaseException {
55 this.element = element;
57 Layer0 L0 = Layer0.getInstance(graph);
58 List<Resource> contexts = getContexts(graph, element);
59 Map<Severity, List<Resource>> issuesBySeverity = graph.syncRequest(
60 new ListModelIssuesBySeverity(model, true, true, Severity.NOTE),
61 TransientCacheListener.<Map<Severity, List<Resource>>>instance());
63 result = new ArrayList<>();
64 for (Severity severity : Severity.values()) {
65 List<Resource> issues = issuesBySeverity.get(severity);
67 for (Resource issue : issues) {
68 Set<Resource> issueContexts = graph.syncRequest(new IssueResourceContexts(issue));
69 if (!Collections.disjoint(issueContexts, contexts)) {
70 SimpleIssue si = new SimpleIssue((String) graph.getRelatedValue(issue, L0.HasLabel, Bindings.STRING),
73 System.out.println(si.label + " " + si.severity);
82 * @see org.simantics.modeling.ui.diagram.style.IssueDecorationStyle
87 * @throws DatabaseException
89 protected List<Resource> getContexts(ReadGraph graph, Resource element) throws DatabaseException {
91 ModelingResources MOD = ModelingResources.getInstance(graph);
92 List<Resource> result = new ArrayList<Resource>(3);
94 Resource config = graph.getPossibleObject(element, MOD.ElementToComponent);
95 if (config != null && result.indexOf(config) == -1) result.add(config);
96 config = graph.getPossibleObject(element, MOD.DiagramConnectionToConnection);
97 if (config != null && result.indexOf(config) == -1) result.add(config);
98 // For diagram reference element support
99 config = graph.getPossibleObject(element, MOD.HasParentComponent);
100 if (config != null && result.indexOf(config) == -1) result.add(config);
107 public void createControls(Composite body, IWorkbenchSite site, ISessionContext context, WidgetSupport support) {
108 GridLayoutFactory.fillDefaults().numColumns(2).spacing(0, 0).applyTo(body);
110 viewer = new TableViewer(body);
112 TableViewerColumn issueColumn = new TableViewerColumn(viewer, SWT.LEFT);
113 TableViewerColumn severityColumn = new TableViewerColumn(viewer, SWT.LEFT);
115 issueColumn.setLabelProvider(new CellLabelProvider() {
118 public void update(ViewerCell cell) {
119 SimpleIssue issue = (SimpleIssue)cell.getElement();
120 cell.setText(issue.label);
124 severityColumn.setLabelProvider(new CellLabelProvider() {
127 public void update(ViewerCell cell) {
128 SimpleIssue issue = (SimpleIssue)cell.getElement();
129 cell.setText(issue.severity.name());
133 issueColumn.getColumn().setWidth(300);
134 issueColumn.getColumn().setText("Issue");
136 severityColumn.getColumn().setWidth(100);
137 severityColumn.getColumn().setText("Severity");
139 viewer.getTable().setHeaderVisible(true);
140 viewer.getTable().setLinesVisible(true);
142 viewer.setContentProvider(new IStructuredContentProvider() {
145 public Object[] getElements(Object inputElement) {
146 List<SimpleIssue> list = (List<SimpleIssue>)inputElement;
147 return list.toArray();
151 viewer.setInput(result);
152 GridDataFactory.fillDefaults().grab(true, true).applyTo(viewer.getControl());
157 public Read<String> getPartNameReadRequest(ISelection forSelection) {
158 return new ObjectTitleRead(element);
161 public static class ObjectTitleRead extends ResourceRead<String> {
162 public ObjectTitleRead(Resource resource) {
167 public String perform(ReadGraph graph) throws DatabaseException {
168 return NameUtils.getSafeName(graph, resource);