From: jenkins
Date: Fri, 11 Sep 2015 12:15:00 +0000 (+0200)
Subject: Merge branch 'release/3.8.0'
X-Git-Tag: 3.8.0
X-Git-Url: https://dev.e-taxonomy.eu/gitweb/taxeditor.git/commitdiff_plain/98060576787fce54ab247c05e0020a90db973f09?hp=99d52dfc5a92d4fb85bbe0ed40b9e73836255d96
Merge branch 'release/3.8.0'
Conflicts:
eu.etaxonomy.taxeditor.application/META-INF/MANIFEST.MF
eu.etaxonomy.taxeditor.application/pom.xml
eu.etaxonomy.taxeditor.bulkeditor/META-INF/MANIFEST.MF
eu.etaxonomy.taxeditor.bulkeditor/pom.xml
eu.etaxonomy.taxeditor.cdmlib/META-INF/MANIFEST.MF
eu.etaxonomy.taxeditor.cdmlib/pom.xml
eu.etaxonomy.taxeditor.editor/META-INF/MANIFEST.MF
eu.etaxonomy.taxeditor.editor/pom.xml
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/handler/MoveDescriptionElementsHandler.java
eu.etaxonomy.taxeditor.feature.platform/feature.xml
eu.etaxonomy.taxeditor.feature.platform/pom.xml
eu.etaxonomy.taxeditor.feature/feature.xml
eu.etaxonomy.taxeditor.feature/pom.xml
eu.etaxonomy.taxeditor.help/META-INF/MANIFEST.MF
eu.etaxonomy.taxeditor.help/pom.xml
eu.etaxonomy.taxeditor.navigation/META-INF/MANIFEST.MF
eu.etaxonomy.taxeditor.navigation/pom.xml
eu.etaxonomy.taxeditor.printpublisher/META-INF/MANIFEST.MF
eu.etaxonomy.taxeditor.printpublisher/pom.xml
eu.etaxonomy.taxeditor.store/META-INF/MANIFEST.MF
eu.etaxonomy.taxeditor.store/pom.xml
eu.etaxonomy.taxeditor/eu.etaxonomy.taxeditor.product
eu.etaxonomy.taxeditor/pom.xml
pom.xml
---
diff --git a/eu.etaxonomy.taxeditor.application/META-INF/MANIFEST.MF b/eu.etaxonomy.taxeditor.application/META-INF/MANIFEST.MF
index 525951803..a876b381a 100644
--- a/eu.etaxonomy.taxeditor.application/META-INF/MANIFEST.MF
+++ b/eu.etaxonomy.taxeditor.application/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Application
Bundle-SymbolicName: eu.etaxonomy.taxeditor.application;singleton:=true
-Bundle-Version: 3.7.1
+Bundle-Version: 3.8.0
Bundle-Activator: eu.etaxonomy.taxeditor.TaxonomicEditorPlugin
Bundle-Vendor: EDIT
Bundle-Localization: OSGI-INF/l10n/plugin
@@ -21,6 +21,7 @@ Require-Bundle: org.eclipse.ui,
eu.etaxonomy.taxeditor.bulkeditor,
eu.etaxonomy.taxeditor.editor,
eu.etaxonomy.taxeditor.printpublisher,
+ eu.etaxonomy.taxeditor.molecular,
eu.etaxonomy.taxeditor.help,
org.eclipse.equinox.ds,
org.eclipse.equinox.util,
diff --git a/eu.etaxonomy.taxeditor.application/plugin.xml b/eu.etaxonomy.taxeditor.application/plugin.xml
index b74e209ce..40453cf2d 100644
--- a/eu.etaxonomy.taxeditor.application/plugin.xml
+++ b/eu.etaxonomy.taxeditor.application/plugin.xml
@@ -1,454 +1,454 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/eu.etaxonomy.taxeditor.application/pom.xml b/eu.etaxonomy.taxeditor.application/pom.xml
index e4ca3d887..a0836b2ee 100644
--- a/eu.etaxonomy.taxeditor.application/pom.xml
+++ b/eu.etaxonomy.taxeditor.application/pom.xml
@@ -3,7 +3,7 @@
eu.etaxonomy
taxeditor-parent
- 3.7.1
+ 3.8.0
4.0.0
diff --git a/eu.etaxonomy.taxeditor.bulkeditor/META-INF/MANIFEST.MF b/eu.etaxonomy.taxeditor.bulkeditor/META-INF/MANIFEST.MF
index 036f203b5..c06088fee 100644
--- a/eu.etaxonomy.taxeditor.bulkeditor/META-INF/MANIFEST.MF
+++ b/eu.etaxonomy.taxeditor.bulkeditor/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Bulkeditor Bundle
Bundle-SymbolicName: eu.etaxonomy.taxeditor.bulkeditor;singleton:=true
-Bundle-Version: 3.7.1
+Bundle-Version: 3.8.0
Bundle-Activator: eu.etaxonomy.taxeditor.bulkeditor.internal.TaxeditorBulkeditorPlugin
Bundle-Vendor: EDIT
Export-Package: eu.etaxonomy.taxeditor.annotatedlineeditor,
diff --git a/eu.etaxonomy.taxeditor.bulkeditor/pom.xml b/eu.etaxonomy.taxeditor.bulkeditor/pom.xml
index 3dc3ad169..cb6853e8c 100644
--- a/eu.etaxonomy.taxeditor.bulkeditor/pom.xml
+++ b/eu.etaxonomy.taxeditor.bulkeditor/pom.xml
@@ -3,7 +3,7 @@
eu.etaxonomy
taxeditor-parent
- 3.7.1
+ 3.8.0
4.0.0
diff --git a/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditor.java b/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditor.java
index c2978874b..4c97dbfb5 100644
--- a/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditor.java
+++ b/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditor.java
@@ -34,9 +34,7 @@ import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IViewPart;
import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.texteditor.ITextEditorActionConstants;
import eu.etaxonomy.taxeditor.annotatedlineeditor.AnnotatedLineDocumentProvider;
@@ -44,7 +42,7 @@ import eu.etaxonomy.taxeditor.annotatedlineeditor.AnnotatedLineEditor;
import eu.etaxonomy.taxeditor.annotatedlineeditor.LineAnnotation;
import eu.etaxonomy.taxeditor.annotatedlineeditor.LineAnnotationModel;
import eu.etaxonomy.taxeditor.bulkeditor.input.AbstractBulkEditorInput;
-import eu.etaxonomy.taxeditor.bulkeditor.referencingobjects.ReferencingObjectsView;
+import eu.etaxonomy.taxeditor.bulkeditor.input.TaxonEditorInput;
import eu.etaxonomy.taxeditor.model.IDerivedUnitFacadePart;
import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
@@ -54,10 +52,6 @@ import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
import eu.etaxonomy.taxeditor.store.CdmStore;
/**
- *
- * BulkEditor class.
- *
- *
* @author p.ciardelli
* @created 07.07.2009
* @version 1.0
@@ -76,16 +70,10 @@ public class BulkEditor extends AnnotatedLineEditor implements IPartContentHasDe
private boolean isDirty;
- /**
- * Constructor for BulkEditor.
- */
public BulkEditor() {
super(CdmStore.createConversation());
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.editors.text.TextEditor#initializeEditor()
- */
/** {@inheritDoc} */
@Override
protected void initializeEditor() {
@@ -103,9 +91,6 @@ public class BulkEditor extends AnnotatedLineEditor implements IPartContentHasDe
setSourceViewerConfiguration(new BulkEditorViewerConfiguration(lineDisplayStrategy));
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.bulkeditor.ListEditor#createSourceViewer(org.eclipse.swt.widgets.Composite, org.eclipse.jface.text.source.IVerticalRuler, int)
- */
/** {@inheritDoc} */
@Override
protected ISourceViewer createSourceViewer(Composite parent,
@@ -117,9 +102,6 @@ public class BulkEditor extends AnnotatedLineEditor implements IPartContentHasDe
return viewer;
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.bulkeditor.AnnotatedLineEditor#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
- */
/** {@inheritDoc} */
@Override
public void init(IEditorSite site, IEditorInput input)
@@ -132,9 +114,6 @@ public class BulkEditor extends AnnotatedLineEditor implements IPartContentHasDe
super.init(site, input);
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#createPartControl(org.eclipse.swt.widgets.Composite)
- */
/** {@inheritDoc} */
@Override
public void createPartControl(Composite parent) {
@@ -164,9 +143,6 @@ public class BulkEditor extends AnnotatedLineEditor implements IPartContentHasDe
}
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.editors.text.TextEditor#dispose()
- */
/** {@inheritDoc} */
@Override
public void dispose() {
@@ -177,18 +153,12 @@ public class BulkEditor extends AnnotatedLineEditor implements IPartContentHasDe
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#isEditable()
- */
/** {@inheritDoc} */
@Override
public boolean isEditable() {
return false;
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.annotatedlineeditor.AnnotatedLineEditor#setFocus()
- */
/** {@inheritDoc} */
@Override
public void setFocus() {
@@ -203,9 +173,6 @@ public class BulkEditor extends AnnotatedLineEditor implements IPartContentHasDe
}
}
- /**
- *
- */
private void displayWarningDialog() {
IPreferenceStore prefs = PreferencesUtil.getPreferenceStore();
if (!prefs.getBoolean(PreferencesUtil.HIDE_BULKEDITOR_INFO)) {
@@ -221,9 +188,6 @@ public class BulkEditor extends AnnotatedLineEditor implements IPartContentHasDe
}
}
- /**
- * @param control
- */
private void addToggleMergeCandidateListener(Control control) {
control.addMouseListener(new MouseAdapter() {
@Override
@@ -235,11 +199,6 @@ public class BulkEditor extends AnnotatedLineEditor implements IPartContentHasDe
});
}
- /**
- * toggleMergeCandidateAnnotation
- *
- * @param line a int.
- */
public void toggleMergeCandidateAnnotation(int line) {
IDocument document = getSourceViewer().getDocument();
@@ -261,9 +220,6 @@ public class BulkEditor extends AnnotatedLineEditor implements IPartContentHasDe
}
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.annotatedlineeditor.AnnotatedLineEditor#isDirty()
- */
@Override
public boolean isDirty() {
if(isDirty){
@@ -280,17 +236,14 @@ public class BulkEditor extends AnnotatedLineEditor implements IPartContentHasDe
firePropertyChange(PROP_DIRTY);
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.annotatedlineeditor.AnnotatedLineEditor#doSave(org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
public void doSave(IProgressMonitor progressMonitor) {
isDirty = false;
-
+
super.doSave(progressMonitor);
-
+
selectFirstItem();
-
+
getSourceViewer().getTextWidget().setFocus();
}
@@ -304,9 +257,6 @@ public class BulkEditor extends AnnotatedLineEditor implements IPartContentHasDe
// firePropertyChange(PROP_DIRTY);
}
- /* (non-Javadoc)
- * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
- */
/** {@inheritDoc} */
public void performSearch(BulkEditorQuery query) {
if (query != null) {
@@ -323,7 +273,7 @@ public class BulkEditor extends AnnotatedLineEditor implements IPartContentHasDe
}
conversation.commit();
conversation.clear();
-
+
getEditorInput().performSearch(query);
refresh();
@@ -339,9 +289,6 @@ public class BulkEditor extends AnnotatedLineEditor implements IPartContentHasDe
getSelectionProvider().setSelection(selection);
}
- /**
- *
- */
public void refresh() {
if(getDocumentProvider().getAnnotationModel(getEditorInput()) != null){
((AnnotationModel) getDocumentProvider().getAnnotationModel(getEditorInput())).removeAllAnnotations();
@@ -363,4 +310,9 @@ public class BulkEditor extends AnnotatedLineEditor implements IPartContentHasDe
menu.remove(ITextEditorActionConstants.SHIFT_LEFT);
menu.remove(ITextEditorActionConstants.CONTEXT_PREFERENCES);
}
+
+ @Override
+ public boolean canAttachMedia() {
+ return getEditorInput() instanceof TaxonEditorInput?true:false;
+ }
}
diff --git a/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditorQuery.java b/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditorQuery.java
index 96b0cbed6..e65805b9d 100644
--- a/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditorQuery.java
+++ b/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditorQuery.java
@@ -1,9 +1,9 @@
// $Id$
/**
* Copyright (C) 2007 EDIT
-* European Distributed Institute of Taxonomy
+* European Distributed Institute of Taxonomy
* http://www.e-taxonomy.eu
-*
+*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* See LICENSE.TXT at the top of this package for the full license terms.
*/
@@ -24,10 +24,10 @@ import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
* @version 1.0
*/
public class BulkEditorQuery {
-
- private String searchString;
- private Comparator> comparator;
- private IIdentifiableEntityServiceConfigurator searchConfigurator;
+
+ private final String searchString;
+ private final Comparator> comparator;
+ private final IIdentifiableEntityServiceConfigurator searchConfigurator;
public BulkEditorQuery (String searchString, Comparator comparator) {
this.searchString = searchString;
@@ -38,30 +38,21 @@ public class BulkEditorQuery {
searchConfigurator.setTitleSearchString(searchString);
searchConfigurator.setMatchMode(null);
searchConfigurator.setPropertyPaths(propertyPath);
-
+
if(searchString != null && searchString.trim().equals("*")){
searchConfigurator.setPageSize(1000);
}
-
+
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.bulkeditor.IBulkEditorQuery#getComparator()
- */
public Comparator getComparator() {
return comparator;
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.bulkeditor.IBulkEditorQuery#getSearchString()
- */
public String getSearchString() {
return searchString;
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.bulkeditor.IBulkEditorQuery#getSearchConfigurator()
- */
public IIdentifiableEntityServiceConfigurator getSearchConfigurator() {
return searchConfigurator;
}
diff --git a/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditorSearch.java b/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditorSearch.java
index eb17b5435..552a9d0df 100644
--- a/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditorSearch.java
+++ b/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/BulkEditorSearch.java
@@ -1,9 +1,9 @@
// $Id$
/**
* Copyright (C) 2007 EDIT
-* European Distributed Institute of Taxonomy
+* European Distributed Institute of Taxonomy
* http://www.e-taxonomy.eu
-*
+*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* See LICENSE.TXT at the top of this package for the full license terms.
*/
@@ -33,8 +33,6 @@ import eu.etaxonomy.taxeditor.preference.Resources;
import eu.etaxonomy.taxeditor.store.SearchManager;
/**
- * BulkEditorSearchComposite class.
- *
* @author p.ciardelli
* @author e.-m.lee
* @author n.hoffmann
@@ -42,83 +40,63 @@ import eu.etaxonomy.taxeditor.store.SearchManager;
* @version 1.0
*/
public class BulkEditorSearch {
-
- /**
- *
- */
+
private static final String SEARCH = "Search";
-
+
private static final String DEFAULT_TEXT = String.format("Use \'%s\' for wildcard searching", SearchManager.WILDCARD);
-
+
private final BulkEditor editor;
-
+
private Text text;
private BulkEditorSortCombo sortCombo;
-
+
private Button button;
-
-
+
+
public Object ORDER_BY = new Object();
-
- /**
- * Constructor for BulkEditorSearchComposite.
- *
- * @param parent a {@link org.eclipse.swt.widgets.Composite} object.
- * @param style a int.
- * @param editor a {@link org.eclipse.ui.IEditorPart} object.
- */
+
public BulkEditorSearch(BulkEditor editor, Composite parent, int style) {
this.editor = editor;
-
+
createControl(parent, style);
}
- /*
- * Creates the search control.
- */
/**
- * createControl
+ * Creates the search control.
*/
protected void createControl(Composite parent, int style) {
-
+
final Composite container = new Composite(parent, style);
GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, false);
container.setLayoutData(gridData);
container.setLayout(new GridLayout(5, false));
-
+
createSearchTextField(container, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION);
-
+
createSortCombo(container, style);
-
+
button = new Button(container, SWT.PUSH);
button.setText(SEARCH);
button.addSelectionListener(new SelectionAdapter() {
- /* (non-Javadoc)
- * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
- */
@Override
public void widgetSelected(SelectionEvent e) {
updateEditorInput();
}
});
-
+
registerAtFocusService();
}
- /**
- * @param container
- * @param style
- */
private void createSortCombo(Composite parent, int style) {
sortCombo = new BulkEditorSortCombo(parent, editor.getEditorInput().getSortProviders());
-
+
}
/**
* Handles focus changes for the textfield.
*/
private void registerAtFocusService() {
- IFocusService focusService =
+ IFocusService focusService =
(IFocusService) PlatformUI.getWorkbench().getService(IFocusService.class);
if (focusService != null) {
focusService.addFocusTracker(text, "bulkeditor.textControlId");
@@ -132,32 +110,31 @@ public class BulkEditorSearch {
private void createSearchTextField(Composite parent, int style) {
final Label label = new Label(parent, SWT.NONE);
label.setText("Title Cache");
-
+
text = new Text(parent, style);
text.setText(DEFAULT_TEXT);
text.setForeground(BulkEditorUtil.getColor(Resources.SEARCH_VIEW_FOREGROUND));
-
+
text.addFocusListener(new FocusListener() {
- public void focusGained(FocusEvent e) {
+ @Override
+ public void focusGained(FocusEvent e) {
text.setForeground(BulkEditorUtil.getColor(Resources.SEARCH_VIEW_FOCUS));
if (DEFAULT_TEXT.equals(text.getText())) {
text.setText("");
}
}
- public void focusLost(FocusEvent e) {
+ @Override
+ public void focusLost(FocusEvent e) {
if (CdmUtils.isEmpty(text.getText())) {
text.setForeground(BulkEditorUtil.getColor(Resources.SEARCH_VIEW_FOREGROUND));
- text.setText(DEFAULT_TEXT);
- }
+ text.setText(DEFAULT_TEXT);
+ }
}
});
-
+
text.addKeyListener(new KeyAdapter() {
- /* (non-Javadoc)
- * @see org.eclipse.swt.events.KeyAdapter#keyReleased(org.eclipse.swt.events.KeyEvent)
- */
@Override
public void keyReleased(KeyEvent e) {
if (e.keyCode == SWT.CR) {
@@ -165,59 +142,39 @@ public class BulkEditorSearch {
}
}
});
-
+
GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
text.setLayoutData(gridData);
}
- /*
+ /**
* Shows the results of the search.
*/
private void updateEditorInput() {
-
+
String searchString = getSearchString().trim();
-
- if(DEFAULT_TEXT.equals(searchString) || CdmUtils.isEmpty(searchString)){
+
+ if(DEFAULT_TEXT.equals(searchString) || CdmUtils.isBlank(searchString)){
return;
- }
-
- BulkEditorQuery query = new BulkEditorQuery(getSearchString(), getComparator());
+ }
+
+ BulkEditorQuery query = new BulkEditorQuery(searchString, getComparator());
editor.performSearch(query);
}
-
- /*
+
+ /**
* Returns the current string in the search textfield.
* @return the content of the textfield
*/
- /**
- * getSearchString
- *
- * @return a {@link java.lang.String} object.
- */
public String getSearchString() {
return text.getText().trim();
}
-
- /*
- *
- */
- /**
- * getComparator
- *
- * @return a {@link java.util.Comparator} object.
- */
+
public Comparator getComparator() {
return sortCombo.getSelection();
- };
-
- /*
- *
- */
+ }
- /**
- *
- */
public void setFocus() {
if(text != null && ! text.isDisposed()){
text.setFocus();
diff --git a/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/handler/ConvertPerson2TeamHandler.java b/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/handler/ConvertPerson2TeamHandler.java
index ee587aaa6..a016571e2 100644
--- a/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/handler/ConvertPerson2TeamHandler.java
+++ b/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/handler/ConvertPerson2TeamHandler.java
@@ -46,9 +46,9 @@ public class ConvertPerson2TeamHandler extends AbstractHandler {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
ISelection selection = HandlerUtil.getCurrentSelection(event);
-
+
IEditorPart editor = HandlerUtil.getActiveEditor(event);
-
+
IEditorInput input = editor.getEditorInput();
if (editor.isDirty()){
boolean proceed = MessageDialog.openQuestion(null,
@@ -60,17 +60,17 @@ public class ConvertPerson2TeamHandler extends AbstractHandler {
}
}
if((input instanceof IEntityPersistenceService) && (selection instanceof IStructuredSelection)){
-
-
+
+
IDocumentProvider provider = ((BulkEditor) editor).getDocumentProvider();
- LineAnnotationModel model =
+ LineAnnotationModel model =
(LineAnnotationModel) provider.getAnnotationModel(input);
-
-
+
+
IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-
+
IEntityPersistenceService persistenceService = (IEntityPersistenceService) input;
-
+
Team team ;
for(Object object : structuredSelection.toList()){
LineAnnotation annotation = (LineAnnotation) model.getAnnotation(object);
@@ -82,12 +82,12 @@ public class ConvertPerson2TeamHandler extends AbstractHandler {
} catch (IllegalArgumentException e) {
MessagingUtils.errorDialog("Can not convert Person into a Team", null, e.getLocalizedMessage(), TaxeditorBulkeditorPlugin.PLUGIN_ID,e, true);
} catch (MergeException e) {
- MessagingUtils.errorDialog("Can not convert Person into a Team", null, e.getMessage(), TaxeditorBulkeditorPlugin.PLUGIN_ID,e, true);
+ MessagingUtils.informationDialog("Convert not possible", "Person can not be transformed into team as it is referenced in a way that does not allow converting");
}
}else{
MessagingUtils.informationDialog("Can not convert Person into a Team", "convert Person to Team can only be called on a person.");
}
-
+
if (team != null){
((BulkEditor) editor).removeAnnotatedLine(annotation);
((BulkEditor) editor).createAnnotatedLine(team);
diff --git a/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/handler/MergeGroupHandler.java b/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/handler/MergeGroupHandler.java
index 5c0e8676e..4a8ae8a3c 100644
--- a/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/handler/MergeGroupHandler.java
+++ b/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/handler/MergeGroupHandler.java
@@ -22,12 +22,17 @@ import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.texteditor.IDocumentProvider;
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
+import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
+import eu.etaxonomy.cdm.model.reference.Reference;
+import eu.etaxonomy.cdm.strategy.merge.MergeException;
import eu.etaxonomy.taxeditor.annotatedlineeditor.IEntityContainer;
import eu.etaxonomy.taxeditor.annotatedlineeditor.LineAnnotation;
import eu.etaxonomy.taxeditor.annotatedlineeditor.LineAnnotationModel;
import eu.etaxonomy.taxeditor.bulkeditor.BulkEditor;
import eu.etaxonomy.taxeditor.bulkeditor.IBulkEditorConstants;
import eu.etaxonomy.taxeditor.bulkeditor.input.AbstractBulkEditorInput;
+import eu.etaxonomy.taxeditor.store.CdmStore;
/**
* MergeGroupHandler class.
@@ -71,10 +76,41 @@ public class MergeGroupHandler extends AbstractHandler {
}
Object targetEntity = ((IEntityContainer>) targetAnnotation).getEntity();
+ TeamOrPersonBase teamOrPerson = null;
+ Reference ref = null;
+ if (targetEntity instanceof TeamOrPersonBase){
+ teamOrPerson = HibernateProxyHelper.deproxy(targetEntity, TeamOrPersonBase.class);
+ } else if(targetEntity instanceof Reference){
+ ref = HibernateProxyHelper.deproxy(targetEntity, Reference.class);
+ }
logger.info("Merging group");
// model.printAnnotations();
for (LineAnnotation annotation : candidateAnnotations) {
+ //first check whether entities are mergeable
+
+ try{
+ if (ref != null){
+ Reference ref2 = HibernateProxyHelper.deproxy(annotation.getEntity(), Reference.class);
+
+ if (!CdmStore.getCommonService().isMergeable(ref, ref2, null)){
+ MessageDialog.openWarning(HandlerUtil.getActiveShell(event),
+ "No merge possible", "A merge of " + ref.getTitleCache() + " and " + ref2.getTitleCache() + " is not possible.");
+ return null;
+ }
+ }
+ if (teamOrPerson != null){
+ TeamOrPersonBase teamOrPerson2 = HibernateProxyHelper.deproxy(annotation.getEntity(), TeamOrPersonBase.class);
+
+ if (!CdmStore.getCommonService().isMergeable(teamOrPerson, teamOrPerson2, null)){
+ MessageDialog.openWarning(HandlerUtil.getActiveShell(event),
+ "No merge possible", "A merge of " + teamOrPerson.getTitleCache() + " and " + teamOrPerson2.getTitleCache() + " is not possible.");
+ return null;
+ }
+ }
+ }catch(MergeException e){
+
+ }
((BulkEditor) editor).removeAnnotatedLine(annotation);
// Mark entity container for merging with target entity
diff --git a/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/AbstractBulkEditorInput.java b/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/AbstractBulkEditorInput.java
index 82cd23320..8cf5d3357 100644
--- a/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/AbstractBulkEditorInput.java
+++ b/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/AbstractBulkEditorInput.java
@@ -22,6 +22,7 @@ import org.eclipse.ui.IPersistableElement;
import eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator;
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
+import eu.etaxonomy.cdm.model.common.CdmBase;
import eu.etaxonomy.cdm.model.common.ICdmBase;
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
import eu.etaxonomy.cdm.model.common.MarkerType;
@@ -231,7 +232,7 @@ public abstract class AbstractBulkEditorInput implements IEd
public boolean merge(T entity, T mergeTarget) {
if (entity instanceof IMergable) {
try {
- CdmStore.getCommonService().merge((IMergable)mergeTarget, (IMergable)entity);
+ CdmStore.getCommonService().merge(mergeTarget.getId(), entity.getId(), (Class extends CdmBase>)entity.getClass());
} catch (MergeException e) {
MessagingUtils.errorDialog("Bulk Editor Merge Error",
this,
diff --git a/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/AgentEditorInput.java b/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/AgentEditorInput.java
index 2a739544f..4c2dccc55 100644
--- a/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/AgentEditorInput.java
+++ b/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/AgentEditorInput.java
@@ -1,23 +1,18 @@
// $Id$
/**
* Copyright (C) 2007 EDIT
-* European Distributed Institute of Taxonomy
+* European Distributed Institute of Taxonomy
* http://www.e-taxonomy.eu
-*
+*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* See LICENSE.TXT at the top of this package for the full license terms.
*/
package eu.etaxonomy.taxeditor.bulkeditor.input;
-import java.util.Arrays;
import java.util.List;
-import java.util.UUID;
-
-import org.eclipse.core.commands.ExecutionException;
import eu.etaxonomy.cdm.api.service.IAgentService;
import eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator;
-import eu.etaxonomy.cdm.api.service.exception.DataChangeNoRollbackException;
import eu.etaxonomy.cdm.api.service.exception.ReferencedObjectUndeletableException;
import eu.etaxonomy.cdm.model.agent.AgentBase;
import eu.etaxonomy.cdm.model.agent.Person;
@@ -29,7 +24,6 @@ import eu.etaxonomy.cdm.strategy.merge.MergeException;
import eu.etaxonomy.cdm.strategy.merge.MergeMode;
import eu.etaxonomy.taxeditor.annotatedlineeditor.IEntityCreator;
import eu.etaxonomy.taxeditor.bulkeditor.IBulkEditorSortProvider;
-import eu.etaxonomy.taxeditor.bulkeditor.handler.MergeGroupHandler;
import eu.etaxonomy.taxeditor.bulkeditor.input.entitycreator.AgentCreator;
import eu.etaxonomy.taxeditor.bulkeditor.input.sortprovider.IdentifiableEntitySortProvider;
import eu.etaxonomy.taxeditor.bulkeditor.internal.TaxeditorBulkeditorPlugin;
@@ -38,62 +32,32 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
/**
- * AgentEditorInput class.
- *
* @author p.ciardelli
* @created 25.06.2009
* @version 1.0
*/
public class AgentEditorInput extends AbstractBulkEditorInput {
- /**
- *
- */
private static final long serialVersionUID = 3387950621617078479L;
- /** Constant ID="bulkeditor.input.author"
*/
public static final String ID = "bulkeditor.input.author";
-
+
private static AgentEditorInput instance;
- /**
- * getID
- *
- * @return the iD
- */
public static String getID() {
return ID;
}
-
- /* (non-Javadoc)
- * @see org.eclipse.ui.IEditorInput#getName()
- */
- /**
- * getName
- *
- * @return a {@link java.lang.String} object.
- */
- public String getName() {
+
+ @Override
+ public String getName() {
return BulkEditorInputType.AGENT.label;
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.IEditorInput#getToolTipText()
- */
- /**
- * getToolTipText
- *
- * @return a {@link java.lang.String} object.
- */
- public String getToolTipText() {
+ @Override
+ public String getToolTipText() {
return getName();
}
- /**
- * Getter for the field instance
.
- *
- * @return a {@link eu.etaxonomy.taxeditor.bulkeditor.input.AbstractBulkEditorInput} object.
- */
public static AbstractBulkEditorInput getInstance() {
if (instance == null) {
instance = new AgentEditorInput();
@@ -101,32 +65,31 @@ public class AgentEditorInput extends AbstractBulkEditorInput
return instance;
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.bulkeditor.input.BulkEditorInput#isMergingEnabled()
- */
/** {@inheritDoc} */
@Override
public boolean isMergingEnabled() {
return true;
}
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.bulkeditor.input.BulkEditorInput#isMergingEnabled()
- */
+
/** {@inheritDoc} */
@Override
public boolean isConvertingEnabled() {
return true;
}
-
+
/** {@inheritDoc} */
@Override
public boolean merge(TeamOrPersonBase entity, TeamOrPersonBase mergeTarget) {
if (entity instanceof IMergable) {
try {
- IMergeStrategy strategy = DefaultMergeStrategy.NewInstance(Person.class);
- strategy.setMergeMode("institutionalMemberships", MergeMode.FIRST);
- CdmStore.getCommonService().merge((IMergable)mergeTarget, (IMergable)entity, strategy);
+ if(entity instanceof Person && mergeTarget instanceof Person) {
+ IMergeStrategy strategy = DefaultMergeStrategy.NewInstance(Person.class);
+ strategy.setMergeMode("institutionalMemberships", MergeMode.FIRST);
+ CdmStore.getCommonService().merge(mergeTarget.getId(), entity.getId(), Person.class);
+ } else {
+ IMergeStrategy strategy = DefaultMergeStrategy.NewInstance(TeamOrPersonBase.class);
+ CdmStore.getCommonService().merge(mergeTarget.getId(), entity.getId(), TeamOrPersonBase.class);
+ }
} catch (MergeException e) {
MessagingUtils.errorDialog("Bulk Editor Merge Error",
this,
@@ -144,42 +107,36 @@ public class AgentEditorInput extends AbstractBulkEditorInput
public List listEntities(IIdentifiableEntityServiceConfigurator configurator) {
return CdmStore.getSearchManager().findTeamOrPersons(configurator);
}
-
- /** {@inheritDoc}
+
+ /** {@inheritDoc}
@Override
public AgentBase loadEntity(UUID uuid) {
- List propertyPaths = Arrays.asList(new String[]{});
+ List propertyPaths = Arrays.asList(new String[]{});
return CdmStore.getService(IAgentService.class).load(uuid, propertyPaths);
}*/
-
+
public boolean delete(AgentBase entity) throws ReferencedObjectUndeletableException {
-
- return CdmStore.getService(IAgentService.class).delete(entity) != null;
-
+
+ return CdmStore.getService(IAgentService.class).delete(entity) != null;
+
}
/** {@inheritDoc} */
public boolean save(AgentBase entity) {
-
+
return CdmStore.getService(IAgentService.class).saveOrUpdate(entity) != null;
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.bulkeditor.input.AbstractBulkEditorInput#getSortProviders()
- */
@Override
public List> getSortProviders() {
List> sortProviders = super.getSortProviders();
-
+
sortProviders.add(0, new IdentifiableEntitySortProvider());
-
+
return sortProviders;
}
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.bulkeditor.input.AbstractBulkEditorInput#createEntityCreator()
- */
+
@Override
protected IEntityCreator createEntityCreator() {
return new AgentCreator();
diff --git a/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/referencingobjects/ReferencingObjectsView.java b/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/referencingobjects/ReferencingObjectsView.java
index ee3cd44ef..604f3874a 100644
--- a/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/referencingobjects/ReferencingObjectsView.java
+++ b/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/referencingobjects/ReferencingObjectsView.java
@@ -264,7 +264,7 @@ public class ReferencingObjectsView extends AbstractCdmViewPart{
}
showViewer();
}catch(Exception e){
- setContentDescription("Some Problems occured.");
+ setContentDescription("The referencing objects view could not be loaded completely. Some Problems occured.");
}
}
diff --git a/eu.etaxonomy.taxeditor.cdmlib/.classpath b/eu.etaxonomy.taxeditor.cdmlib/.classpath
index 20cffab12..b0f55de13 100644
--- a/eu.etaxonomy.taxeditor.cdmlib/.classpath
+++ b/eu.etaxonomy.taxeditor.cdmlib/.classpath
@@ -1,209 +1,209 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/eu.etaxonomy.taxeditor.cdmlib/META-INF/MANIFEST.MF b/eu.etaxonomy.taxeditor.cdmlib/META-INF/MANIFEST.MF
index d40161fb8..f5a327f84 100644
--- a/eu.etaxonomy.taxeditor.cdmlib/META-INF/MANIFEST.MF
+++ b/eu.etaxonomy.taxeditor.cdmlib/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: CDM Library Dependencies Plugin
Bundle-SymbolicName: eu.etaxonomy.taxeditor.cdmlib;singleton:=true
-Bundle-Version: 3.7.1
+Bundle-Version: 3.8.0
Eclipse-BundleShape: dir
Export-Package: com.google.api,
com.google.api.detect,
@@ -612,12 +612,12 @@ Bundle-ClassPath: .,
lib/xmlbeans-2.3.0.jar,
lib/poi-ooxml-schemas-3.10-FINAL.jar,
lib/swagger-annotations-1.3.5.jar,
- lib/cdmlib-commons-3.7.0.jar,
- lib/cdmlib-ext-3.7.0.jar,
- lib/cdmlib-io-3.7.0.jar,
- lib/cdmlib-model-3.7.0.jar,
- lib/cdmlib-persistence-3.7.0.jar,
- lib/cdmlib-print-3.7.0.jar,
- lib/cdmlib-remote-3.7.0.jar,
- lib/cdmlib-services-3.7.0.jar
+ lib/cdmlib-commons-3.8.0.jar,
+ lib/cdmlib-ext-3.8.0.jar,
+ lib/cdmlib-io-3.8.0.jar,
+ lib/cdmlib-model-3.8.0.jar,
+ lib/cdmlib-persistence-3.8.0.jar,
+ lib/cdmlib-print-3.8.0.jar,
+ lib/cdmlib-remote-3.8.0.jar,
+ lib/cdmlib-services-3.8.0.jar
Import-Package: eu.etaxonomy.cdm.api.application
diff --git a/eu.etaxonomy.taxeditor.cdmlib/build.properties b/eu.etaxonomy.taxeditor.cdmlib/build.properties
index e5abfe106..e60f70e25 100644
--- a/eu.etaxonomy.taxeditor.cdmlib/build.properties
+++ b/eu.etaxonomy.taxeditor.cdmlib/build.properties
@@ -194,14 +194,14 @@ bin.includes = META-INF/,\
lib/poi-ooxml-schemas-3.10-FINAL.jar,\
lib/xmlbeans-2.3.0.jar,\
lib/swagger-annotations-1.3.5.jar,\
- lib/cdmlib-commons-3.7.0.jar,\
- lib/cdmlib-ext-3.7.0.jar,\
- lib/cdmlib-io-3.7.0.jar,\
- lib/cdmlib-model-3.7.0.jar,\
- lib/cdmlib-persistence-3.7.0.jar,\
- lib/cdmlib-print-3.7.0.jar,\
- lib/cdmlib-remote-3.7.0.jar,\
- lib/cdmlib-services-3.7.0.jar
+ lib/cdmlib-commons-3.8.0.jar,\
+ lib/cdmlib-ext-3.8.0.jar,\
+ lib/cdmlib-io-3.8.0.jar,\
+ lib/cdmlib-model-3.8.0.jar,\
+ lib/cdmlib-persistence-3.8.0.jar,\
+ lib/cdmlib-print-3.8.0.jar,\
+ lib/cdmlib-remote-3.8.0.jar,\
+ lib/cdmlib-services-3.8.0.jar
jars.compile.order = .
output.. = bin/
diff --git a/eu.etaxonomy.taxeditor.cdmlib/pom.xml b/eu.etaxonomy.taxeditor.cdmlib/pom.xml
index 2bd3a7b0f..12b40f8b7 100644
--- a/eu.etaxonomy.taxeditor.cdmlib/pom.xml
+++ b/eu.etaxonomy.taxeditor.cdmlib/pom.xml
@@ -3,7 +3,7 @@
eu.etaxonomy
taxeditor-parent
- 3.7.1
+ 3.8.0
4.0.0
eu.etaxonomy.taxeditor.cdmlib
diff --git a/eu.etaxonomy.taxeditor.editor.src/main/java/eu/etaxonomy/taxeditor/editor/name/container/RulerWithIcon.java b/eu.etaxonomy.taxeditor.editor.src/main/java/eu/etaxonomy/taxeditor/editor/name/container/RulerWithIcon.java
new file mode 100644
index 000000000..db4416160
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.editor.src/main/java/eu/etaxonomy/taxeditor/editor/name/container/RulerWithIcon.java
@@ -0,0 +1,660 @@
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+
+package eu.etaxonomy.taxeditor.editor.name.container;
+
+import java.util.Iterator;
+
+import org.apache.log4j.Logger;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextListener;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITextViewerExtension5;
+import org.eclipse.jface.text.IViewportListener;
+import org.eclipse.jface.text.JFaceTextUtil;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextEvent;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.IAnnotationAccess;
+import org.eclipse.jface.text.source.IAnnotationAccessExtension;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.IAnnotationModelListener;
+import org.eclipse.jface.text.source.IAnnotationPresentation;
+import org.eclipse.jface.text.source.IVerticalRuler;
+import org.eclipse.jface.text.source.IVerticalRulerExtension;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.forms.widgets.TableWrapData;
+
+/**
+ * 99% of the code in this class was copied from org.eclipse.jface.text.source.VerticalRuler,
+ * which allows neither access to its paint methods nor subclassing to do same.
+ *
+ * Changes made in method doubleBufferPaint(doubleBufferPaint(GC dest)).
+ *
+ * @see org.eclipse.jface.text.source.VerticalRuler
+ * @author p.ciardelli
+ * @created 27.01.2009
+ * @version 1.0
+ */
+public class RulerWithIcon implements IVerticalRuler, IVerticalRulerExtension {
+ private static final Logger logger = Logger.getLogger(RulerWithIcon.class);
+
+ /**
+ * Internal listener class.
+ */
+ class InternalListener implements IViewportListener, IAnnotationModelListener, ITextListener {
+
+ /*
+ * @see IViewportListener#viewportChanged(int)
+ */
+ public void viewportChanged(int verticalPosition) {
+ if (verticalPosition != fScrollPos)
+ redraw();
+ }
+
+ /*
+ * @see IAnnotationModelListener#modelChanged(IAnnotationModel)
+ */
+ public void modelChanged(IAnnotationModel model) {
+ update();
+ }
+
+ /*
+ * @see ITextListener#textChanged(TextEvent)
+ */
+ public void textChanged(TextEvent e) {
+ if (fTextViewer != null && e.getViewerRedrawState())
+ redraw();
+ }
+ }
+
+ /** The vertical ruler's text viewer */
+ private ITextViewer fTextViewer;
+ /** The ruler's canvas */
+ private Canvas fCanvas;
+ /** The vertical ruler's model */
+ private IAnnotationModel fModel;
+ /** Cache for the actual scroll position in pixels */
+ private int fScrollPos;
+ /** The buffer for double buffering */
+ private Image fBuffer;
+ /** The line of the last mouse button activity */
+ private int fLastMouseButtonActivityLine= -1;
+ /** The internal listener */
+ private InternalListener fInternalListener= new InternalListener();
+ /** The width of this vertical ruler */
+ private int fWidth;
+ /**
+ * The annotation access of this vertical ruler
+ * @since 3.0
+ */
+ private IAnnotationAccess fAnnotationAccess;
+ private Image icon;
+
+ /**
+ * Constructs a vertical ruler with the given width.
+ *
+ * @param width the width of the vertical ruler
+ */
+ public RulerWithIcon(int width) {
+ this(width, null);
+ }
+
+ /**
+ * Constructs a vertical ruler with the given width and the given annotation
+ * access.
+ *
+ * @param width the width of the vertical ruler
+ * @param annotationAcccess the annotation access
+ * @since 3.0
+ */
+ public RulerWithIcon(int width, IAnnotationAccess annotationAcccess) {
+ fWidth= width;
+ fAnnotationAccess= annotationAcccess;
+ }
+
+ /*
+ * @see IVerticalRuler#getControl()
+ */
+ /**
+ *
getControl
+ *
+ * @return a {@link org.eclipse.swt.widgets.Control} object.
+ */
+ public Control getControl() {
+ return fCanvas;
+ }
+
+ /*
+ * @see IVerticalRuler#createControl(Composite, ITextViewer)
+ */
+ /** {@inheritDoc} */
+ public Control createControl(Composite parent, ITextViewer textViewer) {
+
+ fTextViewer= textViewer;
+
+ fCanvas= new Canvas(parent, SWT.NO_BACKGROUND);
+
+ TableWrapData layout = new TableWrapData(TableWrapData.LEFT);
+ layout.heightHint = 20;
+ layout.maxWidth = fWidth;
+ fCanvas.setLayoutData(layout);
+
+ fCanvas.addPaintListener(new PaintListener() {
+ public void paintControl(PaintEvent event) {
+ if (fTextViewer != null)
+ doubleBufferPaint(event.gc);
+ }
+ });
+
+ fCanvas.addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ handleDispose();
+ fTextViewer= null;
+ }
+ });
+
+ fCanvas.addMouseListener(new MouseListener() {
+ public void mouseUp(MouseEvent event) {
+ }
+
+ public void mouseDown(MouseEvent event) {
+ fLastMouseButtonActivityLine= toDocumentLineNumber(event.y);
+ }
+
+ public void mouseDoubleClick(MouseEvent event) {
+ fLastMouseButtonActivityLine= toDocumentLineNumber(event.y);
+ }
+ });
+
+ if (fTextViewer != null) {
+ fTextViewer.addViewportListener(fInternalListener);
+ fTextViewer.addTextListener(fInternalListener);
+ }
+
+ return fCanvas;
+ }
+
+ /**
+ * Disposes the ruler's resources.
+ */
+ private void handleDispose() {
+
+ if (fTextViewer != null) {
+ fTextViewer.removeViewportListener(fInternalListener);
+ fTextViewer.removeTextListener(fInternalListener);
+ fTextViewer= null;
+ }
+
+ if (fModel != null)
+ fModel.removeAnnotationModelListener(fInternalListener);
+
+ if (fBuffer != null) {
+ fBuffer.dispose();
+ fBuffer= null;
+ }
+ }
+
+
+ /**
+ * Double buffer drawing.
+ *
+ * @param dest the GC to draw into
+ */
+ private void doubleBufferPaint(GC dest) {
+
+ Point size= fCanvas.getSize();
+
+ if (size.x <= 0 || size.y <= 0)
+ return;
+
+ if (fBuffer != null) {
+ Rectangle r= fBuffer.getBounds();
+ if (r.width != size.x || r.height != size.y) {
+ fBuffer.dispose();
+ fBuffer= null;
+ }
+ }
+ if (fBuffer == null)
+ fBuffer= new Image(fCanvas.getDisplay(), size.x, size.y);
+
+ GC gc= new GC(fBuffer);
+ gc.setFont(fTextViewer.getTextWidget().getFont());
+ try {
+ gc.setBackground(fCanvas.getBackground());
+ gc.fillRectangle(0, 0, size.x, size.y);
+
+ // Code added to VerticalRuler starts here
+ if (icon != null) {
+
+ Rectangle r = icon.getBounds();
+
+ if (r.width > size.x || r.height > size.y) {
+ logger.warn(r.width + "x" + r.height + " icon too big for " + size.x + "x" + size.y + " Canvas.");
+ } else {
+
+ // Set destination coordinates to center icon
+ int x = (size.x - r.width) / 2;
+ int y = (size.y - r.height) / 2;
+
+ gc.drawImage(icon, 0, 0, r.width, r.height, x, y, r.width, r.height);
+ }
+ }
+ // Code added to VerticalRuler ends here
+
+ if (fTextViewer instanceof ITextViewerExtension5)
+ doPaint1(gc);
+ else
+ doPaint(gc);
+
+ } finally {
+ gc.dispose();
+ }
+
+ dest.drawImage(fBuffer, 0, 0);
+ }
+
+ /**
+ * Returns the document offset of the upper left corner of the
+ * widgets view port, possibly including partially visible lines.
+ *
+ * @return the document offset of the upper left corner including partially visible lines
+ * @since 2.0
+ */
+ private int getInclusiveTopIndexStartOffset() {
+
+ StyledText textWidget= fTextViewer.getTextWidget();
+ if (textWidget != null && !textWidget.isDisposed()) {
+ int top= JFaceTextUtil.getPartialTopIndex(fTextViewer);
+ try {
+ IDocument document= fTextViewer.getDocument();
+ return document.getLineOffset(top);
+ } catch (BadLocationException x) {
+ }
+ }
+
+ return -1;
+ }
+
+
+
+ /**
+ * Draws the vertical ruler w/o drawing the Canvas background.
+ *
+ * @param gc the GC to draw into
+ */
+ protected void doPaint(GC gc) {
+
+ if (fModel == null || fTextViewer == null)
+ return;
+
+ IAnnotationAccessExtension annotationAccessExtension= null;
+ if (fAnnotationAccess instanceof IAnnotationAccessExtension)
+ annotationAccessExtension= (IAnnotationAccessExtension) fAnnotationAccess;
+
+ StyledText styledText= fTextViewer.getTextWidget();
+ IDocument doc= fTextViewer.getDocument();
+
+ int topLeft= getInclusiveTopIndexStartOffset();
+ int bottomRight= fTextViewer.getBottomIndexEndOffset();
+ int viewPort= bottomRight - topLeft;
+
+ Point d= fCanvas.getSize();
+ fScrollPos= styledText.getTopPixel();
+
+ int topLine= -1, bottomLine= -1;
+ try {
+ IRegion region= fTextViewer.getVisibleRegion();
+ topLine= doc.getLineOfOffset(region.getOffset());
+ bottomLine= doc.getLineOfOffset(region.getOffset() + region.getLength());
+ } catch (BadLocationException x) {
+ return;
+ }
+
+ // draw Annotations
+ Rectangle r= new Rectangle(0, 0, 0, 0);
+ int maxLayer= 1; // loop at least once though layers.
+
+ for (int layer= 0; layer < maxLayer; layer++) {
+ Iterator> iter= fModel.getAnnotationIterator();
+ while (iter.hasNext()) {
+ IAnnotationPresentation annotationPresentation= null;
+ Annotation annotation= (Annotation) iter.next();
+
+ int lay= IAnnotationAccessExtension.DEFAULT_LAYER;
+ if (annotationAccessExtension != null)
+ lay= annotationAccessExtension.getLayer(annotation);
+ else if (annotation instanceof IAnnotationPresentation) {
+ annotationPresentation= (IAnnotationPresentation)annotation;
+ lay= annotationPresentation.getLayer();
+ }
+ maxLayer= Math.max(maxLayer, lay+1); // dynamically update layer maximum
+ if (lay != layer) // wrong layer: skip annotation
+ continue;
+
+ Position position= fModel.getPosition(annotation);
+ if (position == null)
+ continue;
+
+ if (!position.overlapsWith(topLeft, viewPort))
+ continue;
+
+ try {
+
+ int offset= position.getOffset();
+ int length= position.getLength();
+
+ int startLine= doc.getLineOfOffset(offset);
+ if (startLine < topLine)
+ startLine= topLine;
+
+ int endLine= startLine;
+ if (length > 0)
+ endLine= doc.getLineOfOffset(offset + length - 1);
+ if (endLine > bottomLine)
+ endLine= bottomLine;
+
+ startLine -= topLine;
+ endLine -= topLine;
+
+ r.x= 0;
+ r.y= JFaceTextUtil.computeLineHeight(styledText, 0, startLine, startLine) - fScrollPos;
+
+ r.width= d.x;
+ int lines= endLine - startLine;
+
+ r.height= JFaceTextUtil.computeLineHeight(styledText, startLine, endLine + 1, (lines+1));
+
+ if (r.y < d.y && annotationAccessExtension != null) // annotation within visible area
+ annotationAccessExtension.paint(annotation, gc, fCanvas, r);
+ else if (annotationPresentation != null)
+ annotationPresentation.paint(gc, fCanvas, r);
+
+ } catch (BadLocationException e) {
+ }
+ }
+ }
+ }
+
+ /**
+ * Draws the vertical ruler w/o drawing the Canvas background. Uses
+ * ITextViewerExtension5
for its implementation. Will replace
+ * doPaint(GC)
.
+ *
+ * @param gc the GC to draw into
+ */
+ protected void doPaint1(GC gc) {
+
+ if (fModel == null || fTextViewer == null)
+ return;
+
+ IAnnotationAccessExtension annotationAccessExtension= null;
+ if (fAnnotationAccess instanceof IAnnotationAccessExtension)
+ annotationAccessExtension= (IAnnotationAccessExtension) fAnnotationAccess;
+
+ ITextViewerExtension5 extension= (ITextViewerExtension5) fTextViewer;
+ StyledText textWidget= fTextViewer.getTextWidget();
+
+ fScrollPos= textWidget.getTopPixel();
+ Point dimension= fCanvas.getSize();
+
+ // draw Annotations
+ Rectangle r= new Rectangle(0, 0, 0, 0);
+ int maxLayer= 1; // loop at least once through layers.
+
+ for (int layer= 0; layer < maxLayer; layer++) {
+ Iterator> iter= fModel.getAnnotationIterator();
+ while (iter.hasNext()) {
+ IAnnotationPresentation annotationPresentation= null;
+ Annotation annotation= (Annotation) iter.next();
+
+ int lay= IAnnotationAccessExtension.DEFAULT_LAYER;
+ if (annotationAccessExtension != null)
+ lay= annotationAccessExtension.getLayer(annotation);
+ else if (annotation instanceof IAnnotationPresentation) {
+ annotationPresentation= (IAnnotationPresentation)annotation;
+ lay= annotationPresentation.getLayer();
+ }
+ maxLayer= Math.max(maxLayer, lay+1); // dynamically update layer maximum
+ if (lay != layer) // wrong layer: skip annotation
+ continue;
+
+ Position position= fModel.getPosition(annotation);
+ if (position == null)
+ continue;
+
+ IRegion widgetRegion= extension.modelRange2WidgetRange(new Region(position.getOffset(), position.getLength()));
+ if (widgetRegion == null)
+ continue;
+
+ int startLine= extension.widgetLineOfWidgetOffset(widgetRegion.getOffset());
+ if (startLine == -1)
+ continue;
+
+ int endLine= extension.widgetLineOfWidgetOffset(widgetRegion.getOffset() + Math.max(widgetRegion.getLength() -1, 0));
+ if (endLine == -1)
+ continue;
+
+ r.x= 0;
+ r.y= JFaceTextUtil.computeLineHeight(textWidget, 0, startLine, startLine) - fScrollPos;
+
+ r.width= dimension.x;
+ int lines= endLine - startLine;
+
+ r.height= JFaceTextUtil.computeLineHeight(textWidget, startLine, endLine + 1, lines+1);
+
+ if (r.y < dimension.y && annotationAccessExtension != null) // annotation within visible area
+ annotationAccessExtension.paint(annotation, gc, fCanvas, r);
+ else if (annotationPresentation != null)
+ annotationPresentation.paint(gc, fCanvas, r);
+ }
+ }
+ }
+
+ /**
+ * Thread-safe implementation.
+ * Can be called from any thread.
+ */
+ /*
+ * @see IVerticalRuler#update()
+ */
+ public void update() {
+ if (fCanvas != null && !fCanvas.isDisposed()) {
+ Display d= fCanvas.getDisplay();
+ if (d != null) {
+ d.asyncExec(new Runnable() {
+ public void run() {
+ redraw();
+ }
+ });
+ }
+ }
+ }
+
+ /**
+ * Redraws the vertical ruler.
+ */
+ private void redraw() {
+ if (fCanvas != null && !fCanvas.isDisposed()) {
+ GC gc= new GC(fCanvas);
+ doubleBufferPaint(gc);
+ gc.dispose();
+ }
+ }
+
+ /*
+ * @see IVerticalRuler#setModel(IAnnotationModel)
+ */
+ /** {@inheritDoc} */
+ public void setModel(IAnnotationModel model) {
+ if (model != fModel) {
+
+ if (fModel != null)
+ fModel.removeAnnotationModelListener(fInternalListener);
+
+ fModel= model;
+
+ if (fModel != null)
+ fModel.addAnnotationModelListener(fInternalListener);
+
+ update();
+ }
+ }
+
+ /*
+ * @see IVerticalRuler#getModel()
+ */
+ /**
+ * getModel
+ *
+ * @return a {@link org.eclipse.jface.text.source.IAnnotationModel} object.
+ */
+ public IAnnotationModel getModel() {
+ return fModel;
+ }
+
+ /*
+ * @see IVerticalRulerInfo#getWidth()
+ */
+ /**
+ * getWidth
+ *
+ * @return a int.
+ */
+ public int getWidth() {
+ return fWidth;
+ }
+
+ /*
+ * @see IVerticalRulerInfo#getLineOfLastMouseButtonActivity()
+ */
+ /**
+ * getLineOfLastMouseButtonActivity
+ *
+ * @return a int.
+ */
+ public int getLineOfLastMouseButtonActivity() {
+ return fLastMouseButtonActivityLine;
+ }
+
+ /*
+ * @see IVerticalRulerInfo#toDocumentLineNumber(int)
+ */
+ /** {@inheritDoc} */
+ public int toDocumentLineNumber(int y_coordinate) {
+ if (fTextViewer == null || y_coordinate == -1)
+ return -1;
+
+ StyledText text= fTextViewer.getTextWidget();
+ int line= text.getLineIndex(y_coordinate);
+
+ if (line == text.getLineCount() - 1) {
+ // check whether y_coordinate exceeds last line
+ if (y_coordinate > text.getLinePixel(line + 1))
+ return -1;
+ }
+
+ return widgetLine2ModelLine(fTextViewer, line);
+ }
+
+ /**
+ * Returns the line of the viewer's document that corresponds to the given widget line.
+ *
+ * @param viewer the viewer
+ * @param widgetLine the widget line
+ * @return the corresponding line of the viewer's document
+ * @since 2.1
+ */
+ protected final static int widgetLine2ModelLine(ITextViewer viewer, int widgetLine) {
+
+ if (viewer instanceof ITextViewerExtension5) {
+ ITextViewerExtension5 extension= (ITextViewerExtension5) viewer;
+ return extension.widgetLine2ModelLine(widgetLine);
+ }
+
+ try {
+ IRegion r= viewer.getVisibleRegion();
+ IDocument d= viewer.getDocument();
+ return widgetLine += d.getLineOfOffset(r.getOffset());
+ } catch (BadLocationException x) {
+ }
+ return widgetLine;
+ }
+
+ /*
+ * @see IVerticalRulerExtension#setFont(Font)
+ * @since 2.0
+ */
+ /** {@inheritDoc} */
+ public void setFont(Font font) {
+ }
+
+ /*
+ * @see IVerticalRulerExtension#setLocationOfLastMouseButtonActivity(int, int)
+ * @since 2.0
+ */
+ /** {@inheritDoc} */
+ public void setLocationOfLastMouseButtonActivity(int x, int y) {
+ fLastMouseButtonActivityLine= toDocumentLineNumber(y);
+ }
+
+ /**
+ * Adds the given mouse listener.
+ *
+ * @param listener the listener to be added
+ * @deprecated will be removed
+ * @since 2.0
+ */
+ public void addMouseListener(MouseListener listener) {
+ if (fCanvas != null && !fCanvas.isDisposed())
+ fCanvas.addMouseListener(listener);
+ }
+
+ /**
+ * Removes the given mouse listener.
+ *
+ * @param listener the listener to be removed
+ * @deprecated will be removed
+ * @since 2.0
+ */
+ public void removeMouseListener(MouseListener listener) {
+ if (fCanvas != null && !fCanvas.isDisposed())
+ fCanvas.removeMouseListener(listener);
+ }
+
+ /**
+ * Setter for the field icon
.
+ *
+ * @param icon a {@link org.eclipse.swt.graphics.Image} object.
+ */
+ public void setIcon(Image icon) {
+ this.icon = icon;
+ redraw();
+ }
+}
+
diff --git a/eu.etaxonomy.taxeditor.editor/META-INF/MANIFEST.MF b/eu.etaxonomy.taxeditor.editor/META-INF/MANIFEST.MF
index e755f5759..13871a951 100644
--- a/eu.etaxonomy.taxeditor.editor/META-INF/MANIFEST.MF
+++ b/eu.etaxonomy.taxeditor.editor/META-INF/MANIFEST.MF
@@ -2,13 +2,14 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Editor Bundle
Bundle-SymbolicName: eu.etaxonomy.taxeditor.editor;singleton:=true
-Bundle-Version: 3.7.1
+Bundle-Version: 3.8.0
Bundle-Activator: eu.etaxonomy.taxeditor.editor.internal.TaxeditorEditorPlugin
Bundle-Vendor: %Bundle-Vendor.0
Bundle-Localization: OSGI-INF/l10n/plugin
Export-Package: eu.etaxonomy.taxeditor.editor,
eu.etaxonomy.taxeditor.editor.handler,
eu.etaxonomy.taxeditor.editor.internal,
+ eu.etaxonomy.taxeditor.editor.key.polytomous,
eu.etaxonomy.taxeditor.editor.name,
eu.etaxonomy.taxeditor.editor.name.handler,
eu.etaxonomy.taxeditor.editor.view.concept,
diff --git a/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/messages.properties b/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/messages.properties
new file mode 100644
index 000000000..9b2fa8319
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/messages.properties
@@ -0,0 +1,37 @@
+CreateDerivateContextMenu_ADD=Add...
+CreateDerivateContextMenu_DNA_SAMPLE=DNA Sample
+CreateDerivateContextMenu_MEDIA=Media...
+CreateDerivateContextMenu_MEDIA_EXISTING=Media Specimen with existing media
+CreateDerivateContextMenu_MEDIA_SPECIMEN=Media Specimen
+CreateDerivateContextMenu_NO_CHILD_DERIVATE=No child derivatives
+CreateDerivateContextMenu_SEQUENCE=Consensus Sequence
+CreateDerivateContextMenu_SINGLE_READ=Single Read
+CreateDerivateContextMenu_SPECIMEN=Specimen
+CreateDerivateContextMenu_TISSUE_SAMPLE=Tissue Sample
+
+SingleReadSequenceContextMenu_REMOVE_FROM_SEQUENCE=Remove from this Sequence
+SingleReadSequenceContextMenu_REUSE_FOR_SEQUENCE=Reuse for other Sequence
+SingleReadSequenceContextMenu_REUSE_SINGLE_READ_HERE=Reuse SingleRead here
+
+DerivateView_DERIVATIVE_EDITOR=Derivative Editor
+DerivateView_SAVING_HIERARCHY=Saving hierarchy
+DerivateView_UNSAVED_CHANGES=View has unsaved changes
+DerivateView_YOU_NEED_TO_SAVE=You need to save before performing this action
+
+DeleteDerivateOperation_AND_CHILDREN= and its children
+DeleteDerivateOperation_CONFIRM=Confirm Deletion
+DeleteDerivateOperation_DELETE_FAILED=Deletion failed
+DeleteDerivateOperation_REALLY_DELETE=Do you really want to delete the selected element
+
+DerivateDropListener_MOVE_TO=Moving "%s" to "%s"
+
+DerivateViewEditorInput_FAIL_INIT=Failed initializing editor
+DerivateViewEditorInput_NO_ROOT=No root element found\!
+
+MoveDerivateOperation_MOVE_NOT_POSSIBLE=Moving derivatives not possible\!
+MoveDerivateOperation_MOVE_TO_NOT_POSSIBLE=Moving "%s" to "%s" is not possible\!
+
+OpenDerivateEditorForTaxonHandler_COULD_NOT_OPEN_EDITOR=Could not open Derivative Editor
+OpenDerivateEditorForTaxonHandler_FAILED_TO_OPEN=Failed to open Editor
+OpenDerivateEditorForTaxonHandler_HIERARCHY_CORRUPTED=The derivative hierarchy is corrupted\!
+OpenDerivateEditorForTaxonHandler_NO_DERIVATIVES_FOUND=No Derivatives found
diff --git a/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/messages_de.properties b/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/messages_de.properties
new file mode 100644
index 000000000..2fc5cfc61
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/messages_de.properties
@@ -0,0 +1,37 @@
+CreateDerivateContextMenu_ADD=Hinzufügen...
+CreateDerivateContextMenu_DNA_SAMPLE=DNA Sample
+CreateDerivateContextMenu_MEDIA=Media...
+CreateDerivateContextMenu_MEDIA_EXISTING=Media Specimen mit vorhandender Mediadatei
+CreateDerivateContextMenu_MEDIA_SPECIMEN=Media Specimen
+CreateDerivateContextMenu_NO_CHILD_DERIVATE=Keine Kind-Derivate
+CreateDerivateContextMenu_SEQUENCE=Konsensussequenz
+CreateDerivateContextMenu_SINGLE_READ=Single Read
+CreateDerivateContextMenu_SPECIMEN=Beleg
+CreateDerivateContextMenu_TISSUE_SAMPLE=Gewebeprobe
+
+SingleReadSequenceContextMenu_REMOVE_FROM_SEQUENCE=Von Sequenz entfernen
+SingleReadSequenceContextMenu_REUSE_FOR_SEQUENCE=Für andere Sequenz verwenden
+SingleReadSequenceContextMenu_REUSE_SINGLE_READ_HERE=SingleRead hier verwenden
+
+DerivateView_DERIVATIVE_EDITOR=Derivat-Editor
+DerivateView_SAVING_HIERARCHY=Speichere Hierarchie
+DerivateView_UNSAVED_CHANGES=Ungepeicherte Änderungen
+DerivateView_YOU_NEED_TO_SAVE=Sie müssen speichern, um diese Aktion auszuführen
+
+DeleteDerivateOperation_CONFIRM=Löschen bestätigen
+DeleteDerivateOperation_DELETE_FAILED=Löschen fehlgeschlagen
+DeleteDerivateOperation_REALLY_DELETE=Wollen Sie wirklich das ausgewählte Element löschen
+DeleteDerivateOperation_AND_CHILDREN= (mit Kind-Elementen)
+
+DerivateDropListener_MOVE_TO=Verschiebe "%s" nach "%s"
+
+DerivateViewEditorInput_FAIL_INIT=Initialisierung des Editor fehlgeschlagen
+DerivateViewEditorInput_NO_ROOT=Kein Root-Element gefunden\!
+
+MoveDerivateOperation_MOVE_NOT_POSSIBLE=Verschieben von Derivaten nicht möglich\!
+MoveDerivateOperation_MOVE_TO_NOT_POSSIBLE=Verschieben von "%s" nach "%s" nicht möglich\!
+
+OpenDerivateEditorForTaxonHandler_COULD_NOT_OPEN_EDITOR=Konnte Derivat-Editor nicht öffnen
+OpenDerivateEditorForTaxonHandler_FAILED_TO_OPEN=Öffnen des Editors fehlgeschlagen
+OpenDerivateEditorForTaxonHandler_HIERARCHY_CORRUPTED=Die Derivathierarchie ist korrumpiert\!
+OpenDerivateEditorForTaxonHandler_NO_DERIVATIVES_FOUND=Keine Derivate gefunden
diff --git a/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin.properties b/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin.properties
index 1c03030fc..8281fca55 100644
--- a/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin.properties
+++ b/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin.properties
@@ -9,7 +9,7 @@ editor.name.1 = Key
editor.name.2 = Polytomous Key Graph Editor
editor.name.3 = Polytomous Key List Editor
editor.name.4 = Cdm Authority Editor
-editor.name.5 = Derivative View
+editor.name.5 = Derivative Editor
view.name = Factual Data
view.name.0 = Uses
view.name.1 = Media
@@ -112,7 +112,7 @@ command.name.32 = Create Concept Relation
command.name.33 = Open Related Concept
category.name.7 = -- Group
command.name.34 = Edit CDM Authorities
-command.name.35 = Open Derivative View
+command.name.35 = Open Derivative Editor
scheme.description = The default key binding scheme for the Taxonomic Editor
scheme.name = Taxonomic Editor Default Key Bindings
editor.name.6 = Specimen Import Editor
diff --git a/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin_de.properties b/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin_de.properties
index 8c098c37d..a4d096a11 100644
--- a/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin_de.properties
+++ b/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin_de.properties
@@ -112,7 +112,7 @@ command.name.32 = Erstelle Konzeptrelationen
command.name.33 = \u00d6ffne verbundenes Konzept
category.name.7 = -- Gruppe
command.name.34 = Bearbeite CDM Rechte
-command.name.35 = \u00d6ffne Derivate Ansicht
+command.name.35 = \u00d6ffne Derivat-Editor
scheme.description = Die Standard Tastenkombinationsschema f\u00fcr den Taxonomischen Editor
scheme.name = Taxonomic Editor Standard Tastenkombinationen
editor.name.6 = Specimen Import Editor
@@ -139,8 +139,8 @@ marker.field.2 = Attribut
marker.field.3 = Problematischer Wert
marker.field.4 = Problembeschreibung
marker.field.5 = Validierer
-marker.field.6 = Entit�tsklasse
-marker.field.7 = Entit�ts ID
+marker.field.6 = Entit\u00e4tsklasse
+marker.field.7 = Entit\u00e4ts ID
extension.name.0 = Validierungs-Fehler
command.label.51 = \u00d6ffne Specimen-Editor
command.label.52 = L\u00f6schen
diff --git a/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin_en.properties b/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin_en.properties
index 65d48bae5..17a5b0490 100644
--- a/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin_en.properties
+++ b/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin_en.properties
@@ -111,7 +111,6 @@ command.name.32 = Create Concept Relation
command.name.33 = Open Related Concept
category.name.7 = -- Group
command.name.34 = Edit CDM Authorities
-command.name.35 = Open Derivate View
scheme.description = The default key binding scheme for the Taxonomic Editor
scheme.name = Taxonomic Editor Default Key Bindingseditor.name.6 = Specimen Import Editor
editor.name.7 = Gbif Import Editor
diff --git a/eu.etaxonomy.taxeditor.editor/plugin.xml b/eu.etaxonomy.taxeditor.editor/plugin.xml
index b9a3d50db..66def4730 100644
--- a/eu.etaxonomy.taxeditor.editor/plugin.xml
+++ b/eu.etaxonomy.taxeditor.editor/plugin.xml
@@ -685,7 +685,10 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1640,6 +1661,13 @@
properties="isGroupEditor"
type="eu.etaxonomy.taxeditor.bulkeditor.BulkEditor">
+
+
diff --git a/eu.etaxonomy.taxeditor.editor/pom.xml b/eu.etaxonomy.taxeditor.editor/pom.xml
index 309747a6a..26a62da35 100644
--- a/eu.etaxonomy.taxeditor.editor/pom.xml
+++ b/eu.etaxonomy.taxeditor.editor/pom.xml
@@ -3,7 +3,7 @@
eu.etaxonomy
taxeditor-parent
- 3.7.1
+ 3.8.0
4.0.0
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/EditorUtil.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/EditorUtil.java
index c93501452..e87142c40 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/EditorUtil.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/EditorUtil.java
@@ -168,7 +168,9 @@ public class EditorUtil extends AbstractUtility {
}
TaxonEditorInput input = TaxonEditorInput
.NewInstanceFromTaxonBase(taxonBaseUuid);
- open(input);
+ if(input!=null){
+ open(input);
+ }
}
/**
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/Messages.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/Messages.java
new file mode 100644
index 000000000..34684d15d
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/Messages.java
@@ -0,0 +1,58 @@
+// $Id$
+/**
+ * Copyright (C) 2015 EDIT
+ * European Distributed Institute of Taxonomy
+ * http://www.e-taxonomy.eu
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * See LICENSE.TXT at the top of this package for the full license terms.
+ */
+package eu.etaxonomy.taxeditor.editor;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * @author pplitzner
+ * @date 09.09.2015
+ *
+ */
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "OSGI-INF/l10n/messages"; //$NON-NLS-1$
+ public static String CreateDerivateContextMenu_ADD;
+ public static String CreateDerivateContextMenu_DNA_SAMPLE;
+ public static String CreateDerivateContextMenu_MEDIA;
+ public static String CreateDerivateContextMenu_MEDIA_EXISTING;
+ public static String CreateDerivateContextMenu_MEDIA_SPECIMEN;
+ public static String CreateDerivateContextMenu_NO_CHILD_DERIVATE;
+ public static String CreateDerivateContextMenu_SEQUENCE;
+ public static String CreateDerivateContextMenu_SINGLE_READ;
+ public static String CreateDerivateContextMenu_SPECIMEN;
+ public static String CreateDerivateContextMenu_TISSUE_SAMPLE;
+ public static String DeleteDerivateOperation_AND_CHILDREN;
+ public static String DeleteDerivateOperation_CONFIRM;
+ public static String DeleteDerivateOperation_DELETE_FAILED;
+ public static String DeleteDerivateOperation_REALLY_DELETE;
+ public static String DerivateDropListener_MOVE_TO;
+ public static String DerivateView_DERIVATIVE_EDITOR;
+ public static String DerivateView_SAVING_HIERARCHY;
+ public static String DerivateView_UNSAVED_CHANGES;
+ public static String DerivateView_YOU_NEED_TO_SAVE;
+ public static String DerivateViewEditorInput_FAIL_INIT;
+ public static String DerivateViewEditorInput_NO_ROOT;
+ public static String MoveDerivateOperation_MOVE_NOT_POSSIBLE;
+ public static String MoveDerivateOperation_MOVE_TO_NOT_POSSIBLE;
+ public static String OpenDerivateEditorForTaxonHandler_COULD_NOT_OPEN_EDITOR;
+ public static String OpenDerivateEditorForTaxonHandler_FAILED_TO_OPEN;
+ public static String OpenDerivateEditorForTaxonHandler_HIERARCHY_CORRUPTED;
+ public static String OpenDerivateEditorForTaxonHandler_NO_DERIVATIVES_FOUND;
+ public static String SingleReadSequenceContextMenu_REMOVE_FROM_SEQUENCE;
+ public static String SingleReadSequenceContextMenu_REUSE_FOR_SEQUENCE;
+ public static String SingleReadSequenceContextMenu_REUSE_SINGLE_READ_HERE;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditor.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditor.java
index 94107c24a..74e264dc5 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditor.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditor.java
@@ -86,11 +86,6 @@ public class MultiPageTaxonEditor extends FormEditor implements
super.dispose();
}
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.ui.forms.editor.FormEditor#addPages()
- */
/** {@inheritDoc} */
@Override
protected void addPages() {
@@ -173,28 +168,11 @@ public class MultiPageTaxonEditor extends FormEditor implements
firePropertyChange(PROP_DIRTY);
}
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.ui.part.MultiPageEditorPart#isDirty()
- */
- /**
- *
- * isDirty
- *
- *
- * @return a boolean.
- */
@Override
public boolean isDirty() {
return dirty;
}
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.ui.forms.editor.FormEditor#editorDirtyStateChanged()
- */
/** {@inheritDoc} */
@Override
public void editorDirtyStateChanged() {
@@ -210,11 +188,6 @@ public class MultiPageTaxonEditor extends FormEditor implements
* place before passing property change along to
* super.handlePropertyChange(int propertyId)
.
*/
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.ui.part.MultiPageEditorPart#handlePropertyChange(int)
- */
@Override
protected void handlePropertyChange(int propertyId) {
if (propertyId == PROP_DIRTY) {
@@ -312,9 +285,6 @@ public class MultiPageTaxonEditor extends FormEditor implements
setPartName();
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#forceDirty()
- */
@Override
public void forceDirty() {
changed(null);
@@ -329,60 +299,19 @@ public class MultiPageTaxonEditor extends FormEditor implements
return input.getTaxon();
}
- /*
- * (non-Javadoc)
- *
- * @see
- * eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder
- * ()
- */
- /**
- *
- * getConversationHolder
- *
- *
- * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
- * object.
- */
@Override
public ConversationHolder getConversationHolder() {
return conversation;
}
- /**
- *
- * setConversationHolder
- *
- *
- * @param conversation
- * a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
- * object.
- */
public void setConversationHolder(ConversationHolder conversation) {
this.conversation = conversation;
}
- /**
- *
- * Getter for the field undoContext
.
- *
- *
- * @return a {@link org.eclipse.core.commands.operations.IUndoContext}
- * object.
- */
public IUndoContext getUndoContext() {
return undoContext;
}
- /**
- *
- * Setter for the field undoContext
.
- *
- *
- * @param undoContext
- * a {@link org.eclipse.core.commands.operations.IUndoContext}
- * object.
- */
public void setUndoContext(IUndoContext undoContext) {
this.undoContext = undoContext;
}
@@ -397,14 +326,7 @@ public class MultiPageTaxonEditor extends FormEditor implements
getActiveEditor().setFocus();
}
- /*
- * (non-Javadoc)
- *
- * @see
- * eu.etaxonomy.cdm.persistence.hibernate.ICdmPostCrudObserver#update(eu
- * .etaxonomy.cdm.persistence.hibernate.CdmCrudEvent)
- */
- /** {@inheritDoc} */
+ /** {@inheritDoc} */
@Override
public void update(CdmDataChangeMap events) {
if (dataChangeBehavior == null) {
@@ -414,13 +336,6 @@ public class MultiPageTaxonEditor extends FormEditor implements
DataChangeBridge.handleDataChange(events, dataChangeBehavior);
}
- /*
- * (non-Javadoc)
- *
- * @see
- * eu.etaxonomy.taxeditor.store.operations.IPostOperationEnabled#postOperation
- * ()
- */
/** {@inheritDoc} */
@Override
public boolean postOperation(CdmBase objectAffectedByOperation) {
@@ -496,13 +411,6 @@ public class MultiPageTaxonEditor extends FormEditor implements
return editorPage != null && editorPage.redraw(focus);
}
- /**
- *
- * onComplete
- *
- *
- * @return a boolean.
- */
@Override
public boolean onComplete() {
return false;
@@ -549,4 +457,9 @@ public class MultiPageTaxonEditor extends FormEditor implements
}
return true;
}
+
+ @Override
+ public boolean canAttachMedia() {
+ return true;
+ }
}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/SpecimenPropertyTester.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/SpecimenPropertyTester.java
new file mode 100644
index 000000000..eb3995c8e
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/SpecimenPropertyTester.java
@@ -0,0 +1,52 @@
+package eu.etaxonomy.taxeditor.editor.handler;
+
+
+import org.eclipse.core.expressions.PropertyTester;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeNode;
+
+import eu.etaxonomy.cdm.model.molecular.Sequence;
+import eu.etaxonomy.cdm.model.molecular.SingleRead;
+import eu.etaxonomy.taxeditor.editor.EditorUtil;
+
+
+
+/**
+ * Tests types of specimens to add items to the context menu.
+ *
+ * @author pplitzner
+ * @author BenStoever
+ */
+public class SpecimenPropertyTester extends PropertyTester {
+ private static final String SEQUENCE = "isSequence";
+ private static final String SINGLE_READ = "isSingleRead";
+
+
+ public SpecimenPropertyTester() {}
+
+ /** {@inheritDoc} */
+ @Override
+ public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
+ if (receiver instanceof IStructuredSelection) {
+ IStructuredSelection selection = (IStructuredSelection) receiver;
+ TreeNode treeNodeOfSelection = EditorUtil.getTreeNodeOfSelection(selection);
+ if (treeNodeOfSelection!=null) {
+ if (SEQUENCE.equals(property)) {
+ return isSequence(treeNodeOfSelection.getValue());
+ }
+ else if (SINGLE_READ.equals(property)) {
+ return isSingleReadAlignment(treeNodeOfSelection.getValue());
+ }
+ }
+ }
+ return false;
+ }
+
+ private boolean isSequence(Object object) {
+ return (object instanceof Sequence);
+ }
+
+ private boolean isSingleReadAlignment(Object object) {
+ return (object instanceof SingleRead);
+ }
+}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/KeyEditor.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/KeyEditor.java
index 5fc0b2b9a..7b9a605cf 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/KeyEditor.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/KeyEditor.java
@@ -83,6 +83,7 @@ public class KeyEditor extends FormEditor implements IConversationEnabled,
@Override
public void setFocus() {
+ getConversationHolder().commit(true);
getConversationHolder().bind();
super.setFocus();
}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/polytomous/PolytomousKeyListEditor.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/polytomous/PolytomousKeyListEditor.java
index ceae45d69..dc81964bc 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/polytomous/PolytomousKeyListEditor.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/polytomous/PolytomousKeyListEditor.java
@@ -345,7 +345,8 @@ public class PolytomousKeyListEditor extends EditorPart implements
@Override
public boolean postOperation(CdmBase objectAffectedByOperation) {
viewer.refresh();
-
+ getConversationHolder().bind();
+ getConversationHolder().commit(true);
editor.changed(objectAffectedByOperation);
if (objectAffectedByOperation != null) {
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/polytomous/operation/DeleteNodeOperation.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/polytomous/operation/DeleteNodeOperation.java
index 3b4ae0d7a..f31a83125 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/polytomous/operation/DeleteNodeOperation.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/polytomous/operation/DeleteNodeOperation.java
@@ -12,9 +12,12 @@ import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.ui.handlers.HandlerUtil;
import eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration;
+import eu.etaxonomy.cdm.api.service.DeleteResult;
import eu.etaxonomy.cdm.api.service.IPolytomousKeyNodeService;
import eu.etaxonomy.cdm.api.service.ITaxonService;
import eu.etaxonomy.cdm.model.description.PolytomousKeyNode;
+import eu.etaxonomy.taxeditor.bulkeditor.internal.TaxeditorBulkeditorPlugin;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
import eu.etaxonomy.taxeditor.operation.AbstractPostTaxonOperation;
import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
import eu.etaxonomy.taxeditor.store.CdmStore;
@@ -52,15 +55,27 @@ public class DeleteNodeOperation extends AbstractPostTaxonOperation {
controller = (ICdmApplicationConfiguration) CdmStore.getCurrentApplicationConfiguration();
IPolytomousKeyNodeService service = controller.getPolytomousKeyNodeService();
-
+ DeleteResult result;
if (node.getChildren().size()>0){
if(! MessageDialog.openQuestion(null, "Confirm deletion of children", "The selected node has children, do you want to delete them, too?")) {
- service.delete(node.getUuid(), false);
+ result = service.delete(node.getUuid(), false);
} else{
- service.delete(node.getUuid(), true);
+ result = service.delete(node.getUuid(), true);
}
} else{
- service.delete(node.getUuid(), true);
+ result = service.delete(node.getUuid(), true);
+ }
+
+ if (!result.isOk() || result.getExceptions().size() > 0){
+ Exception t = new Exception();
+ if (result.getExceptions().size() >1){
+ for (Exception e:result.getExceptions()){
+ t.addSuppressed(e);
+ }
+ }else {
+ t = result.getExceptions().iterator().next();
+ }
+ MessagingUtils.errorDialog("Exception occured. Delete not possible", getClass(),null, TaxeditorBulkeditorPlugin.PLUGIN_ID, t, true);
}
return postExecute(null);
}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/DataImportEditorInput.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/DataImportEditorInput.java
index a74d15d44..5be66c8bc 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/DataImportEditorInput.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/DataImportEditorInput.java
@@ -21,6 +21,9 @@ import eu.etaxonomy.cdm.ext.occurrence.OccurenceQuery;
import eu.etaxonomy.taxeditor.store.CdmStore;
/**
+ * Input for {@link DataImportEditor}. This class queries a data source for
+ * occurrences and passes them to the editor.
+ *
* @author pplitzner
* @date 25.02.2014
*
@@ -35,65 +38,40 @@ public abstract class DataImportEditorInput implements IEditorInput {
protected OccurenceQuery query;
- /**
- * @param results
- */
public DataImportEditorInput() {
this.conversationHolder = CdmStore.createConversation();
}
-
- /* (non-Javadoc)
- * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
- */
@Override
public Object getAdapter(Class adapter) {
// TODO Auto-generated method stub
return null;
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.IEditorInput#exists()
- */
@Override
public boolean exists() {
return false;
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
- */
@Override
public ImageDescriptor getImageDescriptor() {
// TODO Auto-generated method stub
return null;
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.IEditorInput#getPersistable()
- */
@Override
public IPersistableElement getPersistable() {
return null;
}
- /**
- * @return the results
- */
public Collection getResults() {
return results;
}
- /**
- * @param results the results to set
- */
public void setResults(Collection results) {
this.results = results;
}
- /**
- * @return the conversationHolder
- */
public ConversationHolder getConversationHolder() {
return conversationHolder;
}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/GbifImportEditorInput.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/GbifImportEditorInput.java
index ed7c89cc0..3aaf22c52 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/GbifImportEditorInput.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/GbifImportEditorInput.java
@@ -26,9 +26,6 @@ import eu.etaxonomy.cdm.ext.occurrence.gbif.GbifResponse;
*/
public class GbifImportEditorInput extends DataImportEditorInput {
- /**
- * @param query
- */
public GbifImportEditorInput(OccurenceQuery query) {
super();
this.query = query;
@@ -50,25 +47,16 @@ public class GbifImportEditorInput extends DataImportEditorInput {
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.IEditorInput#getName()
- */
@Override
public String getName() {
return "[GBIF] " + query.toString();
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.IEditorInput#getToolTipText()
- */
@Override
public String getToolTipText() {
return "[GBIF] " + query.toString();
}
- /* (non-Javadoc)
- * @see java.lang.Object#hashCode()
- */
@Override
public int hashCode() {
final int prime = 31;
@@ -77,9 +65,6 @@ public class GbifImportEditorInput extends DataImportEditorInput {
return result;
}
- /* (non-Javadoc)
- * @see java.lang.Object#equals(java.lang.Object)
- */
@Override
public boolean equals(Object obj) {
if (this == obj) {
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientCdmRepository.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientCdmRepository.java
index caa699189..aebdee8f9 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientCdmRepository.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientCdmRepository.java
@@ -18,6 +18,7 @@ import org.springframework.transaction.TransactionStatus;
import eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration;
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
import eu.etaxonomy.cdm.api.service.IAgentService;
+import eu.etaxonomy.cdm.api.service.IAnnotationService;
import eu.etaxonomy.cdm.api.service.IClassificationService;
import eu.etaxonomy.cdm.api.service.ICollectionService;
import eu.etaxonomy.cdm.api.service.ICommonService;
@@ -409,4 +410,12 @@ public class TransientCdmRepository implements ICdmApplicationConfiguration {
public IEntityValidationService getEntityValidationService() {
return defaultApplicationConfiguration.getEntityValidationService();
}
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getAnnotationService()
+ */
+ @Override
+ public IAnnotationService getAnnotationService() {
+ return defaultApplicationConfiguration.getAnnotationService();
+ }
}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientClassificationService.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientClassificationService.java
index 9459d7799..07fdcf242 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientClassificationService.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientClassificationService.java
@@ -245,22 +245,6 @@ public class TransientClassificationService implements IClassificationService {
return defaultService.getPreviousAuditEvent(t);
}
- /**
- * @param classification
- * @param rank
- * @param limit
- * @param start
- * @param propertyPaths
- * @return
- * @deprecated
- * @see eu.etaxonomy.cdm.api.service.IClassificationService#loadRankSpecificRootNodes(eu.etaxonomy.cdm.model.taxon.Classification, eu.etaxonomy.cdm.model.name.Rank, java.lang.Integer, java.lang.Integer, java.util.List)
- */
- @Deprecated
- @Override
- public List loadRankSpecificRootNodes(Classification classification, Rank rank, Integer limit, Integer start, List propertyPaths) {
- return defaultService.loadRankSpecificRootNodes(classification, rank, limit, start, propertyPaths);
- }
-
/**
* @param clazz
* @return
@@ -966,4 +950,6 @@ public class TransientClassificationService implements IClassificationService {
return defaultService.merge(arg0);
}
+
+
}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientDescriptionService.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientDescriptionService.java
index ebcd3128c..4640d7e3a 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientDescriptionService.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientDescriptionService.java
@@ -1075,11 +1075,12 @@ public class TransientDescriptionService implements IDescriptionService {
* @param descriptionElements
* @param targetDescription
* @param isPaste
+ * @return
* @see eu.etaxonomy.cdm.api.service.IDescriptionService#moveDescriptionElementsToDescription(java.util.Collection, eu.etaxonomy.cdm.model.description.DescriptionBase, boolean)
*/
@Override
- public void moveDescriptionElementsToDescription(Collection descriptionElements, DescriptionBase targetDescription, boolean isPaste) {
- defaultService.moveDescriptionElementsToDescription(descriptionElements, targetDescription, isPaste);
+ public UpdateResult moveDescriptionElementsToDescription(Collection descriptionElements, DescriptionBase targetDescription, boolean isPaste) {
+ return defaultService.moveDescriptionElementsToDescription(descriptionElements, targetDescription, isPaste);
}
/* (non-Javadoc)
@@ -1179,4 +1180,20 @@ public class TransientDescriptionService implements IDescriptionService {
return defaultService.merge(arg0);
}
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.cdm.api.service.IDescriptionService#moveDescriptionElementsToDescription(java.util.Set, java.util.UUID, boolean)
+ */
+ @Override
+ public UpdateResult moveDescriptionElementsToDescription(Set arg0, UUID arg1, boolean arg2) {
+ return defaultService.moveDescriptionElementsToDescription(arg0, arg1, arg2);
+ }
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.cdm.api.service.IDescriptionService#moveDescriptionElementsToDescription(java.util.Set, java.util.UUID, java.lang.String, boolean)
+ */
+ @Override
+ public UpdateResult moveDescriptionElementsToDescription(Set arg0, UUID arg1, String arg2, boolean arg3) {
+ return defaultService.moveDescriptionElementsToDescription(arg0, arg1, arg2, arg3);
+ }
+
}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientOccurenceService.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientOccurenceService.java
index e2a30d922..4b5d0106a 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientOccurenceService.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientOccurenceService.java
@@ -29,6 +29,7 @@ import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeNotSupportedException;
import eu.etaxonomy.cdm.api.service.DeleteResult;
import eu.etaxonomy.cdm.api.service.IOccurrenceService;
+import eu.etaxonomy.cdm.api.service.UpdateResult;
import eu.etaxonomy.cdm.api.service.config.DeleteConfiguratorBase;
import eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator;
import eu.etaxonomy.cdm.api.service.config.SpecimenDeleteConfigurator;
@@ -864,13 +865,9 @@ public class TransientOccurenceService implements IOccurrenceService {
maxDepth, pageSize, pageNumber, orderHints, propertyPaths);
}
- @Override
- public boolean moveDerivate(SpecimenOrObservationBase> from, SpecimenOrObservationBase> to, DerivedUnit derivate) {
- return defaultService.moveDerivate(from, to, derivate);
- }
@Override
- public boolean moveSequence(DnaSample from, DnaSample to, Sequence sequence) {
+ public UpdateResult moveSequence(DnaSample from, DnaSample to, Sequence sequence) {
return defaultService.moveSequence(from, to, sequence);
}
@@ -1016,5 +1013,45 @@ public class TransientOccurenceService implements IOccurrenceService {
return defaultService.merge(arg0);
}
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#deleteDerivateHierarchy(java.util.UUID, eu.etaxonomy.cdm.api.service.config.SpecimenDeleteConfigurator)
+ */
+ @Override
+ public DeleteResult deleteDerivateHierarchy(UUID arg0, SpecimenDeleteConfigurator arg1) {
+ return defaultService.deleteDerivateHierarchy(arg0, arg1);
+ }
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#deleteSingleRead(java.util.UUID, java.util.UUID)
+ */
+ @Override
+ public DeleteResult deleteSingleRead(UUID arg0, UUID arg1) {
+ return defaultService.deleteSingleRead(arg0, arg1);
+ }
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#moveDerivate(java.util.UUID, java.util.UUID, java.util.UUID)
+ */
+ @Override
+ public UpdateResult moveDerivate(UUID arg0, UUID arg1, UUID arg2) {
+ return defaultService.moveDerivate(arg0, arg1, arg2);
+ }
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#moveDerivate(eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase, eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase, eu.etaxonomy.cdm.model.occurrence.DerivedUnit)
+ */
+ @Override
+ public boolean moveDerivate(SpecimenOrObservationBase> from, SpecimenOrObservationBase> to, DerivedUnit derivate) {
+ return defaultService.moveDerivate(from, to, derivate);
+ }
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#moveSequence(java.util.UUID, java.util.UUID, java.util.UUID)
+ */
+ @Override
+ public UpdateResult moveSequence(UUID arg0, UUID arg1, UUID arg2) {
+ return defaultService.moveSequence(arg0, arg1, arg2);
+ }
+
}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientTaxonService.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientTaxonService.java
index b191647d8..fac79adfb 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientTaxonService.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientTaxonService.java
@@ -1453,7 +1453,7 @@ public class TransientTaxonService implements ITaxonService {
* {@inheritDoc}
*/
@Override
- public SynonymRelationship moveSynonymToAnotherTaxon(
+ public UpdateResult moveSynonymToAnotherTaxon(
SynonymRelationship oldSynonymRelation, UUID newTaxonUUID,
boolean moveHomotypicGroup,
SynonymRelationshipType newSynonymRelationshipType,
@@ -1496,4 +1496,31 @@ public class TransientTaxonService implements ITaxonService {
public DeleteResult deleteSynonym(UUID arg0, SynonymDeletionConfigurator arg1) {
return defaultService.deleteSynonym(arg0, arg1);
}
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.cdm.api.service.ITaxonService#changeRelatedTaxonToSynonym(java.util.UUID, java.util.UUID, eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType, eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType)
+ */
+ @Override
+ public UpdateResult changeRelatedTaxonToSynonym(UUID arg0, UUID arg1, TaxonRelationshipType arg2,
+ SynonymRelationshipType arg3) throws DataChangeNoRollbackException {
+ return defaultService.changeRelatedTaxonToSynonym(arg0, arg1, arg2, arg3);
+ }
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.cdm.api.service.ITaxonService#changeSynonymToRelatedTaxon(java.util.UUID, java.util.UUID, eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType, eu.etaxonomy.cdm.model.reference.Reference, java.lang.String)
+ */
+ @Override
+ public UpdateResult changeSynonymToRelatedTaxon(UUID arg0, UUID arg1, TaxonRelationshipType arg2, Reference arg3,
+ String arg4) {
+ return defaultService.changeSynonymToRelatedTaxon(arg0, arg1, arg2, arg3, arg4);
+ }
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.cdm.api.service.ITaxonService#changeSynonymToAcceptedTaxon(java.util.UUID, java.util.UUID, java.util.UUID, boolean, boolean, eu.etaxonomy.cdm.model.reference.Reference, java.lang.String)
+ */
+ @Override
+ public UpdateResult changeSynonymToAcceptedTaxon(UUID arg0, UUID arg1, UUID arg2, boolean arg3, boolean arg4,
+ Reference arg5, String arg6) throws HomotypicalGroupChangeException {
+ return defaultService.changeSynonymToAcceptedTaxon(arg0, arg1, arg2, arg3, arg4, arg5, arg6);
+ }
}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateDragListener.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateDragListener.java
index c597eca6c..e96e5badf 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateDragListener.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateDragListener.java
@@ -33,9 +33,6 @@ public class DerivateDragListener extends DragSourceAdapter{
this.derivateView = derivateView;
}
- /* (non-Javadoc)
- * @see org.eclipse.swt.dnd.DragSourceAdapter#dragSetData(org.eclipse.swt.dnd.DragSourceEvent)
- */
@Override
public void dragSetData(DragSourceEvent event) {
if (LocalSelectionTransfer.getTransfer().isSupportedType(event.dataType)) {
@@ -44,14 +41,11 @@ public class DerivateDragListener extends DragSourceAdapter{
}
}
- /* (non-Javadoc)
- * @see org.eclipse.swt.dnd.DragSourceAdapter#dragStart(org.eclipse.swt.dnd.DragSourceEvent)
- */
@Override
public void dragStart(DragSourceEvent event) {
if(derivateView.isDirty()){
event.doit = false;
- MessagingUtils.warningDialog("View has unsaved changes", this, "You need to save before performing this action");
+ MessagingUtils.warningDialog(DerivateView.VIEW_HAS_UNSAVED_CHANGES, this, DerivateView.YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION);
return;
}
ISelection selection = derivateView.getViewer().getSelection();
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateDropListener.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateDropListener.java
index 55b2f7752..4b5a12a5b 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateDropListener.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateDropListener.java
@@ -18,6 +18,7 @@ import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.TransferData;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.editor.Messages;
import eu.etaxonomy.taxeditor.editor.view.derivate.operation.MoveDerivateOperation;
import eu.etaxonomy.taxeditor.model.AbstractUtility;
import eu.etaxonomy.taxeditor.model.MessagingUtils;
@@ -36,13 +37,10 @@ public class DerivateDropListener extends ViewerDropAdapter {
this.derivateView = derivateView;
}
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.ViewerDropAdapter#performDrop(java.lang.Object)
- */
@Override
public boolean performDrop(Object data) {
if(derivateView.isDirty()){
- MessagingUtils.warningDialog("View has unsaved changes", this, "You need to save before performing this action");
+ MessagingUtils.warningDialog(DerivateView.VIEW_HAS_UNSAVED_CHANGES, this, DerivateView.YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION);
return false;
}
Object target = getCurrentTarget();
@@ -51,16 +49,13 @@ public class DerivateDropListener extends ViewerDropAdapter {
TreeNode targetNode = (TreeNode) target;
TreeNode draggedNode = EditorUtil.getTreeNodeOfSelection(derivateViewSelection.getSelection());
if(draggedNode!=null){
- MoveDerivateOperation moveDerivateOperation = new MoveDerivateOperation("Moving \""+derivateView.getLabelProvider().getDerivateText(draggedNode)+"\" to \""+derivateView.getLabelProvider().getDerivateText(targetNode)+"\"", EditorUtil.getUndoContext(), derivateView, draggedNode, targetNode);
+ MoveDerivateOperation moveDerivateOperation = new MoveDerivateOperation(String.format(Messages.DerivateDropListener_MOVE_TO, derivateView.getLabelProvider().getDerivateText(draggedNode), derivateView.getLabelProvider().getDerivateText(targetNode)), EditorUtil.getUndoContext(), derivateView, draggedNode, targetNode);
return AbstractUtility.executeOperation(moveDerivateOperation).equals(Status.OK_STATUS)?true:false;
}
}
return false;
}
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.ViewerDropAdapter#validateDrop(java.lang.Object, int, org.eclipse.swt.dnd.TransferData)
- */
@Override
public boolean validateDrop(Object target, int operation, TransferData transferType) {
return LocalSelectionTransfer.getTransfer().isSupportedType(transferType) && target instanceof TreeNode;
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateView.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateView.java
index 7548960d9..d7fcc56f8 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateView.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateView.java
@@ -39,6 +39,7 @@ import eu.etaxonomy.cdm.model.molecular.Sequence;
import eu.etaxonomy.cdm.model.molecular.SingleRead;
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
+import eu.etaxonomy.taxeditor.editor.Messages;
import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
import eu.etaxonomy.taxeditor.model.IPartContentHasFactualData;
@@ -57,7 +58,10 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
IConversationEnabled, IPartContentHasDetails, IPartContentHasSupplementalData, IPartContentHasMedia,
ISelectionChangedListener, IPostOperationEnabled {
- public static final String ID = "eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView";
+ public static final String ID = "eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView"; //$NON-NLS-1$
+
+ public static final String YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION = Messages.DerivateView_YOU_NEED_TO_SAVE;
+ public static final String VIEW_HAS_UNSAVED_CHANGES = Messages.DerivateView_UNSAVED_CHANGES;
private ConversationHolder conversation;
@@ -79,9 +83,6 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
public DerivateView() {
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
- */
@Override
public void createPartControl(Composite parent) {
viewer = new TreeViewer(new Tree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION));
@@ -123,15 +124,12 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
viewer.addDropSupport(dndOperations, transfers, new DerivateDropListener(this));
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
public void doSave(IProgressMonitor monitor) {
- String taskName = "Saving hierarchy";
+ String taskName = Messages.DerivateView_SAVING_HIERARCHY;
if(getEditorInput() instanceof DerivateViewEditorInput){
DerivateViewEditorInput derivateViewEditorInput = (DerivateViewEditorInput) getEditorInput();
- taskName += " "+derivateViewEditorInput.getName();
+ taskName += " "+derivateViewEditorInput.getName(); //$NON-NLS-1$
}
monitor.beginTask(taskName, 3);
if (!conversation.isBound()) {
@@ -150,28 +148,19 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
refreshTree();
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.EditorPart#doSaveAs()
- */
@Override
public void doSaveAs() {
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.EditorPart#getTitleToolTip()
- */
@Override
public String getTitleToolTip() {
if(getEditorInput() instanceof DerivateViewEditorInput){
DerivateViewEditorInput derivateViewEditorInput = (DerivateViewEditorInput) getEditorInput();
return derivateViewEditorInput.getName();
}
- return "Derivative View";
+ return Messages.DerivateView_DERIVATIVE_EDITOR;
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
- */
@Override
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
setSite(site);
@@ -183,9 +172,6 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
}
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.EditorPart#isDirty()
- */
@Override
public boolean isDirty() {
return isDirty;
@@ -198,18 +184,11 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
this.isDirty = isDirty;
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
- */
@Override
public boolean isSaveAsAllowed() {
return false;
}
-
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
- */
@Override
public void setFocus() {
viewer.getControl().setFocus();
@@ -219,16 +198,10 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
}
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
- */
@Override
public void update(CdmDataChangeMap changeEvents) {
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
- */
@Override
public ConversationHolder getConversationHolder() {
return conversation;
@@ -241,9 +214,6 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
return viewer;
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#changed(java.lang.Object)
- */
@Override
public void changed(Object element) {
setDirty(true);
@@ -251,9 +221,6 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
viewer.refresh();
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#forceDirty()
- */
@Override
public void forceDirty() {
changed(null);
@@ -281,7 +248,6 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
viewer.refresh();
}
-
private void generateMultiLinkSingleReads() {
Set multiLinkSingleReads = new HashSet();
for(Entry> entry:CdmStore.getService(ISequenceService.class).getSingleReadSequencesMap().entrySet()){
@@ -299,9 +265,6 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
return this.multiLinkSingleReads;
}
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
- */
@Override
public void selectionChanged(SelectionChangedEvent event) {
this.selection = event.getSelection();
@@ -315,9 +278,6 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
return labelProvider;
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)
- */
@Override
public boolean postOperation(CdmBase objectAffectedByOperation) {
refreshTree();
@@ -327,12 +287,14 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
return true;
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#onComplete()
- */
@Override
public boolean onComplete() {
return true;
}
+ @Override
+ public boolean canAttachMedia() {
+ return true;
+ }
+
}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewEditorInput.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewEditorInput.java
index 7050078e1..3527fe5ed 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewEditorInput.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewEditorInput.java
@@ -23,6 +23,7 @@ import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.editor.Messages;
import eu.etaxonomy.taxeditor.model.MessagingUtils;
import eu.etaxonomy.taxeditor.store.CdmStore;
import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateLabelProvider;
@@ -75,7 +76,7 @@ public class DerivateViewEditorInput implements IEditorInput{
rootUUIDs = derivateUUIDs;
}
if(rootUUIDs.isEmpty()){
- MessagingUtils.messageDialog("Failed initializing editor", DerivateViewEditorInput.class, "No root element found!");
+ MessagingUtils.messageDialog(Messages.DerivateViewEditorInput_FAIL_INIT, DerivateViewEditorInput.class, Messages.DerivateViewEditorInput_NO_ROOT);
}
}
@@ -138,7 +139,7 @@ public class DerivateViewEditorInput implements IEditorInput{
name = DerivateLabelProvider.getDerivateText(specimen, conversationHolder);
}
else{
- name += " + "+DerivateLabelProvider.getDerivateText(specimen, conversationHolder);
+ name += " + "+DerivateLabelProvider.getDerivateText(specimen, conversationHolder); //$NON-NLS-1$
}
}
}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/CreateDerivateContextMenu.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/CreateDerivateContextMenu.java
index b04582f5e..2438c4325 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/CreateDerivateContextMenu.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/CreateDerivateContextMenu.java
@@ -26,6 +26,7 @@ import eu.etaxonomy.cdm.model.occurrence.MediaSpecimen;
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.editor.Messages;
import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
import eu.etaxonomy.taxeditor.model.AbstractUtility;
import eu.etaxonomy.taxeditor.model.MessagingUtils;
@@ -37,9 +38,13 @@ import eu.etaxonomy.taxeditor.ui.dialog.selection.MediaSelectionDialog;
*/
public class CreateDerivateContextMenu extends CompoundContributionItem {
- /* (non-Javadoc)
- * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
- */
+ private static final String SINGLE_READ = Messages.CreateDerivateContextMenu_SINGLE_READ;
+ private static final String CONSENSUS_SEQUENCE = Messages.CreateDerivateContextMenu_SEQUENCE;
+ private static final String MEDIA_SPECIMEN = Messages.CreateDerivateContextMenu_MEDIA_SPECIMEN;
+ private static final String DNA_SAMPLE = Messages.CreateDerivateContextMenu_DNA_SAMPLE;
+ private static final String TISSUE_SAMPLE = Messages.CreateDerivateContextMenu_TISSUE_SAMPLE;
+ private static final String SPECIMEN = Messages.CreateDerivateContextMenu_SPECIMEN;
+
@Override
protected IContributionItem[] getContributionItems() {
IContributionItem[] contributionItems = new IContributionItem[] {
@@ -47,7 +52,7 @@ public class CreateDerivateContextMenu extends CompoundContributionItem {
@Override
public void fill(Menu menu, int index) {
MenuItem addItem = new MenuItem(menu, SWT.CASCADE);
- addItem.setText("Add...");
+ addItem.setText(Messages.CreateDerivateContextMenu_ADD);
Menu addMenu = new Menu(menu);
addItem.setMenu(addMenu);
final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
@@ -56,37 +61,37 @@ public class CreateDerivateContextMenu extends CompoundContributionItem {
if(selectedTreeNode!=null){
//context menu for FieldUnit
if(selectedTreeNode.getValue() instanceof FieldUnit){
- createMenuItem(addMenu, "Specimen", selectedTreeNode, DerivedUnit.class, SpecimenOrObservationType.PreservedSpecimen, DerivationEventType.GATHERING_IN_SITU());
+ createMenuItem(addMenu, SPECIMEN, selectedTreeNode, DerivedUnit.class, SpecimenOrObservationType.PreservedSpecimen, DerivationEventType.GATHERING_IN_SITU());
new MenuItem(addMenu, SWT.SEPARATOR);
- createMenuItem(addMenu, "Tissue Sample", selectedTreeNode, DnaSample.class, SpecimenOrObservationType.TissueSample, DerivationEventType.PREPARATION());
- createMenuItem(addMenu, "DNA Sample", selectedTreeNode, DnaSample.class, SpecimenOrObservationType.DnaSample, DerivationEventType.DNA_EXTRACTION());
- createMenuItem(addMenu, "Media Specimen", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.Media, DerivationEventType.ACCESSIONING());
+ createMenuItem(addMenu, TISSUE_SAMPLE, selectedTreeNode, DnaSample.class, SpecimenOrObservationType.TissueSample, DerivationEventType.PREPARATION());
+ createMenuItem(addMenu, DNA_SAMPLE, selectedTreeNode, DnaSample.class, SpecimenOrObservationType.DnaSample, DerivationEventType.DNA_EXTRACTION());
+ createMenuItem(addMenu, MEDIA_SPECIMEN, selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.Media, DerivationEventType.ACCESSIONING());
}
//context menu for Specimen
else if(selectedTreeNode.getValue() instanceof DerivedUnit && ((DerivedUnit)selectedTreeNode.getValue()).getRecordBasis()==SpecimenOrObservationType.PreservedSpecimen){
- createMenuItem(addMenu, "Tissue Sample", selectedTreeNode, DnaSample.class, SpecimenOrObservationType.TissueSample, DerivationEventType.PREPARATION());
- createMenuItem(addMenu, "DNA Sample", selectedTreeNode, DnaSample.class, SpecimenOrObservationType.DnaSample, DerivationEventType.DNA_EXTRACTION());
- createMenuItem(addMenu, "Media Specimen", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.Media, DerivationEventType.ACCESSIONING());
+ createMenuItem(addMenu, TISSUE_SAMPLE, selectedTreeNode, DnaSample.class, SpecimenOrObservationType.TissueSample, DerivationEventType.PREPARATION());
+ createMenuItem(addMenu, DNA_SAMPLE, selectedTreeNode, DnaSample.class, SpecimenOrObservationType.DnaSample, DerivationEventType.DNA_EXTRACTION());
+ createMenuItem(addMenu, MEDIA_SPECIMEN, selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.Media, DerivationEventType.ACCESSIONING());
}
//context menu for TissueSample
else if(selectedTreeNode.getValue() instanceof DnaSample && ((DnaSample)selectedTreeNode.getValue()).getRecordBasis()==SpecimenOrObservationType.TissueSample){
- createMenuItem(addMenu, "DnaSample", selectedTreeNode, DnaSample.class, SpecimenOrObservationType.DnaSample, DerivationEventType.DNA_EXTRACTION());
- createMenuItem(addMenu, "Media Specimen", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.Media, DerivationEventType.ACCESSIONING());
+ createMenuItem(addMenu, DNA_SAMPLE, selectedTreeNode, DnaSample.class, SpecimenOrObservationType.DnaSample, DerivationEventType.DNA_EXTRACTION());
+ createMenuItem(addMenu, MEDIA_SPECIMEN, selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.Media, DerivationEventType.ACCESSIONING());
}
//context menu for DnaSample
else if(selectedTreeNode.getValue() instanceof DnaSample && ((DnaSample)selectedTreeNode.getValue()).getRecordBasis()==SpecimenOrObservationType.DnaSample){
- createMenuItem(addMenu, "Consensus Sequence", selectedTreeNode, Sequence.class, null, null);
- createMenuItem(addMenu, "Media Specimen", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.Media, DerivationEventType.ACCESSIONING());
+ createMenuItem(addMenu, CONSENSUS_SEQUENCE, selectedTreeNode, Sequence.class, null, null);
+ createMenuItem(addMenu, MEDIA_SPECIMEN, selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.Media, DerivationEventType.ACCESSIONING());
}
//context menu for Sequence
else if(selectedTreeNode.getValue() instanceof Sequence){
- createMenuItem(addMenu, "Single Read", selectedTreeNode, SingleRead.class, null, null);
+ createMenuItem(addMenu, SINGLE_READ, selectedTreeNode, SingleRead.class, null, null);
}
//default
else{
MenuItem menuItem = new MenuItem(addMenu, SWT.NONE);
- menuItem.setText("No child derivates");
+ menuItem.setText(Messages.CreateDerivateContextMenu_NO_CHILD_DERIVATE);
menuItem.setEnabled(false);
}
}
@@ -102,7 +107,7 @@ public class CreateDerivateContextMenu extends CompoundContributionItem {
if(specimenType!=null && specimenType.equals(SpecimenOrObservationType.Media)){
//media submenu
MenuItem mediaItem = new MenuItem(menu, SWT.CASCADE);
- mediaItem.setText("Media...");
+ mediaItem.setText(Messages.CreateDerivateContextMenu_MEDIA);
Menu mediaMenu = new Menu(menu);
mediaItem.setMenu(mediaMenu);
@@ -113,11 +118,8 @@ public class CreateDerivateContextMenu extends CompoundContributionItem {
//existing media menu
MenuItem existingMediaItem = new MenuItem(mediaMenu, SWT.NONE);
- existingMediaItem.setText("Media Specimen with existing media");
+ existingMediaItem.setText(Messages.CreateDerivateContextMenu_MEDIA_EXISTING);
existingMediaItem.addSelectionListener(new SelectionAdapter() {
- /* (non-Javadoc)
- * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
- */
@Override
public void widgetSelected(SelectionEvent e) {
//select media
@@ -173,9 +175,6 @@ public class CreateDerivateContextMenu extends CompoundContributionItem {
this.derivationEventType = derivationEventType;
}
- /* (non-Javadoc)
- * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
- */
@Override
public void widgetSelected(SelectionEvent e) {
DerivateView derivateView = null;
@@ -185,7 +184,7 @@ public class CreateDerivateContextMenu extends CompoundContributionItem {
if(derivateView!=null){
if(derivateView.isDirty()){
e.doit = false;
- MessagingUtils.warningDialog("View has unsaved changes", this, "You need to save before performing this action");
+ MessagingUtils.warningDialog(DerivateView.VIEW_HAS_UNSAVED_CHANGES, this, DerivateView.YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION);
return;
}
}
@@ -195,7 +194,7 @@ public class CreateDerivateContextMenu extends CompoundContributionItem {
if(selectedDerivate instanceof DnaSample && ((DnaSample) selectedDerivate).getRecordBasis()==SpecimenOrObservationType.DnaSample){
DnaSample dnaSample = (DnaSample)selectedDerivate;
if(childClass.equals(Sequence.class)){
- Sequence newInstance = Sequence.NewInstance(dnaSample, "", 0);
+ Sequence newInstance = Sequence.NewInstance(dnaSample, "", 0); //$NON-NLS-1$
createdElement = newInstance;
}
}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/DerivateViewContextMenu.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/DerivateViewContextMenu.java
index b03172f35..17d95b197 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/DerivateViewContextMenu.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/DerivateViewContextMenu.java
@@ -5,9 +5,6 @@ import org.eclipse.ui.actions.CompoundContributionItem;
public class DerivateViewContextMenu extends CompoundContributionItem {
- /* (non-Javadoc)
- * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
- */
@Override
protected IContributionItem[] getContributionItems() {
IContributionItem[] contributionItems = new IContributionItem[] {
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/SingleReadSequenceContextMenu.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/SingleReadSequenceContextMenu.java
index b3164a458..92848bc39 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/SingleReadSequenceContextMenu.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/SingleReadSequenceContextMenu.java
@@ -19,6 +19,7 @@ import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
import eu.etaxonomy.cdm.model.molecular.Sequence;
import eu.etaxonomy.cdm.model.molecular.SingleRead;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.editor.Messages;
import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
import eu.etaxonomy.taxeditor.model.MessagingUtils;
import eu.etaxonomy.taxeditor.store.CdmStore;
@@ -35,9 +36,6 @@ public class SingleReadSequenceContextMenu extends CompoundContributionItem {
ADD_TO_SEQUENCE
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
- */
@Override
protected IContributionItem[] getContributionItems() {
IContributionItem[] contributionItems = new IContributionItem[] {
@@ -54,17 +52,17 @@ public class SingleReadSequenceContextMenu extends CompoundContributionItem {
if(selectedTreeNode.getValue() instanceof Sequence
&& clipboardNode!=null && clipboardNode.getValue() instanceof SingleRead){
MenuItem item = new MenuItem(menu, SWT.NONE);
- item.setText("Reuse SingleRead here");
+ item.setText(Messages.SingleReadSequenceContextMenu_REUSE_SINGLE_READ_HERE);
item.addSelectionListener(new WidgetSelectionListener(CommandType.ADD_TO_SEQUENCE));
}
else if(selectedTreeNode.getValue() instanceof SingleRead){
MenuItem item = new MenuItem(menu, SWT.NONE);
- item.setText("Reuse for other Sequence");
+ item.setText(Messages.SingleReadSequenceContextMenu_REUSE_FOR_SEQUENCE);
item.addSelectionListener(new WidgetSelectionListener(CommandType.COPY_TO_CLIPBOARD));
if(activeEditor instanceof DerivateView
&& ((DerivateView) activeEditor).getMultiLinkSingleReads().contains(selectedTreeNode.getValue())){
MenuItem unlinkItem = new MenuItem(menu, SWT.NONE);
- unlinkItem.setText("Remove from this Sequence");
+ unlinkItem.setText(Messages.SingleReadSequenceContextMenu_REMOVE_FROM_SEQUENCE);
unlinkItem.addSelectionListener(new WidgetSelectionListener(CommandType.REMOVE_FROM_SEQUENCE));
}
}
@@ -87,9 +85,6 @@ public class SingleReadSequenceContextMenu extends CompoundContributionItem {
this.commandType = commandType;
}
- /* (non-Javadoc)
- * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
- */
@Override
public void widgetSelected(SelectionEvent e) {
IEditorPart activeEditor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
@@ -100,7 +95,7 @@ public class SingleReadSequenceContextMenu extends CompoundContributionItem {
switch (commandType) {
case REMOVE_FROM_SEQUENCE:
if(activeEditor.isDirty()){
- MessagingUtils.warningDialog("View has unsaved changes", this, "You need to save before performing this action");
+ MessagingUtils.warningDialog(DerivateView.VIEW_HAS_UNSAVED_CHANGES, this, DerivateView.YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION);
return;
}
if(selectedTreeNode!=null && selectedTreeNode.getParent()!=null &&
@@ -118,7 +113,7 @@ public class SingleReadSequenceContextMenu extends CompoundContributionItem {
break;
case ADD_TO_SEQUENCE:
if(activeEditor.isDirty()){
- MessagingUtils.warningDialog("View has unsaved changes", this, "You need to save before performing this action");
+ MessagingUtils.warningDialog(DerivateView.VIEW_HAS_UNSAVED_CHANGES, this, DerivateView.YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION);
return;
}
if(clipBoardTreeNode!=null && clipBoardTreeNode.getValue() instanceof SingleRead
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/CreateFieldUnitHandler.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/CreateFieldUnitHandler.java
index da8c8db71..e57cbfbf7 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/CreateFieldUnitHandler.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/CreateFieldUnitHandler.java
@@ -19,7 +19,7 @@ public class CreateFieldUnitHandler extends AbstractHandler {
if(AbstractUtility.getActivePart() instanceof DerivateView){
DerivateView derivateView = (DerivateView)AbstractUtility.getActivePart();
if(derivateView.isDirty()){
- MessagingUtils.warningDialog("View has unsaved changes", this, "You need to save before performing this action");
+ MessagingUtils.warningDialog(DerivateView.VIEW_HAS_UNSAVED_CHANGES, this, DerivateView.YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION);
return null;
}
FieldUnit fieldUnit = FieldUnit.NewInstance();
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/DeleteDerivateHandler.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/DeleteDerivateHandler.java
index 1f429451b..28d7f2bd6 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/DeleteDerivateHandler.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/DeleteDerivateHandler.java
@@ -42,9 +42,6 @@ import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateLabelProvider;
*/
public class DeleteDerivateHandler extends AbstractHandler {
- /* (non-Javadoc)
- * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
- */
/** {@inheritDoc} */
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
@@ -66,10 +63,10 @@ public class DeleteDerivateHandler extends AbstractHandler {
if(value instanceof SpecimenOrObservationBase> || value instanceof Sequence || value instanceof SingleRead){
if(postOperationEnabled instanceof IConversationEnabled){
ConversationHolder conversationHolder = ((IConversationEnabled) postOperationEnabled).getConversationHolder();
- label += " "+DerivateLabelProvider.getDerivateText(value, conversationHolder);
+ label += " "+DerivateLabelProvider.getDerivateText(value, conversationHolder); //$NON-NLS-1$
}
SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
- boolean deepDelete = event.getCommand().getId().equals("eu.etaxonomy.taxeditor.editor.derivate.deepDelete");
+ boolean deepDelete = event.getCommand().getId().equals("eu.etaxonomy.taxeditor.editor.derivate.deepDelete"); //$NON-NLS-1$
config.setDeleteChildren(deepDelete);
config.setDeleteMolecularData(deepDelete);
DeleteDerivateOperation deleteDerivateOperation = new DeleteDerivateOperation(label, undoContext, (CdmBase) value, (TreeNode) object, postOperationEnabled, config);
@@ -82,7 +79,7 @@ public class DeleteDerivateHandler extends AbstractHandler {
}
} catch (NotDefinedException e) {
- MessagingUtils.warn(getClass(), "Command name not set.");
+ MessagingUtils.warn(getClass(), "Command name not set");
}
return null;
}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/OpenDerivateEditorForTaxonHandler.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/OpenDerivateEditorForTaxonHandler.java
index 5f2922765..7b30737f9 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/OpenDerivateEditorForTaxonHandler.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/OpenDerivateEditorForTaxonHandler.java
@@ -28,6 +28,7 @@ import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
import eu.etaxonomy.cdm.model.taxon.Taxon;
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.editor.Messages;
import eu.etaxonomy.taxeditor.editor.handler.OpenDerivateViewHandler;
import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateViewEditorInput;
import eu.etaxonomy.taxeditor.model.MessagingUtils;
@@ -40,6 +41,8 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
*/
public class OpenDerivateEditorForTaxonHandler extends AbstractHandler {
+ private static final String COULD_NOT_OPEN_DERIVATIVE_EDITOR = Messages.OpenDerivateEditorForTaxonHandler_COULD_NOT_OPEN_EDITOR;
+
/* (non-Javadoc)
* @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
*/
@@ -61,16 +64,16 @@ public class OpenDerivateEditorForTaxonHandler extends AbstractHandler {
}
}
if(derivateUuids.isEmpty()){
- MessagingUtils.warningDialog("Could not open Derivative Editor", this, "No Derivatives found");
+ MessagingUtils.warningDialog(COULD_NOT_OPEN_DERIVATIVE_EDITOR, this, Messages.OpenDerivateEditorForTaxonHandler_NO_DERIVATIVES_FOUND);
return null;
}
DerivateViewEditorInput input = new DerivateViewEditorInput(derivateUuids);
try {
EditorUtil.open(input);
} catch (PartInitException e) {
- MessagingUtils.error(OpenDerivateViewHandler.class, "Could not open Derivative Editor", e);
+ MessagingUtils.error(OpenDerivateViewHandler.class, COULD_NOT_OPEN_DERIVATIVE_EDITOR, e);
} catch (NullPointerException npe){
- MessagingUtils.messageDialog("Failed to open Editor", OpenDerivateViewHandler.class, "Could not open Derivative Editor. The derivative hierarchy is corrupted!", npe);
+ MessagingUtils.messageDialog(Messages.OpenDerivateEditorForTaxonHandler_FAILED_TO_OPEN, OpenDerivateViewHandler.class, Messages.OpenDerivateEditorForTaxonHandler_HIERARCHY_CORRUPTED, npe);
}
}
return null;
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/operation/DeleteDerivateOperation.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/operation/DeleteDerivateOperation.java
index c467a943e..839beb546 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/operation/DeleteDerivateOperation.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/operation/DeleteDerivateOperation.java
@@ -24,6 +24,7 @@ import eu.etaxonomy.cdm.api.service.config.SpecimenDeleteConfigurator;
import eu.etaxonomy.cdm.model.common.CdmBase;
import eu.etaxonomy.cdm.model.molecular.Sequence;
import eu.etaxonomy.cdm.model.molecular.SingleRead;
+import eu.etaxonomy.taxeditor.editor.Messages;
import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
import eu.etaxonomy.taxeditor.model.AbstractUtility;
import eu.etaxonomy.taxeditor.model.MessagingUtils;
@@ -60,16 +61,16 @@ public class DeleteDerivateOperation extends AbstractPostOperation {
@Override
public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
if(getPostOperationEnabled() instanceof ISaveablePart){
- String confirmationQuestion = "Do you really want to delete the selected element";
+ String confirmationQuestion = Messages.DeleteDerivateOperation_REALLY_DELETE;
if(deleteConfigurator.isDeleteChildren()){
- confirmationQuestion += " and its children";
+ confirmationQuestion += Messages.DeleteDerivateOperation_AND_CHILDREN;
}
- confirmationQuestion += "?";
- if(!DeleteConfiguratorDialog.openConfirmWithConfigurator(deleteConfigurator, null, "Confirm Deletion", confirmationQuestion)){
+ confirmationQuestion += "?"; //$NON-NLS-1$
+ if(!DeleteConfiguratorDialog.openConfirmWithConfigurator(deleteConfigurator, null, Messages.DeleteDerivateOperation_CONFIRM, confirmationQuestion)){
return Status.CANCEL_STATUS;
}
if(((ISaveablePart) getPostOperationEnabled()).isDirty()){
- MessagingUtils.warningDialog("View has unsaved changes", this, "You need to save before performing this action");
+ MessagingUtils.warningDialog(DerivateView.VIEW_HAS_UNSAVED_CHANGES, this, DerivateView.YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION);
return Status.CANCEL_STATUS;
}
}
@@ -97,7 +98,7 @@ public class DeleteDerivateOperation extends AbstractPostOperation {
}
}
else{
- MessagingUtils.warningDialog("Deletion failed", this, deleteResult.toString());
+ MessagingUtils.warningDialog(Messages.DeleteDerivateOperation_DELETE_FAILED, this, deleteResult.toString());
return Status.CANCEL_STATUS;
}
return Status.OK_STATUS;
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/operation/MoveDerivateOperation.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/operation/MoveDerivateOperation.java
index b863dcbe2..5a1756b9c 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/operation/MoveDerivateOperation.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/operation/MoveDerivateOperation.java
@@ -28,6 +28,7 @@ import eu.etaxonomy.cdm.model.molecular.SingleRead;
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
+import eu.etaxonomy.taxeditor.editor.Messages;
import eu.etaxonomy.taxeditor.editor.internal.TaxeditorEditorPlugin;
import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
import eu.etaxonomy.taxeditor.model.MessagingUtils;
@@ -53,9 +54,6 @@ public class MoveDerivateOperation extends AbstractPostOperation {
this.targetNode = targetNode;
}
- /* (non-Javadoc)
- * @see org.eclipse.core.commands.operations.AbstractOperation#execute(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
- */
@Override
public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
DerivateView derivateView = null;
@@ -63,11 +61,11 @@ public class MoveDerivateOperation extends AbstractPostOperation {
derivateView = (DerivateView) getPostOperationEnabled();
}
if(derivateView==null){
- MessagingUtils.operationDialog(this, new NullPointerException("DerivativeView was null"), TaxeditorEditorPlugin.PLUGIN_ID, this.getLabel(), getLabel());
+ MessagingUtils.operationDialog(this, new NullPointerException("Derivative Editor was null"), TaxeditorEditorPlugin.PLUGIN_ID, this.getLabel(), getLabel()); //$NON-NLS-1$
return Status.CANCEL_STATUS;
}
if(derivateView.isDirty()){
- MessagingUtils.warningDialog("View has unsaved changes", this, "You need to save before performing this action");
+ MessagingUtils.warningDialog(DerivateView.VIEW_HAS_UNSAVED_CHANGES, this, DerivateView.YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION);
return Status.CANCEL_STATUS;
}
@@ -79,7 +77,7 @@ public class MoveDerivateOperation extends AbstractPostOperation {
return postExecute(null);
}
else{
- MessagingUtils.warningDialog("Moving derivatives not possible!", derivateView, "Moving \""+derivateView.getLabelProvider().getDerivateText(draggedNode)+"\" to \""+derivateView.getLabelProvider().getDerivateText(targetNode)+"\" is not possible!");
+ MessagingUtils.warningDialog(Messages.MoveDerivateOperation_MOVE_NOT_POSSIBLE, derivateView, String.format(Messages.MoveDerivateOperation_MOVE_TO_NOT_POSSIBLE, derivateView.getLabelProvider().getDerivateText(draggedNode), derivateView.getLabelProvider().getDerivateText(targetNode)));
}
return Status.CANCEL_STATUS;
}
@@ -109,7 +107,7 @@ public class MoveDerivateOperation extends AbstractPostOperation {
else if(draggedNodeValue instanceof SingleRead && targetNodeValue instanceof Sequence){
SingleRead singleRead = (SingleRead) draggedNodeValue;
if(fromParentSpecimen instanceof Sequence){
- return CdmStore.getService(ISequenceService.class).moveSingleRead((Sequence)fromParentSpecimen, (Sequence)targetNodeValue, singleRead);
+ return CdmStore.getService(ISequenceService.class).moveSingleRead((Sequence)fromParentSpecimen, (Sequence)targetNodeValue, singleRead).isOk();
}
}
@@ -117,16 +115,12 @@ public class MoveDerivateOperation extends AbstractPostOperation {
else if(draggedNodeValue instanceof Sequence && targetNodeValue instanceof DnaSample && ((SpecimenOrObservationBase>) targetNodeValue).getRecordBasis()==SpecimenOrObservationType.DnaSample){
Sequence sequence = (Sequence)draggedNodeValue;
if(fromParentSpecimen instanceof DnaSample && ((SpecimenOrObservationBase>) targetNodeValue).getRecordBasis()==SpecimenOrObservationType.DnaSample){
- return occurrenceService.moveSequence((DnaSample)fromParentSpecimen, (DnaSample)targetNodeValue, sequence);
+ return occurrenceService.moveSequence((DnaSample)fromParentSpecimen, (DnaSample)targetNodeValue, sequence).isOk();
}
}
return false;
}
-
- /* (non-Javadoc)
- * @see org.eclipse.core.commands.operations.AbstractOperation#redo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
- */
@Override
public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
//swap fromNode and targetNode
@@ -134,9 +128,6 @@ public class MoveDerivateOperation extends AbstractPostOperation {
return execute(new NullProgressMonitor(), null);
}
- /* (non-Javadoc)
- * @see org.eclipse.core.commands.operations.AbstractOperation#undo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
- */
@Override
public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
//swap fromNode and targetNode
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/handler/MoveDescriptionElementsHandler.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/handler/MoveDescriptionElementsHandler.java
index 9a801a4d4..3c1fee4fb 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/handler/MoveDescriptionElementsHandler.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/handler/MoveDescriptionElementsHandler.java
@@ -1,9 +1,9 @@
// $Id$
/**
* Copyright (C) 2007 EDIT
-* European Distributed Institute of Taxonomy
+* European Distributed Institute of Taxonomy
* http://www.e-taxonomy.eu
-*
+*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* See LICENSE.TXT at the top of this package for the full license terms.
*/
@@ -25,7 +25,6 @@ import org.eclipse.ui.PartInitException;
import org.eclipse.ui.handlers.HandlerUtil;
import eu.etaxonomy.cdm.api.service.IDescriptionService;
-import eu.etaxonomy.cdm.api.service.ITaxonService;
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
import eu.etaxonomy.cdm.model.common.Annotation;
import eu.etaxonomy.cdm.model.common.AnnotationType;
@@ -34,13 +33,13 @@ import eu.etaxonomy.cdm.model.common.Language;
import eu.etaxonomy.cdm.model.description.DescriptionBase;
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
import eu.etaxonomy.cdm.model.description.TaxonDescription;
+import eu.etaxonomy.cdm.model.taxon.Classification;
import eu.etaxonomy.cdm.model.taxon.Taxon;
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
import eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor;
import eu.etaxonomy.taxeditor.editor.Page;
import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
-import eu.etaxonomy.taxeditor.editor.view.descriptive.DescriptiveViewPart;
import eu.etaxonomy.taxeditor.editor.view.descriptive.operation.MoveDescriptionElementsOperation;
import eu.etaxonomy.taxeditor.model.AbstractUtility;
import eu.etaxonomy.taxeditor.model.FeatureNodeContainer;
@@ -48,7 +47,6 @@ import eu.etaxonomy.taxeditor.model.MessagingUtils;
import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
import eu.etaxonomy.taxeditor.store.CdmStore;
-import eu.etaxonomy.taxeditor.ui.dialog.selection.TaxonBaseSelectionDialog;
import eu.etaxonomy.taxeditor.ui.dialog.selection.TaxonNodeSelectionDialog;
@@ -65,31 +63,31 @@ public class MoveDescriptionElementsHandler extends AbstractHandler implements I
*/
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
-
+
// ConversationHolder conversation = CdmStore.createConversation();
editor = (TaxonNameEditor) EditorUtil.getActiveEditorPage(Page.NAME);
ISelection selection = HandlerUtil.getCurrentSelection(event);
-
+ Taxon actualTaxon= null;
if(selection instanceof IStructuredSelection){
IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-
+
List elements = new ArrayList();
-
+
for(Object element : structuredSelection.toArray()){
if(element instanceof DescriptionElementBase){
UUID uuid = ((DescriptionElementBase) element).getUuid();
-
+
elements.add(CdmStore.getService(IDescriptionService.class).loadDescriptionElement(uuid, null));
} else if(element instanceof FeatureNodeContainer){
for(DescriptionElementBase de : ((FeatureNodeContainer)element).getDescriptionElements()){
elements.add(
- (DescriptionElementBase)CdmStore.getService(IDescriptionService.class).loadDescriptionElement(de.getUuid(), null)
+ CdmStore.getService(IDescriptionService.class).loadDescriptionElement(de.getUuid(), null)
);
}
}
}
-
+
if(elements.size() == 0){
return null;
}
@@ -97,45 +95,51 @@ public class MoveDescriptionElementsHandler extends AbstractHandler implements I
List excludeTaxa = new ArrayList();
if (description.isInstanceOf(TaxonDescription.class)){
TaxonDescription taxonDescription = HibernateProxyHelper.deproxy(description, TaxonDescription.class);
- Taxon actualTaxon = taxonDescription.getTaxon();
+ actualTaxon = taxonDescription.getTaxon();
excludeTaxa.add(actualTaxon.getUuid());
}
-
-
+ Classification classification = null;
+ if (actualTaxon != null){
+ if (!actualTaxon.getTaxonNodes().isEmpty() && actualTaxon.getTaxonNodes().size() ==1){
+ classification = actualTaxon.getTaxonNodes().iterator().next().getClassification();
+ }
+ }
TaxonNode newAcceptedTaxonNode = TaxonNodeSelectionDialog.select(HandlerUtil.getActiveShell(event),
editor.getConversationHolder(),
"Choose the accepted taxon",
excludeTaxa,
- null,
- null);
- Taxon targetTaxon = newAcceptedTaxonNode.getTaxon();
-
- if(targetTaxon == null){
- // canceled
- return null;
- }
- newAcceptedTaxonNodeUuid = newAcceptedTaxonNode.getUuid();
- TaxonDescription targetDescription = TaxonDescription.NewInstance(targetTaxon);
- String moveMessage = String.format("Elements moved from %s", EditorUtil.getActiveMultiPageTaxonEditor().getTaxon());
- targetDescription.setTitleCache(moveMessage, true);
- Annotation annotation = Annotation.NewInstance(moveMessage, Language.getDefaultLanguage());
- annotation.setAnnotationType(AnnotationType.TECHNICAL());
- targetDescription.addAnnotation(annotation);
-
- try {
- AbstractPostOperation operation = new MoveDescriptionElementsOperation(
- event.getCommand().getName(), EditorUtil.getUndoContext(),
- targetDescription, elements, false, this);
-
- EditorUtil.executeOperation(operation);
-
- //CdmStore.getService(ITaxonService.class).saveOrUpdate(targetTaxon);
-
- } catch (NotDefinedException e) {
- MessagingUtils.error(getClass(), e);
+ null,classification
+ );
+ if (newAcceptedTaxonNode != null){
+ Taxon targetTaxon = newAcceptedTaxonNode.getTaxon();
+
+ if(targetTaxon == null){
+ // canceled
+ return null;
+ }
+ newAcceptedTaxonNodeUuid = newAcceptedTaxonNode.getUuid();
+ TaxonDescription targetDescription = TaxonDescription.NewInstance(targetTaxon);
+ String moveMessage = String.format("Elements moved from %s", EditorUtil.getActiveMultiPageTaxonEditor().getTaxon());
+ targetDescription.setTitleCache(moveMessage, true);
+ Annotation annotation = Annotation.NewInstance(moveMessage, Language.getDefaultLanguage());
+ annotation.setAnnotationType(AnnotationType.TECHNICAL());
+ targetDescription.addAnnotation(annotation);
+
+ try {
+ AbstractPostOperation operation = new MoveDescriptionElementsOperation(
+ event.getCommand().getName(), EditorUtil.getUndoContext(),
+ targetDescription, elements, false, this);
+
+ EditorUtil.executeOperation(operation);
+
+ //CdmStore.getService(ITaxonService.class).saveOrUpdate(targetTaxon);
+
+ } catch (NotDefinedException e) {
+ MessagingUtils.error(getClass(), e);
+ }
}
}
-
+
return null;
}
@@ -145,11 +149,12 @@ public class MoveDescriptionElementsHandler extends AbstractHandler implements I
/** {@inheritDoc} */
@Override
public boolean postOperation(CdmBase objectAffectedByOperation) {
-
+
editor.getConversationHolder().bind();
editor.getConversationHolder().commit(true);
Display.getDefault().asyncExec(new Runnable(){
-
+
+ @Override
public void run() {
//AbstractUtility.close(editor.getMultiPageTaxonEditor());
@@ -178,5 +183,5 @@ public class MoveDescriptionElementsHandler extends AbstractHandler implements I
// TODO Auto-generated method stub
return false;
}
-
+
}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/media/MediaViewPart.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/media/MediaViewPart.java
index 07cbd473d..e0520f002 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/media/MediaViewPart.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/media/MediaViewPart.java
@@ -40,24 +40,17 @@ import eu.etaxonomy.taxeditor.view.detail.DetailsViewPart;
import eu.etaxonomy.taxeditor.view.supplementaldata.SupplementalDataViewPart;
/**
- * MediaViewPart class.
- *
* @author n.hoffmann
* @created Jun 15, 2010
* @version 1.0
*/
public class MediaViewPart extends AbstractCdmEditorViewPart implements IPartContentHasDetails, IPartContentHasSupplementalData {
- /** Constant ID="eu.etaxonomy.taxeditor.editor.view.medi"{trunked}
*/
public static final String ID = "eu.etaxonomy.taxeditor.editor.view.media";
private TreeViewer viewer;
- /*
- * (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.model.AbstractCdmViewPart#createViewer(org.eclipse.swt.widgets.Composite)
- */
/** {@inheritDoc} */
@Override
public void createViewer(Composite parent) {
@@ -83,9 +76,6 @@ public class MediaViewPart extends AbstractCdmEditorViewPart implements IPartCon
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.model.AbstractCdmViewPart#getInitialSelection()
- */
/** {@inheritDoc} */
@Override
protected ISelection getInitialSelection() {
@@ -112,26 +102,25 @@ public class MediaViewPart extends AbstractCdmEditorViewPart implements IPartCon
return;
}
- if(part instanceof IPartContentHasMedia){
+ if(part instanceof IPartContentHasMedia && ((IPartContentHasMedia) part).canAttachMedia()){
if(part instanceof MultiPageTaxonEditor){
IEditorInput input = ((IEditorPart) part).getEditorInput();
showViewer(part, new StructuredSelection(input));
+ return;
}
else if(selection instanceof IStructuredSelection){
Object firstElement = ((IStructuredSelection) selection).getFirstElement();
if(firstElement instanceof TreeNode){
showViewer(part, new StructuredSelection(((TreeNode) firstElement).getValue()));
+ return;
}
- else{
+ else if(firstElement!=null){
showViewer(part, (IStructuredSelection) selection);
+ return;
}
- }else{
- showEmptyPage();
}
}
- else{
- showEmptyPage();
- }
+ showEmptyPage();
}
/** {@inheritDoc} */
@@ -158,11 +147,6 @@ public class MediaViewPart extends AbstractCdmEditorViewPart implements IPartCon
return viewer;
}
- /**
- * onComplete
- *
- * @return a boolean.
- */
@Override
public boolean onComplete() {
return true;
diff --git a/eu.etaxonomy.taxeditor.feature.platform/feature.xml b/eu.etaxonomy.taxeditor.feature.platform/feature.xml
index 4c3f86c24..7c50d3ecb 100644
--- a/eu.etaxonomy.taxeditor.feature.platform/feature.xml
+++ b/eu.etaxonomy.taxeditor.feature.platform/feature.xml
@@ -2,7 +2,7 @@
diff --git a/eu.etaxonomy.taxeditor.feature.platform/pom.xml b/eu.etaxonomy.taxeditor.feature.platform/pom.xml
index 0405f3a8d..dfa11f2bc 100644
--- a/eu.etaxonomy.taxeditor.feature.platform/pom.xml
+++ b/eu.etaxonomy.taxeditor.feature.platform/pom.xml
@@ -3,7 +3,7 @@
eu.etaxonomy
taxeditor-parent
- 3.7.1
+ 3.8.0
4.0.0
eu.etaxonomy.taxeditor.feature.platform
diff --git a/eu.etaxonomy.taxeditor.feature/build.properties.with.jre b/eu.etaxonomy.taxeditor.feature/build.properties.with.jre
index 73564880a..421dda37b 100644
--- a/eu.etaxonomy.taxeditor.feature/build.properties.with.jre
+++ b/eu.etaxonomy.taxeditor.feature/build.properties.with.jre
@@ -8,4 +8,4 @@ root.win32.win32.x86_64.permissions.755=jre/bin/**
root.win32.win32.x86=win-32
root.win32.win32.x86.permissions.755=jre/bin/**
root.macosx.cocoa.x86_64=mac-64
-root.macosx.cocoa.x86_64.permissions.755=jre/bin/**
\ No newline at end of file
+root.macosx.cocoa.x86_64.permissions.755=jre/Contents/Home/jre/bin/**
\ No newline at end of file
diff --git a/eu.etaxonomy.taxeditor.feature/feature.xml b/eu.etaxonomy.taxeditor.feature/feature.xml
index 84cce1291..0317d51e7 100644
--- a/eu.etaxonomy.taxeditor.feature/feature.xml
+++ b/eu.etaxonomy.taxeditor.feature/feature.xml
@@ -2,7 +2,7 @@
+
+
+
+
diff --git a/eu.etaxonomy.taxeditor.feature/pom.xml b/eu.etaxonomy.taxeditor.feature/pom.xml
index e5797f685..7f1d3383b 100644
--- a/eu.etaxonomy.taxeditor.feature/pom.xml
+++ b/eu.etaxonomy.taxeditor.feature/pom.xml
@@ -3,7 +3,7 @@
eu.etaxonomy
taxeditor-parent
- 3.7.1
+ 3.8.0
4.0.0
eu.etaxonomy.taxeditor.feature
diff --git a/eu.etaxonomy.taxeditor.help/META-INF/MANIFEST.MF b/eu.etaxonomy.taxeditor.help/META-INF/MANIFEST.MF
index 66aa89c71..6c029b73d 100644
--- a/eu.etaxonomy.taxeditor.help/META-INF/MANIFEST.MF
+++ b/eu.etaxonomy.taxeditor.help/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Help
Bundle-SymbolicName: eu.etaxonomy.taxeditor.help; singleton:=true
-Bundle-Version: 3.7.1
+Bundle-Version: 3.8.0
Bundle-Activator: eu.etaxonomy.taxeditor.help.Activator
Bundle-Vendor: EDIT
Require-Bundle: org.eclipse.ui,
diff --git a/eu.etaxonomy.taxeditor.help/pom.xml b/eu.etaxonomy.taxeditor.help/pom.xml
index 56036e12a..0042922f0 100644
--- a/eu.etaxonomy.taxeditor.help/pom.xml
+++ b/eu.etaxonomy.taxeditor.help/pom.xml
@@ -3,7 +3,7 @@
eu.etaxonomy
taxeditor-parent
- 3.7.1
+ 3.8.0
4.0.0
diff --git a/eu.etaxonomy.taxeditor.molecular.lib/.classpath b/eu.etaxonomy.taxeditor.molecular.lib/.classpath
new file mode 100644
index 000000000..1d66dd2b8
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular.lib/.classpath
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/eu.etaxonomy.taxeditor.molecular.lib/.gitignore b/eu.etaxonomy.taxeditor.molecular.lib/.gitignore
new file mode 100644
index 000000000..e6066b230
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular.lib/.gitignore
@@ -0,0 +1,2 @@
+/target
+.settings/
diff --git a/eu.etaxonomy.taxeditor.molecular.lib/.project b/eu.etaxonomy.taxeditor.molecular.lib/.project
new file mode 100644
index 000000000..45f118a13
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular.lib/.project
@@ -0,0 +1,29 @@
+
+
+ eu.etaxonomy.taxeditor.molecular.lib
+ The Taxonomic Editor for EDIT's platform for
+ cybertaxonomy. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.
+
+
+
+
+ org.eclipse.pde.ManifestBuilder
+
+
+
+
+ org.eclipse.pde.SchemaBuilder
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+
+ org.eclipse.pde.PluginNature
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/eu.etaxonomy.taxeditor.molecular.lib/META-INF/MANIFEST.MF b/eu.etaxonomy.taxeditor.molecular.lib/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..65596ff9a
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular.lib/META-INF/MANIFEST.MF
@@ -0,0 +1,164 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: eu.etaxonomy.taxeditor.molecular.lib
+Bundle-SymbolicName: eu.etaxonomy.taxeditor.molecular.lib;singleton:=true
+Bundle-Version: 3.8.0
+Bundle-ClassPath: .,
+ lib/bioinfweb-commons-bio-2-SNAPSHOT.jar,
+ lib/bioinfweb-commons-core-2-SNAPSHOT.jar,
+ lib/bioinfweb-commons-swing-2-SNAPSHOT.jar,
+ lib/bioinfweb-commons-swt-2-SNAPSHOT.jar,
+ lib/core-1.9.2-SNAPSHOT.jar,
+ lib/libralign-biojava1-0-SNAPSHOT.jar,
+ lib/libralign-core-0-SNAPSHOT.jar,
+ lib/libralign-swt-0-SNAPSHOT.jar,
+ lib/sequencing-1.9.2-SNAPSHOT.jar,
+ lib/tic-core-2-SNAPSHOT.jar,
+ lib/tic-swt-2-SNAPSHOT.jar
+Export-Package: info.bioinfweb.commons,
+ info.bioinfweb.commons.appversion,
+ info.bioinfweb.commons.beans,
+ info.bioinfweb.commons.bio,
+ info.bioinfweb.commons.changemonitor,
+ info.bioinfweb.commons.collections,
+ info.bioinfweb.commons.collections.observable,
+ info.bioinfweb.commons.graphics,
+ info.bioinfweb.commons.io,
+ info.bioinfweb.commons.log,
+ info.bioinfweb.commons.progress,
+ info.bioinfweb.commons.swing,
+ info.bioinfweb.commons.swing.scrollpaneselector,
+ info.bioinfweb.commons.swt,
+ info.bioinfweb.commons.text,
+ info.bioinfweb.libralign,
+ info.bioinfweb.libralign.actions,
+ info.bioinfweb.libralign.alignmentarea,
+ info.bioinfweb.libralign.alignmentarea.content,
+ info.bioinfweb.libralign.alignmentarea.label,
+ info.bioinfweb.libralign.alignmentarea.order,
+ info.bioinfweb.libralign.alignmentarea.paintsettings,
+ info.bioinfweb.libralign.alignmentarea.rowsarea,
+ info.bioinfweb.libralign.alignmentarea.selection,
+ info.bioinfweb.libralign.alignmentarea.tokenpainter,
+ info.bioinfweb.libralign.dataarea,
+ info.bioinfweb.libralign.dataarea.implementations,
+ info.bioinfweb.libralign.dataarea.implementations.charset,
+ info.bioinfweb.libralign.dataarea.implementations.pherogram,
+ info.bioinfweb.libralign.editsettings,
+ info.bioinfweb.libralign.model,
+ info.bioinfweb.libralign.model.adapters,
+ info.bioinfweb.libralign.model.concatenated,
+ info.bioinfweb.libralign.model.data,
+ info.bioinfweb.libralign.model.events,
+ info.bioinfweb.libralign.model.exception,
+ info.bioinfweb.libralign.model.factory,
+ info.bioinfweb.libralign.model.factory.continuous,
+ info.bioinfweb.libralign.model.implementations,
+ info.bioinfweb.libralign.model.implementations.swingundo,
+ info.bioinfweb.libralign.model.implementations.swingundo.edits,
+ info.bioinfweb.libralign.model.implementations.swingundo.edits.sequence,
+ info.bioinfweb.libralign.model.implementations.swingundo.edits.token,
+ info.bioinfweb.libralign.model.implementations.translation,
+ info.bioinfweb.libralign.model.tokenset,
+ info.bioinfweb.libralign.model.tokenset.continuous,
+ info.bioinfweb.libralign.multiplealignments,
+ info.bioinfweb.libralign.pherogram,
+ info.bioinfweb.libralign.pherogram.distortion,
+ info.bioinfweb.libralign.pherogram.model,
+ info.bioinfweb.libralign.pherogram.provider,
+ info.bioinfweb.libralign.pherogram.view,
+ info.bioinfweb.tic,
+ info.bioinfweb.tic.exception,
+ info.bioinfweb.tic.input,
+ info.bioinfweb.tic.toolkit,
+ info.bioinfweb.tic.toolkit.layoutdata,
+ org.biojava.bibliography,
+ org.biojava.bio,
+ org.biojava.bio.alignment,
+ org.biojava.bio.annodb,
+ org.biojava.bio.chromatogram,
+ org.biojava.bio.chromatogram.graphic,
+ org.biojava.bio.dist,
+ org.biojava.bio.dp,
+ org.biojava.bio.dp.onehead,
+ org.biojava.bio.dp.twohead,
+ org.biojava.bio.molbio,
+ org.biojava.bio.program,
+ org.biojava.bio.program.abi,
+ org.biojava.bio.program.blast2html,
+ org.biojava.bio.program.fastq,
+ org.biojava.bio.program.formats,
+ org.biojava.bio.program.gff,
+ org.biojava.bio.program.gff3,
+ org.biojava.bio.program.hmmer,
+ org.biojava.bio.program.homologene,
+ org.biojava.bio.program.indexdb,
+ org.biojava.bio.program.phred,
+ org.biojava.bio.program.scf,
+ org.biojava.bio.program.ssaha,
+ org.biojava.bio.program.ssbind,
+ org.biojava.bio.program.tagvalue,
+ org.biojava.bio.program.unigene,
+ org.biojava.bio.program.xff,
+ org.biojava.bio.program.xml,
+ org.biojava.bio.proteomics,
+ org.biojava.bio.proteomics.aaindex,
+ org.biojava.bio.search,
+ org.biojava.bio.seq,
+ org.biojava.bio.seq.db,
+ org.biojava.bio.seq.db.biofetch,
+ org.biojava.bio.seq.db.emblcd,
+ org.biojava.bio.seq.db.flat,
+ org.biojava.bio.seq.distributed,
+ org.biojava.bio.seq.filter,
+ org.biojava.bio.seq.homol,
+ org.biojava.bio.seq.impl,
+ org.biojava.bio.seq.io,
+ org.biojava.bio.seq.io.agave,
+ org.biojava.bio.seq.io.filterxml,
+ org.biojava.bio.seq.io.game,
+ org.biojava.bio.seq.io.game12,
+ org.biojava.bio.seq.projection,
+ org.biojava.bio.symbol,
+ org.biojava.bio.taxa,
+ org.biojava.directory,
+ org.biojava.naming,
+ org.biojava.ontology,
+ org.biojava.ontology.io,
+ org.biojava.ontology.obo,
+ org.biojava.stats.svm,
+ org.biojava.stats.svm.tools,
+ org.biojava.utils,
+ org.biojava.utils.automata,
+ org.biojava.utils.cache,
+ org.biojava.utils.candy,
+ org.biojava.utils.io,
+ org.biojava.utils.lsid,
+ org.biojava.utils.math,
+ org.biojava.utils.net,
+ org.biojava.utils.process,
+ org.biojava.utils.regex,
+ org.biojava.utils.stax,
+ org.biojava.utils.walker,
+ org.biojava.utils.xml,
+ org.biojavax,
+ org.biojavax.bio,
+ org.biojavax.bio.alignment,
+ org.biojavax.bio.alignment.blast,
+ org.biojavax.bio.db,
+ org.biojavax.bio.db.ncbi,
+ org.biojavax.bio.seq,
+ org.biojavax.bio.seq.io,
+ org.biojavax.bio.taxa,
+ org.biojavax.bio.taxa.io,
+ org.biojavax.ga,
+ org.biojavax.ga.exception,
+ org.biojavax.ga.functions,
+ org.biojavax.ga.impl,
+ org.biojavax.ga.util,
+ org.biojavax.ontology,
+ org.biojavax.utils,
+ org.jdesktop.swingx.scrollpaneselector
+Bundle-ActivationPolicy: lazy
+Import-Package: javax.swing
+Require-Bundle: org.eclipse.swt
diff --git a/eu.etaxonomy.taxeditor.molecular.lib/build.properties b/eu.etaxonomy.taxeditor.molecular.lib/build.properties
new file mode 100644
index 000000000..97e80af18
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular.lib/build.properties
@@ -0,0 +1,12 @@
+bin.includes = META-INF/,\
+ lib/bioinfweb-commons-bio-2-SNAPSHOT.jar,\
+ lib/bioinfweb-commons-core-2-SNAPSHOT.jar,\
+ lib/bioinfweb-commons-swing-2-SNAPSHOT.jar,\
+ lib/bioinfweb-commons-swt-2-SNAPSHOT.jar,\
+ lib/core-1.9.2-SNAPSHOT.jar,\
+ lib/libralign-biojava1-0-SNAPSHOT.jar,\
+ lib/libralign-core-0-SNAPSHOT.jar,\
+ lib/libralign-swt-0-SNAPSHOT.jar,\
+ lib/sequencing-1.9.2-SNAPSHOT.jar,\
+ lib/tic-core-2-SNAPSHOT.jar,\
+ lib/tic-swt-2-SNAPSHOT.jar
diff --git a/eu.etaxonomy.taxeditor.molecular.lib/lib/.gitignore b/eu.etaxonomy.taxeditor.molecular.lib/lib/.gitignore
new file mode 100644
index 000000000..0557829bf
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular.lib/lib/.gitignore
@@ -0,0 +1 @@
+/*.jar
diff --git a/eu.etaxonomy.taxeditor.molecular.lib/pom.xml b/eu.etaxonomy.taxeditor.molecular.lib/pom.xml
new file mode 100644
index 000000000..2b6e964ae
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular.lib/pom.xml
@@ -0,0 +1,184 @@
+
+ 4.0.0
+ eu.etaxonomy.taxeditor
+ eu.etaxonomy.taxeditor.molecular.lib
+ eclipse-plugin
+
+
+ eu.etaxonomy
+ taxeditor-parent
+ 3.8.0
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+ 2.4
+
+
+ copy-dependencies
+ validate
+
+ copy-dependencies
+
+
+ libralign-swt, libralign-core,
+ bioinfweb-commons-swt, bioinfweb-commons-core,
+ bioinfweb-commons-bio, bioinfweb-commons-swing,
+ tic-core, libralign-biojava1, core, sequencing, tic-swt
+ lib
+ true
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+ 1.7
+
+
+ remove-existing-jars
+ clean
+
+ run
+
+
+
+ Remove all jars
+
+
+
+
+
+
+
+ update-snapshot-jar-names
+ validate
+
+ run
+
+
+
+ Update jars to SNAPSHOT when build with
+ timestamp
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ info.bioinfweb.libralign
+ libralign-core
+ 0-SNAPSHOT
+
+
+ info.bioinfweb.libralign
+ libralign-swt
+ 0-SNAPSHOT
+
+
+ info.bioinfweb.libralign
+ libralign-biojava1
+ 0-SNAPSHOT
+
+
+
+ info.bioinfweb.commons.java
+ bioinfweb-commons-swt
+ 2-SNAPSHOT
+
+
+ info.bioinfweb.commons.java
+ bioinfweb-commons-core
+ 2-SNAPSHOT
+
+
+ info.bioinfweb.commons.java
+ bioinfweb-commons-bio
+ 2-SNAPSHOT
+
+
+ info.bioinfweb.commons.java
+ bioinfweb-commons-swing
+ 2-SNAPSHOT
+
+
+
+ info.bioinfweb.tic
+ tic-core
+ 2-SNAPSHOT
+
+
+ info.bioinfweb.tic
+ tic-swt
+ 2-SNAPSHOT
+
+
+
+ org.biojava
+ core
+ 1.9.2
+
+
+ org.biojava
+ sequencing
+ 1.9.2
+
+
+
+
+
+ bioinfweb-maven-repo
+ bioinfweb repository
+ http://bioinfweb.info/MavenRepository/
+
+
+
+
+
diff --git a/eu.etaxonomy.taxeditor.molecular/.classpath b/eu.etaxonomy.taxeditor.molecular/.classpath
new file mode 100644
index 000000000..f14ba2c2e
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/.classpath
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/eu.etaxonomy.taxeditor.molecular/.gitignore b/eu.etaxonomy.taxeditor.molecular/.gitignore
new file mode 100644
index 000000000..e6066b230
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/.gitignore
@@ -0,0 +1,2 @@
+/target
+.settings/
diff --git a/eu.etaxonomy.taxeditor.molecular/.project b/eu.etaxonomy.taxeditor.molecular/.project
new file mode 100644
index 000000000..3826881f3
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/.project
@@ -0,0 +1,28 @@
+
+
+ eu.etaxonomy.taxeditor.molecular
+ Provides editors, views and operations for handling molecular data and alignments. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.pde.ManifestBuilder
+
+
+
+
+ org.eclipse.pde.SchemaBuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+ org.eclipse.pde.PluginNature
+
+
diff --git a/eu.etaxonomy.taxeditor.molecular/META-INF/MANIFEST.MF b/eu.etaxonomy.taxeditor.molecular/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..84dc5d0bc
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/META-INF/MANIFEST.MF
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Molecular Bundle
+Bundle-SymbolicName: eu.etaxonomy.taxeditor.molecular;singleton:=true
+Bundle-Version: 3.8.0
+Bundle-Activator: eu.etaxonomy.taxeditor.molecular.TaxeditorMolecularPlugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.expressions,
+ org.eclipse.ui.ide,
+ eu.etaxonomy.taxeditor.bulkeditor,
+ eu.etaxonomy.taxeditor.cdmlib,
+ eu.etaxonomy.taxeditor.editor,
+ eu.etaxonomy.taxeditor.store,
+ eu.etaxonomy.taxeditor.molecular.lib
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: EDIT
+Export-Package: eu.etaxonomy.taxeditor.molecular,
+ eu.etaxonomy.taxeditor.molecular.editor,
+ eu.etaxonomy.taxeditor.molecular.handler
+Bundle-ClassPath: .
diff --git a/eu.etaxonomy.taxeditor.molecular/OSGI-INF/l10n/plugin.properties b/eu.etaxonomy.taxeditor.molecular/OSGI-INF/l10n/plugin.properties
new file mode 100644
index 000000000..e2943e3fe
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/OSGI-INF/l10n/plugin.properties
@@ -0,0 +1,164 @@
+#Properties file for taxeditor-editor
+Bundle-Vendor.0 = EDIT
+Bundle-Name.0 = EDIT Taxonomic Editor - Editor Bundle
+command.name.17 = Set Basionym
+command.name.18 = Remove Basionym
+editor.name = Multipage Taxon Editor
+editor.name.0 = Taxon Name Editor
+editor.name.1 = Key
+editor.name.2 = Polytomous Key Graph Editor
+editor.name.3 = Polytomous Key List Editor
+editor.name.4 = Cdm Authority Editor
+editor.name.5 = Derivative View
+view.name = Factual Data
+view.name.0 = Uses
+view.name.1 = Media
+view.name.2 = Concept Relations
+view.name.3 = Concept Graph
+category.name = Taxonomic Editor
+command.label = Reference
+command.label.0 = Name
+command.label.1 = Team
+command.label.2 = Person
+command.label.3 = Specimen
+command.label.4 = Factual Data
+command.label.5 = Media
+command.label.6 = Concept
+command.label.7 = Concept Graph
+command.label.8 = Open Parent
+menu.label = New
+command.label.9 = Heterotypic Synonym
+command.label.10 = Homotypic Synonym
+command.label.11 = Synonym In Homotypical Group
+menu.label.0 = Change To
+command.label.12 = Accepted Taxon
+command.label.13 = Synonym
+command.label.14 = Misapplication
+command.label.15 = Delete
+command.label.16 = Delete All Empty Names
+command.label.17 = Swap Synonym With Accepted
+command.label.18 = Show Details
+command.label.19 = Save
+command.label.20 = New Node
+command.label.21 = Delete
+command.label.22 = Apply Layout
+command.label.23 = New Key Number
+command.label.24 = New Alternative
+command.label.25 = Refresh Nodes
+command.label.26 = Delete
+command.label.27 = New Factual Data
+menu.label.1 = New
+command.label.28 = Move Description to Taxon
+command.label.29 = Move Elements to Taxon
+command.label.30 = Delete
+command.label.31 = Save
+menu.label.2 = New Derivative
+command.label.32 = New Use
+command.label.33 = New Use Summary
+command.label.34 = New Use Record
+command.label.35 = Delete
+command.label.36 = Save
+command.label.37 = New Image Gallery
+command.label.38 = New Image
+command.label.39 = Move Image Up In List
+command.label.40 = Move Image Down In List
+command.label.41 = Delete
+command.label.42 = Save
+menu.label.3 = New
+command.label.43 = Open Related Concept
+command.label.44 = Delete
+command.label.45 = Edit Authorities
+extension.name = Name Commands
+category.name.0 = -- Name Editor
+command.name = Open Parent
+command.name.0 = Create Homotypic Synonym
+command.name.1 = Create Heterotypic Synonym
+command.name.2 = Create Synonym In Homotypical Group
+command.name.3 = Change To Synonym
+command.name.4 = Change To Accepted Taxon
+command.name.5 = Change To Misapplication
+command.name.6 = Swap Synonym With Accepted
+
+command.name.7 = Set Basionym / Original Combination
+command.name.8 = Remove Basionym / Original Combination
+command.name.9 = Delete All Empty Names
+category.name.1 = -- Factual
+command.name.10 = Create Description Element
+command.name.11 = New Description
+command.name.12 = Move Description Elements to Taxon
+command.name.13 = Move Description to Taxon
+category.name.2 = -- New Uses
+command.name.14 = New Use
+command.name.15 = New Use Summary
+command.name.16 = New Use Record
+category.name.3 = -- Media
+command.name.19 = Move Image Down In List
+command.name.20 = New Image Gallery
+command.name.21 = New Image
+command.name.22 = Move Image Up In List
+category.name.4 = -- New Entity
+command.name.23 = New Reference
+command.name.24 = New Name
+command.name.25 = New Team
+command.name.26 = New Person
+command.name.27 = New Specimen
+category.name.5 = -- Polytomous Keys
+command.name.28 = New Child Node
+command.name.29 = New Sibling Node
+command.name.30 = Refresh Node Numbering
+command.name.31 = Apply Layout
+category.name.6 = -- Concept Relations
+command.name.32 = Create Concept Relation
+command.name.33 = Open Related Concept
+category.name.7 = -- Group
+command.name.34 = Edit CDM Authorities
+command.name.35 = Open Derivative View
+scheme.description = The default key binding scheme for the Taxonomic Editor
+scheme.name = Taxonomic Editor Default Key Bindings
+editor.name.6 = Specimen Import Editor
+editor.name.7 = Gbif Import Editor
+editor.name.8 = Checklist Editor
+view.name.4 = Specimen Import
+view.name.5 = GBIF Specimen Import
+command.label.46 = Name
+command.label.47 = Reference
+command.label.48 = Datasource
+command.label.49 = Misapplication
+command.label.50 = Use Existing Image
+command.name.36 = Create Misapplication
+command.name.37 = Use Existing Image
+command.name.38 = Open Checklist Editor
+command.name.39 = New Datasource
+wizard.name = Specimen Search/Import
+wizard.description = Queries data provider for specimens with specified parameters.\nNote: Query results are currently limited to 100.
+command.name.40 = Validation
+view.name.6 = Validation
+marker.field.0 = Object Type
+marker.field.1 = Object
+marker.field.2 = Attribute
+marker.field.3 = Problematic Value
+marker.field.4 = Problem description
+marker.field.5 = Validator
+marker.field.6 = Entity Class
+marker.field.7 = Entity Id
+extension.name.0 = Validation Error
+command.label.51 = Open in Specimen Editor
+command.label.52 = Delete
+command.label.53 = Create Field Unit
+command.label.54 = Delete (with children)
+command.tooltip = Show Only Individuals Associations
+command.label.55 = Open Associated Specimens
+command.name.41 = Show Only Individual Associations
+command.name.42 = Open Taxon Editor
+command.name.43 = Create Field Unit
+command.name.44 = Deep Delete
+command.name.46 = Move Synonym (Homotypical Group) to another Accepted Taxon
+command.label.56 = Move Synonym (Homotypical Group) to another Accepted Taxon
+markerContentGenerator.name = Validation Problems Marker Generator
+command.name.45 = Delete
+command.name.47 = Delete
+commandParameter.name = taxonUUID
+Bundle-Name = Editor Bundle
+command.name.48 = delete
+command.name.49 = delete
+command.name.50 = delete
\ No newline at end of file
diff --git a/eu.etaxonomy.taxeditor.molecular/OSGI-INF/l10n/plugin_de.properties b/eu.etaxonomy.taxeditor.molecular/OSGI-INF/l10n/plugin_de.properties
new file mode 100644
index 000000000..8c098c37d
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/OSGI-INF/l10n/plugin_de.properties
@@ -0,0 +1,156 @@
+# Properties file for taxeditor-editor
+Bundle-Vendor.0 = EDIT
+Bundle-Name.0 = EDIT Taxonomischer Editor - Editor Bundle
+command.name.17 = Setze Basionym
+command.name.18 = Entferne Basionym
+editor.name = Multipage Taxon Editor
+editor.name.0 = Editor Taxonname
+editor.name.1 = Bestimmungsschl\u00fcssel
+editor.name.2 = Polytomer Bestimmungsschl\u00fcssel Graph Editor
+editor.name.3 = Polytomer Bestimmungsschl\u00fcssel List Editor
+editor.name.4 = CDM Rechtemanagement
+editor.name.5 = Ansicht Derivate
+view.name = Faktendaten
+view.name.0 = Nutzung
+view.name.1 = Medien
+view.name.2 = Konzeptrelationen
+view.name.3 = Konzeptgraph
+category.name = Taxonomischer Editor
+command.label = Referenz
+command.label.0 = Name
+command.label.1 = Team
+command.label.2 = Person
+command.label.3 = Beleg
+command.label.4 = Faktendaten
+command.label.5 = Medien
+command.label.6 = Konzeptrelationen
+command.label.7 = Konzeptgraph
+command.label.8 = \u00d6ffne Parent
+menu.label = Neue
+command.label.9 = Heterotypisches Synonym
+command.label.10 = Homotypisches Synonym
+command.label.11 = Synonym in Homotypischer Gruppe
+menu.label.0 = \u00c4ndere zu
+command.label.12 = Akzeptiertes Taxon
+command.label.13 = Synonym
+command.label.14 = Misapplication
+command.label.15 = L\u00f6schen
+command.label.16 = L\u00f6sche alle leeren Namen
+command.label.17 = Tausche Synonym mit akzeptiertem Namen
+command.label.18 = Zeige Details
+command.label.19 = Speichern
+command.label.20 = Neue Knoten
+command.label.21 = L\u00f6schen
+command.label.22 = Wende Layout an
+command.label.23 = Neue Bestimmungsschl\u00fcsselnummer
+command.label.24 = Neue Alternative
+command.label.25 = Erneuere Knoten
+command.label.26 = L\u00f6schen
+command.label.27 = Neue Faktendaten
+menu.label.1 = Neue
+command.label.28 = Verschiebe Eigenschaften zu Taxon
+command.label.29 = Verschiebe Elemente zu Taxon
+command.label.30 = L\u00f6schen
+command.label.31 = Speichern
+menu.label.2 = Neue Derivate
+command.label.32 = Neue Nutzung
+command.label.33 = Neue Zusammenfassung
+command.label.34 = Neuer Nutzungsdatensatz
+command.label.35 = L\u00f6schen
+command.label.36 = Speichern
+command.label.37 = Neue Bildergalerie
+command.label.38 = Neues Bild
+command.label.39 = Bild nach oben
+command.label.40 = Bild nach unten
+command.label.41 = L\u00f6schen
+command.label.42 = Speichern
+menu.label.3 = Neue
+command.label.43 = \u00d6ffne verbundenes Konzept
+command.label.44 = L\u00f6schen
+command.label.45 = Bearbeite Rechte
+extension.name = Namensbefehle
+category.name.0 = -- Namenseditor
+command.name = \u00d6ffne Elter
+command.name.0 = Erstelle homotypisches Synonym
+command.name.1 = Erstelle heterotypisches Synonym
+command.name.2 = Erstelle Synonym in homotypischer Gruppe
+command.name.3 = \u00c4ndere zu Synonym
+command.name.4 = \u00c4ndere zu akzeptiertem Taxon
+command.name.5 = \u00c4ndere zu Misapplication
+command.name.6 = Tausche Synonym mit akzeptiertem Namen
+
+command.name.7 = Setze Basionym / Originalkombination
+command.name.8 = Entferne Basionym / Originalkombination
+command.name.9 = L\u00f6sche alle leeren Namen
+category.name.1 = -- Fakten
+command.name.10 = Erstelle Beschreibungselement
+command.name.11 = Neue Beschreibung
+command.name.12 = Bewege Beschreibungselement zu Taxon
+command.name.13 = Bewege Beschreibung zu Taxon
+category.name.2 = -- Neue Nutzung
+command.name.14 = Neue Nutzung
+command.name.15 = Neue Zusammenfassung
+command.name.16 = Neuer Nutzungsdatensatz
+category.name.3 = -- Media
+command.name.19 = Bewege Bild nach unten
+command.name.20 = Neue Bildergalerie
+command.name.21 = Neues Bild
+command.name.22 = Bewege Bild nach oben
+category.name.4 = -- Neue Entit\u00e4t
+command.name.23 = Neue Referenz
+command.name.24 = Neuer Name
+command.name.25 = Neues Team
+command.name.26 = Neue Person
+command.name.27 = Neuer Beleg
+category.name.5 = -- Polytomer Bestimmungsschl\u00fcssel
+command.name.28 = Neue Kinderknoten
+command.name.29 = Neuer Geschwisterknoten
+command.name.30 = Knotennummerierung aktualisieren
+command.name.31 = Layout anwenden
+category.name.6 = -- Konzeptbeziehungen
+command.name.32 = Erstelle Konzeptrelationen
+command.name.33 = \u00d6ffne verbundenes Konzept
+category.name.7 = -- Gruppe
+command.name.34 = Bearbeite CDM Rechte
+command.name.35 = \u00d6ffne Derivate Ansicht
+scheme.description = Die Standard Tastenkombinationsschema f\u00fcr den Taxonomischen Editor
+scheme.name = Taxonomic Editor Standard Tastenkombinationen
+editor.name.6 = Specimen Import Editor
+editor.name.7 = GBIF Import Editor
+editor.name.8 = Checklist Editor
+view.name.4 = Specimen Import
+view.name.5 = GBIF Specimen Import
+command.label.46 = Name
+command.label.47 = Referenz
+command.label.48 = Datenquelle
+command.label.49 = Misapplication
+command.label.50 = Benutze vorhandenes Bild
+command.name.36 = Erstelle Misapplication
+command.name.37 = Benutze vorhandenes Bild
+command.name.38 = \u00d6ffne Checklist Editor
+command.name.39 = Neue Datenquelle
+wizard.name = Specimen Suche/Import
+wizard.description = Sendet eine Anfrage mit den eingegebenen Parametern an den Datenprovider.\nHinweis: Die Anzahl der Anfrageergebnisse sind auf 100 begrenzt.
+command.name.40 = Validierung
+view.name.6 = Validierung
+marker.field.0 = Objekttyp
+marker.field.1 = Objekt
+marker.field.2 = Attribut
+marker.field.3 = Problematischer Wert
+marker.field.4 = Problembeschreibung
+marker.field.5 = Validierer
+marker.field.6 = Entit�tsklasse
+marker.field.7 = Entit�ts ID
+extension.name.0 = Validierungs-Fehler
+command.label.51 = \u00d6ffne Specimen-Editor
+command.label.52 = L\u00f6schen
+command.label.53 = Neue Field Unit
+command.label.54 = L\u00f6schen (mit Kindern)
+command.tooltip = Nur Individuals Associations anzeigen
+command.label.55 = \u00d6ffne zugeh\u00f6rige Specimens
+command.name.41 = Nur Individuals Associations anzeigen
+command.name.42 = \u00d6ffne Taxon Editor
+command.name.43 = Neue Field Unit
+command.name.44 = L\u00f6schen (mit Kindern)
+command.name.46 = Verschiebe Synonym(Homotypische Gruppe) zu neuem Akzeptierten Taxon
+command.label.56 = Verschiebe Synonym(Homotypische Gruppe) zu neuem Akzeptierten Taxon
\ No newline at end of file
diff --git a/eu.etaxonomy.taxeditor.molecular/OSGI-INF/l10n/plugin_en.properties b/eu.etaxonomy.taxeditor.molecular/OSGI-INF/l10n/plugin_en.properties
new file mode 100644
index 000000000..897175a94
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/OSGI-INF/l10n/plugin_en.properties
@@ -0,0 +1,141 @@
+#Properties file for taxeditor-editor
+Bundle-Vendor.0 = EDIT
+Bundle-Name.0 = EDIT Taxonomic Editor - Editor Bundle
+command.name.17 = Set Basionym
+command.name.18 = Remove Basionym
+editor.name = Multipage Taxon Editor
+editor.name.0 = Taxon Name Editor
+editor.name.1 = Key
+editor.name.2 = Polytomous Key Graph Editor
+editor.name.3 = Polytomous Key List Editor
+editor.name.4 = Cdm Authority Editor
+editor.name.5 = Derivate View
+view.name = Factual Data
+view.name.0 = Uses
+view.name.1 = Media
+view.name.2 = Concept Relations
+view.name.3 = Concept Graph
+category.name = Taxonomic Editor
+command.label = Reference
+command.label.0 = Name
+command.label.1 = Team
+command.label.2 = Person
+command.label.3 = Specimen
+command.label.4 = Factual Data
+command.label.5 = Media
+command.label.6 = Concept
+command.label.7 = Concept Graph
+command.label.8 = Open Parent
+menu.label = New
+command.label.9 = Heterotypic Synonym
+command.label.10 = Homotypic Synonym
+command.label.11 = Synonym In Homotypical Group
+menu.label.0 = Change To
+command.label.12 = Accepted Taxon
+command.label.13 = Synonym
+command.label.14 = Misapplication
+command.label.15 = Delete
+command.label.16 = Delete All Empty Names
+command.label.17 = Swap Synonym With Accepted
+command.label.18 = Show Details
+command.label.19 = Save
+command.label.20 = New Node
+command.label.21 = Delete
+command.label.22 = Apply Layout
+command.label.23 = New Key Number
+command.label.24 = New Alternative
+command.label.25 = Refresh Nodes
+command.label.26 = Delete
+command.label.27 = New Factual Data
+menu.label.1 = New
+command.label.28 = Move Description to Taxon
+command.label.29 = Move Elements to Taxon
+command.label.30 = Delete
+command.label.31 = Save
+menu.label.2 = New Derivate
+command.label.32 = New Use
+command.label.33 = New Use Summary
+command.label.34 = New Use Record
+command.label.35 = Delete
+command.label.36 = Save
+command.label.37 = New Image Gallery
+command.label.38 = New Image
+command.label.39 = Move Image Up In List
+command.label.40 = Move Image Down In List
+command.label.41 = Delete
+command.label.42 = Save
+menu.label.3 = New
+command.label.43 = Open Related Concept
+command.label.44 = Delete
+command.label.45 = Edit Authorities
+extension.name = Name Commands
+category.name.0 = -- Name Editor
+command.name = Open Parent
+command.name.0 = Create Homotypic Synonym
+command.name.1 = Create Heterotypic Synonym
+command.name.2 = Create Synonym In Homotypical Group
+command.name.3 = Change To Synonym
+command.name.4 = Change To Accepted Taxon
+command.name.5 = Change To Misapplication
+command.name.6 = Swap Synonym With Accepted
+command.name.7 = Set Basionym / Original Combination
+command.name.8 = Remove Basionym / Original Combination
+command.name.9 = Delete All Empty Names
+category.name.1 = -- Factual
+command.name.10 = Create Description Element
+command.name.11 = New Description
+command.name.12 = Move Description Elements to Taxon
+command.name.13 = Move Description to Taxon
+category.name.2 = -- New Uses
+command.name.14 = New Use
+command.name.15 = New Use Summary
+command.name.16 = New Use Record
+category.name.3 = -- Media
+command.name.19 = Move Image Down In List
+command.name.20 = New Image Gallery
+command.name.21 = New Image
+command.name.22 = Move Image Up In List
+category.name.4 = -- New Entity
+command.name.23 = New Reference
+command.name.24 = New Name
+command.name.25 = New Team
+command.name.26 = New Person
+command.name.27 = New Specimen
+category.name.5 = -- Polytomous Keys
+command.name.28 = New Child Node
+command.name.29 = New Sibling Node
+command.name.30 = Refresh Node Numbering
+command.name.31 = Apply Layout
+category.name.6 = -- Concept Relations
+command.name.32 = Create Concept Relation
+command.name.33 = Open Related Concept
+category.name.7 = -- Group
+command.name.34 = Edit CDM Authorities
+command.name.35 = Open Derivate View
+scheme.description = The default key binding scheme for the Taxonomic Editor
+scheme.name = Taxonomic Editor Default Key Bindingseditor.name.6 = Specimen Import Editor
+editor.name.7 = Gbif Import Editor
+editor.name.8 = Checklist Editor
+view.name.4 = Specimen Import
+view.name.5 = GBIF Specimen Import
+command.label.46 = Name
+command.label.47 = Reference
+command.label.48 = Datasource
+command.label.49 = Misapplication
+command.label.50 = Use Existing Image
+command.name.36 = Create Misapplication
+command.name.37 = Use Existing Image
+command.name.38 = Open Checklist Editor
+command.name.39 = New Datasource
+wizard.name = Specimen Search/Import
+wizard.description = Queries data provider for specimens with specified parameters.\nNote: Query results are currently limited to 100.
+command.name.40 = Validation
+view.name.6 = Validation
+marker.field.0 = Object Type
+marker.field.1 = Object
+marker.field.2 = Attribute
+marker.field.3 = Problematic Value
+marker.field.4 = Problem description
+marker.field.5 = Validator
+marker.field.6 = Entity Class
+marker.field.7 = Entity Id
\ No newline at end of file
diff --git a/eu.etaxonomy.taxeditor.molecular/build.properties b/eu.etaxonomy.taxeditor.molecular/build.properties
new file mode 100644
index 000000000..bdd1c23c4
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/build.properties
@@ -0,0 +1,6 @@
+bin.includes = .,\
+ META-INF/,\
+ plugin.xml,\
+ icons/,\
+ OSGI-INF/
+source.. = src/main/java/
diff --git a/eu.etaxonomy.taxeditor.molecular/icons/insert-16x16.png b/eu.etaxonomy.taxeditor.molecular/icons/insert-16x16.png
new file mode 100644
index 000000000..6c9bce7ad
Binary files /dev/null and b/eu.etaxonomy.taxeditor.molecular/icons/insert-16x16.png differ
diff --git a/eu.etaxonomy.taxeditor.molecular/icons/overwrite-16x16.png b/eu.etaxonomy.taxeditor.molecular/icons/overwrite-16x16.png
new file mode 100644
index 000000000..d2aa9e2fb
Binary files /dev/null and b/eu.etaxonomy.taxeditor.molecular/icons/overwrite-16x16.png differ
diff --git a/eu.etaxonomy.taxeditor.molecular/icons/pherogram-insert-left-16x16.png b/eu.etaxonomy.taxeditor.molecular/icons/pherogram-insert-left-16x16.png
new file mode 100644
index 000000000..d36e4795a
Binary files /dev/null and b/eu.etaxonomy.taxeditor.molecular/icons/pherogram-insert-left-16x16.png differ
diff --git a/eu.etaxonomy.taxeditor.molecular/icons/pherogram-insert-left-disabled-16x16.png b/eu.etaxonomy.taxeditor.molecular/icons/pherogram-insert-left-disabled-16x16.png
new file mode 100644
index 000000000..b7a23fa81
Binary files /dev/null and b/eu.etaxonomy.taxeditor.molecular/icons/pherogram-insert-left-disabled-16x16.png differ
diff --git a/eu.etaxonomy.taxeditor.molecular/icons/pherogram-insert-right-16x16.png b/eu.etaxonomy.taxeditor.molecular/icons/pherogram-insert-right-16x16.png
new file mode 100644
index 000000000..4d10fb11e
Binary files /dev/null and b/eu.etaxonomy.taxeditor.molecular/icons/pherogram-insert-right-16x16.png differ
diff --git a/eu.etaxonomy.taxeditor.molecular/icons/pherogram-insert-right-disabled-16x16.png b/eu.etaxonomy.taxeditor.molecular/icons/pherogram-insert-right-disabled-16x16.png
new file mode 100644
index 000000000..3f9fa7c98
Binary files /dev/null and b/eu.etaxonomy.taxeditor.molecular/icons/pherogram-insert-right-disabled-16x16.png differ
diff --git a/eu.etaxonomy.taxeditor.molecular/plugin.xml b/eu.etaxonomy.taxeditor.molecular/plugin.xml
new file mode 100644
index 000000000..7b968c499
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/plugin.xml
@@ -0,0 +1,278 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/eu.etaxonomy.taxeditor.molecular/pom.xml b/eu.etaxonomy.taxeditor.molecular/pom.xml
new file mode 100644
index 000000000..4611f55e8
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/pom.xml
@@ -0,0 +1,16 @@
+
+
+
+ eu.etaxonomy
+ taxeditor-parent
+ 3.8.0
+
+
+ 4.0.0
+ eu.etaxonomy.taxeditor.molecular
+ eclipse-plugin
+
+ Molecular Bundle
+ Provides editors, views and operations for handling molecular data and alignments
+
+
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/TaxeditorMolecularPlugin.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/TaxeditorMolecularPlugin.java
new file mode 100644
index 000000000..77818edfd
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/TaxeditorMolecularPlugin.java
@@ -0,0 +1,44 @@
+package eu.etaxonomy.taxeditor.molecular;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class TaxeditorMolecularPlugin extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "eu.etaxonomy.taxeditor.molecular"; //$NON-NLS-1$
+
+ // The shared instance
+ private static TaxeditorMolecularPlugin plugin;
+
+ /**
+ * The constructor
+ */
+ public TaxeditorMolecularPlugin() {
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static TaxeditorMolecularPlugin getDefault() {
+ return plugin;
+ }
+
+}
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/editor/AlignmentEditor.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/editor/AlignmentEditor.java
new file mode 100644
index 000000000..35b0a2df6
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/editor/AlignmentEditor.java
@@ -0,0 +1,738 @@
+// $Id$
+/**
+* Copyright (C) 2014 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.molecular.editor;
+
+
+import info.bioinfweb.libralign.alignmentarea.AlignmentArea;
+import info.bioinfweb.libralign.alignmentarea.selection.SelectionModel;
+import info.bioinfweb.libralign.alignmentarea.tokenpainter.NucleotideTokenPainter;
+import info.bioinfweb.libralign.dataarea.implementations.ConsensusSequenceArea;
+import info.bioinfweb.libralign.dataarea.implementations.SequenceIndexArea;
+import info.bioinfweb.libralign.dataarea.implementations.pherogram.PherogramArea;
+import info.bioinfweb.libralign.editsettings.EditSettingsChangeEvent;
+import info.bioinfweb.libralign.editsettings.EditSettingsListener;
+import info.bioinfweb.libralign.model.AlignmentModel;
+import info.bioinfweb.libralign.model.AlignmentModelChangeListener;
+import info.bioinfweb.libralign.model.AlignmentModelUtils;
+import info.bioinfweb.libralign.model.adapters.StringAdapter;
+import info.bioinfweb.libralign.model.events.SequenceChangeEvent;
+import info.bioinfweb.libralign.model.events.SequenceRenamedEvent;
+import info.bioinfweb.libralign.model.events.TokenChangeEvent;
+import info.bioinfweb.libralign.model.implementations.PackedAlignmentModel;
+import info.bioinfweb.libralign.model.tokenset.CharacterTokenSet;
+import info.bioinfweb.libralign.model.tokenset.TokenSet;
+import info.bioinfweb.libralign.multiplealignments.AlignmentAreaList;
+import info.bioinfweb.libralign.multiplealignments.MultipleAlignmentsContainer;
+import info.bioinfweb.libralign.pherogram.model.PherogramAreaModel;
+import info.bioinfweb.libralign.pherogram.model.ShiftChange;
+import info.bioinfweb.libralign.pherogram.provider.BioJavaPherogramProvider;
+import info.bioinfweb.libralign.pherogram.provider.PherogramProvider;
+import info.bioinfweb.libralign.pherogram.provider.ReverseComplementPherogramProvider;
+import info.bioinfweb.tic.SWTComponentFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.biojava.bio.chromatogram.ChromatogramFactory;
+import org.biojava.bio.chromatogram.UnsupportedChromatogramFormatException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.action.Action;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.part.EditorPart;
+
+import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
+import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
+import eu.etaxonomy.cdm.model.media.MediaUtils;
+import eu.etaxonomy.cdm.model.molecular.Sequence;
+import eu.etaxonomy.cdm.model.molecular.SequenceString;
+import eu.etaxonomy.cdm.model.molecular.SingleRead;
+import eu.etaxonomy.cdm.model.molecular.SingleReadAlignment;
+import eu.etaxonomy.cdm.model.molecular.SingleReadAlignment.Shift;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
+import eu.etaxonomy.taxeditor.molecular.TaxeditorMolecularPlugin;
+import eu.etaxonomy.taxeditor.molecular.handler.ToggleInsertOverwriteHandler;
+import eu.etaxonomy.taxeditor.molecular.handler.ToggleLeftRightInsertionHandler;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateLabelProvider;
+
+
+
+/**
+ * Editor component to edit a contig alignment used to combine different overlapping pherograms from Sanger sequencing to
+ * a consensus sequence.
+ *
+ * The contained GUI components used to edit the alignment come from LibrAlign .
+ *
+ * @author Ben Stöver
+ * @author pplitzner
+ * @date 04.08.2014
+ */
+public class AlignmentEditor extends EditorPart {
+ public static final String ID = "eu.etaxonomy.taxeditor.molecular.AlignmentEditor";
+
+ public static final int READS_AREA_INDEX = 1;
+ public static final int EDITABLE_CONSENSUS_AREA_INDEX = READS_AREA_INDEX + 1;
+ public static final int CONSENSUS_HINT_AREA_INDEX = EDITABLE_CONSENSUS_AREA_INDEX + 1;
+ public static final int PHEROGRAM_AREA_INDEX = 0;
+ public static final int CONSENSUS_DATA_AREA_INDEX = 0;
+ public static final String DEFAULT_READ_NAME_PREFIX = "Read ";
+ public static final String CONSENSUS_NAME = "Consensus";
+
+
+ private final ConversationHolder conversationHolder;
+ private final AlignmentModelChangeListener DIRTY_LISTENER = new AlignmentModelChangeListener() {
+ @Override
+ public void afterTokenChange(TokenChangeEvent e) {
+ setDirty();
+ }
+
+ @Override
+ public void afterSequenceRenamed(SequenceRenamedEvent e) {
+ setDirty();
+ }
+
+ @Override
+ public void afterSequenceChange(SequenceChangeEvent e) {
+ setDirty();
+ }
+
+ @Override
+ public void afterProviderChanged(AlignmentModel oldProvider,
+ AlignmentModel newProvider) { // Not expected.
+
+ setDirty();
+ }
+ };
+
+ private MultipleAlignmentsContainer alignmentsContainer = null;
+ private final Map cdmMap = new TreeMap(); //TODO Move this to ContigSequenceDataProvider
+ private boolean dirty = false;
+
+
+ public AlignmentEditor() {
+ super();
+ conversationHolder = CdmStore.createConversation();
+ //conversationHolder = null;
+ }
+
+
+ private void refreshToolbarElement(String id) {
+ ICommandService commandService =
+ (ICommandService)PlatformUI.getWorkbench().getActiveWorkbenchWindow().getService(ICommandService.class);
+ if (commandService != null) {
+ commandService.refreshElements(id, Collections.EMPTY_MAP);
+ }
+ }
+
+
+ private void registerEditSettingListener(MultipleAlignmentsContainer container) {
+ container.getEditSettings().addListener(new EditSettingsListener() {
+ @Override
+ public void workingModeChanged(EditSettingsChangeEvent e) {} // Currently nothing to do
+
+ @Override
+ public void insertLeftInDataAreaChanged(EditSettingsChangeEvent e) {
+ updateStatusBar();
+ refreshToolbarElement(ToggleLeftRightInsertionHandler.COMMAND_ID);
+ }
+
+ @Override
+ public void insertChanged(EditSettingsChangeEvent e) {
+ updateStatusBar();
+ refreshToolbarElement(ToggleInsertOverwriteHandler.COMMAND_ID);
+ }
+ });
+ }
+
+
+ private AlignmentArea createIndexArea(MultipleAlignmentsContainer container, AlignmentArea labeledArea) {
+ AlignmentArea result = new AlignmentArea(container);
+ result.setAllowVerticalScrolling(false);
+ result.getDataAreas().getTopAreas().add(new SequenceIndexArea(result.getContentArea(), labeledArea));
+ return result;
+ }
+
+
+ private AlignmentArea createEditableAlignmentArea(MultipleAlignmentsContainer container, boolean allowVerticalScrolling) {
+ AlignmentArea result = new AlignmentArea(container);
+ result.setAllowVerticalScrolling(allowVerticalScrolling);
+
+ CharacterTokenSet tokenSet = CharacterTokenSet.newDNAInstance(); //TODO Should NUCLEOTIDE be used instead?
+ AlignmentModel provider = new PackedAlignmentModel(tokenSet);
+ result.setAlignmentModel(provider, false);
+ provider.getChangeListeners().add(DIRTY_LISTENER);
+ result.getPaintSettings().getTokenPainterList().set(0, new NucleotideTokenPainter());
+
+ return result;
+ }
+
+
+ private AlignmentArea createConsensusHintArea(MultipleAlignmentsContainer container,
+ AlignmentArea labeledArea) {
+
+ AlignmentArea result = new AlignmentArea(container);
+ result.setAllowVerticalScrolling(false);
+ result.getDataAreas().getBottomAreas().add(
+ new ConsensusSequenceArea(result.getContentArea(), labeledArea));
+ return result;
+ }
+
+
+ private MultipleAlignmentsContainer getAlignmentsContainer() {
+ if (alignmentsContainer == null) {
+ alignmentsContainer = new MultipleAlignmentsContainer();
+
+ AlignmentAreaList list = alignmentsContainer.getAlignmentAreas();
+ AlignmentArea readsArea = createEditableAlignmentArea(alignmentsContainer, true);
+ list.add(createIndexArea(alignmentsContainer, readsArea));
+ list.add(readsArea); // Make sure READS_AREA_INDEX is correct.
+ list.add(createEditableAlignmentArea(alignmentsContainer, false)); // Make sure COMSENSUS_AREA_INDEX is correct.
+ list.add(createConsensusHintArea(alignmentsContainer, readsArea));
+
+ registerEditSettingListener(alignmentsContainer);
+ }
+ return alignmentsContainer;
+ }
+
+
+ public AlignmentArea getReadsArea() {
+ return getAlignmentsContainer().getAlignmentAreas().get(READS_AREA_INDEX);
+ }
+
+
+ private AlignmentArea getEditableConsensusArea() {
+ return getAlignmentsContainer().getAlignmentAreas().get(EDITABLE_CONSENSUS_AREA_INDEX);
+ }
+
+
+ public boolean hasPherogram(int sequenceID) {
+ return getReadsArea().getDataAreas().getSequenceAreas(sequenceID).size() > PHEROGRAM_AREA_INDEX;
+ }
+
+
+ public PherogramArea getPherogramArea(int sequenceID) {
+ if (hasPherogram(sequenceID)) {
+ return (PherogramArea)getReadsArea().getDataAreas().getSequenceAreas(sequenceID).get(PHEROGRAM_AREA_INDEX);
+ }
+ else {
+ return null;
+ }
+ }
+
+
+ private ConsensusSequenceArea getConsensusHintDataArea() {
+ return (ConsensusSequenceArea)getAlignmentsContainer().getAlignmentAreas().
+ get(CONSENSUS_HINT_AREA_INDEX).getDataAreas().getBottomAreas().
+ get(CONSENSUS_DATA_AREA_INDEX);
+ }
+
+
+ @Deprecated //TODO Remove as soon as testing period is over
+ private void createTestContents() {
+ // Just for testing:
+ try {
+ addRead(new File("D:/Users/BenStoever/ownCloud/Dokumente/Projekte/EDITor/Quelltexte/LibrAlign branch/Repository/eu.etaxonomy.taxeditor.editor/src/main/resources/AlignmentTestData/JR430_JR-P01.ab1").toURI(), false);
+ //addRead(new File("D:/Users/BenStoever/ownCloud/Dokumente/Projekte/EDITor/Quelltexte/LibrAlign branch/Repository/eu.etaxonomy.taxeditor.editor/src/main/resources/AlignmentTestData/JR444_JR-P05.ab1").toURI(), false);
+ addRead(new File("D:/Users/BenStoever/ownCloud/Dokumente/Projekte/EDITor/Quelltexte/LibrAlign branch/Repository/eu.etaxonomy.taxeditor.editor/src/main/resources/AlignmentTestData/Test_qualityScore.scf").toURI(), false);
+
+ // Add test consensus sequence:
+ AlignmentModel consensusModel = getEditableConsensusArea().getAlignmentModel();
+ int id = consensusModel.addSequence(CONSENSUS_NAME);
+ Collection tokens = new ArrayList(); // First save tokens in a collection to avoid GUI updated for each token.
+ tokens.add(consensusModel.getTokenSet().tokenByRepresentation("A"));
+ tokens.add(consensusModel.getTokenSet().tokenByRepresentation("C"));
+ tokens.add(consensusModel.getTokenSet().tokenByRepresentation("G"));
+ tokens.add(consensusModel.getTokenSet().tokenByRepresentation("T"));
+ consensusModel.insertTokensAt(id, 0, tokens);
+ }
+ catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+
+ private void readCDMData(Sequence sequenceNode) {
+ //TODO If called from somewhere else than createPartControl() the editorInput needs to be checked and previous contents need to be cleared (or updated).
+
+ // Add reads:
+ for (SingleReadAlignment singleReadAlignment : sequenceNode.getSingleReadAlignments()) {
+ try {
+ SingleRead pherogramInfo = singleReadAlignment.getSingleRead();
+ URI uri = null;
+ if (pherogramInfo.getPherogram() != null) {
+ uri = MediaUtils.getFirstMediaRepresentationPart(pherogramInfo.getPherogram()).getUri();
+ }
+ int id = addRead(DerivateLabelProvider.getDerivateText(pherogramInfo, conversationHolder),
+ uri,
+ singleReadAlignment.isReverseComplement(),
+ singleReadAlignment.getEditedSequence(),
+ singleReadAlignment.getFirstSeqPosition(),
+ singleReadAlignment.getLeftCutPosition(),
+ singleReadAlignment.getRightCutPosition(),
+ singleReadAlignment.getShifts());
+ cdmMap.put(id, singleReadAlignment);
+ }
+ catch (Exception e) { // Usually due to an error while trying to read the pherogram (e.g. due to an unsupported format or an invalid URI).
+ MessagingUtils.errorDialog("Error", null, "A single read was skipped because of the following error:\n\n" +
+ e.getLocalizedMessage(), TaxeditorMolecularPlugin.PLUGIN_ID, e, false);
+ }
+ }
+
+ // Set consensus sequence:
+ AlignmentModel consensusProvider = getEditableConsensusArea().getAlignmentModel();
+ int id = consensusProvider.addSequence(CONSENSUS_NAME);
+ consensusProvider.insertTokensAt(id, 0, AlignmentModelUtils.charSequenceToTokenList(
+ sequenceNode.getConsensusSequence().getString(), consensusProvider.getTokenSet()));
+ //TODO Can the consensus sequence also be null? / Should it be created here, if nothing is in the DB?
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public void createPartControl(Composite parent) {
+ SWTComponentFactory.getInstance().getSWTComponent(getAlignmentsContainer(), parent, SWT.NONE);
+ updateStatusBar();
+
+ if (getEditorInput() instanceof AlignmentEditorInput) {
+ if (((AlignmentEditorInput)getEditorInput()).getSequenceNodeUuid() != null) {
+ Sequence sequenceNode = CdmStore.getService(ISequenceService.class).load(((AlignmentEditorInput)getEditorInput()).getSequenceNodeUuid());
+ //re-load into the current session if it is already persisted in the DB
+ if(sequenceNode!=null && sequenceNode.getId()!=0){
+ sequenceNode = CdmStore.getService(ISequenceService.class).load(sequenceNode.getUuid());
+ }
+ readCDMData(sequenceNode);
+ }
+ else {
+ createTestContents(); // This case will removed after the test phase and an exception should probably be thrown.
+ }
+ }
+ else {
+ throw new IllegalArgumentException("The editor input must have the type " +
+ AlignmentEditorInput.class.getCanonicalName()); //TODO What should be done here?
+ }
+ }
+
+
+ private void updateStatusBar() {
+ IActionBars bars = getEditorSite().getActionBars();
+ bars.getStatusLineManager().setMessage("Edit mode: " +
+ (getReadsArea().getEditSettings().isInsert() ? "Insert" : "Overwrite") + " " +
+ "Insertion in pherogram: " +
+ (getReadsArea().getEditSettings().isInsertLeftInDataArea() ? "Left" : "Right"));
+ }
+
+
+ private SingleReadAlignment.Shift[] convertToCDMShifts(PherogramAreaModel model) {
+ Iterator iterator = model.shiftChangeIterator();
+ List shifts = new ArrayList();
+ while (iterator.hasNext()) {
+ ShiftChange shiftChange = iterator.next();
+ shifts.add(new SingleReadAlignment.Shift(shiftChange.getBaseCallIndex(), shiftChange.getShiftChange()));
+ }
+ return shifts.toArray(new Shift[]{});
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ if (getEditorInput() instanceof AlignmentEditorInput) {
+ String taskName = "Saving alignment";
+ monitor.beginTask(taskName, 3);
+
+ //re-loading sequence to avoid session conflicts
+ Sequence sequenceNode = CdmStore.getService(ISequenceService.class).load(((AlignmentEditorInput)getEditorInput()).getSequenceNodeUuid());
+ StringAdapter stringProvider = new StringAdapter(getEditableConsensusArea().getAlignmentModel(), false); // Throws an exception if a token has more than one character.
+
+ // Write consensus sequence:
+ SequenceString consensusSequenceObj = sequenceNode.getConsensusSequence();
+ String newConsensusSequence = stringProvider.getSequence(
+ getEditableConsensusArea().getAlignmentModel().sequenceIDByName(CONSENSUS_NAME));
+ if (consensusSequenceObj == null) {
+ sequenceNode.setConsensusSequence(SequenceString.NewInstance(newConsensusSequence));
+ }
+ else {
+ consensusSequenceObj.setString(newConsensusSequence);
+ }
+
+ // Write single reads:
+ stringProvider.setUnderlyingProvider(getReadsArea().getAlignmentModel());
+ sequenceNode.getSingleReadAlignments().retainAll(cdmMap.values()); // Remove all reads that are not in the alignment anymore.
+ Iterator iterator = getReadsArea().getAlignmentModel().sequenceIDIterator();
+ while (iterator.hasNext()) {
+ int id = iterator.next();
+ SingleReadAlignment singleRead = cdmMap.get(id);
+ if (singleRead == null) {
+ throw new InternalError("Creating new reads from AlignmentEditor not implemented.");
+ //TODO Create new read object. => Shall it be allowed to add reads in the alignment editor which are not represented in the CDM tree before the alignment editor is saved?
+ //singleRead = SingleReadAlignment.NewInstance(consensusSequence, singleRead, shifts, editedSequence);
+ }
+
+ singleRead.setEditedSequence(stringProvider.getSequence(id));
+
+ PherogramArea pherogramArea = getPherogramArea(id);
+ if (pherogramArea != null) {
+ PherogramAreaModel model = pherogramArea.getModel();
+ singleRead.setReverseComplement(model.getPherogramProvider() instanceof ReverseComplementPherogramProvider); // Works only if ReverseComplementPherogramProvider instances are not nested.
+ singleRead.setShifts(convertToCDMShifts(getPherogramArea(id).getModel()));
+ singleRead.setFirstSeqPosition(model.getFirstSeqPos());
+ singleRead.setLeftCutPosition(model.getLeftCutPosition());
+ singleRead.setRightCutPosition(model.getRightCutPosition());
+ }
+ }
+
+ if (!conversationHolder.isBound()) {
+ conversationHolder.bind();
+ }
+ monitor.worked(1);
+
+ // Commit the conversation and start a new transaction immediately:
+ conversationHolder.commit(true);
+ monitor.worked(1);
+
+ dirty = false;
+ monitor.worked(1);
+ monitor.done();
+ firePropertyChange(PROP_DIRTY);
+ }
+ else {
+ //TODO Throw exception as soon as testing period which allows unlinked AlignmentEditor is over.
+ }
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.EditorPart#doSaveAs()
+ */
+ @Override
+ public void doSaveAs() {}
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
+ */
+ @Override
+ public void init(IEditorSite site, IEditorInput input) throws PartInitException {
+ setSite(site);
+ setInput(input);
+ System.out.println("AlignmentEditor.init(): " + ActionFactory.COPY.getId());
+ site.getActionBars().setGlobalActionHandler(ActionFactory.COPY.getId(), new Action(ActionFactory.COPY.getId()) {
+ @Override
+ public boolean isEnabled() {
+ System.out.println("isEnabled()");
+ return true;
+ }
+
+ @Override
+ public void run() {
+ System.out.println("run");
+ super.run();
+ }
+ });
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.EditorPart#isDirty()
+ */
+ @Override
+ public boolean isDirty() {
+ return dirty;
+ }
+
+
+ private void setDirty() {
+ dirty = true;
+ firePropertyChange(IEditorPart.PROP_DIRTY);
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
+ */
+ @Override
+ public boolean isSaveAsAllowed() {
+ return false; // "Save as" not allowed.
+ }
+
+
+ @Override
+ public void setFocus() {
+ if(conversationHolder!=null){
+ conversationHolder.bind();
+ }
+ }
+
+
+ public boolean isInsertMode() {
+ return getAlignmentsContainer().getEditSettings().isInsert();
+ }
+
+
+ public boolean isInsertLeftInPherogram() {
+ return getAlignmentsContainer().getEditSettings().isInsertLeftInDataArea();
+ }
+
+
+ public void toggleLeftRightInsertionInPherogram() {
+ getAlignmentsContainer().getEditSettings().toggleInsertLeftInDataArea();
+ }
+
+
+ public void toggleInsertOverwrite() {
+ getAlignmentsContainer().getEditSettings().toggleInsert();
+ }
+
+
+ private String cutPherogram(boolean left) {
+ SelectionModel selection = getReadsArea().getSelection();
+ if (selection.getCursorHeight() != 1) {
+ return "Cutting pherograms is only possible if exactly one row is selected.";
+ }
+ else {
+ PherogramArea pherogramArea =
+ getPherogramArea(getReadsArea().getSequenceOrder().idByIndex(selection.getCursorRow()));
+ if (pherogramArea == null) {
+ return "There is no pherogram attached to the current sequence.";
+ }
+ else {
+ if (left) {
+ if (pherogramArea.setLeftCutPositionBySelection()) {
+ return null;
+ }
+ else {
+ return "The left end of the selection lies outside the pherogram attached to this sequence.";
+ }
+ }
+ else {
+ if (pherogramArea.setRightCutPositionBySelection()) {
+ return null;
+ }
+ else {
+ return "The right end of the selection lies outside the pherogram attached to this sequence.";
+ }
+ }
+ }
+ }
+ }
+
+
+ public String cutPherogramLeft() {
+ return cutPherogram(true);
+ }
+
+
+ public String cutPherogramRight() {
+ return cutPherogram(false);
+ }
+
+
+ public void reverseComplementSelectedSequences() {
+ SelectionModel selection = getReadsArea().getSelection();
+ AlignmentModel> model = getReadsArea().getAlignmentModel();
+ for (int row = selection.getFirstRow(); row < selection.getFirstRow() + selection.getCursorHeight(); row++) {
+ int sequenceID = getReadsArea().getSequenceOrder().idByIndex(row);
+ PherogramArea area = getPherogramArea(sequenceID);
+ PherogramAreaModel pherogramAlignmentModel = area.getModel();
+ AlignmentModelUtils.reverseComplement(model, sequenceID,
+ pherogramAlignmentModel.editableIndexByBaseCallIndex(
+ pherogramAlignmentModel.getLeftCutPosition()).getBeforeValidIndex(),
+ pherogramAlignmentModel.editableIndexByBaseCallIndex(
+ pherogramAlignmentModel.getRightCutPosition()).getAfterValidIndex());
+ pherogramAlignmentModel.reverseComplement();
+ }
+ }
+
+
+ /**
+ * Recreates the whole consensus sequence from all single read sequences. The previous consensus
+ * sequence is overwritte.
+ */
+ @SuppressWarnings("unchecked")
+ public void createConsensusSequence() {
+ ConsensusSequenceArea area = getConsensusHintDataArea();
+ AlignmentModel model = (AlignmentModel)getEditableConsensusArea().getAlignmentModel();
+ int sequenceID = model.sequenceIDIterator().next(); // There is always one sequence contained.
+ int length = getReadsArea().getAlignmentModel().getMaxSequenceLength();
+
+ Collection tokens = new ArrayList(length);
+ for (int column = 0; column < length; column++) {
+ tokens.add(model.getTokenSet().tokenByRepresentation(area.getConsensusToken(column)));
+ }
+
+ model.removeTokensAt(sequenceID, 0, model.getSequenceLength(sequenceID));
+ model.insertTokensAt(sequenceID, 0, tokens);
+ }
+
+
+ /**
+ * Updates the current consensus sequence by replacing gaps by the according consensus tokens
+ * calculated from the single read sequences and extends the consensus sequence if necessary.
+ */
+ @SuppressWarnings("unchecked")
+ public void updateConsensusSequence() {
+ ConsensusSequenceArea area = getConsensusHintDataArea();
+ AlignmentModel model = (AlignmentModel)getEditableConsensusArea().getAlignmentModel();
+ TokenSet tokenSet = model.getTokenSet();
+ int sequenceID = model.sequenceIDIterator().next(); // There is always one sequence contained.
+ int currentConsensusLength = model.getSequenceLength(sequenceID);
+ int overallLength = getReadsArea().getAlignmentModel().getMaxSequenceLength();
+
+ // Replace gaps by new information:
+ for (int column = 0; column < currentConsensusLength; column++) {
+ if (tokenSet.isGapToken(model.getTokenAt(sequenceID, column))) {
+ T newToken = tokenSet.tokenByRepresentation(area.getConsensusToken(column));
+ if (!tokenSet.isGapToken(newToken)) {
+ model.setTokenAt(sequenceID, column, newToken);
+ }
+ }
+ }
+
+ // Append additional tokens:
+ if (overallLength > currentConsensusLength) {
+ Collection tokens = new ArrayList(overallLength);
+ for (int column = currentConsensusLength; column < overallLength; column++) {
+ tokens.add(tokenSet.tokenByRepresentation(area.getConsensusToken(column)));
+ }
+ model.appendTokens(sequenceID, tokens);
+ }
+ }
+
+
+ public static PherogramProvider readPherogram(URI uri) throws IOException, UnsupportedChromatogramFormatException {
+ PherogramProvider result;
+ InputStream stream = uri.toURL().openStream();
+ try {
+ result = new BioJavaPherogramProvider(ChromatogramFactory.create(stream));
+ }
+ finally {
+ stream.close();
+ }
+ return result;
+ }
+
+
+ private String newReadName() {
+ int index = 1;
+ while (getReadsArea().getAlignmentModel().sequenceIDByName(DEFAULT_READ_NAME_PREFIX + index)
+ != AlignmentModel.NO_SEQUENCE_FOUND) {
+
+ index++;
+ }
+ return DEFAULT_READ_NAME_PREFIX + index;
+ }
+
+
+ public void addRead(URI pherogramURI, boolean reverseComplemented) throws IOException, UnsupportedChromatogramFormatException {
+ addRead(newReadName(), pherogramURI, reverseComplemented, null, null, null, null, null);
+ }
+
+
+ /**
+ * Adds a new sequence with attached phergram data area to the reads alignment.
+ *
+ * If {@code null} is specified as {@code editedSequence} the base call sequence from the pherogram will
+ * be set as the edited sequence. If {@code null} is specified as {@code shifts} no shifts between the edited
+ * and the base calls sequence are assumed.
+ *
+ * @param name the name of the new sequence
+ * @param pherogramURI the URI where the associated pherogram file is located
+ * @param reverseComplemented Specify {@code true} here, if the reverse complement of the pherogram data should
+ * be added, {@code false} otherwise.
+ * @param editedSequence the edited version of the base call sequence (May be {@code null}.)
+ * @param shifts the alignment information that links the edited and the base call sequence (May be {@code null}.)
+ * @return the sequence ID of the added read
+ * @throws IOException if an error occurred when trying to read the pherogram file
+ * @throws UnsupportedChromatogramFormatException if the format of the pherogram file is not supported
+ */
+ public int addRead(String name, URI pherogramURI, boolean reverseComplemented, String editedSequence,
+ Integer firstSeqPos, Integer leftCutPos, Integer rightCutPos, SingleReadAlignment.Shift[] shifts)
+ throws IOException, UnsupportedChromatogramFormatException {
+
+ AlignmentModel provider = getReadsArea().getAlignmentModel();
+ PherogramProvider pherogramProvider = null;
+ if (pherogramURI != null) {
+ pherogramProvider = readPherogram(pherogramURI); // Must happen before a sequence is added, because it might throw an exception.
+ if (reverseComplemented) {
+ pherogramProvider = new ReverseComplementPherogramProvider(pherogramProvider);
+ }
+ }
+
+ // Create sequence:
+ provider.addSequence(name);
+ int id = provider.sequenceIDByName(name);
+
+ // Set edited sequence:
+ Collection tokens = null; // First save tokens in a collection to avoid GUI updated for each token.
+ if (editedSequence != null) {
+ tokens = AlignmentModelUtils.charSequenceToTokenList(editedSequence, provider.getTokenSet());
+ }
+ else if (pherogramProvider != null) { // Copy base call sequence into alignment:
+ tokens = new ArrayList();
+ for (int i = 0; i < pherogramProvider.getSequenceLength(); i++) {
+ tokens.add(provider.getTokenSet().tokenByRepresentation(
+ Character.toString(pherogramProvider.getBaseCall(i))));
+ }
+ setDirty();
+ }
+
+ if (tokens != null) { // If either an edited sequence or a pherogram URI was provided.
+ provider.insertTokensAt(id, 0, tokens);
+
+ if (pherogramProvider != null) {
+ // Create pherogram area:
+ PherogramArea pherogramArea = new PherogramArea(getReadsArea().getContentArea(),
+ new PherogramAreaModel(pherogramProvider));
+
+ // Set position properties and shifts:
+ PherogramAreaModel model = pherogramArea.getModel();
+ if ((firstSeqPos != null) && (leftCutPos != null)) {
+ model.setFirstSeqLeftCutPos(firstSeqPos, leftCutPos);
+ }
+ if (rightCutPos != null) {
+ model.setRightCutPosition(rightCutPos);
+ }
+ if ((shifts != null) && (shifts.length > 0)) {
+ for (int i = 0; i < shifts.length; i++) {
+ model.addShiftChange(shifts[i].position, shifts[i].shift);
+ }
+ setDirty();
+ }
+
+ // Add pherogram area to GUI:
+ pherogramArea.addMouseListener(new PherogramMouseListener(pherogramArea));
+ getReadsArea().getDataAreas().getSequenceAreas(id).add(pherogramArea);
+ }
+ }
+ return id;
+ }
+}
\ No newline at end of file
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/editor/AlignmentEditorInput.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/editor/AlignmentEditorInput.java
new file mode 100644
index 000000000..b82362551
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/editor/AlignmentEditorInput.java
@@ -0,0 +1,138 @@
+// $Id$
+/**
+* Copyright (C) 2014 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.molecular.editor;
+
+
+import java.util.UUID;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+
+
+
+/**
+ * @author pplitzner
+ * @author Ben Stöver
+ * @date 04.08.2014
+ */
+public class AlignmentEditorInput implements IEditorInput {
+ private static final String name = "AlignmentEditor";
+
+
+ private final UUID sequenceNodeUuid;
+
+
+ public AlignmentEditorInput(UUID sequenceNodeUuid) {
+ super();
+ this.sequenceNodeUuid = sequenceNodeUuid;
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @Override
+ public Object getAdapter(Class adapter) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#exists()
+ */
+ @Override
+ public boolean exists() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
+ */
+ @Override
+ public ImageDescriptor getImageDescriptor() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getName()
+ */
+ @Override
+ public String getName() {
+ return name;
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getPersistable()
+ */
+ @Override
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getToolTipText()
+ */
+ @Override
+ public String getToolTipText() {
+ return name;
+ }
+
+
+ /**
+ * Returns the {@link UUID} of the sequence CDM node that should be edited by the {@link AlignmentEditor} this object
+ * is used with.
+ *
+ * @return the uuid of the CDM node to work on
+ */
+ public UUID getSequenceNodeUuid() {
+ return sequenceNodeUuid;
+ }
+
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result
+ + ((sequenceNodeUuid == null) ? 0 : sequenceNodeUuid.hashCode());
+ return result;
+ }
+
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ AlignmentEditorInput other = (AlignmentEditorInput) obj;
+ if (sequenceNodeUuid == null) {
+ if (other.sequenceNodeUuid != null) {
+ return false;
+ }
+ } else if (!sequenceNodeUuid.equals(other.sequenceNodeUuid)) {
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/editor/PherogramMouseListener.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/editor/PherogramMouseListener.java
new file mode 100644
index 000000000..71e2c9acd
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/editor/PherogramMouseListener.java
@@ -0,0 +1,56 @@
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.molecular.editor;
+
+
+import info.bioinfweb.libralign.dataarea.implementations.pherogram.PherogramArea;
+import info.bioinfweb.tic.input.TICMouseAdapter;
+import info.bioinfweb.tic.input.TICMouseEvent;
+
+import org.eclipse.ui.PartInitException;
+
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
+import eu.etaxonomy.taxeditor.molecular.TaxeditorMolecularPlugin;
+import eu.etaxonomy.taxeditor.molecular.handler.ShowPherogramHandler;
+
+
+
+/**
+ * Listens to mouse events on data areas displaying a pherogram in {@link AlignmentEditor}.
+ *
+ * @author Ben Stöver
+ * @date 25.11.2014
+ */
+public class PherogramMouseListener extends TICMouseAdapter {
+ private final PherogramArea area;
+
+
+ public PherogramMouseListener(PherogramArea area) {
+ super();
+ this.area = area;
+ }
+
+
+ @Override
+ public boolean mousePressed(TICMouseEvent event) {
+ if (event.getClickCount() == 2) { // Double click
+ try {
+ ShowPherogramHandler.showPherogram(area.getModel());
+ }
+ catch (PartInitException e) {
+ MessagingUtils.errorDialog("Unable to create pherogram view", null, e.getLocalizedMessage(),
+ TaxeditorMolecularPlugin.PLUGIN_ID, e, false); //TODO set pluginID
+ }
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+}
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/editor/PherogramViewPart.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/editor/PherogramViewPart.java
new file mode 100644
index 000000000..40c04705f
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/editor/PherogramViewPart.java
@@ -0,0 +1,68 @@
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.molecular.editor;
+
+
+import info.bioinfweb.libralign.pherogram.PherogramFormats.QualityOutputType;
+import info.bioinfweb.libralign.pherogram.model.PherogramComponentModel;
+import info.bioinfweb.libralign.pherogram.view.PherogramView;
+import info.bioinfweb.tic.SWTComponentFactory;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.ViewPart;
+
+
+
+/**
+ * Component that allows to view a pherogram without the distortion due to aligning it to a sequence as in
+ * {@link AlignmentEditor}.
+ *
+ * @author Ben Stöver
+ * @date Nov 20, 2014
+ */
+public class PherogramViewPart extends ViewPart {
+ public static final String ID = "eu.etaxonomy.taxeditor.molecular.PherogramView";
+
+ private PherogramView pherogramView = null;
+
+
+ public static PherogramViewPart createView(PherogramComponentModel model) throws PartInitException {
+ PherogramViewPart view = (PherogramViewPart)PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(ID);
+ view.getPherogramView().getTraceCurveView().setModel(model);
+ view.getPherogramView().assignSize();
+ return view;
+ }
+
+
+ public PherogramView getPherogramView() {
+ if (pherogramView == null) {
+ pherogramView = new PherogramView();
+ pherogramView.getTraceCurveView().getFormats().setShowProbabilityValues(true);
+ pherogramView.getTraceCurveView().setHorizontalScale(1);
+ pherogramView.getTraceCurveView().setVerticalScale(100);
+ pherogramView.getTraceCurveView().getFormats().setQualityOutputType(QualityOutputType.NONE); //TODO Make this user defined
+ pherogramView.getTraceCurveView().getFormats().setShowProbabilityValues(false);
+ }
+ return pherogramView;
+ }
+
+
+ @Override
+ public void createPartControl(Composite parent) {
+ SWTComponentFactory.getInstance().getSWTComponent(getPherogramView(), parent, SWT.NONE);
+ getPherogramView().assignSize();
+ }
+
+
+ @Override
+ public void setFocus() {} // nothing to do
+}
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/AbstractAlignmentEditorHandler.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/AbstractAlignmentEditorHandler.java
new file mode 100644
index 000000000..0c8a6edb1
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/AbstractAlignmentEditorHandler.java
@@ -0,0 +1,43 @@
+// $Id$
+/**
+* Copyright (C) 2015 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.molecular.handler;
+
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.ui.IEditorPart;
+
+import eu.etaxonomy.taxeditor.model.AbstractUtility;
+import eu.etaxonomy.taxeditor.molecular.editor.AlignmentEditor;
+
+
+
+
+/**
+ * Abstract implementation for all handlers triggering actions in an active instance of
+ * {@link AlignmentEditor}.
+ *
+ * @author Ben Stöver
+ * @date 19.06.2015
+ */
+public abstract class AbstractAlignmentEditorHandler extends AbstractHandler {
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IEditorPart activeEditor = AbstractUtility.getActiveEditor();
+ if (activeEditor instanceof AlignmentEditor) {
+ doExecute(event, (AlignmentEditor)activeEditor);
+ }
+ return null;
+ }
+
+
+ public abstract void doExecute(ExecutionEvent event, AlignmentEditor editor) throws ExecutionException;
+}
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/AbstractPherogramComponentHandler.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/AbstractPherogramComponentHandler.java
new file mode 100644
index 000000000..55c24e32a
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/AbstractPherogramComponentHandler.java
@@ -0,0 +1,60 @@
+// $Id$
+/**
+* Copyright (C) 2015 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.molecular.handler;
+
+
+import info.bioinfweb.libralign.alignmentarea.AlignmentArea;
+import info.bioinfweb.libralign.dataarea.implementations.pherogram.PherogramArea;
+import info.bioinfweb.libralign.pherogram.PherogramComponent;
+
+import java.util.Iterator;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.ui.IWorkbenchPart;
+
+import eu.etaxonomy.taxeditor.model.AbstractUtility;
+import eu.etaxonomy.taxeditor.molecular.editor.AlignmentEditor;
+import eu.etaxonomy.taxeditor.molecular.editor.PherogramViewPart;
+
+
+
+/**
+ * Abstract handler implementation allows to performs the concrete operation either on an instance of
+ * {@link PherogramViewPart} or all {@link AlignmentArea}s inside an instance of {@link AlignmentEditor}.
+ *
+ * @author Ben Stöver
+ * @date 23.06.2015
+ */
+public abstract class AbstractPherogramComponentHandler extends AbstractHandler {
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IWorkbenchPart activePart = AbstractUtility.getActivePart();
+
+ if (activePart instanceof AlignmentEditor) {
+ AlignmentEditor editor = (AlignmentEditor)activePart;
+ Iterator idIterator = editor.getReadsArea().getAlignmentModel().sequenceIDIterator();
+ while (idIterator.hasNext()) {
+ PherogramArea area = editor.getPherogramArea(idIterator.next());
+ if (area != null) {
+ doExecute(event, area);
+ }
+ }
+ }
+ else if (activePart instanceof PherogramViewPart) {
+ doExecute(event, ((PherogramViewPart)activePart).getPherogramView().getTraceCurveView());
+ }
+ return null;
+ }
+
+
+ public abstract void doExecute(ExecutionEvent event, PherogramComponent component) throws ExecutionException;
+}
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/ChangePherogramQualityOutputType.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/ChangePherogramQualityOutputType.java
new file mode 100644
index 000000000..a5fba9470
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/ChangePherogramQualityOutputType.java
@@ -0,0 +1,31 @@
+// $Id$
+/**
+* Copyright (C) 2015 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.molecular.handler;
+
+
+import info.bioinfweb.libralign.pherogram.PherogramComponent;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+
+
+/**
+ * Switches between the quality output types available for components displaying pherograms.
+ *
+ * @author Ben Stöver
+ * @date 19.06.2015
+ */
+public class ChangePherogramQualityOutputType extends AbstractPherogramComponentHandler {
+ @Override
+ public void doExecute(ExecutionEvent event, PherogramComponent component) throws ExecutionException {
+ component.getFormats().changeQualityOutputType();
+ }
+}
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/CreateConsensusSequenceHandler.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/CreateConsensusSequenceHandler.java
new file mode 100644
index 000000000..a95de504b
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/CreateConsensusSequenceHandler.java
@@ -0,0 +1,34 @@
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.molecular.handler;
+
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import eu.etaxonomy.taxeditor.molecular.editor.AlignmentEditor;
+
+
+
+
+/**
+ * Handler that creates the consensus sequence from all single read sequences in the active instance
+ * of {@link AlignmentEditor}. A previously present consensus sequence will be overwritten.
+ *
+ * @author Ben Stöver
+ * @date 19.06.2015
+ * @see UpdateConsensusSequenceHandler
+ * @see AlignmentEditor#createConsensusSequence()
+ */
+public class CreateConsensusSequenceHandler extends AbstractAlignmentEditorHandler {
+ @Override
+ public void doExecute(ExecutionEvent event, AlignmentEditor editor) throws ExecutionException {
+ editor.createConsensusSequence();
+ }
+}
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/CutPherogramLeftHandler.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/CutPherogramLeftHandler.java
new file mode 100644
index 000000000..955dbae08
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/CutPherogramLeftHandler.java
@@ -0,0 +1,37 @@
+// $Id$
+/**
+* Copyright (C) 2015 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.molecular.handler;
+
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
+import eu.etaxonomy.taxeditor.molecular.TaxeditorMolecularPlugin;
+import eu.etaxonomy.taxeditor.molecular.editor.AlignmentEditor;
+
+
+
+/**
+ * Handler that cuts the base call sequence of a pherogram attached to the current sequence on the left
+ * of the current selection or cursor position.
+ *
+ * @author Ben Stöver
+ * @date 15.06.2015
+ */
+public class CutPherogramLeftHandler extends AbstractAlignmentEditorHandler {
+ @Override
+ public void doExecute(ExecutionEvent event, AlignmentEditor editor) throws ExecutionException {
+ String errorMessage = editor.cutPherogramLeft();
+ if (errorMessage != null) {
+ MessagingUtils.errorDialog("Unable to cut base call sequence", this, errorMessage, TaxeditorMolecularPlugin.PLUGIN_ID, null, false);
+ }
+ }
+}
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/CutPherogramRightHandler.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/CutPherogramRightHandler.java
new file mode 100644
index 000000000..dd8bc90eb
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/CutPherogramRightHandler.java
@@ -0,0 +1,37 @@
+// $Id$
+/**
+* Copyright (C) 2015 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.molecular.handler;
+
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
+import eu.etaxonomy.taxeditor.molecular.TaxeditorMolecularPlugin;
+import eu.etaxonomy.taxeditor.molecular.editor.AlignmentEditor;
+
+
+
+/**
+ * Handler that cuts the base call sequence of a pherogram attached to the current sequence on the right
+ * of the current selection or cursor position.
+ *
+ * @author BenStoever
+ * @date 15.06.2015
+ */
+public class CutPherogramRightHandler extends AbstractAlignmentEditorHandler {
+ @Override
+ public void doExecute(ExecutionEvent event, AlignmentEditor editor) throws ExecutionException {
+ String errorMessage = editor.cutPherogramRight();
+ if (errorMessage != null) {
+ MessagingUtils.errorDialog("Unable to cut base call sequence", this, errorMessage, TaxeditorMolecularPlugin.PLUGIN_ID, null, false);
+ }
+ }
+}
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/EditSequenceHandler.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/EditSequenceHandler.java
new file mode 100644
index 000000000..69597f13d
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/EditSequenceHandler.java
@@ -0,0 +1,46 @@
+package eu.etaxonomy.taxeditor.molecular.handler;
+
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.TreeNode;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+import eu.etaxonomy.cdm.model.molecular.Sequence;
+import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.molecular.TaxeditorMolecularPlugin;
+import eu.etaxonomy.taxeditor.molecular.editor.AlignmentEditor;
+import eu.etaxonomy.taxeditor.molecular.editor.AlignmentEditorInput;
+
+
+
+/**
+ * Opens the alignment editor from the CDM tree.
+ *
+ * @author Ben Stöver
+ * @author pplitzner
+ */
+public class EditSequenceHandler extends AbstractHandler {
+
+ org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(EditSequenceHandler.class);
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ISelection currentSelection = HandlerUtil.getCurrentSelection(event);
+ TreeNode treeNodeOfSelection = EditorUtil.getTreeNodeOfSelection(currentSelection);
+ if(treeNodeOfSelection != null && treeNodeOfSelection.getValue() instanceof Sequence){
+ AlignmentEditorInput input = new AlignmentEditorInput(((Sequence)treeNodeOfSelection.getValue()).getUuid()); //TODO Should there always be a new instance created here? What if the specified CDM node is already opened in an AlignmentEditor? => Possible create Singleton that keeps instances by sequence objects in a map.
+ try {
+ TaxeditorMolecularPlugin.getDefault().getWorkbench()
+ .getActiveWorkbenchWindow().getActivePage().openEditor(input, AlignmentEditor.ID);
+ }
+ catch (PartInitException e) {
+ logger.error("Could not open AlignmentEditor", e);
+ }
+ }
+ return null;
+ }
+}
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/HandlerTools.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/HandlerTools.java
new file mode 100644
index 000000000..11d92e690
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/HandlerTools.java
@@ -0,0 +1,40 @@
+// $Id$
+/**
+* Copyright (C) 2015 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.molecular.handler;
+
+
+import java.net.URL;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.resource.ImageDescriptor;
+
+import eu.etaxonomy.taxeditor.molecular.TaxeditorMolecularPlugin;
+
+
+
+/**
+ * Implements shared functionality for handler implementations using tool bar icons.
+ *
+ * @author Ben Stöver
+ * @date 15.06.2015
+ */
+public class HandlerTools { //TODO Move this class or method somewhere else?
+ public static ImageDescriptor createImageDescriptor(String iconName) {
+ URL url = FileLocator.find(TaxeditorMolecularPlugin.getDefault().getBundle(),
+ new Path("icons/" + iconName), null);
+ if (url != null) {
+ return ImageDescriptor.createFromURL(url);
+ }
+ else {
+ throw new InternalError("Icon \"" + iconName + "\" could not be loaded."); //TODO Throw other type of exception?
+ }
+ }
+}
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/LoadPherogramHandler.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/LoadPherogramHandler.java
new file mode 100644
index 000000000..97e1b972e
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/LoadPherogramHandler.java
@@ -0,0 +1,70 @@
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.molecular.handler;
+
+
+import java.io.File;
+import java.io.IOException;
+
+import org.biojava.bio.chromatogram.UnsupportedChromatogramFormatException;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.ui.IEditorPart;
+
+import eu.etaxonomy.taxeditor.model.AbstractUtility;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
+import eu.etaxonomy.taxeditor.molecular.TaxeditorMolecularPlugin;
+import eu.etaxonomy.taxeditor.molecular.editor.AlignmentEditor;
+
+
+
+/**
+ * Handler that loads an additional read into the contig alignment displayed by an instance of {@link AlignmentEditor}.
+ *
+ * @author Ben Stöver
+ * @author pplitzner
+ */
+public class LoadPherogramHandler extends AbstractHandler {
+ //TODO Change so that also URIs which do not point to files can be specified.
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IEditorPart activeEditor = AbstractUtility.getActiveEditor();
+ if (activeEditor instanceof AlignmentEditor) {
+ AlignmentEditor alignmentEditor = (AlignmentEditor)activeEditor;
+
+ FileDialog fileDialog = new FileDialog(alignmentEditor.getSite().getShell());
+ fileDialog.setText("Import pherogram into contig alignment");
+ fileDialog.setFilterNames(new String[]{"All supported formats", "AB1 pherogram files", "SCF pherogram files", "All files"});
+ fileDialog.setFilterExtensions(new String[]{"*.ab1;*.scf", "*.ab1", "*.scf", "*.*"});
+
+ String path = fileDialog.open();
+ if (path != null) {
+ try {
+ alignmentEditor.addRead(new File(path).toURI(), false);
+ }
+ catch (UnsupportedChromatogramFormatException e) {
+ MessagingUtils.errorDialog("Unsupported format", this, "The format of the pherogram file \"" + path +
+ "\" is not supported. (Only AB1 and SCF are supported.)", TaxeditorMolecularPlugin.PLUGIN_ID, e, false); //TODO set pluginID
+ }
+ catch (IOException e) {
+ MessagingUtils.errorDialog("Unsupported format", this,
+ "An IO error occurred while trying to read the file \"" + path + "\".",
+ TaxeditorMolecularPlugin.PLUGIN_ID, e, false); //TODO set pluginID
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/ReverseComplementHandler.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/ReverseComplementHandler.java
new file mode 100644
index 000000000..99e738828
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/ReverseComplementHandler.java
@@ -0,0 +1,31 @@
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.molecular.handler;
+
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import eu.etaxonomy.taxeditor.molecular.editor.AlignmentEditor;
+
+
+
+
+/**
+ * Reverse complements the single read sequence in an active {@link AlignmentEditor}, where the alignment cursor
+ * is currently located.
+ *
+ * @author Ben Stöver
+ */
+public class ReverseComplementHandler extends AbstractAlignmentEditorHandler {
+ @Override
+ public void doExecute(ExecutionEvent event, AlignmentEditor editor) throws ExecutionException {
+ editor.reverseComplementSelectedSequences();
+ }
+}
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/ShowPherogramHandler.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/ShowPherogramHandler.java
new file mode 100644
index 000000000..f4c658084
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/ShowPherogramHandler.java
@@ -0,0 +1,66 @@
+package eu.etaxonomy.taxeditor.molecular.handler;
+
+
+import info.bioinfweb.libralign.pherogram.model.PherogramComponentModel;
+
+import java.net.URI;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.TreeNode;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+import eu.etaxonomy.cdm.model.media.MediaUtils;
+import eu.etaxonomy.cdm.model.molecular.SingleRead;
+import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
+import eu.etaxonomy.taxeditor.molecular.TaxeditorMolecularPlugin;
+import eu.etaxonomy.taxeditor.molecular.editor.AlignmentEditor;
+import eu.etaxonomy.taxeditor.molecular.editor.PherogramViewPart;
+
+
+
+/**
+ * Displays an undistorted pherogram with {@link PherogramViewPart}.
+ *
+ * @author Ben Stöver
+ *
+ */
+public class ShowPherogramHandler extends AbstractHandler {
+ public static void showPherogram(PherogramComponentModel model) throws PartInitException {
+ PherogramViewPart.createView(model);
+ }
+
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ISelection currentSelection = HandlerUtil.getCurrentSelection(event);
+ TreeNode treeNodeOfSelection = EditorUtil.getTreeNodeOfSelection(currentSelection);
+ if (treeNodeOfSelection != null && treeNodeOfSelection.getValue() instanceof SingleRead) {
+ //TODO Can the parent node (containing the cut positions) be extracted from SingleRead?
+ try {
+ SingleRead singleRead = (SingleRead)treeNodeOfSelection.getValue();
+ URI uri = null;
+ if (singleRead.getPherogram() != null) { // Pherogram objects without URI are possible.
+ uri = MediaUtils.getFirstMediaRepresentationPart(singleRead.getPherogram()).getUri();
+ }
+
+ if (uri == null) {
+ MessagingUtils.messageDialog("No pherogram available", this,
+ "The selected read does not have an associated pherogram.");
+ }
+ else {
+ showPherogram(new PherogramComponentModel(AlignmentEditor.readPherogram(uri)));
+ }
+ }
+ catch (Exception e) {
+ MessagingUtils.errorDialog("Error", null, e.getLocalizedMessage(), TaxeditorMolecularPlugin.PLUGIN_ID,
+ e, false);
+ }
+ }
+ return null;
+ }
+}
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/ToggleInsertOverwriteHandler.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/ToggleInsertOverwriteHandler.java
new file mode 100644
index 000000000..e94a290c2
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/ToggleInsertOverwriteHandler.java
@@ -0,0 +1,68 @@
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+
+package eu.etaxonomy.taxeditor.molecular.handler;
+
+
+import java.util.Map;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.commands.IElementUpdater;
+import org.eclipse.ui.menus.UIElement;
+
+import eu.etaxonomy.taxeditor.model.AbstractUtility;
+import eu.etaxonomy.taxeditor.molecular.editor.AlignmentEditor;
+
+
+
+/**
+ * Switches an {@link AlignmentEditor} between insertion and overwrite mode.
+ *
+ * @author Ben Stöver
+ * @date 04.12.2014
+ */
+public class ToggleInsertOverwriteHandler extends AbstractAlignmentEditorHandler implements IElementUpdater {
+ public static final String COMMAND_ID =
+ "eu.etaxonomy.taxeditor.molecular.AlignmentEditor.toggleInsertOverwrite";
+
+
+ private final ImageDescriptor INSERT_DESCRIPTOR = HandlerTools.createImageDescriptor("insert-16x16.png");
+ private final ImageDescriptor OVERWRITE_DESCRIPTOR = HandlerTools.createImageDescriptor("overwrite-16x16.png");
+
+
+ @Override
+ public void doExecute(ExecutionEvent event, AlignmentEditor editor) throws ExecutionException {
+ editor.toggleInsertOverwrite();
+ }
+
+
+ @Override
+ public void updateElement(UIElement element, @SuppressWarnings("rawtypes") Map parameters) {
+ IEditorPart activeEditor = AbstractUtility.getActiveEditor();
+ if (activeEditor instanceof AlignmentEditor) {
+ if (((AlignmentEditor)activeEditor).isInsertMode()) {
+ element.setIcon(INSERT_DESCRIPTOR);
+ element.setText("INS");
+ element.setTooltip("Click to switch to overwrite mode");
+ }
+ else {
+ element.setIcon(OVERWRITE_DESCRIPTOR);
+ element.setText("OVR");
+ element.setTooltip("Click to switch to insertion mode");
+ }
+ ((ICommandService)PlatformUI.getWorkbench().getService(ICommandService.class)).refreshElements(
+ ToggleLeftRightInsertionHandler.COMMAND_ID, null);
+ }
+ }
+}
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/ToggleLeftRightInsertionHandler.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/ToggleLeftRightInsertionHandler.java
new file mode 100644
index 000000000..291e72c7e
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/ToggleLeftRightInsertionHandler.java
@@ -0,0 +1,72 @@
+/**
+ * Copyright (C) 2007 EDIT
+ * European Distributed Institute of Taxonomy
+ * http://www.e-taxonomy.eu
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * See LICENSE.TXT at the top of this package for the full license terms.
+ */
+
+package eu.etaxonomy.taxeditor.molecular.handler;
+
+import java.util.Map;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.commands.IElementUpdater;
+import org.eclipse.ui.menus.UIElement;
+
+import eu.etaxonomy.taxeditor.model.AbstractUtility;
+import eu.etaxonomy.taxeditor.molecular.editor.AlignmentEditor;
+
+
+
+/**
+ * Switches an {@link AlignmentEditor} between insertion in the base sequence to
+ * the left or to the right.
+ *
+ * @author Ben Stöver
+ * @date 04.12.2014
+ */
+public class ToggleLeftRightInsertionHandler extends AbstractAlignmentEditorHandler implements IElementUpdater {
+ public static final String COMMAND_ID = "eu.etaxonomy.taxeditor.molecular.AlignmentEditor.toggleLeftRightInsertion";
+
+
+ private final ImageDescriptor INSERT_LEFT_DESCRIPTOR =
+ HandlerTools.createImageDescriptor("pherogram-insert-left-16x16.png");
+ private final ImageDescriptor INSERT_RIGHT_DESCRIPTOR =
+ HandlerTools.createImageDescriptor("pherogram-insert-right-16x16.png");
+ private final ImageDescriptor INSERT_LEFT_DISABLED_DESCRIPTOR =
+ HandlerTools.createImageDescriptor("pherogram-insert-left-disabled-16x16.png");
+ private final ImageDescriptor INSERT_RIGHT_DISABLED_DESCRIPTOR =
+ HandlerTools.createImageDescriptor("pherogram-insert-right-disabled-16x16.png");
+
+
+ @Override
+ public void doExecute(ExecutionEvent event, AlignmentEditor editor) throws ExecutionException {
+ editor.toggleLeftRightInsertionInPherogram();
+ }
+
+
+ @Override
+ public void updateElement(UIElement element, @SuppressWarnings("rawtypes") Map parameters) {
+ IEditorPart activeEditor = AbstractUtility.getActiveEditor();
+ if (activeEditor instanceof AlignmentEditor) {
+ setBaseEnabled(((AlignmentEditor)activeEditor).isInsertMode());
+ if (((AlignmentEditor)activeEditor).isInsertLeftInPherogram()) {
+ element.setIcon(INSERT_LEFT_DESCRIPTOR);
+ element.setDisabledIcon(INSERT_LEFT_DISABLED_DESCRIPTOR);
+ element.setText("Left");
+ element.setTooltip("Switch to insert pherogram distorsions right of future edits.");
+ }
+ else {
+ element.setIcon(INSERT_RIGHT_DESCRIPTOR);
+ element.setDisabledIcon(INSERT_RIGHT_DISABLED_DESCRIPTOR);
+ element.setText("Right");
+ element.setTooltip("Switch to insert pherogram distorsions left of future edits.");
+ }
+ }
+ }
+}
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/ToggleShowPherogramBaseCallLinesHandler.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/ToggleShowPherogramBaseCallLinesHandler.java
new file mode 100644
index 000000000..c8663eb18
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/ToggleShowPherogramBaseCallLinesHandler.java
@@ -0,0 +1,30 @@
+// $Id$
+/**
+* Copyright (C) 2015 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.molecular.handler;
+
+
+import info.bioinfweb.libralign.pherogram.PherogramComponent;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+
+
+/**
+ * @author BenStoever
+ * @date 23.06.2015
+ *
+ */
+public class ToggleShowPherogramBaseCallLinesHandler extends AbstractPherogramComponentHandler {
+ @Override
+ public void doExecute(ExecutionEvent event, PherogramComponent component) throws ExecutionException {
+ component.getFormats().toggleShowBaseCallLines();
+ }
+}
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/ToggleShowPherogramProbabilitiesHandler.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/ToggleShowPherogramProbabilitiesHandler.java
new file mode 100644
index 000000000..50d45d6ce
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/ToggleShowPherogramProbabilitiesHandler.java
@@ -0,0 +1,36 @@
+// $Id$
+/**
+* Copyright (C) 2015 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.molecular.handler;
+
+
+import info.bioinfweb.libralign.pherogram.PherogramComponent;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import eu.etaxonomy.taxeditor.molecular.editor.AlignmentEditor;
+import eu.etaxonomy.taxeditor.molecular.editor.PherogramViewPart;
+
+
+
+
+/**
+ * Toggles whether probability values (substitution, overcall and undercall) should be displayed
+ * in pherogram areas of {@link AlignmentEditor} or {@link PherogramViewPart}.
+ *
+ * @author Ben Stöver
+ * @date 23.06.2015
+ */
+public class ToggleShowPherogramProbabilitiesHandler extends AbstractPherogramComponentHandler {
+ @Override
+ public void doExecute(ExecutionEvent event, PherogramComponent component) throws ExecutionException {
+ component.getFormats().toggleShowProbabilityValues();
+ }
+}
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/UpdateConsensusSequenceHandler.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/UpdateConsensusSequenceHandler.java
new file mode 100644
index 000000000..50cc1b13e
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/UpdateConsensusSequenceHandler.java
@@ -0,0 +1,25 @@
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.molecular.handler;
+
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import eu.etaxonomy.taxeditor.molecular.editor.AlignmentEditor;
+
+
+
+
+public class UpdateConsensusSequenceHandler extends AbstractAlignmentEditorHandler {
+ @Override
+ public void doExecute(ExecutionEvent event, AlignmentEditor editor) throws ExecutionException {
+ editor.updateConsensusSequence();
+ }
+}
diff --git a/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/package-info.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/package-info.java
new file mode 100644
index 000000000..64bc123c3
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/package-info.java
@@ -0,0 +1,17 @@
+// $Id$
+/**
+ * Copyright (C) 2015 EDIT
+ * European Distributed Institute of Taxonomy
+ * http://www.e-taxonomy.eu
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * See LICENSE.TXT at the top of this package for the full license terms.
+ */
+/**
+ * Contains handlers that trigger actions in an active instance of
+ * {@link main.java.eu.etaxonomy.taxeditor.molecular.editor.AlignmentEditor}. Handlers opening
+ * an alignment editor or pherogram view are not contained in here.
+ *
+ * @author Ben Stöver
+ */
+package eu.etaxonomy.taxeditor.molecular.handler;
\ No newline at end of file
diff --git a/eu.etaxonomy.taxeditor.navigation/META-INF/MANIFEST.MF b/eu.etaxonomy.taxeditor.navigation/META-INF/MANIFEST.MF
index ef370db72..5dce9d76a 100644
--- a/eu.etaxonomy.taxeditor.navigation/META-INF/MANIFEST.MF
+++ b/eu.etaxonomy.taxeditor.navigation/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Navigation Bundle
Bundle-SymbolicName: eu.etaxonomy.taxeditor.navigation;singleton:=true
-Bundle-Version: 3.7.1
+Bundle-Version: 3.8.0
Bundle-Vendor: EDIT
Export-Package: eu.etaxonomy.cdm,
eu.etaxonomy.taxeditor.navigation,
diff --git a/eu.etaxonomy.taxeditor.navigation/plugin.xml b/eu.etaxonomy.taxeditor.navigation/plugin.xml
index 86609245a..9d828fb45 100644
--- a/eu.etaxonomy.taxeditor.navigation/plugin.xml
+++ b/eu.etaxonomy.taxeditor.navigation/plugin.xml
@@ -87,6 +87,15 @@
commandId="eu.etaxonomy.taxeditor.navigation.command.create.taxonNode"
label="%command.label.2"
style="push">
+
+
+
+
+
+
+
+
+
+
diff --git a/eu.etaxonomy.taxeditor.navigation/pom.xml b/eu.etaxonomy.taxeditor.navigation/pom.xml
index 4a0533d60..f990136f3 100644
--- a/eu.etaxonomy.taxeditor.navigation/pom.xml
+++ b/eu.etaxonomy.taxeditor.navigation/pom.xml
@@ -3,7 +3,7 @@
eu.etaxonomy
taxeditor-parent
- 3.7.1
+ 3.8.0
4.0.0
diff --git a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/key/polytomous/PolytomousKeyViewPart.java b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/key/polytomous/PolytomousKeyViewPart.java
index 6075a5062..09861da31 100644
--- a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/key/polytomous/PolytomousKeyViewPart.java
+++ b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/key/polytomous/PolytomousKeyViewPart.java
@@ -247,6 +247,8 @@ public class PolytomousKeyViewPart extends ViewPart implements
*/
@Override
public boolean postOperation(CdmBase objectAffectedByOperation) {
+ getConversationHolder().bind();
+ getConversationHolder().commit(true);
viewer.refresh();
return true;
}
diff --git a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/key/polytomous/handler/DeleteHandler.java b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/key/polytomous/handler/DeleteHandler.java
index faf141c73..449a661f0 100644
--- a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/key/polytomous/handler/DeleteHandler.java
+++ b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/key/polytomous/handler/DeleteHandler.java
@@ -1,9 +1,9 @@
// $Id$
/**
* Copyright (C) 2007 EDIT
-* European Distributed Institute of Taxonomy
+* European Distributed Institute of Taxonomy
* http://www.e-taxonomy.eu
-*
+*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* See LICENSE.TXT at the top of this package for the full license terms.
*/
@@ -17,9 +17,14 @@ import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
import org.eclipse.ui.handlers.HandlerUtil;
import eu.etaxonomy.cdm.model.description.PolytomousKey;
+import eu.etaxonomy.taxeditor.editor.key.polytomous.PolytomousKeyEditorInput;
import eu.etaxonomy.taxeditor.model.MessagingUtils;
import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
import eu.etaxonomy.taxeditor.navigation.key.polytomous.PolytomousKeyViewPart;
@@ -33,28 +38,31 @@ import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
*/
public class DeleteHandler extends AbstractHandler {
+ protected IWorkbenchPage activePage;
/* (non-Javadoc)
* @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
*/
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
IStructuredSelection selection = (IStructuredSelection) HandlerUtil.getCurrentSelection(event);
-
+ activePage = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage();
List keys = selection.toList();
-
+
if(keys.isEmpty()){
return null;
}
-
- boolean confirmation = MessagingUtils.confirmDialog("Confirm deletaion", "Do you want to delete the selected key" + (keys.size() == 1 ? "" : "s") + "?");
-
+ for (PolytomousKey key : keys){
+ closeObsoleteEditor(key);
+ }
+ boolean confirmation = MessagingUtils.confirmDialog("Confirm deletion", "Do you want to delete the selected key" + (keys.size() == 1 ? "" : "s") + "?");
+
if(confirmation){
-
+
for(PolytomousKey key : keys){
try {
AbstractPostOperation operation = new DeleteOperation(
event.getCommand().getName(),
- NavigationUtil.getUndoContext(), key,
+ NavigationUtil.getUndoContext(), key,
(PolytomousKeyViewPart) NavigationUtil.getView(PolytomousKeyViewPart.ID, false),
(PolytomousKeyViewPart) NavigationUtil.getView(PolytomousKeyViewPart.ID, false));
NavigationUtil.executeOperation(operation);
@@ -63,8 +71,30 @@ public class DeleteHandler extends AbstractHandler {
}
}
}
-
+
return null;
}
+
+ protected boolean closeObsoleteEditor(PolytomousKey key){
+ boolean result = true;
+ for (IEditorReference ref : activePage.getEditorReferences()) {
+ try {
+
+ IEditorInput input = ref.getEditorInput();
+ if (input instanceof PolytomousKeyEditorInput) {
+ PolytomousKey pKey = ((PolytomousKeyEditorInput)input).getKey();
+ //if node is a child of taxonNode then close the editor
+ if(key.equals(pKey)){
+ //if (taxonNode.equals(node)) {
+ result &= activePage.closeEditor(ref.getEditor(false), true);
+
+ }
+ }
+ } catch (PartInitException e) {
+ continue;
+ }
+ }
+ return result;
+ }
}
diff --git a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNavigatorContentService.java b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNavigatorContentService.java
new file mode 100644
index 000000000..46c659bfc
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNavigatorContentService.java
@@ -0,0 +1,30 @@
+package eu.etaxonomy.taxeditor.navigation.navigator;
+
+import org.eclipse.ui.internal.navigator.NavigatorContentService;
+import org.eclipse.ui.navigator.INavigatorDnDService;
+
+public class TaxonNavigatorContentService extends NavigatorContentService {
+
+ private TaxonNavigatorDnDService navigatorDnDService;
+
+ public TaxonNavigatorContentService(String viewerID) {
+ super(viewerID);
+
+
+ }
+
+ public TaxonNavigatorContentService(String aViewerId,
+ TaxonNavigatorViewer taxonNavigatorViewer) {
+ super(aViewerId, taxonNavigatorViewer);
+ getDnDService();
+ }
+
+ @Override
+ public TaxonNavigatorDnDService getDnDService() {
+ if (navigatorDnDService == null) {
+ navigatorDnDService = new TaxonNavigatorDnDService(this);
+ }
+ return navigatorDnDService;
+ }
+
+}
diff --git a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNavigatorDnDService.java b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNavigatorDnDService.java
new file mode 100644
index 000000000..5de170c81
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNavigatorDnDService.java
@@ -0,0 +1,170 @@
+package eu.etaxonomy.taxeditor.navigation.navigator;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.dnd.TransferData;
+import org.eclipse.ui.internal.navigator.dnd.CommonDropAdapterDescriptor;
+import org.eclipse.ui.internal.navigator.dnd.CommonDropDescriptorManager;
+import org.eclipse.ui.internal.navigator.extensions.CommonDragAssistantDescriptor;
+import org.eclipse.ui.internal.navigator.extensions.NavigatorViewerDescriptor;
+import org.eclipse.ui.navigator.CommonDragAdapterAssistant;
+import org.eclipse.ui.navigator.CommonDropAdapter;
+import org.eclipse.ui.navigator.CommonDropAdapterAssistant;
+import org.eclipse.ui.navigator.INavigatorContentService;
+import org.eclipse.ui.navigator.INavigatorDnDService;
+
+import eu.etaxonomy.taxeditor.navigation.navigator.dnd.TaxonNavigatorDragAdapterAssistant;
+
+public class TaxonNavigatorDnDService implements INavigatorDnDService {
+ private static final CommonDropAdapterAssistant[] NO_ASSISTANTS = new CommonDropAdapterAssistant[0];
+
+ private INavigatorContentService contentService;
+
+ private TaxonNavigatorDragAdapterAssistant[] dragAssistants;
+
+ private TreeNodeDropAdapter dropAdapter;
+
+ private final Map dropAssistants = new HashMap();
+
+ public TaxonNavigatorDnDService(INavigatorContentService contentService){
+ this.contentService = contentService;
+ }
+
+
+ @Override
+ public CommonDragAdapterAssistant[] getCommonDragAssistants() {
+
+ return dragAssistants;
+ }
+
+ @Override
+ public void bindDragAssistant(CommonDragAdapterAssistant anAssistant) {
+ if(dragAssistants == null)
+ initializeDragAssistants();
+ TaxonNavigatorDragAdapterAssistant[] newDragAssistants = new TaxonNavigatorDragAdapterAssistant[dragAssistants.length + 1];
+ System.arraycopy(dragAssistants, 0, newDragAssistants, 0, dragAssistants.length);
+ newDragAssistants[dragAssistants.length] = (TaxonNavigatorDragAdapterAssistant) anAssistant;
+ dragAssistants = newDragAssistants;
+
+ }
+
+ private void initializeDragAssistants() {
+ int i = 0;
+ Set dragDescriptors = ((NavigatorViewerDescriptor) contentService
+ .getViewerDescriptor()).getDragAssistants();
+ dragAssistants = new TaxonNavigatorDragAdapterAssistant[dragDescriptors
+ .size()];
+ for (Iterator iter = dragDescriptors.iterator(); iter.hasNext();) {
+ CommonDragAssistantDescriptor descriptor = (CommonDragAssistantDescriptor) iter
+ .next();
+ dragAssistants[i++] = (TaxonNavigatorDragAdapterAssistant) descriptor.createDragAssistant();
+ }
+ }
+
+ @Override
+ public CommonDropAdapterAssistant[] findCommonDropAdapterAssistants(
+ Object aDropTarget, TransferData aTransferType) {
+ CommonDropAdapterDescriptor[] descriptors = CommonDropDescriptorManager
+ .getInstance().findCommonDropAdapterAssistants(aDropTarget,
+ contentService);
+
+ if (descriptors.length == 0) {
+ return NO_ASSISTANTS;
+ }
+
+ if (LocalSelectionTransfer.getTransfer().isSupportedType(aTransferType)
+ && LocalSelectionTransfer.getTransfer().getSelection() instanceof IStructuredSelection) {
+ return getAssistantsBySelection(descriptors, (IStructuredSelection) LocalSelectionTransfer.getTransfer().getSelection());
+ }
+ return getAssistantsByTransferData(descriptors, aTransferType);
+ }
+
+ private CommonDropAdapterAssistant[] getAssistantsByTransferData(
+ CommonDropAdapterDescriptor[] descriptors,
+ TransferData aTransferType) {
+
+ Set assistants = new LinkedHashSet();
+ for (int i = 0; i < descriptors.length; i++) {
+ CommonDropAdapterAssistant asst = getAssistant(descriptors[i]);
+ if (asst.isSupportedType(aTransferType)) {
+ assistants.add(asst);
+ }
+ }
+ return sortAssistants((CommonDropAdapterAssistant[]) assistants
+ .toArray(new CommonDropAdapterAssistant[assistants.size()]));
+
+ }
+
+ private CommonDropAdapterAssistant[] getAssistantsBySelection(
+ CommonDropAdapterDescriptor[] descriptors, IStructuredSelection aSelection) {
+
+ Set assistants = new LinkedHashSet();
+
+ for (int i = 0; i < descriptors.length; i++) {
+ if(descriptors[i].areDragElementsSupported(aSelection)) {
+ assistants.add(getAssistant(descriptors[i]));
+ }
+ }
+
+ return sortAssistants((CommonDropAdapterAssistant[]) assistants
+ .toArray(new CommonDropAdapterAssistant[assistants.size()]));
+ }
+
+ private CommonDropAdapterAssistant getAssistant(
+ CommonDropAdapterDescriptor descriptor) {
+ TreeNodeDropAdapterAssistant asst = (TreeNodeDropAdapterAssistant) dropAssistants
+ .get(descriptor);
+ if (asst != null) {
+ return asst;
+ }
+ synchronized (dropAssistants) {
+ asst = (TreeNodeDropAdapterAssistant) dropAssistants.get(descriptor);
+ if (asst == null) {
+ dropAssistants.put(descriptor, (asst = (TreeNodeDropAdapterAssistant) descriptor
+ .createDropAssistant()));
+ asst.init(contentService);
+ //asst.setCommonDropAdapter(dropAdapter);
+ }
+ }
+ return asst;
+ }
+
+
+ private CommonDropAdapterAssistant[] sortAssistants(CommonDropAdapterAssistant[] array) {
+ Arrays.sort(array, new Comparator() {
+ public int compare(Object arg0, Object arg1) {
+ CommonDropAdapterAssistant a = (CommonDropAdapterAssistant) arg0;
+ CommonDropAdapterAssistant b = (CommonDropAdapterAssistant) arg1;
+ // This is to ensure that the navigator resources drop assistant will
+ // always be first on the list of drop assistant, if a conflict ever
+ // occurs.
+ String id = "org.eclipse.ui.navigator.resources."; //$NON-NLS-1$
+ if (a.getClass().getName().startsWith(id))
+ return -1;
+ if (b.getClass().getName().startsWith(id))
+ return 1;
+ return a.getClass().getName().compareTo(b.getClass().getName());
+ }
+ });
+ return array;
+ }
+
+ @Override
+ public CommonDropAdapterAssistant[] findCommonDropAdapterAssistants(
+ Object aDropTarget, IStructuredSelection theDragSelection) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public void setDropAdaptor(TreeNodeDropAdapter da) {
+ dropAdapter = da;
+ }
+}
diff --git a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNavigatorViewer.java b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNavigatorViewer.java
new file mode 100644
index 000000000..8fdabb831
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNavigatorViewer.java
@@ -0,0 +1,54 @@
+package eu.etaxonomy.taxeditor.navigation.navigator;
+
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.internal.navigator.NavigatorContentService;
+import org.eclipse.ui.internal.navigator.dnd.NavigatorDnDService;
+import org.eclipse.ui.navigator.CommonDragAdapter;
+import org.eclipse.ui.navigator.CommonDropAdapter;
+import org.eclipse.ui.navigator.CommonViewer;
+import org.eclipse.ui.navigator.INavigatorContentService;
+
+import eu.etaxonomy.taxeditor.dnd.transfer.TaxonNodeTransfer;
+
+public class TaxonNavigatorViewer extends CommonViewer {
+
+ private NavigatorContentService contentService;
+ String viewerId;
+
+ public TaxonNavigatorViewer(String aViewerId, Composite aParent, int aStyle) {
+ super(aViewerId, aParent, aStyle);
+ contentService = new TaxonNavigatorContentService(aViewerId, this);
+ viewerId = aViewerId;
+ }
+
+ @Override
+ protected void initDragAndDrop() {
+
+ int operations = DND.DROP_MOVE ;
+
+ CommonDragAdapter dragAdapter = createDragAdapter();
+ addDragSupport(operations, dragAdapter.getSupportedDragTransfers(),
+ dragAdapter);
+ Transfer[] transfers = new Transfer[] { TaxonNodeTransfer.getInstance() };
+ TreeNodeDropAdapter dropAdapter = createTreeNodeDropAdapter();
+ addDropSupport(operations, transfers, dropAdapter);
+
+ TaxonNavigatorDnDService dnd = (TaxonNavigatorDnDService)getNavigatorContentService().getDnDService();
+ dnd.setDropAdaptor(dropAdapter);
+ }
+
+
+ protected TreeNodeDropAdapter createTreeNodeDropAdapter() {
+ return new TreeNodeDropAdapter(this);
+ }
+
+ public NavigatorContentService getNavigatorContentService(){
+ if (contentService == null){
+ contentService = new TaxonNavigatorContentService(viewerId);
+ }
+ return contentService;
+ }
+
+}
diff --git a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TreeNodeDragListener.java b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TreeNodeDragListener.java
new file mode 100644
index 000000000..9cd02f9eb
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TreeNodeDragListener.java
@@ -0,0 +1,83 @@
+// $Id$
+/**
+* Copyright (C) 2015 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.navigation.navigator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.dnd.DragSourceAdapter;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.ui.navigator.CommonViewer;
+
+
+import eu.etaxonomy.cdm.model.common.DefinedTermBase;
+import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode;
+import eu.etaxonomy.cdm.model.taxon.TaxonNode;
+import eu.etaxonomy.taxeditor.dnd.transfer.TaxonNodeTransfer;
+import eu.etaxonomy.taxeditor.editor.definedterm.TermTransfer;
+
+/**
+ * @author k.luther
+ * @date 02.06.2015
+ *
+ */
+public class TreeNodeDragListener extends DragSourceAdapter {
+ private CommonViewer viewer;
+
+ /**
+ *
+ */
+ public TreeNodeDragListener(CommonViewer viewer) {
+ this.viewer = viewer;
+ }
+
+
+ public void setViewer(CommonViewer viewer){
+ this.viewer = viewer;
+ }
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.dnd.DragSourceAdapter#dragStart(org.eclipse.swt.dnd.DragSourceEvent)
+ */
+ @Override
+ public void dragStart(DragSourceEvent event) {
+
+ event.doit = true;// set to false if needed - default is true
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.dnd.DragSourceAdapter#dragFinished(org.eclipse.swt.dnd.DragSourceEvent)
+ */
+ @Override
+ public void dragFinished(DragSourceEvent event) {
+ // TODO Auto-generated method stub
+ super.dragFinished(event);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.dnd.DragSourceAdapter#dragSetData(org.eclipse.swt.dnd.DragSourceEvent)
+ */
+ @Override
+ public void dragSetData(DragSourceEvent event) {
+
+ IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+ List taxonNodes = new ArrayList();
+
+ for (Object object : selection.toList()){
+ taxonNodes.add((ITaxonTreeNode)object);
+ }
+
+ if (TaxonNodeTransfer.getInstance().isSupportedType(
+ event.dataType)) {
+ event.data = taxonNodes.toArray(new TaxonNode[taxonNodes.size()]);
+ }
+ }
+}
diff --git a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TreeNodeDropAdapter.java b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TreeNodeDropAdapter.java
new file mode 100644
index 000000000..e0f8a0566
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TreeNodeDropAdapter.java
@@ -0,0 +1,280 @@
+// $Id$
+/**
+* Copyright (C) 2015 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+
+package eu.etaxonomy.taxeditor.navigation.navigator;
+
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.UUID;
+
+import org.apache.log4j.Logger;
+import org.eclipse.core.commands.operations.IUndoContext;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.jface.viewers.ViewerDropAdapter;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.TransferData;
+
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
+import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.taxon.Classification;
+import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode;
+import eu.etaxonomy.cdm.model.taxon.TaxonNode;
+import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
+import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
+import eu.etaxonomy.taxeditor.navigation.navigator.operation.MoveTaxonOperation;
+import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
+import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
+import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+
+/**
+ * TreeNodeDropAdapter class.
+ *
+ * @author k.luther
+ * @date 02.06.2015
+ * @version 1.0
+ */
+public class TreeNodeDropAdapter extends ViewerDropAdapter implements IPostOperationEnabled {
+
+ /**
+ * @param viewer
+ */
+ protected TreeNodeDropAdapter(TaxonNavigatorViewer navigatorViewer) {
+ super(navigatorViewer);
+ this.navigatorViewer = navigatorViewer;
+
+ }
+
+ private final TaxonNavigatorViewer navigatorViewer;
+ private static final Logger logger = Logger.getLogger(TreeNodeDropAdapter.class);
+
+ /** Constant ID="eu.etaxonomy.taxeditor.navigation.navig"{trunked}
*/
+ public static final String ID = "eu.etaxonomy.taxeditor.navigation.navigator.dropassistant"; //$NON-NLS-1$
+
+ private static final EnumSet UPDATE = EnumSet.of(CRUD.UPDATE);
+
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#handleDrop(org.eclipse.ui.navigator.CommonDropAdapter, org.eclipse.swt.dnd.DropTargetEvent, java.lang.Object)
+ */
+ /** {@inheritDoc} */
+ @Override
+ public boolean performDrop(Object target) {
+
+
+ if (target instanceof ITaxonTreeNode) {
+ Set taxonNodes = getSelectedTaxa();
+ ITaxonTreeNode targetTreeNode = (ITaxonTreeNode) target;
+ if (targetTreeNode instanceof Classification){
+ targetTreeNode = ((Classification)targetTreeNode).getRootNode();
+ targetTreeNode = HibernateProxyHelper.deproxy(targetTreeNode, TaxonNode.class);
+ }
+ if(taxonNodes != null) {
+ if (taxonNodes.size() == 1){
+ return moveTaxon(taxonNodes, targetTreeNode);
+ } else{
+ if( MessageDialog.openConfirm(null, "Moving taxon", "The operation move accepted taxon to other parent is available only for a single taxon.")){
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ private Set getSelectedTaxa(){
+ HashSet taxonNodes = new HashSet();
+
+ ISelection selection = LocalSelectionTransfer.getTransfer().getSelection();
+ if (selection instanceof TreeSelection) {
+
+ Iterator selectionIterator = ((TreeSelection) selection).iterator();
+
+ while (selectionIterator.hasNext()){
+ Object object = selectionIterator.next();
+ if(object instanceof TaxonNode){
+ TaxonNode taxonNode = (TaxonNode) object;
+ taxonNodes.add(taxonNode);
+ }
+ }
+ }
+ return taxonNodes.size() > 0 ? taxonNodes : null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.navigator.CommonDropAdapter#validateDrop(java.lang.Object, int, org.eclipse.swt.dnd.TransferData)
+ */
+ /** {@inheritDoc} */
+ @Override
+ public boolean validateDrop(Object target, int operation,
+ TransferData transferType) {
+
+ if (target instanceof ITaxonTreeNode) {
+
+ // check users permissions with target taxonnode and taxon
+ if (target instanceof TaxonNode) {
+ TaxonNode targetNode = (TaxonNode)target;
+ Boolean hasTargetNodePermission = CdmStore.currentAuthentiationHasPermission(targetNode, UPDATE);
+ Boolean hasTargetTaxonPermission = CdmStore.currentAuthentiationHasPermission(targetNode.getTaxon(), UPDATE);
+
+ if(logger.isDebugEnabled()){
+ logger.debug("target: " + targetNode.getTaxon().getTitleCache());
+ }
+
+ if(!hasTargetNodePermission || ! hasTargetNodePermission){
+ if(logger.isDebugEnabled()){
+ logger.debug("CANCEL_STATUS for target node: " + hasTargetNodePermission.toString() + " " + hasTargetTaxonPermission.toString() + " ");
+ }
+ return false;
+ }
+ }
+
+ // do not allow to drop onto itself and
+ // check users permissions with all selected taxon nodes and taxa
+ for(TaxonNode taxonNode : getSelectedTaxa()){
+ logger.debug("selectedTaxa: " + taxonNode.getTaxon().getTitleCache());
+ Boolean isSameTaxonNode = taxonNode.equals(target);
+ Boolean hasTaxonNodePermission = CdmStore.currentAuthentiationHasPermission(taxonNode, UPDATE);
+ Boolean hasTaxonPermission = CdmStore.currentAuthentiationHasPermission(taxonNode.getTaxon(), UPDATE);
+ if (
+ isSameTaxonNode
+ || !hasTaxonNodePermission
+ || !hasTaxonPermission
+ ) {
+ if(logger.isDebugEnabled()){
+ logger.debug("CANCEL_STATUS for selected " + isSameTaxonNode.toString() + " " + hasTaxonNodePermission.toString() + " " + hasTaxonPermission.toString() + " ");
+ }
+ return false;
+ }
+ }
+ logger.debug("OK_STATUS");
+ return true;
+ }
+ logger.debug("CANCEL_STATUS");
+ return false;
+ }
+
+
+ /**
+ * @param childTaxonNode
+ * @param parentTaxon
+ * @return
+ */
+ private boolean moveTaxon(Set taxonNodes, ITaxonTreeNode targetITaxonTreeNode) {
+
+ TaxonNavigator taxonNavigator;
+ taxonNavigator = (TaxonNavigator) NavigationUtil.showView(TaxonNavigator.ID);
+
+ if(targetITaxonTreeNode instanceof TaxonNode){
+
+ TaxonNode targetTaxonNode = (TaxonNode) targetITaxonTreeNode;
+ // Make sure parent taxon does not have unsaved changes
+ if (NavigationUtil.isDirty(targetTaxonNode)){
+ MessageDialog.openWarning(NavigationUtil.getShell(), "Unsaved Parent Taxon", "There are unsaved " +
+ "changes in the parent taxon. Pleas save first.");
+ return false;
+ }
+
+ }
+ Iterator taxIterator = taxonNodes.iterator();
+ Set uuids = new HashSet();
+ TaxonNode node = null;
+ while(taxIterator.hasNext()){
+ node = taxIterator.next();
+ uuids.add(node.getUuid());
+ }
+ if (!PreferencesUtil.getSortNodesNaturally()){
+ IUndoContext workspaceUndoContext = NavigationUtil.getWorkbenchUndoContext();
+ if (workspaceUndoContext == null) {
+ logger.error("Workspace undo context is null. DND operation cancelled");
+ return false;
+ }
+
+ AbstractPostOperation operation = new MoveTaxonOperation
+ ("Move Taxon", workspaceUndoContext, uuids, targetITaxonTreeNode, this, taxonNavigator, true);
+ NavigationUtil.executeOperation(operation);
+
+ logger.info("Moved taxa to new parent " + targetITaxonTreeNode);
+ return true;
+ }else{
+ String[] buttonLables = {"Parent", "Predecessor", "Cancel"};
+ MessageDialog dialog = new MessageDialog(null, "Target node", null, "Do you want to use the target node as parent or do you want to move the taxon below the target.", MessageDialog.QUESTION_WITH_CANCEL, buttonLables, 0);
+ dialog.open();
+ int returnCode = dialog.getReturnCode();
+ if (returnCode == 0){
+ IUndoContext workspaceUndoContext = NavigationUtil.getWorkbenchUndoContext();
+ if (workspaceUndoContext == null) {
+ logger.error("Workspace undo context is null. DND operation cancelled");
+ return false;
+ }
+
+ AbstractPostOperation operation = new MoveTaxonOperation
+ ("Move Taxon", workspaceUndoContext, uuids, targetITaxonTreeNode, this, taxonNavigator, true);
+ NavigationUtil.executeOperation(operation);
+
+ logger.info("Moved taxa to new parent " + targetITaxonTreeNode);
+ return true;
+ }else if (returnCode == 1){
+ IUndoContext workspaceUndoContext = NavigationUtil.getWorkbenchUndoContext();
+ if (workspaceUndoContext == null) {
+ logger.error("Workspace undo context is null. DND operation cancelled");
+ return false;
+ }
+ TaxonNode targetNode = (TaxonNode) targetITaxonTreeNode;
+
+ AbstractPostOperation operation = new MoveTaxonOperation
+ ("Move Taxon", workspaceUndoContext, uuids, targetNode.getParent(), this, taxonNavigator, false);
+ NavigationUtil.executeOperation(operation);
+
+ logger.info("Moved taxa to new parent " + targetITaxonTreeNode);
+ return true;
+ } else{
+ return false;
+ }
+
+
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.operations.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)
+ */
+ /** {@inheritDoc} */
+ @Override
+ public boolean postOperation(CdmBase objectAffectedByOperation) {
+ return true;
+ }
+
+ /**
+ * onComplete
+ *
+ * @return a boolean.
+ */
+ @Override
+ public boolean onComplete() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+ @Override
+ public void dragOver(DropTargetEvent event) {
+ super.dragOver(event);
+ event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_INSERT_AFTER;
+
+ }
+
+}
diff --git a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TreeNodeDropAdapterAssistant.java b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TreeNodeDropAdapterAssistant.java
index 86eb9506f..289d9d1b9 100644
--- a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TreeNodeDropAdapterAssistant.java
+++ b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TreeNodeDropAdapterAssistant.java
@@ -14,21 +14,18 @@ import java.util.EnumSet;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
+import java.util.UUID;
import org.apache.log4j.Logger;
import org.eclipse.core.commands.operations.IUndoContext;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.IconAndMessageDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.navigator.CommonDropAdapter;
import org.eclipse.ui.navigator.CommonDropAdapterAssistant;
@@ -69,7 +66,7 @@ public class TreeNodeDropAdapterAssistant extends CommonDropAdapterAssistant imp
public IStatus handleDrop(CommonDropAdapter dropAdapter,
DropTargetEvent dropTargetEvent, Object target) {
-
+
if (target instanceof ITaxonTreeNode) {
Set taxonNodes = getSelectedTaxa();
ITaxonTreeNode targetTreeNode = (ITaxonTreeNode) target;
@@ -77,17 +74,17 @@ public class TreeNodeDropAdapterAssistant extends CommonDropAdapterAssistant imp
targetTreeNode = ((Classification)targetTreeNode).getRootNode();
targetTreeNode = HibernateProxyHelper.deproxy(targetTreeNode, TaxonNode.class);
}
- if(taxonNodes != null) {
- if (taxonNodes.size() == 1){
- return moveTaxon(taxonNodes.iterator().next(), targetTreeNode);
- } else{
+ //if(taxonNodes != null) {
+ if (taxonNodes.size() >= 1){
+ return moveTaxon(taxonNodes, targetTreeNode);
+ /*} else{
if( MessageDialog.openConfirm(null, "Moving taxon", "The operation move accepted taxon to other parent is available only for a single taxon.")){
return null;
}
- }
+ }*/
}
}
-
+
return Status.CANCEL_STATUS;
}
@@ -168,7 +165,7 @@ public class TreeNodeDropAdapterAssistant extends CommonDropAdapterAssistant imp
* @param parentTaxon
* @return
*/
- private IStatus moveTaxon(TaxonNode taxonNode, ITaxonTreeNode targetITaxonTreeNode) {
+ private IStatus moveTaxon(Set taxonNodes, ITaxonTreeNode targetITaxonTreeNode) {
TaxonNavigator taxonNavigator;
taxonNavigator = (TaxonNavigator) NavigationUtil.showView(TaxonNavigator.ID);
@@ -184,17 +181,24 @@ public class TreeNodeDropAdapterAssistant extends CommonDropAdapterAssistant imp
}
}
+ Iterator taxIterator = taxonNodes.iterator();
+ Set uuids = new HashSet();
+ TaxonNode node = null;
+ while(taxIterator.hasNext()){
+ node = taxIterator.next();
+ uuids.add(node.getUuid());
+ }
if (!PreferencesUtil.getSortNodesNaturally()){
IUndoContext workspaceUndoContext = NavigationUtil.getWorkbenchUndoContext();
if (workspaceUndoContext == null) {
logger.error("Workspace undo context is null. DND operation cancelled");
return Status.CANCEL_STATUS;
}
-
+
AbstractPostOperation operation = new MoveTaxonOperation
- ("Move Taxon", workspaceUndoContext, taxonNode, targetITaxonTreeNode, this, taxonNavigator, true);
+ ("Move Taxon", workspaceUndoContext, uuids, targetITaxonTreeNode, this, taxonNavigator, true);
NavigationUtil.executeOperation(operation);
-
+
logger.info("Moved taxa to new parent " + targetITaxonTreeNode);
return Status.OK_STATUS;
}else{
@@ -208,11 +212,11 @@ public class TreeNodeDropAdapterAssistant extends CommonDropAdapterAssistant imp
logger.error("Workspace undo context is null. DND operation cancelled");
return Status.CANCEL_STATUS;
}
-
+
AbstractPostOperation operation = new MoveTaxonOperation
- ("Move Taxon", workspaceUndoContext, taxonNode, targetITaxonTreeNode, this, taxonNavigator, true);
+ ("Move Taxon", workspaceUndoContext, uuids, targetITaxonTreeNode, this, taxonNavigator, true);
NavigationUtil.executeOperation(operation);
-
+
logger.info("Moved taxa to new parent " + targetITaxonTreeNode);
return Status.OK_STATUS;
}else if (returnCode == 1){
@@ -221,18 +225,18 @@ public class TreeNodeDropAdapterAssistant extends CommonDropAdapterAssistant imp
logger.error("Workspace undo context is null. DND operation cancelled");
return Status.CANCEL_STATUS;
}
-
+ TaxonNode targetNode = (TaxonNode) targetITaxonTreeNode;
AbstractPostOperation operation = new MoveTaxonOperation
- ("Move Taxon", workspaceUndoContext, taxonNode, targetITaxonTreeNode, this, taxonNavigator, false);
+ ("Move Taxon", workspaceUndoContext, uuids, targetNode.getParent(), this, taxonNavigator, false);
NavigationUtil.executeOperation(operation);
-
+
logger.info("Moved taxa to new parent " + targetITaxonTreeNode);
return Status.OK_STATUS;
} else{
return Status.CANCEL_STATUS;
}
-
-
+
+
}
}
diff --git a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/handler/DeleteHandler.java b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/handler/DeleteHandler.java
index 55df02ba2..f8e789caf 100644
--- a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/handler/DeleteHandler.java
+++ b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/handler/DeleteHandler.java
@@ -87,6 +87,7 @@ public class DeleteHandler extends AbstractHandler{
ITaxonTreeNode treeNode = treeNodes.iterator().next();
ITaxonTreeNode taxonNode =treeNode;
TaxonNodeDeletionConfigurator configNodes = new TaxonNodeDeletionConfigurator();
+ //configNodes.setDeleteTaxon(false);
if (taxonNode instanceof Classification && taxonNode.hasChildNodes()){
if(!DeleteConfiguratorDialog.openConfirmWithConfigurator(config, HandlerUtil.getActiveShell(event), "Confirm Deletion", "Do you really want to delete the classification? The tree has children, they will be deleted, too.")){
return null;
@@ -122,9 +123,10 @@ public class DeleteHandler extends AbstractHandler{
}
}else{
- if(!DeleteConfiguratorDialog.openConfirmWithConfigurator(config, HandlerUtil.getActiveShell(event), "Confirm Deletion", "Do you really want to delete the selected node?")){
+ if(!DeleteConfiguratorDialog.openConfirmWithConfigurator(configNodes, HandlerUtil.getActiveShell(event), "Confirm Deletion", "Do you really want to delete the selected node?")){
return null;
}
+ config.setTaxonNodeConfig(configNodes);
}
}
@@ -144,6 +146,8 @@ public class DeleteHandler extends AbstractHandler{
} catch (NotDefinedException e) {
MessagingUtils.warn(getClass(), "Command name not set");
+ } catch (Exception e){
+ MessagingUtils.error(getClass(), e);
}
} else{
try{
@@ -159,7 +163,9 @@ public class DeleteHandler extends AbstractHandler{
}
}catch (NotDefinedException e) {
MessagingUtils.warn(getClass(), "Command name not set");
- }
+ } catch (Exception e){
+ MessagingUtils.error(getClass(), e);
+ }
}
return null;
}
diff --git a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/handler/MoveTaxonHandler.java b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/handler/MoveTaxonHandler.java
index 4c84b0197..a761433ad 100644
--- a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/handler/MoveTaxonHandler.java
+++ b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/handler/MoveTaxonHandler.java
@@ -1,8 +1,8 @@
/**
* Copyright (C) 2007 EDIT
-* European Distributed Institute of Taxonomy
+* European Distributed Institute of Taxonomy
* http://www.e-taxonomy.eu
-*
+*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* See LICENSE.TXT at the top of this package for the full license terms.
*/
@@ -19,32 +19,21 @@ import java.util.UUID;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.expressions.EvaluationContext;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
import org.eclipse.ui.handlers.HandlerUtil;
-import eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration;
-import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
import eu.etaxonomy.cdm.model.common.CdmBase;
-import eu.etaxonomy.cdm.model.common.ITreeNode;
-import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode;
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
-import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;
import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
import eu.etaxonomy.taxeditor.navigation.navigator.TaxonNavigator;
import eu.etaxonomy.taxeditor.navigation.navigator.operation.MoveTaxonOperation;
import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
-import eu.etaxonomy.taxeditor.store.CdmStore;
import eu.etaxonomy.taxeditor.ui.dialog.selection.TaxonNodeSelectionDialog;
-import eu.etaxonomy.taxeditor.ui.dialog.selection.TaxonNodeSelectionNaturalOrderDialog;
/**
* MoveTaxonHandler class.
@@ -61,35 +50,41 @@ public class MoveTaxonHandler extends AbstractHandler implements IPostOperationE
* @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
*/
/** {@inheritDoc} */
- public Object execute(ExecutionEvent event) throws ExecutionException {
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
activePage = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage();
TaxonNavigator taxonNavigator = (TaxonNavigator)NavigationUtil.showView(TaxonNavigator.ID);
-
+
TreeSelection selection = (TreeSelection) HandlerUtil.getCurrentSelection(event);
-
+
Iterator selectionIterator = selection.iterator();
- TaxonNode taxonNode = null;
- UUID taxonNodeUUID = null;
+ Set taxonNodes = new HashSet();
+ TaxonNode taxonNode= null;
+ Set taxonNodeUUIDs = new HashSet();
// do not show the current selection
List excludeTaxa = new ArrayList();
-
- if (selection.size() == 1){
+
+ //if (selection.size() == 1){
+
+ while (selectionIterator.hasNext()){
Object object = selectionIterator.next();
if(object instanceof TaxonNode){
- taxonNode = HibernateProxyHelper.deproxy(object,TaxonNode.class);
- taxonNodeUUID = taxonNode.getUuid();
+ taxonNode = HibernateProxyHelper.deproxy(object,TaxonNode.class);
+ taxonNodes.add(taxonNode);
+ taxonNodeUUIDs.add(taxonNode.getUuid());
excludeTaxa.add(taxonNode.getTaxon().getUuid());
}
- } else{
+ }
+ /*} else{
if( MessageDialog.openConfirm(HandlerUtil.getActiveShell(event), "Moving taxon", "The operation move accepted taxon to other parent is available only for a single taxon.")){
return null;
}
- }
-
-
+ }*/
+
+
// TaxonNode taxonNode = (TaxonNode) selection.getFirstElement();
- if (taxonNode != null){
- boolean moveToNewParent = true;
+ if (taxonNodes.size() >= 1){
+ boolean moveToNewParent = true;
if (PreferencesUtil.getSortNodesNaturally()){
if(!MessageDialog.openQuestion(null, "Target node", "The choosen target node should be the parent?")){
moveToNewParent = false;
@@ -104,13 +99,13 @@ public class MoveTaxonHandler extends AbstractHandler implements IPostOperationE
"changes in the parent taxon. Please save first.");
return null;
}
-
+
AbstractPostOperation operation = new MoveTaxonOperation
("Move taxon to new parent", NavigationUtil.getUndoContext(),
- taxonNode, parentTaxonNode, taxonNavigator, taxonNavigator, moveToNewParent); //$NON-NLS-1$
+ taxonNodeUUIDs, parentTaxonNode, taxonNavigator, taxonNavigator, moveToNewParent); //$NON-NLS-1$
NavigationUtil.executeOperation(operation);
taxonNavigator.refresh();
-
+
}
}
return null;
@@ -120,7 +115,8 @@ public class MoveTaxonHandler extends AbstractHandler implements IPostOperationE
* @see eu.etaxonomy.taxeditor.operations.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)
*/
/** {@inheritDoc} */
- public boolean postOperation(CdmBase objectAffectedByOperation) {
+ @Override
+ public boolean postOperation(CdmBase objectAffectedByOperation) {
return true;
}
@@ -129,10 +125,11 @@ public class MoveTaxonHandler extends AbstractHandler implements IPostOperationE
*
* @return a boolean.
*/
- public boolean onComplete() {
+ @Override
+ public boolean onComplete() {
return false;
}
-
-
-
+
+
+
}
diff --git a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/operation/DeleteOperation.java b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/operation/DeleteOperation.java
index 047142041..5e78bd2dd 100644
--- a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/operation/DeleteOperation.java
+++ b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/operation/DeleteOperation.java
@@ -29,6 +29,7 @@ import eu.etaxonomy.cdm.model.common.CdmBase;
import eu.etaxonomy.cdm.model.taxon.Classification;
import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode;
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
import eu.etaxonomy.taxeditor.operation.AbstractPersistentPostOperation;
import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
import eu.etaxonomy.taxeditor.store.CdmStore;
@@ -107,10 +108,14 @@ public class DeleteOperation extends AbstractPersistentPostOperation{
} else if (!result.getExceptions().isEmpty()){
String separator = ", ";
String exceptionString = "";
+ int count = 1;
for (Exception exception : result.getExceptions()) {
- exceptionString += exception.getLocalizedMessage()+separator;
+ exceptionString += exception.getLocalizedMessage();
+ if (count < result.getExceptions().size()){
+ exceptionString += separator;
+ }
}
- MessageDialog.openInformation(null, "Delete of the node was successful but the taxon could not be deleted.", exceptionString);
+ MessagingUtils.informationDialog("Delete of the node was successful but the taxon could not be deleted.", exceptionString);
}
@@ -124,8 +129,12 @@ public class DeleteOperation extends AbstractPersistentPostOperation{
DeleteResult result = CdmStore.getService(IClassificationService.class).delete(taxonomicTree);
if (result.isError() && !result.getExceptions().isEmpty()){
- //TODO:Error message!
- MessageDialog.openError(null, "Delete failed", result.getExceptions().iterator().next().getMessage());
+ String separator = ", ";
+ String exceptionString = "";
+ for (Exception exception : result.getExceptions()) {
+ exceptionString += exception.getLocalizedMessage()+separator;
+ }
+ MessagingUtils.error(null, exceptionString, result.getExceptions().iterator().next());
}
/*}else{
@@ -139,8 +148,12 @@ public class DeleteOperation extends AbstractPersistentPostOperation{
DeleteResult result =service.deleteTaxonNodes(treeNodes, config);
if (result.isError() && !result.getExceptions().isEmpty()){
- //TODO:Error message!
- MessageDialog.openError(null, "Delete failed", result.getExceptions().iterator().next().getMessage());
+ String separator = ", ";
+ String exceptionString = "";
+ for (Exception exception : result.getExceptions()) {
+ exceptionString += exception.getLocalizedMessage()+separator;
+ }
+ MessagingUtils.error(null, exceptionString, result.getExceptions().iterator().next());
}
}
diff --git a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/operation/MoveTaxonOperation.java b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/operation/MoveTaxonOperation.java
index bd2b57db5..830d572a4 100644
--- a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/operation/MoveTaxonOperation.java
+++ b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/operation/MoveTaxonOperation.java
@@ -9,9 +9,6 @@
package eu.etaxonomy.taxeditor.navigation.navigator.operation;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
import java.util.Set;
import java.util.UUID;
@@ -22,13 +19,10 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
-import eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration;
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
import eu.etaxonomy.cdm.api.service.UpdateResult;
import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode;
-import eu.etaxonomy.cdm.model.taxon.IllegalAncestryException;
-import eu.etaxonomy.cdm.model.taxon.TaxonNode;
import eu.etaxonomy.taxeditor.model.MessagingUtils;
import eu.etaxonomy.taxeditor.operation.AbstractPersistentPostOperation;
import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
@@ -46,14 +40,14 @@ public class MoveTaxonOperation extends AbstractPersistentPostOperation {
/**
* A reference to the new taxonomical parent.
*/
- private ITaxonTreeNode newParentTreeNode;
+ private final ITaxonTreeNode newParentTreeNode;
/**
* A reference to the former taxonomical parents
*/
//private Map oldParentTreeNodes;
- private TaxonNode taxonNode;
- private boolean moveToParentNode;
+ private final Set taxonNodesUuid;
+ private final boolean moveToParentNode;
/**
* Constructor for MoveTaxonOperation.
*
@@ -65,18 +59,18 @@ public class MoveTaxonOperation extends AbstractPersistentPostOperation {
* @param conversationEnabled a {@link eu.etaxonomy.cdm.api.conversation.IConversationEnabled} object.
*/
public MoveTaxonOperation(String label, IUndoContext undoContext,
- TaxonNode taxonNodeToMove, ITaxonTreeNode newParentTreeNode, IPostOperationEnabled postOperationEnabled, IConversationEnabled conversationEnabled, boolean moveToParentNode) {
+ Set taxonNodesUUIDToMove, ITaxonTreeNode newParentTreeNode, IPostOperationEnabled postOperationEnabled, IConversationEnabled conversationEnabled, boolean moveToParentNode) {
super(label, undoContext, postOperationEnabled, conversationEnabled);
-
- this.taxonNode = taxonNodeToMove;
+
+ this.taxonNodesUuid = taxonNodesUUIDToMove;
/*for (TaxonNode node:taxonNodes){
this.taxonNodes.add(service.load(node.getUuid()));
}*/
-
+
this.newParentTreeNode = newParentTreeNode;
this.moveToParentNode = moveToParentNode;
// Save old parent ITaxonTreeNodes for undo
-
+
//this.parentNode = taxonNode.getParent();
}
@@ -90,13 +84,13 @@ public class MoveTaxonOperation extends AbstractPersistentPostOperation {
bind();
monitor.worked(20);
- UpdateResult result = CdmStore.getService(ITaxonNodeService.class).moveTaxonNode(this.taxonNode.getUuid(),newParentTreeNode.getUuid(), moveToParentNode);
+ UpdateResult result = CdmStore.getService(ITaxonNodeService.class).moveTaxonNodes(this.taxonNodesUuid,newParentTreeNode.getUuid());
// try {
// for (TaxonNode taxonNode : taxonNodes){
// TaxonNode newTaxonNode = newParentTreeNode.addChildNode(taxonNode,
// newParentTreeNode.getReference(), newParentTreeNode.getMicroReference());
// //taxonNodes.add(newTaxonNode);
-//
+//
// monitor.worked(2);
// }
// } catch(IllegalAncestryException e) {
diff --git a/eu.etaxonomy.taxeditor.printpublisher/META-INF/MANIFEST.MF b/eu.etaxonomy.taxeditor.printpublisher/META-INF/MANIFEST.MF
index 1afcab139..c2fab1cf1 100644
--- a/eu.etaxonomy.taxeditor.printpublisher/META-INF/MANIFEST.MF
+++ b/eu.etaxonomy.taxeditor.printpublisher/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Printpublisher Bundle
Bundle-SymbolicName: eu.etaxonomy.taxeditor.printpublisher;singleton:=true
-Bundle-Version: 3.7.1
+Bundle-Version: 3.8.0
Require-Bundle: org.eclipse.osgi,
org.eclipse.ui,
eu.etaxonomy.taxeditor.cdmlib,
diff --git a/eu.etaxonomy.taxeditor.printpublisher/pom.xml b/eu.etaxonomy.taxeditor.printpublisher/pom.xml
index 8b130dfe6..efa42a578 100644
--- a/eu.etaxonomy.taxeditor.printpublisher/pom.xml
+++ b/eu.etaxonomy.taxeditor.printpublisher/pom.xml
@@ -3,7 +3,7 @@
taxeditor-parent
eu.etaxonomy
- 3.7.1
+ 3.8.0
4.0.0
diff --git a/eu.etaxonomy.taxeditor.store/META-INF/MANIFEST.MF b/eu.etaxonomy.taxeditor.store/META-INF/MANIFEST.MF
index dbb481a83..113e56e71 100644
--- a/eu.etaxonomy.taxeditor.store/META-INF/MANIFEST.MF
+++ b/eu.etaxonomy.taxeditor.store/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: DataStore Bundle
Bundle-SymbolicName: eu.etaxonomy.taxeditor.store;singleton:=true
-Bundle-Version: 3.7.1
+Bundle-Version: 3.8.0
Bundle-Activator: eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin
Bundle-Vendor: EDIT
Export-Package: eu.etaxonomy.cdm,
diff --git a/eu.etaxonomy.taxeditor.store/OSGI-INF/l10n/bundle.properties b/eu.etaxonomy.taxeditor.store/OSGI-INF/l10n/bundle.properties
index a13d96793..14ce99859 100644
--- a/eu.etaxonomy.taxeditor.store/OSGI-INF/l10n/bundle.properties
+++ b/eu.etaxonomy.taxeditor.store/OSGI-INF/l10n/bundle.properties
@@ -155,4 +155,7 @@ extension-point.name = Cdm Viewer
Bundle-Vendor = EDIT
Bundle-Name = DataStore Bundle
command.name.13 = delete
-command.name.14 = delete
\ No newline at end of file
+command.name.14 = delete
+page.name.32 = TaxonNavigator
+page.name.33 = Sort of Taxonnodes
+command.name.15 = Open
\ No newline at end of file
diff --git a/eu.etaxonomy.taxeditor.store/OSGI-INF/l10n/bundle_de.properties b/eu.etaxonomy.taxeditor.store/OSGI-INF/l10n/bundle_de.properties
index 28fb041ac..fdc32d069 100644
--- a/eu.etaxonomy.taxeditor.store/OSGI-INF/l10n/bundle_de.properties
+++ b/eu.etaxonomy.taxeditor.store/OSGI-INF/l10n/bundle_de.properties
@@ -129,5 +129,7 @@ page.name.27 = Media
page.name.28 = Checklisten Editor
page.name.29 = Editor Profil
page.name.30 = Sprache
+page.name.32 = TaxonNavigator
+page.name.33 = Sortierung im TaxonNavigator
command.label.clone = Klonen
command.label.openInSpecimenEditor = \u00d6ffnen im Specimen-Editor
\ No newline at end of file
diff --git a/eu.etaxonomy.taxeditor.store/OSGI-INF/l10n/messages.properties b/eu.etaxonomy.taxeditor.store/OSGI-INF/l10n/messages.properties
index 9d02cb1d2..282c00b7f 100644
--- a/eu.etaxonomy.taxeditor.store/OSGI-INF/l10n/messages.properties
+++ b/eu.etaxonomy.taxeditor.store/OSGI-INF/l10n/messages.properties
@@ -15,4 +15,8 @@ LanguageEditorPreferencePage_EditorHasToRestart=The application has to be restar
LanguageEditorPreferencePage_PleaseRestart=Please Restart
LanguageEditorPreferencePage_RestartRequired=After changing the default language, a restart is required,\nin order for the new settings to take effect.
OrderPreferencePage_NewNavigatorWindowRequired=After changing the order of the taxon nodes, closing and reopen of the taxon navigator is required.
-OrderPreferencePage_PleaseReopenNavigator=Please close and reopen the taxon navigator.
\ No newline at end of file
+OrderPreferencePage_PleaseReopenNavigator=Please close and reopen the taxon navigator.
+UriWithLabelElement_URL_NOT_SAVED=URL won't be saved\!
+UriWithLabelElement_COULD_NOT_OPEN_BROWSER=Could not open external browser. URI is invalid.
+UriWithLabelElement_INVALID_URL=Invalid URI
+UriWithLabelElement_OPEN_EXTERNAL_BROWSER=Open in external browser
diff --git a/eu.etaxonomy.taxeditor.store/OSGI-INF/l10n/messages_de.properties b/eu.etaxonomy.taxeditor.store/OSGI-INF/l10n/messages_de.properties
index 3c18fec10..f60b1dc30 100644
--- a/eu.etaxonomy.taxeditor.store/OSGI-INF/l10n/messages_de.properties
+++ b/eu.etaxonomy.taxeditor.store/OSGI-INF/l10n/messages_de.properties
@@ -1,17 +1,21 @@
-CdmDataSourceViewPart_1=Datenquelle wird geladen
-CdmDataSourceViewPart_10=Server
-CdmDataSourceViewPart_11=Name
-CdmDataSourceViewPart_12=Verbunden
-CdmDataSourceViewPart_2=Notizen
-CdmDataSourceViewPart_3=Kompatibel
-CdmDataSourceViewPart_4=CDM Version
-CdmDataSourceViewPart_5=Erstellt
-CdmDataSourceViewPart_6=Nomenklaturcode
-CdmDataSourceViewPart_7=Datenquelle
-CdmDataSourceViewPart_8=Typ
-CdmDataSourceViewPart_9=Verf\u00FCgbar
-LanguageEditorPreferencePage_ChooseDefaultLanguage=Bitte wählen Sie die Standardsprache für den Taxonomischen Editor aus.
-LanguageEditorPreferencePage_EditorHasToRestart=Der Anwendung muss neu gestartet werden, um die Sprache zu wechseln.\nWollen Sie jetzt neu starten?
-LanguageEditorPreferencePage_PleaseRestart=Bitte neu starten
-LanguageEditorPreferencePage_RestartRequired=Nach dem Wechsel der Standardsprache ist ein Neustart erforderlich.
-OrderPreferencePage_NewNavigatorWindowRequired=Nach dem Ändern der Taxon Sortierung, ist das Schließen und erneute Öffnen des taxon Navigators erforderlich.
\ No newline at end of file
+CdmDataSourceViewPart_1=Datenquelle wird geladen
+CdmDataSourceViewPart_10=Server
+CdmDataSourceViewPart_11=Name
+CdmDataSourceViewPart_12=Verbunden
+CdmDataSourceViewPart_2=Notizen
+CdmDataSourceViewPart_3=Kompatibel
+CdmDataSourceViewPart_4=CDM Version
+CdmDataSourceViewPart_5=Erstellt
+CdmDataSourceViewPart_6=Nomenklaturcode
+CdmDataSourceViewPart_7=Datenquelle
+CdmDataSourceViewPart_8=Typ
+CdmDataSourceViewPart_9=Verf\u00FCgbar
+LanguageEditorPreferencePage_ChooseDefaultLanguage=Bitte wählen Sie die Standardsprache für den Taxonomischen Editor aus.
+LanguageEditorPreferencePage_EditorHasToRestart=Der Anwendung muss neu gestartet werden, um die Sprache zu wechseln.\nWollen Sie jetzt neu starten?
+LanguageEditorPreferencePage_PleaseRestart=Bitte neu starten
+LanguageEditorPreferencePage_RestartRequired=Nach dem Wechsel der Standardsprache ist ein Neustart erforderlich.
+OrderPreferencePage_NewNavigatorWindowRequired=Nach dem Ändern der Taxon Sortierung, ist das Schließen und erneute Öffnen des taxon Navigators erforderlich.
+UriWithLabelElement_URL_NOT_SAVED=URL wird nicht gespeichert\!
+UriWithLabelElement_COULD_NOT_OPEN_BROWSER=Externer Browser konnte nicht geöffnet werden. URI ist ung\u00FCtlig.
+UriWithLabelElement_INVALID_URL=Ung\u00FCltige URI
+UriWithLabelElement_OPEN_EXTERNAL_BROWSER=Im Browser öffnen
\ No newline at end of file
diff --git a/eu.etaxonomy.taxeditor.store/plugin.xml b/eu.etaxonomy.taxeditor.store/plugin.xml
index 41a4ad279..320968a8b 100644
--- a/eu.etaxonomy.taxeditor.store/plugin.xml
+++ b/eu.etaxonomy.taxeditor.store/plugin.xml
@@ -206,11 +206,11 @@
id="eu.etaxonomy.taxeditor.preference.defaultlanguagepditorpreferencePage"
name="%page.name.30">
-
+ id="eu.etaxonomy.taxeditor.preference.TaxonNavigator"
+ name="%page.name.32">
+ name="%command.name.15">
eu.etaxonomy
taxeditor-parent
- 3.7.1
+ 3.8.0
4.0.0
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/Messages.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/Messages.java
index 9757c60b1..0aa1e9c64 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/Messages.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/Messages.java
@@ -36,6 +36,10 @@ public class Messages extends NLS {
public static String CdmDataSourceViewPart_7;
public static String CdmDataSourceViewPart_8;
public static String CdmDataSourceViewPart_9;
+ public static String UriWithLabelElement_COULD_NOT_OPEN_BROWSER;
+ public static String UriWithLabelElement_INVALID_URL;
+ public static String UriWithLabelElement_OPEN_EXTERNAL_BROWSER;
+ public static String UriWithLabelElement_URL_NOT_SAVED;
static {
// initialize resource bundle
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/model/IPartContentHasMedia.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/model/IPartContentHasMedia.java
index 3b6997e0a..42bd4714e 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/model/IPartContentHasMedia.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/model/IPartContentHasMedia.java
@@ -1,20 +1,20 @@
// $Id$
/**
-* Copyright (C) 2007 EDIT
-* European Distributed Institute of Taxonomy
-* http://www.e-taxonomy.eu
-*
-* The contents of this file are subject to the Mozilla Public License Version 1.1
-* See LICENSE.TXT at the top of this package for the full license terms.
-*/
+ * Copyright (C) 2007 EDIT
+ * European Distributed Institute of Taxonomy
+ * http://www.e-taxonomy.eu
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * See LICENSE.TXT at the top of this package for the full license terms.
+ */
package eu.etaxonomy.taxeditor.model;
-
/**
*
- * Clients implementing this interface indicate, that the data they present is suitable for the media view
- * and that the media view should handle selection from the implementing part.
+ * Clients implementing this interface indicate, that the data they present is
+ * suitable for the media view and that the media view should handle selection
+ * from the implementing part.
*
* @author pplitzner
* @date Sep 16, 2014
@@ -22,4 +22,12 @@ package eu.etaxonomy.taxeditor.model;
*/
public interface IPartContentHasMedia {
+ /**
+ * Return true
if media can be attached to the editor input and
+ * false
otherwise
+ *
+ * @return true or false depending on the input of the implementing part
+ */
+ public boolean canAttachMedia();
+
}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/model/ImageResources.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/model/ImageResources.java
index 336f39eb8..66f714a87 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/model/ImageResources.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/model/ImageResources.java
@@ -160,6 +160,7 @@ public class ImageResources {
public static final String CHARACTER_DATA_DERIVATE = "character_data_derivate";
+ public static final String WEB = "web";
/***************************************************************************
@@ -381,6 +382,9 @@ public class ImageResources {
registerImage(registry, CHARACTER_DATA_DERIVATE,
"character_data_derivate-16x16-32.png");
+ registerImage(registry, WEB,
+ "web.gif");
+
}
private void registerImage(ImageRegistry registry, String key,
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/model/MessagingUtils.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/model/MessagingUtils.java
index 54c8d498f..b316c2a06 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/model/MessagingUtils.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/model/MessagingUtils.java
@@ -193,6 +193,8 @@ public class MessagingUtils {
contextInfo.add("editor version : " + version);
contextInfo.add("server : " + server + " / " + name);
contextInfo.add("schema version : " + schemaVersion);
+ contextInfo.add("os : " + System.getProperty("os.name")+" "+System.getProperty("os.version")+" "+System.getProperty("os.arch"));
+ contextInfo.add("java : "+System.getProperty("java.version"));
return contextInfo;
}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/store/SearchManager.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/store/SearchManager.java
index 0eb45b3dd..cc437488a 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/store/SearchManager.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/store/SearchManager.java
@@ -13,6 +13,7 @@ package eu.etaxonomy.taxeditor.store;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.UUID;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
@@ -22,6 +23,7 @@ import eu.etaxonomy.cdm.api.service.IGroupService;
import eu.etaxonomy.cdm.api.service.INameService;
import eu.etaxonomy.cdm.api.service.IOccurrenceService;
import eu.etaxonomy.cdm.api.service.IReferenceService;
+import eu.etaxonomy.cdm.api.service.IService;
import eu.etaxonomy.cdm.api.service.ITaxonService;
import eu.etaxonomy.cdm.api.service.IUserService;
import eu.etaxonomy.cdm.api.service.config.IFindTaxaAndNamesConfigurator;
@@ -29,6 +31,7 @@ import eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurato
import eu.etaxonomy.cdm.model.agent.AgentBase;
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
import eu.etaxonomy.cdm.model.common.Group;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
import eu.etaxonomy.cdm.model.common.RelationshipBase;
import eu.etaxonomy.cdm.model.common.User;
@@ -59,15 +62,11 @@ public class SearchManager {
// TODO make this configurable via preferences
private static final int MAX_RESULTS_BEFORE_WARNING = 500;
- /**
- * findNames
- *
- * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator} object.
- * @return a {@link java.util.List} object.
- */
public List findNames(IIdentifiableEntityServiceConfigurator configurator){
if(checkLargeResult(CdmStore.getService(INameService.class).countByTitle(configurator))){
- return CdmStore.getService(INameService.class).findByTitle(configurator).getRecords();
+ List records = CdmStore.getService(INameService.class).findByTitle(configurator).getRecords();
+ addUuidSearchResults(records, configurator, INameService.class);
+ return records;
}
return NO_RESULTS;
}
@@ -75,6 +74,7 @@ public class SearchManager {
public List findNameRelationships(
IIdentifiableEntityServiceConfigurator configurator) {
if(true){
+ //if activated again remember to add uuid search results like in other searches
return NO_RESULTS;
}
@@ -86,62 +86,54 @@ public class SearchManager {
relationships.add((NameRelationship) relationship);
}
}
-
-
return relationships;
-
}
- /**
- * findTaxaAndNames
- *
- * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.ITaxonServiceConfigurator} object.
- * @return a {@link java.util.List} object.
- */
public List> findTaxaAndNames(IFindTaxaAndNamesConfigurator configurator){
return CdmStore.getService(ITaxonService.class).findTaxaAndNamesForEditor(configurator);
}
-
-
-
- /**
- * findReferences
- *
- * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator} object.
- * @return a {@link java.util.List} object.
- */
public List findReferences(IIdentifiableEntityServiceConfigurator configurator){
if(checkLargeResult(CdmStore.getService(IReferenceService.class).countByTitle(configurator))){
- return CdmStore.getService(IReferenceService.class).findByTitle(configurator).getRecords();
+ List records = CdmStore.getService(IReferenceService.class).findByTitle(configurator).getRecords();
+ addUuidSearchResults(records, configurator, IReferenceService.class);
+ return records;
}
return NO_RESULTS;
}
-
- /**
- * findAgents
- *
- * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator} object.
- * @return a {@link java.util.List} object.
- */
public List findAgents(IIdentifiableEntityServiceConfigurator configurator){
if(checkLargeResult(CdmStore.getService(IAgentService.class).countByTitle(configurator))){
- return CdmStore.getService(IAgentService.class).findByTitle(configurator).getRecords();
+ List records = CdmStore.getService(IAgentService.class).findByTitle(configurator).getRecords();
+ addUuidSearchResults(records, configurator, IAgentService.class);
+ return records;
}
return NO_RESULTS;
}
- /**
- * findTeamOrPersons
- *
- * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator} object.
- * @return a {@link java.util.List} object.
- */
+ /**
+ * Check search string if it is a {@link UUID} and, if true
, search for the corresponding entity.
+ * @param records the list to which the search results are added
+ * @param configurator the configurator holding the search string
+ * @param service the service to use for searching
+ */
+ private void addUuidSearchResults(List records, IIdentifiableEntityServiceConfigurator configurator, Class extends IService> service) {
+ String titleSearchString = configurator.getTitleSearchString();
+ try {
+ UUID uuid = UUID.fromString(titleSearchString);
+ T foundRecord = CdmStore.getService(service).find(uuid);
+ if(foundRecord!=null){
+ records.add(foundRecord);
+ }
+ } catch (IllegalArgumentException e) {
+ //search string was no UUID
+ }
+ }
+
@SuppressWarnings("unchecked")
public List findTeamOrPersons(IIdentifiableEntityServiceConfigurator configurator){
- configurator.setClazz(TeamOrPersonBase.class);
- return (List)findAgents(configurator);
+ configurator.setClazz(TeamOrPersonBase.class);
+ return (List)findAgents(configurator);
}
/**
@@ -169,6 +161,7 @@ public class SearchManager {
* @return
*/
public List findOccurrences(IIdentifiableEntityServiceConfigurator configurator, boolean showFieldUnits){
+ List records = new ArrayList();
if(configurator.getClazz()==null){
if(showFieldUnits){
configurator.setClazz(SpecimenOrObservationBase.class);
@@ -179,7 +172,6 @@ public class SearchManager {
}
if(configurator.getClazz().equals(SpecimenOrObservationBase.class)){
//get FieldUnits + DerivedUnits
- List records = new ArrayList();
configurator.setClazz(DerivedUnit.class);
int derivedUnitCount = CdmStore.getService(IOccurrenceService.class).countOccurrences(configurator);
configurator.setClazz(FieldUnit.class);
@@ -191,33 +183,33 @@ public class SearchManager {
configurator.setClazz(FieldUnit.class);
records.addAll(CdmStore.getService(IOccurrenceService.class).findByTitle(configurator).getRecords());
}
- return records;
}
- if(checkLargeResult(CdmStore.getService(IOccurrenceService.class).countOccurrences(configurator))){
- return CdmStore.getService(IOccurrenceService.class).findByTitle(configurator).getRecords();
+ else if(checkLargeResult(CdmStore.getService(IOccurrenceService.class).countOccurrences(configurator))){
+ records = CdmStore.getService(IOccurrenceService.class).findByTitle(configurator).getRecords();
}
- return NO_RESULTS;
+ addUuidSearchResults(records, configurator, IOccurrenceService.class);
+ return records;
}
public List findUsers(IIdentifiableEntityServiceConfigurator configurator){
String userNameSearchString = sqlizeTitleSearchString(configurator);
// TODO why are users not identifiable entities?
- return CdmStore.getService(IUserService.class).listByUsername(userNameSearchString, null, null, null, null, null, null);
+ List records = CdmStore.getService(IUserService.class).listByUsername(userNameSearchString, null, null, null, null, null, null);
+ addUuidSearchResults(records, configurator, IUserService.class);
+ return records;
}
public List findGroups(IIdentifiableEntityServiceConfigurator configurator){
String groupNameSearchString = sqlizeTitleSearchString(configurator);
// TODO why are groups not identifiable entities?
- return CdmStore.getService(IGroupService.class).listByName(groupNameSearchString, null, null, null, null, null, null);
+ List records = CdmStore.getService(IGroupService.class).listByName(groupNameSearchString, null, null, null, null, null, null);
+ addUuidSearchResults(records, configurator, IGroupService.class);
+ return records;
}
- /**
- * @param count
- * @return
- */
private boolean checkLargeResult(int count) {
if(count > MAX_RESULTS_BEFORE_WARNING){
return MessageDialog.openConfirm(Display.getDefault().getActiveShell(), "Large result expected",
@@ -228,18 +220,15 @@ public class SearchManager {
}
}
- /**
- *
- * @param configurator
- * @return
- */
private String sqlizeTitleSearchString(IIdentifiableEntityServiceConfigurator configurator){
return configurator.getTitleSearchString().replace(WILDCARD, "%");
}
public List findTaxa(IIdentifiableEntityServiceConfigurator configurator) {
if(checkLargeResult(CdmStore.getService(ITaxonService.class).countByTitle(configurator))){
- return CdmStore.getService(ITaxonService.class).findByTitle(configurator).getRecords();
+ List records = CdmStore.getService(ITaxonService.class).findByTitle(configurator).getRecords();
+ addUuidSearchResults(records, configurator, ITaxonService.class);
+ return records;
}
return NO_RESULTS;
}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/deleteConfigurator/DeleteConfiguratorDialog.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/deleteConfigurator/DeleteConfiguratorDialog.java
index eb36edac2..647addd10 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/deleteConfigurator/DeleteConfiguratorDialog.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/deleteConfigurator/DeleteConfiguratorDialog.java
@@ -20,6 +20,7 @@ import org.eclipse.swt.widgets.Shell;
import eu.etaxonomy.cdm.api.service.config.DeleteConfiguratorBase;
import eu.etaxonomy.cdm.api.service.config.SpecimenDeleteConfigurator;
import eu.etaxonomy.cdm.api.service.config.TaxonBaseDeletionConfigurator;
+import eu.etaxonomy.cdm.api.service.config.TaxonNodeDeletionConfigurator;
/**
* Abstract subclass of MessageDialog providing the functionality to configure
@@ -49,7 +50,10 @@ public class DeleteConfiguratorDialog extends MessageDialog{
}
else if(configurator instanceof SpecimenDeleteConfigurator){
composite.addConfiguratorComposite(new DeleteSpecimenConfiguratorComposite((SpecimenDeleteConfigurator) configurator, composite.getSectionConfigure(), SWT.NONE));
+ } else if(configurator instanceof TaxonNodeDeletionConfigurator){
+ composite.addConfiguratorComposite(new DeleteNodeConfiguratorComposite((TaxonNodeDeletionConfigurator) configurator, composite.getSectionConfigure(), SWT.NONE));
}
+
return composite;
}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/deleteConfigurator/DeleteNodeConfiguratorComposite.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/deleteConfigurator/DeleteNodeConfiguratorComposite.java
new file mode 100644
index 000000000..490152616
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/deleteConfigurator/DeleteNodeConfiguratorComposite.java
@@ -0,0 +1,76 @@
+package eu.etaxonomy.taxeditor.ui.dialog.deleteConfigurator;
+/**
+* Copyright (C) 2015 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+import org.eclipse.core.databinding.DataBindingContext;
+import org.eclipse.core.databinding.beans.PojoProperties;
+import org.eclipse.core.databinding.observable.value.IObservableValue;
+import org.eclipse.jface.databinding.swt.WidgetProperties;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.layout.RowLayout;
+
+import eu.etaxonomy.cdm.api.service.config.TaxonDeletionConfigurator;
+import eu.etaxonomy.cdm.api.service.config.TaxonNodeDeletionConfigurator;
+/**
+ * @author kluther
+ * @date Jul 13, 2015
+ *
+ */
+public class DeleteNodeConfiguratorComposite extends Composite {
+ // $Id$
+
+ private final DataBindingContext m_bindingContext;
+
+ private final FormToolkit toolkit = new FormToolkit(Display.getCurrent());
+ private final TaxonNodeDeletionConfigurator configurator;
+ private final Button btnDeleteTaxon;
+
+
+ /**
+ * Create the composite.
+ * @param parent
+ * @param style
+ */
+ public DeleteNodeConfiguratorComposite(TaxonNodeDeletionConfigurator configurator, Composite parent, int style) {
+ super(parent, style);
+ this.configurator = configurator;
+ addDisposeListener(new DisposeListener() {
+ @Override
+ public void widgetDisposed(DisposeEvent e) {
+ toolkit.dispose();
+ }
+ });
+ toolkit.paintBordersFor(this);
+ setLayout(new RowLayout(SWT.VERTICAL));
+ setBackground(getBackground());
+
+ btnDeleteTaxon = new Button(this, SWT.CHECK);
+ btnDeleteTaxon.setText("Delete taxon if possible");
+
+ m_bindingContext = initDataBindings();
+
+ }
+
+ protected DataBindingContext initDataBindings() {
+ DataBindingContext bindingContext = new DataBindingContext();
+ //
+ IObservableValue observeSelectionBtnDeleteTaxonObserveWidget = WidgetProperties.selection().observe(btnDeleteTaxon);
+ IObservableValue deleteTaxonIfPossibleConfiguratorObserveValue = PojoProperties.value("deleteTaxon").observe(configurator);
+ bindingContext.bindValue(observeSelectionBtnDeleteTaxonObserveWidget, deleteTaxonIfPossibleConfiguratorObserveValue, null, null);
+ //
+ return bindingContext;
+ }
+ }
+
+
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/selection/TaxonNodeSelectionDialog.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/selection/TaxonNodeSelectionDialog.java
index e2e864bce..a5a3ba167 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/selection/TaxonNodeSelectionDialog.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/selection/TaxonNodeSelectionDialog.java
@@ -1,5 +1,5 @@
/**
- *
+ *
*/
package eu.etaxonomy.taxeditor.ui.dialog.selection;
@@ -31,8 +31,8 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
* @author p.ciardelli
* @version $Id: $
*/
-public class TaxonNodeSelectionDialog extends AbstractFilteredCdmResourceSelectionDialog implements SelectionListener{
-
+public class TaxonNodeSelectionDialog extends AbstractFilteredCdmResourceSelectionDialog implements SelectionListener{
+
/**
* select
*
@@ -44,7 +44,7 @@ public class TaxonNodeSelectionDialog extends AbstractFilteredCdmResourceSelecti
* @return a {@link eu.etaxonomy.cdm.model.taxon.TaxonNode} object.
*/
public static TaxonNode select(Shell shell, ConversationHolder conversation, String title, List excludeTaxa, TaxonNode node, Classification classification) {
- TaxonNodeSelectionDialog dialog = new TaxonNodeSelectionDialog(shell,
+ TaxonNodeSelectionDialog dialog = new TaxonNodeSelectionDialog(shell,
conversation,
title,
excludeTaxa,
@@ -57,8 +57,8 @@ public class TaxonNodeSelectionDialog extends AbstractFilteredCdmResourceSelecti
private Combo classificationSelectionCombo;
private List classifications;
-
- private Classification selectedClassification;
+
+ private Classification selectedClassification;
/**
* Constructor for FilteredTaxonNodeSelectionDialog.
@@ -72,12 +72,12 @@ public class TaxonNodeSelectionDialog extends AbstractFilteredCdmResourceSelecti
*/
protected TaxonNodeSelectionDialog(Shell shell, ConversationHolder conversation, String title, List excludeTaxa, boolean multi, TaxonNode node, Classification classification) {
super(shell, conversation, title, multi, TaxonNodeSelectionDialog.class.getCanonicalName(), node);
-
+
ILabelProvider labelProvider = new FilteredCdmResourceLabelProvider();
setListLabelProvider(labelProvider);
setDetailsLabelProvider(labelProvider);
-
+
if(classification != null){
selectedClassification = classification;
}
@@ -92,36 +92,37 @@ public class TaxonNodeSelectionDialog extends AbstractFilteredCdmResourceSelecti
protected Control createExtendedContentArea(Composite parent) {
return createClassificationSelectionCombo(parent);
}
-
+
/*
* currently disabled tree selection composite
*/
private Control createClassificationSelectionCombo(Composite parent){
// classifications = CdmStore.getTaxonTreeService().list(null, null, null, null, null);
-
+
Composite classificationSelection = new Composite(parent, SWT.NULL);
classificationSelection.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
-
+
GridLayout layout = new GridLayout();
classificationSelection.setLayout(layout);
-
+
Label label = new Label(classificationSelection, SWT.NULL);
// TODO not working is not really true but leave it here to remind everyone that this is under construction
- label.setText("Select Classification (experimental)");
+ label.setText("Select Classification");
classificationSelectionCombo = new Combo(classificationSelection, SWT.BORDER | SWT.READ_ONLY);
classificationSelectionCombo.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, true));
-
+
for(Classification tree : classifications){
classificationSelectionCombo.add(tree.getName().getText(), classifications.indexOf(tree));
+
}
-
+
classificationSelectionCombo.select(classifications.indexOf(selectedClassification));
-
+
// TODO remember last selection
classificationSelectionCombo.addSelectionListener(this);
-
-
-
+
+
+
return classificationSelection;
}
@@ -131,10 +132,10 @@ public class TaxonNodeSelectionDialog extends AbstractFilteredCdmResourceSelecti
if(taxonNode != null && taxonNode.getTaxon() != null){
return taxonNode.getTaxon().getTitleCache();
}
-
+
return "";
}
-
+
/* (non-Javadoc)
* @see eu.etaxonomy.taxeditor.dialogs.AbstractFilteredCdmResourceSelectionDialog#getPersistentObject(java.util.UUID)
*/
@@ -150,15 +151,15 @@ public class TaxonNodeSelectionDialog extends AbstractFilteredCdmResourceSelecti
/** {@inheritDoc} */
@Override
protected void initModel() {
- // default to first tree
- // TODO this will be problematic and can only be seen as workaround
-
-
+ // default to first tree
+ // TODO this will be problematic and can only be seen as workaround
+
+
if(classifications == null){
classifications = CdmStore.getService(IClassificationService.class).list(null, null, null, null, null);
selectedClassification = classifications.iterator().next();
}
-
+
model = CdmStore.getService(IClassificationService.class).getTaxonNodeUuidAndTitleCacheOfAcceptedTaxaByClassification(selectedClassification);
}
@@ -173,17 +174,19 @@ public class TaxonNodeSelectionDialog extends AbstractFilteredCdmResourceSelecti
protected String getNewWizardLinkText() {
return null;
}
-
+
/** {@inheritDoc} */
- public void widgetSelected(SelectionEvent e) {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
selectedClassification = classifications.get(classificationSelectionCombo.getSelectionIndex());
-
+
// refresh();
setPattern(null);
}
/** {@inheritDoc} */
- public void widgetDefaultSelected(SelectionEvent e) {}
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {}
}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/AbstractFormSection.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/AbstractFormSection.java
index 6afa2b7bf..a50561e50 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/AbstractFormSection.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/AbstractFormSection.java
@@ -52,6 +52,11 @@ import eu.etaxonomy.taxeditor.model.MessagingUtils;
//TODO shouldn't ENTITY be bound with super class ICdmBase for example (AbstractFormSection)?
public abstract class AbstractFormSection extends Section implements ISelectionChangedListener, IEntityElement, IConversationEnabled {
+ /**
+ * The default number of columns in detail sections
+ */
+ public static final int DEFAULT_NUM_COLUMNS = 2;
+
private ISelectionProvider selectionProvider;
private ENTITY entity;
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/TextWithLabelElement.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/TextWithLabelElement.java
index d5f7b3105..039b54c0d 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/TextWithLabelElement.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/TextWithLabelElement.java
@@ -9,6 +9,7 @@ import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
@@ -19,10 +20,6 @@ import eu.etaxonomy.cdm.common.CdmUtils;
import eu.etaxonomy.taxeditor.preference.Resources;
/**
- *
- * TextWithLabelElement class.
- *
- *
* @author n.hoffmann
* @version $Id: $
*/
@@ -34,11 +31,14 @@ public class TextWithLabelElement extends AbstractCdmFormElement implements Modi
private final boolean isMultiLine;
- /** Constant MAX_HEIGHT=0
*/
public static final int MAX_HEIGHT = 0;
- /** Constant SINGLE=-1
*/
public static final int SINGLE = -1;
+ protected TextWithLabelElement(CdmFormFactory formFactory, ICdmFormElement parentElement, boolean isMultiLine) {
+ super(formFactory, parentElement);
+ this.isMultiLine = isMultiLine;
+ }
+
protected TextWithLabelElement(CdmFormFactory formFactory, ICdmFormElement parentElement, String labelString,
String initialText, Integer textHeight, int style) {
this(formFactory, parentElement, labelString, initialText, textHeight, null, false, style);
@@ -54,45 +54,19 @@ public class TextWithLabelElement extends AbstractCdmFormElement implements Modi
this(formFactory, parentElement, labelString, initialText, textHeight, textLimit, false, style);
}
- /**
- *
- * Constructor for TextWithLabelElement.
- *
- *
- * @param formFactory
- * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
- * object.
- * @param parentElement
- * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
- * object.
- * @param labelString
- * a {@link java.lang.String} object.
- * @param initialText
- * a {@link java.lang.String} object.
- * @param textHeight
- * a {@link java.lang.Integer} object.
- * @param textLimit max characters allowed to enter
- * @param style
- * a int.
- * @wbp.parser.entryPoint
- */
protected TextWithLabelElement(CdmFormFactory formFactory, ICdmFormElement parentElement, String labelString,
String initialText, Integer textHeight, Integer textLimit, boolean isMultiLine, int style) {
super(formFactory, parentElement);
this.isMultiLine = isMultiLine;
- if (labelString != null) {
- label = formFactory.createLabel(getLayoutComposite(), CdmUtils.Nz(labelString), SWT.NULL);
- addControl(label);
- if(isMultiLine){
- label.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
- }
- else{
- label.setLayoutData(LayoutConstants.LEFT());
- }
- }
+ initLabel(formFactory, labelString, isMultiLine, getLayoutComposite());
+ initText(formFactory, initialText, textHeight, textLimit, isMultiLine, style, getLayoutComposite());
+ }
+
+ protected void initText(CdmFormFactory formFactory, String initialText, Integer textHeight, Integer textLimit,
+ boolean isMultiLine, int style, Composite layoutComposite) {
int scrollStyle = textHeight == null ? SWT.NULL : (SWT.V_SCROLL | SWT.MULTI);
int combinedStyle = style | SWT.BORDER | scrollStyle;
@@ -102,7 +76,7 @@ public class TextWithLabelElement extends AbstractCdmFormElement implements Modi
combinedStyle = combinedStyle | SWT.WRAP;
}
- text = formFactory.createText(getLayoutComposite(), "", combinedStyle);
+ text = formFactory.createText(layoutComposite, "", combinedStyle);
text.setTextLimit(textLimit!=null?textLimit:Text.LIMIT);
addControl(text);
@@ -145,6 +119,19 @@ public class TextWithLabelElement extends AbstractCdmFormElement implements Modi
setText(initialText);
}
+ protected void initLabel(CdmFormFactory formFactory, String labelString, boolean isMultiLine, Composite layoutComposite) {
+ if (labelString != null) {
+ label = formFactory.createLabel(layoutComposite, CdmUtils.Nz(labelString), SWT.NULL);
+ addControl(label);
+ if(isMultiLine){
+ label.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
+ }
+ else{
+ label.setLayoutData(LayoutConstants.LEFT());
+ }
+ }
+ }
+
/**
* Get the text of this composites text composite
*
@@ -174,13 +161,6 @@ public class TextWithLabelElement extends AbstractCdmFormElement implements Modi
}
}
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events
- * .ModifyEvent)
- */
/** {@inheritDoc} */
@Override
public void modifyText(ModifyEvent e) {
@@ -211,9 +191,6 @@ public class TextWithLabelElement extends AbstractCdmFormElement implements Modi
text.setForeground(getColor(symbolicName));
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#isEnabled()
- */
@Override
public boolean isEnabled() {
return text.isEnabled();
@@ -241,36 +218,16 @@ public class TextWithLabelElement extends AbstractCdmFormElement implements Modi
setBackground(selected ? SELECTED : getPersistentBackground());
}
- /*
- * (non-Javadoc)
- *
- * @see eu.etaxonomy.taxeditor.forms.AbstractCdmFormElement#setFocus()
- */
/** {@inheritDoc} */
@Override
public void setFocus() {
text.setFocus();
}
- /**
- *
- * getMainControl
- *
- *
- * @return a {@link org.eclipse.swt.widgets.Control} object.
- */
public Control getMainControl() {
return text;
}
- /**
- *
- * setTextLimit
- *
- *
- * @param limit
- * a int.
- */
public void setTextLimit(int limit) {
text.setTextLimit(limit);
}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/UriWithLabelElement.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/UriWithLabelElement.java
index ee6867db2..b9d6300ec 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/UriWithLabelElement.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/UriWithLabelElement.java
@@ -10,10 +10,27 @@
package eu.etaxonomy.taxeditor.ui.element;
+import java.net.MalformedURLException;
import java.net.URI;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.widgets.TableWrapLayout;
+
+import eu.etaxonomy.taxeditor.Messages;
+import eu.etaxonomy.taxeditor.model.ImageResources;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
+import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
/**
* @author n.hoffmann
@@ -23,14 +40,60 @@ import org.eclipse.swt.widgets.Label;
public class UriWithLabelElement extends TextWithLabelElement {
private final Label labelException;
+ private final Button btnOpenBrowser;
protected UriWithLabelElement(CdmFormFactory formFactory,
ICdmFormElement parentElement, String labelString,
URI initialUri, Integer textHeight, int style) {
- super(formFactory, parentElement, labelString, null, textHeight, style);
+ super(formFactory, parentElement, false);
+
+ //label
+ initLabel(formFactory, labelString, false, getLayoutComposite());
+
+ //composite(uri + button)
+ Composite textAndButton = formFactory.createComposite(getLayoutComposite(), style);
+ addControl(textAndButton);
+ textAndButton.setLayout(LayoutConstants.LAYOUT(2, false));
+ textAndButton.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());
+
+ //uri text
+ initText(formFactory, null, textHeight, null, false, style, textAndButton);
- labelException = formFactory.createLabel(getLayoutComposite(), "", SWT.WRAP);
- labelException.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
+ //button
+ btnOpenBrowser = formFactory.createButton(textAndButton, "", SWT.NONE); //$NON-NLS-1$
+ btnOpenBrowser.setImage(ImageResources.getImage(ImageResources.WEB));
+ btnOpenBrowser.setToolTipText(Messages.UriWithLabelElement_OPEN_EXTERNAL_BROWSER);
+ btnOpenBrowser.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ String errorTitle = Messages.UriWithLabelElement_INVALID_URL;
+ String errorText = Messages.UriWithLabelElement_COULD_NOT_OPEN_BROWSER;
+
+ URI uri = getUri();
+ if(uri!=null){
+ try {
+ PlatformUI.getWorkbench().getBrowserSupport().getExternalBrowser().openURL(uri.toURL());
+ } catch (PartInitException pie) {
+ MessagingUtils.informationDialog(errorTitle, new Status(IStatus.WARNING, TaxeditorStorePlugin.PLUGIN_ID, errorText, pie));
+ } catch (MalformedURLException mue) {
+ MessagingUtils.informationDialog(errorTitle, new Status(IStatus.WARNING, TaxeditorStorePlugin.PLUGIN_ID, errorText, mue));
+ } catch (IllegalArgumentException iae) {
+ MessagingUtils.informationDialog(errorTitle, new Status(IStatus.WARNING, TaxeditorStorePlugin.PLUGIN_ID, errorText, iae));
+ }
+ }
+ else{
+ MessagingUtils.informationDialog(errorTitle, new Status(IStatus.WARNING, TaxeditorStorePlugin.PLUGIN_ID, errorText, null));
+ }
+ }
+ });
+ btnOpenBrowser.setLayoutData(LayoutConstants.RIGHT());
+
+ labelException = formFactory.createLabel(getLayoutComposite(), "", SWT.WRAP); //$NON-NLS-1$
+ int numColumns = AbstractFormSection.DEFAULT_NUM_COLUMNS;
+ if(getLayoutComposite().getLayout() instanceof TableWrapLayout){
+ numColumns = ((TableWrapLayout)getLayoutComposite().getLayout()).numColumns;
+ }
+ labelException.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(numColumns, 1));
addControl(labelException);
setUri(initialUri);
}
@@ -43,10 +106,14 @@ public class UriWithLabelElement extends TextWithLabelElement {
public URI getUri(){
try {
- labelException.setText("");
+ labelException.setFont(JFaceResources.getFontRegistry().get(JFaceResources.DEFAULT_FONT));
+ labelException.setForeground(getPersistentBackground());
+ labelException.setText(""); //$NON-NLS-1$
return new URI(super.getText());
} catch (Exception e) {
- labelException.setText(e.getMessage());
+ labelException.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
+ labelException.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ labelException.setText(Messages.UriWithLabelElement_URL_NOT_SAVED+e.getLocalizedMessage());
return null;
}
}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/AbstractCdmDetailSection.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/AbstractCdmDetailSection.java
index 07f08c704..cf2a786c8 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/AbstractCdmDetailSection.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/AbstractCdmDetailSection.java
@@ -42,27 +42,6 @@ public abstract class AbstractCdmDetailSection extends AbstractFormSecti
protected ICdmDetailElement detailElement;
- /**
- *
- * Constructor for AbstractCdmDetailSection.
- *
- *
- * @param formFactory
- * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
- * object.
- * @param conversation
- * a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
- * object.
- * @param parentElement
- * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
- * object.
- * @param selectionProvider
- * a {@link org.eclipse.jface.viewers.ISelectionProvider} object.
- * @param style
- * a int.
- * @param
- * a ENTITY object.
- */
public AbstractCdmDetailSection(CdmFormFactory formFactory,
ConversationHolder conversation, ICdmFormElement parentElement,
ISelectionProvider selectionProvider, int style) {
@@ -88,15 +67,10 @@ public abstract class AbstractCdmDetailSection extends AbstractFormSecti
}
}
- /**
- * @param abstractCdmDetailSection
- * @param definedTermClass
- * @param null1
- */
protected void createControlsByType(AbstractCdmDetailSection formElement, Class entityClass, int style) {
TableWrapLayout layout = (TableWrapLayout) getLayoutComposite().getLayout();
layout.topMargin = 10;
- layout.numColumns = 2;
+ layout.numColumns = DEFAULT_NUM_COLUMNS;
getLayoutComposite().setLayout(layout);
if(entityClass==null){
@@ -107,19 +81,6 @@ public abstract class AbstractCdmDetailSection extends AbstractFormSecti
}
}
-
- /**
- *
- * createControls
- *
- *
- * @param formElement
- * a
- * {@link eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailSection}
- * object.
- * @param style
- * a int.
- */
protected void createControls(AbstractCdmDetailSection formElement, int style) {
createControlsByType(formElement, null, style);
}
@@ -130,13 +91,6 @@ public abstract class AbstractCdmDetailSection extends AbstractFormSecti
return createCdmDetailElement(parentElement, style);
}
- /**
- *
- * getHeading
- *
- *
- * @return the heading for this section
- */
public abstract String getHeading();
/** {@inheritDoc} */
@@ -152,13 +106,6 @@ public abstract class AbstractCdmDetailSection extends AbstractFormSecti
super.dispose();
}
- /*
- * (non-Javadoc)
- *
- * @see
- * eu.etaxonomy.taxeditor.forms.section.AbstractEditorFormSection#setBackground
- * (org.eclipse.swt.graphics.Color)
- */
/** {@inheritDoc} */
@Override
public void setBackground(Color color) {
@@ -168,14 +115,6 @@ public abstract class AbstractCdmDetailSection extends AbstractFormSecti
super.setBackground(color);
}
- /**
- *
- * setEntity
- *
- *
- * @param entity
- * a ENTITY object.
- */
@Override
public void setEntity(ENTITY entity) {
if (detailElement != null) {
@@ -186,33 +125,24 @@ public abstract class AbstractCdmDetailSection extends AbstractFormSecti
layout();
}
- /**
- *
- * setSectionTitle
- *
- */
protected void setSectionTitle() {
String title = "";
if (getEntity() != null && (getEntity() instanceof IdentifiableEntity) && !(getEntity() instanceof SpecimenOrObservationBase)) {
title = ": " + ((IdentifiableEntity) getEntity()).getTitleCache();
+ // we have to duplicate ampersands otherwise they are treated as
+ // mnenomic (see Label.setText() documentation)
+ // see also #4302
+ title = title.replace("&", "&&");
}
this.setText(String.format("%s%s", getHeading(), title));
setTextClient(createToolbar());
}
- /**
- * @return
- */
protected Control createToolbar() {
ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
return toolBarManager.createControl(this);
}
- /**
- *
- * updateTitle
- *
- */
public void updateTitle() {
if (!isDisposed()) {
setSectionTitle();
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/classification/TaxonNodeDetailElement.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/classification/TaxonNodeDetailElement.java
index c76a96279..cce5f0c6e 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/classification/TaxonNodeDetailElement.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/classification/TaxonNodeDetailElement.java
@@ -51,9 +51,12 @@ public class TaxonNodeDetailElement extends AbstractCdmDetailElement selection_reuseExistingTaxon;
+ private EntitySelectionElement selection_SecRef;
private Taxon taxon;
+ private Reference secReference;
+
private TextWithLabelElement textNewTaxonName;
private CheckboxElement checkbox_openInEditor;
@@ -92,6 +95,9 @@ public class TaxonNodeDetailElement extends AbstractCdmDetailElement
- * DescriptionElementSourceElement class.
- *
- *
+ *
* @author n.hoffmann
* @created Nov 16, 2009
* @version 1.0
- * @param
*/
public class DescriptionElementSourceElement extends
AbstractOriginalSourceElement implements
@@ -38,26 +34,6 @@ public class DescriptionElementSourceElement extends
private EntitySelectionElement selection_name;
- /**
- *
- * Constructor for DescriptionElementSourceElement.
- *
- *
- * @param formElement
- * a {@link eu.etaxonomy.taxeditor.ui.element.AbstractFormSection}
- * object.
- * @param element
- * a
- * {@link eu.etaxonomy.cdm.model.common.DescriptionElementSource}
- * object.
- * @param removeListener
- * a {@link org.eclipse.swt.events.SelectionListener} object.
- * @param style
- * a int.
- * @param cdmFormFactory
- * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
- * object.
- */
public DescriptionElementSourceElement(CdmFormFactory cdmFormFactory,
AbstractFormSection formElement, DescriptionElementSource element,
SelectionListener removeListener, int style) {
@@ -65,12 +41,6 @@ public class DescriptionElementSourceElement extends
formFactory.createSelectionArbitrator(this);
}
- /*
- * (non-Javadoc)
- *
- * @see eu.etaxonomy.taxeditor.forms.entitysections.OriginalSourceComposite#
- * createControls(org.eclipse.swt.widgets.Composite, int)
- */
/** {@inheritDoc} */
@Override
public void createControls(ICdmFormElement formElement, int style) {
@@ -81,13 +51,6 @@ public class DescriptionElementSourceElement extends
null, EntitySelectionElement.ALL, SWT.NULL);
}
- /*
- * (non-Javadoc)
- *
- * @see
- * eu.etaxonomy.taxeditor.forms.section.cdmdetail.AbstractOriginalSourceElement
- * #setElement(eu.etaxonomy.cdm.model.common.OriginalSourceBase)
- */
/** {@inheritDoc} */
@Override
public void setEntity(DescriptionElementSource entity) {
@@ -108,13 +71,6 @@ public class DescriptionElementSourceElement extends
}
- /*
- * (non-Javadoc)
- *
- * @see
- * eu.etaxonomy.taxeditor.section.AbstractEntityCollectionElement#handleEvent
- * (java.lang.Object)
- */
/** {@inheritDoc} */
@Override
public void handleEvent(Object eventSource) {
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/feature/FeatureDistributionDetailElement.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/feature/FeatureDistributionDetailElement.java
index 7da47bb4c..8e4dcea68 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/feature/FeatureDistributionDetailElement.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/feature/FeatureDistributionDetailElement.java
@@ -113,7 +113,7 @@ public class FeatureDistributionDetailElement extends AbstractCdmDetailElement
try {
URI uri = text_uri.getUri();
getEntity().setUri(uri);
-
+ if(uri==null){
+ //buffer URI if parsing error occurred
+ MediaDetailElement parentMediaDetailElement = getParentMediaDetailElement();
+ if(parentMediaDetailElement!=null){
+ parentMediaDetailElement.setUriBuffer(text_uri.getText());
+ }
+ }
loadImage(getEntity().getUri(), true);
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/media/MediaDetailElement.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/media/MediaDetailElement.java
index e05ed4064..1c2766564 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/media/MediaDetailElement.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/media/MediaDetailElement.java
@@ -9,6 +9,7 @@
*/
package eu.etaxonomy.taxeditor.ui.section.media;
+import java.net.URI;
import java.util.List;
import java.util.Set;
@@ -16,6 +17,7 @@ import eu.etaxonomy.cdm.model.media.Media;
import eu.etaxonomy.cdm.model.media.MediaRepresentation;
import eu.etaxonomy.cdm.model.media.MediaRepresentationPart;
import eu.etaxonomy.cdm.model.media.MediaUtils;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
import eu.etaxonomy.taxeditor.preference.IPreferenceKeys;
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
@@ -39,6 +41,11 @@ public class MediaDetailElement extends AbstractCdmDetailElement{
private ICdmFormElement parentFormElement;
private int style;
+ /**
+ * Used to store the URI even if it is invalid and thus cannot be stored in CDM
+ */
+ private String uriBuffer;
+
public MediaDetailElement(CdmFormFactory formFactory, ICdmFormElement formElement) {
super(formFactory, formElement);
}
@@ -63,11 +70,25 @@ public class MediaDetailElement extends AbstractCdmDetailElement{
public void handleEvent(Object eventSource){
if(eventSource==textUri){
textUri.setBackground(getPersistentBackground());
- singleMediaRepresentationPart.setUri(textUri.getUri());
+ URI uri = textUri.getUri();
+ singleMediaRepresentationPart.setUri(uri);
+ if(uri==null){
+ uriBuffer=textUri.getText();
+ }
}
}
- public void toggleAdvancedMediaView(){
+ public void toggleAdvancedMediaView() {
+ if (getEntity().getRepresentations() != null
+ && (getEntity().getRepresentations().size() > 1 ||
+ (getEntity().getRepresentations().size() == 1
+ && getEntity().getRepresentations().iterator().next().getParts().size() > 1))) {
+ MessagingUtils.informationDialog("Toggling not possible",
+ "Media has consists of multiple representations or representatio parts");
+ // toggling is only possible if there are no more than one
+ // MediaRepresentation resp. MediaRepresentationParts
+ return;
+ }
isAdvancedMediaView = !isAdvancedMediaView;
showAdvancedView();
reflowParentScrolledForm(true);
@@ -81,13 +102,23 @@ public class MediaDetailElement extends AbstractCdmDetailElement{
section_mediaRepresentation = formFactory.createMediaRepresentationSection(getConversationHolder(), parentFormElement, style);
section_mediaRepresentation.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
section_mediaRepresentation.setEntity(getEntity());
+ //set buffered uri as text if uri had parsing problems in simple view
+ if(uriBuffer!=null){
+ section_mediaRepresentation.getLayoutComposite().getChildren();
+ }
}
else{
if(section_mediaRepresentation!=null){
removeElementsAndControls(section_mediaRepresentation);
}
textUri = formFactory.createUriWithLabelElement(parentFormElement, "Media URI", null, style);
- textUri.setUri(singleMediaRepresentationPart.getUri());
+ URI uri = singleMediaRepresentationPart.getUri();
+ textUri.setUri(uri);
+ //set buffered uri as text if uri had parsing problems in advanced view
+ if(uri==null && uriBuffer!=null){
+ textUri.setText(uriBuffer);
+ textUri.getUri();
+ }
textUri.getLayoutComposite().layout();
}
}
@@ -116,4 +147,12 @@ public class MediaDetailElement extends AbstractCdmDetailElement{
return isAdvancedMediaView;
}
+ public void setUriBuffer(String uriBuffer) {
+ this.uriBuffer = uriBuffer;
+ }
+
+ public String getUriBuffer() {
+ return uriBuffer;
+ }
+
}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/media/MediaRepresentationPartElement.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/media/MediaRepresentationPartElement.java
index 5a2952547..663848da4 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/media/MediaRepresentationPartElement.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/media/MediaRepresentationPartElement.java
@@ -58,8 +58,14 @@ public class MediaRepresentationPartElement e
text_size.setText(FileUtils.byteCountToDisplaySize(entity.getSize()));
}
if(entity.getUri() != null){
- text_uri.setText(entity.getUri().toString());
- }
+ text_uri.setUri(entity.getUri());
+ } else {
+ String uriBuffer = getParentMediaDetailElement().getUriBuffer();
+ if(uriBuffer!=null){
+ text_uri.setText(uriBuffer);
+ text_uri.getUri();//just to update the error label
+ }
+ }
}
@Override
@@ -67,8 +73,27 @@ public class MediaRepresentationPartElement e
if(eventSource == text_uri){
URI uri = text_uri.getUri();
getEntity().setUri(uri);
+ if(uri==null){
+ //buffer URI if parsing error occurred
+ MediaDetailElement parentMediaDetailElement = getParentMediaDetailElement();
+ if(parentMediaDetailElement!=null){
+ parentMediaDetailElement.setUriBuffer(text_uri.getText());
+ }
+ }
+
firePropertyChangeEvent(this);
}
}
+ protected MediaDetailElement getParentMediaDetailElement() {
+ ICdmFormElement parentElement = getParentElement();
+ while(parentElement!=null){
+ parentElement = parentElement.getParentElement();
+ if(parentElement instanceof MediaDetailElement){
+ return (MediaDetailElement) parentElement;
+ }
+ }
+ return null;
+ }
+
}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/AuthorshipDetailSection.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/AuthorshipDetailSection.java
index 44aa27745..e6f79398c 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/AuthorshipDetailSection.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/AuthorshipDetailSection.java
@@ -23,8 +23,6 @@ import eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailSection;
import eu.etaxonomy.taxeditor.ui.section.ITaxonBaseDetailSection;
/**
- * AuthorshipDetailSection class.
- *
* @author n.hoffmann
* @created 05.06.2009
* @version 1.0
@@ -33,38 +31,11 @@ public class AuthorshipDetailSection extends AbstractCdmDetailSectionConstructor for AuthorshipDetailSection.
- *
- * @param parentElement a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement} object.
- * @param style a int.
- * @param cdmFormFactory a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory} object.
- * @param conversation a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
- * @param selectionProvider a {@link org.eclipse.jface.viewers.ISelectionProvider} object.
- */
public AuthorshipDetailSection(CdmFormFactory cdmFormFactory, ConversationHolder conversation, ICdmFormElement parentElement,
ISelectionProvider selectionProvider, int style) {
super(cdmFormFactory, conversation, parentElement, selectionProvider, style);
}
- /**
- * {@inheritDoc}
- *
- * Author title is not in titleCache field
- * @see eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailSection#setSectionTitle()
- */
- @Override
- protected void setSectionTitle() {
- if(getEntity() != null){
- String title = getHeading() + ": " + getEntity().getAuthorshipCache();
- // we have to duplicate ampersands otherwise they are treated as
- // mnenomic (see Label.setText() documentation)
- // see also #4302
- title = title.replace("&", "&&");
- this.setText(title);
- }
- }
-
/** {@inheritDoc} */
@Override
public void setTaxonBase(TaxonBase entity) {
@@ -73,27 +44,17 @@ public class AuthorshipDetailSection extends AbstractCdmDetailSection createCdmDetailElement(AbstractCdmDetailSection parentElement, int style) {
return formFactory.createAuthorshipDetailElement(parentElement, style);
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/NameTypeDesignationElement.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/NameTypeDesignationElement.java
index bacf0fd93..291694aae 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/NameTypeDesignationElement.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/NameTypeDesignationElement.java
@@ -25,9 +25,6 @@ import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
import eu.etaxonomy.taxeditor.ui.selection.EntitySelectionElement;
/**
- *
- * NameTypeDesignationElement class.
- *
*
* @author n.hoffmann
* @created May 17, 2010
@@ -41,25 +38,6 @@ public class NameTypeDesignationElement extends
private EntitySelectionElement selection_typeName;
private TermComboElement combo_typeStatus;
- /**
- *
- * Constructor for NameTypeDesignationElement.
- *
- *
- * @param formFactory
- * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
- * object.
- * @param section
- * a {@link eu.etaxonomy.taxeditor.ui.element.AbstractFormSection}
- * object.
- * @param entity
- * a {@link eu.etaxonomy.cdm.model.name.NameTypeDesignation}
- * object.
- * @param removeListener
- * a {@link org.eclipse.swt.events.SelectionListener} object.
- * @param style
- * a int.
- */
public NameTypeDesignationElement(CdmFormFactory formFactory,
AbstractFormSection section, NameTypeDesignation entity,
SelectionListener removeListener, int style) {
@@ -116,9 +94,6 @@ public class NameTypeDesignationElement extends
} else if (eventSource == text_referenceDetail) {
getEntity().setCitationMicroReference(
text_referenceDetail.getText());
- } else if (eventSource == text_originaleNameString) {
- getEntity().setOriginalNameString(
- text_originaleNameString.getText());
}
}
}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/NomenclaturalStatusElement.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/NomenclaturalStatusElement.java
index a3ce82144..37ade07a0 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/NomenclaturalStatusElement.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/NomenclaturalStatusElement.java
@@ -26,8 +26,6 @@ import eu.etaxonomy.taxeditor.ui.element.TextWithLabelElement;
import eu.etaxonomy.taxeditor.ui.section.supplemental.AbstractReferencedEntityElement;
/**
- * NomenclaturalStatusElement class.
- *
* @author n.hoffmann
* @created Nov 5, 2009
* @version 1.0
@@ -40,24 +38,12 @@ public class NomenclaturalStatusElement extends AbstractReferencedEntityElement<
private final SelectionArbitrator selectionArbitrator;
- /**
- * Constructor for NomenclaturalStatusElement.
- *
- * @param formElement a {@link eu.etaxonomy.taxeditor.ui.element.AbstractFormSection} object.
- * @param element a {@link eu.etaxonomy.cdm.model.name.NomenclaturalStatus} object.
- * @param removeListener a {@link org.eclipse.swt.events.SelectionListener} object.
- * @param style a int.
- * @param cdmFormFactory a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory} object.
- */
public NomenclaturalStatusElement(CdmFormFactory cdmFormFactory, AbstractFormSection formElement,
NomenclaturalStatus element, SelectionListener removeListener, int style) {
super(cdmFormFactory, formElement, element, removeListener, style);
selectionArbitrator = cdmFormFactory.createSelectionArbitrator(this);
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.forms.entitysections.AbstractEntitySetElementComposite#createControls(org.eclipse.swt.widgets.Composite, int)
- */
/** {@inheritDoc} */
@Override
public void createControls(ICdmFormElement element, int style) {
@@ -67,9 +53,6 @@ public class NomenclaturalStatusElement extends AbstractReferencedEntityElement<
super.createControls(element, style);
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.forms.entitysections.AbstractEntitySetElementComposite#setElement(eu.etaxonomy.cdm.model.common.VersionableEntity)
- */
/** {@inheritDoc} */
@Override
public void setEntity(NomenclaturalStatus entity) {
@@ -88,10 +71,6 @@ public class NomenclaturalStatusElement extends AbstractReferencedEntityElement<
return selectionArbitrator;
}
- /*
- * (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.section.AbstractEntityCollectionElement#handleEvent(java.lang.Object)
- */
/** {@inheritDoc} */
@Override
public void handleEvent(Object eventSource) {
@@ -107,8 +86,5 @@ public class NomenclaturalStatusElement extends AbstractReferencedEntityElement<
else if(eventSource == text_referenceDetail){
getEntity().setCitationMicroReference(text_referenceDetail.getText());
}
- else if(eventSource == text_originaleNameString){
- getEntity().setOriginalNameString(text_originaleNameString.getText());
- }
}
}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/NonViralNameDetailElement.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/NonViralNameDetailElement.java
index d913442db..1213418a5 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/NonViralNameDetailElement.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/NonViralNameDetailElement.java
@@ -26,10 +26,6 @@ import eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailSection;
import eu.etaxonomy.taxeditor.ui.section.AbstractIdentifiableEntityDetailElement;
/**
- *
- * NonViralNameDetailElement class.
- *
- *
* @author n.hoffmann
* @created May 20, 2010
* @version 1.0
@@ -42,67 +38,40 @@ public class NonViralNameDetailElement extends
private EnumComboElement combo_nomenclaturalCode;
private HybridDetailSection section_hybrid;
- /**
- *
- * Constructor for NonViralNameDetailElement.
- *
- *
- * @param formFactory
- * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
- * object.
- * @param formElement
- * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
- * object.
- */
public NonViralNameDetailElement(CdmFormFactory formFactory,
ICdmFormElement formElement) {
super(formFactory, formElement);
}
- /*
- * (non-Javadoc)
- *
- * @see
- * eu.etaxonomy.taxeditor.section.AbstractCdmDetailElement#createControls
- * (eu.etaxonomy.taxeditor.section.AbstractCdmDetailElement,
- * eu.etaxonomy.cdm.model.common.AnnotatableEntity, int)
- */
/** {@inheritDoc} */
@Override
protected void createControls(ICdmFormElement formElement, final NonViralName entity, int style) {
- //name can be null in rare cases. Temporary solution for #4221. May be obsolete when
- //#4393 (Make changing name of a taxon possible in details view) is implemented.
- if(entity==null){
- formFactory.createEmptyElement(formElement, "No name associated with this taxon.");
+ toggleable_cache = formFactory.createToggleableTextField(formElement, "Cache", entity.getTitleCache(), entity.isProtectedTitleCache() || entity.isProtectedFullTitleCache(), style);
+
+ combo_nomenclaturalCode = formFactory.createEnumComboElement(NomenclaturalCode.class, formElement, style);
+ combo_nomenclaturalCode.setSelection(entity.getNomenclaturalCode());
+
+ //TODO RL
+ if(PreferencesUtil.getPreferenceStore().getBoolean(IPreferenceKeys.IS_RL)){
+ toggleable_cache.setVisible(false);
+ combo_nomenclaturalCode.setVisible(false);
}
- else {
- toggleable_cache = formFactory.createToggleableTextField(formElement, "Cache", entity.getTitleCache(), entity.isProtectedTitleCache() || entity.isProtectedFullTitleCache(), style);
-
- combo_nomenclaturalCode = formFactory.createEnumComboElement(NomenclaturalCode.class, formElement, style);
- combo_nomenclaturalCode.setSelection(entity.getNomenclaturalCode());
-
- //TODO RL
- if(PreferencesUtil.getPreferenceStore().getBoolean(IPreferenceKeys.IS_RL)){
- toggleable_cache.setVisible(false);
- combo_nomenclaturalCode.setVisible(false);
- }
-
- section_name = formFactory.createNameDetailSection(getConversationHolder(), formElement, null, ExpandableComposite.TWISTIE | ExpandableComposite.EXPANDED);
- section_name.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
- addControl(section_name);
- addElement(section_name);
- section_author = formFactory.createAuthorshipDetailSection(getConversationHolder(), formElement, null, ExpandableComposite.TWISTIE | ExpandableComposite.EXPANDED);
- section_author.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
- addControl(section_author);
- addElement(section_author);
-
- //TODO RL
- if(!PreferencesUtil.getPreferenceStore().getBoolean(IPreferenceKeys.IS_RL)){
- section_hybrid = formFactory.createHybridDetailSection(getConversationHolder(), formElement, null, ExpandableComposite.TWISTIE);
- section_hybrid.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
- addControl(section_hybrid);
- addElement(section_hybrid);
- }
+
+ section_name = formFactory.createNameDetailSection(getConversationHolder(), formElement, null, ExpandableComposite.TWISTIE | ExpandableComposite.EXPANDED);
+ section_name.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
+ addControl(section_name);
+ addElement(section_name);
+ section_author = formFactory.createAuthorshipDetailSection(getConversationHolder(), formElement, null, ExpandableComposite.TWISTIE | ExpandableComposite.EXPANDED);
+ section_author.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
+ addControl(section_author);
+ addElement(section_author);
+
+ //TODO RL
+ if(!PreferencesUtil.getPreferenceStore().getBoolean(IPreferenceKeys.IS_RL)){
+ section_hybrid = formFactory.createHybridDetailSection(getConversationHolder(), formElement, null, ExpandableComposite.TWISTIE);
+ section_hybrid.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
+ addControl(section_hybrid);
+ addElement(section_hybrid);
}
}
@@ -156,13 +125,6 @@ public class NonViralNameDetailElement extends
}
}
- /*
- * (non-Javadoc)
- *
- * @see
- * eu.etaxonomy.taxeditor.section.AbstractCdmDetailElement#handleEvent(java
- * .lang.Object)
- */
/** {@inheritDoc} */
@Override
public void handleEvent(Object eventSource) {
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/NonViralNameDetailSection.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/NonViralNameDetailSection.java
index a44b2e7b7..4f4c09e06 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/NonViralNameDetailSection.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/NonViralNameDetailSection.java
@@ -36,8 +36,6 @@ import eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailSection;
import eu.etaxonomy.taxeditor.ui.section.ITaxonBaseDetailSection;
/**
- * NonViralNameDetailSection class.
- *
* @author n.hoffmann
* @created May 20, 2010
* @version 1.0
@@ -61,9 +59,6 @@ public class NonViralNameDetailSection extends AbstractCdmDetailSection createCdmDetailElement(AbstractCdmDetailSection parentElement, int style) {
return formFactory.createNonViralNameDetailElement(parentElement);
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/SpecimenTypeDesignationElement.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/SpecimenTypeDesignationElement.java
index 8a6a13fdc..9c8d8014b 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/SpecimenTypeDesignationElement.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/SpecimenTypeDesignationElement.java
@@ -26,10 +26,6 @@ import eu.etaxonomy.taxeditor.ui.element.TextWithLabelElement;
import eu.etaxonomy.taxeditor.ui.selection.EntitySelectionElement;
/**
- *
- * SpecimenTypeDesignationElement class.
- *
- *
* @author n.hoffmann
* @created May 17, 2010
* @version 1.0
@@ -41,25 +37,6 @@ public class SpecimenTypeDesignationElement extends
private EntitySelectionElement selection_typeSpecimen;
private TextWithLabelElement text_specimenTypeText;
- /**
- *
- * Constructor for SpecimenTypeDesignationElement.
- *
- *
- * @param formFactory
- * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
- * object.
- * @param section
- * a {@link eu.etaxonomy.taxeditor.ui.element.AbstractFormSection}
- * object.
- * @param entity
- * a {@link eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation}
- * object.
- * @param removeListener
- * a {@link org.eclipse.swt.events.SelectionListener} object.
- * @param style
- * a int.
- */
public SpecimenTypeDesignationElement(CdmFormFactory formFactory,
AbstractFormSection section, SpecimenTypeDesignation entity,
SelectionListener removeListener, int style) {
@@ -116,9 +93,6 @@ public class SpecimenTypeDesignationElement extends
} else if (eventSource == text_referenceDetail) {
getEntity().setCitationMicroReference(
text_referenceDetail.getText());
- } else if (eventSource == text_originaleNameString) {
- getEntity().setOriginalNameString(
- text_originaleNameString.getText());
}
}
}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/supplemental/AbstractOriginalSourceElement.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/supplemental/AbstractOriginalSourceElement.java
index 6681bfb8b..b84e3534d 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/supplemental/AbstractOriginalSourceElement.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/supplemental/AbstractOriginalSourceElement.java
@@ -10,6 +10,7 @@
package eu.etaxonomy.taxeditor.ui.section.supplemental;
+import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionListener;
import eu.etaxonomy.cdm.model.common.OriginalSourceBase;
@@ -21,8 +22,6 @@ import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
import eu.etaxonomy.taxeditor.ui.element.TextWithLabelElement;
/**
- * Abstract AbstractOriginalSourceElement class.
- *
* @author n.hoffmann
* @created Mar 16, 2010
* @version 1.0
@@ -31,17 +30,8 @@ public abstract class AbstractOriginalSourceElement combo_origsourcetype;
protected TextWithLabelElement text_idInSource;
protected TextWithLabelElement text_idNamespace;
+ protected TextWithLabelElement text_originaleNameString;
- /**
- * Constructor for AbstractOriginalSourceElement.
- *
- * @param formFactory a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory} object.
- * @param section a {@link eu.etaxonomy.taxeditor.ui.element.AbstractFormSection} object.
- * @param element a T object.
- * @param removeListener a {@link org.eclipse.swt.events.SelectionListener} object.
- * @param style a int.
- * @param a T object.
- */
public AbstractOriginalSourceElement(CdmFormFactory formFactory,
AbstractFormSection section,
T element, SelectionListener removeListener,
@@ -49,11 +39,13 @@ public abstract class AbstractOriginalSourceElement
- * Abstract AbstractReferencedEntityElement class.
- *
- *
* @author n.hoffmann
* @created Mar 25, 2010
* @version 1.0
@@ -37,43 +33,12 @@ public abstract class AbstractReferencedEntityElement selection_reference;
protected TextWithLabelElement text_referenceDetail;
- protected TextWithLabelElement text_originaleNameString;
-
- private boolean hasOriginalNameString = false;
-
- /**
- *
- * Constructor for AbstractReferencedEntityElement.
- *
- *
- * @param formFactory
- * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
- * object.
- * @param section
- * a {@link eu.etaxonomy.taxeditor.ui.element.AbstractFormSection}
- * object.
- * @param entity
- * a T object.
- * @param removeListener
- * a {@link org.eclipse.swt.events.SelectionListener} object.
- * @param style
- * a int.
- * @param
- * a T object.
- */
public AbstractReferencedEntityElement(CdmFormFactory formFactory,
AbstractFormSection section, T entity,
SelectionListener removeListener, int style) {
super(formFactory, section, entity, removeListener, null, style);
}
- /*
- * (non-Javadoc)
- *
- * @see
- * eu.etaxonomy.taxeditor.forms.section.AbstractEntityCollectionElement#
- * createControls(eu.etaxonomy.taxeditor.forms.ICdmFormElement, int)
- */
/** {@inheritDoc} */
@Override
public void createControls(ICdmFormElement formElement, int style) {
@@ -83,69 +48,14 @@ public abstract class AbstractReferencedEntityElement
- * setEntity
- *
- *
- * @param entity
- * a T object.
- */
@Override
public void setEntity(T entity) {
this.entity = entity;
selection_reference.setEntity(entity.getCitation());
text_referenceDetail.setText(entity.getCitationMicroReference());
- if (hasOriginalNameString)
- text_originaleNameString.setText(entity.getOriginalNameString());
- // // remove old listeners
- // clearEditButtonSelectionListener();
- //
- // addEditButtonSelectionListener(new
- // BulkEditorOpeningSelectionListener(entity.getCitation()));
- //
- };
-
- //
- // public void addEditButtonSelectionListener(SelectionListener listener){
- // selection_reference.addEditButtonSelectionListener(listener);
- // }
- //
- // public void removeEditButtonSelectionListener(SelectionListener
- // listener){
- // selection_reference.removeEditorButtonSelectionListener(listener);
- // }
- //
- // public void clearEditButtonSelectionListener(){
- // selection_reference.clearEditButtonSelectionListener();
- // }
-
- /**
- *
- * Setter for the field hasOriginalNameString
.
- *
- *
- * @param hasOriginalNameString
- * a boolean.
- */
- public void setHasOriginalNameString(boolean hasOriginalNameString) {
- this.hasOriginalNameString = hasOriginalNameString;
}
- /**
- *
- * hasOriginalNameString
- *
- *
- * @return a boolean.
- */
- public boolean hasOriginalNameString() {
- return hasOriginalNameString;
- }
}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/supplemental/IdentifiableSourceElement.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/supplemental/IdentifiableSourceElement.java
index f28b943e7..a5f50e18a 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/supplemental/IdentifiableSourceElement.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/supplemental/IdentifiableSourceElement.java
@@ -1,5 +1,5 @@
/**
- *
+ *
*/
package eu.etaxonomy.taxeditor.ui.section.supplemental;
@@ -11,41 +11,23 @@ import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
/**
- * IdentifiableSourceElement class.
- *
* @author n.hoffmann
* @created Nov 16, 2009
* @version 1.0
*/
public class IdentifiableSourceElement extends AbstractOriginalSourceElement{
-
- /**
- * Constructor for IdentifiableSourceElement.
- *
- * @param formElement a {@link eu.etaxonomy.taxeditor.ui.element.AbstractFormSection} object.
- * @param element a {@link eu.etaxonomy.cdm.model.common.IdentifiableSource} object.
- * @param removeListener a {@link org.eclipse.swt.events.SelectionListener} object.
- * @param style a int.
- * @param cdmFormFactory a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory} object.
- */
+
public IdentifiableSourceElement(CdmFormFactory cdmFormFactory, AbstractFormSection formElement, IdentifiableSource element,
SelectionListener removeListener, int style) {
super(cdmFormFactory, formElement, element, removeListener, style);
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.forms.entitysections.AbstractEntitySetElementComposite#createControls(org.eclipse.swt.widgets.Composite, int)
- */
/** {@inheritDoc} */
@Override
public void createControls(ICdmFormElement formElement, int style) {
super.createControls(formElement, style);
}
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.forms.entitysections.AbstractEntitySetElementComposite#setElement(eu.etaxonomy.cdm.model.common.VersionableEntity)
- */
/** {@inheritDoc} */
@Override
public void setEntity(IdentifiableSource entity) {
@@ -56,9 +38,9 @@ public class IdentifiableSourceElement extends AbstractOriginalSourceElementTaxonBaseDetailSection class.
- *
* @author n.hoffmann
* @created Nov 4, 2009
* @version 1.0
*/
public class TaxonBaseDetailSection extends AbstractCdmDetailSection {
- /**
- * Constructor for TaxonBaseDetailSection.
- *
- * @param parentElement a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement} object.
- * @param style a int.
- * @param cdmFormFactory a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory} object.
- * @param conversation a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
- * @param selectionProvider a {@link org.eclipse.jface.viewers.ISelectionProvider} object.
- */
public TaxonBaseDetailSection(CdmFormFactory cdmFormFactory, ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style) {
super(cdmFormFactory, conversation, parentElement, selectionProvider, style);
}
@@ -47,26 +36,9 @@ public class TaxonBaseDetailSection extends AbstractCdmDetailSection
return getEntity() != null ? getEntity().getClass().getSimpleName() : "TaxonBase";
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailSection#createCdmDetailElement(eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailSection, int)
- */
@Override
protected AbstractCdmDetailElement createCdmDetailElement(AbstractCdmDetailSection parentElement, int style) {
return formFactory.createTaxonBaseDetailElement(parentElement, style);
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailSection#setSectionTitle()
- */
- @Override
- protected void setSectionTitle() {
- super.setSectionTitle();
- String title = getText();
- // we have to duplicate ampersands otherwise they are treated as
- // mnenomic (see Label.setText() documentation)
- // see also #4302
- title = title.replace("&", "&&");
- setText(title);
- }
-
}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateSearchView.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateSearchView.java
index 9f950fa3f..93c229adf 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateSearchView.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateSearchView.java
@@ -39,9 +39,6 @@ public class DerivateSearchView extends ViewPart implements IContextListener {
CdmStore.getContextManager().addContextListener(this);
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
- */
@Override
public void createPartControl(Composite parent) {
derivateSearchCompositeController = new DerivateSearchCompositeController(parent, this);
@@ -56,9 +53,6 @@ public class DerivateSearchView extends ViewPart implements IContextListener {
control.setMenu(menu);
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
- */
@Override
public void setFocus() {
derivateSearchCompositeController.setFocus();
@@ -68,33 +62,21 @@ public class DerivateSearchView extends ViewPart implements IContextListener {
}
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.model.IContextListener#contextAboutToStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
public void contextStop(IMemento memento, IProgressMonitor monitor) {
derivateSearchCompositeController.setEnabled(false);
derivateSearchCompositeController.reset();
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStart(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
public void contextStart(IMemento memento, IProgressMonitor monitor) {
derivateSearchCompositeController.setEnabled(true);
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.model.IContextListener#contextRefresh(org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
public void contextRefresh(IProgressMonitor monitor) {
initConversation();
@@ -107,20 +89,24 @@ public class DerivateSearchView extends ViewPart implements IContextListener {
}
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.model.IContextListener#workbenchShutdown(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
- */
@Override
public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
}
- /**
- * @return the conversationHolder
- */
public ConversationHolder getConversationHolder() {
if(CdmStore.isActive() && conversationHolder==null){
initConversation();
}
return conversationHolder;
}
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void dispose() {
+ if(conversationHolder!=null){
+ conversationHolder.close();
+ }
+ }
}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/detail/DetailsViewer.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/detail/DetailsViewer.java
index 04bb9207f..4856e3ff7 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/detail/DetailsViewer.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/detail/DetailsViewer.java
@@ -204,7 +204,12 @@ public class DetailsViewer extends AbstractCdmDataViewer {
destroySections();
if (input instanceof TaxonBase) {
- createTaxonSections(rootElement);
+ if(((TaxonBase) input).getName()==null){
+ createEmptySection(rootElement);
+ }
+ else{
+ createTaxonSections(rootElement);
+ }
} else if (input instanceof NonViralName) {
createNameSections(rootElement);
diff --git a/eu.etaxonomy.taxeditor/eu.etaxonomy.taxeditor.product b/eu.etaxonomy.taxeditor/eu.etaxonomy.taxeditor.product
index f65fba05d..68228dae9 100644
--- a/eu.etaxonomy.taxeditor/eu.etaxonomy.taxeditor.product
+++ b/eu.etaxonomy.taxeditor/eu.etaxonomy.taxeditor.product
@@ -1,5 +1,5 @@
-
+
diff --git a/eu.etaxonomy.taxeditor/eu.etaxonomy.taxeditor.product.with.jre b/eu.etaxonomy.taxeditor/eu.etaxonomy.taxeditor.product.with.jre
new file mode 100644
index 000000000..7998db3a2
--- /dev/null
+++ b/eu.etaxonomy.taxeditor/eu.etaxonomy.taxeditor.product.with.jre
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+ %productBlurb
+
+
+
+
+
+
+
+ -data @user.home/.cdmLibrary -Dserver_port=58080
+
+ -vm jre/bin
+
+ -vm ../../../jre/Contents/Home/jre/lib/jli/libjli.dylib
+
+ -vm jre/bin
+
+ -vm jre/bin
+
+ -Xmx512M -XX:MaxPermSize=256M -Dorg.eclipse.update.reconcile=false -Declipse.p2.unsignedPolicy=allow
+
+ -XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/eu.etaxonomy.taxeditor/pom.xml b/eu.etaxonomy.taxeditor/pom.xml
index fc92919c5..090a3d224 100644
--- a/eu.etaxonomy.taxeditor/pom.xml
+++ b/eu.etaxonomy.taxeditor/pom.xml
@@ -2,7 +2,7 @@
eu.etaxonomy
taxeditor-parent
- 3.7.1
+ 3.8.0
4.0.0
@@ -132,4 +132,4 @@
-
\ No newline at end of file
+
diff --git a/eu.etaxonomy.taxeditor/rcp.target b/eu.etaxonomy.taxeditor/rcp.target
index 7f4ff50a2..f01bba3f6 100644
--- a/eu.etaxonomy.taxeditor/rcp.target
+++ b/eu.etaxonomy.taxeditor/rcp.target
@@ -20,6 +20,7 @@
+
diff --git a/pom.xml b/pom.xml
index 5fa3888e4..47a3120df 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
eu.etaxonomy
taxeditor-parent
- 3.7.1
+ 3.8.0
EDIT Taxonomic Editor
The Taxonomic Editor for EDIT's platform for
cybertaxonomy
@@ -18,9 +18,10 @@
1.6
UTF-8
- 3.7.0
+ 3.8.0
+
0.22.0
- 3.7.0
+ 3.8.0
snapshot
@@ -31,6 +32,8 @@
eu.etaxonomy.taxeditor.bulkeditor
eu.etaxonomy.taxeditor.printpublisher
eu.etaxonomy.taxeditor.help
+ eu.etaxonomy.taxeditor.molecular
+ eu.etaxonomy.taxeditor.molecular.lib
eu.etaxonomy.taxeditor.application
eu.etaxonomy.taxeditor.feature.platform
eu.etaxonomy.taxeditor.feature