Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 387002

Summary: Main toolbar not visible when Welcome closed via close box
Product: [Eclipse Project] Platform Reporter: Markus Keller <markus.kell.r>
Component: UIAssignee: Platform UI Triaged <platform-ui-triaged>
Status: VERIFIED FIXED QA Contact:
Severity: normal    
Priority: P3 CC: bsd, daniel_megert, emoffatt, pwebster
Version: 4.2   
Target Milestone: 4.2.1   
Hardware: All   
OS: All   
Whiteboard:
Bug Depends on:    
Bug Blocks: 387197    

Description Markus Keller CLA 2012-08-10 06:55:22 EDT
Broken in I20120808-2000 and also with bug 378835 comment 8. Was OK in 4.2.

- new workspace
- click close box of Welcome tab (do not use the "-> Workbench" arrow button)
=> main toolbar is not visible
Comment 1 Markus Keller CLA 2012-08-10 07:05:56 EDT
Was OK in I20120806-2000 (toolbar was not hidden before bug 378835 comment 6).
Comment 2 Brian de Alwis CLA 2012-08-13 13:27:23 EDT
The problem is that the intro part restores the toolbars as part of its dispose, which is called as a result of PartRenderingEngine#removeGui().  Showing the toolbar calls into PartRenderingEngine#createGui() which exits removeRoot != null.

Daemon Thread [Thread-1] (Suspended)	
	PartRenderingEngine.safeCreateGui(MUIElement, Object, IEclipseContext) line: 534	
	PartRenderingEngine$6.run() line: 518	
	SafeRunner.run(ISafeRunnable) line: 42	
	PartRenderingEngine.createGui(MUIElement, Object, IEclipseContext) line: 503	
	WorkbenchWindow.updateLayoutDataForContents() line: 2394	
	WorkbenchWindow.setCoolBarVisible(boolean) line: 2101	
	ViewIntroAdapterPart.setBarVisibility(boolean) line: 253	
	ViewIntroAdapterPart.dispose() line: 156	
	CompatibilityView(CompatibilityPart).invalidate() line: 209	
	CompatibilityView(CompatibilityPart).destroy() line: 374	
	NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]	
	NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39	
	DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25	
	Method.invoke(Object, Object...) line: 597	
	MethodRequestor.execute() line: 56	
	InjectorImpl.processAnnotated(Class<Annotation>, Object, Class<?>, PrimaryObjectSupplier, PrimaryObjectSupplier, ArrayList<Class<?>>) line: 859	
	InjectorImpl.processAnnotated(Class<Annotation>, Object, Class<?>, PrimaryObjectSupplier, PrimaryObjectSupplier, ArrayList<Class<?>>) line: 839	
	InjectorImpl.uninject(Object, PrimaryObjectSupplier) line: 170	
	FieldRequestor(Requestor).uninject(Object, PrimaryObjectSupplier) line: 137	
	ContextObjectSupplier$ContextInjectionListener.update(IEclipseContext, int, Object[]) line: 82	
	TrackableComputationExt.update(ContextChangeEvent) line: 107	
	EclipseContext.removeListenersTo(Object) line: 449	
	ContextInjectionFactory.uninject(Object, IEclipseContext) line: 143	
	PartRenderingEngine.safeRemoveGui(MUIElement) line: 856	
	PartRenderingEngine.access$3(PartRenderingEngine, MUIElement) line: 775	
	PartRenderingEngine$8.run() line: 770	
	SafeRunner.run(ISafeRunnable) line: 42	
	PartRenderingEngine.removeGui(MUIElement) line: 755	
	ElementReferenceRenderer.disposeWidget(MUIElement) line: 122	
	PartRenderingEngine.safeRemoveGui(MUIElement) line: 847	
	PartRenderingEngine.access$3(PartRenderingEngine, MUIElement) line: 775	
	PartRenderingEngine$8.run() line: 770	
	SafeRunner.run(ISafeRunnable) line: 42	
	PartRenderingEngine.removeGui(MUIElement) line: 755	
	PartRenderingEngine$1.handleEvent(Event) line: 144	
	UIEventHandler$1.run() line: 41	
	UISynchronizer(Synchronizer).syncExec(Runnable) line: 180	
	UISynchronizer.syncExec(Runnable) line: 150	
	Display.syncExec(Runnable) line: 4605	
	E4Application$1.syncExec(Runnable) line: 187	
	UIEventHandler.handleEvent(Event) line: 38	
	EventHandlerWrapper.handleEvent(Event, Permission) line: 197	
	EventHandlerTracker.dispatchEvent(EventHandlerWrapper, Permission, int, Event) line: 197	
	EventHandlerTracker.dispatchEvent(Object, Object, int, Object) line: 1	
	EventManager.dispatchEvent(Set, EventDispatcher, int, Object) line: 230	
	ListenerQueue.dispatchEventSynchronous(int, Object) line: 148	
	EventAdminImpl.dispatchEvent(Event, boolean) line: 135	
	EventAdminImpl.sendEvent(Event) line: 78	
	EventComponent.sendEvent(Event) line: 39	
	EventBroker.send(String, Object) line: 81	
	UIEventPublisher.notifyChanged(Notification) line: 58	
	PlaceholderImpl(BasicNotifierImpl).eNotify(Notification) line: 374	
	PlaceholderImpl(UIElementImpl).setToBeRendered(boolean) line: 290	
	PartServiceImpl.hidePart(MPart, boolean) line: 1094	
	PartServiceImpl.hidePart(MPart) line: 1029	
	StackRenderer.closePart(Widget, boolean) line: 1087	
	StackRenderer.access$9(StackRenderer, Widget, boolean) line: 1069	
	StackRenderer$10.close(CTabFolderEvent) line: 952	
	CTabFolder.onMouse(Event) line: 1810	
	CTabFolder$1.handleEvent(Event) line: 275	
	EventTable.sendEvent(Event) line: 84	
	Display.sendEvent(EventTable, Event) line: 4134	
	CTabFolder(Widget).sendEvent(Event) line: 1458	
	CTabFolder(Widget).sendEvent(int, Event, boolean) line: 1481	
	CTabFolder(Widget).sendEvent(int, Event) line: 1466	
	CTabFolder(Widget).notifyListeners(int, Event) line: 1271	
	Display.runDeferredEvents() line: 3980	
	Display.readAndDispatch() line: 3619	
	PartRenderingEngine$9.run() line: 1029	
	Realm.runWithDefault(Realm, Runnable) line: 332	
	PartRenderingEngine.run(MApplicationElement, IEclipseContext) line: 923	
	E4Workbench.createAndRunUI(MApplicationElement) line: 86	
	Workbench$5.run() line: 592	
	Realm.runWithDefault(Realm, Runnable) line: 332	
	Workbench.createAndRunWorkbench(Display, WorkbenchAdvisor) line: 547	
	PlatformUI.createAndRunWorkbench(Display, WorkbenchAdvisor) line: 149	
	IDEApplication.start(IApplicationContext) line: 124	
	EclipseAppHandle.run(Object) line: 196	
	EclipseAppLauncher.runApplication(Object) line: 110	
	EclipseAppLauncher.start(Object) line: 79	
	EclipseStarter.run(Object) line: 353	
	EclipseStarter.run(String[], Runnable) line: 180	
	NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]	
	NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39	
	DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25	
	Method.invoke(Object, Object...) line: 597	
	Main.invokeFramework(String[], URL[]) line: 629	
	Main.basicRun(String[]) line: 584	
	Main.run(String[]) line: 1438	
	Main.main(String[]) line: 1414
Comment 3 Brian de Alwis CLA 2012-08-13 19:37:27 EDT
Rather than toggle toBeRendered, we now toggle the visibility of the trim area.  This found a bug in the TrimmedPartLayout (bug 387140).

This revealed a different problem where the trim is actually shown when restoring from a saved-state with the trim hidden.  The issue is that WBWRenderer#processContents() uses the three-argument variant of PartRenderingEngine#createGui() which does not reparent the non-visible trim to the limbo shell. Eric's suggestion to change WBWRenderer#processContents() to provide the limbo shell when a trimbar's visible=false unfortunately fails and the trim can never be restored by toggling visible alone.  Toggling the trim's visibility within WBWRenderer#processContents() does work however.

I've committed this workaround (commit 72b0ef42f7222d12f6a096231ea0cfc0a6c15ff6) and opened bug 387161 to remind us to fix the underlying issue.  

In testing, I also discovered that QuickAccessHandler depended on side-effects of the trim area being toggled through toBeRendered.  And also that it was possible for the Hide/Show Toolbar command to get out of sync with the menu state.  Fixed separately as commit a6224173af1e8b15706d80e75516898a52b90a0f.
Comment 4 Dani Megert CLA 2012-08-23 04:05:46 EDT
Verified in M20120822-1200.