New wizards are not finishable when no data was entered
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / forms / AbstractCdmEntityWizardPage.java
index 0d5643a9defcabdcaf9796c9f7fc9e6957ed52c3..7ed3808a84c3370d589b54a4a3d2865e140b39d6 100644 (file)
@@ -1,15 +1,18 @@
 // $Id$
 /**
-* 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.
-*/
+ * 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.ui.forms;
 
+import org.apache.commons.lang.StringUtils;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
 import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.widgets.Composite;
@@ -22,41 +25,56 @@ import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
 import eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement;
 
 /**
- * <p>Abstract AbstractCdmEntityWizardPage class.</p>
- *
+ * <p>
+ * Abstract AbstractCdmEntityWizardPage class.
+ * </p>
+ * 
  * @author n.hoffmann
  * @created Jun 1, 2010
  * @version 1.0
  */
-public abstract class AbstractCdmEntityWizardPage<T> extends WizardPage implements IConversationEnabled {
+public abstract class AbstractCdmEntityWizardPage<T> extends WizardPage
+               implements IConversationEnabled, IPropertyChangeListener {
 
        protected CdmFormFactory formFactory;
        protected T entity;
 
        AbstractCdmDetailElement<T> detailElement;
-       private ConversationHolder conversation;
-       
+       private final ConversationHolder conversation;
+
        /**
-        * <p>Constructor for AbstractCdmEntityWizardPage.</p>
-        *
-        * @param formFactory a {@link eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory} object.
-        * @param conversation a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
-        * @param entity a T object.
-        * @param <T> a T object.
+        * <p>
+        * Constructor for AbstractCdmEntityWizardPage.
+        * </p>
+        * 
+        * @param formFactory
+        *            a {@link eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory}
+        *            object.
+        * @param conversation
+        *            a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
+        *            object.
+        * @param entity
+        *            a T object.
+        * @param <T>
+        *            a T object.
         */
-       protected AbstractCdmEntityWizardPage(CdmFormFactory formFactory, ConversationHolder conversation, T entity) {
+       protected AbstractCdmEntityWizardPage(CdmFormFactory formFactory,
+                       ConversationHolder conversation, T entity) {
                super("page");
                this.formFactory = formFactory;
                this.entity = entity;
                this.conversation = conversation;
                setDescription(getEntityTitle());
+
+               formFactory.addPropertyChangeListener(this);
+               setPageComplete(false);
        }
-       
+
        /**
         * @return
         */
        private String getEntityTitle() {
-               if(entity instanceof IIdentifiableEntity){
+               if (entity instanceof IIdentifiableEntity) {
                        ((IIdentifiableEntity) entity).getTitleCache();
                }
                return "";
@@ -64,57 +82,70 @@ public abstract class AbstractCdmEntityWizardPage<T> extends WizardPage implemen
 
        /*
         * (non-Javadoc)
-        * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+        * 
+        * @see
+        * org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets
+        * .Composite)
         */
        /** {@inheritDoc} */
+       @Override
        public void createControl(Composite parent) {
-               ScrolledForm scrolledForm = formFactory.createScrolledForm(parent);             
+               ScrolledForm scrolledForm = formFactory.createScrolledForm(parent);
                scrolledForm.getBody().setLayout(CdmFormFactory.LAYOUT());
-               
+
                Composite control = formFactory.createComposite(scrolledForm.getBody());
                control.setLayoutData(CdmFormFactory.FILL());
-               
+
                control.setLayout(CdmFormFactory.LAYOUT(2, false));
-               WizardPageRootElement rootElement = new WizardPageRootElement(formFactory, control, getConversationHolder());
-                                               
+               WizardPageRootElement rootElement = new WizardPageRootElement(
+                               formFactory, control, getConversationHolder());
+
                Color bgColor = getShell().getBackground();
-               
+
                detailElement = createElement(rootElement);
-               
+
                rootElement.setBackground(bgColor);
                control.setBackground(bgColor);
                scrolledForm.setBackground(bgColor);
-               
+
                setControl(scrolledForm);
        }
-       
+
        /**
-        * <p>Getter for the field <code>entity</code>.</p>
-        *
+        * <p>
+        * Getter for the field <code>entity</code>.
+        * </p>
+        * 
         * @return a T object.
         */
        public T getEntity() {
                return entity;
        }
-       
+
        /**
         * Creates the detail element for this wizard page
-        *
-        * @param rootElement a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement} object.
-        * @return a {@link eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement} object.
+        * 
+        * @param rootElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement}
+        *            object.
+        * @return a
+        *         {@link eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement}
+        *         object.
         */
-       public abstract AbstractCdmDetailElement<T> createElement(ICdmFormElement rootElement);
-       
-       protected class WizardPageRootElement extends RootElement implements IConversationEnabled{
+       public abstract AbstractCdmDetailElement<T> createElement(
+                       ICdmFormElement rootElement);
+
+       protected class WizardPageRootElement extends RootElement implements
+                       IConversationEnabled {
+
+               private final ConversationHolder conversation;
 
-               private ConversationHolder conversation;
-               
-               public WizardPageRootElement(CdmFormFactory formFactory, 
+               public WizardPageRootElement(CdmFormFactory formFactory,
                                Composite layoutComposite, ConversationHolder conversation) {
                        super(formFactory, layoutComposite);
                        this.conversation = conversation;
                }
-               
+
                @Override
                public void refresh() {
                        super.refresh();
@@ -122,41 +153,78 @@ public abstract class AbstractCdmEntityWizardPage<T> extends WizardPage implemen
                        detailElement = createElement(this);
                        ((Composite) getControl()).layout();
                }
-               
+
+               @Override
                public ConversationHolder getConversationHolder() {
                        return conversation;
                }
-               
-               public void update(CdmDataChangeMap changeEvents) {}
+
+               @Override
+               public void update(CdmDataChangeMap changeEvents) {
+               }
+       }
+
+       @Override
+       public void propertyChange(PropertyChangeEvent event) {
+               if (event.getSource() == getDetailElement()) {
+                       checkComplete();
+               }
        }
-       
+
        /**
-        * <p>getConversationHolder</p>
-        *
-        * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
+        * Should check whether the wizard is complete in a sense that it contains
+        * sane data. Should setPageComplete to true if that is the case.
         */
+       protected void checkComplete() {
+               setPageComplete(titleCacheIsNotEmpty());
+       }
+
+       private boolean titleCacheIsNotEmpty() {
+               if (getEntity() instanceof IIdentifiableEntity) {
+                       IIdentifiableEntity entity = (IIdentifiableEntity) getEntity();
+                       return !StringUtils.isEmpty(entity.getTitleCache());
+               }
+               return true;
+       }
+
+       /**
+        * <p>
+        * getConversationHolder
+        * </p>
+        * 
+        * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
+        *         object.
+        */
+       @Override
        public ConversationHolder getConversationHolder() {
                return conversation;
        }
-       
+
        /** {@inheritDoc} */
        @Override
        public void dispose() {
-               if(detailElement != null){
+               if (detailElement != null) {
                        detailElement.removeElements();
                }
+               formFactory.removePropertyChangeListener(this);
                super.dispose();
        }
-       
+
        /**
-        * <p>Getter for the field <code>detailElement</code>.</p>
-        *
-        * @return a {@link eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement} object.
+        * <p>
+        * Getter for the field <code>detailElement</code>.
+        * </p>
+        * 
+        * @return a
+        *         {@link eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement}
+        *         object.
         */
        public AbstractCdmDetailElement<T> getDetailElement() {
                return detailElement;
        }
-       
+
        /** {@inheritDoc} */
-       public void update(CdmDataChangeMap changeEvents) {}
+       @Override
+       public void update(CdmDataChangeMap changeEvents) {
+       }
 }