Copy and paste uses FASTA format
[jalview.git] / src / jalview / gui / AlignFrame.java
index ba9237b..9762258 100755 (executable)
@@ -68,6 +68,17 @@ public class AlignFrame
   {\r
     viewport = new AlignViewport(al);\r
 \r
+    if(viewport.vconsensus==null)\r
+    {\r
+      //Out of memory caluclating consensus.\r
+      BLOSUM62Colour.setEnabled(false);\r
+      PIDColour.setEnabled(false);\r
+      conservationMenuItem.setEnabled(false);\r
+      modifyConservation.setEnabled(false);\r
+      abovePIDThreshold.setEnabled(false);\r
+      modifyPID.setEnabled(false);\r
+    }\r
+\r
     alignPanel = new AlignmentPanel(this, viewport);\r
     alignPanel.annotationPanel.adjustPanelHeight();\r
     alignPanel.annotationSpaceFillerHolder.setPreferredSize(alignPanel.\r
@@ -96,6 +107,7 @@ public class AlignFrame
      }\r
    });\r
 \r
+\r
     addServiceListeners();\r
   }\r
 \r
@@ -548,15 +560,16 @@ public class AlignFrame
   {\r
     if (viewport.getSelectionGroup() == null)\r
     {\r
+      System.out.println("null here");\r
       return;\r
     }\r
 \r
     SequenceGroup sg = viewport.getSelectionGroup();\r
 \r
     Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();\r
-    StringBuffer buffer = new StringBuffer();\r
 \r
     Hashtable orderedSeqs = new Hashtable();\r
+    SequenceI [] seqs = new SequenceI[sg.getSize()];\r
 \r
     for (int i = 0; i < sg.getSize(); i++)\r
     {\r
@@ -586,6 +599,8 @@ public class AlignFrame
           index++;\r
         }\r
       }\r
+\r
+\r
       //FIND START RES\r
       //Returns residue following index if gap\r
       startRes = seq.findPosition(sg.getStartRes());\r
@@ -608,14 +623,15 @@ public class AlignFrame
         endRes += seq.getStart() - 1;\r
       }\r
 \r
-      buffer.append(seq.getName() + "\t" +\r
-                    startRes + "\t" +\r
-                    endRes + "\t" +\r
-                    seq.getSequence(sg.getStartRes(),\r
-                                    sg.getEndRes() + 1) + "\n");\r
+      seqs[i] = new Sequence(seq.getName(),\r
+                             seq.getSequence(sg.getStartRes(), sg.getEndRes()+1),\r
+                             startRes,\r
+                             endRes);\r
     }\r
 \r
-    c.setContents(new StringSelection(buffer.toString()), null);\r
+    System.out.println("BLOBL"+FastaFile.print(seqs));\r
+\r
+    c.setContents(new StringSelection(FastaFile.print(seqs)), null);\r
   }\r
 \r
   /**\r
@@ -658,33 +674,14 @@ public class AlignFrame
       }\r
 \r
       String str = (String) contents.getTransferData(DataFlavor.stringFlavor);\r
-      StringTokenizer st = new StringTokenizer(str);\r
-      ArrayList seqs = new ArrayList();\r
 \r
-      while (st.hasMoreElements())\r
-      {\r
-        String name = st.nextToken();\r
-        int start = Integer.parseInt(st.nextToken());\r
-        int end = Integer.parseInt(st.nextToken());\r
-        Sequence sequence = new Sequence(name, st.nextToken(), start,\r
-                                         end);\r
+      String format = IdentifyFile.Identify(str, "Paste");\r
+      SequenceI[] sequences = FormatAdapter.readFile(str, "Paste", format);\r
 \r
-        if (!newAlignment)\r
-        {\r
-          viewport.alignment.addSequence(sequence);\r
-        }\r
-        else\r
-        {\r
-          seqs.add(sequence);\r
-        }\r
-      }\r
 \r
       if (newAlignment)\r
       {\r
-        SequenceI[] newSeqs = new SequenceI[seqs.size()];\r
-        seqs.toArray(newSeqs);\r
-\r
-        AlignFrame af = new AlignFrame(new Alignment(newSeqs));\r
+        AlignFrame af = new AlignFrame(new Alignment(sequences));\r
         String newtitle = new String("Copied sequences");\r
 \r
         if (title.startsWith("Copied sequences"))\r
@@ -701,6 +698,10 @@ public class AlignFrame
       }\r
       else\r
       {\r
+        //!newAlignment\r
+        for (int i = 0; i < sequences.length; i++)\r
+          viewport.alignment.addSequence(sequences[i]);\r
+\r
         viewport.setEndSeq(viewport.alignment.getHeight());\r
         viewport.alignment.getWidth();\r
         viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
@@ -732,7 +733,6 @@ public class AlignFrame
    */\r
   protected void delete_actionPerformed(ActionEvent e)\r
   {\r
-    boolean seqsdeleted = false;\r
 \r
     if (viewport.getSelectionGroup() == null)\r
     {\r
@@ -764,7 +764,6 @@ public class AlignFrame
 \r
       if (seq.getSequence().length() < 1)\r
       {\r
-        seqsdeleted = true;\r
         viewport.getAlignment().deleteSequence(seq);\r
       }\r
       else\r
@@ -993,7 +992,7 @@ public class AlignFrame
     {\r
       seqs = viewport.getSelectionGroup().sequences;\r
       start = viewport.getSelectionGroup().getStartRes();\r
-      end = viewport.getSelectionGroup().getEndRes();\r
+      end = viewport.getSelectionGroup().getEndRes()+1;\r
     }\r
     else\r
     {\r
@@ -1005,32 +1004,63 @@ public class AlignFrame
       current = (SequenceI) seqs.elementAt(i);\r
       jSize = current.getLength();\r
 \r
+      // Removing a range is much quicker than removing gaps\r
+      // one by one for long sequences\r
       int j = start;\r
+      int rangeStart=-1, rangeEnd=-1;\r
 \r
       do\r
       {\r
         if (jalview.util.Comparison.isGap(current.getCharAt(j)))\r
         {\r
-          current.deleteCharAt(j);\r
-          j--;\r
-          jSize--;\r
+          if(rangeStart==-1)\r
+           {\r
+             rangeStart = j;\r
+             rangeEnd = j+1;\r
+           }\r
+           else\r
+           {\r
+             rangeEnd++;\r
+           }\r
+           j++;\r
+        }\r
+        else\r
+        {\r
+          if(rangeStart>-1)\r
+          {\r
+            current.deleteChars(rangeStart, rangeEnd);\r
+            j-=rangeEnd-rangeStart;\r
+            jSize-=rangeEnd-rangeStart;\r
+            rangeStart = -1;\r
+            rangeEnd = -1;\r
+          }\r
+          else\r
+            j++;\r
         }\r
-        j++;\r
       }\r
       while (j < end && j < jSize);\r
+      if(rangeStart>-1)\r
+      {\r
+       current.deleteChars(rangeStart, rangeEnd);\r
+      }\r
     }\r
 \r
     viewport.setStartRes(seq.findIndex(startRes)-1);\r
 \r
-\r
     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
   }\r
 \r
  public void alignmentChanged()\r
  {\r
-   viewport.updateConsensus();\r
-   viewport.updateConservation();\r
+   if(viewport.vconsensus!=null)\r
+   {\r
+     viewport.updateConsensus();\r
+     viewport.updateConservation();\r
+   }\r
    resetAllColourSchemes();\r
+   if(alignPanel.overviewPanel!=null)\r
+     alignPanel.overviewPanel.updateOverviewImage();\r
+\r
    alignPanel.repaint();\r
  }\r
 \r
@@ -1808,21 +1838,11 @@ public class AlignFrame
       return;\r
     }\r
 \r
-    try\r
-    {\r
       PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
       JInternalFrame frame = new JInternalFrame();\r
       frame.setContentPane(pcaPanel);\r
       Desktop.addInternalFrame(frame, "Principal component analysis",\r
                                400, 400);\r
-    }\r
-    catch (java.lang.OutOfMemoryError ex)\r
-    {\r
-      JOptionPane.showInternalMessageDialog(this,\r
-                                            "Too many sequences selected\nfor Principal Component Analysis!!",\r
-                                            "Out of memory",\r
-                                            JOptionPane.WARNING_MESSAGE);\r
-    }\r
   }\r
 \r
   /**\r
@@ -2004,17 +2024,6 @@ public class AlignFrame
       }\r
       ;\r
     });\r
-    viewport.addPropertyChangeListener(new java.beans.PropertyChangeListener()\r
-    {\r
-      public void propertyChange(PropertyChangeEvent evt)\r
-      {\r
-        if (evt.getPropertyName().equals("alignment"))\r
-        {\r
-          treePanel.getTree().UpdatePlaceHolders( (Vector) evt.getNewValue());\r
-          treePanel.repaint();\r
-        }\r
-      }\r
-    });\r
   }\r
 \r
   /**\r