使用部件描述符处理和停止动态创建的部件的关闭事件
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());
我有一个可关闭的部件描述符,并在处理程序中从中创建一个部件。
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());