Add jvsuffix and dbref to menu
[jalview.git] / src / jalview / appletgui / AlignFrame.java
index 5641846..6e2d32b 100755 (executable)
@@ -29,18 +29,19 @@ 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
 \r
-  public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet)\r
+  public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet, String title)\r
   {\r
     this.applet = applet;\r
     viewport = new AlignViewport(al, applet);\r
@@ -48,38 +49,69 @@ public class AlignFrame
     add(alignPanel);\r
     alignPanel.validate();\r
 \r
-    String treeFile = applet.getParameter("treeFile");\r
-    if (treeFile != null)\r
+    if(applet!=null)\r
     {\r
-      try\r
+      String treeFile = applet.getParameter("treeFile");\r
+      if (treeFile != null)\r
       {\r
-        treeFile = treeFile;\r
-        jalview.io.NewickFile fin = new jalview.io.NewickFile(applet.\r
-            getCodeBase() + treeFile, "URL");\r
-        fin.parse();\r
+        try\r
+        {\r
+          jalview.io.NewickFile fin = new jalview.io.NewickFile(applet.\r
+              getCodeBase() + treeFile, "URL");\r
+          fin.parse();\r
 \r
-        if (fin.getTree() != null)\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
-          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
+          ex.printStackTrace();\r
         }\r
       }\r
-      catch (Exception ex)\r
+\r
+      String param = applet.getParameter("sortBy");\r
+      if (param != null)\r
       {\r
-        ex.printStackTrace();\r
+        if (param.equalsIgnoreCase("Id"))\r
+          sortIDMenuItem_actionPerformed(null);\r
+        else if (param.equalsIgnoreCase("Pairwise Identity"))\r
+          sortPairwiseMenuItem_actionPerformed(null);\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
+      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
+      try\r
+      {\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
+          int height = Integer.parseInt(param);\r
+          NEW_WINDOW_HEIGHT = height;\r
+        }\r
+      }\r
+      catch (Exception ex)\r
+      {}\r
+\r
     }\r
 \r
     this.addWindowListener(new WindowAdapter()\r
@@ -100,8 +132,98 @@ public class AlignFrame
        }\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, applet);\r
@@ -118,15 +240,18 @@ public class AlignFrame
     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
@@ -397,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
@@ -407,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
@@ -623,30 +749,56 @@ 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
-        j++;\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
+      }\r
+      while (j < end && j < jSize);\r
+      if(rangeStart>-1)\r
+      {\r
+       current.deleteChars(rangeStart, rangeEnd);\r
       }\r
-      while(j < end && j < jSize) ;\r
     }\r
-\r
     viewport.setStartRes(seq.findIndex(startRes)-1);\r
     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
   }\r
@@ -656,6 +808,8 @@ public class AlignFrame
     viewport.updateConsensus();\r
     viewport.updateConservation ();\r
     resetAllColourSchemes();\r
+    if(alignPanel.overviewPanel!=null)\r
+      alignPanel.overviewPanel.updateOverviewImage();\r
     alignPanel.repaint();\r
   }\r
 \r
@@ -702,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
@@ -775,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
@@ -1031,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
@@ -1092,6 +1245,24 @@ public class AlignFrame
 \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
@@ -1103,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
@@ -1202,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
@@ -1269,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