2013-01-02 21 views
5

Tôi đang phát triển Trình chỉnh sửa biểu mẫu nhiều trang để chỉnh sửa/tạo tệp XML tùy chỉnh trong Eclipse.Làm thế nào để thực hiện chức năng hoàn tác/làm lại trong Eclipse FormEditor?

  1. Lớp triển khai là MyXMLFormEditor mở rộng FormEditor.

  2. Mỗi trang của FormEditor mở rộng FormPage (tức là MyXMLFormPage mở rộng FormPage).

  3. Giữa FormEditor và tệp XML thực tế Tôi đang duy trì mô hình JDOM.

  4. Ngoài ra, tôi đã thực hiện xử lý cờ bẩn. Vì vậy, đầu vào của người dùng vào trình chỉnh sửa biểu mẫu được lưu vào JDOM cho đến khi người dùng nhấn nút Lưu. Khi người dùng nhấn nút lưu, JDOM được viết/tuần tự hóa thành tệp XML.

Trong một biên tập viên với các chức năng trên, chúng tôi muốn thực hiện chức năng undo/redo như sau:

  • Khi biên tập viên là bẩn (người dùng thay đổi một cái gì đó vào trình soạn thảo dạng và nó không được lưu) lùi lại hoạt động nên khôi phục lại các thay đổi trong trình soạn thảo biểu mẫu cũng như JDOM về trạng thái ban đầu của nó (tức là trạng thái khi trình chỉnh sửa không bẩn) và làm lại thao tác một lần nữa sẽ mang lại các thay đổi vào FormEditor cũng như JDOM và trình soạn thảo.

Sau đây là đoạn mã của tôi:

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

} 

bất cứ ai có thể cung cấp cho tôi con trỏ/mẫu về cách thực hiện undo/redo chức năng vào FormEditor? Sẽ tốt nếu cách tiếp cận này sử dụng khung công tác hoàn tác/làm lại hiện tại của Eclipse PDE hoặc bàn làm việc.

+0

cách bạn đã trình bày câu hỏi của mình, có vẻ như bài tập về nhà, cung cấp ít đoạn mã mà bạn đã thực hiện – exexzian

Trả lời

4

Bạn cần đọc các tài nguyên sau. Nó có vẻ giống như công việc phụ nhưng tôi tin rằng công việc của bạn sẽ dễ dàng hơn nhiều và những bài viết này không thực sự dài.

Các bước cơ bản bạn cần thực hiện là:

1) Thêm xử lý hành động cho undo/redo hoạt động trong trình soạn thảo của bạn

@Override 
public void init(IEditorSite site, IEditorInput editorInput) { 
    ... 

    UndoRedoActionGroup historyActionGroup = new UndoRedoActionGroup(editorSite, myUndoContext, true); 
    historyActionGroup.fillActionBars(editorSite.getActionBars()); 
} 

Nếu bạn đang nghĩ gì là myUndoContext, bạn sẽ biết điều này từ việc đọc bài viết đầu tiên.

2) Tạo các triển khai IUndoableOperation của riêng bạn cho các loại sửa đổi khác nhau mà người dùng có thể thực hiện trên dữ liệu của bạn. Nó có thể là một hoạt động duy nhất xử lý tất cả các sửa đổi của bạn nếu nó chỉ phụ thuộc vào một cái gì đó giống như XPath -> "giá trị mới", hoặc id -> "giá trị mới".Hoặc bạn có thể có một loạt các hoạt động khác nhau để sửa đổi từng loại mô hình dữ liệu của bạn. Tuỳ bạn.

3) Thực hiện mỗi sửa đổi dữ liệu của bạn chỉ thông qua các hoạt động mà bạn đã tạo

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

Một khi bạn có được những thứ cơ bản làm việc, bạn sẽ cần phải nhìn vào một số công cụ tiên tiến khác, như thêm một số loại cơ chế nghe thay đổi trên mô hình dữ liệu để khi hoàn tác/làm lại sửa đổi dữ liệu, bạn có thể cập nhật giao diện người dùng. Cũng trong hầu hết các trường hợp, khi bạn thực hiện thao tác bạn ghi trạng thái lựa chọn giao diện người dùng, để hoàn tác hoặc làm lại, bạn có thể khôi phục lựa chọn thành phần đã được sửa đổi để người dùng ngay lập tức nhận ra những gì đã thay đổi khi Ctrl + z/Ctrl + y đã được nhấn.

Các vấn đề liên quan