From: U-BGBM\k.luther Date: Tue, 18 Aug 2015 12:45:59 +0000 (+0200) Subject: Merge branch 'develop' of ssh://dev.e-taxonomy.eu/var/git/taxeditor into develop X-Git-Tag: 3.8.0^2~43^2~18 X-Git-Url: https://dev.e-taxonomy.eu/gitweb/taxeditor.git/commitdiff_plain/6950e78357270c053c53956ca46876ea7193e642?hp=e8f9b86d370a55936f193922b794f168886df859 Merge branch 'develop' of ssh://dev.e-taxonomy.eu/var/git/taxeditor into develop --- diff --git a/eu.etaxonomy.taxeditor.application/META-INF/MANIFEST.MF b/eu.etaxonomy.taxeditor.application/META-INF/MANIFEST.MF index 81bdf0a83..6a5c28686 100644 --- a/eu.etaxonomy.taxeditor.application/META-INF/MANIFEST.MF +++ b/eu.etaxonomy.taxeditor.application/META-INF/MANIFEST.MF @@ -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..f6e4ab946 100644 --- a/eu.etaxonomy.taxeditor.application/plugin.xml +++ b/eu.etaxonomy.taxeditor.application/plugin.xml @@ -414,7 +414,7 @@ id="eu_etaxonomy_taxeditor_product" point="org.eclipse.core.runtime.products"> 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/derivate/DerivateView.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateView.java index 7548960d9..a7845395e 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 @@ -166,7 +166,7 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa DerivateViewEditorInput derivateViewEditorInput = (DerivateViewEditorInput) getEditorInput(); return derivateViewEditorInput.getName(); } - return "Derivative View"; + return "Derivative Editor"; } /* (non-Javadoc) 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..9931904ff 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 @@ -63,7 +63,7 @@ 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()); return Status.CANCEL_STATUS; } if(derivateView.isDirty()){ diff --git a/eu.etaxonomy.taxeditor.feature/feature.xml b/eu.etaxonomy.taxeditor.feature/feature.xml index 0f59e5e90..71062e2e8 100644 --- a/eu.etaxonomy.taxeditor.feature/feature.xml +++ b/eu.etaxonomy.taxeditor.feature/feature.xml @@ -114,4 +114,18 @@ version="0.0.0" unpack="false"/> + + + + 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..3ee9c828b --- /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.qualifier +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..5700ef85e --- /dev/null +++ b/eu.etaxonomy.taxeditor.molecular.lib/pom.xml @@ -0,0 +1,189 @@ + + 4.0.0 + eu.etaxonomy.taxeditor + eu.etaxonomy.taxeditor.molecular.lib + eclipse-plugin + + + eu.etaxonomy + taxeditor-parent + 3.8.0-SNAPSHOT + + + + + + 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..05dba64f1 --- /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.qualifier +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..20e8acae0 --- /dev/null +++ b/eu.etaxonomy.taxeditor.molecular/plugin.xml @@ -0,0 +1,309 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/eu.etaxonomy.taxeditor.molecular/pom.xml b/eu.etaxonomy.taxeditor.molecular/pom.xml new file mode 100644 index 000000000..1e91c23b5 --- /dev/null +++ b/eu.etaxonomy.taxeditor.molecular/pom.xml @@ -0,0 +1,17 @@ + + + + eu.etaxonomy + taxeditor-parent + 3.8.0-SNAPSHOT + + + 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..315e92df1 --- /dev/null +++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/editor/AlignmentEditor.java @@ -0,0 +1,721 @@ +// $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.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.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); + } + + + /* (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); + // 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/SpecimenPropertyTester.java b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/SpecimenPropertyTester.java new file mode 100644 index 000000000..0a59a70ec --- /dev/null +++ b/eu.etaxonomy.taxeditor.molecular/src/main/java/eu/etaxonomy/taxeditor/molecular/handler/SpecimenPropertyTester.java @@ -0,0 +1,58 @@ +package eu.etaxonomy.taxeditor.molecular.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() {} + + + /* (non-Javadoc) + * @see org.eclipse.core.expressions.IPropertyTester#test(java.lang.Object, java.lang.String, java.lang.Object[], java.lang.Object) + */ + /** {@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.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/pom.xml b/pom.xml index 45b3087ba..6685cc15f 100644 --- a/pom.xml +++ b/pom.xml @@ -32,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