如何防止eclipse 4 RCP应用程序中的浮动编辑器窗口?

And*_*mas 5 eclipse-rcp e4

Eclipse 4 RCP应用程序支持浮动编辑器窗口.

使用兼容层,我将一组RCP应用程序从Eclipse 3.8移植到Eclipse 4.4.这些应用程序不是为浮动编辑器设计的.我想将重新设计的成本推迟到以后.

注释40中的浮动编辑器窗口Eclipse增强请求提到了控制编辑器窗口策略的可取性:

在e4中,我们理想地能够"托管"当前编辑器或布局中任何位置的视图.选择将其位置限制在编辑区域应该通过一些"政策"来强制执行.

请注意,实际上并非如此简单,主要是由于编辑器处理菜单/ TB的方式根本不同(即托管编辑器的任何地方都需要 - 托管编辑器工具的"主要"工具栏.

问题:

  • 如何关闭浮动编辑器窗口的功能?
  • 我能以一种仍然允许在工作台窗口之间拖动编辑器窗口的方式吗?
  • 或者,如果我们允许浮动编辑器窗口,是否有一种简单的方法可以将现有的ActionBarAdvisor用于新删除的编辑器,以设置其菜单和工具栏?

And*_*mas 2

我有一个解决方案,但它并不漂亮,而且有一些问题。

此解决方案需要复制 Eclipse DnDAddon 的整个包,并在 DetachedDropAgent 中进行少量更改。(在 @greg-449 的最初评论和一些初步研究之后,我希望用我自己的安装了 DnDManager 子类的类替换 DndAddon。但是,DnDManager 和其他关键类是受包保护的。)

这个工作想法来自 Eclipse e4 的开发主管 Eric Moffat,响应我的增强请求禁用浮动编辑器。他在那里列出了另外两个选项,其中之一类似于 @christoph.keimel 的选项a

以下是一些细节。这至少适用于 Eclipse 4.4。

首先,您需要一个应用程序模型文件。如果您还没有该文件,请LegacyIDE.e4xmi从 Eclipse 插件org.eclipse.ui.workbench*.jar中提取该文件。使用新名称将其复制到您自己的插件(在本例中为myApp.e4xmi)。applicationXMI然后通过向应用程序的plugin.xml 文件中的产品扩展添加属性来使用它。

   <扩展名
         id=“产品”
         点=“org.eclipse.core.runtime.products”>
      <产品
            应用程序=“com.mycompany.myapp”
            名称=“我的应用程序名称”>
         ...
         <属性
               名称=“应用程序XMI”
               值=“com.my.plugin/myApp.e4xmi”>
         </属性>
      </产品>
   </扩展名>

org.eclipse.e4.ui.workbench.addons.dndaddon接下来,将插件org.eclipse.e4.ui.workbench.addons.swt*.jar中的整个包复制到您自己的包中*.ui.workbench.addons.dndaddon

该包名称的后缀很重要。不要更改附加类的名称也很重要DnDAddon。如果您更改其中任何一个,您会发现除了您修改过的 DnDAddOn 之外,还添加了标准 DnDAddOn,这要归功于org.eclipse.e4.ui.workbench.addons.swt.DnDProcessor,并且编辑器可能仍然是浮动的。

接下来,在myApp.e4xmi中,修改“DnD Addon”行以指向您的版本。tributionURI 包括包含您的 DnDAddon 版本的插件的名称及其类路径。例如:

<addons xmi:id="_bqcWME2EEd-DfN2vYY4Lew" elementId="DnD Addon"tributionURI="bundleclass://com.one.of.my.plugins/com.mypackage.e4.ui.workbench.addons.dnaddon.DnDAddon" />

最后,在 DetachedDropAgent 类中,修改 canDrop() 方法,使其对于兼容性编辑器失败。(我在下面编写了添加的代码。)

public class DetachedDropAgent extends DropAgent {
...
@Override
public boolean canDrop(MUIElement dragElement, DnDInfo info) {
    if (info.curElement != null)
        return false;

    // Add this code to disable floating of editors using the compatibility layer.
    String elementId = dragElement.getElementId();
    if ( "org.eclipse.e4.ui.compatibility.editor".equals( elementId )) {
        return false;
    }

            ...
}
Run Code Online (Sandbox Code Playgroud)