0

Eclipse でカスタマイズされた XML ファイルを編集/作成するためのマルチページ フォーム エディターを開発しています。構造は次のようになります。

  • MyXMLFormEditorFormEditorを拡張した実装クラスです。
  • 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 の undo/redo フレームワークやワークベンチを利用したアプローチがよいでしょう。

4

1 に答える 1

0

Eclipseの複数ページのエディターの実装で使用されるパターンについては、いくつかの重要なポイントがあります。それを行う他の方法があるかもしれませんが、Eclipseのエディターはこれらの点に固執しているようです:

  • エディターのページで共有されるデータのモデルを維持します(これを実行しています)。
  • ページが表示されようとしているときにのみ、モデルデータでページを更新します。表示されていないページをモデルと同期させようとしないでください。
  • 元に戻すまたはやり直しを実行するときは、モデルに適切な変更を加え(@Scorpionのコメントに従って)、現在のページを更新します。
  • 各ページには、このページを残す-ok-to-leave-this-pageメソッド(名前は覚えていません)が必要です。このメソッドは、表示されるデータにエラーがなく、ページを変更できるようにするために呼び出されます(表示されていないデータでエラーが発生しないようにします)。
  • ページには、ページを切り替える前にモデルへの変更を保存するために呼び出される、about-to-leave-this-pageメソッドがあります。モデルはキーストロークごとに変更されることがあるため、ほとんどのページはここでは何もしませんが、ソースページはこのメソッドを使用して、モデルをテキストエディタコンテンツの解析結果に完全に置き換えます。

これが意味するのは、フォームが元に戻る/やり直しを自分で実行する必要がないということです。むしろ、マルチページエディタページを表すクラスは、モデルが変更されたときにモデルと対話し、表示される正しいデータをフォームに渡します。

フォームは、元に戻す/やり直しのキーイベントをリッスンし、コマンドパターンを介してそれらをモデルに渡す必要があります。

于 2013-01-07T11:57:25.120 に答える