【问题标题】:Catch closing event of a part (Eclipse e4 RCP)捕获部件的关闭事件(Eclipse e4 RCP)
【发布时间】:2014-10-22 16:58:39
【问题描述】:

我目前正在开发一个 eclipse e4 RCP 应用程序,我有一个部分用作作业管理器,用户可以在其中查看所有活动作业及其进度,就像 eclipse 中的一样。现在的问题是,用户可以通过在工具栏中双击来打开进度部分,并且他也应该能够随时关闭进度部分,但是我不想处理我想要让它不可见的部分。 起初我认为这应该不是问题,因为我可以将部分设置为不可见,但问题是如何捕获关闭事件并以我的方式处理它。我可以实现任何事件、接口或侦听器来捕获关闭事件并防止部件被释放吗?

【问题讨论】:

  • 您询问的是 e4 应用程序(使用 Application.e4xmi)还是 3.x 兼容模式 RCP?
  • 是的,我问的是使用 Application.e4xmi 的 e4 应用程序...
  • EPartService.addPartListener 会告诉你关闭的情况,但我不知道如何阻止关闭发生。

标签: eclipse-rcp rcp e4


【解决方案1】:

您可以实现 CustomSaveHandler 并将 Default Eclipse Save Handler 替换为 Processor。在该 SaveHandler 中,您可以控制该部分是否应该关闭。所以你不能关闭它并使其不可见。

示例代码:

public class ReplaceSaveHandlerProcessor {
@Named("your.id.to.window")
@Inject
MWindow window;

@Inject
IEventBroker eventBroker;

@Execute
void installIntoContext() {
    eventBroker.subscribe(UIEvents.Context.TOPIC_CONTEXT, new EventHandler() {

        @Override
        public void handleEvent(final Event event) {
            if (UIEvents.isSET(event)) {
                if (window.equals(event.getProperty("ChangedElement")) && (window.getContext() != null)) {

                    window.getContext().runAndTrack(new RunAndTrack() {

                        private final ISaveHandler saveHandler = new CustomSaveHandler();

                        @Override
                        public boolean changed(final IEclipseContext context) {
                            Object getSaveHandlerValue = context.get(ISaveHandler.class);


                            if (!saveHandler.equals(getSaveHandlerValue)) { // prevents endless loop
                                ContextInjectionFactory.inject(saveHandler, window.getContext());
                                context.set(ISaveHandler.class, saveHandler);
                            }


                            return true; // ture keeps tracking and the saveHandler as the only opportunity
                        }

                    });
                }
            }
        }

    });
}
}

您必须为 ExtentionPoint org.eclipse.e4.workbench.model 定义一个扩展 使用您的 ReplaceSaveHandlerProcessor。 (您必须在此扩展中将窗口 id 声明为“元素”。(添加屏幕截图:)

CustomSaveHandler 必须实现 ISaveHandler 接口。 ypu 可以在其方法中说明该部分是否真的应该关闭。

public class CustomSaveHandler implements ISaveHandler {

@Override
public boolean save(MPart dirtyPart, boolean confirm) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean saveParts(Collection<MPart> dirtyParts, boolean confirm) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public Save promptToSave(MPart dirtyPart) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public Save[] promptToSave(Collection<MPart> dirtyParts) {
    // TODO Auto-generated method stub
    return null;
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多