我基本上有以下内容:
<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 按预期工作。
可能导致这种情况的原因是什么?让工具栏按钮不起作用是如此奇怪。如果所有撤消/重做机制都不起作用,我会感觉更好。
答案 0 :(得分:2)
对于菜单项Eclipse每次显示菜单时都会检查启用,但是对于工具栏,您必须告诉Eclipse何时更新启用。
您可以使用事件代理执行此操作。在兼容3.x的RCP中使用:
d
答案 1 :(得分:0)
使用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) {
}
然而,我正面临着一个问题。问题是,如果编辑只是一个字符,则撤消按钮不会启用。然而,如果编辑超出一个字符,它可以完美地工作。
进一步调试,我注意到另一个编辑器,我没有实现并且undo / redo正常工作,调用堆栈从selectionChanged
事件而不是documentChanged
开始。< / p>
我在我的问题中提到,如果我使用鼠标选择多行,则撤消/重做将启用,这显然是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
事件,从一开始就正确地更新撤消/重做。