Skip to content

Commit 4b75c1b

Browse files
committed
ValidationView: change quickfix pick to ElementListSelectionDialog to support title breakpoints
1 parent 5477836 commit 4b75c1b

File tree

1 file changed

+94
-43
lines changed

1 file changed

+94
-43
lines changed

plugins/org.eclipse.epsilon.evl.dt/src/org/eclipse/epsilon/evl/dt/views/ValidationView.java

Lines changed: 94 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
import java.util.ArrayList;
1313
import java.util.Collections;
1414
import java.util.List;
15+
import java.util.Map;
16+
import java.util.Map.Entry;
17+
import java.util.TreeMap;
18+
1519
import org.eclipse.core.runtime.IProgressMonitor;
1620
import org.eclipse.core.runtime.IStatus;
1721
import org.eclipse.core.runtime.Status;
@@ -30,21 +34,21 @@
3034
import org.eclipse.jface.action.IMenuManager;
3135
import org.eclipse.jface.action.IToolBarManager;
3236
import org.eclipse.jface.action.MenuManager;
33-
import org.eclipse.jface.action.Separator;
3437
import org.eclipse.jface.viewers.IStructuredSelection;
3538
import org.eclipse.jface.viewers.ITableLabelProvider;
3639
import org.eclipse.jface.viewers.LabelProvider;
3740
import org.eclipse.jface.viewers.StructuredSelection;
3841
import org.eclipse.jface.viewers.TableViewer;
3942
import org.eclipse.jface.viewers.ViewerComparator;
43+
import org.eclipse.jface.window.Window;
4044
import org.eclipse.swt.SWT;
4145
import org.eclipse.swt.graphics.Image;
4246
import org.eclipse.swt.widgets.Composite;
4347
import org.eclipse.swt.widgets.Display;
4448
import org.eclipse.swt.widgets.Menu;
4549
import org.eclipse.ui.IActionBars;
46-
import org.eclipse.ui.IWorkbenchActionConstants;
4750
import org.eclipse.ui.PlatformUI;
51+
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
4852
import org.eclipse.ui.part.ViewPart;
4953

5054
public class ValidationView extends ViewPart {
@@ -167,54 +171,101 @@ private void fillLocalPullDown(IMenuManager manager) {
167171
}
168172

169173
private void fillContextMenu(IMenuManager manager) {
170-
UnsatisfiedConstraint unsatisfiedConstraint = (UnsatisfiedConstraint)((StructuredSelection) viewer.getSelection()).getFirstElement();
171-
if (unsatisfiedConstraint == null) return;
172-
173-
for (FixInstance fixInstance : unsatisfiedConstraint.getFixes()) {
174-
manager.add(new PerformFixAction(unsatisfiedConstraint, fixInstance));
174+
StructuredSelection selection = (StructuredSelection) viewer.getSelection();
175+
UnsatisfiedConstraint unsatisfiedConstraint = (UnsatisfiedConstraint) selection.getFirstElement();
176+
177+
if (unsatisfiedConstraint != null && !unsatisfiedConstraint.getFixes().isEmpty()) {
178+
manager.add(new QuickFixAction(unsatisfiedConstraint));
175179
}
176-
177-
// Other plug-ins can contribute there actions here
178-
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
179180
}
180-
181-
class PerformFixAction extends Action {
182-
UnsatisfiedConstraint unsatisfiedConstraint = null;
183-
FixInstance fixInstance = null;
184-
185-
public PerformFixAction(UnsatisfiedConstraint unsatisfiedConstraint, FixInstance fixInstance) {
186-
this.unsatisfiedConstraint = unsatisfiedConstraint;
187-
this.fixInstance = fixInstance;
188-
this.setImageDescriptor(EvlPlugin.getDefault().getImageDescriptor("icons/fix.gif"));
189-
try {
190-
this.setText(fixInstance.getTitle());
181+
182+
protected class QuickFixAction extends Action {
183+
protected class ComputeFixTitlesJob extends Job {
184+
protected ComputeFixTitlesJob(String name) {
185+
super(name);
191186
}
192-
catch (EolRuntimeException e) {
193-
module.getContext().getErrorStream().println(e.toString());
194-
this.setText("An exception occured while evaluating the title of the fix");
187+
188+
@Override
189+
protected IStatus run(IProgressMonitor monitor) {
190+
final Map<String, FixInstance> fixesByTitle = new TreeMap<>();
191+
for (FixInstance fixInstance : unsatisfiedConstraint.getFixes()) {
192+
try {
193+
fixesByTitle.put(fixInstance.getTitle(), fixInstance);
194+
} catch (EolRuntimeException e) {
195+
return Status.error(e.getMessage(), e);
196+
}
197+
}
198+
PlatformUI.getWorkbench().getDisplay().asyncExec(() -> {
199+
showQuickFixDialog(unsatisfiedConstraint, fixesByTitle);
200+
});
201+
return Status.OK_STATUS;
202+
}
203+
204+
@SuppressWarnings("unchecked")
205+
protected void showQuickFixDialog(UnsatisfiedConstraint unsatisfiedConstraint, final Map<String, FixInstance> fixesByTitle) {
206+
ElementListSelectionDialog dialog = new ElementListSelectionDialog(
207+
getViewSite().getShell(), new MapEntryLabelProvider());
208+
209+
dialog.setElements(fixesByTitle.entrySet().toArray());
210+
dialog.setTitle("Select a quick fix");
211+
dialog.setMultipleSelection(false);
212+
if (dialog.open() == Window.OK) {
213+
Entry<String, FixInstance> selected = (Map.Entry<String, FixInstance>) dialog.getFirstResult();
214+
if (selected != null) {
215+
// Need to run fix from a non-UI background job (in case it is debugged)
216+
new RunFixJob("Run fix", selected).schedule();
217+
}
218+
}
195219
}
196220
}
197-
221+
222+
protected class RunFixJob extends Job {
223+
private final Entry<String, FixInstance> selected;
224+
225+
protected RunFixJob(String name, Entry<String, FixInstance> selected) {
226+
super(name);
227+
this.selected = selected;
228+
}
229+
230+
@Override
231+
protected IStatus run(IProgressMonitor monitor) {
232+
try {
233+
selected.getValue().perform();
234+
unsatisfiedConstraint.setFixed(true);
235+
PlatformUI.getWorkbench().getDisplay().asyncExec(() -> {
236+
setDone(!existUnsatisfiedConstraintsToFix());
237+
viewer.refresh();
238+
});
239+
} catch (Exception e) {
240+
module.getContext().getErrorStream().println(e.toString());
241+
return Status.error(e.getMessage());
242+
}
243+
return Status.OK_STATUS;
244+
}
245+
}
246+
247+
protected class MapEntryLabelProvider extends LabelProvider {
248+
@SuppressWarnings("unchecked")
249+
@Override
250+
public String getText(Object element) {
251+
if (element instanceof Map.Entry) {
252+
return ((Map.Entry<String, Object>) element).getKey();
253+
}
254+
return super.getText(element);
255+
}
256+
}
257+
258+
private final UnsatisfiedConstraint unsatisfiedConstraint;
259+
260+
public QuickFixAction(UnsatisfiedConstraint unsatisfiedConstraint) {
261+
super("Quick Fix...");
262+
this.unsatisfiedConstraint = unsatisfiedConstraint;
263+
}
264+
198265
@Override
199266
public void run() {
200-
// Need to run fix from a non-UI background job (in case it is debugged)
201-
new Job("Run fix") {
202-
@Override
203-
protected IStatus run(IProgressMonitor monitor) {
204-
try {
205-
fixInstance.perform();
206-
unsatisfiedConstraint.setFixed(true);
207-
PlatformUI.getWorkbench().getDisplay().asyncExec(() -> {
208-
setDone(!existUnsatisfiedConstraintsToFix());
209-
viewer.refresh();
210-
});
211-
} catch (Exception e) {
212-
module.getContext().getErrorStream().println(e.toString());
213-
return Status.error(e.getMessage());
214-
}
215-
return Status.OK_STATUS;
216-
}
217-
}.schedule();
267+
// Need to compute fix titles from a background job (could have a breakpoint)
268+
new ComputeFixTitlesJob("Compute fix titles").schedule();
218269
}
219270
}
220271

0 commit comments

Comments
 (0)