Bug 375694

Summary: TextFlow: StringOutOfBoundsException
Product: [Tools] GEF Reporter: Urs Breu <login>
Component: GEF-Legacy Draw2dAssignee: gef-inbox <gef-inbox>
Status: NEW --- QA Contact:
Severity: normal    
Priority: P3    
Version: unspecified   
Target Milestone: ---   
Hardware: PC   
OS: All   
Whiteboard:

Description Urs Breu CLA 2012-03-30 05:05:21 EDT
Build Identifier: 3.6.2.v20110128-0100

We have a org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel which uses a TextFlow.
This label is updated from a non-UI Thread via Display.asyncExec(). Normally this works fine, i.e. setting the text makes the label invalid and forces correct calculation of the text flow and revalidation. However, there are situations where the Thumbnail (visible in an Outline) update code calls paint() and forces the TextFlow to paint itself even though the label/flow is currently invalid. Thus we can run into a StringIndexOutOfBoundsException because the new text has been set, but the flow has not be recalculated yet.

org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.StringIndexOutOfBoundsException: String index out of range: 5)
at org.eclipse.swt.SWT.error(SWT.java:4083)
at org.eclipse.swt.SWT.error(SWT.java:3998)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:137)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3593)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3286)
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2640)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2604)
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2438)
at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:671)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:664)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at ch.belimo.bd.application.Application.start(Application.java:149)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:620)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:575)
at org.eclipse.equinox.launcher.Main.run(Main.java:1408)
at org.eclipse.equinox.launcher.Main.main(Main.java:1384)
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: 5
at java.lang.String.substring(String.java:1934)
at org.eclipse.draw2d.text.TextFlow.getBidiSubstring(TextFlow.java:223)
at org.eclipse.gmf.runtime.draw2d.ui.text.TextFlowEx.paintFigure(TextFlowEx.java:157)
at org.eclipse.draw2d.Figure.paint(Figure.java:1115)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1197)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1206)
at org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel.paintClientArea(WrappingLabel.java:1104)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.gmf.runtime.diagram.ui.internal.figures.BorderItemContainerFigure.paintClientArea(BorderItemContainerFigure.java:85)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1197)
at org.eclipse.draw2d.Viewport.paintClientArea(Viewport.java:160)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1206)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1197)
at org.eclipse.draw2d.Viewport.paintClientArea(Viewport.java:160)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1206)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1197)
at org.eclipse.draw2d.Viewport.paintClientArea(Viewport.java:160)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1206)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1197)
at org.eclipse.draw2d.Viewport.paintClientArea(Viewport.java:160)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1206)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.Figure.paintChildren(Figure.java:1167)
at org.eclipse.draw2d.Figure.paintClientArea(Figure.java:1202)
at org.eclipse.draw2d.ScalableFreeformLayeredPane.paintClientArea(ScalableFreeformLayeredPane.java:60)
at org.eclipse.gmf.runtime.draw2d.ui.internal.graphics.ScalableFreeformLayeredPane.paintClientArea(ScalableFreeformLayeredPane.java:82)
at org.eclipse.draw2d.Figure.paint(Figure.java:1117)
at org.eclipse.draw2d.parts.Thumbnail$ThumbnailUpdater.run(Thumbnail.java:166)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:134)
... 23 more

Reproducible: Sometimes

Steps to Reproduce:
1. Create a graphical editor with an outline
2. Update the text of a WrappingLabel from a non-UI thread
Comment 1 Willem Duminy CLA 2012-12-02 13:30:40 EST
TextFlowEx (from gmf) computes the TextFragmentBox and passes it on TextFlow.  There are some differences in that calculation between the code of TextFlow and TextFlowEx (I picked this up using online code grep).  Maybe the problem is in TextFlowEx?