Add jvsuffix and dbref to menu
[jalview.git] / src / jalview / appletgui / AlignFrame.java
index 38aea52..6e2d32b 100755 (executable)
@@ -29,66 +29,89 @@ import java.awt.event.*;
 import java.util.*;\r
 import java.io.InputStreamReader;\r
 import java.io.BufferedReader;\r
+import java.net.URL;\r
 \r
 public class AlignFrame\r
     extends GAlignFrame\r
 {\r
   final AlignmentPanel alignPanel;\r
   final AlignViewport viewport;\r
-  public static final int NEW_WINDOW_WIDTH = 700;\r
-  public static final int NEW_WINDOW_HEIGHT = 500;\r
+  int NEW_WINDOW_WIDTH = 700;\r
+  int NEW_WINDOW_HEIGHT = 500;\r
   jalview.bin.JalviewLite applet;\r
 \r
-  public AlignFrame(AlignmentI al)\r
+\r
+  public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet, String title)\r
   {\r
-    this.applet = null;\r
-    viewport = new AlignViewport(al, null);\r
+    this.applet = applet;\r
+    viewport = new AlignViewport(al, applet);\r
     alignPanel = new AlignmentPanel(this, viewport);\r
     add(alignPanel);\r
     alignPanel.validate();\r
 \r
-    this.addWindowListener(new WindowAdapter()\r
+    if(applet!=null)\r
     {\r
-      public void windowClosing(WindowEvent e)\r
+      String treeFile = applet.getParameter("treeFile");\r
+      if (treeFile != null)\r
       {\r
-        closeMenuItem_actionPerformed(null);\r
-      }\r
-    });\r
+        try\r
+        {\r
+          jalview.io.NewickFile fin = new jalview.io.NewickFile(applet.\r
+              getCodeBase() + treeFile, "URL");\r
+          fin.parse();\r
 \r
-  }\r
+          if (fin.getTree() != null)\r
+          {\r
+            TreePanel tp = null;\r
+            tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
+                               fin, "FromFile", applet.getCodeBase() + treeFile);\r
+            jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500);\r
+            addTreeMenuItem(tp, treeFile);\r
+          }\r
+        }\r
+        catch (Exception ex)\r
+        {\r
+          ex.printStackTrace();\r
+        }\r
+      }\r
 \r
+      String param = applet.getParameter("sortBy");\r
+      if (param != null)\r
+      {\r
+        if (param.equalsIgnoreCase("Id"))\r
+          sortIDMenuItem_actionPerformed(null);\r
+        else if (param.equalsIgnoreCase("Pairwise Identity"))\r
+          sortPairwiseMenuItem_actionPerformed(null);\r
+      }\r
 \r
-  public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet)\r
-  {\r
-    this.applet = applet;\r
-    viewport = new AlignViewport(al, applet);\r
-    alignPanel = new AlignmentPanel(this, viewport);\r
-    add(alignPanel);\r
-    alignPanel.validate();\r
+      param = applet.getParameter("wrap");\r
+      if (param != null)\r
+      {\r
+        if (param.equalsIgnoreCase("true"))\r
+        {\r
+          wrapMenuItem.setState(true);\r
+          wrapMenuItem_actionPerformed(null);\r
+        }\r
+      }\r
 \r
-    String treeFile = applet.getParameter("treeFile");\r
-    if (treeFile != null)\r
-    {\r
       try\r
       {\r
-        treeFile = treeFile;\r
-        jalview.io.NewickFile fin = new jalview.io.NewickFile(applet.\r
-            getCodeBase() + treeFile, "URL");\r
-        fin.parse();\r
-\r
-        if (fin.getTree() != null)\r
+        param = applet.getParameter("windowWidth");\r
+        if (param != null)\r
+        {\r
+          int width = Integer.parseInt(param);\r
+          NEW_WINDOW_WIDTH = width;\r
+        }\r
+        param = applet.getParameter("windowHeight");\r
+        if (param != null)\r
         {\r
-          TreePanel tp = null;\r
-          tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
-                             fin, "FromFile", applet.getCodeBase() + treeFile);\r
-          jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500);\r
-          addTreeMenuItem(tp, treeFile);\r
+          int height = Integer.parseInt(param);\r
+          NEW_WINDOW_HEIGHT = height;\r
         }\r
       }\r
       catch (Exception ex)\r
-      {\r
-        ex.printStackTrace();\r
-      }\r
+      {}\r
+\r
     }\r
 \r
     this.addWindowListener(new WindowAdapter()\r
@@ -99,13 +122,111 @@ public class AlignFrame
           }\r
     });\r
 \r
+    viewport.addPropertyChangeListener(new java.beans.PropertyChangeListener()\r
+    {\r
+     public void propertyChange(java.beans.PropertyChangeEvent evt)\r
+     {\r
+       if (evt.getPropertyName().equals("alignment"))\r
+       {\r
+         alignmentChanged();\r
+       }\r
+     }\r
+   });\r
+\r
+   jalview.bin.JalviewLite.addFrame(this, title,\r
+                                    NEW_WINDOW_WIDTH,\r
+                                    NEW_WINDOW_HEIGHT);\r
 \r
 \r
   }\r
 \r
+\r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param String DOCUMENT ME!\r
+   */\r
+\r
+  public void parseFeaturesFile(String file)\r
+  {\r
+    try\r
+    {\r
+      URL url = new URL(file);\r
+\r
+      BufferedReader in =  new BufferedReader(new InputStreamReader(url.openStream()));\r
+      SequenceI seq = null;\r
+      String line, type, desc, token;\r
+\r
+      int index, start, end;\r
+      StringTokenizer st;\r
+      SequenceFeature sf;\r
+      FeatureRenderer fr = alignPanel.seqPanel.seqCanvas.getFeatureRenderer();\r
+      int lineNo = 0;\r
+      while ( (line = in.readLine()) != null)\r
+      {\r
+        lineNo++;\r
+        st = new StringTokenizer(line, "\t");\r
+        if (st.countTokens() == 2)\r
+        {\r
+          type = st.nextToken();\r
+          UserColourScheme ucs = new UserColourScheme(st.nextToken());\r
+          fr.setColour(type, ucs.findColour("A"));\r
+          continue;\r
+        }\r
+\r
+        while (st.hasMoreElements())\r
+        {\r
+          desc = st.nextToken();\r
+          token = st.nextToken();\r
+          if (!token.equals("ID_NOT_SPECIFIED"))\r
+          {\r
+            index = viewport.alignment.findIndex(viewport.alignment.findName(\r
+                token));\r
+            st.nextToken();\r
+          }\r
+          else\r
+          {\r
+            index = Integer.parseInt(st.nextToken());\r
+          }\r
+\r
+          start = Integer.parseInt(st.nextToken());\r
+          end = Integer.parseInt(st.nextToken());\r
+\r
+          seq = viewport.alignment.getSequenceAt(index);\r
+          start = seq.findIndex(start) - 1;\r
+          end = seq.findIndex(end) - 1;\r
+\r
+          type = st.nextToken();\r
+\r
+          if(fr.getColour(type)==null)\r
+          {\r
+            // Probably the old style groups file\r
+            UserColourScheme ucs = new UserColourScheme(type);\r
+            fr.setColour(type, ucs.findColour("A"));\r
+          }\r
+\r
+          sf = new SequenceFeature(type, desc, "", start, end);\r
+\r
+          seq.addSequenceFeature(sf);\r
+        }\r
+      }\r
+\r
+      viewport.showSequenceFeatures = true;\r
+      ((Alignment)viewport.alignment).featuresAdded = true;\r
+\r
+      alignPanel.repaint();\r
+\r
+    }\r
+    catch (Exception ex)\r
+    {\r
+      System.out.println("Error parsing groups file: " + ex);\r
+    }\r
+  }\r
+\r
+\r
   public void inputText_actionPerformed(ActionEvent e)\r
   {\r
-    CutAndPasteTransfer cap = new CutAndPasteTransfer(true);\r
+    CutAndPasteTransfer cap = new CutAndPasteTransfer(true, applet);\r
     Frame frame = new Frame();\r
     frame.add(cap);\r
     jalview.bin.JalviewLite.addFrame(frame, "Cut & Paste Input", 500, 500);\r
@@ -113,21 +234,24 @@ public class AlignFrame
 \r
   protected void outputText_actionPerformed(ActionEvent e)\r
   {\r
-    CutAndPasteTransfer cap = new CutAndPasteTransfer(false);\r
+    CutAndPasteTransfer cap = new CutAndPasteTransfer(false, applet);\r
     Frame frame = new Frame();\r
     frame.add(cap);\r
     jalview.bin.JalviewLite.addFrame(frame,\r
                                      "Alignment output - " + e.getActionCommand(),\r
                                      600, 500);\r
-    cap.setText(FormatAdapter.formatSequences(e.getActionCommand(),\r
-                                              viewport.getAlignment().\r
-                                              getSequences()));\r
+    cap.setText(new AppletFormatAdapter().formatSequences(e.getActionCommand(),\r
+                                              viewport.getAlignment().getSequences(),\r
+                                                      viewport.showDBPrefix,\r
+                                                      viewport.showJVSuffix));\r
   }\r
 \r
   public void closeMenuItem_actionPerformed(ActionEvent e)\r
   {\r
     PaintRefresher.components.remove(viewport.alignment);\r
     dispose();\r
+    if(PaintRefresher.components.size()==0 && applet==null)\r
+      System.exit(0);\r
   }\r
 \r
   Stack historyList = new Stack();\r
@@ -172,7 +296,7 @@ public class AlignFrame
     redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,\r
                                   HistoryItem.HIDE));\r
     restoreHistoryItem(hi);\r
-    resetAllColourSchemes();\r
+    viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
   }\r
 \r
   protected void redoMenuItem_actionPerformed(ActionEvent e)\r
@@ -180,10 +304,7 @@ public class AlignFrame
     HistoryItem hi = (HistoryItem) redoList.pop();\r
     restoreHistoryItem(hi);\r
     updateEditMenuBar();\r
-    viewport.updateConsensus();\r
-    resetAllColourSchemes();\r
-    alignPanel.repaint();\r
-    alignPanel.repaint();\r
+    viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
   }\r
 \r
   // used by undo and redo\r
@@ -227,9 +348,7 @@ public class AlignFrame
 \r
     updateEditMenuBar();\r
 \r
-    viewport.updateConsensus();\r
-    viewport.updateConservation();\r
-    alignPanel.repaint();\r
+    viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
   }\r
 \r
   public void moveSelectedSequences(boolean up)\r
@@ -403,7 +522,6 @@ public class AlignFrame
           newSeqs[i] = (SequenceI) seqs.elementAt(i);\r
         }\r
 \r
-        AlignFrame af = new AlignFrame(new Alignment(newSeqs), applet);\r
         String newtitle = new String("Copied sequences");\r
         if (getTitle().startsWith("Copied sequences"))\r
         {\r
@@ -413,6 +531,8 @@ public class AlignFrame
         {\r
           newtitle = newtitle.concat("- from " + getTitle());\r
         }\r
+        AlignFrame af = new AlignFrame(new Alignment(newSeqs), applet, newtitle);\r
+\r
         jalview.bin.JalviewLite.addFrame(af, newtitle, NEW_WINDOW_WIDTH,\r
                                          NEW_WINDOW_HEIGHT);\r
       }\r
@@ -420,9 +540,7 @@ public class AlignFrame
       {\r
         viewport.setEndSeq(viewport.alignment.getHeight());\r
         viewport.alignment.getWidth();\r
-        viewport.updateConservation();\r
-        viewport.updateConsensus();\r
-        alignPanel.repaint();\r
+        viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
       }\r
 \r
     }\r
@@ -488,9 +606,7 @@ public class AlignFrame
       catch (Exception ex)\r
       {}\r
     }\r
-    viewport.updateConservation();\r
-    viewport.updateConsensus();\r
-    alignPanel.repaint();\r
+    viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
 \r
   }\r
 \r
@@ -520,6 +636,7 @@ public class AlignFrame
     viewport.setSelectionGroup(null);\r
     viewport.getColumnSelection().clear();\r
     viewport.setSelectionGroup(null);\r
+    alignPanel.repaint();\r
     PaintRefresher.Refresh(null, viewport.alignment);\r
   }\r
 \r
@@ -559,8 +676,7 @@ public class AlignFrame
           viewport.alignment.deleteGroup(sg);\r
         }\r
       }\r
-\r
-      alignPanel.repaint();\r
+      viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
     }\r
   }\r
 \r
@@ -587,8 +703,7 @@ public class AlignFrame
           viewport.alignment.deleteGroup(sg);\r
         }\r
       }\r
-\r
-      alignPanel.repaint();\r
+      viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
     }\r
 \r
   }\r
@@ -608,10 +723,7 @@ public class AlignFrame
 \r
     viewport.setStartRes(seq.findIndex(startRes)-1);\r
 \r
-    viewport.updateConservation();\r
-    viewport.updateConsensus();\r
-    resetAllColourSchemes();\r
-    alignPanel.repaint();\r
+    viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
   }\r
 \r
   public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
@@ -637,34 +749,67 @@ 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
       seqs = viewport.alignment.getSequences();\r
 \r
-    for (int i = 0; i <seqs.size(); i++)\r
+    for (int i = 0; i < seqs.size(); i++)\r
     {\r
-      current = (SequenceI)seqs.elementAt(i);\r
+      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
+      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
-    viewport.updateConservation();\r
+    viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
+  }\r
+\r
+  public void alignmentChanged()\r
+  {\r
     viewport.updateConsensus();\r
+    viewport.updateConservation ();\r
     resetAllColourSchemes();\r
+    if(alignPanel.overviewPanel!=null)\r
+      alignPanel.overviewPanel.updateOverviewImage();\r
     alignPanel.repaint();\r
   }\r
 \r
@@ -673,27 +818,26 @@ public class AlignFrame
     ColourSchemeI cs = viewport.globalColourScheme;\r
     if(cs!=null)\r
     {\r
-        cs.setConsensus(viewport.vconsensus);\r
-        if(cs.conservationApplied())\r
-        {\r
-          Alignment al = (Alignment) viewport.alignment;\r
-          Conservation c = new Conservation("All",\r
-                                            ResidueProperties.propHash, 3,\r
-                                            al.getSequences(), 0,\r
-                                            al.getWidth() - 1);\r
-          c.calculate();\r
-          c.verdict(false, viewport.ConsPercGaps);\r
+      if (cs instanceof ClustalxColourScheme)\r
+      {\r
+        ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).\r
+            resetClustalX(viewport.alignment.getSequences(),\r
+                          viewport.alignment.getWidth());\r
+      }\r
 \r
-          cs.setConservation(c);\r
-        }\r
-    }\r
+      cs.setConsensus(viewport.vconsensus);\r
+      if (cs.conservationApplied())\r
+      {\r
+        Alignment al = (Alignment) viewport.alignment;\r
+        Conservation c = new Conservation("All",\r
+                                          ResidueProperties.propHash, 3,\r
+                                          al.getSequences(), 0,\r
+                                          al.getWidth() - 1);\r
+        c.calculate();\r
+        c.verdict(false, viewport.ConsPercGaps);\r
 \r
-    if(viewport.getGlobalColourScheme()!=null\r
-       && viewport.getGlobalColourScheme() instanceof ClustalxColourScheme)\r
-    {\r
-      ((ClustalxColourScheme)viewport.getGlobalColourScheme()).\r
-          resetClustalX(viewport.alignment.getSequences(),\r
-                        viewport.alignment.getWidth());\r
+        cs.setConservation(c);\r
+      }\r
     }\r
 \r
     int s, sSize = viewport.alignment.getGroups().size();\r
@@ -704,9 +848,7 @@ public class AlignFrame
       {\r
         ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());\r
       }\r
-\r
       sg.recalcConservation();\r
-\r
     }\r
   }\r
 \r
@@ -714,25 +856,29 @@ public class AlignFrame
 \r
   public void findMenuItem_actionPerformed(ActionEvent e)\r
   {\r
-    Finder finder = new Finder(alignPanel);\r
+    new Finder(alignPanel);\r
   }\r
 \r
   public void font_actionPerformed(ActionEvent e)\r
   {\r
-    Frame frame = new Frame();\r
-    FontChooser fc = new FontChooser(alignPanel, frame);\r
-    frame.add(fc);\r
-    jalview.bin.JalviewLite.addFrame(frame, "Change Font", 440, 100);\r
+    new FontChooser(alignPanel);\r
+  }\r
 \r
+  public void dbref_actionPerformed(ItemEvent e)\r
+  {\r
+    viewport.showDBPrefix = dbref.getState();\r
+    alignPanel.fontChanged();\r
+    alignPanel.repaint();\r
   }\r
 \r
-  protected void fullSeqId_actionPerformed(ActionEvent e)\r
+  public void seqLimits_itemStateChanged(ItemEvent e)\r
   {\r
-    viewport.setShowFullId(fullSeqId.getState());\r
+    viewport.setShowJVSuffix(seqLimits.getState());\r
     alignPanel.fontChanged();\r
     alignPanel.repaint();\r
   }\r
 \r
+\r
   protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
   {\r
     viewport.setColourText(colourTextMenuItem.getState());\r
@@ -787,11 +933,6 @@ public class AlignFrame
 \r
   public void annotationPanelMenuItem_actionPerformed(ActionEvent e)\r
   {\r
-    if (annotationPanelMenuItem.getState() && viewport.getWrapAlignment())\r
-    {\r
-      annotationPanelMenuItem.setState(false);\r
-      return;\r
-    }\r
     viewport.setShowAnnotation(annotationPanelMenuItem.getState());\r
     alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());\r
   }\r
@@ -1043,7 +1184,7 @@ public class AlignFrame
 \r
   public void userDefinedColour_actionPerformed(ActionEvent e)\r
   {\r
-    UserDefinedColours chooser = new UserDefinedColours(alignPanel, null);\r
+    new UserDefinedColours(alignPanel, null);\r
   }\r
 \r
   public void PIDColour_actionPerformed(ActionEvent e)\r
@@ -1097,13 +1238,31 @@ public class AlignFrame
     if (viewport.getSelectionGroup().getSize() > 1)\r
     {\r
       Frame frame = new Frame();\r
-      frame.add(new PairwiseAlignPanel(viewport));\r
+      frame.add(new PairwiseAlignPanel(alignPanel));\r
       jalview.bin.JalviewLite.addFrame(frame, "Pairwise Alignment", 600, 500);\r
     }\r
   }\r
 \r
   public void PCAMenuItem_actionPerformed(ActionEvent e)\r
   {\r
+    //are the sequences aligned?\r
+    if (!viewport.alignment.isAligned())\r
+    {\r
+      SequenceI current;\r
+      int Width = viewport.getAlignment().getWidth();\r
+\r
+      for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
+           i++)\r
+      {\r
+        current = viewport.getAlignment().getSequenceAt(i);\r
+\r
+        if (current.getLength() < Width)\r
+        {\r
+          current.insertCharAt(Width - 1, viewport.getGapCharacter());\r
+        }\r
+      }\r
+      alignPanel.repaint();\r
+    }\r
 \r
     if ( (viewport.getSelectionGroup() != null &&\r
           viewport.getSelectionGroup().getSize() < 4 &&\r
@@ -1115,11 +1274,7 @@ public class AlignFrame
 \r
     try\r
     {\r
-      PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
-      Frame frame = new Frame();\r
-      frame.add(pcaPanel);\r
-      jalview.bin.JalviewLite.addFrame(frame, "Principal component analysis",\r
-                                       400, 400);\r
+      new PCAPanel(viewport);\r
     }\r
     catch (java.lang.OutOfMemoryError ex)\r
     {\r
@@ -1214,7 +1369,7 @@ public class AlignFrame
 \r
   protected void documentation_actionPerformed(ActionEvent e)\r
   {\r
-    jalview.bin.JalviewLite.showURL("http://www.jalview.org/help.html");\r
+    showURL("http://www.jalview.org/help.html");\r
   }\r
 \r
   protected void about_actionPerformed(ActionEvent e)\r
@@ -1281,4 +1436,36 @@ public class AlignFrame
     jalview.bin.JalviewLite.addFrame(frame, "Jalview", 580, 200);\r
 \r
   }\r
+\r
+  /**\r
+   * Displays the given URL in a new browser window\r
+   *\r
+   * @param url URL to display in browser window.\r
+   * <br>New window will be named "HELP_WINDOW"\r
+   */\r
+  public void showURL(String url)\r
+  {\r
+    showURL(url, "HELP");\r
+  }\r
+\r
+  public void showURL(String url, String target)\r
+  {\r
+    if (applet == null)\r
+    {\r
+      System.out.println("Not running as applet - no browser available.");\r
+    }\r
+    else\r
+    {\r
+      try\r
+      {\r
+        applet.getAppletContext().showDocument(new java.net.URL(url),\r
+                                               target);\r
+      }\r
+      catch (Exception ex)\r
+      {\r
+        ex.printStackTrace();\r
+      }\r
+    }\r
+  }\r
+\r
 }\r