[英]Toolbar undo redo Eclipse RCP
我基本上有以下几点:
<menuContribution locationURI="menu:com.myprog.menus.edit?after=undo">
<command commandId="org.eclipse.ui.edit.undo" label="Undo" style="push">
</command>
<command commandId="org.eclipse.ui.edit.redo" label="Redo" style="push">
</command>
</menuContribution>
================================
<menuContribution locationURI="toolbar:org.eclipse.ui.main.toolbar">
<toolbar id="com.myprog.ui.undo">
<command commandId="org.eclipse.ui.edit.undo" label="Undo" style="push">
</command>
<command commandId="org.eclipse.ui.edit.redo" label="Redo" style="push">
</command>
</toolbar>
</menuContribution>
这是在Eclipse 4上使用兼容性层运行的Eclipse 3.X RCP。
问题是,当我打开任何文本编辑器时,除非使用鼠标选择多行线条或单击任何其他选项卡(例如,项目浏览器),否则撤消/重做工具栏按钮不会正确启用或禁用。然后单击返回编辑器。
知道会发生这种情况时,我希望“编辑”菜单的“撤消/重做”也会被弄乱,但是我发现根据我在编辑器中所做的操作,它们已正确启用和禁用。
还应注意,无论工具栏的撤消/重做按钮处于什么状态,键盘快捷键Ctrl + Z和Ctrl + Y都可以正常工作。
可能是什么原因造成的? 仅使工具栏按钮不起作用太奇怪了。 如果所有撤消/重做机制都不起作用,我会感觉更好。
对于菜单项,每次显示菜单时Eclipse都会检查启用,但是对于工具栏,您必须告诉Eclipse何时更新启用。
您可以使用事件代理执行此操作。 在3.x兼容性RCP中,使用:
IEventBroker eventBroker = (IEventBroker)PlatformUI.getWorkbench().getService(IEventBroker.class);
eventBroker.send(UIEvents.REQUEST_ENABLEMENT_UPDATE_TOPIC, UIEvents.ALL_ELEMENT_ID);
使用greg-449
的答案:
IEventBroker eventBroker =(IEventBroker)PlatformUI.getWorkbench()。getService(IEventBroker.class);
eventBroker.send(UIEvents.REQUEST_ENABLEMENT_UPDATE_TOPIC,UIEvents.ALL_ELEMENT_ID);
我通过执行以下操作在documentChanged
侦听器中使用了它:
try {
TextEditor editor = (TextEditor)((IEditorReference) editorReference).getEditor(false);
if(editor != null) {
editor.getDocumentProvider().getDocument(editor.getEditorInput()).addDocumentListener(new IDocumentListener() {
@Override
public void documentChanged(DocumentEvent event) {
IEventBroker eventBroker = (IEventBroker)PlatformUI.getWorkbench().getService(IEventBroker.class);
eventBroker.post(UIEvents.REQUEST_ENABLEMENT_UPDATE_TOPIC, UIEvents.ALL_ELEMENT_ID);
}
@Override
public void documentAboutToBeChanged(DocumentEvent event) {
}
});
}
}
catch (ClassCastException e) {
}
但是,我面临一个问题。 问题是,如果编辑仅是一个字符,则不会启用撤消按钮。 但是,如果编辑超出一个字符,它就可以完美地工作。
进一步调试时,我注意到另一个我未实现并且撤消/重做正常工作的编辑器的调用堆栈从selectionChanged
事件而不是documentChanged
。
我曾在我的问题中提到过,如果我使用鼠标选择多行,则撤消/重做将启用,这显然是selectionChanged
。
所以基本上,我来解决这个问题:
try {
final TextEditor editor = (TextEditor)((IEditorReference) partRef).getEditor(false);
editor.getDocumentProvider().getDocument(editor.getEditorInput()).addDocumentListener(new IDocumentListener() {
@Override
public void documentChanged(DocumentEvent event) {
editor.getSelectionProvider().setSelection(editor.getSelectionProvider().getSelection());
}
@Override
public void documentAboutToBeChanged(DocumentEvent event) {
}
});
}
catch (ClassCastException e) {
}
我现在所做的基本上是触发selectionChanged
事件,该事件从一开始就正确地更新了撤消/重做操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.