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

Bug 528720

Summary: View toolbar is painted on top of the view after switching from editor
Product: [Eclipse Project] Platform Reporter: Simeon Andreev <simeon.danailov.andreev>
Component: UIAssignee: Simeon Andreev <simeon.danailov.andreev>
Status: RESOLVED FIXED QA Contact:
Severity: normal    
Priority: P3 CC: Lars.Vogel, loskutov
Version: 4.6   
Target Milestone: 4.8 M5   
Hardware: All   
OS: All   
See Also: https://bugs.eclipse.org/bugs/show_bug.cgi?id=461573
https://git.eclipse.org/r/113421
https://git.eclipse.org/c/platform/eclipse.platform.ui.git/commit/?id=f04cfac91455c1a1d708851c5b29861ddfb54625
https://bugs.eclipse.org/bugs/show_bug.cgi?id=543121
Whiteboard:
Attachments:
Description Flags
Screenshot showing the view toolbar painted over the Variables View. none

Description Simeon Andreev CLA 2017-12-13 10:09:18 EST
Created attachment 271890 [details]
Screenshot showing the view toolbar painted over the Variables View.

When switching between an editor and a view with a toolbar, the toolbar of the view is painted over content of the view itself.

This can be observed only if:

* the editor and the view are in the same part stack
* the part stack has small enough area for the view toolbar to be rendered in the view area (and not in the part stack tab area)

Steps to reproduce:

1. Open a text file.
2. Open the Variables View, move it to the same part stack as the text editor.
3. Resize Eclipse window / part stacks, to ensure the toolbar of the Variables View is drawn in the view area.
4. Switch between the text editor and the Variables View.
5. Observe that the toolbar of the Variables View is painted on top of the view.


Observed both on RHEL 7.2 (GTK 3.14) and Windows 10.


Eclipse version:

Eclipse SDK

Version: Photon (4.8)
Build id: I20171129-2000
Comment 1 Simeon Andreev CLA 2017-12-14 08:57:30 EST
The view with the overlapping toolbar is missing a deferred layout update, when switching from an editor.

When switching from another view, this layout is queued here:

	at org.eclipse.swt.widgets.Display.addLayoutDeferred(Display.java:636)
	at org.eclipse.swt.widgets.Composite.layout(Composite.java:1165)
	at org.eclipse.swt.widgets.Control.requestLayout(Control.java:3994)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.subscribeVisibilityHandler(PartRenderingEngine.java:225)
	at sun.reflect.GeneratedMethodAccessor18.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55)
	at org.eclipse.e4.core.di.internal.extensions.EventObjectSupplier$DIEventHandler.handleEvent(EventObjectSupplier.java:88)
	at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:201)
	at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:196)
	at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1)
	at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
	at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
	at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:135)
	at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:78)
	at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:39)
	at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:52)
	at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:60)
	at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:374)
	at org.eclipse.e4.ui.model.application.ui.impl.UIElementImpl.setVisible(UIElementImpl.java:345)
	at org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer.adjustTopRight(StackRenderer.java:765)
	at org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer.showTab(StackRenderer.java:1309)
	at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer.lambda$0(LazyStackRenderer.java:68)
	at org.eclipse.e4.ui.services.internal.events.UIEventHandler$1.run(UIEventHandler.java:40)
	at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:233)
	at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:144)
	at org.eclipse.swt.widgets.Display.syncExec(Display.java:5791)
	at org.eclipse.e4.ui.internal.workbench.swt.E4Application$1.syncExec(E4Application.java:212)
	at org.eclipse.e4.ui.services.internal.events.UIEventHandler.handleEvent(UIEventHandler.java:36)
	at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:201)
	at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:196)
	at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1)
	at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
	at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
	at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:135)
	at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:78)
	at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:39)
	at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:52)
	at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:60)
	at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:374)
	at org.eclipse.e4.ui.model.application.ui.impl.ElementContainerImpl.setSelectedElement(ElementContainerImpl.java:173)
	at org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer$3.widgetSelected(StackRenderer.java:1053)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:86)
	at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5604)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1363)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1389)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1372)
	at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:1157)
	at org.eclipse.swt.custom.CTabFolder.setSelection(CTabFolder.java:3195)
	at org.eclipse.swt.custom.CTabFolder.onMouse(CTabFolder.java:1878)
	at org.eclipse.swt.custom.CTabFolder.lambda$0(CTabFolder.java:328)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:86)
	at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5604)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1363)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4857)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4438)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1150)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1039)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153)
	at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:681)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:595)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:152)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:653)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:590)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1499)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1472)
Comment 2 Eclipse Genie CLA 2017-12-14 09:52:22 EST
New Gerrit change created: https://git.eclipse.org/r/113421
Comment 3 Simeon Andreev CLA 2017-12-14 09:55:50 EST
StackRenderer.adjustTopRight hides the toolbar of the current view, before showing another view. This causes a layout update for the current view.

However, when switching from an Editor, this is not done: editors have no toolbar.

Patch suggestion is to improve the fix for Bug 461573, by requesting a deferred view layout update. As opposed to updating the layout directly before playing with the view toolbar position.
Comment 5 Andrey Loskutov CLA 2017-12-14 11:07:41 EST
Thanks.
Comment 6 Dani Megert CLA 2019-01-18 08:47:30 EST
*** Bug 512358 has been marked as a duplicate of this bug. ***