使用部件描述符处理和停止动态创建的部件的关闭事件

Handle and stop close event of dynamically created Part with Part Descriptor

我有一个可关闭的部件描述符,并在处理程序中从中创建一个部件。

final MPart part = partService.createPart("workbench.partdescriptor.session");
partService.showPart(part, PartState.ACTIVATE);

现在我想处理关闭事件(当在选项卡上打叉时),所以我在我的 @PostContruct 注释方法中向 Composite 添加了一个监听器。

在此处理程序中,应提示用户确认是否实际关闭该部分。

@PostConstruct
public void createPartControl(final Composite parent) {
    parent.addListener(SWT.Close,
            event -> event.doit = MessageDialog.openConfirm(parent.getShell(), "Confirm", "Really?"));
    // UI stuff
}

但是永远不会调用侦听器。如果有帮助的话,Composite 也是 ContributedPartRenderer 类型。

我也尝试过使用@PreDestroy 和 disposeListener,但它不适用,因为在这两种情况下 Part 已经被释放。

我什至尝试将 CTabFolderListener 添加到 Composite 的父级,因为它是 CTabFolder,但是当调用侦听器时 Composite 已经被释放。

((CTabFolder)parent.getParent()).addCTabFolder2Listener(new CTabFolder2Adapter() {
    @Override
    public void close(final CTabFolderEvent event) {
        event.doit = MessageDialog.openConfirm(duTabFolderParent.getShell(), "Confirm", "Really?");
    }
});

那么如何处理部件的关闭并阻止部件实际关闭?

执行此操作的正常方法是在系统提示您保存时将零件标记为脏的。要将零件标记为脏,请调用 MPart.setDirty(true) 方法。

然后您可以在主 window 上下文中安装 ISaveHandler 的实现。这具有将被调用以提示保存和保存脏部分的方法。

您可以在应用程序启动完成事件中执行此操作(可能在您的生命周期中class)。

@Optional
@Inject
public void appStartupComplete(@UIEventTopic(UIEvents.UILifeCycle.APP_STARTUP_COMPLETE) org.osgi.service.event.Event event, 
                               MApplication app, EModelService modelService)
{
  // Find top level window

  MWindow window = (MWindow)modelService.find("main window id", app);

  IEclipseContext windowContext = window.getContext();

  windowContext.set(ISaveHandler.class, new SaveHandler());