001: package org.eclipse.ui.internal.provisional.views.markers;
002:
003: import java.lang.reflect.InvocationTargetException;
004: import java.util.HashMap;
005: import java.util.Map;
006:
007: import org.eclipse.core.commands.ExecutionEvent;
008: import org.eclipse.core.commands.ExecutionException;
009: import org.eclipse.core.resources.IMarker;
010: import org.eclipse.core.runtime.IProgressMonitor;
011: import org.eclipse.core.runtime.IStatus;
012: import org.eclipse.core.runtime.Status;
013: import org.eclipse.jface.dialogs.IPageChangedListener;
014: import org.eclipse.jface.dialogs.PageChangedEvent;
015: import org.eclipse.jface.dialogs.ProgressMonitorDialog;
016: import org.eclipse.jface.operation.IRunnableContext;
017: import org.eclipse.jface.operation.IRunnableWithProgress;
018: import org.eclipse.jface.wizard.IWizard;
019: import org.eclipse.jface.wizard.WizardDialog;
020: import org.eclipse.swt.SWT;
021: import org.eclipse.swt.widgets.Shell;
022: import org.eclipse.ui.IMarkerResolution;
023: import org.eclipse.ui.IWorkbenchPage;
024: import org.eclipse.ui.IWorkbenchWindow;
025: import org.eclipse.ui.PlatformUI;
026: import org.eclipse.ui.ide.IDE;
027: import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
028: import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
029: import org.eclipse.ui.statushandlers.StatusAdapter;
030: import org.eclipse.ui.statushandlers.StatusManager;
031: import org.eclipse.ui.views.markers.internal.MarkerMessages;
032:
033: /**
034: * QuickFixHandler is the command handler for the quick fix dialog.
035: *
036: * @since 3.4
037: *
038: */
039: public class QuickFixHandler extends MarkerViewHandler {
040:
041: private class QuickFixWizardDialog extends WizardDialog {
042:
043: /**
044: * @param parentShell
045: * @param newWizard
046: */
047: public QuickFixWizardDialog(Shell parentShell, IWizard newWizard) {
048: super (parentShell, newWizard);
049: setShellStyle(SWT.CLOSE | SWT.MAX | SWT.TITLE | SWT.BORDER
050: | SWT.MODELESS | SWT.RESIZE
051: | getDefaultOrientation());
052: }
053:
054: }
055:
056: /*
057: * (non-Javadoc)
058: *
059: * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
060: */
061: public Object execute(ExecutionEvent event)
062: throws ExecutionException {
063:
064: final ExtendedMarkersView view = getView(event);
065: if (view == null)
066: return this ;
067:
068: final Map resolutions = new HashMap();
069:
070: IRunnableWithProgress resolutionsRunnable = new IRunnableWithProgress() {
071: public void run(IProgressMonitor monitor) {
072: monitor
073: .beginTask(
074: MarkerMessages.resolveMarkerAction_computationManyAction,
075: 100);
076:
077: IMarker[] selected = view.getSelectedMarkers();
078: for (int i = 0; i < selected.length; i++) {
079: monitor.worked(100 / selected.length);
080: IMarkerResolution[] found = IDE
081: .getMarkerHelpRegistry().getResolutions(
082: selected[i]);
083: if (found.length > 0)
084: resolutions.put(selected[i], found);
085: }
086: monitor.done();
087: }
088: };
089:
090: Object service = view.getSite().getAdapter(
091: IWorkbenchSiteProgressService.class);
092:
093: IRunnableContext context = new ProgressMonitorDialog(view
094: .getSite().getShell());
095:
096: try {
097: if (service == null) {
098: PlatformUI.getWorkbench().getProgressService().runInUI(
099: context, resolutionsRunnable, null);
100: } else {
101: ((IWorkbenchSiteProgressService) service).runInUI(
102: context, resolutionsRunnable, null);
103: }
104: } catch (InvocationTargetException exception) {
105: throw new ExecutionException(exception
106: .getLocalizedMessage(), exception);
107: } catch (InterruptedException exception) {
108:
109: throw new ExecutionException(exception
110: .getLocalizedMessage(), exception);
111: }
112:
113: if (resolutions.isEmpty()) {
114: Status newStatus = new Status(
115: IStatus.WARNING,
116: IDEWorkbenchPlugin.IDE_WORKBENCH,
117: MarkerMessages.MarkerResolutionDialog_NoResolutionsFound);
118: StatusAdapter adapter = new StatusAdapter(newStatus);
119: adapter
120: .setProperty(
121: StatusAdapter.TITLE_PROPERTY,
122: MarkerMessages.MarkerResolutionDialog_CannotFixTitle);
123: StatusManager.getManager().handle(adapter,
124: StatusManager.SHOW);
125: } else {
126: IWizard wizard = new QuickFixWizard(resolutions);
127: WizardDialog dialog = new QuickFixWizardDialog(view
128: .getSite().getShell(), wizard);
129: dialog.addPageChangedListener(new IPageChangedListener() {
130: /*
131: * (non-Javadoc)
132: *
133: * @see org.eclipse.jface.dialogs.IPageChangedListener#pageChanged(org.eclipse.jface.dialogs.PageChangedEvent)
134: */
135: public void pageChanged(PageChangedEvent event) {
136: IWorkbenchWindow window = PlatformUI.getWorkbench()
137: .getActiveWorkbenchWindow();
138: if (window == null)
139: return;
140: IWorkbenchPage page = window.getActivePage();
141: if (page == null)
142: return;
143: QuickFixPage quickPage = (QuickFixPage) event
144: .getSelectedPage();
145: ExtendedMarkersView.openMarkerInEditor(quickPage
146: .getMarker(), view.getSite().getPage());
147:
148: }
149: });
150: dialog.open();
151: }
152: return this;
153: }
154: }
|