2013-01-02 9 views
5

私はEclipseでカスタマイズされたXMLファイルを編集/作成するために複数ページのフォームエディタを開発しています。Eclipse FormEditorにアンドゥ/リドゥ機能を実装する方法は?

  1. 実装クラスは、FormEditorを拡張するMyXMLFormEditorです。

  2. FormEditorの各ページは、FormPageを拡張します(MyXMLFormPageはFormPageを拡張します)。

  3. FormEditorと実際のXMLファイルの間で、私はJDOMモデルを維持しています。

  4. また、ダーティーフラグ処理を実装しました。ユーザがSaveボタンを押すまで、フォームエディタへの入力はJDOMに保存されます。ユーザーが保存ボタンを押すと、JDOMがXMLファイルに書き込まれ、シリアル化されます。

    私は次のようにアンドゥ/リドゥ機能を実装したいと考え、上記の機能を持つエディタで

:エディタが汚れている場合は

  • は、(ユーザーがフォームエディタに何かを変更し、それが保存されません)操作を元に戻しますフォームエディタとJDOMの変更を元の状態(つまり、エディタがダーティでない状態)に戻す必要があります。また、REDO操作によって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; 
       } 

} 

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

} 

の.java MyXMLFormPageは、誰もが私のアンドゥ/リドゥの実装方法のポインタ/サンプルを提供することができます機能をFormEditorに追加できますか? Eclipse PDEまたはワークベンチの既存の元に戻す/やり直しのフレームワークを使用するアプローチが良いのではないでしょうか。

+0

あなたの質問を提示したやり方は、宿題のようですが、あなたが行ったコードスニペットを少し提供してください – exexzian

答えて

4

以下のリソースを読む必要があります。余分な仕事のように思えるかもしれませんが、あなたの仕事はずっと簡単になり、これらの記事は本当に長くないと私は信じています。

あなたが実行するために必要な基本的な手順は次のとおりです。

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が押されました。