Refactoring of name editor.
[taxeditor.git] / taxeditor-editor / src / main / java / eu / etaxonomy / taxeditor / editor / name / container / AbstractGroupedContainer.java
similarity index 81%
rename from taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AbstractGroupedContainer.java
rename to taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/container/AbstractGroupedContainer.java
index 9ce7189ed33d5bfc2414af007f672f1b55f35f6d..381091dfdf868965b95a1043c7b377ab6756dfd5 100644 (file)
@@ -7,9 +7,8 @@
  * See LICENSE.TXT at the top of this package for the full license terms.
  */
 
-package eu.etaxonomy.taxeditor.editor.name;
+package eu.etaxonomy.taxeditor.editor.name.container;
 
-import java.lang.reflect.Method;
 import java.util.Set;
 
 import org.eclipse.core.runtime.Assert;
@@ -45,17 +44,18 @@ import org.eclipse.ui.forms.widgets.TableWrapLayout;
 
 import eu.etaxonomy.cdm.common.CdmUtils;
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
-import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.name.NameRelationship;
 import eu.etaxonomy.cdm.model.name.NonViralName;
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
 import eu.etaxonomy.taxeditor.editor.CdmDataTransfer;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.editor.name.dnd.NameEditorDragListener;
+import eu.etaxonomy.taxeditor.editor.name.dnd.NameEditorDragSourceEffect;
 import eu.etaxonomy.taxeditor.editor.name.operation.CreateSynonymInNewGroupOperation;
 import eu.etaxonomy.taxeditor.labels.ILabelImageStrategy;
 import eu.etaxonomy.taxeditor.labels.LabelImageProvider;
-import eu.etaxonomy.taxeditor.model.ImageResources;
 import eu.etaxonomy.taxeditor.model.NameHelper;
 import eu.etaxonomy.taxeditor.model.TextHelper;
 import eu.etaxonomy.taxeditor.parser.ParseHandler;
@@ -84,92 +84,16 @@ import eu.etaxonomy.taxeditor.preference.Resources;
  * @created 02.06.2008
  * @version 1.0
  */
-abstract public class AbstractGroupedContainer<T extends TaxonBase> implements IFormPart {     
-       
-       /**
-        * 
-        */
-       public static final int SELECTED_FOCUS = 1;
-       /** Constant <code>SELECTED_NO_FOCUS=2</code> */
-       public static final int SELECTED_NO_FOCUS = 2;
-       /** Constant <code>NOT_SELECTED=3</code> */
-       public static final int NOT_SELECTED = 3;
-       
-       /**
-        * ************ COMPOSITE TYPES ************
-        */
-       public String compositeType;
-       /** Constant <code>ACCEPTED_TAXON="accepted_name_composite"</code> */
-       public static final String ACCEPTED_TAXON = "accepted_name_composite";
-       /** Constant <code>HOMOTYPIC_SYNONYM="homotypic_name_composite"</code> */
-       public static final String HOMOTYPIC_SYNONYM = "homotypic_name_composite";
-       /** Constant <code>HETEROTYPIC_SYNONYM="heterotypic_name_composite"</code> */
-       public static final String HETEROTYPIC_SYNONYM = "heterotypic_name_composite";
-       /** Constant <code>MISAPPLIED_NAME="misappliedname_name_composite"</code> */
-       public static final String MISAPPLIED_NAME = "misappliedname_name_composite";
-       /** Constant <code>CONCEPTRELATION="concept_name_composite"</code> */
-       public static final String CONCEPTRELATION = "concept_name_composite";
-
-       /**
-        * ************ INDENTATIONS ************
-        */
-       public static final int ACCEPTED_INDENT = 20;
-       /** Constant <code>SYNONYM_INDENT=40</code> */
-       public static final int SYNONYM_INDENT = 40;
-       /** Constant <code>HOMOTYPIC_SYNONYM_IN_HETEROTYPIC_GROUP_INDENT = 60</code> */
-       public static final int HOMOTYPIC_SYNONYM_IN_HETEROTYPIC_GROUP_INDENT = 60;
-       /** Constant <code>MISAPPLIEDNAME_INDENT=40</code> */
-       public static final int MISAPPLIEDNAME_INDENT = 40;
-       /** Constant <code>CONCEPT_INDENT=40</code> */
-       public static final int CONCEPT_INDENT = 40;
+abstract public class AbstractGroupedContainer<T extends TaxonBase> implements IFormPart, IContainerConstants {        
 
-       
-       /**
-        * ************ ICONS ************
-        */
-       public static final Image ACCEPTED_ICON = ImageResources.getImage(ImageResources.BLACK_SQUARE_ICON);
-       /** Constant <code>HOMOTYPIC_SYNONYM_ICON</code> */
-       public static final Image HOMOTYPIC_SYNONYM_ICON = ImageResources.getImage(ImageResources.HOMOTYPIC_SYN_ICON);
-       /** Constant <code>HOMOTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON</code> */
-       public static final Image HOMOTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON = ImageResources.getImage(
-                       ImageResources.HOMOTYPIC_SYN_ORIGINAL_ICON);
-       /** Constant <code>HETEROTYPIC_SYNONYM_ICON</code> */
-       public static final Image HETEROTYPIC_SYNONYM_ICON = ImageResources.getImage(ImageResources.HETEROTYPIC_SYN_ICON);
-       public static final Image HOMOTYPIC_SYNONYM_IN_HETEROTYPIC_GROUP_ICON = ImageResources.getImage(ImageResources.HOMOTYPIC_SYNONYM_IN_HETEROTYPIC_GROUP_ICON);
-       public static final Image INVALID_OR_NUDUM_NAME_ICON = ImageResources.getImage(ImageResources.NOM_INVAL_NUD_SYN_ICON);
-       /** Constant <code>HETEROTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON</code> */
-       public static final Image HETEROTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON = ImageResources.getImage(
-                       ImageResources.HETEROTYPIC_SYN_ORIGINAL_ICON);
-       /** Constant <code>MISAPPLIEDNAME_ICON</code> */
-       public static final Image MISAPPLIEDNAME_ICON = ImageResources.getImage(ImageResources.MISAPPLIED_NAME_ICON);
-       /** Constant <code>CONCEPT_ICON</code> */
-       public static final Image CONCEPT_ICON = ImageResources.getImage(ImageResources.CONCEPT_ICON);
-       /** Constant <code>AUTONYM_ICON</code> */
-       public static final Image AUTONYM_ICON = ImageResources
-                       .getImage(ImageResources.AUTONYM_ICON);
-       /** Constant <code>MOVE</code> */
-       public static final Image MOVE = ImageResources.getImage(ImageResources.MOVE_ICON);
-
-       /**
-        * ************ TRANSFORMATIONS ************
-        */
-       public static final String ADD_GROUP_BASIONYM = "add_group_basionym";
-       /** Constant <code>REMOVE_GROUP_BASIONYM="remove_group_basionym"</code> */
-       public static final String REMOVE_GROUP_BASIONYM = "remove_group_basionym";
-
-       private static final String EMPTY_NAME_PROMPT = "Click to add name";
-       
        protected ParseHandler parseHandler;
        
        private FocusListener nameCompositeFocusListener;
        private ModifyListener nameCompositeModifyListener;
 
-       
-       protected TaxonNameEditor editor;
-       
        protected NameViewer nameViewer;
        
-       private AbstractGroup<T> group;
+       private AbstractGroup group;
        
        private Label nonEditableInfoLabel;
        private DefaultToolTip nonEditableInfoHover;
@@ -191,31 +115,28 @@ abstract public class AbstractGroupedContainer<T extends TaxonBase> implements I
         * <p>Constructor for AbstractGroupedContainer.</p>
         *
         * @param editor a {@link eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor} object.
-        * @param group a {@link eu.etaxonomy.taxeditor.editor.name.AbstractGroup} object.
+        * @param group a {@link eu.etaxonomy.taxeditor.editor.name.container.AbstractGroup} object.
         * @param taxonBase a T object.
         * @param <T> a T object.
         */
-       public AbstractGroupedContainer(TaxonNameEditor editor, AbstractGroup<T> group, T taxonBase){
-               this.editor = editor;
-               
-               this.group = group;     
-               group.add(this);
-               
+       public AbstractGroupedContainer(T taxonBase){
                setData(taxonBase);
-               
+               parseHandler = ParseHandler.NewInstance(taxonBase.getName());
+       }
+       
+       public void createContent(){
                createControl();
                
                createTextViewer();
                createLineWrapSupport();
                createLineBreakListener();
 
-               setMenu(editor.getMenu());
+               setMenu(getEditor().getMenu());
                
                setDraggableControl(new Control[]{getControl(), getNameViewer().getRulerControl()});
                
                createEmptyViewerPrompt(EMPTY_NAME_PROMPT);
                
-               parseHandler = ParseHandler.NewInstance(getNameViewer().getTextWidget(), taxonBase.getName());
                
                initializeComposite();
                
@@ -364,7 +285,7 @@ abstract public class AbstractGroupedContainer<T extends TaxonBase> implements I
                TaxonNameBase synonymName = ParseHandler.quickParse(text);
                
                EditorUtil.executeOperation(new CreateSynonymInNewGroupOperation
-                               ("New Heterotypic Synonym", editor.getUndoContext(), editor.getTaxon(), synonymName, editor));
+                               ("New Heterotypic Synonym", getEditor().getUndoContext(), getEditor().getTaxon(), synonymName, getEditor()));
        }
 
        /**
@@ -377,9 +298,14 @@ abstract public class AbstractGroupedContainer<T extends TaxonBase> implements I
                
                String text = NameHelper.getDisplayNameWithRef(getTaxonBase());
                
+               if(getNameViewer().getTextWidget() == null){
+                       // we might get here via dnd. Look slike it can be ignored
+                       return;
+               }
+               
                if (text.length() == 0) {
                        initEmptyText();
-               } else {
+               } else if(! getNameViewer().getTextWidget().getText().equals(text)) {
                        removeListener();
                        getNameViewer().getTextWidget().setText(text);
                        addListener();
@@ -533,9 +459,12 @@ abstract public class AbstractGroupedContainer<T extends TaxonBase> implements I
        /**
         * <p>Getter for the field <code>group</code>.</p>
         *
-        * @return a {@link eu.etaxonomy.taxeditor.editor.name.AbstractGroup} object.
+        * @return a {@link eu.etaxonomy.taxeditor.editor.name.container.AbstractGroup} object.
         */
        public AbstractGroup getGroup(){
+               if(group == null){
+                       throw new IllegalStateException("Group shall not be null.");
+               }
                return group;
        }
        
@@ -550,7 +479,7 @@ abstract public class AbstractGroupedContainer<T extends TaxonBase> implements I
         * <p>createControl</p>
         */
        protected void createControl() {
-               control = editor.getToolkit().createComposite(group.getControl());
+               control = getEditor().getToolkit().createComposite(getGroup().getControl());
                
                control.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
                TableWrapLayout layout = new TableWrapLayout();
@@ -566,6 +495,13 @@ abstract public class AbstractGroupedContainer<T extends TaxonBase> implements I
                
        }
        
+       /**
+        * @return
+        */
+       protected TaxonNameEditor getEditor() {
+               return getGroup().getEditor();
+       }
+
        /**
         * <p>Getter for the field <code>control</code>.</p>
         *
@@ -579,7 +515,7 @@ abstract public class AbstractGroupedContainer<T extends TaxonBase> implements I
         * <p>createLineWrapSupport</p>
         */
        protected void createLineWrapSupport() {
-               new LineWrapSupport(getNameViewer(), editor.getManagedForm());
+               new LineWrapSupport(getNameViewer(), getEditor().getManagedForm());
        }
        
        
@@ -591,10 +527,10 @@ abstract public class AbstractGroupedContainer<T extends TaxonBase> implements I
                
                focusListener = new FocusAdapter() {
                        public void focusGained(FocusEvent e) {
-                               for(AbstractGroupedContainer container : editor.getGroupedContainers()){
+                               for(AbstractGroupedContainer container : getEditor().getGroupedContainers()){
                                        container.colorSelected(NOT_SELECTED);
                                }
-                               editor.getManagedForm().setInput(AbstractGroupedContainer.this);
+                               getEditor().getManagedForm().setInput(AbstractGroupedContainer.this);
                                placeCursor();
                                colorSelected(SELECTED_FOCUS);
                        }
@@ -651,7 +587,7 @@ abstract public class AbstractGroupedContainer<T extends TaxonBase> implements I
         * @return a boolean.
         */
        public boolean isSelected(){
-               return editor.getSelectedObject() == this;
+               return getEditor().getSelectedContainer() == this;
        }
        
        /**
@@ -695,7 +631,7 @@ abstract public class AbstractGroupedContainer<T extends TaxonBase> implements I
                Runnable runnable = new Runnable() {
                        
                        public void run() {
-                               editor.getManagedForm().setInput(selection);
+                               getEditor().getManagedForm().setInput(selection);
                        }
                };
                display.timerExec(1000, runnable);
@@ -732,7 +668,7 @@ abstract public class AbstractGroupedContainer<T extends TaxonBase> implements I
        /**
         * <p>Getter for the field <code>nameViewer</code>.</p>
         *
-        * @return a {@link eu.etaxonomy.taxeditor.editor.name.NameViewer} object.
+        * @return a {@link eu.etaxonomy.taxeditor.editor.name.container.NameViewer} object.
         */
        public NameViewer getNameViewer() {
                if (nameViewer == null){
@@ -819,7 +755,7 @@ abstract public class AbstractGroupedContainer<T extends TaxonBase> implements I
         */
        public void setDirty(boolean isDirty) {
                if(isDirty){
-                       editor.getManagedForm().dirtyStateChanged();
+                       getEditor().getManagedForm().dirtyStateChanged();
                }
                this.isDirty = isDirty;
        }
@@ -928,7 +864,7 @@ abstract public class AbstractGroupedContainer<T extends TaxonBase> implements I
                }
                
                if (nonEditableInfoLabel == null) {
-                       nonEditableInfoLabel = editor.getToolkit().createLabel(control, "");
+                       nonEditableInfoLabel = getEditor().getToolkit().createLabel(control, "");
                        TableWrapData layoutData = new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP);
                        // Set indent to viewer ruler's width 
                        if (getNameViewer().getRulerControl() != null) {
@@ -1036,9 +972,9 @@ abstract public class AbstractGroupedContainer<T extends TaxonBase> implements I
        /**
         * <p>Setter for the field <code>group</code>.</p>
         *
-        * @param group a {@link eu.etaxonomy.taxeditor.editor.name.AbstractGroup} object.
+        * @param group a {@link eu.etaxonomy.taxeditor.editor.name.container.AbstractGroup} object.
         */
-       public void setGroup(AbstractGroup<T> group) {
+       public void setGroup(AbstractGroup group) {
                this.group = group;
        }
 
@@ -1068,8 +1004,10 @@ abstract public class AbstractGroupedContainer<T extends TaxonBase> implements I
         */
        @Override
        public void dispose() {
-               // TODO Auto-generated method stub
-               
+               if(getControl() != null){
+                       setMenu(null);
+                       getControl().dispose();
+               }
        }