Eclipse插件 - 与文件扩展名和透视图相关联的编辑器

3
我正在开发两个Eclipse插件,遇到了以下问题:
我有两个管理相同文件的透视图。 我想建立文件扩展名 -编辑器 - 透视图之间的关联。
我的意思是,如果我在透视图1中打开扩展名为.XXX的文件,它将使用编辑器A,但是如果我在透视图2中打开相同的扩展名为.XXX的文件,则它将使用编辑器B。
这是否可能? 到目前为止,我使用了启动器,但现在我需要更多的差异化。
谢谢。

1
你确定这符合透视图的UI指南吗?我不确定用户是否会期望这样,我从未见过在同一操作中打开不同的编辑器,仅基于当前透视图。此外,我自己正在创建许多透视图。我该如何选择在每个透视图中使用哪个编辑器? - Henrik Heimbuerger
我有两个插件(每个插件一个透视图)。一个是用于使用gef编辑器进行设计,另一个是用于使用设计进行开发。一些用户可能会安装两个插件,并且他们需要在两个编辑器中打开相同的文件(取决于他们是否处于设计透视图或开发者透视图中)。 - Rafael
这对于JavaScript编辑器是有意义的,但在浏览器和服务器端可能会有所不同。对于这个问题投了赞成票。目前还没有真正的答案。 - Paul Verest
有没有可能为“透视图改变”这样的事件设置处理程序,然后在此事件中通过编程方式更改与该扩展相关联的默认编辑器?有更好的方法吗? - Paul Verest
4个回答

4
抱歉,这是其中一个“不要那样做!”的答案。如评论中所述,我建议不要根据当前视角打开不同的编辑器。我认为这违反了用户的期望,并且会产生一些不直观的后果,例如当我创建自己的视角时。
我建议走Eclipse的XML/插件清单编辑器的路线。例如,在底部的选项卡允许用户在不受任何视角选择或配置的影响下选择不同的视图。
(以下是示例图片)

2

虽然我同意,对于基于相同文件的默认编辑器在不同的视角下有所不同似乎有些奇怪,但是以下是您可以做到的方法。

  1. 创建两个新的内容类型扩展
  2. 将第一个编辑器注册为第一个新内容类型的默认编辑器
  3. 将第二个编辑器注册为第二个新内容类型的默认编辑器
  4. 对于每种内容类型,您都有一个“内容类型描述符”。在这些描述符类中,它会检查活动工作台页面的当前视角ID,如果与预期值匹配,则有效,如果视角ID不匹配,则返回无效。
  5. 对于两个编辑器,您需要将这些编辑器与内容类型相关联,而不是与文件扩展名或文件名相关联
  6. 现在只有一个内容类型会随时匹配,具体取决于打开的视角。确保其中一个内容类型是“默认值”,以便在用户打开其他视角时始终匹配。

更新#1添加了一些示例

有一些在线 教程。但是,以下是一些示例代码,以便更轻松地了解所需的工作。以下是声明内容类型的方法(您需要两个)。

<plugin>
   <extension
         point="org.eclipse.core.contenttype.contentTypes">
      <content-type
            base-type="org.eclipse.core.runtime.xml"
            describer="com.liferay.ide.core.FirstContentTypeDescriber"
            id="com.liferay.ide.core.contentType1"
            name="First Content Type"
            priority="normal">
      </content-type>
   </extension>
</plugin>

在Describer类中,您将执行匹配逻辑。然后在编辑器扩展点中,您引用内容类型而不是文件名或扩展名,如下所示:

   <extension
         point="org.eclipse.ui.editors">
      <editor
            class="com.liferay.ide.ui.FirstEditor"
            default="false"
            id="com.liferay.ide.ui.editor1"
            name="My First Editor">
         <contentTypeBinding
               contentTypeId="com.liferay.ide.core.firstContentType">
         </contentTypeBinding>
      </editor>
   </extension>

我添加了一些链接,对于ContentTypeDescriber,扩展点文档会给出您需要实现的类。ITextContentDescriber是您要实现的类。但是,除非您的文件具有非常特定的签名(例如XML doctype等),否则您可能很难确定您的文件是否是正确的内容。 - gamerson
文件是JavaScript .js文件。问题在于它们可能处于Web或服务器端(如Node.js,MongoDB)上下文中。 - Paul Verest
主要问题是ContentDescriber API不允许您访问IFile。但是您可以使用反射来获取它,就像我们在此处所做的那样:https://github.com/liferay/liferay-ide/blob/8e46a833c58fd2397bdab2798e5806ac5e23fb68/common/plugins/com.liferay.ide.core/src/com/liferay/ide/core/describer/LiferayLanguagePropertiesFileDescriber.java#L53-74 - gamerson
阅读了更多关于内容类型的信息后,我认为它不适用于 .js 文件,因为 JSDT 没有使用这个框架。 - Paul Verest
1
实际上,看一下org.eclipse.wst.jsdt.core/plugin.xml的第193行,你会发现有一个JS文件的内容类型。然后,如果你查看JavaScriptEditor,它将与org.eclipse.wst.jsdt.core.jsSource内容类型绑定。因此,您可以使用此框架创建两个新的内容类型,这两个类型都扩展了现有的jsSource内容类型。 - gamerson
显示剩余2条评论

1
我建议重新考虑你的方法,并从WindowBuilder中获取一些线索:将一个编辑器与文件类型关联,打开一个选项卡式编辑器;如果添加了第二个插件,则在同一编辑器上创建一个单独的选项卡。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接