2013-01-02 17 views
5

Opracowuję wielostronicowy edytor formularzy, aby edytować/utworzyć spersonalizowany plik XML w środowisku Eclipse.Jak zaimplementować funkcję cofania/ponawiania w Eclipse FormEditor?

  1. Klasa implementacji to MyXMLFormEditor, który rozszerza FormEditor.

  2. Każda strona FormEditor rozszerza FormPage (np. MyXMLFormPage rozszerza FormPage).

  3. Pomiędzy FormEditor a rzeczywistym plikiem XML utrzymuję model JDOM.

  4. Zaimplementowałam również obsługę brudnej flagi. Zatem dane użytkownika do edytora formularzy są zapisywane w JDOM do czasu naciśnięcia przez użytkownika przycisku Zapisz. Po naciśnięciu przycisku zapisu JDOM jest zapisywany/przekształcany do postaci szeregowej w plik XML.

w edytorze z powyższej funkcjonalności Chciałbym zaimplementować funkcjonalność Cofnij/Ponów następujące:

  • Kiedy edytor jest brudna (użytkownik zmienił coś w edytorze formularzy i nie jest zachowywany) cofnąć operacji powinien przywrócić zmiany w edytorze formularzy, a także JDOM do stanu pierwotnego (tj. stan, w którym edytor był niepylący), a operacja ponowienia powinna ponownie przywrócić zmiany do FormEditor, a także JDOM i edytor powinien się zabrudzić.

Poniżej fragment mojego kodu:

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

} 

Czy ktoś może podać mi wskaźnik/samples na temat sposobu realizacji Undo/Redo funkcjonalność w FormEditor? Byłoby dobrze, gdyby podejście zastosowało istniejący schemat cofania/ponawiania środowiska Eclipse PDE lub środowiska roboczego.

+0

sposób, w jaki przedstawiłeś swoje pytanie, wygląda na pracę domową, podaruj trochę fragmentu kodu, który zrobiłeś – exexzian

Odpowiedz

4

Musisz przeczytać następujące zasoby. To może wydawać się dodatkową pracą, ale wierz mi, twoja praca będzie o wiele łatwiejsza i te artykuły nie są naprawdę długie.

Podstawowe kroki, jakie należy wykonać to:

1) Dodaj teleskopowe działania dla cofania/powtarzania operacji w edytorze

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

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

Jeśli zastanawiasz się, co to jest myUndoContext, dowiesz się o tym czytając pierwszy artykuł.

2) Utwórz własne implementacje IUndoableOperation dla różnych typów modyfikacji, które użytkownik może wprowadzić na swoich danych. Może to być pojedyncza operacja, która obsługuje wszystkie modyfikacje, jeśli zależy tylko od czegoś takiego jak XPath -> "nowa wartość" lub id -> "nowa wartość".Lub możesz mieć szereg różnych operacji do modyfikowania każdego typu swojego modelu danych. To zależy od Ciebie.

3) Sprawdź, każda modyfikacja danych tylko poprzez utworzonych

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

operacji Po uzyskaniu podstawowe rzeczy pracy będzie trzeba szukać w innym zaawansowanych rzeczy, jak dodawanie niektórych rodzaj mechanizmu nasłuchu zmiany w modelu danych, aby po cofnięciu/ponowieniu zmodyfikować dane, można zaktualizować interfejs użytkownika. W większości przypadków jest pożądane, aby podczas wykonywania operacji rejestrować stan wyboru UI, tak aby przy cofaniu lub późniejszych powtórzeniach można było przywrócić zaznaczenie elementu, który został zmodyfikowany, tak aby użytkownik natychmiast rozpoznał, co się zmieniło, gdy Ctrl + z/Ctrl + y został naciśnięty.

Powiązane problemy