DND-triggered operations now executed after drag end.
[taxeditor.git] / eclipseprojects / eu.etaxonomy.taxeditor / src / eu / etaxonomy / taxeditor / editor / name / NameComposite.java
index 36f48f06650e796fb27754d68f1b90502a47fffa..61d3954db1545520d6878001e92e5aeab5405e59 100644 (file)
@@ -13,21 +13,24 @@ import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;\r
 \r
 import org.apache.log4j.Logger;\r
-import org.eclipse.core.commands.ExecutionException;\r
-import org.eclipse.core.commands.operations.IOperationHistory;\r
 import org.eclipse.core.commands.operations.IUndoContext;\r
 import org.eclipse.core.commands.operations.IUndoableOperation;\r
 import org.eclipse.core.runtime.Assert;\r
-import org.eclipse.core.runtime.IStatus;\r
 import org.eclipse.jface.action.Action;\r
-import org.eclipse.swt.events.DisposeEvent;\r
-import org.eclipse.swt.events.DisposeListener;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.custom.StyledText;\r
 import org.eclipse.swt.events.FocusAdapter;\r
 import org.eclipse.swt.events.FocusEvent;\r
+import org.eclipse.swt.events.KeyAdapter;\r
+import org.eclipse.swt.events.KeyEvent;\r
+import org.eclipse.swt.graphics.Color;\r
 import org.eclipse.swt.graphics.Font;\r
 import org.eclipse.swt.graphics.Image;\r
 import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Label;\r
 import org.eclipse.ui.forms.IManagedForm;\r
+import org.eclipse.ui.forms.widgets.TableWrapData;\r
+import org.eclipse.ui.forms.widgets.TableWrapLayout;\r
 import org.eclipse.ui.views.properties.IPropertySource;\r
 \r
 import eu.etaxonomy.cdm.model.name.BotanicalName;\r
@@ -40,7 +43,8 @@ import eu.etaxonomy.taxeditor.ITaxEditorConstants;
 import eu.etaxonomy.taxeditor.TaxEditorPlugin;\r
 import eu.etaxonomy.taxeditor.controller.EditorController;\r
 import eu.etaxonomy.taxeditor.controller.GlobalController;\r
-import eu.etaxonomy.taxeditor.editor.EditorGroupedComposite;\r
+import eu.etaxonomy.taxeditor.editor.ContextMenu;\r
+import eu.etaxonomy.taxeditor.editor.GroupedComposite;\r
 import eu.etaxonomy.taxeditor.editor.LineBreakListener;\r
 import eu.etaxonomy.taxeditor.editor.ParseListener;\r
 import eu.etaxonomy.taxeditor.model.CdmUtil;\r
@@ -50,14 +54,14 @@ import eu.etaxonomy.taxeditor.propertysheet.name.NonViralNamePropertySource;
 import eu.etaxonomy.taxeditor.propertysheet.name.ZoologicalNamePropertySource;\r
 \r
 /**\r
- * Formats an <code>EditorGroupedComposite</code> to display <code>TaxonNameBase</code> elements\r
+ * Formats an <code>GroupedComposite</code> to display <code>TaxonNameBase</code> elements\r
  * in a <code>NameViewer</code>.\r
  * \r
  * @author p.ciardelli\r
  * @created 02.06.2008\r
  * @version 1.0\r
  */\r
-public abstract class NameComposite extends EditorGroupedComposite {\r
+public abstract class NameComposite extends GroupedComposite {\r
        private static final Logger logger = Logger.getLogger(NameComposite.class);\r
 \r
        /**\r
@@ -68,6 +72,7 @@ public abstract class NameComposite extends EditorGroupedComposite {
        public static final String HOMOTYPIC_SYNONYM = "homotypic_name_composite";\r
        public static final String HETEROTYPIC_SYNONYM = "heterotypic_name_composite";\r
        public static final String MISAPPLIED_NAME = "misappliedname_name_composite";\r
+       public static final String CONCEPTRELATION = "concept_name_comcposite";\r
 \r
        /**\r
         * ************ INDENTATIONS ************\r
@@ -75,6 +80,7 @@ public abstract class NameComposite extends EditorGroupedComposite {
        public static final int ACCEPTED_INDENT = 0;\r
        public static final int SYNONYM_INDENT = 15;\r
        public static final int MISAPPLIEDNAME_INDENT = 15;\r
+       public static final int CONCEPT_INDENT = 15;\r
 \r
        /**\r
         * ************ FONTS ************\r
@@ -85,6 +91,8 @@ public abstract class NameComposite extends EditorGroupedComposite {
                        .getFont(ITaxEditorConstants.SYNONYM_FONT);\r
        public static final Font MISAPPLIEDNAME_FONT = TaxEditorPlugin.getDefault()\r
                        .getFont(ITaxEditorConstants.MISAPPLIEDNAME_FONT);\r
+       public static final Font CONCEPT_FONT = TaxEditorPlugin.getDefault()\r
+                       .getFont(ITaxEditorConstants.CONCEPT_FONT);\r
 \r
        /**\r
         * ************ ICONS ************\r
@@ -103,6 +111,8 @@ public abstract class NameComposite extends EditorGroupedComposite {
                                        ITaxEditorConstants.HETEROTYPIC_SYN_ORIGINAL_ICON);\r
        public static final Image MISAPPLIEDNAME_ICON = TaxEditorPlugin\r
                        .getDefault().getImage(ITaxEditorConstants.MISAPPLIED_NAME_ICON);\r
+       public static final Image CONCEPT_ICON = TaxEditorPlugin\r
+                       .getDefault().getImage(ITaxEditorConstants.CONCEPT_ICON);\r
        public static final Image AUTONYM_ICON = TaxEditorPlugin.getDefault()\r
                        .getImage(ITaxEditorConstants.AUTONYM_ICON);\r
        public static final Image BASIONYM_ICON = TaxEditorPlugin.getDefault()\r
@@ -133,7 +143,7 @@ public abstract class NameComposite extends EditorGroupedComposite {
 \r
        protected boolean isParsing;\r
 \r
-       private NameViewer nameViewer;\r
+       protected NameViewer nameViewer;\r
 \r
        /**\r
         * The constructor for a DescriptionElementComposite. Takes a parent Composite on which to\r
@@ -152,8 +162,8 @@ public abstract class NameComposite extends EditorGroupedComposite {
                createBorderSupport();\r
                createLineWrapSupport();\r
                \r
-               setData(taxonBase);\r
-\r
+               setDraggableControl(nameViewer.getRulerControl());\r
+               \r
                createParser();\r
                createEmptyViewerPrompt(EMPTY_NAME_PROMPT);\r
                setFocus();\r
@@ -163,6 +173,20 @@ public abstract class NameComposite extends EditorGroupedComposite {
                createNameListener(taxonBase.getName());\r
        }\r
 \r
+       protected void createContent() {\r
+               setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));\r
+               TableWrapLayout layout = new TableWrapLayout();\r
+               layout.leftMargin = 0;\r
+               layout.topMargin = 0;\r
+               layout.bottomMargin = 0;\r
+               layout.verticalSpacing = 0;\r
+               setLayout(layout);\r
+               \r
+               Color groupBackgroundColor = TaxEditorPlugin.getDefault().\r
+                               getColor(ITaxEditorConstants.GROUP_GRAY_BKG_COLOR);\r
+               setBackground(groupBackgroundColor);\r
+       }\r
+       \r
        protected String getEmptyTextPrompt() {\r
                return EMPTY_NAME_PROMPT;\r
        }\r
@@ -219,10 +243,8 @@ public abstract class NameComposite extends EditorGroupedComposite {
                                ((NameViewer) getTextViewer()).setCursorToEOL();\r
 \r
                                TaxonNameBase name = taxonBase.getName();\r
-                               if (name != null) {\r
-                                       \r
-                                       boolean hasProblem = name.getHasProblem();\r
-                                       ((NameViewer) getTextViewer()).setShowError(name);\r
+                               if (name != null) {                                     \r
+                                       calculateErrors();\r
                                }\r
                        }\r
                }\r
@@ -243,15 +265,10 @@ public abstract class NameComposite extends EditorGroupedComposite {
                                \r
                                // Let others know the parser is active\r
                                isParsing = true;\r
-                               \r
-                               // Get the name from the composite's data field\r
-                               TaxonBase taxonBase = (TaxonBase) getData();\r
-                               NonViralName nonViralName = (NonViralName) taxonBase.getName();\r
-                               \r
+                                                               \r
                                // Parse the name and paint the text field w any errors\r
-                               if (nonViralName != null) {\r
-                                       CdmParserController.parseFullReference(nonViralName, text);\r
-                                       ((NameViewer) getTextViewer()).setShowError(nonViralName);\r
+                               if (getName() != null) {\r
+                                       CdmParserController.parseFullReference((NonViralName) getName(), text);\r
                                }\r
 \r
                                // Any entry of text means the taxon has been changed\r
@@ -262,6 +279,9 @@ public abstract class NameComposite extends EditorGroupedComposite {
                                \r
                                // Manually refresh the property sheet to reflect changes\r
                                setSelection();\r
+                               \r
+                               // Show any errors in the name viewer\r
+                               calculateErrors();\r
                        }\r
                });\r
        }\r
@@ -274,50 +294,74 @@ public abstract class NameComposite extends EditorGroupedComposite {
                isUseParser = false;\r
        }\r
        \r
+       protected abstract TaxonNameBase getName();\r
+       \r
+       protected void calculateErrors() {\r
+                               \r
+               nameViewer.clearErrors();\r
+               \r
+               nameViewer.setShowParsingError(getName());\r
+               \r
+       }\r
+       \r
        private NameViewer createNameViewer() {\r
-//             nameViewer = new NameViewer(this);\r
+               \r
+               nameViewer = new NameViewer(this);\r
+               \r
+               StyledText styledText = nameViewer.getTextWidget();\r
 //             nameViewer.setLineBreakListener(new LineBreakListener() {\r
                \r
-               setTextViewer(new NameViewer(this));\r
-               getTextViewer().addLineBreakListener(new LineBreakListener() {\r
+               setTextViewer(nameViewer);\r
+                               \r
+               nameViewer.addLineBreakListener(new LineBreakListener() {\r
 \r
                        @Override\r
                        public void handleSplitText(String text) {\r
-\r
+                               \r
                                // Create a synonym in a new homotypic group using text as name\r
                                IUndoContext undoContext = EditorController.getUndoContext(taxon);\r
                                IUndoableOperation operation = new CreateSynonymInNewGroupOperation\r
                                                ("new heterotypic synonym", undoContext, taxon, text); //$NON-NLS-1$\r
+//                             setOperation(new CreateSynonymInNewGroupOperation\r
                                \r
                                GlobalController.executeOperation(operation);\r
-                               \r
 //                             getTextViewer().removeLineBreakListener(this);\r
                        }\r
 \r
                });\r
 \r
-               getTextViewer().getTextWidget().addFocusListener(new FocusAdapter() {\r
+//             styledText.addKeyListener(new KeyAdapter(){\r
+//\r
+//                     @Override\r
+//                     public void keyReleased(KeyEvent e) {\r
+//                             if (operation != null) {\r
+//                                     GlobalController.executeOperation(operation);\r
+//                                     operation = null;\r
+//                             }\r
+//                     }\r
+//                     \r
+//             });\r
+               \r
+               styledText.addFocusListener(new FocusAdapter() {\r
                        public void focusGained(FocusEvent e) {\r
                                setFocus();\r
                        }\r
                });\r
-\r
-               getTextViewer().getTextWidget().addDisposeListener(new DisposeListener() {\r
-\r
-                       @Override\r
-                       public void widgetDisposed(DisposeEvent e) {\r
-                               logger.warn("disposing text widget");\r
-                       }\r
-               });\r
                \r
                // createLineWrapSupport(nameViewer);\r
-\r
-               getTextViewer().getTextWidget().setBackground(TaxEditorPlugin.getDefault().\r
-                               getColor(ITaxEditorConstants.GROUP_GRAY_BKG_COLOR));            \r
+                       \r
                \r
-               return (NameViewer) getTextViewer();\r
+               return nameViewer;\r
        }\r
        \r
+//     IUndoableOperation operation;\r
+\r
+       private Label nonEditableInfo;\r
+       \r
+//     protected void setOperation(IUndoableOperation operation) {\r
+//             this.operation = operation;\r
+//     }\r
+\r
        public void setText(String text) {\r
                Assert.isNotNull(getTextViewer(), \r
                                "Cannot set text for a TextViewer that has not yet been initialized.");\r
@@ -326,6 +370,16 @@ public abstract class NameComposite extends EditorGroupedComposite {
                getTextViewer().getDocument().set(text);\r
        }\r
        \r
+       public void setNonEditableInfo(String info) {\r
+               if (nonEditableInfo == null) {\r
+                       nonEditableInfo = new Label(this, SWT.WRAP);\r
+                       nonEditableInfo.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP));\r
+               } else {\r
+                       info = nonEditableInfo.getText() + ", " + info;\r
+               }\r
+               nonEditableInfo.setText(info.toUpperCase());\r
+       }\r
+       \r
        public NameViewer getTextViewer() {\r
                return this.nameViewer;\r
        }\r
@@ -334,6 +388,19 @@ public abstract class NameComposite extends EditorGroupedComposite {
                this.nameViewer = textViewer;\r
        }\r
        \r
+       public void createBorderSupport() {\r
+               super.createBorderSupport();\r
+               if (nameViewer != null) {\r
+                       borderDecorator.setBorderedComposite(nameViewer.getTextWidget());\r
+               }\r
+       }\r
+       \r
+       public void setIcon(Image icon) {\r
+               if (nameViewer != null) {\r
+                       nameViewer.setIcon(icon);\r
+               }\r
+       }\r
+       \r
        protected IPropertySource getPropertySourceByName(TaxonNameBase name) {\r
                if (name == null) {\r
                        return null;\r
@@ -351,4 +418,15 @@ public abstract class NameComposite extends EditorGroupedComposite {
                \r
                return null;\r
        }\r
+       \r
+       protected ContextMenu createContextMenu() {\r
+               if (nameViewer != null) {\r
+                       ContextMenu contextMenu = new ContextMenu(nameViewer.getRulerControl());\r
+                       nameViewer.getTextWidget().setMenu(contextMenu.getMenu());\r
+                       return contextMenu;\r
+               } else {\r
+                       logger.warn("Can't create menu because nameViewer has not been initalized.");\r
+                       return null;\r
+               }\r
+       }\r
 }
\ No newline at end of file