5

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

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

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

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

  4. また、ダーティ フラグの処理を実装しました。そのため、フォーム エディターへのユーザーの入力は、ユーザーが [保存] ボタンを押すまで 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

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->「新しい値」または id->「新しい値」などにのみ依存する場合、すべての変更を処理する単一の操作になる可能性があります。または、データ モデルの各タイプを変更するためのさまざまな操作を行うこともできます。それはあなた次第です。

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

于 2013-01-03T09:08:35.233 に答える