### Eclipse Workspace Patch 1.0 #P org.eclipse.ui.examples.job Index: src/org/eclipse/ui/examples/jobs/views/JobsView.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/views/JobsView.java,v retrieving revision 1.18 diff -u -r1.18 JobsView.java --- src/org/eclipse/ui/examples/jobs/views/JobsView.java 16 Apr 2007 20:08:18 -0000 1.18 +++ src/org/eclipse/ui/examples/jobs/views/JobsView.java 8 Feb 2010 09:54:31 -0000 @@ -1,26 +1,44 @@ package org.eclipse.ui.examples.jobs.views; +import java.io.File; import java.lang.reflect.InvocationTargetException; +import java.net.MalformedURLException; +import java.net.URL; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.*; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.*; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Group; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.WorkspaceModifyOperation; +import org.eclipse.ui.examples.jobs.ProgressExamplesPlugin; import org.eclipse.ui.examples.jobs.TestJob; import org.eclipse.ui.examples.jobs.TestJobRule; import org.eclipse.ui.examples.jobs.UITestJob; +import org.eclipse.ui.internal.util.BundleUtility; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.progress.IProgressConstants; import org.eclipse.ui.progress.IProgressService; @@ -37,6 +55,18 @@ private Text quantityField, delayField, rescheduleDelay; private Button schedulingRuleField; private Button noPromptField; + private Button defaultIconField; + private ImageDescriptor normalIcon1; + private ImageDescriptor normalIcon2; + private ImageDescriptor normalIcon3; + private ImageDescriptor bigIcon; + private ImageDescriptor otherIcon; + + private Button normalIconField1; + private Button normalIconField2; + private Button normalIconField3; + private Button bigIconField; + private Button otherIconField; protected void busyCursorWhile() { try { @@ -100,6 +130,8 @@ result = new TestJob(duration, lock, failure, unknown, reschedule, rescheduleWait); + setIcon(result); + result.setProperty(IProgressConstants.KEEP_PROPERTY, Boolean .valueOf(keep)); result.setProperty(IProgressConstants.KEEPONE_PROPERTY, Boolean @@ -128,6 +160,26 @@ } } + private void setIcon(Job result) { + if(defaultIconField.getSelection()) + return; + + ImageDescriptor imageDesc; + if(normalIconField1.getSelection()) + imageDesc = normalIcon1; + else if(normalIconField2.getSelection()) + imageDesc = normalIcon2; + else if(normalIconField3.getSelection()) + imageDesc = normalIcon3; + else if(bigIconField.getSelection()) + imageDesc = bigIcon; + else + imageDesc = otherIcon; + + result.setProperty(IProgressConstants.ICON_PROPERTY, imageDesc); + + } + /** * @see ViewPart#createPartControl(Composite) */ @@ -242,6 +294,36 @@ doSleep(); } }); + // join the running test jobs + Button cancel = new Button(group, SWT.PUSH); + cancel.setText("Cancel"); //$NON-NLS-1$ + cancel.setToolTipText("Calls cancel() on all TestJobs"); //$NON-NLS-1$ + cancel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + cancel.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + cancelTestJobs(); + } + }); + + // join the running test jobs + Button beginRule = new Button(group, SWT.PUSH); + beginRule.setText("beginRule: Root "); //$NON-NLS-1$ + beginRule.setToolTipText("Calls beginRule in UI thread"); //$NON-NLS-1$ + beginRule.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + beginRule.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + try { + Job.getJobManager().beginRule(ResourcesPlugin.getWorkspace().getRoot(), null); + } catch (OperationCanceledException ee) { + MessageDialog.openInformation(e.display.getActiveShell(), "Canceled", "Operation canceled"); + return; + } finally { + Job.getJobManager().endRule(ResourcesPlugin.getWorkspace().getRoot()); + } + MessageDialog.openInformation(e.display.getActiveShell(), "Ran", "Operation Ran"); + } + }); + // join the running test jobs Button wake = new Button(group, SWT.PUSH); @@ -447,6 +529,61 @@ noPromptField .setToolTipText("Set the IProgressConstants.NO_IMMEDIATE_ERROR_PROMPT_PROPERTY to true"); noPromptField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + Group imageGroup = new Group(group, SWT.NONE); + imageGroup.setText("Image:"); + imageGroup.setLayout(new GridLayout()); + + defaultIconField = new Button(imageGroup, SWT.RADIO); + defaultIconField.setText("None"); + defaultIconField.setSelection(true); + + normalIcon1 = ImageDescriptor.createFromURL(BundleUtility.find(ProgressExamplesPlugin.ID, "/icons/sample.gif")); + + normalIconField1 = new Button(imageGroup, SWT.RADIO); + normalIconField1.setSelection(false); + normalIconField1.setImage(normalIcon1.createImage()); + + normalIcon2 = ImageDescriptor.createFromURL(BundleUtility.find(ProgressExamplesPlugin.ID, "/icons/cvs_persp.gif")); + + normalIconField2 = new Button(imageGroup, SWT.RADIO); + normalIconField2.setSelection(false); + normalIconField2.setImage(normalIcon2.createImage()); + + normalIcon3 = ImageDescriptor.createFromURL(BundleUtility.find(ProgressExamplesPlugin.ID, "/icons/site_obj.gif")); + + normalIconField3 = new Button(imageGroup, SWT.RADIO); + normalIconField3.setSelection(false); + normalIconField3.setImage(normalIcon3.createImage()); + + + bigIcon = ImageDescriptor.createFromURL(BundleUtility.find(ProgressExamplesPlugin.ID, "/icons/export_wiz.png")); + + bigIconField = new Button(imageGroup, SWT.RADIO); + bigIconField.setSelection(false); + bigIconField.setImage(bigIcon.createImage()); + + otherIconField = new Button(imageGroup, SWT.RADIO); + otherIconField.setSelection(false); + otherIconField.setText("Other..."); + otherIconField.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + FileDialog dialog = new FileDialog(getSite().getShell()); + dialog.setFilterExtensions(new String[] {"*.gif;*.png"}); + dialog.setFilterNames(new String[] {"Icon images"}); + if(dialog.open() == null) + return; + try { + otherIcon = ImageDescriptor.createFromURL(new URL("file://"+dialog.getFilterPath()+File.separatorChar+dialog.getFileName())); + } catch (MalformedURLException e1) { + MessageDialog.openError(getSite().getShell(), "Error", e1.getMessage()); + defaultIconField.setSelection(true); + } + + } + }); + } protected void doRun(long duration, IProgressMonitor monitor) { @@ -544,6 +681,33 @@ e.printStackTrace(); } } + protected void cancelTestJobs() { + try { + // note that when a null progress monitor is used when in the UI + // thread, the workbench will create a default progress monitor + // that reports progress in a modal dialog with details area + PlatformUI.getWorkbench().getProgressService().busyCursorWhile( + new IRunnableWithProgress() { + public void run(IProgressMonitor monitor) + throws InterruptedException { + Job.getJobManager().cancel(TestJob.FAMILY_TEST_JOB); + } + }); + } catch (InterruptedException e) { + // thrown if the user interrupts the join by canceling the progress + // monitor + // A UI component should swallow the exception and finish the action + // or operation. A lower level component should just propagate the + // exception + e.printStackTrace(); + } catch (InvocationTargetException e) { + // Thrown when the operation running within busyCursorWhile throws + // an + // exception. This should either be propagated or displayed to the + // user + e.printStackTrace(); + } + } protected void progressNoFork() { try {