Community
Participate
Working Groups
By creating a shell only app using jobs I run into a NPE. The display on the workbench is null and the 'PlatformUI.getWorkbench().getDisplay()' lookup is done in the ProgessInforItem. /andy Stacktrace: ----------- java.lang.NullPointerException at org.eclipse.ui.internal.progress.ProgressInfoItem.init(ProgressInfoItem.java:183) at org.eclipse.ui.internal.progress.ProgressManager$ProgressManagerProvider.getInstance(ProgressManager.java:106) at org.eclipse.ui.internal.progress.ProgressManager.getInstance(ProgressManager.java:188) at org.eclipse.rap.ui.internal.progress.JobManagerAdapter$4.run(JobManagerAdapter.java:195) at org.eclipse.rwt.internal.lifecycle.FakeContextUtil.runNonUIThreadWithFakeContext(FakeContextUtil.java:60) at org.eclipse.rwt.lifecycle.UICallBack.runNonUIThreadWithFakeContext(UICallBack.java:48) at org.eclipse.rap.ui.internal.progress.JobManagerAdapter.findSessionProgressManager(JobManagerAdapter.java:193) at org.eclipse.rap.ui.internal.progress.JobManagerAdapter.findProgressManager(JobManagerAdapter.java:180) at org.eclipse.rap.ui.internal.progress.JobManagerAdapter.scheduled(JobManagerAdapter.java:165) at org.eclipse.core.internal.jobs.JobListeners$5.notify(JobListeners.java:49) at org.eclipse.core.internal.jobs.JobListeners.doNotify(JobListeners.java:96) at org.eclipse.core.internal.jobs.JobListeners.scheduled(JobListeners.java:162) at org.eclipse.core.internal.jobs.JobManager.schedule(JobManager.java:1123) at org.eclipse.core.internal.jobs.InternalJob.schedule(InternalJob.java:427) at org.eclipse.core.runtime.jobs.Job.schedule(Job.java:436) at sampleapp.EntryPoint.executeJob(EntryPoint.java:58) at sampleapp.EntryPoint.access$0(EntryPoint.java:46) at sampleapp.EntryPoint$1.widgetSelected(EntryPoint.java:32) at org.eclipse.swt.events.SelectionEvent.dispatchToObserver(SelectionEvent.java:196) at org.eclipse.rwt.internal.events.Event.processEvent(Event.java:44) at org.eclipse.swt.events.TypedEvent.processEvent(TypedEvent.java:163) at org.eclipse.swt.events.TypedEvent.executeNext(TypedEvent.java:203) at org.eclipse.swt.widgets.Display.runPendingMessages(Display.java:1143) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:1133) at sampleapp.EntryPoint.createUI(EntryPoint.java:39) at org.eclipse.rwt.internal.lifecycle.EntryPointManagerInstance.createUI(EntryPointManagerInstance.java:79) at org.eclipse.rwt.internal.lifecycle.EntryPointManager.createUI(EntryPointManager.java:33) at org.eclipse.rwt.internal.lifecycle.RWTLifeCycle.createUI(RWTLifeCycle.java:242) at org.eclipse.rwt.internal.lifecycle.RWTLifeCycle$UIThreadController.run(RWTLifeCycle.java:111) at java.lang.Thread.run(Thread.java:619) at org.eclipse.rwt.internal.lifecycle.UIThread.run(UIThread.java:102)
Andreas, could you provide a self-running snippet to reproduce it?
Sure: user the following code as your IEntryPoint.createUI() content. Display display = new Display(); Shell shell = new Shell(display, SWT.NO_TRIM); shell.setLayout(new GridLayout(1, false)); Button button = new Button(shell, SWT.PUSH); button.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false)); button.setText("Test button"); button.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { new Job(""){ @Override protected IStatus run(IProgressMonitor monitor) { try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return Status.OK_STATUS; } }.schedule(); } }); shell.setMaximized(true); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); return 0;
Thanks for the snippet... I can reproduce it now
Created attachment 192545 [details] Proposed patch The JobManagerAdapter (initialized in WorkbenchPlugin#start ) connects the Job APIs with ProgressManager regardless the Workbench is created or not ( Workbench display is set in Workbench#createAndRunWorkbench() ). Thus, the display used by ProgressInfoItem#init ( PlatformUI.getWorkbench().getDisplay() ) is null. As this display is only used for getting the system color, I think it's safe to replace the PlatformUI.getWorkbench().getDisplay() with Display#getCurrent().
+1 works for me.
Applied patch to CVS HEAD.