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

Eclipse rcp 部件的捕获关闭事件(Eclipse e4 RCP),eclipse-rcp,rcp,e4,Eclipse Rcp,Rcp,E4,我目前正在开发一个Eclipse4RCP应用程序,我有一个部件充当作业管理器,用户可以在其中查看所有活动作业及其进度,就像eclipse中的作业一样。现在的问题是,用户可以通过双击工具栏打开进度部分,他也可以随时关闭进度部分,但我不想处理该部分,而是想让它不可见。 起初我认为这不应该是一个问题,因为我可以将部件设置为不可见,但问题是如何捕获结束事件并按我的方式处理它。是否可以实现任何事件、接口或侦听器来捕获关闭事件并防止部件被处置?您可以实现CustomSaveHandler并用处理器替换默认的

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

您可以实现CustomSaveHandler并用处理器替换默认的Eclipse保存处理程序。在这个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
                        }

                    });
                }
            }
        }

    });
}
}
您必须为extensionpointorg.eclipse.e4.workbench.model定义一个扩展 使用您的替换saveHandlerProcessor。(您必须在此扩展中将窗口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;
}
public类CustomSaveHandler实现ISaveHandler{
@凌驾
公共布尔保存(MPart dirtyPart,布尔确认){
//TODO自动生成的方法存根
返回false;
}
@凌驾
公共布尔存储部件(集合dirtyParts、布尔确认){
//TODO自动生成的方法存根
返回false;
}
@凌驾
公共保存Promptosave(MPart dirtyPart){
//TODO自动生成的方法存根
返回null;
}
@凌驾
公共存储[]PrompToSave(集合目录部分){
//TODO自动生成的方法存根
返回null;
}

}

您是在询问e4应用程序(使用application.e4xmi)还是3.x兼容模式RCP?是的,我是在询问使用application.e4xmi的e4应用程序…
EPartService.addPartListener
将告诉您关闭的情况,但我不知道如何停止关闭。