我有一个可关闭的零件描述符,并在处理程序中创建一个零件。
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?");
}
});
那么如何处理零件的关闭并使零件停止实际关闭?
答案 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