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)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> 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