Eclipse Redo undo implementation

最近做Eclipse插件,要为一个Multi的Editor做redo/undo功能,开始查到了很多资料,网上倒是有一篇讲TreeViewer的redo/undo功能的文章(参考: http://www.ibm.com/developerworks/cn/opensource/os-cn-eclipse-udrd/index.html),但基本都是讲View的redo/undo,没有一篇文章是讲Editor的。本人试了很多次,把OperationHistory的过程写到Editor的Contributor的setActivePage方法中,基本就可以了,如下:
    undoContext = new ObjectUndoContext(this);
approver = new AskUserApprover(undoContext);
getOperationHistory().addOperationApprover(approver);
int limit = 10;
getOperationHistory().setLimit(undoContext, limit);
UndoRedoActionGroup undoRedoGroup = new UndoRedoActionGroup(getSite(),
undoContext, true);
IActionBars actionBars = getActionBars();
undoRedoGroup.fillActionBars(actionBars);
代码中没有定义的变量可以参考我提到的文章。
现在的问题的,虽然Eclipse的菜单上面的redo/undo已经可以正常的工作了,但我们使用Ctrl+Z/Y的
快捷键是不能工作的,我们开发的插件比较复杂可能是前期开发中已经在父类中处理了这个问题,查了很久没有查出
为啥快捷健不能工作,后来只好在Editor界面上单独的注册了事件,这样才使得undo/redo正常工作了。
事件处理类如下:
public class UndoRedoListener implements KeyListener{
public void keyPressed(KeyEvent e) {

}

public void keyReleased(KeyEvent e) {
IOperationHistory operationHistory = OperationHistoryFactory.getOperationHistory();
int mask = e.stateMask;
int ch = e.character;
if(mask == SWT.CTRL && ch == 'Z'-'A'+1){
if(operationHistory.canUndo(ScorecardTableEditor.getUndoContext())){
try {
operationHistory.undo(ScorecardTableEditor.getUndoContext(), null, null);
} catch (ExecutionException e1) {
e1.printStackTrace();
}
}
}
if(mask == SWT.CTRL && ch == 'Y'-'A'+1){
if(operationHistory.canRedo(ScorecardTableEditor.getUndoContext())){
try {
operationHistory.redo(ScorecardTableEditor.getUndoContext(), null, null);
} catch (ExecutionException e1) {
e1.printStackTrace();
}
}
}
}
}
不知道是否,有更好的方法,呵呵!反正可以工作了,这种方法使用了Operation机制来管理栈,简化了实现过程,最大程度的共用
了Eclipse提供的功能。

你可能感兴趣的:(eclipse,工作,eclipse插件,null,Class)