taxeditor-bulkeditor/plugin.xml -text
taxeditor-bulkeditor/pom.xml -text
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditor.java -text
-taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditorDocumentProvider.java -text
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditorInput.java -text
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/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/IEntityCreator.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/LineEditorDocumentProvider.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
-taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/ReferenceContainer.java -text
+taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/ReferenceCreator.java -text
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/ReferenceEditorInput.java -text
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/handler/MergeGroupHandler.java -text
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/handler/OpenBulkEditorHandler.java -text
@Override\r
public void init(IEditorSite site, IEditorInput input)\r
throws PartInitException {\r
- setDocumentProvider(new BulkEditorDocumentProvider());\r
+ LineEditorDocumentProvider provider = new LineEditorDocumentProvider();\r
+ provider.setEntityCreator(new ReferenceCreator());\r
+ setDocumentProvider(provider);\r
super.init(site, input);\r
}\r
\r
+++ /dev/null
-// $Id$\r
-/**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-package eu.etaxonomy.taxeditor.bulkeditor;\r
-\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\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
-import org.eclipse.jface.text.Document;\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.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 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
- if (element instanceof BulkEditorInput) {\r
- \r
- BulkEditorInput input = (BulkEditorInput) element;\r
- IAnnotationModel model = models.get((BulkEditorInput) element);\r
- \r
- // Create model as necessary\r
- if (model == null) {\r
- model = new LineAnnotationModel();\r
- ((LineAnnotationModel) model).setEntityContainerCreator(this);\r
- models.put(input, model);\r
- } \r
- return model;\r
- }\r
- \r
- return null;\r
- }\r
- \r
- @Override\r
- protected IAnnotationModel createAnnotationModel(Object element)\r
- throws CoreException {\r
- return getAnnotationModel(element);\r
- }\r
-\r
- @Override\r
- public IDocument getDocument(Object element) {\r
- if (element instanceof BulkEditorInput) {\r
- return documents.get((BulkEditorInput) element);\r
- }\r
- return null;\r
- }\r
- \r
- @Override\r
- protected IDocument createDocument(Object element) throws CoreException {\r
- \r
- if (element instanceof BulkEditorInput) {\r
- BulkEditorInput input = (BulkEditorInput) element;\r
- Document document = new Document("");\r
- IAnnotationModel model = getAnnotationModel(element);\r
- \r
- String text = "";\r
- String line;\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 LineAnnotation(container);\r
- model.addAnnotation(annotation, position);\r
- document.set(document.get() + line);\r
- \r
- text += line;\r
- }\r
- }\r
- documents.put(input, document);\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
- 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
- protected IRunnableContext getOperationRunner(IProgressMonitor monitor) {\r
- // TODO Auto-generated method stub\r
- return null;\r
- }\r
- \r
- @Override\r
- public boolean isModifiable(Object element) {\r
- return true;\r
- }\r
- \r
- @Override\r
- public boolean isReadOnly(Object element) {\r
- // 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
*/\r
package eu.etaxonomy.taxeditor.bulkeditor;\r
\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
IRegion lineRegion = document.getLineInformation(i);\r
String lineText = document.get(lineRegion.getOffset(), lineRegion.getLength());\r
\r
- List<LineAnnotation> annotationsCurrentLine = ((LineAnnotationModel) getAnnotationModel()).\r
- getUndeletedAnnotations(lineOffset, lineLength);\r
+ List<LineAnnotation> annotationsCurrentLine = \r
+ ((LineAnnotationModel) getAnnotationModel()).getUndeletedAnnotations(lineOffset, lineLength);\r
\r
if (annotationsCurrentLine.size() == 0) {\r
logger.debug("Adding new annotation " + lineText);\r
addAnnotation(lineText, lineRegion);\r
} else {\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
getAnnotationModel().getPosition(currentAnnotation).setLength(length);\r
- logger.debug("Position after: " + getAnnotationModel().getPosition(currentAnnotation));\r
currentAnnotation.setText(lineText);\r
\r
for (int j = 1; j < annotationsCurrentLine.size(); j++) {\r
- annotationsCurrentLine.get(j).markDeleted(true);\r
- \r
-// getAnnotationModel().removeAnnotation(annotationsCurrentLine.get(j));\r
+ annotationsCurrentLine.get(j).markAsMerged(currentAnnotation.getCdmEntity());\r
+ getAnnotationModel().removeAnnotation(annotationsCurrentLine.get(j));\r
}\r
}\r
}\r
\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
- \r
+ \r
private void addAnnotation(String text, IRegion region) {\r
Position position = new Position(region.getOffset(), region.getLength());\r
Annotation annotation = ((LineAnnotationModel) getAnnotationModel()).createAnnotation(text);\r
\r
void markAsDeleted();\r
\r
- void markAsNew();\r
+ void markAsNew(boolean isNew);\r
\r
boolean isMarkedAsMerged();\r
\r
+++ /dev/null
-// $Id$\r
-/**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-\r
-package eu.etaxonomy.taxeditor.bulkeditor;\r
-\r
-\r
-/**\r
- * @author p.ciardelli\r
- * @created 03.07.2009\r
- * @version 1.0\r
- */\r
-public interface IEntityContainerCreator {\r
-\r
- /**\r
- * Creates both a new container and a new domain object, using\r
- * titleCache.\r
- * \r
- * @param titleCache\r
- * @return\r
- */\r
- IEntityContainer<?> createContainer(String titleCache);\r
- \r
- /**\r
- * Creates a new container using an existing domain object.\r
- * \r
- * @param cdmEntity\r
- * @return\r
- */\r
- IEntityContainer<?> createContainer(Object entity);\r
-}\r
--- /dev/null
+// $Id$\r
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+\r
+package eu.etaxonomy.taxeditor.bulkeditor;\r
+\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+\r
+\r
+/**\r
+ * @author p.ciardelli\r
+ * @created 03.07.2009\r
+ * @version 1.0\r
+ */\r
+public interface IEntityCreator<T extends CdmBase> {\r
+ \r
+ T createEntity(String text);\r
+}\r
*/\r
package eu.etaxonomy.taxeditor.bulkeditor;\r
\r
-import org.eclipse.core.runtime.Assert;\r
+import java.util.Set;\r
+\r
+import org.apache.log4j.Logger;\r
import org.eclipse.jface.text.source.Annotation;\r
\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
+import eu.etaxonomy.taxeditor.propertysheet.reference.ReferencePropertySource;\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
* @created 25.06.2009\r
* @version 1.0\r
*/\r
-public class LineAnnotation extends Annotation {\r
+public class LineAnnotation extends Annotation implements IEntityContainer {\r
+ @SuppressWarnings("unused")\r
+ private static final Logger logger = Logger\r
+ .getLogger(LineAnnotationModel.class);\r
\r
public static final String TYPE_GENERIC = Annotation.TYPE_UNKNOWN;\r
\r
- private IEntityContainer<?> container;\r
+ private Object entity;\r
\r
- public LineAnnotation(IEntityContainer<?> container) {\r
- Assert.isNotNull(container);\r
- this.container = container;\r
+ private boolean dirty = false;\r
+ private boolean markedAsMerged;\r
+ private boolean markedAsNew;\r
+ private CdmBase mergeTarget;\r
+ \r
+ public LineAnnotation(Object entity) {\r
+ this.entity = entity;\r
setType(TYPE_GENERIC);\r
}\r
-\r
- public IEntityContainer<?> getEntityContainer() {\r
- return container;\r
- }\r
\r
+ /* (non-Javadoc)\r
+ * @see org.eclipse.jface.text.source.Annotation#getText()\r
+ */\r
@Override\r
public String getText() {\r
- return container.getEditableText();\r
- }\r
- \r
- @Override\r
- public void markDeleted(boolean deleted) {\r
- super.markDeleted(deleted);\r
- container.markAsDeleted();\r
+ return getEditableText();\r
}\r
\r
+ /* (non-Javadoc)\r
+ * @see org.eclipse.jface.text.source.Annotation#setText(java.lang.String)\r
+ */\r
@Override\r
public void setText(String text) {\r
+ if (entity instanceof ReferenceBase) {\r
+ ((ReferenceBase) entity).setTitleCache(text);\r
+ } \r
+ dirty = true; \r
super.setText(text);\r
- container.setText(text);\r
}\r
\r
@Override\r
// For debugging\r
return getText();\r
}\r
+ \r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#getAttachedEntities()\r
+ */\r
+ public Set getAttachedEntities() {\r
+ // TODO Auto-generated method stub\r
+ return null;\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#getCdmEntity()\r
+ */\r
+ public CdmBase getCdmEntity() {\r
+ if (entity instanceof CdmBase) {\r
+ return (CdmBase) entity;\r
+ }\r
+ return null;\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#getEditableText()\r
+ */\r
+ public String getEditableText() {\r
+ if (entity instanceof ReferenceBase) {\r
+ return ((ReferenceBase) entity).getTitleCache();\r
+ }\r
+ return null;\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#getMergeTarget()\r
+ */\r
+ public CdmBase getMergeTarget() {\r
+ return mergeTarget;\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#getPropertySource()\r
+ */\r
+ public Object getPropertySource() {\r
+ if (entity instanceof ReferenceBase) {\r
+ return new ReferencePropertySource((ReferenceBase) entity); \r
+ }\r
+ return null;\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#isMarkedAsDeleted()\r
+ */\r
+ public boolean isMarkedAsDeleted() {\r
+ return super.isMarkedDeleted();\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#isMarkedAsMerged()\r
+ */\r
+ public boolean isMarkedAsMerged() {\r
+ return markedAsMerged;\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#isMarkedAsNew()\r
+ */\r
+ public boolean isMarkedAsNew() {\r
+ return markedAsNew;\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#markAsDeleted()\r
+ */\r
+ public void markAsDeleted() {\r
+ super.markDeleted(true);\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#markAsMerged(eu.etaxonomy.cdm.model.common.CdmBase)\r
+ */\r
+ public void markAsMerged(CdmBase mergeTarget) {\r
+ this.mergeTarget = mergeTarget;\r
+ markedAsMerged = true;\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#markAsNew()\r
+ */\r
+ public void markAsNew(boolean isNew) {\r
+ markedAsNew = isNew;\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
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#isDirty()\r
+ */\r
+ public boolean isDirty() {\r
+ return dirty;\r
+ }\r
}
\ No newline at end of file
* 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
+ * boolean fireModelChanged)</code> adds annotations marked for removal to a collection for further\r
+ * processing, i.e. when the document is saved. This collection is accessed via <code>getDeletedAnnotations()</code>\r
+ * and <code>clearDeletedAnnotations()</code>.\r
+ * . \r
* \r
* @author p.ciardelli\r
* @created 25.06.2009\r
.getLogger(LineAnnotationModel.class);\r
\r
private Comparator<Annotation> comparator;\r
-\r
- private IEntityContainerCreator entityCreator;\r
+ private IEntityCreator entityCreator;\r
+ private Set<LineAnnotation> deletedAnnotations = new HashSet<LineAnnotation>();\r
\r
/**\r
* Changes the annotation's type and fires model changed \r
boolean fireModelChanged) {\r
// Set data model element for deletion\r
annotation.markDeleted(true);\r
-// super.removeAnnotation(annotation, fireModelChanged);\r
+ deletedAnnotations.add((LineAnnotation) annotation);\r
+ super.removeAnnotation(annotation, fireModelChanged);\r
}\r
\r
/**\r
Collections.sort(list, getAnnotationComparator());\r
return list;\r
}\r
- \r
+ \r
public void printAnnotations() {\r
- logger.debug("--------");\r
+ logger.debug("------------------------");\r
+ logger.debug("Active annotations");\r
+ logger.debug("------------------------");\r
List<Annotation> list = getOrderedAnnotations();\r
\r
for (Annotation annotation : list) {\r
logger.debug(\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
+ (((LineAnnotation) annotation).isMarkedAsMerged() ? "MERGED " : "") +\r
+ (((LineAnnotation) annotation).isDirty() ? "DIRTY " : "") +\r
+ (((LineAnnotation) annotation).isMarkedAsNew() ? "NEW " : "") +\r
annotation.getText() + ": o " +\r
getPosition(annotation).getOffset() + ", l " + \r
getPosition(annotation).getLength());\r
}\r
- logger.debug("--------");\r
+ logger.debug("------------------------");\r
+ logger.debug("Deleted annotations");\r
+ logger.debug("------------------------");\r
+ for (LineAnnotation annotation : deletedAnnotations) {\r
+ logger.debug(\r
+ (annotation.isMarkedDeleted() ? "DELETED " : "") +\r
+ (((LineAnnotation) annotation).isMarkedAsMerged() ? "MERGED " : "") +\r
+ (((LineAnnotation) annotation).isDirty() ? "DIRTY " : "") +\r
+ (((LineAnnotation) annotation).isMarkedAsNew() ? "NEW " : "") +\r
+ annotation.getText() + ": o "); \r
+ }\r
}\r
\r
/**\r
return list;\r
}\r
\r
+ public Set<LineAnnotation> getDeletedAnnotations() {\r
+ return deletedAnnotations;\r
+ }\r
+ \r
+ public void clearDeletedAnnotations() {\r
+ deletedAnnotations.clear();\r
+ }\r
+ \r
private Comparator<Annotation> getAnnotationComparator() {\r
if (comparator == null) {\r
this.comparator = new AnnotationComparator();\r
* \r
* @param entityCreator\r
*/\r
- public void setEntityContainerCreator(IEntityContainerCreator entityCreator) {\r
+ public void setEntityCreator(IEntityCreator entityCreator) {\r
this.entityCreator = entityCreator;\r
}\r
\r
* @return\r
*/\r
public Annotation createAnnotation(String text) {\r
- Annotation annotation = null;\r
+ LineAnnotation annotation = null;\r
if (entityCreator != null) {\r
- IEntityContainer<?> container = entityCreator.createContainer(text);\r
- annotation = new LineAnnotation(container);\r
+ annotation = new LineAnnotation(entityCreator.createEntity(text));\r
+ annotation.markAsNew(true);\r
}\r
return annotation;\r
}\r
--- /dev/null
+// $Id$\r
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+package eu.etaxonomy.taxeditor.bulkeditor;\r
+\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.Iterator;\r
+import java.util.Map;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.eclipse.core.runtime.Assert;\r
+import org.eclipse.core.runtime.CoreException;\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.eclipse.jface.operation.IRunnableContext;\r
+import org.eclipse.jface.text.Document;\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.IAnnotationModel;\r
+import org.eclipse.ui.texteditor.AbstractDocumentProvider;\r
+\r
+/**\r
+ * Using an <code>IEditorPart</code>, creates a document where each line is associated\r
+ * with an entity. Mapping between document positions and entities is stored in\r
+ * <code>LineAnnotation</code>s in a <code>LineAnnotationModdel</code>. \r
+ * <p>\r
+ * Requires an <code>IEntityCreator</code> to create entities for new lines.\r
+ * \r
+ * @author p.ciardelli\r
+ * @created 25.06.2009\r
+ * @version 1.0\r
+ */\r
+public class LineEditorDocumentProvider extends AbstractDocumentProvider {\r
+ private static final Logger logger = Logger\r
+ .getLogger(LineEditorDocumentProvider.class);\r
+ \r
+ private Map<BulkEditorInput, IDocument> documents = \r
+ new HashMap<BulkEditorInput, IDocument>();\r
+\r
+ private Map<BulkEditorInput, IAnnotationModel> annotationModels = \r
+ new HashMap<BulkEditorInput, IAnnotationModel>();\r
+\r
+ private HashMap<BulkEditorInput, ArrayList<Object>> entityLists = \r
+ new HashMap<BulkEditorInput, ArrayList<Object>>();\r
+\r
+ private IEntityCreator<?> entityCreator;\r
+ \r
+ @Override\r
+ public IAnnotationModel getAnnotationModel(Object element) {\r
+ if (element instanceof BulkEditorInput) {\r
+ \r
+ BulkEditorInput input = (BulkEditorInput) element;\r
+ IAnnotationModel model = annotationModels.get((BulkEditorInput) element);\r
+ \r
+ // Create model as necessary\r
+ if (model == null) {\r
+ model = new LineAnnotationModel();\r
+ ((LineAnnotationModel) model).setEntityCreator(getEntityCreator());\r
+ annotationModels.put(input, model);\r
+ } \r
+ return model;\r
+ }\r
+ \r
+ return null;\r
+ }\r
+ \r
+ @Override\r
+ protected IAnnotationModel createAnnotationModel(Object element)\r
+ throws CoreException {\r
+ return getAnnotationModel(element);\r
+ }\r
+\r
+ @Override\r
+ public IDocument getDocument(Object element) {\r
+ if (element instanceof BulkEditorInput) {\r
+ return documents.get((BulkEditorInput) element);\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ @Override\r
+ protected IDocument createDocument(Object element) throws CoreException {\r
+ \r
+ if (element instanceof BulkEditorInput) {\r
+ BulkEditorInput input = (BulkEditorInput) element;\r
+ Document document = new Document("");\r
+ IAnnotationModel model = getAnnotationModel(element);\r
+ \r
+ String text = "";\r
+ String line;\r
+ for (Object entity : getEntityList(element)) {\r
+ \r
+ Annotation annotation = new LineAnnotation(entity);\r
+ \r
+ line = annotation.getText() + document.getDefaultLineDelimiter();\r
+ Position position = new Position(text.length(), line.length());\r
+ model.addAnnotation(annotation, position);\r
+ document.set(document.get() + line);\r
+ \r
+ text += line;\r
+ }\r
+ documents.put(input, document);\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<Object> getEntityList(Object element) {\r
+ if (element instanceof BulkEditorInput) {\r
+ BulkEditorInput input = (BulkEditorInput) element;\r
+ ArrayList<Object> entityList = entityLists.get(input);\r
+ \r
+ // Create object list for input as necessary\r
+ if (entityList == null) {\r
+ entityList = new ArrayList<Object>();\r
+ entityList.add(getEntityCreator().createEntity("Acta universitatis carolinae. Biologica Prague"));\r
+ entityList.add(getEntityCreator().createEntity("Acta universitatis asiae mediae. Botanica"));\r
+ entityList.add(getEntityCreator().createEntity("Acta phytogeographica suecica Uppsala"));\r
+ entityList.add(getEntityCreator().createEntity("Acta botanica neerlandica Amsterdam"));\r
+ entityList.add(getEntityCreator().createEntity("Acta geobotanica hungarica Debrecen, Hungary"));\r
+ entityLists.put(input, entityList);\r
+ } \r
+ return entityList;\r
+ }\r
+ return null;\r
+ }\r
+\r
+ @Override\r
+ protected void doSaveDocument(IProgressMonitor monitor, Object element,\r
+ IDocument document, boolean overwrite) throws CoreException {\r
+ if (element instanceof BulkEditorInput) {\r
+ \r
+ // Get new containers from annotation model\r
+ LineAnnotationModel model = (LineAnnotationModel) getAnnotationModel(element);\r
+ Iterator iterator = model.getAnnotationIterator();\r
+ while (iterator.hasNext()) {\r
+ Annotation annotation = (Annotation) iterator.next();\r
+ if (annotation instanceof IEntityContainer<?>) {\r
+ IEntityContainer<?> container = (IEntityContainer<?>) annotation;\r
+ if (container.isMarkedAsNew() || container.isDirty()) {\r
+ logger.info("Save " + container.getEditableText());\r
+ container.setDirty(false);\r
+ container.markAsNew(false);\r
+ }\r
+ }\r
+ }\r
+ for (LineAnnotation annotation : model.getDeletedAnnotations()) {\r
+ if (annotation.isMarkedAsNew()) {\r
+ continue;\r
+ }\r
+ if (annotation.isMarkedAsMerged()) {\r
+ logger.info("Merge " + annotation.getEditableText() + " into " + annotation.getMergeTarget()); \r
+ }\r
+ logger.info("Deleting " + annotation.getEditableText());\r
+ }\r
+ model.clearDeletedAnnotations();\r
+ }\r
+ }\r
+\r
+ @Override\r
+ protected IRunnableContext getOperationRunner(IProgressMonitor monitor) {\r
+ // TODO Auto-generated method stub\r
+ return null;\r
+ }\r
+ \r
+ @Override\r
+ public boolean isModifiable(Object element) {\r
+ return true;\r
+ }\r
+ \r
+ @Override\r
+ public boolean isReadOnly(Object element) {\r
+ // enables copy & paste\r
+ return false;\r
+ }\r
+\r
+ public void setEntityCreator(IEntityCreator<?> entityCreator) {\r
+ this.entityCreator = entityCreator;\r
+ }\r
+ \r
+ public IEntityCreator<?> getEntityCreator() {\r
+ Assert.isNotNull(entityCreator, "No entity creator set.");\r
+ return entityCreator;\r
+ }\r
+}
\ No newline at end of file
if (iterator.hasNext()) {\r
Annotation annotation = (Annotation) iterator.next();\r
if (annotation instanceof LineAnnotation) {\r
- IEntityContainer<?> container = ((LineAnnotation) annotation).getEntityContainer();\r
- return container.getPropertySource();\r
+ ((IEntityContainer<?>) annotation).getPropertySource();\r
}\r
}\r
} catch (BadLocationException e) {\r
+++ /dev/null
-// $Id$\r
-/**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-package eu.etaxonomy.taxeditor.bulkeditor;\r
-\r
-import java.util.Set;\r
-\r
-import org.apache.log4j.Logger;\r
-\r
-import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
-import eu.etaxonomy.taxeditor.propertysheet.reference.ReferencePropertySource;\r
-\r
-/**\r
- * @author p.ciardelli\r
- * @created 25.06.2009\r
- * @version 1.0\r
- */\r
-public class ReferenceContainer implements IEntityContainer<ReferenceBase<?>> {\r
- private static final Logger logger = Logger\r
- .getLogger(ReferenceContainer.class);\r
- \r
- 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
- }\r
- \r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#getAttachedEntities()\r
- */\r
- public Set<CdmBase> getAttachedEntities() {\r
- // TODO Auto-generated method stub\r
- return null;\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#getCdmEntity()\r
- */\r
- public ReferenceBase<?> getCdmEntity() {\r
- return reference;\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#getEditableText()\r
- */\r
- public String getEditableText() {\r
- return reference.getTitleCache();\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#markAsDeleted()\r
- */\r
- public void markAsDeleted() {\r
- logger.debug("Marking " + reference.getTitleCache() + \r
- " as deleted"); \r
- this.deleted = true;\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#markAsMerged(eu.etaxonomy.cdm.model.common.CdmBase)\r
- */\r
- public void markAsMerged(ReferenceBase<?> mergeTarget) {\r
- 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
- * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#isMarkedAsDeleted()\r
- */\r
- public boolean isMarkedAsDeleted() {\r
- return deleted;\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#isMarkedAsMerged()\r
- */\r
- public boolean isMarkedAsMerged() {\r
- return merged;\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#setText(java.lang.String)\r
- */\r
- public void setText(String titleCache) {\r
- logger.debug("Changing title cache from " + reference.getTitleCache() + \r
- " to " + titleCache); \r
- dirty = true;\r
- reference.setTitleCache(titleCache);\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer#getPropertySource()\r
- */\r
- public Object getPropertySource() {\r
- 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
--- /dev/null
+// $Id$\r
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+\r
+package eu.etaxonomy.taxeditor.bulkeditor;\r
+\r
+import org.apache.log4j.Logger;\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 07.07.2009\r
+ * @version 1.0\r
+ */\r
+public class ReferenceCreator implements IEntityCreator<ReferenceBase> {\r
+ private static final Logger logger = Logger\r
+ .getLogger(ReferenceCreator.class);\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.taxeditor.bulkeditor.IEntityCreator#createEntity(java.lang.String)\r
+ */\r
+ public ReferenceBase createEntity(String text) {\r
+ Journal reference = Journal.NewInstance();\r
+ reference.setTitleCache(text);\r
+ return reference;\r
+ }\r
+}\r
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.LineAnnotation;\r
-import eu.etaxonomy.taxeditor.bulkeditor.LineAnnotationModel;\r
import eu.etaxonomy.taxeditor.bulkeditor.IBulkEditorConstants;\r
import eu.etaxonomy.taxeditor.bulkeditor.IEntityContainer;\r
+import eu.etaxonomy.taxeditor.bulkeditor.LineAnnotationModel;\r
\r
/**\r
* @author p.ciardelli\r
"No group merge target set", "No group merge target has been set.");\r
return null;\r
} \r
- CdmBase targetEntity = ((LineAnnotation) targetAnnotation).\r
- getEntityContainer().getCdmEntity();\r
+ CdmBase targetEntity = ((IEntityContainer<?>) targetAnnotation).getCdmEntity();\r
\r
logger.info("Merging group");\r
model.printAnnotations();\r
document.replace(position.getOffset(), position.getLength(), "");\r
\r
// Mark entity container for merging with target entity\r
- IEntityContainer container = \r
- ((LineAnnotation) annotation).getEntityContainer();\r
- container.markAsMerged(targetEntity);\r
+ ((IEntityContainer) annotation).markAsMerged(targetEntity);\r
logger.info("Merging " + annotation + " with " + targetAnnotation);\r
\r
// Remove annotation from model\r