JAL-1665 create dataset sequences in applet
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Fri, 20 Feb 2015 11:53:18 +0000 (11:53 +0000)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Fri, 20 Feb 2015 11:53:18 +0000 (11:53 +0000)
src/jalview/appletgui/CutAndPasteTransfer.java
src/jalview/datamodel/Sequence.java
src/jalview/renderer/seqfeatures/FeatureRenderer.java
src/jalview/viewmodel/seqfeatures/FeatureRendererModel.java

index 0a9ca56..0c717b2 100644 (file)
@@ -26,6 +26,7 @@ import jalview.datamodel.Sequence;
 import jalview.io.AnnotationFile;
 import jalview.io.AppletFormatAdapter;
 import jalview.io.IdentifyFile;
+import jalview.io.NewickFile;
 import jalview.io.TCoffeeScoreFile;
 import jalview.schemes.TCoffeeColourScheme;
 import jalview.util.MessageManager;
@@ -142,149 +143,194 @@ public class CutAndPasteTransfer extends Panel implements ActionListener,
 
     if (pdbImport)
     {
-      PDBEntry pdb = new PDBEntry();
-      pdb.setFile(text);
+      openPdbViewer(text);
 
-      if (alignFrame.alignPanel.av.applet.jmolAvailable)
-      {
-        new jalview.appletgui.AppletJmol(pdb, new Sequence[]
-        { seq }, null, alignFrame.alignPanel, AppletFormatAdapter.PASTE);
-      }
-      else
+    }
+    else if (treeImport)
+    {
+      if (!loadTree())
       {
-        new MCview.AppletPDBViewer(pdb, new Sequence[]
-        { seq }, null, alignFrame.alignPanel, AppletFormatAdapter.PASTE);
+        return;
       }
+    }
+    else if (annotationImport)
+    {
+      loadAnnotations();
+    }
+    else if (alignFrame != null)
+    {
+      loadAlignment(text, newWindow);
+    }
 
+    // TODO: dialog should indicate if data was parsed correctly or not - see
+    // JAL-1102
+    if (this.getParent() instanceof Frame)
+    {
+      ((Frame) this.getParent()).setVisible(false);
     }
-    else if (treeImport)
+    else
     {
-      try
-      {
-        jalview.io.NewickFile fin = new jalview.io.NewickFile(
-                textarea.getText(), "Paste");
+      ((Dialog) this.getParent()).setVisible(false);
+    }
+  }
 
-        fin.parse();
-        if (fin.getTree() != null)
-        {
-          alignFrame.loadTree(fin, "Pasted tree file");
-        }
+  /**
+   * Parses text as Newick Tree format, and loads on to the alignment. Returns
+   * true if successful, else false.
+   */
+  protected boolean loadTree()
+  {
+    try
+    {
+      NewickFile fin = new NewickFile(textarea.getText(), "Paste");
 
-      } catch (Exception ex)
+      fin.parse();
+      if (fin.getTree() != null)
       {
-        // TODO: JAL-1102 - should have a warning message in dialog, not simply
-        // overwrite the broken input data with the exception
-        textarea.setText(MessageManager.formatMessage(
-                "label.could_not_parse_newick_file", new String[]
-                { ex.getMessage() }));
-        return;
+        alignFrame.loadTree(fin, "Pasted tree file");
+        return true;
       }
+    } catch (Exception ex)
+    {
+      // TODO: JAL-1102 - should have a warning message in dialog, not simply
+      // overwrite the broken input data with the exception
+      textarea.setText(MessageManager.formatMessage(
+              "label.could_not_parse_newick_file", new Object[]
+              { ex.getMessage() }));
+      return false;
     }
-    else if (annotationImport)
+    return false;
+  }
+
+  /**
+   * Parse text as an alignment file and add to the current or a new window.
+   * 
+   * @param text
+   * @param newWindow
+   */
+  protected void loadAlignment(String text, boolean newWindow)
+  {
+    Alignment al = null;
+
+    String format = new IdentifyFile().Identify(text,
+            AppletFormatAdapter.PASTE);
+    try
+    {
+      al = new AppletFormatAdapter().readFile(text,
+              AppletFormatAdapter.PASTE, format);
+    } catch (java.io.IOException ex)
+    {
+      ex.printStackTrace();
+    }
+
+    if (al != null)
     {
-      TCoffeeScoreFile tcf = null;
-      try
+      al.setDataset(null);
+      if (newWindow)
       {
-        tcf = new TCoffeeScoreFile(textarea.getText(),
-                jalview.io.AppletFormatAdapter.PASTE);
-        if (tcf.isValid())
-        {
-          if (tcf.annotateAlignment(alignFrame.viewport.getAlignment(),
-                  true))
-          {
-            alignFrame.tcoffeeColour.setEnabled(true);
-            alignFrame.alignPanel.fontChanged();
-            alignFrame.changeColour(new TCoffeeColourScheme(
-                    alignFrame.viewport.getAlignment()));
-            alignFrame.statusBar
-                    .setText(MessageManager
-                            .getString("label.successfully_pasted_tcoffee_scores_to_alignment"));
-          }
-          else
-          {
-            // file valid but didn't get added to alignment for some reason
-            alignFrame.statusBar.setText(MessageManager.formatMessage(
-                    "label.failed_add_tcoffee_scores",
-                    new String[]
-                    { (tcf.getWarningMessage() != null ? tcf
-                            .getWarningMessage() : "") }));
-          }
-        }
-        else
-        {
-          tcf = null;
-        }
-      } catch (Exception x)
+        AlignFrame af = new AlignFrame(al, alignFrame.viewport.applet,
+                "Cut & Paste input - " + format, false);
+        af.statusBar
+                .setText(MessageManager
+                        .getString("label.successfully_pasted_annotation_to_alignment"));
+      }
+      else
       {
-        tcf = null;
+        alignFrame.addSequences(al.getSequencesArray());
+        alignFrame.statusBar.setText(MessageManager
+                .getString("label.successfully_pasted_alignment_file"));
       }
-      if (tcf == null)
+    }
+  }
+
+  /**
+   * Parse the text as a TCoffee score file, if successful add scores as
+   * alignment annotations.
+   */
+  protected void loadAnnotations()
+  {
+    TCoffeeScoreFile tcf = null;
+    try
+    {
+      tcf = new TCoffeeScoreFile(textarea.getText(),
+              jalview.io.AppletFormatAdapter.PASTE);
+      if (tcf.isValid())
       {
-        if (new AnnotationFile().annotateAlignmentView(alignFrame.viewport,
-                textarea.getText(),
-                jalview.io.AppletFormatAdapter.PASTE))
+        if (tcf.annotateAlignment(alignFrame.viewport.getAlignment(),
+                true))
         {
+          alignFrame.tcoffeeColour.setEnabled(true);
           alignFrame.alignPanel.fontChanged();
-          alignFrame.alignPanel.setScrollValues(0, 0);
+          alignFrame.changeColour(new TCoffeeColourScheme(
+                  alignFrame.viewport.getAlignment()));
           alignFrame.statusBar
                   .setText(MessageManager
-                          .getString("label.successfully_pasted_annotation_to_alignment"));
-
+                          .getString("label.successfully_pasted_tcoffee_scores_to_alignment"));
         }
         else
         {
-          if (!alignFrame.parseFeaturesFile(textarea.getText(),
-                  jalview.io.AppletFormatAdapter.PASTE))
-          {
-            alignFrame.statusBar
-                    .setText(MessageManager
-                            .getString("label.couldnt_parse_pasted_text_as_valid_annotation_feature_GFF_tcoffee_file"));
-          }
+          // file valid but didn't get added to alignment for some reason
+          alignFrame.statusBar.setText(MessageManager.formatMessage(
+                  "label.failed_add_tcoffee_scores",
+                  new Object[]
+                  { (tcf.getWarningMessage() != null ? tcf
+                          .getWarningMessage() : "") }));
         }
       }
+      else
+      {
+        tcf = null;
+      }
+    } catch (Exception x)
+    {
+      tcf = null;
     }
-    else if (alignFrame != null)
+    if (tcf == null)
     {
-      Alignment al = null;
-
-      String format = new IdentifyFile().Identify(text,
-              AppletFormatAdapter.PASTE);
-      try
-      {
-        al = new AppletFormatAdapter().readFile(text,
-                AppletFormatAdapter.PASTE, format);
-      } catch (java.io.IOException ex)
+      if (new AnnotationFile().annotateAlignmentView(alignFrame.viewport,
+              textarea.getText(),
+              jalview.io.AppletFormatAdapter.PASTE))
       {
-        ex.printStackTrace();
-      }
+        alignFrame.alignPanel.fontChanged();
+        alignFrame.alignPanel.setScrollValues(0, 0);
+        alignFrame.statusBar
+                .setText(MessageManager
+                        .getString("label.successfully_pasted_annotation_to_alignment"));
 
-      if (al != null)
+      }
+      else
       {
-        if (newWindow)
+        if (!alignFrame.parseFeaturesFile(textarea.getText(),
+                jalview.io.AppletFormatAdapter.PASTE))
         {
-          AlignFrame af = new AlignFrame(al, alignFrame.viewport.applet,
-                  "Cut & Paste input - " + format, false);
-          af.statusBar
+          alignFrame.statusBar
                   .setText(MessageManager
-                          .getString("label.successfully_pasted_annotation_to_alignment"));
-        }
-        else
-        {
-          alignFrame.addSequences(al.getSequencesArray());
-          alignFrame.statusBar.setText(MessageManager
-                  .getString("label.successfully_pasted_alignment_file"));
+                          .getString("label.couldnt_parse_pasted_text_as_valid_annotation_feature_GFF_tcoffee_file"));
         }
       }
     }
-    // TODO: dialog should indicate if data was parsed correctly or not - see
-    // JAL-1102
-    if (this.getParent() instanceof Frame)
+  }
+
+  /**
+   * Open a Jmol viewer (if available), failing that the built-in PDB viewer,
+   * passing the input text as the PDB file data.
+   * 
+   * @param text
+   */
+  protected void openPdbViewer(String text)
+  {
+    PDBEntry pdb = new PDBEntry();
+    pdb.setFile(text);
+
+    if (alignFrame.alignPanel.av.applet.jmolAvailable)
     {
-      ((Frame) this.getParent()).setVisible(false);
+      new jalview.appletgui.AppletJmol(pdb, new Sequence[]
+      { seq }, null, alignFrame.alignPanel, AppletFormatAdapter.PASTE);
     }
     else
     {
-      ((Dialog) this.getParent()).setVisible(false);
+      new MCview.AppletPDBViewer(pdb, new Sequence[]
+      { seq }, null, alignFrame.alignPanel, AppletFormatAdapter.PASTE);
     }
   }
 
index 1479d94..78853c7 100755 (executable)
@@ -327,13 +327,26 @@ public class Sequence implements SequenceI
   }
 
   /**
-   * DOCUMENT ME!
+   * Returns the sequence features (if any), looking first on the sequence, then
+   * on its dataset sequence, and so on until a non-null value is found (or
+   * none). This supports retrieval of sequence features stored on the sequence
+   * (as in the applet) or on the dataset sequence (as in the Desktop version).
    * 
-   * @return DOCUMENT ME!
+   * @return
    */
   public SequenceFeature[] getSequenceFeatures()
   {
-    return sequenceFeatures;
+    SequenceFeature[] features = sequenceFeatures;
+
+    SequenceI seq = this;
+    int count = 0; // failsafe against loop in sequence.datasetsequence...
+    while (features == null && seq.getDatasetSequence() != null
+            && count++ < 10)
+    {
+      seq = seq.getDatasetSequence();
+      features = ((Sequence) seq).sequenceFeatures;
+    }
+    return features;
   }
 
   public void addPDBId(PDBEntry entry)
index 5e6ac29..fa91342 100644 (file)
@@ -188,12 +188,11 @@ public class FeatureRenderer extends
       return initialCol;
     }
 
-    final SequenceI aseq = (seq.getDatasetSequence() != null) ? seq
-            .getDatasetSequence() : seq;
+    SequenceFeature[] sf = seq.getSequenceFeatures();
     if (seq != lastSeq)
     {
       lastSeq = seq;
-      sequenceFeatures = aseq.getSequenceFeatures();
+      sequenceFeatures = sf;
       if (sequenceFeatures != null)
       {
         sfSize = sequenceFeatures.length;
@@ -201,9 +200,9 @@ public class FeatureRenderer extends
     }
     else
     {
-      if (sequenceFeatures != aseq.getSequenceFeatures())
+      if (sequenceFeatures != sf)
       {
-        sequenceFeatures = aseq.getSequenceFeatures();
+        sequenceFeatures = sf;
         if (sequenceFeatures != null)
         {
           sfSize = sequenceFeatures.length;
@@ -268,10 +267,8 @@ public class FeatureRenderer extends
   public synchronized void drawSequence(Graphics g, final SequenceI seq,
           int start, int end, int y1)
   {
-    final SequenceI aseq = (seq.getDatasetSequence() != null) ? seq
-            .getDatasetSequence() : seq;
-    if (aseq.getSequenceFeatures() == null
-            || aseq.getSequenceFeatures().length == 0)
+    SequenceFeature[] sf = seq.getSequenceFeatures();
+    if (sf == null || sf.length == 0)
     {
       return;
     }
@@ -284,10 +281,10 @@ public class FeatureRenderer extends
     updateFeatures();
 
     if (lastSeq == null || seq != lastSeq
-            || aseq.getSequenceFeatures() != sequenceFeatures)
+ || sf != sequenceFeatures)
     {
       lastSeq = seq;
-      sequenceFeatures = aseq.getSequenceFeatures();
+      sequenceFeatures = sf;
     }
 
     if (transparency != 1 && g != null)
index c7cee04..8c2f0da 100644 (file)
@@ -329,9 +329,7 @@ public abstract class FeatureRendererModel implements
     for (int i = 0; i < alignment.getHeight(); i++)
     {
       SequenceI asq = alignment.getSequenceAt(i);
-      SequenceI dasq = asq.getDatasetSequence();
-      SequenceFeature[] features = dasq != null ? dasq
-              .getSequenceFeatures() : asq.getSequenceFeatures();
+      SequenceFeature[] features = asq.getSequenceFeatures();
 
       if (features == null)
       {