捕获部件的关闭事件(Eclipse e4 RCP)

时间:2014-10-20 17:26:16

标签: eclipse-rcp rcp e4

我目前正在开发eclipse e4 RCP应用程序,我有一个部分作为一个职位经理,用户可以看到所有活动的工作及其进展,就像在eclipse中一样。现在的问题是,用户可以通过双击工具栏来打开进度部分,他也应该能够随时关闭进度部分,而不是处理我想要的部分,只是让它不可见。 我一开始认为这不应该是一个问题,因为我可以将该部分设置为不可见,但问题是如何捕捉结束事件并按我的方式处理它。是否有任何事件,接口或监听器可以实现以捕获关闭事件并防止部件被丢弃?

1 个答案:

答案 0 :(得分:2)

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

ExampleCode:

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定义Extention 使用您的ReplaceSaveHandlerProcessor。 (您必须在此扩展中将窗口ID声明为"元素"。(添加屏幕截图:enter image description here

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;
}

}