Reputation: 1089
I basically have the following:
<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>
This is a Eclipse 3.X RCP running using the compatibility layer on Eclipse 4.
The problem is that when I open any of my text editors the undo/redo toolbar buttons doesn't become enabled or disabled correctly unless I use the mouse to select mutliple lines or when I click on any other tab (project explorer for example) and then click back into the editor.
Knowing that this happens I expected the Edit menu undo/redo to be messed up as well, but I found that they are enabled and disabled correctly according to what I do in the editor.
Also it should be noted that no matter what is the state of the toolbar undo/redo buttons, keyboard shortcuts Ctrl+Z and Ctrl+Y work as expected.
What can be possibly causing this? To have the toolbar buttons only not working is so weird. I would have felt better if all the undo/redo mechanism didn't work.
Upvotes: 0
Views: 459
Reputation: 1089
Using greg-449
's answer:
IEventBroker eventBroker = (IEventBroker)PlatformUI.getWorkbench().getService(IEventBroker.class);
eventBroker.send(UIEvents.REQUEST_ENABLEMENT_UPDATE_TOPIC, UIEvents.ALL_ELEMENT_ID);
I have used it in a documentChanged
listener by doing the following:
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) {
}
I, however, was facing a problem. The problem was that if the edit is exactly one character the undo button doesn't get enabled. It however worked flawlessly if the edit goes beyond one character.
Debugging further, I noticed that another editor, which I didn't implement and had undo/redo working correctly, had the call-stack starting from the selectionChanged
event and not the documentChanged
.
I have mentioned in my question that if I select multiple lines using the mouse the undo/redo becomes enabled and this is obviously the selectionChanged
.
So basically, I have come to this solution:
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) {
}
What I am doing now is basically triggering the selectionChanged
event which updates the undo/redo correctly from the start.
Upvotes: 0
Reputation: 111142
For menu items Eclipse checks enablement every time the menu is shown, but for the tool bar you have to tell Eclipse when to update the enablement.
You can do this using the event broker. In a 3.x compatibility RCP use:
IEventBroker eventBroker = (IEventBroker)PlatformUI.getWorkbench().getService(IEventBroker.class);
eventBroker.send(UIEvents.REQUEST_ENABLEMENT_UPDATE_TOPIC, UIEvents.ALL_ELEMENT_ID);
Upvotes: 2