2013-01-02 16 views
5

Sto sviluppando un Editor di moduli a più pagine per modificare/creare un file XML personalizzato in Eclipse.Come implementare la funzionalità di annullamento/ripristino in Eclipse FormEditor?

  1. La classe di implementazione è MyXMLFormEditor che estende FormEditor.

  2. Ogni pagina di FormEditor estende FormPage (ad esempio MyXMLFormPage estende FormPage).

  3. Tra FormEditor e il file XML effettivo sto mantenendo il modello JDOM.

  4. Inoltre ho implementato la gestione flag sporca. Gli input dell'utente nell'editor di form vengono salvati in JDOM fino al momento in cui l'utente preme il pulsante Salva. Quando l'utente preme il pulsante salva, JDOM viene scritto/serializzato in un file XML.

In un editor con funzionalità di cui sopra mi piacerebbe implementare la funzionalità di undo/redo come segue:

  • Quando editore è sporco (l'utente ha cambiato qualcosa nel form editor e non viene salvato) annullare il funzionamento dovrebbe ripristinare le modifiche nell'editor di moduli e JDOM al suo stato originale (cioè lo stato in cui l'editor era non-sporco) e l'operazione di ripetizione dovrebbe nuovamente riportare le modifiche in FormEditor così come JDOM e l'editor dovrebbe diventare sporco.

seguito è il mio frammento di codice:

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

} 

Qualcuno mi può fornire puntatore/campioni su come implementare undo/redo funzionalità in FormEditor? Sarebbe positivo se l'approccio utilizzasse il framework di annullamento/ripristino esistente di Eclipse PDE o workbench.

+0

il modo in cui hai presentato la tua domanda, sembra come fare i compiti, fornire un po 'di frammento di codice che hai fatto – exexzian

risposta

4

È necessario leggere le seguenti risorse. Potrebbe sembrare un lavoro extra, ma credimi, il tuo lavoro sarà molto più semplice e questi articoli non sono molto lunghi.

I passaggi fondamentali da eseguire sono:

1) aggiungere i gestori di azione per undo/redo operazioni nel vostro editor

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

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

Se stai pensando che cos'è myUndoContext, lo saprai leggendo il primo articolo.

2) Creare le proprie implementazioni IUndoableOperation per diversi tipi di modifiche che l'utente può apportare sui dati. Potrebbe essere una singola operazione che gestisce tutte le tue modifiche se dipende solo da qualcosa come XPath -> "nuovo valore", o id -> "nuovo valore".Oppure potresti avere una serie di diverse operazioni per modificare ogni tipo di modello di dati. Tocca a voi.

3) Effettuare ogni modifica ai dati solo attraverso le operazioni che hai creato

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

Una volta a ottenere le cose di base di lavoro è necessario osservare alcune altre cose avanzate, come l'aggiunta di un po ' tipo di meccanismo di ascolto del cambiamento sul modello dati in modo che quando si annulla/ripristini si modifichi i dati, è possibile aggiornare l'interfaccia utente. Inoltre, nella maggior parte dei casi è preferibile che quando si esegue un'operazione si registri lo stato di selezione dell'interfaccia utente, in modo che in caso di annullamento o di successivi ripristini sia possibile ripristinare la selezione all'elemento che è stato modificato in modo che l'utente riconosca immediatamente ciò che viene modificato quando Ctrl + z/Ctrl + è stato premuto.

Problemi correlati