Merge branch 'develop' into bulkEditorE4
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / element / AbstractFormSection.java
index 9679087c3bd9d6ae41f04bfae1d98e320494ebe8..1550fce58e7324ddb9f4580cc7ec6c6c8e5a719d 100644 (file)
@@ -25,7 +25,8 @@ import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.TypedListener;
 import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.events.IExpansionListener;
 import org.eclipse.ui.forms.widgets.Section;
 import org.eclipse.ui.forms.widgets.TableWrapLayout;
 import org.eclipse.ui.forms.widgets.ToggleHyperlink;
@@ -34,6 +35,8 @@ import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
 import eu.etaxonomy.taxeditor.model.AbstractUtility;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
+import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
 
 /**
  * <p>
@@ -51,6 +54,11 @@ import eu.etaxonomy.taxeditor.model.AbstractUtility;
 //TODO shouldn't ENTITY be bound with super class ICdmBase for example (AbstractFormSection<ENTITY extends ICdmBase>)?
 public abstract class AbstractFormSection<ENTITY> extends Section implements ISelectionChangedListener, IEntityElement<ENTITY>, IConversationEnabled {
 
+    /**
+     * The default number of columns in detail sections
+     */
+    public static final int DEFAULT_NUM_COLUMNS = 2;
+
        private ISelectionProvider selectionProvider;
 
        private ENTITY entity;
@@ -98,10 +106,12 @@ public abstract class AbstractFormSection<ENTITY> extends Section implements ISe
                TableWrapLayout layout = LayoutConstants.LAYOUT();
                layout.bottomMargin = 10;
                layout.rightMargin = 5;
+               layout.horizontalSpacing = 5;
 
                client.setLayout(layout);
 
                this.setClient(client);
+
        }
 
            /**
@@ -157,6 +167,7 @@ public abstract class AbstractFormSection<ENTITY> extends Section implements ISe
         */
        public void setEntity(ENTITY entity) {
                this.entity = entity;
+               addExpandListener();
        }
 
        /*
@@ -215,7 +226,7 @@ public abstract class AbstractFormSection<ENTITY> extends Section implements ISe
                 ((IPropertyChangeListener) listener).propertyChange(event);
             }
         } catch (ConcurrentModificationException e) {
-            AbstractUtility.warn(getClass(), "ConcurrentModificationException while handling PropertyChangeEvents."
+            MessagingUtils.warn(getClass(), "ConcurrentModificationException while handling PropertyChangeEvents."
                     + " It seems like this is not critical");
         }
        }
@@ -531,7 +542,8 @@ public abstract class AbstractFormSection<ENTITY> extends Section implements ISe
         *
         * @return a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory} object.
         */
-       public CdmFormFactory getFormFactory() {
+       @Override
+    public CdmFormFactory getFormFactory() {
                return formFactory;
        }
 
@@ -561,18 +573,20 @@ public abstract class AbstractFormSection<ENTITY> extends Section implements ISe
         */
        @Override
     public ConversationHolder getConversationHolder() {
-               if(getParentElement() instanceof RootElement || getParentElement() == null){
-
-                       IEditorPart activeEditor = AbstractUtility.getActiveEditor();
-                       if(activeEditor instanceof IConversationEnabled){
-                               ConversationHolder conversation = ((IConversationEnabled) AbstractUtility.getActiveEditor()).getConversationHolder();
-                               return conversation;
-                       }
-               }else if(getParentElement() instanceof IConversationEnabled){
-                       return ((IConversationEnabled) getParentElement()).getConversationHolder();
-               }
-               AbstractUtility.errorDialog("Could not get conversation for AbstractFormSection",
-                               getClass(), "There is an error in the implementation. There should have been an active editor but it wasn't",
+           if(AbstractUtility.getActiveE4Part() instanceof IConversationEnabled){
+            return ((IConversationEnabled) AbstractUtility.getActiveE4Part()).getConversationHolder();
+        }
+           if(getParentElement() instanceof RootElement || getParentElement() == null){
+
+               Object activeEditor = AbstractUtility.getActiveE4Editor();
+               if(activeEditor instanceof IConversationEnabled){
+                   ConversationHolder conversation = ((IConversationEnabled) AbstractUtility.getActiveE4Editor()).getConversationHolder();
+                   return conversation;
+               }
+           }else if(getParentElement() instanceof IConversationEnabled){
+               return ((IConversationEnabled) getParentElement()).getConversationHolder();
+           }
+               MessagingUtils.error(getClass(), "Could not get conversation for AbstractFormSection. There is an error in the implementation. There should have been an active editor but it wasn't",
                                new IllegalArgumentException());
                return null;
 
@@ -581,6 +595,31 @@ public abstract class AbstractFormSection<ENTITY> extends Section implements ISe
        /** {@inheritDoc} */
        @Override
     public void update(CdmDataChangeMap changeEvents) {
+
+       }
+
+    public class ExpandListener implements IExpansionListener{
+               @Override
+               public void expansionStateChanging(ExpansionEvent e) {
+               }
+               @Override
+               public void expansionStateChanged(ExpansionEvent e) {
+                       PreferencesUtil.getPreferenceStore().setValue(getPrefKey(), e.getState());
+               }
+    }
+
+    /**
+     * Adds a custom implementation of IExpansionListener to this section
+     * which stores the expansion state in the preferences
+     */
+       protected void addExpandListener() {
+               PreferencesUtil.getPreferenceStore().setDefault(getPrefKey(), isExpanded());
+               setExpanded(PreferencesUtil.getPreferenceStore().getBoolean(getPrefKey()));
+               addExpansionListener(new ExpandListener());
+       }
+
+       private String getPrefKey() {
+               return this.getClass().getCanonicalName()+";"+entity.getClass().getCanonicalName();
        }