]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/scl/expressions/SCLExpressionView.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / scl / expressions / SCLExpressionView.java
1 package org.simantics.modeling.ui.scl.expressions;
2
3 import java.util.Collection;
4
5 import org.eclipse.core.runtime.IProgressMonitor;
6 import org.eclipse.core.runtime.IStatus;
7 import org.eclipse.core.runtime.Status;
8 import org.eclipse.core.runtime.jobs.Job;
9 import org.eclipse.jface.action.Action;
10 import org.eclipse.jface.action.IAction;
11 import org.eclipse.jface.layout.GridDataFactory;
12 import org.eclipse.jface.layout.TableColumnLayout;
13 import org.eclipse.jface.resource.ImageRegistry;
14 import org.eclipse.jface.viewers.ArrayContentProvider;
15 import org.eclipse.jface.viewers.ColumnLabelProvider;
16 import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
17 import org.eclipse.jface.viewers.ColumnWeightData;
18 import org.eclipse.jface.viewers.DoubleClickEvent;
19 import org.eclipse.jface.viewers.IDoubleClickListener;
20 import org.eclipse.jface.viewers.IStructuredContentProvider;
21 import org.eclipse.jface.viewers.IStructuredSelection;
22 import org.eclipse.jface.viewers.StructuredSelection;
23 import org.eclipse.jface.viewers.TableViewer;
24 import org.eclipse.jface.viewers.TableViewerColumn;
25 import org.eclipse.swt.SWT;
26 import org.eclipse.swt.events.KeyAdapter;
27 import org.eclipse.swt.events.KeyEvent;
28 import org.eclipse.swt.layout.GridLayout;
29 import org.eclipse.swt.widgets.Composite;
30 import org.eclipse.swt.widgets.Shell;
31 import org.eclipse.swt.widgets.Table;
32 import org.eclipse.swt.widgets.Text;
33 import org.eclipse.ui.IMemento;
34 import org.eclipse.ui.IViewSite;
35 import org.eclipse.ui.PartInitException;
36 import org.eclipse.ui.part.ViewPart;
37 import org.simantics.DatabaseJob;
38 import org.simantics.Simantics;
39 import org.simantics.db.Resource;
40 import org.simantics.db.exception.DatabaseException;
41 import org.simantics.modeling.ui.Activator;
42 import org.simantics.scl.db.SCLExpressionTableEntry;
43 import org.simantics.scl.db.UsedSCLExpressionsRequest;
44 import org.simantics.ui.workbench.action.DefaultActions;
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
47
48 public class SCLExpressionView extends ViewPart {
49
50     private static final Logger LOGGER = LoggerFactory.getLogger(SCLExpressionView.class);
51
52     private TableViewer tableViewer;
53     private TableViewerColumn expressionColumn;
54     private TableViewerColumn locationColumn;
55
56     private ImageRegistry imageRegistry;
57     private IStructuredContentProvider expressionContentProvider;
58     private SCLExpressionItemFilter expressionFilter;
59
60     public SCLExpressionView() {
61         imageRegistry = Activator.getDefault().getImageRegistry();
62         expressionContentProvider = ArrayContentProvider.getInstance();
63     }
64
65     @Override
66     public void init(IViewSite site, IMemento memento) throws PartInitException {
67         super.init(site, memento);
68         IAction action = new Action("Refresh") {
69             @Override
70             public void run() {
71                 scheduleUpdateEntries();
72             }
73         };
74         action.setImageDescriptor(imageRegistry.getDescriptor("arrow_refresh"));
75         site.getActionBars().getToolBarManager().add(action);
76     }
77
78     private void createFilter(Composite parent) {
79         expressionFilter = new SCLExpressionItemFilter();
80
81         Text searchText = new Text(parent, SWT.BORDER | SWT.SEARCH);
82         GridDataFactory.fillDefaults().grab(true, false).applyTo(searchText);
83         searchText.addKeyListener(new KeyAdapter() {
84
85             @Override
86             public void keyReleased(KeyEvent e) {
87                 expressionFilter.setSearchText(searchText.getText());
88                 tableViewer.refresh();
89             }
90         });
91     }
92
93     @Override
94     public void createPartControl(Composite parent) {
95         parent.setLayout(new GridLayout(1, false));
96         GridDataFactory.fillDefaults().grab(true, true).applyTo(parent);
97         createFilter(parent);
98
99         Composite tableParent = new Composite(parent, SWT.NONE);
100         GridDataFactory.fillDefaults().grab(true, true).applyTo(tableParent);
101
102         tableViewer = new TableViewer(tableParent,
103                 SWT.FULL_SELECTION | SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL | SWT.VIRTUAL);
104         ColumnViewerToolTipSupport.enableFor(tableViewer);
105         tableViewer.setContentProvider(expressionContentProvider);
106         tableViewer.addFilter(expressionFilter);
107
108         Table table = tableViewer.getTable();
109         table.setHeaderVisible(true);
110         table.setLinesVisible(true);
111
112         TableColumnLayout layout = new TableColumnLayout();
113         tableParent.setLayout(layout);
114
115         expressionColumn = new TableViewerColumn(tableViewer, SWT.NONE);
116         expressionColumn.getColumn().setText("Expression");
117         expressionColumn.getColumn().setResizable(true);
118         expressionColumn.setLabelProvider(new ColumnLabelProvider() {
119             @Override
120             public String getText(Object element) {
121                 SCLExpressionTableEntry entry = (SCLExpressionTableEntry) element;
122                 return entry.getContent();
123             }
124         });
125
126         layout.setColumnData(expressionColumn.getColumn(), new ColumnWeightData(100));
127
128         locationColumn = new TableViewerColumn(tableViewer, SWT.NONE);
129         locationColumn.getColumn().setText("Location");
130         locationColumn.getColumn().setResizable(false);
131         locationColumn.setLabelProvider(new ColumnLabelProvider() {
132             @Override
133             public String getText(Object element) {
134                 SCLExpressionTableEntry entry = (SCLExpressionTableEntry) element;
135                 if (entry.getLocation() != null)
136                     return entry.getLocation();
137                 return "null";
138             }
139         });
140
141         layout.setColumnData(locationColumn.getColumn(), new ColumnWeightData(100));
142         tableViewer.addDoubleClickListener(new IDoubleClickListener() {
143             @Override
144             public void doubleClick(DoubleClickEvent event) {
145                 IStructuredSelection selection = (IStructuredSelection) event.getSelection();
146                 SCLExpressionTableEntry entry = (SCLExpressionTableEntry) selection.getFirstElement();
147
148                 openResource(tableViewer.getControl().getDisplay().getActiveShell(), entry.getResource());
149             }
150         });
151         scheduleUpdateEntries();
152     }
153
154     private void scheduleUpdateEntries() {
155         Job updateJob = new DatabaseJob("Update used SCL expressions") {
156
157             @Override
158             protected IStatus run(IProgressMonitor monitor) {
159                 try {
160                     Collection<SCLExpressionTableEntry> result = Simantics.getSession()
161                             .syncRequest(new UsedSCLExpressionsRequest());
162                     tableViewer.getTable().getDisplay().asyncExec(() -> {
163                         tableViewer.setInput(result);
164                     });
165                     return Status.OK_STATUS;
166                 } catch (DatabaseException e) {
167                     LOGGER.error("Could not update SCL expressions", e);
168                     return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Could not update SCL expressions", e);
169                 }
170             }
171         };
172         updateJob.schedule();
173     }
174
175     private static void openResource(Shell shell, Resource resource) {
176         DefaultActions.performDefaultAction(shell, new StructuredSelection(resource));
177     }
178
179     @Override
180     public void setFocus() {
181         tableViewer.getControl().setFocus();
182     }
183
184     @Override
185     public void dispose() {
186         super.dispose();
187     }
188
189 }