【问题标题】:How to prevent floating editor windows in eclipse 4 RCP apps?如何防止 Eclipse 4 RCP 应用程序中的浮动编辑器窗口?
【发布时间】:2014-06-09 14:59:33
【问题描述】:

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

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

Eclipse enhancement request for floating editor windows 在评论 40 中提到了控制编辑器窗口策略的可取性:

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

请注意,这并不是那么简单,主要是由于编辑器处理菜单/TB 的方式存在根深蒂固的差异(即,任何托管编辑器的地方都需要一个“主”工具栏来托管编辑器工具。

问题:

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

【问题讨论】:

  • 如果您将 DndAddon 排除在应用程序模型之外,那么您将停止将窗口拖到任何地方。
  • 我想保留 3.x 将视图拖出工作台窗口的能力。
  • 您可以尝试:a) 创建一个 AddOn,它监听浮动窗口的创建并始终将部件移回之前的堆栈 b) 扩展/操作 DndAddon 以阻止浮动窗口
  • 看起来org.eclipse.e4.ui.workbench.addons.dndaddon.DetachedDropAgent对此负责,但我看不到控制它的方法。

标签: eclipse-rcp e4


【解决方案1】:

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

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

这个工作想法来自 Eric Moffat,Eclipse e4 的开发负责人,以回应我的增强请求Disabling floating editors。他在那里列出了另外两个选项,其中一个类似于@christoph.keimel 的选项a

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

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

... 属性> 产品>

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

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

接下来,在 myApp.e4xmi 中,修改“DnD Addon”行以指向您的版本。该contributionURI 包括包含您的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;
    }

            ...
}

【讨论】:

    猜你喜欢
    • 2014-12-21
    • 2014-05-13
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    相关资源
    最近更新 更多