Check in before merging IEntityContainer and LineAnnotation.
authorp.ciardelli <p.ciardelli@localhost>
Mon, 6 Jul 2009 10:07:20 +0000 (10:07 +0000)
committerp.ciardelli <p.ciardelli@localhost>
Mon, 6 Jul 2009 10:07:20 +0000 (10:07 +0000)
15 files changed:
.gitattributes
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditor.java
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditorDocumentProvider.java
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditorInput.java
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditorReconcilingStrategy.java
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/IEntityContainer.java
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/IEntityContainerCreator.java
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/ILineSelectionSource.java
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/LineAnnotation.java [moved from taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/CdmEntityAnnotation.java with 78% similarity]
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/LineAnnotationModel.java [moved from taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/CdmEntityAnnotationModel.java with 70% similarity]
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/LineSelectionSource.java
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/ReferenceContainer.java
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/ReferenceEditorInput.java
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/handler/MergeGroupHandler.java
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/handler/SetMergeTargetHandler.java

index f7d0cd4c7d7d207dd89bfd1119ff7707a332940d..31946a3183682649fed7ae4a869386a4e45d04fc 100644 (file)
@@ -653,12 +653,12 @@ taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditorI
 taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditorInputFactory.java -text
 taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditorReconcilingStrategy.java -text
 taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditorSourceViewerConfiguration.java -text
-taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/CdmEntityAnnotation.java -text
-taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/CdmEntityAnnotationModel.java -text
 taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/IBulkEditorConstants.java -text
 taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/IEntityContainer.java -text
 taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/IEntityContainerCreator.java -text
 taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/ILineSelectionSource.java -text
+taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/LineAnnotation.java -text
+taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/LineAnnotationModel.java -text
 taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/LineSelection.java -text
 taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/LineSelectionSource.java -text
 taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/LineSelectionViewer.java -text
index ca6f2a3f73190fda09dce05fe45c2a7c255613e9..7e5f89ef7540854f4ac3b936205b899f458b999b 100644 (file)
@@ -9,6 +9,7 @@
 */\r
 package eu.etaxonomy.taxeditor.bulkeditor;\r
 \r
+import org.apache.log4j.Logger;\r
 import org.eclipse.jface.text.IDocument;\r
 import org.eclipse.jface.text.source.Annotation;\r
 import org.eclipse.jface.text.source.ISourceViewer;\r
@@ -35,6 +36,9 @@ import org.eclipse.ui.editors.text.TextEditor;
  * @version 1.0\r
  */\r
 public class BulkEditor extends TextEditor {\r
+       @SuppressWarnings("unused")\r
+       private static final Logger logger = Logger\r
+                       .getLogger(BulkEditor.class);\r
 \r
        public static final String ID = "bulkeditor.editor";\r
 \r
@@ -86,15 +90,15 @@ public class BulkEditor extends TextEditor {
 \r
        private void toggleMergeCandidateAnnotation(int line) {\r
                IDocument document = viewer.getDocument();\r
-               CdmEntityAnnotationModel model = \r
-                               (CdmEntityAnnotationModel) viewer.getAnnotationModel();\r
+               LineAnnotationModel model = \r
+                               (LineAnnotationModel) viewer.getAnnotationModel();\r
                \r
                Annotation annotation = model.getAnnotationAtLine(line, document);\r
                \r
                if (annotation != null) {\r
                        if (annotation.getType().equals(IBulkEditorConstants.TYPE_MERGE_CANDIDATE)) {\r
                                model.changeAnnotationType(\r
-                                               annotation, CdmEntityAnnotation.TYPE_GENERIC);\r
+                                               annotation, LineAnnotation.TYPE_GENERIC);\r
                        } else {\r
                                model.changeAnnotationType(\r
                                                annotation, IBulkEditorConstants.TYPE_MERGE_CANDIDATE);\r
index 175b7815b75c83a972703c22ad511d6f06964428..2887c93f30da4f70a43f1d98430a4673d154daeb 100644 (file)
@@ -9,10 +9,12 @@
 */\r
 package eu.etaxonomy.taxeditor.bulkeditor;\r
 \r
+import java.util.ArrayList;\r
 import java.util.HashMap;\r
-import java.util.List;\r
+import java.util.Iterator;\r
 import java.util.Map;\r
 \r
+import org.apache.log4j.Logger;\r
 import org.eclipse.core.runtime.CoreException;\r
 import org.eclipse.core.runtime.IProgressMonitor;\r
 import org.eclipse.jface.operation.IRunnableContext;\r
@@ -23,18 +25,25 @@ import org.eclipse.jface.text.source.Annotation;
 import org.eclipse.jface.text.source.IAnnotationModel;\r
 import org.eclipse.ui.texteditor.AbstractDocumentProvider;\r
 \r
+import eu.etaxonomy.cdm.model.reference.Journal;\r
+import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
+\r
 /**\r
  * @author p.ciardelli\r
  * @created 25.06.2009\r
  * @version 1.0\r
  */\r
-public class BulkEditorDocumentProvider extends AbstractDocumentProvider {\r
+public class BulkEditorDocumentProvider extends AbstractDocumentProvider implements IEntityContainerCreator {\r
+       private static final Logger logger = Logger\r
+                       .getLogger(BulkEditorDocumentProvider.class);\r
        \r
        private Map<BulkEditorInput, IDocument> documents = \r
                        new HashMap<BulkEditorInput, IDocument>();\r
 \r
        private Map<BulkEditorInput, IAnnotationModel> models = \r
                new HashMap<BulkEditorInput, IAnnotationModel>();\r
+\r
+       private ArrayList<IEntityContainer<?>> list;\r
        \r
        @Override\r
        public IAnnotationModel getAnnotationModel(Object element) {\r
@@ -45,8 +54,8 @@ public class BulkEditorDocumentProvider extends AbstractDocumentProvider {
                        \r
                        // Create model as necessary\r
                        if (model == null) {\r
-                               model = new CdmEntityAnnotationModel();\r
-                               ((CdmEntityAnnotationModel) model).setCdmEntityCreator(input);\r
+                               model = new LineAnnotationModel();\r
+                               ((LineAnnotationModel) model).setEntityContainerCreator(this);\r
                                models.put(input, model);\r
                        }       \r
                        return model;\r
@@ -76,17 +85,16 @@ public class BulkEditorDocumentProvider extends AbstractDocumentProvider {
                        BulkEditorInput input = (BulkEditorInput) element;\r
                        Document document = new Document("");\r
                        IAnnotationModel model = getAnnotationModel(element);\r
-                       \r
-                       List<IEntityContainer<?>> list = ((BulkEditorInput) element).getList();\r
+                                       \r
                        String text = "";\r
                        String line;\r
-                       for (IEntityContainer<?> container : list) {\r
+                       for (IEntityContainer<?> container : getLineContainers(element)) {\r
                                if (!container.isMarkedAsDeleted() && !container.isMarkedAsMerged()) {\r
                                        line = container.getEditableText() \r
                                                        + document.getDefaultLineDelimiter();\r
                                        \r
                                        Position position = new Position(text.length(), line.length());\r
-                                       Annotation annotation = new CdmEntityAnnotation(container);\r
+                                       Annotation annotation = new LineAnnotation(container);\r
                                        model.addAnnotation(annotation, position);\r
                                        document.set(document.get() + line);\r
                                        \r
@@ -94,19 +102,63 @@ public class BulkEditorDocumentProvider extends AbstractDocumentProvider {
                                }\r
                        }\r
                        documents.put(input, document);\r
-                       if (model instanceof CdmEntityAnnotationModel) {\r
-                               ((CdmEntityAnnotationModel) model).printAnnotations();\r
+                       if (model instanceof LineAnnotationModel) {\r
+                               ((LineAnnotationModel) model).printAnnotations();\r
                        }\r
                        return document;\r
                }\r
                return null;\r
        }\r
 \r
+       /**\r
+        * @param element \r
+        * @return\r
+        */\r
+       private ArrayList<IEntityContainer<?>> getLineContainers(Object element) {\r
+               if (list == null) {\r
+                       list = new ArrayList<IEntityContainer<?>>();\r
+                       list.add(createContainer(createReference("Acta universitatis carolinae. Biologica Prague")));\r
+                       list.add(createContainer(createReference("Acta universitatis asiae mediae. Botanica")));\r
+                       list.add(createContainer(createReference("Acta phytogeographica suecica Uppsala")));\r
+                       list.add(createContainer(createReference("Acta botanica neerlandica Amsterdam")));\r
+                       list.add(createContainer(createReference("Acta geobotanica hungarica Debrecen, Hungary")));\r
+               }\r
+               return list;\r
+       }\r
+\r
        @Override\r
        protected void doSaveDocument(IProgressMonitor monitor, Object element,\r
                        IDocument document, boolean overwrite) throws CoreException {\r
-               // TODO Auto-generated method stub\r
-               \r
+               if (element instanceof BulkEditorInput) {\r
+                       \r
+                       // Get new containers from annotation model\r
+                       IAnnotationModel model = getAnnotationModel(element);\r
+                       Iterator iterator = model.getAnnotationIterator();\r
+                       while (iterator.hasNext()) {\r
+                               Object object = (Annotation) iterator.next();\r
+                               if (object instanceof LineAnnotation) {\r
+                                       IEntityContainer<?> container = ((LineAnnotation) object).getEntityContainer();\r
+                                       if (container.isMarkedAsNew() && !container.isMarkedAsDeleted()) {\r
+                                               getLineContainers(element).add(container); // prob. not necessary\r
+                                               logger.info("Adding " + container.getEditableText() + " to input");\r
+                                       }\r
+                               }\r
+                       }\r
+                       \r
+                       // Iterate through input's list, deleting or merging as necessary\r
+                       for (IEntityContainer<?> container : getLineContainers(element)) {\r
+                               if (container.isMarkedAsMerged()) {\r
+                                       logger.info("Merge " + container.getEditableText() + " into " + container.getMergeTarget());\r
+                                       // TODO remove from list and from annotation model\r
+                               } else if (container.isMarkedAsDeleted()) {\r
+                                       logger.info("Delete "  + container.getEditableText());\r
+                                       // TODO remove from list and from annotation model\r
+                               } else if (container.isMarkedAsNew() || container.isDirty()) {\r
+                                       logger.info("Save "  + container.getEditableText());\r
+                                       container.setDirty(false);\r
+                               }\r
+                       }\r
+               }\r
        }\r
 \r
        @Override\r
@@ -125,4 +177,26 @@ public class BulkEditorDocumentProvider extends AbstractDocumentProvider {
                // enables copy & paste\r
                return false;\r
        }\r
+\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainerCreator#create(java.lang.String)\r
+        */\r
+       public IEntityContainer<?> createContainer(String titleCache) {\r
+               IEntityContainer<?> container = createContainer(createReference(titleCache));\r
+               container.markAsNew();\r
+               return container;\r
+       }\r
+       \r
+       private ReferenceBase createReference(String titleCache) {\r
+               Journal journal = Journal.NewInstance();\r
+               journal.setTitleCache(titleCache);\r
+               return journal;\r
+       }\r
+\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainerCreator#createContainer(java.lang.Object)\r
+        */\r
+       public IEntityContainer<?> createContainer(Object entity) {\r
+               return new ReferenceContainer((ReferenceBase<?>) entity);\r
+       }\r
 }
\ No newline at end of file
index 2f427e62fb4c7fe02585b28c2c43505b246b7e38..9db722f68b2aefdc82fe54ac1faa12a4353f5b72 100644 (file)
@@ -11,6 +11,7 @@ package eu.etaxonomy.taxeditor.bulkeditor;
 \r
 import java.util.List;\r
 \r
+import org.apache.log4j.Logger;\r
 import org.eclipse.jface.resource.ImageDescriptor;\r
 import org.eclipse.ui.IEditorInput;\r
 import org.eclipse.ui.IMemento;\r
@@ -22,7 +23,10 @@ import org.eclipse.ui.IPersistableElement;
  * @version 1.0\r
  * @param <T>\r
  */\r
-abstract public class BulkEditorInput implements IEditorInput, IEntityContainerCreator, IPersistableElement {\r
+abstract public class BulkEditorInput implements IEditorInput, IPersistableElement {\r
+       @SuppressWarnings("unused")\r
+       private static final Logger logger = Logger\r
+                       .getLogger(BulkEditorInput.class);\r
 \r
        /**\r
         * See menu parameters for "taxeditor-bulkeditor.commandParameter.inputType" \r
@@ -84,10 +88,6 @@ abstract public class BulkEditorInput implements IEditorInput, IEntityContainerC
        @SuppressWarnings("unchecked")\r
        public Object getAdapter(Class adapter) {\r
                return null;\r
-       }               \r
-       \r
-       public List<IEntityContainer<?>> getList() {\r
-               return null;\r
        }\r
 \r
        /* (non-Javadoc)\r
index f2fe3d9bccd611f924f7ed54c20ae61a48d644c8..c453802faa781269ba29fb414d740b47369815bf 100644 (file)
@@ -22,8 +22,6 @@ import org.eclipse.jface.text.source.Annotation;
 import org.eclipse.jface.text.source.IAnnotationModel;\r
 import org.eclipse.jface.text.source.ISourceViewer;\r
 \r
-import eu.etaxonomy.cdm.model.reference.Generic;\r
-\r
 /**\r
  * @author p.ciardelli\r
  * @created 25.06.2009\r
@@ -78,14 +76,14 @@ public class BulkEditorReconcilingStrategy implements IReconcilingStrategy {
                        IRegion lineRegion = document.getLineInformation(i);\r
                        String lineText = document.get(lineRegion.getOffset(), lineRegion.getLength());\r
                        \r
-                       List<CdmEntityAnnotation> annotationsCurrentLine = ((CdmEntityAnnotationModel) getAnnotationModel()).\r
-                                                                                               getAnnotations(lineOffset, lineLength);\r
+                       List<LineAnnotation> annotationsCurrentLine = ((LineAnnotationModel) getAnnotationModel()).\r
+                                                                                               getUndeletedAnnotations(lineOffset, lineLength);\r
                        \r
                        if (annotationsCurrentLine.size() == 0) {\r
                                logger.debug("Adding new annotation " + lineText);\r
                                addAnnotation(lineText, lineRegion);\r
                        } else {\r
-                               CdmEntityAnnotation currentAnnotation = annotationsCurrentLine.get(0);\r
+                               LineAnnotation currentAnnotation = annotationsCurrentLine.get(0);\r
 //                             int length = lineLength + document.getLineDelimiter(i).length();\r
                                int length = lineLength;\r
                                logger.debug("Position before: " + getAnnotationModel().getPosition(currentAnnotation));\r
@@ -94,73 +92,79 @@ public class BulkEditorReconcilingStrategy implements IReconcilingStrategy {
                                currentAnnotation.setText(lineText);\r
                                \r
                                for (int j = 1; j < annotationsCurrentLine.size(); j++) {\r
-                                       getAnnotationModel().removeAnnotation(annotationsCurrentLine.get(j));\r
+                                       annotationsCurrentLine.get(j).markDeleted(true);\r
+                                       \r
+//                                     getAnnotationModel().removeAnnotation(annotationsCurrentLine.get(j));\r
                                }\r
                        }\r
                }\r
                \r
                // Deletes have already taken place\r
                \r
-               ((CdmEntityAnnotationModel) getAnnotationModel()).printAnnotations();\r
+               ((LineAnnotationModel) getAnnotationModel()).printAnnotations();\r
        }\r
        \r
-       @SuppressWarnings("unused")\r
-       synchronized private void doReconcile_(DirtyRegion dirtyRegion) throws BadLocationException {\r
-               \r
-               int dirtyOffset = dirtyRegion.getOffset();\r
-               int dirtyLength = dirtyRegion.getLength();\r
-               IRegion firstLineRegion = document.getLineInformationOfOffset(dirtyOffset);\r
-               String firstLineText = document.get(firstLineRegion.getOffset(), firstLineRegion.getLength());\r
-               \r
-               Annotation currentAnnotation = null;\r
-               Position currentPosition = null;\r
-               int currentLength = 0; \r
-               // Get all annotations on current line\r
-               for (Annotation annotation : \r
-                               ((CdmEntityAnnotationModel) getAnnotationModel()).getAnnotations(firstLineRegion.getOffset(), firstLineRegion.getLength())) {\r
-                       if (currentAnnotation == null) {\r
-                               // First annotation updated w text of entire line\r
-                               currentAnnotation = annotation;\r
-                               currentAnnotation.setText(firstLineText);\r
-                               currentPosition = getAnnotationModel().getPosition(annotation);\r
-                               currentLength = currentPosition.getLength();\r
-                       } else {\r
-                               if (DirtyRegion.REMOVE.equals(dirtyRegion.getType())) {\r
-                                       // Remove annotations that squirted on to the same line\r
-                                       currentLength += \r
-                                                       getAnnotationModel().getPosition(annotation).getLength();\r
-                                       getAnnotationModel().removeAnnotation(annotation);\r
-                               }\r
-                       }\r
-               }\r
-               currentPosition.setLength(currentLength);\r
-               \r
-               // PROBLEM: 0-length annotations, i.e. <CR>\r
-               \r
-               if (DirtyRegion.INSERT.equals(dirtyRegion.getType())) {\r
-                       int remainingLines = document.getNumberOfLines(dirtyOffset, dirtyLength) - 1;\r
-                       if (remainingLines > 0) {\r
-                               // Make annotations out of any new lines\r
-                               int firstLine = document.getLineOfOffset(dirtyOffset);\r
-                               for (int i = firstLine + 1; i <= firstLine + remainingLines; i++) {\r
-                                       IRegion lineRegion = document.getLineInformation(i);\r
-                                       String lineText = document.get(lineRegion.getOffset(), lineRegion.getLength());\r
-                                       \r
-                                       addAnnotation(lineText, lineRegion);\r
-                               }\r
-                       }                                               \r
-               }\r
-               \r
-               logger.debug(dirtyRegion.getType());\r
-               if (getAnnotationModel() instanceof CdmEntityAnnotationModel) {\r
-                       ((CdmEntityAnnotationModel) getAnnotationModel()).printAnnotations();\r
-               }\r
-       }\r
+//     @SuppressWarnings("unused")\r
+//     synchronized private void doReconcile_(DirtyRegion dirtyRegion) throws BadLocationException {\r
+//             \r
+//             int dirtyOffset = dirtyRegion.getOffset();\r
+//             int dirtyLength = dirtyRegion.getLength();\r
+//             IRegion firstLineRegion = document.getLineInformationOfOffset(dirtyOffset);\r
+//             String firstLineText = document.get(firstLineRegion.getOffset(), firstLineRegion.getLength());\r
+//             \r
+//             Annotation currentAnnotation = null;\r
+//             Position currentPosition = null;\r
+//             int currentLength = 0; \r
+//             // Get all annotations on current line\r
+//             for (Annotation annotation : \r
+//                             ((CdmEntityAnnotationModel) getAnnotationModel()).getAnnotations(firstLineRegion.getOffset(), firstLineRegion.getLength())) {\r
+//                     if (currentAnnotation == null) {\r
+//                             // First annotation updated w text of entire line\r
+//                             currentAnnotation = annotation;\r
+//                             currentAnnotation.setText(firstLineText);\r
+//                             currentPosition = getAnnotationModel().getPosition(annotation);\r
+//                             currentLength = currentPosition.getLength();\r
+//                     } else {\r
+//                             if (DirtyRegion.REMOVE.equals(dirtyRegion.getType())) {\r
+//                                     // Remove annotations that squirted on to the same line\r
+//                                     currentLength += \r
+//                                                     getAnnotationModel().getPosition(annotation).getLength();\r
+//                                     getAnnotationModel().removeAnnotation(annotation);\r
+//                             }\r
+//                     }\r
+//             }\r
+//             currentPosition.setLength(currentLength);\r
+//             \r
+//             // PROBLEM: 0-length annotations, i.e. <CR>\r
+//             \r
+//             if (DirtyRegion.INSERT.equals(dirtyRegion.getType())) {\r
+//                     int remainingLines = document.getNumberOfLines(dirtyOffset, dirtyLength) - 1;\r
+//                     if (remainingLines > 0) {\r
+//                             // Make annotations out of any new lines\r
+//                             int firstLine = document.getLineOfOffset(dirtyOffset);\r
+//                             for (int i = firstLine + 1; i <= firstLine + remainingLines; i++) {\r
+//                                     IRegion lineRegion = document.getLineInformation(i);\r
+//                                     String lineText = document.get(lineRegion.getOffset(), lineRegion.getLength());\r
+//                                     \r
+//                                     addAnnotation(lineText, lineRegion);\r
+//                             }\r
+//                     }                                               \r
+//             }\r
+//             \r
+//             logger.debug(dirtyRegion.getType());\r
+//             if (getAnnotationModel() instanceof CdmEntityAnnotationModel) {\r
+//                     ((CdmEntityAnnotationModel) getAnnotationModel()).printAnnotations();\r
+//             }\r
+//     }\r
        \r
        private void addAnnotation(String text, IRegion region) {\r
                Position position = new Position(region.getOffset(), region.getLength());\r
-               Annotation annotation = ((CdmEntityAnnotationModel) getAnnotationModel()).createAnnotation(text);\r
+               Annotation annotation = ((LineAnnotationModel) getAnnotationModel()).createAnnotation(text);\r
                getAnnotationModel().addAnnotation(annotation, position);\r
+               \r
+//             Position position2 = new Position(region.getOffset() + 1, region.getLength() - 2);\r
+//             Annotation annotation2 = new Annotation("org.eclipse.ui.workbench.texteditor.error",true,"asdf");\r
+//             getAnnotationModel().addAnnotation(annotation2, position2);\r
        }\r
 \r
        private IAnnotationModel getAnnotationModel() {\r
index e77a7540682d34ae94311705f6337c296c3d0948..c0b8499506b48540896acd851bb446e14cf7f980 100644 (file)
@@ -31,11 +31,30 @@ public interface IEntityContainer<T extends CdmBase> {
        \r
        void markAsDeleted();\r
        \r
+       void markAsNew();\r
+       \r
        boolean isMarkedAsMerged();\r
        \r
        boolean isMarkedAsDeleted();\r
+       \r
+       boolean isMarkedAsNew();\r
 \r
        void setText(String text);\r
 \r
        Object getPropertySource();\r
+\r
+       /**\r
+        * @return\r
+        */\r
+       T getMergeTarget();\r
+\r
+       /**\r
+        * @return\r
+        */\r
+       boolean isDirty();\r
+\r
+       /**\r
+        * @param b\r
+        */\r
+       void setDirty(boolean dirty);\r
 }\r
index 20ae16385d874a2a067e79ff8ee3df9bdf761f1c..557ca466f8b90ee36fd9831add4d0b19a9099534 100644 (file)
@@ -10,7 +10,6 @@
 \r
 package eu.etaxonomy.taxeditor.bulkeditor;\r
 \r
-import eu.etaxonomy.cdm.model.common.CdmBase;\r
 \r
 /**\r
  * @author p.ciardelli\r
@@ -20,7 +19,7 @@ import eu.etaxonomy.cdm.model.common.CdmBase;
 public interface IEntityContainerCreator {\r
 \r
        /**\r
-        * Creates both a new container and a new CDM object, using\r
+        * Creates both a new container and a new domain object, using\r
         * titleCache.\r
         * \r
         * @param titleCache\r
@@ -29,10 +28,10 @@ public interface IEntityContainerCreator {
        IEntityContainer<?> createContainer(String titleCache);\r
        \r
        /**\r
-        * Creates a new container using an existing CDM object.\r
+        * Creates a new container using an existing domain object.\r
         * \r
         * @param cdmEntity\r
         * @return\r
         */\r
-       IEntityContainer<?> createContainer(CdmBase cdmEntity);\r
+       IEntityContainer<?> createContainer(Object entity);\r
 }\r
index 03a86e9c085147716587dabcfa96deba1d705a7a..297eb95f702ed335d52a6fcf111a914b76b7da0b 100644 (file)
@@ -12,6 +12,9 @@ package eu.etaxonomy.taxeditor.bulkeditor;
 \r
 \r
 /**\r
+ * Every line in a <code>LineSelectionViewer</code> has an object associated with it. Classes\r
+ * implementing this interface retrieve a line's object. \r
+ * \r
  * @author p.ciardelli\r
  * @created 03.07.2009\r
  * @version 1.0\r
similarity index 78%
rename from taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/CdmEntityAnnotation.java
rename to taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/LineAnnotation.java
index 7b6c7de476d35090250efbb195e937174b0783ba..9131a02950bd78290f13f417198fb9549c1b6f03 100644 (file)
@@ -13,17 +13,20 @@ import org.eclipse.core.runtime.Assert;
 import org.eclipse.jface.text.source.Annotation;\r
 \r
 /**\r
+ * An <code>Annotation</code> which spans an entire line and holds an object associated\r
+ * with the line in an <code>IEntityContainer</code>. \r
+ * \r
  * @author p.ciardelli\r
  * @created 25.06.2009\r
  * @version 1.0\r
  */\r
-public class CdmEntityAnnotation extends Annotation {\r
+public class LineAnnotation extends Annotation {\r
 \r
        public static final String TYPE_GENERIC = Annotation.TYPE_UNKNOWN;\r
        \r
        private IEntityContainer<?> container;\r
 \r
-       public CdmEntityAnnotation(IEntityContainer<?> container) {\r
+       public LineAnnotation(IEntityContainer<?> container) {\r
                Assert.isNotNull(container);\r
                this.container = container;\r
                setType(TYPE_GENERIC);\r
similarity index 70%
rename from taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/CdmEntityAnnotationModel.java
rename to taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/LineAnnotationModel.java
index 12189cd22ba6e9c2b2b36f7dbb934ce9d2fb12d0..54550a359c8578b86cf956a0c9a6e828a8251c72 100644 (file)
@@ -21,23 +21,28 @@ import java.util.Set;
 import org.apache.log4j.Logger;\r
 import org.eclipse.jface.text.BadLocationException;\r
 import org.eclipse.jface.text.IDocument;\r
-import org.eclipse.jface.text.Position;\r
 import org.eclipse.jface.text.source.Annotation;\r
 import org.eclipse.jface.text.source.AnnotationModel;\r
 import org.eclipse.jface.text.source.AnnotationModelEvent;\r
 \r
 /**\r
+ * An <code>AnnotationModel</code> which holds <code>LineAnnotation</code>'s.\r
+ * <p>\r
+ * Major difference with <code>AnnotationModel</code> is that <code>removeAnnotation(Annotation annotation,\r
+ * boolean fireModelChanged)</code> does not remove the annotation from the model, but marks it for \r
+ * deletion in the persistence layer when the document is saved. \r
+ * \r
  * @author p.ciardelli\r
  * @created 25.06.2009\r
  * @version 1.0\r
  */\r
-public class CdmEntityAnnotationModel extends AnnotationModel {\r
+public class LineAnnotationModel extends AnnotationModel {\r
        private static final Logger logger = Logger\r
-                       .getLogger(CdmEntityAnnotationModel.class);\r
+                       .getLogger(LineAnnotationModel.class);\r
        \r
        private Comparator<Annotation> comparator;\r
 \r
-       private IEntityContainerCreator cdmEntityCreator;\r
+       private IEntityContainerCreator entityCreator;\r
        \r
        /**\r
         * Changes the annotation's type and fires model changed \r
@@ -59,20 +64,20 @@ public class CdmEntityAnnotationModel extends AnnotationModel {
                        boolean fireModelChanged) {\r
                // Set data model element for deletion\r
                annotation.markDeleted(true);\r
-               super.removeAnnotation(annotation, fireModelChanged);\r
+//             super.removeAnnotation(annotation, fireModelChanged);\r
        }\r
                \r
        /**\r
         * @param type\r
         */\r
-       public void removeAllTargetsOfType(String type) {\r
+       public void removeTypeFromAllAnnotations(String type) {\r
                Iterator<?> iterator = getAnnotationIterator();\r
                while (iterator.hasNext()) {\r
                        Annotation annotation = ((Annotation) iterator.next());\r
                        if (annotation.getType().equals(type)) {\r
                                annotation.setType(Annotation.TYPE_UNKNOWN);\r
                        }\r
-               }               \r
+               }\r
        }\r
        \r
        /**\r
@@ -146,12 +151,13 @@ public class CdmEntityAnnotationModel extends AnnotationModel {
                \r
                for (Annotation annotation : list) {\r
                        logger.debug(\r
-//                                     annotation.getClass() + " (" +\r
-//                                     annotation.getType() + ") - " +\r
+                                       (annotation.isMarkedDeleted() ?  "DELETED " : "") +\r
+                                       (annotation.getType().equals(IBulkEditorConstants.TYPE_MERGE_CANDIDATE)  ?  "MERGE " : "") +\r
+                                       (annotation.getType().equals(IBulkEditorConstants.TYPE_MERGE_TARGET)  ?  "TARGET " : "") +\r
+                                       (((LineAnnotation) annotation).getEntityContainer().isDirty() ?  "DIRTY " : "") +\r
                                        annotation.getText() + ": o " +\r
                                        getPosition(annotation).getOffset() + ", l " + \r
-                                       getPosition(annotation).getLength() + ", del? " +\r
-                                       getPosition(annotation).isDeleted());\r
+                                       getPosition(annotation).getLength());\r
                }\r
                logger.debug("--------");\r
        }\r
@@ -161,15 +167,15 @@ public class CdmEntityAnnotationModel extends AnnotationModel {
         * @param length\r
         * @return\r
         */\r
-       public List<CdmEntityAnnotation> getAnnotations(int offset, int length) {\r
+       public List<LineAnnotation> getUndeletedAnnotations(int offset, int length) {\r
                \r
-               List<CdmEntityAnnotation> list = new ArrayList<CdmEntityAnnotation>();\r
+               List<LineAnnotation> list = new ArrayList<LineAnnotation>();\r
                \r
                Iterator<?> iterator = getAnnotationIterator(offset, length, true, true);\r
                while (iterator.hasNext()) {\r
                        Object next = iterator.next();\r
-                       if (next instanceof CdmEntityAnnotation) {\r
-                               list.add((CdmEntityAnnotation) next); \r
+                       if (next instanceof LineAnnotation && !((Annotation) next).isMarkedDeleted()) {\r
+                               list.add((LineAnnotation) next); \r
                        }\r
                }\r
                Collections.sort(list, getAnnotationComparator());\r
@@ -189,9 +195,15 @@ public class CdmEntityAnnotationModel extends AnnotationModel {
                 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)\r
                 */\r
                public int compare(Annotation annotation1, Annotation annotation2) {\r
-                       int offset1 = CdmEntityAnnotationModel.this.\r
+                       if (annotation1.isMarkedDeleted() && !annotation2.isMarkedDeleted()) {\r
+                               return 1;\r
+                       }\r
+                       if (!annotation1.isMarkedDeleted() && annotation2.isMarkedDeleted()) {\r
+                               return -1;\r
+                       }\r
+                       int offset1 = LineAnnotationModel.this.\r
                                                                getPosition(annotation1).getOffset();\r
-                       int offset2 = CdmEntityAnnotationModel.this.\r
+                       int offset2 = LineAnnotationModel.this.\r
                                                                getPosition(annotation2).getOffset();\r
                        if (offset1 > offset2) {\r
                                return 1;\r
@@ -204,13 +216,13 @@ public class CdmEntityAnnotationModel extends AnnotationModel {
        }\r
        \r
        /**\r
-        * The annotation model is assigned responsibility for creating new CDM entities\r
+        * The annotation model is assigned responsibility for creating new containers\r
         * from blocks of text.\r
         * \r
-        * @param cdmEntityCreator\r
+        * @param entityCreator\r
         */\r
-       public void setCdmEntityCreator(IEntityContainerCreator cdmEntityCreator) {\r
-               this.cdmEntityCreator = cdmEntityCreator;\r
+       public void setEntityContainerCreator(IEntityContainerCreator entityCreator) {\r
+               this.entityCreator = entityCreator;\r
        }\r
        \r
        /**\r
@@ -223,9 +235,9 @@ public class CdmEntityAnnotationModel extends AnnotationModel {
         */\r
        public Annotation createAnnotation(String text) {\r
                Annotation annotation = null;\r
-               if (cdmEntityCreator != null) {\r
-                       IEntityContainer<?> container = cdmEntityCreator.createContainer(text);\r
-                       annotation = new CdmEntityAnnotation(container);\r
+               if (entityCreator != null) {\r
+                       IEntityContainer<?> container = entityCreator.createContainer(text);\r
+                       annotation = new LineAnnotation(container);\r
                }\r
                return annotation;\r
        }\r
index 62846453898c9022f6377fb1dc2083e122da84f3..4fda27d29630d82b605acf7492f125d7e9f4aeb9 100644 (file)
@@ -52,8 +52,8 @@ public class LineSelectionSource implements ILineSelectionSource {
                        getAnnotationIterator(offset, length, true, true);\r
                        if (iterator.hasNext()) {\r
                                Annotation annotation = (Annotation) iterator.next();\r
-                               if (annotation instanceof CdmEntityAnnotation) {\r
-                                       IEntityContainer<?> container = ((CdmEntityAnnotation) annotation).getEntityContainer();\r
+                               if (annotation instanceof LineAnnotation) {\r
+                                       IEntityContainer<?> container = ((LineAnnotation) annotation).getEntityContainer();\r
                                        return container.getPropertySource();\r
                                }\r
                        }\r
index 0673981b9ffb018e4d301f2acc00e2b4c1afa4bf..a0a7e952c14a78394bc56db4be6b88f5af689871 100644 (file)
@@ -29,6 +29,11 @@ public class ReferenceContainer implements IEntityContainer<ReferenceBase<?>> {
        private ReferenceBase<?> reference;\r
        private boolean deleted;\r
        private boolean merged;\r
+       private boolean isNew = false;\r
+\r
+       private ReferenceBase<?> mergeTarget;\r
+\r
+       private boolean dirty = false;\r
 \r
        ReferenceContainer(ReferenceBase<?> reference) {\r
                this.reference = reference;\r
@@ -72,6 +77,7 @@ public class ReferenceContainer implements IEntityContainer<ReferenceBase<?>> {
                logger.debug("Marking  " + reference.getTitleCache() + \r
                " for merger w " + mergeTarget.getTitleCache());        \r
                this.merged = true;\r
+               this.mergeTarget = mergeTarget;\r
        }\r
 \r
        /* (non-Javadoc)\r
@@ -93,7 +99,8 @@ public class ReferenceContainer implements IEntityContainer<ReferenceBase<?>> {
         */\r
        public void setText(String titleCache) {\r
                logger.debug("Changing title cache from " + reference.getTitleCache() + \r
-                               " to " + titleCache);                   \r
+                               " to " + titleCache);           \r
+               dirty  = true;\r
                reference.setTitleCache(titleCache);\r
        }\r
 \r
@@ -104,4 +111,38 @@ public class ReferenceContainer implements IEntityContainer<ReferenceBase<?>> {
                return new ReferencePropertySource(reference);\r
        }\r
 \r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#isMarkedAsNew()\r
+        */\r
+       public boolean isMarkedAsNew() {\r
+               return isNew;\r
+       }\r
+\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#markAsNew()\r
+        */\r
+       public void markAsNew() {\r
+               isNew = true;\r
+       }\r
+\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#getMergeTarget()\r
+        */\r
+       public ReferenceBase<?> getMergeTarget() {\r
+               return mergeTarget;\r
+       }\r
+\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#isDirty()\r
+        */\r
+       public boolean isDirty() {\r
+               return dirty;\r
+       }\r
+\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#setDirty(boolean)\r
+        */\r
+       public void setDirty(boolean dirty) {\r
+               this.dirty = dirty;\r
+       }\r
 }
\ No newline at end of file
index 1cb396663fc79e6d0f67759a4f9cbcbb3c4ec4af..8d89ac35272d86b39f0ea46a57e868cee0c115ba 100644 (file)
@@ -9,16 +9,9 @@
 */\r
 package eu.etaxonomy.taxeditor.bulkeditor;\r
 \r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
 import org.apache.log4j.Logger;\r
 import org.eclipse.ui.IEditorInput;\r
 \r
-import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.model.reference.Journal;\r
-import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
-\r
 /**\r
  * @author p.ciardelli\r
  * @created 25.06.2009\r
@@ -26,40 +19,7 @@ import eu.etaxonomy.cdm.model.reference.ReferenceBase;
  */\r
 public class ReferenceEditorInput extends BulkEditorInput implements\r
                IEditorInput {\r
+       @SuppressWarnings("unused")\r
        private static final Logger logger = Logger\r
                        .getLogger(ReferenceEditorInput.class);\r
-\r
-       private ArrayList<IEntityContainer<?>> list;\r
-       \r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.taxeditor.bulkeditor.BulkEditorInput#getList()\r
-        */\r
-       public List<IEntityContainer<?>> getList() {\r
-               if (list == null) {\r
-                       list = new ArrayList<IEntityContainer<?>>();\r
-                       \r
-                       list.add(createContainer("Acta universitatis carolinae. Biologica Prague"));\r
-                       list.add(createContainer("Acta universitatis asiae mediae. Botanica"));\r
-                       list.add(createContainer("Acta phytogeographica suecica Uppsala"));\r
-                       list.add(createContainer("Acta botanica neerlandica Amsterdam"));\r
-                       list.add(createContainer("Acta geobotanica hungarica Debrecen, Hungary"));\r
-               }\r
-               return list;\r
-       }\r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainerCreator#create(java.lang.String)\r
-        */\r
-       public IEntityContainer<?> createContainer(String titleCache) {\r
-               Journal journal = Journal.NewInstance();\r
-               journal.setTitleCache(titleCache);\r
-               return createContainer(journal);\r
-       }\r
-\r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainerCreator#create(eu.etaxonomy.cdm.model.common.CdmBase)\r
-        */\r
-       public IEntityContainer<?> createContainer(CdmBase cdmEntity) {\r
-               logger.info("creating");\r
-               return new ReferenceContainer((ReferenceBase<?>) cdmEntity);\r
-       }\r
 }
\ No newline at end of file
index f5d403d96f798de95481903bee50d0f5a9681fc1..2972f9e8a95e1d03354eaff312a4b879c1f1d47c 100644 (file)
@@ -28,8 +28,8 @@ import org.eclipse.ui.texteditor.IDocumentProvider;
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
 import eu.etaxonomy.taxeditor.bulkeditor.BulkEditor;\r
 import eu.etaxonomy.taxeditor.bulkeditor.BulkEditorInput;\r
-import eu.etaxonomy.taxeditor.bulkeditor.CdmEntityAnnotation;\r
-import eu.etaxonomy.taxeditor.bulkeditor.CdmEntityAnnotationModel;\r
+import eu.etaxonomy.taxeditor.bulkeditor.LineAnnotation;\r
+import eu.etaxonomy.taxeditor.bulkeditor.LineAnnotationModel;\r
 import eu.etaxonomy.taxeditor.bulkeditor.IBulkEditorConstants;\r
 import eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer;\r
 \r
@@ -52,8 +52,8 @@ public class MergeGroupHandler extends AbstractHandler {
                if (editor instanceof BulkEditor && input instanceof BulkEditorInput) {\r
 \r
                        IDocumentProvider provider = ((BulkEditor) editor).getDocumentProvider();\r
-                       CdmEntityAnnotationModel model = \r
-                                       (CdmEntityAnnotationModel) provider.getAnnotationModel(input);\r
+                       LineAnnotationModel model = \r
+                                       (LineAnnotationModel) provider.getAnnotationModel(input);\r
                        IDocument document = provider.getDocument(input);\r
                        \r
                        // Check whether there are any group annotations\r
@@ -71,7 +71,7 @@ public class MergeGroupHandler extends AbstractHandler {
                                                "No group merge target set", "No group merge target has been set.");\r
                                return null;\r
                        }                       \r
-                       CdmBase targetEntity = ((CdmEntityAnnotation) targetAnnotation).\r
+                       CdmBase targetEntity = ((LineAnnotation) targetAnnotation).\r
                                                                                getEntityContainer().getCdmEntity();\r
                        \r
                        logger.info("Merging group");\r
@@ -84,7 +84,7 @@ public class MergeGroupHandler extends AbstractHandler {
                                        \r
                                        // Mark entity container for merging with target entity\r
                                        IEntityContainer container = \r
-                                                       ((CdmEntityAnnotation) annotation).getEntityContainer();\r
+                                                       ((LineAnnotation) annotation).getEntityContainer();\r
                                        container.markAsMerged(targetEntity);\r
                                        logger.info("Merging " + annotation + " with " + targetAnnotation);\r
                                        \r
@@ -95,6 +95,9 @@ public class MergeGroupHandler extends AbstractHandler {
                                }\r
                        }\r
                        model.printAnnotations();       \r
+                       \r
+                       model.removeTypeFromAllAnnotations(IBulkEditorConstants.TYPE_MERGE_CANDIDATE);\r
+                       model.removeTypeFromAllAnnotations(IBulkEditorConstants.TYPE_MERGE_TARGET);\r
                }\r
                return null;\r
        }\r
index 1917d753402dadcb1c75a298b881697d476da040..e7281d03e614e28ba9dc236f889dc01bc747aa17 100644 (file)
@@ -23,7 +23,7 @@ import org.eclipse.ui.texteditor.IDocumentProvider;
 \r
 import eu.etaxonomy.taxeditor.bulkeditor.BulkEditor;\r
 import eu.etaxonomy.taxeditor.bulkeditor.BulkEditorInput;\r
-import eu.etaxonomy.taxeditor.bulkeditor.CdmEntityAnnotationModel;\r
+import eu.etaxonomy.taxeditor.bulkeditor.LineAnnotationModel;\r
 import eu.etaxonomy.taxeditor.bulkeditor.IBulkEditorConstants;\r
 \r
 /**\r
@@ -44,8 +44,8 @@ public class SetMergeTargetHandler extends AbstractHandler {
                if (editor instanceof BulkEditor && input instanceof BulkEditorInput) {\r
                        \r
                        IDocumentProvider provider = ((BulkEditor) editor).getDocumentProvider();\r
-                       CdmEntityAnnotationModel model = \r
-                                       (CdmEntityAnnotationModel) provider.getAnnotationModel(input);\r
+                       LineAnnotationModel model = \r
+                                       (LineAnnotationModel) provider.getAnnotationModel(input);\r
                        IDocument document = provider.getDocument(input);\r
                        \r
                        ISelection selection = HandlerUtil.getActiveMenuSelection(event);\r
@@ -57,7 +57,7 @@ public class SetMergeTargetHandler extends AbstractHandler {
                                annotation = model.getAnnotationAtLine(line, document);\r
                                \r
                                // Remove existing merge target\r
-                               model.removeAllTargetsOfType(IBulkEditorConstants.TYPE_MERGE_TARGET);\r
+                               model.removeTypeFromAllAnnotations(IBulkEditorConstants.TYPE_MERGE_TARGET);\r
                                \r
                                // Set annotation in current line to merge target\r
                                if (annotation != null) {\r