2013-01-02 3 views
5

Eclipse에서 사용자 정의 XML 파일을 편집/작성하기 위해 다중 페이지 양식 편집기를 개발 중입니다.Eclipse FormEditor에서 실행 취소/다시 실행 기능을 구현하는 방법은 무엇입니까?

  1. 구현 클래스는 FormEditor를 확장 한 MyXMLFormEditor입니다.

  2. FormEditor의 각 페이지는 FormPage (즉, MyXMLFormPage가 FormPage를 확장)를 확장합니다.

  3. FormEditor와 실제 XML 파일 사이에서 JDOM 모델을 유지 관리하고 있습니다.

  4. 또한 더티 플래그 처리를 구현했습니다. 따라서 사용자가 Save 버튼을 누를 때까지 사용자가 폼 편집기에 입력 한 내용을 JDOM에 저장합니다. 사용자가 저장 버튼을 누르면 JDOM이 XML 파일에 쓰여지고 직렬화됩니다. 편집기 (사용자가 양식 편집기로 무언가를 변경하고이 저장되지 않습니다) 더러운 경우

    • 실행 취소 작업 : 위의 기능과 편집기에서

나는 다음과 같은 실행 취소/다시 실행 기능을 구현하고 싶습니다 폼 에디터와 JDOM의 변경 사항을 원래 상태 (즉, 에디터가 비 오염 상태 인 상태)로 되 돌리면 재실행 작업이 JDOM뿐만 아니라 FormEditor로 변경 사항을 다시 가져 와야하고 에디터가 더러워 져야합니다.

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"); 
       } 

} 

사람이 나에게 포인터를 제공 할 수/취소를 구현하는 방법에 대한 샘플/다시

MyXMLFormEditor.java : 다음

내 코드입니다 기능을 FormEditor에 추가 할 수 있습니까? 접근법이 Eclipse PDE 또는 Workbench의 기존 실행 취소/다시 실행 프레임 워크를 사용하면 좋을 것입니다.

+0

질문을 제출 한 방식, 숙제와 같음, 수행 한 코드 스 니펫을 조금만 제공하십시오. – exexzian

답변

4

다음 리소스를 읽어야합니다. 그것은 여분의 일처럼 보일지 모르지만 당신의 일은 훨씬 쉬울 것이며이 기사들은 그리 길지 않을 것이라고 믿습니다.

  • Undo Example
  • 수행해야하는 기본 단계

    • Undoable operations
    • Undo and IDE Workbench
    • 은 다음과 같습니다

      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가 눌 렸습니다.

    관련 문제