【问题标题】:Eclipse XML editor in RCP Application Not workingRCP 应用程序中的 Eclipse XML 编辑器不工作
【发布时间】:2019-09-25 14:41:23
【问题描述】:

我正在尝试在我的 RCP 应用程序中使用 Eclipse 默认 XML 编辑器。我从

得到这段代码

https://wiki.eclipse.org/FAQ_How_do_I_open_an_editor_on_something_that_is_not_a_file%3F

所以我创建了 StringStorage 和 StringInput,就像链接中提供的那样。

继续运行 面向 RCP 和 RAP 开发人员的 Eclipse IDE

版本:2019-06 (4.12.0) 内部版本号:20190614-1200

jdk1.8.0_121


import java.io.ByteArrayInputStream;
import java.io.InputStream;

import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;

public class StringStorage implements IStorage{

    private String string;

      StringStorage(String input) {
        this.string = input;
      }

      public InputStream getContents() throws CoreException {
        return new ByteArrayInputStream(string.getBytes());
      }

      public IPath getFullPath() {
        return null;
      }

      public Object getAdapter(Class adapter) {
        return null;
      }

      public String getName() {

        return string;
      }

      public boolean isReadOnly() {
        return true;
      }
}
import org.eclipse.core.resources.IStorage;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IPersistableElement;
import org.eclipse.ui.IStorageEditorInput;

public class StringInput implements IStorageEditorInput {
    private IStorage storage;
    StringInput(IStorage storage) {this.storage = storage;}
    public boolean exists() {return true;}
    public ImageDescriptor getImageDescriptor() {return null;}
    public String getName() {
       return storage.getName();
    }
    public IPersistableElement getPersistable() {return null;}
    public IStorage getStorage() {
       return storage;
    }
    public String getToolTipText() {
       return "String-based file: " + storage.getName();
    }
    public Object getAdapter(Class adapter) {
      return null;
    }
 }

现在而不是在链接中调用编辑器 ID“org.eclipse.ui.DefaultTextEditor”。我想调用我在 plugin.xml 扩展中创建的自定义编辑器。

因为我想将控制权交给扩展 XMLMultiPageEditorPart 的类,所以我在我的应用程序中获得了“设计”和“源”选项卡类型的 XML 编辑器来显示 SCXML 文件(状态图 XML)

IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IStorage storage = new StringStorage((String)o);
IStorageEditorInput input = new StringInput(storage);
page.openEditor(input, "org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart");

这是我的类扩展 XMLMultiPageEditorPart

import org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart;

public class MyXMLEditor  extends XMLMultiPageEditorPart {



}

现在我将向您展示 plugin.xml 的一部分

<editor

            contributorClass="org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorActionBarContributor"
            default="true"
            id="org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart"
            name="XML_Editor.name"
            symbolicFontName="org.eclipse.wst.sse.ui.textfont">
            <class class="org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart">
                <parameter name="org.eclipse.wst.sse.ui.unsupported_preferred_default" value="org.eclipse.wst.xml.core.xmlsource"/>
            </class>

            <contentTypeBinding
                contentTypeId="org.eclipse.core.runtime.xml" />
            <contentTypeBinding
                contentTypeId="org.eclipse.wst.xml.core.xmlsource" />
      </editor>

对于 secondcontentType,我收到此黄色警告 >> 无法找到属性“contentTypeId”中的引用标识符“org.eclipse.wst.xml.core.xmlsource”

最后这是 Manifest.mf

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: V2
Bundle-SymbolicName: generic.layer.editor.v2;singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-ClassPath: .,
 ./lib/apache-commons-lang.jar,
 ./lib/ezmorph-1.0.6.jar,
 ./lib/org-apache-commons-logging.jar,
 ./lib/org.apache.commons.collections.jar,
 ./lib/commons-beanutils-1.9.2.jar,
 ./lib/commons-collections4-4.1.jar,
 ./lib/javax.json-1.0.jar,
 ./lib/json-lib-2.4-jdk15-sources.jar,
 ./lib/jdom-2.0.5-contrib.jar,
 ./lib/jdom-2.0.5-sources.jar,
 ./lib/jdom-2.0.5.jar,
 ./lib/mockito-core-2.13.0.jar,
 ./lib/dtd-xercesImpl.jar,
 lib/spring/spring-core-5.1.4.RELEASE.jar,
 lib/spring/spring-web-3.1.3.RELEASE.jar,
 lib/commons-logging-1.2.jar,
 lib/gson-2.8.2.jar,
 lib/javax.json-api.jar,
 lib/org.eclipse.wst.sse.ui_1.6.0.v201905291408.jar,
 lib/org.eclipse.wst.sse.core_1.2.100.v201901310548.jar,
 lib/org.eclipse.wst.xml.ui_1.2.300.v201904272112.jar
Bundle-Activator: generic.layer.editor.v2.Activator
Import-Package:  javax.xml.stream
 org.eclipse.core.resources,
 org.eclipse.core.runtime,
 org.eclipse.emf.common.util,
 org.eclipse.jface.text,
 org.eclipse.jface.text.information,
 org.eclipse.jface.text.source,
 org.eclipse.swt.widgets,
 org.eclipse.ui,
 org.eclipse.ui.editors.text,
 org.eclipse.ui.forms,
 org.eclipse.ui.forms.editor,
 org.eclipse.ui.forms.widgets,
 org.eclipse.ui.ide,
 org.eclipse.ui.internal.views.markers,
 org.eclipse.ui.navigator,
 org.eclipse.ui.navigator.resources,
 org.eclipse.ui.part,
 org.eclipse.ui.texteditor,
 org.eclipse.ui.views.contentoutline,
 org.eclipse.wst.sse.ui
Bundle-ActivationPolicy: lazy
Require-Bundle: org.eclipse.ui,
 org.eclipse.core.runtime;bundle-version="3.7.0",
 org.eclipse.ui.forms;bundle-version="3.5.100",
 org.eclipse.zest.core,
 org.eclipse.zest.layouts,
 org.eclipse.osgi.services,
 org.eclipse.core.resources;bundle-version="3.10.1",
 org.apache.commons.io;bundle-version="2.2.0",
 org.apache.commons.lang;bundle-version="2.6.0",
 org.junit, 
 org.eclipse.compare.core;bundle-version="3.6.100",
 org.eclipse.compare;bundle-version="3.7.101"
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Export-Package: 
 generic.layer.editor.v2.services,
 org.apache.commons.collections,
 org.apache.commons.collections.bag,
 org.apache.commons.collections.bidimap,
 org.apache.commons.collections.buffer,
 org.apache.commons.collections.collection,
 org.apache.commons.collections.comparators,
 org.apache.commons.collections.functors,
 org.apache.commons.collections.iterators,
 org.apache.commons.collections.keyvalue,
 org.apache.commons.collections.list,
 org.apache.commons.collections.map,
 org.apache.commons.collections.set,
 org.apache.commons.lang,
 org.apache.commons.lang.builder,
 org.apache.commons.lang.enum,
 org.apache.commons.lang.enums,
 org.apache.commons.lang.exception,
 org.apache.commons.lang.math,
 org.apache.commons.lang.mutable,
 org.apache.commons.lang.reflect,
 org.apache.commons.lang.text,
 org.apache.commons.lang.time,
 org.apache.commons.logging,
 org.apache.commons.logging.impl,
 org.eclipse.wst.sse.core,
 org.eclipse.wst.sse.ui,
 org.eclipse.wst.xml.ui
Bundle-Vendor: XILO

当我尝试使用 .scxml 文件加载我的视图并期望 Eclipse XML 编辑器出现时。我在控制台上遇到错误。

!ENTRY org.eclipse.e4.ui.workbench 4 0 2019-09-26 11:21:12.102
!MESSAGE 
!STACK 0
java.lang.NullPointerException
    at org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart$PageInitializationData.sendInitializationData(XMLMultiPageEditorPart.java:328)
    at org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart.createSourcePage(XMLMultiPageEditorPart.java:841)
    at org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart.createPages(XMLMultiPageEditorPart.java:770)
    at org.eclipse.ui.part.MultiPageEditorPart.createPartControl(MultiPageEditorPart.java:348)
    at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.createPartControl(CompatibilityPart.java:151)
    at org.eclipse.ui.internal.e4.compatibility.CompatibilityEditor.createPartControl(CompatibilityEditor.java:99)
    at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.create(CompatibilityPart.java:355)
    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.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55)
    at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:990)
    at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:955)
    at org.eclipse.e4.core.internal.di.InjectorImpl.inject(InjectorImpl.java:124)
    at org.eclipse.e4.core.internal.di.InjectorImpl.internalMake(InjectorImpl.java:399)
    at org.eclipse.e4.core.internal.di.InjectorImpl.make(InjectorImpl.java:318)
    at org.eclipse.e4.core.contexts.ContextInjectionFactory.make(ContextInjectionFactory.java:162)
    at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.createFromBundle(ReflectionContributionFactory.java:105)
    at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.doCreate(ReflectionContributionFactory.java:74)
    at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.create(ReflectionContributionFactory.java:56)
    at org.eclipse.e4.ui.workbench.renderers.swt.ContributedPartRenderer.createWidget(ContributedPartRenderer.java:129)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createWidget(PartRenderingEngine.java:992)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:661)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:767)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$0(PartRenderingEngine.java:738)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:732)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:716)
    at org.eclipse.e4.ui.internal.workbench.PartServiceImpl$1.handleEvent(PartServiceImpl.java:104)
    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:4889)
    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:197)
    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.internal.workbench.ModelServiceImpl.showElementInWindow(ModelServiceImpl.java:620)
    at org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.bringToTop(ModelServiceImpl.java:584)
    at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.delegateBringToTop(PartServiceImpl.java:769)
    at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.bringToTop(PartServiceImpl.java:401)
    at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.showPart(PartServiceImpl.java:1188)
    at org.eclipse.ui.internal.WorkbenchPage.busyOpenEditor(WorkbenchPage.java:3261)
    at org.eclipse.ui.internal.WorkbenchPage.access$25(WorkbenchPage.java:3176)
    at org.eclipse.ui.internal.WorkbenchPage$10.run(WorkbenchPage.java:3158)
    at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
    at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:3153)
    at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:3117)
    at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:3098)
    at generic.layer.editor.v2.SCXMLView$1$1.run(SCXMLView.java:117)
    at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:37)
    at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182)
    at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4213)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3820)
    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:680)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:594)
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148)
    at generic.layer.editor.v2.Application.start(Application.java:21)
    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)

你能指出我做错了什么吗?如果您需要更多信息,请告诉我。感谢你的帮助。谢谢

【问题讨论】:

  • XMLMultiPageEditorPart 是一个 internal 类。你试图像这样扩展它,破坏了Eclipse API Rules of Engagement
  • @greg-449 我了解这里的风险。仅供内部使用。
  • @greg-449 是否有非常好的 inbuit XML 编辑器可以在 RCP 中使用,它可以跨平台(windows、linux、Mac)以很好的方式显示 XML/SCXML?感谢您是否知道此任务的另一个正确替代方案
  • 大多数人只使用 WST XML 编辑器(您正在查看的那个)。如果您想编辑不同的文件类型,您所要做的就是添加文件关联,而不是新的编辑器。如果您尝试在没有文件的情况下编辑“存储中”数据,问题将是许多编辑者希望输入为IFileEditorInputIURIEditorInput
  • 查看org.eclipse.core.contenttype.contentTypes 扩展点的file-assocation 部分。 Eclipse 帮助中有大量信息。

标签: xml eclipse-plugin eclipse-rcp rich-text-editor


【解决方案1】:

该类期待其自己的编辑器扩展声明的初始化数据:https://github.com/eclipse/webtools.sourceediting/blob/master/xml/bundles/org.eclipse.wst.xml.ui/plugin.xml#L324(它控制打开不受支持的文件类型时发生的情况)。您实际上不需要定义新的编辑器,只需传入现有编辑器的 ID。

【讨论】:

  • 你的意思是我改成这样 page.openEditor(input, "org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart");并从 plugin.xml 中删除我的 MyXMLEditor 类和条目?
  • 除非您真的想定义自己的编辑器,否则是的。确保在测试时清理启动器中的配置空间,以便拾取挂钩。
  • 我按照您的建议更新了代码,并在 plugin.xml 中为编辑器添加了新条目,就像您的代码一样,但我遇到了同样的错误。我用新的变化更新了这个问题。我感谢您的帮助。还有一个问题,是否有非常好的 inbuit XML 编辑器可以在 RCP 中使用,它以很好的方式跨平台(windows、linux、Mac)显示 XML/SCXML。我的意思是我很乐意使用另一个 XML 编辑器而不是 Eclipse XML 编辑器,如果它以适当的有用格式显示此类文件。
  • 您的 plugin.xml 是否使用与现有 XML 编辑器相同的 ID 定义其编辑器?不应该。
  • 您共享的代码使用与现有 XML 编辑器相同的 ID,因此我使用了相同的 ID。我以任何方式更改并为其赋予了新的唯一 ID,但没有发生错误更改。
猜你喜欢
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 2022-01-14
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多