performed javacscript:fix and worked on documentation
[taxeditor.git] / taxeditor-editor / src / main / java / eu / etaxonomy / taxeditor / editor / MultiPageTaxonEditor.java
index 06fcb2beaf73198c93a1ecec33730091be051962..1a2ef30d31f58515af0849d5866f39d4179cf555 100644 (file)
-/**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-\r
-package eu.etaxonomy.taxeditor.editor;\r
-\r
-import java.beans.PropertyChangeEvent;\r
-import java.beans.PropertyChangeListener;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import org.apache.log4j.Logger;\r
-import org.eclipse.core.commands.operations.IUndoContext;\r
-import org.eclipse.core.commands.operations.UndoContext;\r
-import org.eclipse.core.runtime.IProgressMonitor;\r
-import org.eclipse.ui.IEditorInput;\r
-import org.eclipse.ui.IEditorPart;\r
-import org.eclipse.ui.IEditorSite;\r
-import org.eclipse.ui.PartInitException;\r
-import org.eclipse.ui.forms.editor.FormEditor;\r
-\r
-import eu.etaxonomy.cdm.api.conversation.ConversationHolder;\r
-import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;\r
-import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
-import eu.etaxonomy.cdm.model.taxon.Taxon;\r
-import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;\r
-import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;\r
-import eu.etaxonomy.taxeditor.model.DataChangeBridge;\r
-import eu.etaxonomy.taxeditor.model.IDataChangeBehavior;\r
-import eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider;\r
-import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;\r
-import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;\r
-\r
-/**\r
- * \r
- * Generates the tabbed editor with <code>TaxonNameEditor</code> on top and tabs for\r
- *  "Descriptions", "Concepts", "Geography", etc.\r
- * \r
- * @author p.ciardelli\r
- * @author n.hoffmann\r
- * @created 15.05.2008\r
- * @version 1.0\r
- */\r
-public class MultiPageTaxonEditor extends FormEditor implements IConversationEnabled, IPostOperationEnabled, IDirtyMarkableSelectionProvider, IPartContentHasDetails { \r
-       private static final Logger logger = Logger.getLogger(MultiPageTaxonEditor.class);\r
-\r
-       public static final String ID = "eu.etaxonomy.taxeditor.editor.multipagetaxonview";\r
-\r
-       private boolean dirty;\r
-\r
-       private ConversationHolder conversation;\r
-       private IDataChangeBehavior dataChangeBehavior;\r
-       private IUndoContext undoContext;\r
-\r
-       private TaxonEditorInput input;\r
-       \r
-       public MultiPageTaxonEditor() {\r
-               super();                \r
-               undoContext = new UndoContext();\r
-       }\r
-       \r
-       @Override\r
-       public void dispose() {\r
-               conversation.close();\r
-               super.dispose();                \r
-               conversation.close();\r
-       }\r
-\r
-       /* (non-Javadoc)\r
-        * @see org.eclipse.ui.forms.editor.FormEditor#addPages()\r
-        */\r
-       @Override\r
-       protected void addPages() {\r
-               input = (TaxonEditorInput) getEditorInput();\r
-               conversation = input.getConversationHolder();\r
-               conversation.registerForDataStoreChanges(this);\r
-               \r
-               try {\r
-                       addPage(Page.NAME.getIndex(), new TaxonNameEditor(this), getEditorInput());\r
-//                     setPageText(Page.NAME.getIndex(), Page.NAME.getTitle());\r
-                       \r
-                       // TODO lazy create\r
-//                     addPage(Page.DESCRIPTIVE.getIndex(), new TaxonDescriptionTreeEditor(this), getEditorInput());\r
-//                     setPageText(Page.DESCRIPTIVE.getIndex(), Page.DESCRIPTIVE.getTitle());\r
-                       \r
-//                     EditorUtil.showPropertySheet();\r
-                                       \r
-               } catch (PartInitException e) {\r
-                       logger.error("Could not create MultiPageTaxonEditor.", e);\r
-               }\r
-       }\r
-       \r
-       \r
-       @Override\r
-       public void doSave(IProgressMonitor monitor) {\r
-               monitor.beginTask("Saving Editor", 4);\r
-               try{\r
-                       if( ! conversation.isBound()){\r
-                               conversation.bind();\r
-                       }\r
-                       monitor.worked(1);\r
-                       \r
-                       for(IEditorPart editorPage : getPages()){\r
-                               if(editorPage instanceof TaxonNameEditor){\r
-                                       if(((TaxonNameEditor) editorPage).checkForEmptyNames()){\r
-                                               // abort\r
-                                               return;\r
-                                       }\r
-                               }\r
-       \r
-                               editorPage.doSave(monitor);\r
-                               monitor.worked(1);\r
-                       }\r
-                       \r
-                       // commit the conversation and start a new transaction immediately\r
-                       conversation.commit(true);\r
-                       monitor.worked(1);\r
-                       \r
-                       this.setDirty(false);\r
-                       monitor.worked(1);\r
-               }finally{\r
-                       monitor.done();\r
-               }\r
-       }\r
-\r
-\r
-       private void setDirty(boolean dirty) {\r
-               this.dirty = dirty;\r
-               firePropertyChange(PROP_DIRTY);\r
-       }\r
-       \r
-       /* (non-Javadoc)\r
-        * @see org.eclipse.ui.part.MultiPageEditorPart#isDirty()\r
-        */\r
-       public boolean isDirty() {\r
-               return dirty;\r
-       }\r
-\r
-       /* (non-Javadoc)\r
-        * @see org.eclipse.ui.forms.editor.FormEditor#editorDirtyStateChanged()\r
-        */\r
-       @Override\r
-       public void editorDirtyStateChanged() {\r
-               dirty = true;\r
-               super.editorDirtyStateChanged();\r
-       }\r
-       \r
-       \r
-    /**\r
-     * Checks whether nested editors are calling <code>firePropertyChange(PROP_DIRTY)</code>\r
-     * to signal an edit has taken place before passing property change along to \r
-     * <code>super.handlePropertyChange(int propertyId)</code>.\r
-     */\r
-       /* (non-Javadoc)\r
-        * @see org.eclipse.ui.part.MultiPageEditorPart#handlePropertyChange(int)\r
-        */\r
-       protected void handlePropertyChange(int propertyId) {\r
-               if (propertyId == PROP_DIRTY) {\r
-                       setDirty(true);\r
-               }\r
-               super.handlePropertyChange(propertyId);\r
-       }\r
-       \r
-       @Override\r
-       public void doSaveAs() {}\r
-\r
-       @Override\r
-       public boolean isSaveAsAllowed() {\r
-               return false;\r
-       }\r
-\r
-       @Override\r
-       public void init(IEditorSite site, IEditorInput input) throws PartInitException {\r
-               \r
-               if (!(input instanceof TaxonEditorInput))\r
-                       throw new PartInitException(\r
-                                       "Invalid Input: Must be TaxonEditorInput");\r
-               \r
-               this.input = (TaxonEditorInput) input;\r
-\r
-               try {\r
-                       // Listen for name changes, \r
-                       //  change tab for this taxon editor accordingly\r
-                       getTaxon().addPropertyChangeListener("name",\r
-                                       new PropertyChangeListener() {\r
-                                               public void propertyChange(PropertyChangeEvent e) {\r
-                                                       setPartName();\r
-                                               }\r
-                                       });\r
-               } catch (NullPointerException e) {\r
-                       logger.warn("Caught an NPE while initing an editor. This is most " +\r
-                                       "likely due to the unsuccesful attempt to restore the former " +\r
-                                       "state of the application. We ignore this because the workbench " +\r
-                                       "will simply be reset.");\r
-               }\r
-               setPartName();\r
-               \r
-               super.init(site, input);\r
-       }\r
-               \r
-    /**\r
-     * Calls <code>MultiPageEditorPart.setPartName(String partName)</code>\r
-     *  with text appropriate to the state of the taxon: any taxon that has \r
-     *  been saved will by necessity have a name to display; a new taxon \r
-     *  should display "New taxon" in the editor tab.\r
-     */\r
-    protected void setPartName() {\r
-        \r
-       String partName = null;\r
-       TaxonNameBase<?, ?> name = getTaxon().getName();\r
-       \r
-       if (name != null) {\r
-               partName = name.getTitleCache();\r
-       }\r
-       \r
-       if (partName == null || partName.equals("")) {\r
-               partName = ("New taxon");\r
-       }\r
-\r
-        setPartName(partName);\r
-    }\r
-    \r
-    /**\r
-     * Editor pages call this in their postOperation to notify the MultiPageTaxonEditor \r
-     * of unsaved changes\r
-     * @param element TODO\r
-     */\r
-    public void changed(Object element) {\r
-//     setDirty(true);\r
-               dirty = true;\r
-               super.editorDirtyStateChanged();\r
-    }\r
-    \r
-    /**\r
-     * The accepted taxon that is the input for this editor\r
-     * \r
-     * @return the accepted taxon\r
-     */\r
-    public Taxon getTaxon(){\r
-       return input.getTaxon();\r
-    }\r
-\r
-    /*\r
-     * (non-Javadoc)\r
-     * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()\r
-     */\r
-       public ConversationHolder getConversationHolder() {\r
-               return conversation;\r
-       }\r
-       \r
-       public void setConversationHolder(ConversationHolder conversation){\r
-               this.conversation = conversation;\r
-       }\r
-\r
-\r
-       public IUndoContext getUndoContext() {\r
-               return undoContext;\r
-       }\r
-\r
-       public void setUndoContext(IUndoContext undoContext) {\r
-               this.undoContext = undoContext;\r
-       }\r
-       \r
-       @Override\r
-       public void setFocus(){\r
-               //logger.warn("Setting focus to editor");\r
-               // bind the conversation\r
-               getConversationHolder().bind();\r
-               // pass focus to the active editor page\r
-               getActiveEditor().setFocus();\r
-       }\r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostCrudObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmCrudEvent)\r
-        */\r
-       public void update(CdmDataChangeMap events) {\r
-               if(dataChangeBehavior == null){\r
-                       dataChangeBehavior = new MultiPageTaxonEditorDataChangeBehaviour(this);\r
-               }\r
-               \r
-               DataChangeBridge.handleDataChange(events, dataChangeBehavior);\r
-       }\r
-\r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * @see eu.etaxonomy.taxeditor.store.operations.IPostOperationEnabled#postOperation()\r
-        */\r
-       public boolean postOperation(CdmBase objectAffectedByOperation) {\r
-               setDirty(true);\r
-               \r
-               for(IEditorPart editor : this.getPages()){\r
-                       if (editor instanceof IPostOperationEnabled) {\r
-                               ((IPostOperationEnabled) editor).postOperation(objectAffectedByOperation);\r
-                       } else {\r
-                               logger.warn("postOperation not enabled for editor " + editor);\r
-                       }\r
-               }\r
-               logger.warn("postOperation called on MultiPageTaxonEditor. Can you make it more specific?");\r
-               \r
-               return false;\r
-       }\r
-       \r
-       /**\r
-        * Returns an <code>IEditorPart</code> implementation by type\r
-        * \r
-        * @param page the page type\r
-        * @return\r
-        */\r
-       public IMultiPageTaxonEditorPage getPage(Page page){\r
-               for(IEditorPart editor : this.getPages()){\r
-                       if(editor.getClass().equals(page.getClazz())){\r
-                               return (IMultiPageTaxonEditorPage) editor;\r
-                       }\r
-               }\r
-               return null;\r
-       }\r
-       \r
-       /**\r
-        * Return a list of <code>AbstractTaxonEditor</code>s registered with this \r
-        * <code>MultiPageTaxonEditor</code>.  \r
-        * \r
-        * @return\r
-        */\r
-       public List<IEditorPart> getPages(){\r
-               ArrayList<IEditorPart> editors = new ArrayList<IEditorPart>();\r
-               for(int i = 0; i < this.getPageCount(); i++){\r
-                       editors.add(this.getEditor(i));\r
-               }\r
-               return editors;\r
-       }\r
-       \r
-       /**\r
-        * Refreshes a certain page of the MultipageTaxonEditor\r
-        * \r
-        * @param page\r
-        * @return\r
-        */\r
-       public boolean redraw(Page page){\r
-               return redraw(page, true);\r
-       }\r
-       \r
-       /**\r
-        * Refreshes a certain page of the MultipageTaxonEditor and\r
-        * sets focus to that page\r
-        * \r
-        * @param page\r
-        * @param focus\r
-        * @return\r
-        */\r
-       public boolean redraw(Page page, boolean focus){\r
-               IMultiPageTaxonEditorPage editorPage = getPage(page);\r
-               return editorPage != null && editorPage.redraw(focus);\r
-       }\r
-\r
-       public boolean onComplete() {\r
-               // TODO Auto-generated method stub\r
-               return false;\r
-       }\r
-}
\ No newline at end of file
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy 
+* http://www.e-taxonomy.eu
+* 
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+
+package eu.etaxonomy.taxeditor.editor;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.eclipse.core.commands.operations.IUndoContext;
+import org.eclipse.core.commands.operations.UndoContext;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.forms.editor.FormEditor;
+
+import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
+import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
+import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;
+import eu.etaxonomy.cdm.model.taxon.Taxon;
+import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
+import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.model.DataChangeBridge;
+import eu.etaxonomy.taxeditor.model.IDataChangeBehavior;
+import eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider;
+import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
+import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;
+
+/**
+ *
+ * Generates the tabbed editor with <code>TaxonNameEditor</code> on top and tabs for
+ *  "Descriptions", "Concepts", "Geography", etc.
+ *
+ * @author p.ciardelli
+ * @author n.hoffmann
+ * @created 15.05.2008
+ * @version 1.0
+ */
+public class MultiPageTaxonEditor extends FormEditor implements IConversationEnabled, IPostOperationEnabled, IDirtyMarkableSelectionProvider, IPartContentHasDetails { 
+       private static final Logger logger = Logger.getLogger(MultiPageTaxonEditor.class);
+
+       /** Constant <code>ID="eu.etaxonomy.taxeditor.editor.multipage"{trunked}</code> */
+       public static final String ID = "eu.etaxonomy.taxeditor.editor.multipagetaxonview";
+
+       private boolean dirty;
+
+       private ConversationHolder conversation;
+       private IDataChangeBehavior dataChangeBehavior;
+       private IUndoContext undoContext;
+
+       private TaxonEditorInput input;
+       
+       /**
+        * <p>Constructor for MultiPageTaxonEditor.</p>
+        */
+       public MultiPageTaxonEditor() {
+               super();                
+               undoContext = new UndoContext();
+       }
+       
+       /** {@inheritDoc} */
+       @Override
+       public void dispose() {
+               conversation.close();
+               super.dispose();                
+               conversation.close();
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.ui.forms.editor.FormEditor#addPages()
+        */
+       /** {@inheritDoc} */
+       @Override
+       protected void addPages() {
+               input = (TaxonEditorInput) getEditorInput();
+               conversation = input.getConversationHolder();
+               conversation.registerForDataStoreChanges(this);
+               
+               try {
+                       addPage(Page.NAME.getIndex(), new TaxonNameEditor(this), getEditorInput());
+//                     setPageText(Page.NAME.getIndex(), Page.NAME.getTitle());
+                       
+                       // TODO lazy create
+//                     addPage(Page.DESCRIPTIVE.getIndex(), new TaxonDescriptionTreeEditor(this), getEditorInput());
+//                     setPageText(Page.DESCRIPTIVE.getIndex(), Page.DESCRIPTIVE.getTitle());
+                       
+//                     EditorUtil.showPropertySheet();
+                                       
+               } catch (PartInitException e) {
+                       logger.error("Could not create MultiPageTaxonEditor.", e);
+               }
+       }
+       
+       
+       /** {@inheritDoc} */
+       @Override
+       public void doSave(IProgressMonitor monitor) {
+               monitor.beginTask("Saving Editor", 4);
+               try{
+                       if( ! conversation.isBound()){
+                               conversation.bind();
+                       }
+                       monitor.worked(1);
+                       
+                       for(IEditorPart editorPage : getPages()){
+                               if(editorPage instanceof TaxonNameEditor){
+                                       if(((TaxonNameEditor) editorPage).checkForEmptyNames()){
+                                               // abort
+                                               return;
+                                       }
+                               }
+       
+                               editorPage.doSave(monitor);
+                               monitor.worked(1);
+                       }
+                       
+                       // commit the conversation and start a new transaction immediately
+                       conversation.commit(true);
+                       monitor.worked(1);
+                       
+                       this.setDirty(false);
+                       monitor.worked(1);
+               }finally{
+                       monitor.done();
+               }
+       }
+
+
+       private void setDirty(boolean dirty) {
+               this.dirty = dirty;
+               firePropertyChange(PROP_DIRTY);
+       }
+       
+       /* (non-Javadoc)
+        * @see org.eclipse.ui.part.MultiPageEditorPart#isDirty()
+        */
+       /**
+        * <p>isDirty</p>
+        *
+        * @return a boolean.
+        */
+       public boolean isDirty() {
+               return dirty;
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.ui.forms.editor.FormEditor#editorDirtyStateChanged()
+        */
+       /** {@inheritDoc} */
+       @Override
+       public void editorDirtyStateChanged() {
+               dirty = true;
+               super.editorDirtyStateChanged();
+       }
+       
+       
+       /**
+        * {@inheritDoc}
+        *
+        * Checks whether nested editors are calling <code>firePropertyChange(PROP_DIRTY)</code>
+        * to signal an edit has taken place before passing property change along to
+        * <code>super.handlePropertyChange(int propertyId)</code>.
+        */
+       /* (non-Javadoc)
+        * @see org.eclipse.ui.part.MultiPageEditorPart#handlePropertyChange(int)
+        */
+       protected void handlePropertyChange(int propertyId) {
+               if (propertyId == PROP_DIRTY) {
+                       setDirty(true);
+               }
+               super.handlePropertyChange(propertyId);
+       }
+       
+       /** {@inheritDoc} */
+       @Override
+       public void doSaveAs() {}
+
+       /** {@inheritDoc} */
+       @Override
+       public boolean isSaveAsAllowed() {
+               return false;
+       }
+
+       /** {@inheritDoc} */
+       @Override
+       public void init(IEditorSite site, IEditorInput input) throws PartInitException {
+               
+               if (!(input instanceof TaxonEditorInput))
+                       throw new PartInitException(
+                                       "Invalid Input: Must be TaxonEditorInput");
+               
+               this.input = (TaxonEditorInput) input;
+
+               try {
+                       // Listen for name changes, 
+                       //  change tab for this taxon editor accordingly
+                       getTaxon().addPropertyChangeListener("name",
+                                       new PropertyChangeListener() {
+                                               public void propertyChange(PropertyChangeEvent e) {
+                                                       setPartName();
+                                               }
+                                       });
+               } catch (NullPointerException e) {
+                       logger.warn("Caught an NPE while initing an editor. This is most " +
+                                       "likely due to the unsuccesful attempt to restore the former " +
+                                       "state of the application. We ignore this because the workbench " +
+                                       "will simply be reset.");
+               }
+               setPartName();
+               
+               super.init(site, input);
+       }
+               
+    /**
+     * Calls <code>MultiPageEditorPart.setPartName(String partName)</code>
+     *  with text appropriate to the state of the taxon: any taxon that has
+     *  been saved will by necessity have a name to display; a new taxon
+     *  should display "New taxon" in the editor tab.
+     */
+    protected void setPartName() {
+        
+       String partName = null;
+       TaxonNameBase<?, ?> name = getTaxon().getName();
+       
+       if (name != null) {
+               partName = name.getTitleCache();
+       }
+       
+       if (partName == null || partName.equals("")) {
+               partName = ("New taxon");
+       }
+
+        setPartName(partName);
+    }
+    
+    /**
+     * {@inheritDoc}
+     *
+     * Editor pages call this in their postOperation to notify the MultiPageTaxonEditor
+     * of unsaved changes
+     */
+    public void changed(Object element) {
+//     setDirty(true);
+               dirty = true;
+               super.editorDirtyStateChanged();
+    }
+    
+    /**
+     * The accepted taxon that is the input for this editor
+     *
+     * @return the accepted taxon
+     */
+    public Taxon getTaxon(){
+       return input.getTaxon();
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
+     */
+       /**
+        * <p>getConversationHolder</p>
+        *
+        * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
+        */
+       public ConversationHolder getConversationHolder() {
+               return conversation;
+       }
+       
+       /**
+        * <p>setConversationHolder</p>
+        *
+        * @param conversation a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
+        */
+       public void setConversationHolder(ConversationHolder conversation){
+               this.conversation = conversation;
+       }
+
+
+       /**
+        * <p>Getter for the field <code>undoContext</code>.</p>
+        *
+        * @return a {@link org.eclipse.core.commands.operations.IUndoContext} object.
+        */
+       public IUndoContext getUndoContext() {
+               return undoContext;
+       }
+
+       /**
+        * <p>Setter for the field <code>undoContext</code>.</p>
+        *
+        * @param undoContext a {@link org.eclipse.core.commands.operations.IUndoContext} object.
+        */
+       public void setUndoContext(IUndoContext undoContext) {
+               this.undoContext = undoContext;
+       }
+       
+       /** {@inheritDoc} */
+       @Override
+       public void setFocus(){
+               //logger.warn("Setting focus to editor");
+               // bind the conversation
+               getConversationHolder().bind();
+               // pass focus to the active editor page
+               getActiveEditor().setFocus();
+       }
+
+       /*
+        * (non-Javadoc)
+        * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostCrudObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmCrudEvent)
+        */
+       /** {@inheritDoc} */
+       public void update(CdmDataChangeMap events) {
+               if(dataChangeBehavior == null){
+                       dataChangeBehavior = new MultiPageTaxonEditorDataChangeBehaviour(this);
+               }
+               
+               DataChangeBridge.handleDataChange(events, dataChangeBehavior);
+       }
+
+
+       /*
+        * (non-Javadoc)
+        * @see eu.etaxonomy.taxeditor.store.operations.IPostOperationEnabled#postOperation()
+        */
+       /** {@inheritDoc} */
+       public boolean postOperation(CdmBase objectAffectedByOperation) {
+               setDirty(true);
+               
+               for(IEditorPart editor : this.getPages()){
+                       if (editor instanceof IPostOperationEnabled) {
+                               ((IPostOperationEnabled) editor).postOperation(objectAffectedByOperation);
+                       } else {
+                               logger.warn("postOperation not enabled for editor " + editor);
+                       }
+               }
+               logger.warn("postOperation called on MultiPageTaxonEditor. Can you make it more specific?");
+               
+               return false;
+       }
+       
+       /**
+        * Returns an <code>IEditorPart</code> implementation by type
+        *
+        * @param page the page type
+        * @return a {@link eu.etaxonomy.taxeditor.editor.IMultiPageTaxonEditorPage} object.
+        */
+       public IMultiPageTaxonEditorPage getPage(Page page){
+               for(IEditorPart editor : this.getPages()){
+                       if(editor.getClass().equals(page.getClazz())){
+                               return (IMultiPageTaxonEditorPage) editor;
+                       }
+               }
+               return null;
+       }
+       
+       /**
+        * Return a list of <code>AbstractTaxonEditor</code>s registered with this
+        * <code>MultiPageTaxonEditor</code>.
+        *
+        * @return a {@link java.util.List} object.
+        */
+       public List<IEditorPart> getPages(){
+               ArrayList<IEditorPart> editors = new ArrayList<IEditorPart>();
+               for(int i = 0; i < this.getPageCount(); i++){
+                       editors.add(this.getEditor(i));
+               }
+               return editors;
+       }
+       
+       /**
+        * Refreshes a certain page of the MultipageTaxonEditor
+        *
+        * @param page a {@link eu.etaxonomy.taxeditor.editor.Page} object.
+        * @return a boolean.
+        */
+       public boolean redraw(Page page){
+               return redraw(page, true);
+       }
+       
+       /**
+        * Refreshes a certain page of the MultipageTaxonEditor and
+        * sets focus to that page
+        *
+        * @param page a {@link eu.etaxonomy.taxeditor.editor.Page} object.
+        * @param focus a boolean.
+        * @return a boolean.
+        */
+       public boolean redraw(Page page, boolean focus){
+               IMultiPageTaxonEditorPage editorPage = getPage(page);
+               return editorPage != null && editorPage.redraw(focus);
+       }
+
+       /**
+        * <p>onComplete</p>
+        *
+        * @return a boolean.
+        */
+       public boolean onComplete() {
+               // TODO Auto-generated method stub
+               return false;
+       }
+}