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

时间:2018-04-17 11:27:53

标签: java swt rcp

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

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

现在我想处理关闭事件(当击中选项卡上的十字架时),所以我在@PostContruct注释方法中为Composite添加了一个Listener。

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

@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?");
    }
});

那么如何处理零件的关闭并使零件停止实际关闭?

1 个答案:

答案 0 :(得分:1)

执行此操作的常规方法是在要提示有关保存时将该部件标记为脏。要将该部件标记为脏,请调用MPart.setDirty(true)方法。

然后,您可以在主窗口上下文中安装 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script> var counter = 1; function enter_task () { var text = $('#enter_task').val(); $('#todo_list').append('<li><span>'+ text + ' </span><input type="submit" id="edit' + counter + '" value="Edit">' + '<input type="submit" class="done" id="delete' + counter + '" value="Delete">' +'</li>'); $('#edit' + counter).click(function(){ $(this).prev().attr('contenteditable','true'); $(this).prev().focus(); }); $('#delete' + counter).click(function(){ $(this).parent().remove(); }); counter++; }; $(function() { $('#add').on('click', enter_task); }); </script> <body> <h1>Todo List</h1> <input type="text" id="enter_task" placeholder="Enter Task"> <input type="submit" id="add" value="Add Task"> <p> <ul id="todo_list"> </ul> </p> </body>的实现。这个方法将被调用以提示保存和保存脏部分。

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

ISaveHandler