【问题标题】:How to embed Eclipse CDT CSourceViewer inside SWT composite如何在 SWT 复合中嵌入 Eclipse CDT CSourceViewer
【发布时间】:2016-06-02 09:12:18
【问题描述】:

我已经在 Eclipse 中设置了一个多页面编辑器插件,并希望将 Eclipse CDT 中的 CSourceViewer 嵌入到一个页面中,该页面还有一些其他元素,如按钮等。最简单的方法是什么?我尝试了类似以下的方法,但是当我尝试在源代码查看器中键入内容时,这会导致空指针异常。

    CTextTools textTools= CUIPlugin.getDefault().getTextTools();
    IPreferenceStore store = CUIPlugin.getDefault().getCombinedPreferenceStore();
    CSourceViewer viewer = new CSourceViewer(composite, null, null, false, SWT.MULTI|SWT.V_SCROLL|SWT.H_SCROLL| SWT.FULL_SELECTION, CUIPlugin.getDefault().getPreferenceStore());
    viewer.configure(new CSourceViewerConfiguration(textTools.getColorManager(), store, null, textTools.getDocumentPartitioning()));
    gd = new GridData(SWT.FILL, SWT.FILL, true, true);
    gd.heightHint = 200;
    gd.widthHint = 300;
    viewer.getControl().setLayoutData(gd);

它适用于普通的源代码查看器。但是 CDT CSourceViewer 可以很好地获得语法高亮等。

堆栈跟踪:

java.lang.NullPointerException
at org.eclipse.jface.text.source.projection.ProjectionViewer.handleVerifyEvent(ProjectionViewer.java:1264)
at org.eclipse.jface.text.TextViewer$TextVerifyListener.verifyText(TextViewer.java:437)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:273)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4362)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1113)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1137)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1122)
at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:788)
at org.eclipse.swt.custom.StyledText.modifyContent(StyledText.java:7273)
at org.eclipse.swt.custom.StyledText.sendKeyEvent(StyledText.java:8156)
at org.eclipse.swt.custom.StyledText.doContent(StyledText.java:2502)
at org.eclipse.swt.custom.StyledText.handleKey(StyledText.java:5964)
at org.eclipse.swt.custom.StyledText.handleKeyDown(StyledText.java:5995)
at org.eclipse.swt.custom.StyledText$7.handleEvent(StyledText.java:5682)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4362)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1113)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1137)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1122)
at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1164)
at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1160)
at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1581)
at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4795)
at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:343)
at org.eclipse.swt.widgets.Control.windowProc(Control.java:4676)
at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:339)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:5050)
at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2549)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3767)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1127)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:337)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1018)
at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:156)
at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:654)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:337)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:598)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:139)
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:380)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235)
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:669)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:608)
at org.eclipse.equinox.launcher.Main.run(Main.java:1515)
at org.eclipse.equinox.launcher.Main.main(Main.java:1488)

【问题讨论】:

  • 请提供 NPE 堆栈跟踪,这将有助于诊断问题。
  • @JonahGraham 我添加了堆栈跟踪。但在深入分析之前,我希望有人可以判断我试图实现这一目标的方式是正确的还是完全错误的。
  • 你在正确的轨道上,所以分析一下。

标签: java eclipse swt eclipse-cdt


【解决方案1】:

问题是查看器的文档未设置,因此为空。添加以下内容即可解决:

    Document document = new Document("class Test { };");
    textTools.setupCDocument(document);
    viewer.setDocument(document);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2017-08-06
    • 1970-01-01
    • 2023-04-08
    • 2013-05-27
    相关资源
    最近更新 更多