diff options
Diffstat (limited to 'examples/org.eclipse.e4.ui.examples.job/src/org/eclipse/e4/ui/examples/jobs/views/JobsView.java')
-rw-r--r-- | examples/org.eclipse.e4.ui.examples.job/src/org/eclipse/e4/ui/examples/jobs/views/JobsView.java | 597 |
1 files changed, 597 insertions, 0 deletions
diff --git a/examples/org.eclipse.e4.ui.examples.job/src/org/eclipse/e4/ui/examples/jobs/views/JobsView.java b/examples/org.eclipse.e4.ui.examples.job/src/org/eclipse/e4/ui/examples/jobs/views/JobsView.java new file mode 100644 index 00000000000..d8b599e800b --- /dev/null +++ b/examples/org.eclipse.e4.ui.examples.job/src/org/eclipse/e4/ui/examples/jobs/views/JobsView.java @@ -0,0 +1,597 @@ +package org.eclipse.e4.ui.examples.jobs.views; + +import java.lang.reflect.InvocationTargetException; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; + +import org.eclipse.core.resources.IWorkspaceRunnable; +import org.eclipse.core.resources.ResourcesPlugin; +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.Platform; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.e4.core.contexts.Active; +import org.eclipse.e4.core.di.annotations.Optional; +import org.eclipse.e4.ui.di.Focus; +import org.eclipse.e4.ui.examples.jobs.TestJob; +import org.eclipse.e4.ui.examples.jobs.TestJobRule; +import org.eclipse.e4.ui.examples.jobs.UITestJob; +import org.eclipse.e4.ui.progress.IProgressConstants; +import org.eclipse.e4.ui.progress.IProgressService; +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.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.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +/** + * A view that allows a user to create jobs of various types, and interact with + * and test other job-related APIs. + */ +public class JobsView { + private Combo durationField; + private Button lockField, failureField, threadField, systemField, + userField, groupField, rescheduleField, keepField, keepOneField, + unknownField, gotoActionField; + private Text quantityField, delayField, rescheduleDelay; + private Button schedulingRuleField; + private Button noPromptField; + + Composite parent; + + @Inject + @Optional + IProgressService progressService; + + @Inject + @Optional + @Active + Shell shell; + + + protected void busyCursorWhile() { + try { + final long duration = getDuration(); + final boolean shouldLock = lockField.getSelection(); + progressService.busyCursorWhile( + new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) { + if (shouldLock) + doRunInWorkspace(duration, monitor); + else + doRun(duration, monitor); + } + + }); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + // ignore - interrupt means cancel in this context + } + } + + protected void createJobs() { + int jobCount = Integer.parseInt(quantityField.getText()); + boolean ui = threadField.getSelection(); + long duration = getDuration(); + boolean lock = lockField.getSelection(); + boolean failure = failureField.getSelection(); + boolean noPrompt = noPromptField.getSelection(); + boolean system = systemField.getSelection(); + boolean useGroup = groupField.getSelection(); + boolean unknown = unknownField.getSelection(); + boolean user = userField.getSelection(); + boolean reschedule = rescheduleField.getSelection(); + final long rescheduleWait = Long.parseLong(rescheduleDelay.getText()); + boolean keep = keepField.getSelection(); + boolean keepOne = keepOneField.getSelection(); + boolean gotoAction = gotoActionField.getSelection(); + boolean schedulingRule = schedulingRuleField.getSelection(); + + int groupIncrement = IProgressMonitor.UNKNOWN; + IProgressMonitor group = new NullProgressMonitor(); + int total = IProgressMonitor.UNKNOWN; + + if (jobCount > 1) { + total = 100; + groupIncrement = 100 / jobCount; + } + + if (useGroup) { + group = Platform.getJobManager().createProgressGroup(); + group.beginTask("Group", total); //$NON-NLS-1$ + } + + long delay = Integer.parseInt(delayField.getText()); + for (int i = 0; i < jobCount; i++) { + Job result; + if (ui) + result = new UITestJob(duration, lock, failure, unknown); + else + result = new TestJob(duration, lock, failure, unknown, + reschedule, rescheduleWait); + + result.setProperty(IProgressConstants.KEEP_PROPERTY, Boolean + .valueOf(keep)); + result.setProperty(IProgressConstants.KEEPONE_PROPERTY, Boolean + .valueOf(keepOne)); + result.setProperty( + IProgressConstants.NO_IMMEDIATE_ERROR_PROMPT_PROPERTY, + Boolean.valueOf(noPrompt)); + if (gotoAction) + result.setProperty(IProgressConstants.ACTION_PROPERTY, + new Action("Pop up a dialog") { //$NON-NLS-1$ + @Override + public void run() { + MessageDialog + .openInformation( + parent.getShell(), + "Goto Action", "The job can have an action associated with it"); //$NON-NLS-1$ //$NON-NLS-2$ + } + }); + + result.setProgressGroup(group, groupIncrement); + result.setSystem(system); + result.setUser(user); + + if (schedulingRule) + result.setRule(new TestJobRule(i)); + result.schedule(delay); + } + } + + /** + * @see ViewPart#createPartControl(Composite) + */ + @PostConstruct + public void createPartControl(Composite parent) { + this.parent = parent; + Composite body = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(); + layout.numColumns = 2; + layout.makeColumnsEqualWidth = false; + body.setLayout(layout); + + createEntryFieldGroup(body); + createPushButtonGroup(body); + createCheckboxGroup(body); + } + + /** + * Create all push button parts for the jobs view. + * + * @param parent + */ + private void createPushButtonGroup(Composite parent) { + Composite group = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(); + layout.numColumns = 1; + group.setLayout(layout); + group.setLayoutData(new GridData(GridData.FILL_BOTH)); + + // create jobs + Button create = new Button(group, SWT.PUSH); + create.setText("Create jobs"); //$NON-NLS-1$ + create + .setToolTipText("Creates and schedules jobs according to above parameters"); //$NON-NLS-1$ + create.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + create.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + createJobs(); + } + }); + + // busy cursor while + Button busyWhile = new Button(group, SWT.PUSH); + busyWhile.setText("busyCursorWhile"); //$NON-NLS-1$ + busyWhile.setToolTipText("Uses IProgressService.busyCursorWhile"); //$NON-NLS-1$ + busyWhile.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + busyWhile.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + busyCursorWhile(); + } + }); + // progress monitor dialog with fork=false + Button noFork = new Button(group, SWT.PUSH); + noFork.setText("runInUI"); //$NON-NLS-1$ + noFork.setToolTipText("Uses IProgressService.runInUI"); //$NON-NLS-1$ + noFork.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + noFork.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + progressNoFork(); + } + }); + + // progress monitor dialog with fork=false + Button exception = new Button(group, SWT.PUSH); + exception.setText("Runtime Exception"); //$NON-NLS-1$ + exception.setToolTipText("NullPointerException when running"); //$NON-NLS-1$ + exception.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + exception.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + jobWithRuntimeException(); + } + }); + + // join the running test jobs + Button join = new Button(group, SWT.PUSH); + join.setText("Join Test Jobs"); //$NON-NLS-1$ + join.setToolTipText("IJobManager.join() on test jobs"); //$NON-NLS-1$ + join.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + join.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + joinTestJobs(); + } + }); + + // join the running test jobs + Button sleep = new Button(group, SWT.PUSH); + sleep.setText("Sleep"); //$NON-NLS-1$ + sleep.setToolTipText("Calls sleep() on all TestJobs"); //$NON-NLS-1$ + sleep.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + sleep.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + doSleep(); + } + }); + + // join the running test jobs + Button wake = new Button(group, SWT.PUSH); + wake.setText("WakeUp"); //$NON-NLS-1$ + wake.setToolTipText("Calls wakeUp() on all TestJobs"); //$NON-NLS-1$ + wake.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + wake.addSelectionListener(new SelectionAdapter() { + + @Override + public void widgetSelected(SelectionEvent e) { + doWakeUp(); + } + }); + + // show in dialog + Button showInDialog = new Button(group, SWT.PUSH); + showInDialog.setText("showInDialog"); //$NON-NLS-1$ + showInDialog.setToolTipText("Uses IProgressService.showInDialog"); //$NON-NLS-1$ + showInDialog.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + showInDialog.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + showInDialog(); + } + }); + + } + + /** + * Test the showInDialog API + * + */ + protected void showInDialog() { + + Job showJob = new Job("Show In Dialog") {//$NON-NLS-1$ + @Override + protected IStatus run(IProgressMonitor monitor) { + monitor.beginTask("Run in dialog", 100);//$NON-NLS-1$ + + for (int i = 0; i < 100; i++) { + if (monitor.isCanceled()) + return Status.CANCEL_STATUS; + try { + Thread.sleep(100); + } catch (InterruptedException e) { + return Status.CANCEL_STATUS; + } + monitor.worked(1); + + } + return Status.OK_STATUS; + + } + }; + showJob.schedule(); + progressService.showInDialog(shell, showJob); + + } + + /** + * Wakes up all sleeping test jobs. + */ + protected void doWakeUp() { + Platform.getJobManager().wakeUp(TestJob.FAMILY_TEST_JOB); + } + + /** + * Puts to sleep all waiting test jobs. + */ + protected void doSleep() { + Platform.getJobManager().sleep(TestJob.FAMILY_TEST_JOB); + } + + /** + * @param body + */ + private void createEntryFieldGroup(Composite body) { + // duration + Label label = new Label(body, SWT.NONE); + label.setText("Duration:"); //$NON-NLS-1$ + durationField = new Combo(body, SWT.DROP_DOWN | SWT.READ_ONLY); + GridData data = new GridData(GridData.FILL_HORIZONTAL); + data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH; + durationField.setLayoutData(data); + durationField.add("0"); //$NON-NLS-1$ + durationField.add("1 millisecond"); //$NON-NLS-1$ + durationField.add("1 second"); //$NON-NLS-1$ + durationField.add("10 seconds"); //$NON-NLS-1$ + durationField.add("1 minute"); //$NON-NLS-1$ + durationField.add("10 minutes"); //$NON-NLS-1$ + durationField.select(4); + + // delay + label = new Label(body, SWT.NONE); + label.setText("Start delay (ms):"); //$NON-NLS-1$ + delayField = new Text(body, SWT.BORDER); + data = new GridData(GridData.FILL_HORIZONTAL); + data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH; + delayField.setLayoutData(data); + delayField.setText("0"); //$NON-NLS-1$ + + // quantity + label = new Label(body, SWT.NONE); + label.setText("Quantity:"); //$NON-NLS-1$ + quantityField = new Text(body, SWT.BORDER); + data = new GridData(GridData.FILL_HORIZONTAL); + data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH; + quantityField.setLayoutData(data); + quantityField.setText("1"); //$NON-NLS-1$ + + // reschedule delay + label = new Label(body, SWT.NONE); + label.setText("Reschedule Delay (ms):"); //$NON-NLS-1$ + rescheduleDelay = new Text(body, SWT.BORDER); + data = new GridData(GridData.FILL_HORIZONTAL); + data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH; + rescheduleDelay.setLayoutData(data); + rescheduleDelay.setText("1000"); //$NON-NLS-1$ + } + + /** + * Creates all of the checkbox buttons. + */ + private void createCheckboxGroup(Composite parent) { + Composite group = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(); + layout.numColumns = 1; + group.setLayout(layout); + group.setLayoutData(new GridData(GridData.FILL_BOTH)); + + // lock + lockField = new Button(group, SWT.CHECK); + lockField.setText("Lock the workspace"); //$NON-NLS-1$ + GridData data = new GridData(GridData.FILL_HORIZONTAL); + lockField.setLayoutData(data); + + // system + systemField = new Button(group, SWT.CHECK); + systemField.setText("System job"); //$NON-NLS-1$ + data = new GridData(GridData.FILL_HORIZONTAL); + systemField.setLayoutData(data); + + // thread + threadField = new Button(group, SWT.CHECK); + threadField.setText("Run in UI thread"); //$NON-NLS-1$ + data = new GridData(GridData.FILL_HORIZONTAL); + threadField.setLayoutData(data); + + // groups + groupField = new Button(group, SWT.CHECK); + groupField.setText("Run in Group"); //$NON-NLS-1$ + data = new GridData(GridData.FILL_HORIZONTAL); + groupField.setLayoutData(data); + + // reschedule + rescheduleField = new Button(group, SWT.CHECK); + rescheduleField.setText("Reschedule"); //$NON-NLS-1$ + data = new GridData(GridData.FILL_HORIZONTAL); + rescheduleField.setLayoutData(data); + + // keep + keepField = new Button(group, SWT.CHECK); + keepField.setText("Keep"); //$NON-NLS-1$ + data = new GridData(GridData.FILL_HORIZONTAL); + keepField.setLayoutData(data); + + // keep one + keepOneField = new Button(group, SWT.CHECK); + keepOneField.setText("KeepOne"); //$NON-NLS-1$ + data = new GridData(GridData.FILL_HORIZONTAL); + keepOneField.setLayoutData(data); + + // IProgressMonitor.UNKNOWN + unknownField = new Button(group, SWT.CHECK); + unknownField.setText("Indeterminate Progress"); //$NON-NLS-1$ + data = new GridData(GridData.FILL_HORIZONTAL); + unknownField.setLayoutData(data); + + // whether the job is a user job + userField = new Button(group, SWT.CHECK); + userField.setText("User job"); //$NON-NLS-1$ + data = new GridData(GridData.FILL_HORIZONTAL); + userField.setLayoutData(data); + + // whether the job has a goto action + gotoActionField = new Button(group, SWT.CHECK); + gotoActionField.setText("Goto action"); //$NON-NLS-1$ + data = new GridData(GridData.FILL_HORIZONTAL); + gotoActionField.setLayoutData(data); + + // whether the job should use a scheduling rule + schedulingRuleField = new Button(group, SWT.CHECK); + schedulingRuleField.setText("Schedule sequentially"); //$NON-NLS-1$ + schedulingRuleField + .setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + // failure + failureField = new Button(group, SWT.CHECK); + failureField.setText("Fail"); //$NON-NLS-1$ + failureField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + // failure + noPromptField = new Button(group, SWT.CHECK); + noPromptField.setText("No Prompt"); //$NON-NLS-1$ + noPromptField + .setToolTipText("Set the IProgressConstants.NO_IMMEDIATE_ERROR_PROMPT_PROPERTY to true"); + noPromptField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + } + + protected void doRun(long duration, IProgressMonitor monitor) { + final long sleep = 10; + int ticks = (int) (duration / sleep); + monitor.beginTask( + "Spinning inside IProgressService.busyCursorWhile", ticks); //$NON-NLS-1$ + monitor.setTaskName("Spinning inside IProgressService.busyCursorWhile"); //$NON-NLS-1$ + for (int i = 0; i < ticks; i++) { + monitor.subTask("Processing tick #" + i); //$NON-NLS-1$ + if (monitor.isCanceled()) + return; + try { + Thread.sleep(sleep); + } catch (InterruptedException e) { + // ignore + } + monitor.worked(1); + } + } + + protected void doRunInWorkspace(final long duration, + IProgressMonitor monitor) { + try { + ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() { + @Override + public void run(IProgressMonitor monitor) throws CoreException { + doRun(duration, monitor); + } + }, monitor); + } catch (CoreException e) { + e.printStackTrace(); + } + } + + protected long getDuration() { + switch (durationField.getSelectionIndex()) { + case 0: + return 0; + case 1: + return 1; + case 2: + return 1000; + case 3: + return 10000; + case 4: + return 60000; + case 5: + default: + return 600000; + } + } + + protected void jobWithRuntimeException() { + Job runtimeExceptionJob = new Job("Job with Runtime exception") { //$NON-NLS-1$ + /* + * (non-Javadoc) + * + * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor) + */ + @Override + protected IStatus run(IProgressMonitor monitor) { + throw new NullPointerException(); + } + }; + runtimeExceptionJob.schedule(); + } + + /** + * Example usage of the IJobManager.join method. + */ + protected void joinTestJobs() { + 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 + progressService.busyCursorWhile( + new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) + throws InterruptedException { + Job.getJobManager().join(TestJob.FAMILY_TEST_JOB, + monitor); + } + }); + } 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 { + final long duration = getDuration(); + final boolean shouldLock = lockField.getSelection(); + progressService.runInUI(progressService, + new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) + throws InterruptedException { + if (shouldLock) + doRunInWorkspace(duration, monitor); + else + doRun(duration, monitor); + } + }, ResourcesPlugin.getWorkspace().getRoot()); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + /** + * @see ViewPart#setFocus() + */ + @Focus + public void setFocus() { + if (durationField != null && !durationField.isDisposed()) + durationField.setFocus(); + } + +}
\ No newline at end of file |