我正在开发一个多页表单编辑器,以在Eclipse中编辑/创建定制的XML文件。

  • 实现类是MyXMLFormEditor,它扩展了FormEditor。
  • FormEditor的每个页面都扩展了FormPage(即MyXMLFormPage扩展了FormPage)。
  • 在FormEditor和实际XML文件之间,我正在维护JDOM模型。
  • 我也实现了脏标志处理。因此,用户输入到表单编辑器中的内容将保存到JDOM中,直到用户按下“保存”按钮为止。当用户按下保存按钮时,JDOM被写入/序列化为XML文件。

  • 在具有上述功能的编辑器中,我想要实现撤消/重做功能,如下所示:
  • 当编辑器变脏(用户将某些内容更改为表单编辑器且未保存)时,撤消操作应将表单编辑器以及JDOM中的更改恢复到其原始状态(即编辑器为非脏状态)并重做操作应该再次将所做的更改带回FormEditor以及JDOM中,并且编辑器应该变脏。

  • 以下是我的代码段:

    MyXMLFormEditor.java
    public class MyXMLFormEditor extends FormEditor {
    
        MyXMLFormEditor(){
                                    super();
                                    }
    
                    @Override
                    protected FormToolkit createToolkit(Display display) {
                                    // Create a toolkit that shares colors between editors.
                                    return new FormToolkit(Activator.getDefault().getFormColors(display));
                    }
    
                    @Override
                    public void init(IEditorSite site, IEditorInput editorInput) {
                                    setSite(site);
                                    mSite = site;
                                    setInput(editorInput);
                                    try {
                                                    super.init(site, editorInput);
                                    } catch (PartInitException e1) {
                                                    e1.printStackTrace();
                                    }
                                    if (!(editorInput instanceof IFileEditorInput))
                                                    try {
                                                                    throw new PartInitException("Invalid Input: Must be IFileEditorInput");
                                                                    } catch (PartInitException e) {
                                                                                    e.printStackTrace();
                                                                    }
                                    setPartName(fileName);
                    }
                    public void setUpProgFile(IEditorSite site, IEditorInput editorInput){
                                    IFileEditorInput fileInput = ((IFileEditorInput) editorInput);
    
                                    //create document builder and prepare JDom model for xml file.
                    }
    
    
                    @Override
                    protected void addPages() {
                                    try {
                                                    //add 'Main' page
                                                    objMyXMLFormPage = new MyXMLFormPage (this, "FirstPage","Main");
                                                    //set rootNode of MyXMLFormPage
                                                    objMyXMLFormPage.rootNode = getRootNode();
                                                    objMyXMLFormPage.filePath = filePath;
                                                    objMyXMLFormPage.document = document;
                                                    addPage(objMyXMLFormPage);
    
                                    } catch (PartInitException e) {
                                                    e.printStackTrace();
                                    }
                    }
    
                    @Override
                    public void doSave(IProgressMonitor monitor) {
                                    System.out.println("MyXMLFormEditor: doSave");
    
                                    //logic to write jdom contents into xml file.
                                    objMyXMLFormPage.setDirty(false);
                    }
    
                    @Override
                    public void doSaveAs() {
                                    System.out.println("MyXMLFormEditor: doSaveAs");
                    }
                    @Override
                    public boolean isSaveAsAllowed() {
                                    System.out.println("MyXMLFormEditor: isSaveAsAllowed");
                                    return true;
                    }
    
    }
    

    MyXMLFormPage .java
    public class MyXMLFormPage  extends FormPage{
    
                    //private members declaration.
    
                    public MyXMLFormPage (MyXMLFormEditor editor,String title, String id) {
                                    // initialize the editor and set its title and name.
                                    super(editor,title,id );
                                    }
    
                    @Override
                    public void createFormContent(IManagedForm managedForm) {
                        // Set page title
                                    super.createFormContent(managedForm);
    
                                    FormToolkit mMyXMLFormPage Toolkit = managedForm.getToolkit();
    
                                    //Logic to creat UI and populating its contents from JDom
    
                    }
    
    
                    private void makeEditorDirty() {
                                    updateJdom =  true;
                                    setDirty(true);
                    }
    
                    private void updateJDom() {
                                    if(updateJdom){
                                                    System.out.println("*** Jdom updated ***");
                                                    updateJdom = false;
                                    }
                    }
    
                    @Override
                    public boolean isDirty() {
                                    return isDirtyFlag;
                    }
    
                    protected void setDirty(boolean value) {
                                    isDirtyFlag = value;
                                    dirtyStateChanged();
                    }
    
                    public void dirtyStateChanged() {
                                    getEditor().editorDirtyStateChanged();
    
                    }
    
                    @Override
                    public boolean isSaveAsAllowed() {
                                    System.out.println("MyXMLFormPage .isSaveAsAllowed");
                          return false;
                       }
    
                    @Override
                    public void doSave(IProgressMonitor monitor) {
                                    System.out.println("MyXMLFormPage .doSave");
                    }
    
    }
    

    谁能为我提供有关如何在FormEditor中实现撤消/重做功能的指针/示例?
    如果该方法利用Eclipse PDE或工作台的现有撤消/重做框架,那将是很好的。

    最佳答案

    您需要阅读以下资源。这似乎是多余的工作,但请相信我,您的工作会轻松很多,并且这些文章并不冗长。

  • Undoable operations
  • Undo and IDE Workbench
  • Undo Example

  • 您需要执行的基本步骤是:

    1)在编辑器中为撤消/重做操作添加操作处理程序

    @Override
    public void init(IEditorSite site, IEditorInput editorInput) {
        ...
    
        UndoRedoActionGroup historyActionGroup = new UndoRedoActionGroup(editorSite, myUndoContext, true);
        historyActionGroup.fillActionBars(editorSite.getActionBars());
    }
    

    如果您在想什么是myUndoContext,则可以通过阅读第一篇文章来了解这一点。

    2)为用户可以对数据进行的不同类型的修改创建自己的 IUndoableOperation 实现。如果它仅依赖于诸如XPath->“new value”或id->“new value”之类的东西,它可能是处理所有修改的单个操作。或者,您可以进行一系列不同的操作来修改每种类型的数据模型。由你决定。

    3)仅通过创建的操作对数据进行每次修改

    MyDataModifyingOperation op = new MyDataModifyingOperation(xpath, newValue, oldValue);
    op.addContext(myUndoContext);
    IStatus status = OperationHistoryFactory.getOperationHistory().execute(operation, null, null);
    

    一旦基本知识开始工作,您将需要查看其他一些高级知识,例如在数据模型上添加某种监听机制,以便在撤消/重做修改数据时可以更新UI。同样,在大多数情况下,希望在执行操作时记录UI选择状态,以便在撤消或后续重做时,您可以将选择恢复到已修改的元素,以便用户在Ctrl + z/Ctrl + y被按下。

    关于java - 如何在Eclipse FormEditor中实现撤消/重做功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14120203/

    10-10 14:47