在eclipse中,写出使用operationHistory来实现viewpart通过菜单栏Edit进行undo/redo的代码
时间: 2024-02-05 10:13:20 浏览: 152
下面是一个使用 `operationHistory` 实现 `viewpart` 通过菜单栏 `Edit` 进行 `undo/redo` 的代码示例:
```
public class MyView extends ViewPart {
private Text text;
private IOperationHistory operationHistory = PlatformUI.getWorkbench().getOperationSupport().getOperationHistory();
@Override
public void createPartControl(Composite parent) {
text = new Text(parent, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
text.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.stateMask == SWT.CTRL && e.keyCode == 'z') {
undo();
} else if (e.stateMask == SWT.CTRL && e.keyCode == 'y') {
redo();
}
}
});
createActions();
createMenu();
}
private void createActions() {
IAction undoAction = new Action("Undo") {
@Override
public void run() {
undo();
}
};
undoAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_UNDO));
getViewSite().getActionBars().setGlobalActionHandler(ActionFactory.UNDO.getId(), undoAction);
IAction redoAction = new Action("Redo") {
@Override
public void run() {
redo();
}
};
redoAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_REDO));
getViewSite().getActionBars().setGlobalActionHandler(ActionFactory.REDO.getId(), redoAction);
}
private void createMenu() {
MenuManager menuManager = new MenuManager("#PopupMenu");
menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
getViewSite().getActionBars().getMenuManager().add(menuManager);
menuManager.add(new Action("Undo") {
@Override
public void run() {
undo();
}
});
menuManager.add(new Action("Redo") {
@Override
public void run() {
redo();
}
});
}
private void undo() {
if (operationHistory.canUndo(getUndoContext())) {
try {
operationHistory.undo(getUndoContext(), null, null);
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
private void redo() {
if (operationHistory.canRedo(getUndoContext())) {
try {
operationHistory.redo(getUndoContext(), null, null);
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
private IUndoContext getUndoContext() {
return new ObjectUndoContext(this);
}
@Override
public void setFocus() {
text.setFocus();
}
}
```
在这个示例中,我们创建了一个 `Text` 控件,监听了 `CTRL+Z` 和 `CTRL+Y` 快捷键,并在菜单栏和工具栏中添加了 `Undo` 和 `Redo` 操作。`undo()` 和 `redo()` 方法分别调用 `operationHistory` 的 `undo()` 和 `redo()` 方法来执行撤消和重做操作。我们还创建了一个 `ObjectUndoContext` 类,作为 `undo()` 和 `redo()` 方法的第一个参数,以标识 `undo` 和 `redo` 操作的上下文。
阅读全文