工具栏撤消重做 Eclipse RCP
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 3.X RCP 运行,使用 Eclipse 4 上的兼容层。
问题是,当我打开任何文本编辑器时,undo/redo 工具栏按钮不会正确启用或禁用,除非我使用鼠标 select 多行或当我单击在任何其他选项卡(例如项目资源管理器)上,然后单击返回编辑器。
知道会发生这种情况,我预计编辑菜单 undo/redo 也会被搞砸,但我发现它们根据我在编辑器中的操作正确启用和禁用。
另外需要注意的是无论工具栏undo/redo按钮是什么状态,快捷键Ctrl+Z 和 Ctrl+Y 按预期工作。
这可能是什么原因造成的?让工具栏按钮不起作用是很奇怪的。如果所有 undo/redo 机制都不起作用,我会感觉更好。
对于菜单项,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) {
}
但是,我遇到了一个问题。问题在于,如果编辑恰好是一个字符,则撤消按钮不会启用。但是,如果编辑超过一个字符,它会完美地工作。
进一步调试,我注意到另一个编辑器,我没有实现并且 undo/redo 正常工作,call-stack 从 selectionChanged
事件开始而不是 documentChanged
.
我在问题中提到,如果我 select 使用鼠标多行, undo/redo 就会启用,这显然是 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
事件,该事件从一开始就正确更新 undo/redo。
我基本上有以下几点:
<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 3.X RCP 运行,使用 Eclipse 4 上的兼容层。
问题是,当我打开任何文本编辑器时,undo/redo 工具栏按钮不会正确启用或禁用,除非我使用鼠标 select 多行或当我单击在任何其他选项卡(例如项目资源管理器)上,然后单击返回编辑器。
知道会发生这种情况,我预计编辑菜单 undo/redo 也会被搞砸,但我发现它们根据我在编辑器中的操作正确启用和禁用。
另外需要注意的是无论工具栏undo/redo按钮是什么状态,快捷键Ctrl+Z 和 Ctrl+Y 按预期工作。
这可能是什么原因造成的?让工具栏按钮不起作用是很奇怪的。如果所有 undo/redo 机制都不起作用,我会感觉更好。
对于菜单项,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) {
}
但是,我遇到了一个问题。问题在于,如果编辑恰好是一个字符,则撤消按钮不会启用。但是,如果编辑超过一个字符,它会完美地工作。
进一步调试,我注意到另一个编辑器,我没有实现并且 undo/redo 正常工作,call-stack 从 selectionChanged
事件开始而不是 documentChanged
.
我在问题中提到,如果我 select 使用鼠标多行, undo/redo 就会启用,这显然是 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
事件,该事件从一开始就正确更新 undo/redo。