eclipse的viewPart怎么实现undo/redo并关联到菜单栏Edit的undo/redo
时间: 2023-10-26 08:07:42 浏览: 173
eclipse swt/jface核心应用源码
在 Eclipse 中,可以使用 `org.eclipse.ui.actions.ActionFactory.UNDO` 和 `org.eclipse.ui.actions.ActionFactory.REDO` 来创建 Undo 和 Redo 动作。然后,将这些动作关联到菜单栏 Edit 中的 Undo 和 Redo 菜单项。
要在 `ViewPart` 中实现 Undo/Redo,您需要遵循以下步骤:
1. 在 `ViewPart` 类中添加以下字段:
```java
private IUndoContext undoContext;
private IUndoableOperation undoOperation;
private IAction undoAction;
private IAction redoAction;
```
2. 在 `createPartControl` 方法中初始化这些字段:
```java
public void createPartControl(Composite parent) {
// 创建 Undo/Redo 上下文
undoContext = new ObjectUndoContext(new Object());
// 创建 Undo/Redo 动作
undoAction = ActionFactory.UNDO.create(getSite().getWorkbenchWindow());
undoAction.setText("Undo");
undoAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO));
undoAction.setEnabled(false);
redoAction = ActionFactory.REDO.create(getSite().getWorkbenchWindow());
redoAction.setText("Redo");
redoAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
.getImageDescriptor(ISharedImages.IMG_TOOL_REDO));
redoAction.setEnabled(false);
// 将 Undo/Redo 动作添加到菜单栏 Edit 中
IMenuManager menuMgr = getViewSite().getActionBars().getMenuManager();
menuMgr.add(new Separator());
menuMgr.add(undoAction);
menuMgr.add(redoAction);
}
```
3. 在 `createPartControl` 方法中为 Undo/Redo 动作添加处理程序:
```java
public void createPartControl(Composite parent) {
// ...
// 为 Undo/Redo 动作添加处理程序
undoAction.setHandler(new UndoActionHandler(getViewSite(), undoContext));
redoAction.setHandler(new RedoActionHandler(getViewSite(), undoContext));
}
```
4. 在 `createPartControl` 方法中为 `parent` 控件创建上下文菜单,并将 Undo/Redo 动作添加到上下文菜单中:
```java
public void createPartControl(Composite parent) {
// ...
// 为 parent 控件创建上下文菜单,并将 Undo/Redo 动作添加到上下文菜单中
MenuManager menuMgr = new MenuManager();
menuMgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
getSite().registerContextMenu(menuMgr, getSite().getSelectionProvider());
parent.setMenu(menuMgr.createContextMenu(parent));
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
manager.add(new Separator());
manager.add(undoAction);
manager.add(redoAction);
}
});
}
```
5. 在 `ViewPart` 类中添加以下方法:
```java
public void executeCommand(final IUndoableOperation operation) {
// 如果操作不可撤销,则返回
if (!operation.canUndo()) {
return;
}
// 如果当前有未完成的撤消操作,则合并操作
if (undoOperation != null) {
undoOperation.addContext(operation.getContext());
undoOperation.add(operation);
} else {
// 否则,开始新的撤消操作
undoOperation = operation;
}
// 注册撤消操作
IOperationHistory operationHistory = OperationHistoryFactory.getOperationHistory();
operationHistory.add(undoOperation);
// 更新 Undo/Redo 动作的状态
undoAction.setEnabled(undoOperation.canUndo());
redoAction.setEnabled(undoOperation.canRedo());
// 将操作添加到 Undo/Redo 上下文中
undoContext.addMatch(undoOperation);
}
public void undo() {
// 撤消上一个操作
IOperationHistory operationHistory = OperationHistoryFactory.getOperationHistory();
operationHistory.undo(undoContext, null, null);
}
public void redo() {
// 重做上一个操作
IOperationHistory operationHistory = OperationHistoryFactory.getOperationHistory();
operationHistory.redo(undoContext, null, null);
}
```
6. 在 `ViewPart` 类中添加以下代码,以便在视图关闭时清除 Undo/Redo 上下文中的操作:
```java
public void dispose() {
// 清除 Undo/Redo 上下文中的操作
IOperationHistory operationHistory = OperationHistoryFactory.getOperationHistory();
operationHistory.dispose(undoContext, true, true, true);
super.dispose();
}
```
现在,您可以在 `executeCommand` 方法中执行所有需要撤消/恢复支持的操作,并且在菜单栏 Edit 中的 Undo/Redo 菜单项中使用 Undo/Redo 动作来撤消/恢复操作。
阅读全文