taxeditor-bulkeditor/icons/merge_target.gif -text
taxeditor-bulkeditor/plugin.xml -text
taxeditor-bulkeditor/pom.xml -text
+taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/annotatedlineeditor/AnnotatedLineDocumentProvider.java -text
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/annotatedlineeditor/AnnotatedLineEditor.java -text
-taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/annotatedlineeditor/AnnotatedLineEditorDocumentProvider.java -text
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/annotatedlineeditor/AnnotatedLineEditorReconcilingStrategy.java -text
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/annotatedlineeditor/AnnotatedLineEditorSourceViewerConfiguration.java -text
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/annotatedlineeditor/EntityDisplayListener.java -text
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/annotatedlineeditor/LineSelectionSource.java -text
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/annotatedlineeditor/LineSelectionViewer.java -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/BulkEditorEntityCreatorService.java -text
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditorLineDisplay.java -text
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditorPersistenceService.java -text
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/handler/OpenBulkEditorHandler.java -text
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/handler/SetMergeTargetHandler.java -text
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/handler/ShowReferencingObjectsHandler.java -text
+taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/handler/ToggleMergeCandidateHandler.java -text
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/BulkEditorInput.java -text
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/NameEditorInput.java -text
taxeditor-bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/ReferenceEditorInput.java -text
* @created 25.06.2009\r
* @version 1.0\r
*/\r
-public class AnnotatedLineEditorDocumentProvider extends AbstractDocumentProvider {\r
+public class AnnotatedLineDocumentProvider extends AbstractDocumentProvider {\r
\r
private static final Logger logger = Logger\r
- .getLogger(AnnotatedLineEditorDocumentProvider.class);\r
+ .getLogger(AnnotatedLineDocumentProvider.class);\r
\r
private Map<IEditorInput, IDocument> documents = \r
new HashMap<IEditorInput, IDocument>();\r
* @return \r
* @throws BadLocationException \r
*/\r
- protected Annotation createAnnotatedLine(Object element, Object entity) throws BadLocationException {\r
+ protected LineAnnotation createAnnotatedLine(Object element, Object entity) throws BadLocationException {\r
\r
Document document = (Document) getDocument(element);\r
ILineDisplayStrategy lineDisplay = getLineDisplayStrategy(element);\r
\r
- Annotation annotation = new LineAnnotation(entity, lineDisplay);\r
+ LineAnnotation annotation = new LineAnnotation(entity, lineDisplay);\r
\r
// Is document zero length, or is last char in document line delimiter?\r
int docLength = document.getLength();\r
\r
lineDisplay.addDisplayListener(entity, \r
new DisplayListener((LineAnnotation) annotation, element, lineDisplay));\r
- \r
- \r
- \r
+ \r
return annotation;\r
}\r
\r
if (annotation instanceof IEntityContainer<?>) {\r
IEntityContainer<?> container = (IEntityContainer<?>) annotation;\r
if (container.isMarkedAsNew() || container.isDirty()) {\r
- persistenceService.save(container.getEntity(), element);\r
+ persistenceService.save(container.getEntity(), element); // save\r
container.setDirty(false);\r
container.markAsNew(false);\r
}\r
continue;\r
}\r
if (annotation.isMarkedAsMerged()) {\r
- persistenceService.merge(annotation.getEntity(), annotation.getMergeTarget(), element); \r
+ persistenceService.merge(annotation.getEntity(), annotation.getMergeTarget(), element); // merge \r
+ } else {\r
+ // TODO clarify w AM whether this needs to be executed on merged objects\r
+ persistenceService.delete(annotation.getEntity(), element); // delete\r
}\r
- persistenceService.delete(annotation.getEntity(), element);\r
}\r
model.clearDeletedAnnotations();\r
}\r
}\r
return null;\r
}\r
+ \r
+ /**\r
+ * @param editorInput\r
+ * @param lineno\r
+ */\r
+ public void removeAnnotatedLine(Object element, int lineno) {\r
+ Document document = (Document) getDocument(element);\r
+ LineAnnotationModel model = (LineAnnotationModel) getAnnotationModel(element);\r
+ LineAnnotation annotation = (LineAnnotation) model.getAnnotationAtLine(lineno, document);\r
+ removeAnnotatedLine(element, annotation);\r
+ }\r
+ \r
+ public void removeAnnotatedLine(Object element, LineAnnotation annotation) {\r
+ if (annotation != null) {\r
+ Document document = (Document) getDocument(element);\r
+ LineAnnotationModel model = (LineAnnotationModel) getAnnotationModel(element);\r
+ \r
+ Position position = model.getPosition(annotation);\r
+ int offset = position.getOffset();\r
+ int length = position.getLength();\r
+ \r
+ Object entity = annotation.getEntity();\r
+ annotation.markAsDeleted();\r
+ model.removeAnnotation(annotation);\r
+ \r
+ // Immediately followed by a delimiter?\r
+ int annotationEnd = offset + length;\r
+ try {\r
+ if (document.getLength() > annotationEnd + 1 && document.get(annotationEnd, 2).equals(document.getDefaultLineDelimiter())) {\r
+ length += 2;\r
+ }\r
+ } catch (BadLocationException e1) {\r
+ // TODO Auto-generated catch block\r
+ e1.printStackTrace();\r
+ }\r
+ \r
+ try {\r
+ document.replace(offset, length, "");\r
+ } catch (BadLocationException e) {\r
+ // TODO Auto-generated catch block\r
+ e.printStackTrace();\r
+ }\r
+ } \r
+ }\r
}
\ No newline at end of file
package eu.etaxonomy.taxeditor.annotatedlineeditor;\r
\r
import org.apache.log4j.Logger;\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
import org.eclipse.jface.text.BadLocationException;\r
import org.eclipse.jface.text.IDocument;\r
-import org.eclipse.jface.text.source.Annotation;\r
import org.eclipse.jface.text.source.ISourceViewer;\r
import org.eclipse.jface.text.source.IVerticalRuler;\r
import org.eclipse.swt.SWT;\r
import org.eclipse.ui.PartInitException;\r
import org.eclipse.ui.editors.text.TextEditor;\r
\r
+import eu.etaxonomy.cdm.api.conversation.ConversationHolder;\r
+import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;\r
+import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;\r
+import eu.etaxonomy.taxeditor.store.CdmStore;\r
+\r
/**\r
* A list-based editor, where each line in the editor's document is associated with a domain object.\r
* <p>\r
* @created 25.06.2009\r
* @version 1.0\r
*/\r
-public class AnnotatedLineEditor extends TextEditor {\r
+public class AnnotatedLineEditor extends TextEditor implements IConversationEnabled, IPostOperationEnabled {\r
@SuppressWarnings("unused")\r
private static final Logger logger = Logger\r
.getLogger(AnnotatedLineEditor.class);\r
\r
+ private ConversationHolder conversation;\r
+ \r
private IEntityPersistenceService persistenceService;\r
private ILineDisplayStrategy lineDisplayStrategy;\r
private IEntityCreatorService entityCreatorService;\r
private IEntityCreator<?> entityCreator;\r
\r
+ /**\r
+ * \r
+ */\r
+ public AnnotatedLineEditor() {\r
+ this.conversation = CdmStore.NewTransactionalConversation();\r
+ }\r
+ \r
@Override\r
public void init(IEditorSite site, IEditorInput input)\r
throws PartInitException {\r
\r
- AnnotatedLineEditorDocumentProvider provider = \r
+ AnnotatedLineDocumentProvider provider = \r
createAnnotatedLineEditorDocumentProvider();\r
if (entityCreatorService != null) {\r
provider.setEntityCreator(entityCreatorService.getEntityCreator(input), input);\r
/**\r
* @return\r
*/\r
- protected AnnotatedLineEditorDocumentProvider createAnnotatedLineEditorDocumentProvider() {\r
- return new AnnotatedLineEditorDocumentProvider();\r
+ protected AnnotatedLineDocumentProvider createAnnotatedLineEditorDocumentProvider() {\r
+ return new AnnotatedLineDocumentProvider();\r
}\r
\r
/**\r
\r
fAnnotationAccess= getAnnotationAccess();\r
fOverviewRuler= createOverviewRuler(getSharedColors()); \r
- LineSelectionViewer viewer = new LineSelectionViewer(parent, ruler, getOverviewRuler(), \r
- isOverviewRulerVisible(), styles | SWT.WRAP);\r
+ LineSelectionViewer viewer = new LineSelectionViewer(parent, ruler, getOverviewRuler(), \r
+ isOverviewRulerVisible(), styles);\r
+// isOverviewRulerVisible(), styles | SWT.WRAP);\r
getSourceViewerDecorationSupport(viewer);\r
\r
return viewer;\r
/** \r
* @param newInstance\r
*/\r
- public void createAnnotatedLineNewObject() {\r
+ public LineAnnotation createAnnotatedLineNewObject() {\r
\r
// Create new object\r
- Object entity = ((AnnotatedLineEditorDocumentProvider) getDocumentProvider()).\r
+ Object entity = ((AnnotatedLineDocumentProvider) getDocumentProvider()).\r
getEntityCreator(getEditorInput()).createEntity(null);\r
\r
- createAnnotatedLine(entity);\r
+ LineAnnotation annotation = createAnnotatedLine(entity);\r
+ if (annotation != null) {\r
+ annotation.markAsNew(true);\r
+ }\r
+ return annotation;\r
}\r
\r
- public void createAnnotatedLine(Object entity) {\r
+ public LineAnnotation createAnnotatedLine(Object entity) {\r
\r
IEditorInput input = getEditorInput();\r
- AnnotatedLineEditorDocumentProvider provider = (AnnotatedLineEditorDocumentProvider) getDocumentProvider();\r
+ AnnotatedLineDocumentProvider provider = (AnnotatedLineDocumentProvider) getDocumentProvider();\r
\r
- Annotation annotation;\r
+ LineAnnotation annotation = null;\r
try {\r
annotation = provider.createAnnotatedLine(input, entity);\r
\r
// TODO Auto-generated catch block\r
e.printStackTrace();\r
} \r
+ return annotation;\r
+ }\r
+ \r
+ /**\r
+ * @param line\r
+ */\r
+ public void removeAnnotatedLine(int lineno) {\r
+ ((AnnotatedLineDocumentProvider) getDocumentProvider()).removeAnnotatedLine(getEditorInput(), lineno);\r
+ }\r
+\r
+ /**\r
+ * @param annotation\r
+ */\r
+ public void removeAnnotatedLine(LineAnnotation annotation) {\r
+ ((AnnotatedLineDocumentProvider) getDocumentProvider()).removeAnnotatedLine(getEditorInput(), annotation);\r
+ }\r
+ \r
+ /* (non-Javadoc)\r
+ * @see org.eclipse.ui.texteditor.AbstractTextEditor#doSave(org.eclipse.core.runtime.IProgressMonitor)\r
+ */\r
+ @Override\r
+ public void doSave(IProgressMonitor progressMonitor) {\r
+ super.doSave(progressMonitor);\r
+ getConversationHolder().commit(true);\r
+ firePropertyChange(PROP_DIRTY);\r
+ }\r
+ \r
+ /* (non-Javadoc)\r
+ * @see org.eclipse.ui.texteditor.AbstractTextEditor#setFocus()\r
+ */\r
+ @Override\r
+ public void setFocus() {\r
+ super.setFocus();\r
+ getConversationHolder().bind();\r
+ // TODO pass focus to underlying widgets?\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()\r
+ */\r
+ public ConversationHolder getConversationHolder() {\r
+ return conversation;\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)\r
+ */\r
+ public void update(CdmDataChangeMap changeEvents) {}\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.taxeditor.operations.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)\r
+ */\r
+ public boolean postOperation(CdmBase objectAffectedByOperation) {\r
+ return false;\r
}\r
}
\ No newline at end of file
* @param type\r
* @return\r
*/\r
- public Set<Annotation> getAllAnnotationsOfType(String type) {\r
- Set<Annotation> candidates = new HashSet<Annotation>();\r
+ public Set<LineAnnotation> getAllAnnotationsOfType(String type) {\r
+ Set<LineAnnotation> candidates = new HashSet<LineAnnotation>();\r
Iterator<?> iterator = getAnnotationIterator();\r
while (iterator.hasNext()) {\r
- Annotation annotation = ((Annotation) iterator.next());\r
+ LineAnnotation annotation = ((LineAnnotation) iterator.next());\r
if (annotation.getType().equals(type)) {\r
candidates.add(annotation);\r
}\r
public ISelection getSelection() {\r
ISelection selection = super.getSelection();\r
if (getDocument() != null) {\r
- return createLineSelection((TextSelection) selection);\r
+ selection = createLineSelection((TextSelection) selection);\r
}\r
return selection;\r
}\r
import java.beans.PropertyChangeListener;\r
\r
import org.apache.log4j.Logger;\r
+import org.eclipse.core.runtime.CoreException;\r
import org.eclipse.jface.dialogs.MessageDialog;\r
+import org.eclipse.jface.dialogs.MessageDialogWithToggle;\r
+import org.eclipse.jface.preference.IPreferenceStore;\r
import org.eclipse.jface.text.IDocument;\r
import org.eclipse.jface.text.source.Annotation;\r
+import org.eclipse.jface.text.source.AnnotationModel;\r
import org.eclipse.jface.text.source.ISourceViewer;\r
import org.eclipse.jface.text.source.IVerticalRuler;\r
+import org.eclipse.jface.window.Window;\r
import org.eclipse.swt.SWT;\r
import org.eclipse.swt.custom.StyledText;\r
import org.eclipse.swt.events.MouseAdapter;\r
import org.eclipse.ui.IEditorSite;\r
import org.eclipse.ui.PartInitException;\r
\r
-import eu.etaxonomy.cdm.api.conversation.ConversationHolder;\r
-import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;\r
-import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;\r
import eu.etaxonomy.taxeditor.annotatedlineeditor.AnnotatedLineEditor;\r
-import eu.etaxonomy.taxeditor.annotatedlineeditor.AnnotatedLineEditorSourceViewerConfiguration;\r
import eu.etaxonomy.taxeditor.annotatedlineeditor.LineAnnotation;\r
import eu.etaxonomy.taxeditor.annotatedlineeditor.LineAnnotationModel;\r
import eu.etaxonomy.taxeditor.bulkeditor.input.BulkEditorInput;\r
-import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;\r
-import eu.etaxonomy.taxeditor.store.CdmStore;\r
+import eu.etaxonomy.taxeditor.preference.PreferencesUtil;\r
\r
/**\r
* @author p.ciardelli\r
* @created 07.07.2009\r
* @version 1.0\r
*/\r
-public class BulkEditor extends AnnotatedLineEditor implements IConversationEnabled, IPostOperationEnabled, PropertyChangeListener {\r
+public class BulkEditor extends AnnotatedLineEditor implements PropertyChangeListener {\r
private static final Logger logger = Logger.getLogger(BulkEditor.class);\r
\r
public static final String ID = "bulkeditor.editor";\r
- \r
- private ConversationHolder conversation;\r
+\r
+ private boolean isInitialFocus = true;\r
\r
/**\r
* \r
public BulkEditor() {\r
super();\r
\r
- this.conversation = CdmStore.NewTransactionalConversation();\r
- \r
/**\r
* see AbstractTextEditor javadoc for explanation of context menu ids\r
*/\r
protected ISourceViewer createSourceViewer(Composite parent,\r
IVerticalRuler ruler, int styles) {\r
ISourceViewer viewer = super.createSourceViewer(parent, ruler, styles);\r
- setSourceViewerConfiguration(new AnnotatedLineEditorSourceViewerConfiguration());\r
addToggleMergeCandidateListener(ruler.getControl());\r
return viewer;\r
}\r
}\r
}\r
}\r
+\r
+ /* (non-Javadoc)\r
+ * @see org.eclipse.ui.editors.text.TextEditor#doSetInput(org.eclipse.ui.IEditorInput)\r
+ */\r
+ @Override\r
+ protected void doSetInput(IEditorInput input) throws CoreException {\r
+ // TODO Auto-generated method stub\r
+ super.doSetInput(input);\r
+ }\r
\r
/* (non-Javadoc)\r
* @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#isEditable()\r
return false;\r
}\r
\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.taxeditor.annotatedlineeditor.AnnotatedLineEditor#setFocus()\r
+ */\r
+ @Override\r
+ public void setFocus() {\r
+ // TODO Auto-generated method stub\r
+ super.setFocus();\r
+\r
+ // TODO find a better place to put this - I wanted to show this dialog after initial contents of \r
+ // Editor are displayed\r
+ if (isInitialFocus) {\r
+ displayWarningDialog();\r
+ isInitialFocus = false;\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * \r
+ */\r
+ private void displayWarningDialog() {\r
+ IPreferenceStore prefs = PreferencesUtil.getPreferenceStore();\r
+ if (!prefs.getBoolean(PreferencesUtil.HIDE_BULKEDITOR_INFO)) {\r
+ String msg = "The Bulk Editor allows you to edit objects that are used to reference other objects, such as names, references, and authors.\n\n" +\r
+ "Any changes you make to an object in the Bulk Editor will be displayed wherever the object is used.\n\n" +\r
+ "For instance, a reference may be displayed with both a name and a descriptive element. If the reference name is changed here, the display of both the name and the descriptive element will be affected.";\r
+ MessageDialogWithToggle dialog = MessageDialogWithToggle.openOkCancelConfirm\r
+ (getSite().getShell(), "Bulk Editor", msg, "Do not show this message again", \r
+ false, null, PreferencesUtil.HIDE_BULKEDITOR_INFO);\r
+ if (dialog.getReturnCode() == Window.OK) { \r
+ prefs.setValue(PreferencesUtil.HIDE_BULKEDITOR_INFO, dialog.getToggleState());\r
+ }\r
+ }\r
+ }\r
+ \r
/**\r
* @param control\r
*/\r
/**\r
* @param line\r
*/\r
- private void toggleMergeCandidateAnnotation(int line) {\r
+ public void toggleMergeCandidateAnnotation(int line) {\r
+ // TODO merge this with duplicate code in SetMergeCandidateHandler\r
IDocument document = getSourceViewer().getDocument();\r
LineAnnotationModel model = \r
(LineAnnotationModel) getSourceViewer().getAnnotationModel();\r
return;\r
}\r
}\r
+ ((AnnotationModel) getDocumentProvider().getAnnotationModel(getEditorInput())).removeAllAnnotations();\r
setInput(getEditorInput());\r
}\r
}\r
- \r
- /* (non-Javadoc)\r
- * @see org.eclipse.ui.texteditor.AbstractTextEditor#setFocus()\r
- */\r
- @Override\r
- public void setFocus() {\r
- super.setFocus();\r
- getConversationHolder().bind();\r
- // TODO pass focus to underlying widgets?\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()\r
- */\r
- public ConversationHolder getConversationHolder() {\r
- return conversation;\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)\r
- */\r
- public void update(CdmDataChangeMap changeEvents) {\r
- // pass\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.taxeditor.operations.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)\r
- */\r
- public boolean postOperation(CdmBase objectAffectedByOperation) {\r
- // TODO Auto-generated method stub\r
- return false;\r
- }\r
- \r
- /**\r
- * @param line\r
- */\r
- public void removeAnnotatedLine(int lineno) {\r
- ((BulkEditorDocumentProvider) getDocumentProvider()).removeAnnotatedLine(getEditorInput(), lineno);\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
-\r
-package eu.etaxonomy.taxeditor.bulkeditor;\r
-\r
-import org.apache.log4j.Logger;\r
-import org.eclipse.jface.text.BadLocationException;\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.swt.SWT;\r
-import org.eclipse.swt.custom.StyleRange;\r
-import org.eclipse.ui.IEditorInput;\r
-\r
-import eu.etaxonomy.taxeditor.annotatedlineeditor.AnnotatedLineEditorDocumentProvider;\r
-import eu.etaxonomy.taxeditor.annotatedlineeditor.LineAnnotation;\r
-import eu.etaxonomy.taxeditor.annotatedlineeditor.LineAnnotationModel;\r
-\r
-/**\r
- * @author p.ciardelli\r
- * @created 25.08.2009\r
- * @version 1.0\r
- */\r
-public class BulkEditorDocumentProvider extends\r
- AnnotatedLineEditorDocumentProvider {\r
- private static final Logger logger = Logger\r
- .getLogger(BulkEditorDocumentProvider.class);\r
- \r
- /**\r
- * @param newInstance\r
- * @return \r
- */\r
- public StyleRange createAnnotatedLine(Object element) {\r
- // TODO square with reconciler, move to AnnotatedLineEditorDocumentProvider\r
- Document document = (Document) getDocument(element);\r
- try {\r
- \r
- // Create new empty object\r
- Annotation annotation = ((LineAnnotationModel) getAnnotationModel(element)).createAnnotation("");\r
- Object entity = ((LineAnnotation) annotation).getEntity();\r
- \r
- // Get text for object w no cache\r
- String text = getLineDisplayStrategy(element).getEmptyCacheMessage(entity);\r
- \r
- int styleLength = text.length();\r
- int offset = document.getLength();\r
- \r
- // Check whether last character is line delimiter\r
- String lastChar = null;\r
- if (offset > 1) { \r
- lastChar = document.get(offset - 2, 2);\r
- }\r
- String delimiter = document.getDefaultLineDelimiter();\r
- if (delimiter.equals(lastChar) || offset == 0) {\r
- // do nothing\r
- } else {\r
- text = document.getDefaultLineDelimiter() + text; \r
- }\r
- document.replace(offset, 0, text);\r
- \r
- StyleRange styleRange = new StyleRange();\r
- styleRange.start = offset;\r
- styleRange.length = styleLength;\r
- styleRange.fontStyle = SWT.ITALIC;\r
- \r
- // Add annotation to model\r
- getAnnotationModel(element).addAnnotation(annotation, new Position(offset, styleLength));\r
- \r
- return styleRange;\r
- } catch (BadLocationException e) {\r
- // TODO Auto-generated catch block\r
- e.printStackTrace();\r
- }\r
- return null;\r
- }\r
-\r
- /**\r
- * @param editorInput\r
- * @param lineno\r
- */\r
- public void removeAnnotatedLine(Object element, int lineno) {\r
- Document document = (Document) getDocument(element);\r
- LineAnnotationModel model = (LineAnnotationModel) getAnnotationModel(element);\r
- LineAnnotation annotation = (LineAnnotation) model.getAnnotationAtLine(lineno, document);\r
- if (annotation != null) {\r
- \r
- Position position = model.getPosition(annotation);\r
- int offset = position.getOffset();\r
- int length = position.getLength();\r
- \r
- Object entity = annotation.getEntity();\r
- getPersistenceService(element).delete(entity, element);\r
- annotation.markAsDeleted();\r
- model.removeAnnotation(annotation);\r
- \r
- // Immediately followed by a delimiter?\r
- int annotationEnd = offset + length;\r
- try {\r
- if (document.getLength() > annotationEnd + 1 && document.get(annotationEnd, 2).equals(document.getDefaultLineDelimiter())) {\r
- length += 2;\r
- }\r
- } catch (BadLocationException e1) {\r
- // TODO Auto-generated catch block\r
- e1.printStackTrace();\r
- }\r
- \r
- try {\r
- document.replace(offset, length, "");\r
- } catch (BadLocationException e) {\r
- // TODO Auto-generated catch block\r
- e.printStackTrace();\r
- }\r
- }\r
- }\r
-}\r
\r
package eu.etaxonomy.taxeditor.bulkeditor;\r
\r
-import java.beans.PropertyChangeEvent;\r
-import java.beans.PropertyChangeListener;\r
-\r
import org.apache.log4j.Logger;\r
import org.eclipse.jface.action.IStatusLineManager;\r
import org.eclipse.swt.graphics.Image;\r
import org.apache.log4j.Logger;\r
\r
import eu.etaxonomy.cdm.model.common.TimePeriod;\r
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
import eu.etaxonomy.cdm.model.reference.StrictReferenceBase;\r
+import eu.etaxonomy.cdm.strategy.merge.MergeException;\r
import eu.etaxonomy.taxeditor.annotatedlineeditor.IEntityPersistenceService;\r
import eu.etaxonomy.taxeditor.annotatedlineeditor.IdentifiableEntityComparator;\r
import eu.etaxonomy.taxeditor.bulkeditor.input.BulkEditorInput;\r
*/\r
public boolean create(Object entity, Object element) {\r
logger.info("Create " + entity);\r
- return true;\r
+ return save(entity, element);\r
}\r
\r
/* (non-Javadoc)\r
*/\r
public boolean delete(Object entity, Object element) {\r
logger.info("Delete " + entity);\r
+ if (entity instanceof ReferenceBase) {\r
+ CdmStore.getReferenceService().delete((ReferenceBase) entity);\r
+ }\r
+ if (entity instanceof TaxonNameBase) {\r
+ CdmStore.getNameService().delete((TaxonNameBase) entity); \r
+ }\r
return true;\r
}\r
\r
*/\r
public boolean merge(Object entity, Object mergeTarget, Object element) {\r
logger.info("Merge " + entity + " into " + mergeTarget);\r
+ if (entity instanceof ReferenceBase) {\r
+ try {\r
+ CdmStore.getCommonService().merge((ReferenceBase) mergeTarget, (ReferenceBase) entity, null);\r
+ } catch (MergeException e) {\r
+ // TODO Auto-generated catch block\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ if (entity instanceof TaxonNameBase) {\r
+ logger.warn("Merging not yet implemented for taxon name base"); \r
+ }\r
return true;\r
}\r
\r
*/\r
public boolean save(Object entity, Object element) {\r
logger.info("Save " + entity);\r
+ if (entity instanceof ReferenceBase) {\r
+ CdmStore.getReferenceService().saveOrUpdate((ReferenceBase) entity); \r
+ }\r
+ if (entity instanceof TaxonNameBase) {\r
+ CdmStore.getNameService().saveOrUpdate((TaxonNameBase) entity); \r
+ }\r
return true;\r
}\r
}\r
\r
import org.apache.log4j.Logger;\r
\r
-import eu.etaxonomy.cdm.model.reference.Journal;\r
+import eu.etaxonomy.cdm.model.reference.Book;\r
import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
import eu.etaxonomy.taxeditor.annotatedlineeditor.IEntityCreator;\r
\r
*/\r
public ReferenceBase createEntity(String text) {\r
// TODO configure default reference type\r
- Journal reference = Journal.NewInstance();\r
+ Book reference = Book.NewInstance();\r
reference.setTitleCache(text);\r
return reference;\r
}\r
import org.eclipse.core.commands.ExecutionException;\r
import org.eclipse.jface.text.IDocument;\r
import org.eclipse.jface.text.TextSelection;\r
-import org.eclipse.jface.text.source.Annotation;\r
import org.eclipse.jface.viewers.ISelection;\r
import org.eclipse.ui.IEditorInput;\r
import org.eclipse.ui.IEditorPart;\r
\r
ISelection selection = HandlerUtil.getActiveMenuSelection(event);\r
if (selection instanceof TextSelection) {\r
- Annotation annotation = null;\r
\r
- // Get annotation in current line\r
+ // Get current line\r
int line = ((TextSelection) selection).getStartLine();\r
\r
if (editor instanceof BulkEditor) {\r
import org.eclipse.core.commands.ExecutionEvent;\r
import org.eclipse.core.commands.ExecutionException;\r
import org.eclipse.jface.dialogs.MessageDialog;\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.ui.IEditorInput;\r
import org.eclipse.ui.IEditorPart;\r
import org.eclipse.ui.handlers.HandlerUtil;\r
import org.eclipse.ui.texteditor.IDocumentProvider;\r
\r
-import eu.etaxonomy.cdm.model.common.CdmBase;\r
import eu.etaxonomy.taxeditor.annotatedlineeditor.AnnotatedLineEditor;\r
import eu.etaxonomy.taxeditor.annotatedlineeditor.IEntityContainer;\r
+import eu.etaxonomy.taxeditor.annotatedlineeditor.LineAnnotation;\r
import eu.etaxonomy.taxeditor.annotatedlineeditor.LineAnnotationModel;\r
+import eu.etaxonomy.taxeditor.bulkeditor.BulkEditor;\r
import eu.etaxonomy.taxeditor.bulkeditor.IBulkEditorConstants;\r
import eu.etaxonomy.taxeditor.bulkeditor.input.BulkEditorInput;\r
\r
\r
IEditorPart editor = HandlerUtil.getActiveEditor(event);\r
IEditorInput input = editor.getEditorInput();\r
- if (editor instanceof AnnotatedLineEditor && input instanceof BulkEditorInput) {\r
+ if (editor instanceof BulkEditor && input instanceof BulkEditorInput) {\r
\r
- IDocumentProvider provider = ((AnnotatedLineEditor) editor).getDocumentProvider();\r
+ IDocumentProvider provider = ((BulkEditor) editor).getDocumentProvider();\r
LineAnnotationModel model = \r
(LineAnnotationModel) provider.getAnnotationModel(input);\r
- IDocument document = provider.getDocument(input);\r
\r
// Check whether there are any group annotations\r
- Set<Annotation> candidateAnnotations = model.getAllAnnotationsOfType(IBulkEditorConstants.TYPE_MERGE_CANDIDATE);\r
+ Set<LineAnnotation> candidateAnnotations = model.getAllAnnotationsOfType(IBulkEditorConstants.TYPE_MERGE_CANDIDATE);\r
if (candidateAnnotations.size() == 0) {\r
MessageDialog.openWarning(HandlerUtil.getActiveShell(event), \r
"No merge candidates", "No objects have been chosen for merging.");\r
Object targetEntity = ((IEntityContainer<?>) targetAnnotation).getEntity();\r
\r
logger.info("Merging group");\r
- model.printAnnotations();\r
- for (Annotation annotation : candidateAnnotations) {\r
- try {\r
- // Remove text from document\r
- Position position = model.getPosition(annotation);\r
- document.replace(position.getOffset(), position.getLength(), "");\r
- \r
- // Mark entity container for merging with target entity\r
- ((IEntityContainer) annotation).markAsMerged(targetEntity);\r
- logger.info("Merging " + annotation + " with " + targetAnnotation);\r
- \r
- // Remove annotation from model\r
- model.removeAnnotation(annotation);\r
- } catch (BadLocationException e) {\r
- // Do nothing\r
- }\r
+// model.printAnnotations();\r
+ for (LineAnnotation annotation : candidateAnnotations) {\r
+ \r
+ ((BulkEditor) editor).removeAnnotatedLine(annotation);\r
+ \r
+ // Mark entity container for merging with target entity\r
+ ((IEntityContainer) annotation).markAsMerged(targetEntity);\r
+ logger.info("Merging " + annotation + " with " + targetAnnotation);\r
+ \r
+ // Remove annotation from model\r
+ model.removeAnnotation(annotation);\r
}\r
- model.printAnnotations(); \r
+// model.printAnnotations(); \r
\r
model.removeTypeFromAllAnnotations(IBulkEditorConstants.TYPE_MERGE_CANDIDATE);\r
model.removeTypeFromAllAnnotations(IBulkEditorConstants.TYPE_MERGE_TARGET);\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.handler;\r
+\r
+import org.eclipse.core.commands.AbstractHandler;\r
+import org.eclipse.core.commands.ExecutionEvent;\r
+import org.eclipse.core.commands.ExecutionException;\r
+import org.eclipse.jface.text.IDocument;\r
+import org.eclipse.jface.text.TextSelection;\r
+import org.eclipse.jface.text.source.Annotation;\r
+import org.eclipse.jface.viewers.ISelection;\r
+import org.eclipse.ui.IEditorInput;\r
+import org.eclipse.ui.IEditorPart;\r
+import org.eclipse.ui.handlers.HandlerUtil;\r
+import org.eclipse.ui.texteditor.IDocumentProvider;\r
+\r
+import eu.etaxonomy.taxeditor.annotatedlineeditor.AnnotatedLineEditor;\r
+import eu.etaxonomy.taxeditor.annotatedlineeditor.LineAnnotation;\r
+import eu.etaxonomy.taxeditor.annotatedlineeditor.LineAnnotationModel;\r
+import eu.etaxonomy.taxeditor.bulkeditor.BulkEditor;\r
+import eu.etaxonomy.taxeditor.bulkeditor.IBulkEditorConstants;\r
+import eu.etaxonomy.taxeditor.bulkeditor.input.BulkEditorInput;\r
+\r
+/**\r
+ * @author p.ciardelli\r
+ * @created 25.06.2009\r
+ * @version 1.0\r
+ */\r
+public class ToggleMergeCandidateHandler extends AbstractHandler {\r
+\r
+ /* (non-Javadoc)\r
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)\r
+ */\r
+ public Object execute(ExecutionEvent event) throws ExecutionException {\r
+ \r
+ IEditorPart editor = HandlerUtil.getActiveEditor(event);\r
+ IEditorInput input = editor.getEditorInput();\r
+ \r
+ if (editor instanceof BulkEditor && input instanceof BulkEditorInput) {\r
+ \r
+ IDocumentProvider provider = ((AnnotatedLineEditor) editor).getDocumentProvider();\r
+ LineAnnotationModel model = \r
+ (LineAnnotationModel) provider.getAnnotationModel(input);\r
+ IDocument document = provider.getDocument(input);\r
+ \r
+ ISelection selection = HandlerUtil.getActiveMenuSelection(event);\r
+ if (selection instanceof TextSelection) {\r
+ Annotation annotation = null;\r
+ \r
+ // Get annotation in current line\r
+ int line = ((TextSelection) selection).getStartLine();\r
+ annotation = model.getAnnotationAtLine(line, document);\r
+ \r
+ if (annotation != null) {\r
+ if (annotation.getType().equals(IBulkEditorConstants.TYPE_MERGE_CANDIDATE)) {\r
+ model.changeAnnotationType(\r
+ annotation, LineAnnotation.TYPE_GENERIC);\r
+ } else {\r
+ model.changeAnnotationType(\r
+ annotation, IBulkEditorConstants.TYPE_MERGE_CANDIDATE);\r
+ }\r
+ }\r
+ }\r
+ } \r
+ return null;\r
+ }\r
+}
\ No newline at end of file
import org.eclipse.ui.progress.IProgressService;\r
\r
import eu.etaxonomy.cdm.api.service.ICommonService;\r
+import eu.etaxonomy.cdm.common.CdmUtils;\r
import eu.etaxonomy.cdm.model.common.CdmBase;\r
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;\r
+import eu.etaxonomy.cdm.model.common.Language;\r
import eu.etaxonomy.cdm.model.common.LanguageStringBase;\r
import eu.etaxonomy.cdm.model.common.OriginalSource;\r
-import eu.etaxonomy.cdm.model.common.ReferencedEntityBase;\r
+import eu.etaxonomy.cdm.model.description.CommonTaxonName;\r
+import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
+import eu.etaxonomy.cdm.model.description.Distribution;\r
+import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;\r
import eu.etaxonomy.cdm.model.description.TextData;\r
+import eu.etaxonomy.cdm.model.location.NamedArea;\r
+import eu.etaxonomy.taxeditor.model.DescriptionHelper;\r
import eu.etaxonomy.taxeditor.propertysheet.name.NonViralNamePropertySource;\r
import eu.etaxonomy.taxeditor.propertysheet.reference.ReferencePropertySource;\r
import eu.etaxonomy.taxeditor.store.CdmStore;\r
if (element instanceof IdentifiableEntity) {\r
return ((IdentifiableEntity) element).getTitleCache();\r
}\r
- if (element instanceof ReferencedEntityBase) {\r
- return ((ReferencedEntityBase) element).getOriginalNameString();\r
+ if (element instanceof OriginalSource) {\r
+ OriginalSource originalSource = (OriginalSource) element;\r
+// ReferenceBase citation = HibernateProxyHelper.deproxy(originalSource.getCitation(), ReferenceBase.class);\r
+ return CdmUtils.concat(";", new String[]{originalSource.getIdNamespace(), originalSource.getIdInSource()});\r
}\r
if (element instanceof LanguageStringBase) {\r
return ((LanguageStringBase) element).getText();\r
}\r
+ if (element instanceof DescriptionElementBase) {\r
+ return getCache((DescriptionElementBase) element); \r
+ }\r
// TODO write return texts for NameRelationship, HomotypicalGroup, SpecimenTypeDesignation, etc.\r
- return null;\r
+ return element.toString();\r
+ }\r
+ \r
+ /**\r
+ * Returns whatever the element's title cache equivalent is,\r
+ * depending on its class.\r
+ * \r
+ * @param element\r
+ * @param language\r
+ * @return \r
+ */\r
+ public String getCache(DescriptionElementBase element, \r
+ Language language) {\r
+ String cache = null;\r
+ if (element instanceof TextData) {\r
+ cache = ((TextData) element).getText(language);\r
+ }\r
+ if (element instanceof CommonTaxonName) {\r
+ cache = ((CommonTaxonName) element).getName();\r
+ }\r
+ if (element instanceof Distribution) {\r
+ Distribution distribution = (Distribution) element;\r
+ \r
+ NamedArea area = distribution.getArea();\r
+ PresenceAbsenceTermBase<?> status = distribution.getStatus();\r
+ \r
+ if (status != null) {\r
+ cache = area.getLabel() + ", " + status.getLabel();\r
+ }\r
+ }\r
+ return cache == null ? "" : cache;\r
+ }\r
+\r
+ /**\r
+ * Returns whatever the element's title cache equivalent is,\r
+ * depending on its class, using the default language.\r
+ * \r
+ * @param element\r
+ * @return \r
+ */\r
+ public String getCache(DescriptionElementBase element) {\r
+ return getCache(element, Language.DEFAULT());\r
}\r
}\r
package eu.etaxonomy.taxeditor.bulkeditor.referencingobjects;\r
\r
import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.Comparator;\r
+import java.util.HashSet;\r
+import java.util.List;\r
import java.util.Set;\r
\r
import org.apache.log4j.Logger;\r
import org.eclipse.jface.viewers.ISelection;\r
import org.eclipse.jface.viewers.IStructuredSelection;\r
-import org.eclipse.jface.viewers.ListViewer;\r
import org.eclipse.jface.viewers.TableViewer;\r
import org.eclipse.jface.viewers.TableViewerColumn;\r
import org.eclipse.swt.SWT;\r
import org.eclipse.ui.IEditorPart;\r
import org.eclipse.ui.part.ViewPart;\r
\r
+import eu.etaxonomy.cdm.api.conversation.ConversationHolder;\r
+import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;\r
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;\r
import eu.etaxonomy.taxeditor.annotatedlineeditor.LineSelection;\r
+import eu.etaxonomy.taxeditor.store.CdmStore;\r
\r
/**\r
* @author p.ciardelli\r
* @created 08.07.2009\r
* @version 1.0\r
*/\r
-public class ReferencingObjectsView extends ViewPart {\r
+public class ReferencingObjectsView extends ViewPart implements IConversationEnabled {\r
private static final Logger logger = Logger\r
.getLogger(ReferencingObjectsView.class);\r
\r
public static final String ID = "taxeditor-bulkeditor.referencingobjectsview";\r
\r
private IReferencingObjectsService referencingObjectsService;\r
- private Set<CdmBase> referencingObjects;\r
+ private List<CdmBase> referencingObjects;\r
private CdmBase referencedObject;\r
\r
private TableViewer referencingObjectsViewer;\r
+\r
+ private ConversationHolder conversation;\r
+ \r
+ public ReferencingObjectsView() {\r
+ this.conversation = CdmStore.NewTransactionalConversation();\r
+ }\r
\r
/* (non-Javadoc)\r
* @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)\r
*/\r
@Override\r
public void setFocus() {\r
+ logger.warn("set focus");\r
referencingObjectsViewer.getControl().setFocus();\r
}\r
\r
* \r
*/\r
public void updateReferencingObjects() {\r
+ getConversationHolder().bind();\r
try {\r
IEditorPart editor = getSite().getPage().getActiveEditor();\r
ISelection selection = editor.getEditorSite().getSelectionProvider()\r
CdmBase referencedObject = referencingObjectsService.getReferencedObject(entity);\r
if (referencedObject != null) {\r
this.referencedObject = referencedObject;\r
- this.referencingObjects = referencingObjectsService.getReferencingObjects(entity);\r
+ Set<CdmBase> referencingObjectsTemp = referencingObjectsService.getReferencingObjects(entity);\r
+ this.referencingObjects = new ArrayList<CdmBase>();\r
+ for (Object object : referencingObjectsTemp) {\r
+ this.referencingObjects.add((CdmBase) HibernateProxyHelper.deproxy(object));\r
+ }\r
+// Collections.sort(this.referencingObjects, new ReferencingClassComparator());\r
updateView();\r
} \r
}\r
}\r
}\r
\r
+ class ReferencingClassComparator implements Comparator<CdmBase> {\r
+\r
+ /* (non-Javadoc)\r
+ * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)\r
+ */\r
+ public int compare(CdmBase o1, CdmBase o2) {\r
+ String string1 = referencingObjectsService.getObjectClass(o1);\r
+ String string2 = referencingObjectsService.getObjectClass(o2);\r
+ int classCompare = string1.compareToIgnoreCase(string2);\r
+ if (classCompare == 0) {\r
+ string1 = referencingObjectsService.getObjectDescription(o1);\r
+ string2 = referencingObjectsService.getObjectDescription(o2);\r
+ return string1.compareToIgnoreCase(string2);\r
+ } else {\r
+ return classCompare;\r
+ }\r
+ }\r
+ \r
+ }\r
+ \r
/**\r
* \r
*/\r
private void updateView() {\r
+ \r
referencingObjectsViewer.setInput(referencingObjects);\r
setContentDescription("'" + referencedObject + "' is referenced by:");\r
}\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()\r
+ */\r
+ public ConversationHolder getConversationHolder() {\r
+ return conversation;\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)\r
+ */\r
+ public void update(CdmDataChangeMap changeEvents) {\r
+ // TODO Auto-generated method stub\r
+ \r
+ }\r
}\r