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

Bug 318893

Summary: [implementation] NPE in SourceViewer
Product: [Eclipse Project] Platform Reporter: Mathieu Velten <mathieu.velten>
Component: TextAssignee: Markus Keller <markus.kell.r>
Status: VERIFIED FIXED QA Contact:
Severity: major    
Priority: P3 CC: daniel_megert, faure.tristan, hihn, raksha.vasisht, remy.suen
Version: 3.6Flags: daniel_megert: review+
Target Milestone: 3.6.1   
Hardware: PC   
OS: Windows XP   
Whiteboard:
Attachments:
Description Flags
Fix daniel_megert: review+

Description Mathieu Velten CLA 2010-07-05 09:42:33 EDT
Build Identifier: 20100617-1415

I am getting a NPE when the text widget attached to a SourceViewer doesn't have a vertical scrollbar (getVerticalBar returns null).

It looks like some code added in helios doesn't check getVerticalBar against null before using it.

here is the stacktrace :

java.lang.NullPointerException
at org.eclipse.jface.text.source.SourceViewer$RulerLayout.computeScrollArrowHeights(SourceViewer.java:217)
at org.eclipse.jface.text.source.SourceViewer$RulerLayout.getVerticalScrollArrowHeights(SourceViewer.java:183)
at org.eclipse.jface.text.source.SourceViewer$RulerLayout.layout(SourceViewer.java:155)
at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1275)
at org.eclipse.swt.widgets.Composite.sendResize(Composite.java:979)
at org.eclipse.swt.widgets.Composite.setBounds(Composite.java:1024)
at org.eclipse.swt.widgets.Control.setBounds(Control.java:2777)
at org.eclipse.swt.widgets.Control.setBounds(Control.java:2773)
at org.eclipse.swt.layout.FillLayout.layout(FillLayout.java:201)
at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1275)
at org.eclipse.swt.widgets.Composite.WM_SIZE(Composite.java:1664)
at org.eclipse.swt.widgets.Control.windowProc(Control.java:4234)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:4873)
at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:2454)
at org.eclipse.swt.widgets.Scrollable.callWindowProc(Scrollable.java:80)
at org.eclipse.swt.widgets.Control.WM_WINDOWPOSCHANGED(Control.java:4970)
at org.eclipse.swt.widgets.Control.windowProc(Control.java:4244)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:4886)
at org.eclipse.swt.internal.win32.OS.EndDeferWindowPos(Native Method)
at org.eclipse.swt.widgets.Composite.resizeChildren(Composite.java:948)
at org.eclipse.swt.widgets.Composite.resizeChildren(Composite.java:914)
at org.eclipse.swt.widgets.Composite.setResizeChildren(Composite.java:1138)
at org.eclipse.swt.widgets.Composite.WM_SIZE(Composite.java:1668)
at org.eclipse.swt.widgets.Control.windowProc(Control.java:4234)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:4873)
at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:2454)
at org.eclipse.swt.widgets.Scrollable.callWindowProc(Scrollable.java:80)
at org.eclipse.swt.widgets.Control.WM_WINDOWPOSCHANGED(Control.java:4970)
at org.eclipse.swt.widgets.Control.windowProc(Control.java:4244)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:4873)
at org.eclipse.swt.internal.win32.OS.SetWindowPos(Native Method)
at org.eclipse.swt.widgets.Widget.SetWindowPos(Widget.java:1456)
at org.eclipse.swt.widgets.Control.setBounds(Control.java:2816)
at org.eclipse.swt.widgets.Composite.setBounds(Composite.java:1018)
at org.eclipse.swt.widgets.Control.setBounds(Control.java:2777)
at org.eclipse.swt.widgets.Control.setBounds(Control.java:2773)
at org.eclipse.swt.layout.FillLayout.layout(FillLayout.java:201)
at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1275)
at org.eclipse.swt.widgets.Composite.WM_SIZE(Composite.java:1664)
at org.eclipse.swt.widgets.Control.windowProc(Control.java:4234)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:4873)
at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:2454)
at org.eclipse.swt.widgets.Scrollable.callWindowProc(Scrollable.java:80)
at org.eclipse.swt.widgets.Control.WM_WINDOWPOSCHANGED(Control.java:4970)
at org.eclipse.swt.widgets.Control.windowProc(Control.java:4244)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:4886)
at org.eclipse.swt.internal.win32.OS.EndDeferWindowPos(Native Method)
at org.eclipse.swt.widgets.Composite.resizeChildren(Composite.java:948)
at org.eclipse.swt.widgets.Composite.resizeChildren(Composite.java:914)
at org.eclipse.swt.widgets.Composite.setResizeChildren(Composite.java:1138)
at org.eclipse.swt.widgets.Composite.WM_SIZE(Composite.java:1668)
at org.eclipse.swt.widgets.Control.windowProc(Control.java:4234)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:4873)
at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:2454)
at org.eclipse.swt.widgets.Scrollable.callWindowProc(Scrollable.java:80)
at org.eclipse.swt.widgets.Control.WM_WINDOWPOSCHANGED(Control.java:4970)
at org.eclipse.swt.widgets.Control.windowProc(Control.java:4244)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:4873)
at org.eclipse.swt.internal.win32.OS.SetWindowPos(Native Method)
at org.eclipse.swt.widgets.Widget.SetWindowPos(Widget.java:1456)
at org.eclipse.swt.widgets.Control.setBounds(Control.java:2816)
at org.eclipse.swt.widgets.Composite.setBounds(Composite.java:1018)
at org.eclipse.swt.widgets.Control.setBounds(Control.java:2777)
at org.eclipse.swt.widgets.Control.setBounds(Control.java:2773)
at org.eclipse.swt.layout.FillLayout.layout(FillLayout.java:201)
at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1275)
at org.eclipse.swt.widgets.Composite.WM_SIZE(Composite.java:1664)
at org.eclipse.swt.widgets.Control.windowProc(Control.java:4234)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:4873)
at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:2454)
at org.eclipse.swt.widgets.Scrollable.callWindowProc(Scrollable.java:80)
at org.eclipse.swt.widgets.Control.WM_WINDOWPOSCHANGED(Control.java:4970)
at org.eclipse.swt.widgets.Control.windowProc(Control.java:4244)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:4873)
at org.eclipse.swt.internal.win32.OS.SetWindowPos(Native Method)
at org.eclipse.swt.widgets.Widget.SetWindowPos(Widget.java:1456)
at org.eclipse.swt.widgets.Control.setBounds(Control.java:2816)
at org.eclipse.swt.widgets.Composite.setBounds(Composite.java:1018)
at org.eclipse.swt.widgets.Control.setBounds(Control.java:2777)
at org.eclipse.swt.widgets.Control.setBounds(Control.java:2773)
at org.eclipse.swt.widgets.Control.setBounds(Control.java:2840)
at org.eclipse.swt.layout.FormLayout.layout(FormLayout.java:358)
at org.eclipse.swt.layout.FormLayout.layout(FormLayout.java:286)
at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1275)
at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1261)
at org.eclipse.swt.widgets.Composite.layout(Composite.java:664)
at org.eclipse.swt.widgets.Composite.layout(Composite.java:622)
at org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage$SelectionChangedListener.selectionChanged(TabbedPropertySheetPage.java:224)
at org.eclipse.jface.viewers.Viewer$2.run(Viewer.java:162)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:49)
at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175)
at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:160)
at org.eclipse.jface.viewers.StructuredViewer.updateSelection(StructuredViewer.java:2162)
at org.eclipse.jface.viewers.StructuredViewer.handleSelect(StructuredViewer.java:1190)
at org.eclipse.jface.viewers.StructuredViewer$4.widgetSelected(StructuredViewer.java:1220)
at org.eclipse.jface.util.OpenStrategy.fireSelectionEvent(OpenStrategy.java:228)
at org.eclipse.jface.util.OpenStrategy.access$4(OpenStrategy.java:222)
at org.eclipse.jface.util.OpenStrategy$1.handleEvent(OpenStrategy.java:389)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1062)
at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:774)
at org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyList.select(TabbedPropertyList.java:664)
at org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyViewer.setSelectionToWidget(TabbedPropertyViewer.java:122)
at org.eclipse.jface.viewers.StructuredViewer.setSelectionToWidget(StructuredViewer.java:1741)
at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1697)
at org.eclipse.jface.viewers.Viewer.setSelection(Viewer.java:392)
at org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage.setInput(TabbedPropertySheetPage.java:736)
at org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage.selectionChanged(TabbedPropertySheetPage.java:555)
at org.topcased.tabbedproperties.AbstractTabbedPropertySheetPage.selectionChanged(AbstractTabbedPropertySheetPage.java:124)
at org.eclipse.ui.views.properties.PropertySheet.selectionChanged(PropertySheet.java:365)
at org.eclipse.ui.internal.AbstractSelectionService.fireSelection(AbstractSelectionService.java:156)
at org.eclipse.ui.internal.AbstractSelectionService$1.selectionChanged(AbstractSelectionService.java:62)
at org.eclipse.gmf.runtime.diagram.ui.parts.DiagramGraphicalViewer.flushSelectionEvents(DiagramGraphicalViewer.java:269)
at org.eclipse.gmf.runtime.diagram.ui.parts.DiagramGraphicalViewer$1.run(DiagramGraphicalViewer.java:247)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:134)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4041)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3660)
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2629)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2593)
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2427)
at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:670)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:663)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:115)
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(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:619)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:574)
at org.eclipse.equinox.launcher.Main.run(Main.java:1407)
at org.eclipse.equinox.launcher.Main.main(Main.java:1383)



Reproducible: Always
Comment 1 Remy Suen CLA 2010-07-05 09:48:57 EDT
JFace Text code is owned by Platform/Text.
Comment 2 Mathieu Velten CLA 2010-07-05 09:51:32 EDT
thanks, changed.
Comment 3 Dani Megert CLA 2010-07-05 10:05:23 EDT
Do you have steps to reproduce?
Comment 4 Markus Keller CLA 2010-07-05 10:32:53 EDT
> Do you have steps to reproduce?

It's OK, can easily be reproduced by adding
 		styles &= ~SWT.V_SCROLL;
in front of
		createControl(parent, styles);
in the constructor of SourceViewer.
Comment 5 Markus Keller CLA 2010-07-05 11:05:48 EDT
Created attachment 173441 [details]
Fix

An additional problem occurs when both scrollbars are hidden, e.g. with:
		styles &= ~(SWT.V_SCROLL | SWT.H_SCROLL);

In that case, the header control (that shows if a file contains an error/warning) is not visible any more. Fix is in RulerLayout#layout(..).
Comment 6 Markus Keller CLA 2010-07-05 11:11:16 EDT
Fix released to HEAD.
Comment 7 Mathieu Velten CLA 2010-07-06 08:02:01 EDT
thanks for the quick fix, it works.
Comment 8 Markus Keller CLA 2010-08-17 12:54:08 EDT
Released to R3_6_maintenance.
Comment 9 Dani Megert CLA 2010-08-26 03:32:05 EDT
Starting verification...
Comment 10 Raksha Vasisht CLA 2010-08-26 03:38:08 EDT
Verified for 3.6.1 RC2 with M20100825-0800.
Comment 11 Dani Megert CLA 2010-08-26 04:09:54 EDT
Verified on Windows 7 using M20100825-0800.