Unique name for new group and treegroup
[jalview.git] / src / jalview / gui / SeqPanel.java
index e51b13c..ed9ce8d 100755 (executable)
@@ -179,7 +179,6 @@ public class SeqPanel extends JPanel implements MouseListener,
   {\r
     Vector tmp = new Vector();\r
     SequenceFeature[] features = sequence.getSequenceFeatures();\r
-\r
     if (features != null)\r
     {\r
       for (int i = 0; i < features.length; i++)\r
@@ -188,8 +187,8 @@ public class SeqPanel extends JPanel implements MouseListener,
             || !av.featuresDisplayed.containsKey(features[i].getType()))\r
           continue;\r
 \r
-        if ( (features[i].getBegin() <= sequence.findPosition(res)) &&\r
-            (features[i].getEnd() >= sequence.findPosition(res)))\r
+        if ( (features[i].getBegin() <= res) &&\r
+            (features[i].getEnd() >= res))\r
         {\r
           tmp.addElement(features[i]);\r
         }\r
@@ -287,6 +286,25 @@ public class SeqPanel extends JPanel implements MouseListener,
     {\r
       seqCanvas.cursorX += dx;\r
       seqCanvas.cursorY += dy;\r
+      if (av.hasHiddenColumns && !av.colSel.isVisible(seqCanvas.cursorX))\r
+      {\r
+        int original = seqCanvas.cursorX - dx;\r
+        int maxWidth = av.alignment.getWidth();\r
+\r
+        while(!av.colSel.isVisible(seqCanvas.cursorX)\r
+              && seqCanvas.cursorX<maxWidth\r
+              && seqCanvas.cursorX>0)\r
+        {\r
+          seqCanvas.cursorX += dx;\r
+        }\r
+\r
+        if(seqCanvas.cursorX>=maxWidth\r
+           || !av.colSel.isVisible(seqCanvas.cursorX) )\r
+        {\r
+          seqCanvas.cursorX = original;\r
+        }\r
+      }\r
+\r
       scrollToVisible();\r
     }\r
 \r
@@ -320,12 +338,12 @@ public class SeqPanel extends JPanel implements MouseListener,
         }\r
         if (!av.wrapAlignment)\r
         {\r
-          while (seqCanvas.cursorX < av.startRes)\r
+          while (seqCanvas.cursorX < av.colSel.adjustForHiddenColumns(av.startRes))\r
           {\r
             if (!ap.scrollRight(false))\r
               break;\r
           }\r
-          while (seqCanvas.cursorX > av.endRes)\r
+          while (seqCanvas.cursorX > av.colSel.adjustForHiddenColumns(av.endRes))\r
           {\r
             if (!ap.scrollRight(true))\r
               break;\r
@@ -348,7 +366,7 @@ public class SeqPanel extends JPanel implements MouseListener,
         SequenceGroup sg = av.selectionGroup;\r
         //Find the top and bottom of this group\r
         int min = av.alignment.getHeight(), max = 0;\r
-        for(int i=0; i<sg.getSize(false); i++)\r
+        for(int i=0; i<sg.getSize(); i++)\r
         {\r
           int index = av.alignment.findIndex( sg.getSequenceAt(i) );\r
           if(index > max)\r
@@ -384,7 +402,7 @@ public class SeqPanel extends JPanel implements MouseListener,
         else\r
         {\r
           // Now add any sequences between min and max\r
-          sg.getSequences(false).clear();\r
+          sg.getSequences(null).clear();\r
           for (int i = min; i < max; i++)\r
           {\r
             sg.addSequence(av.alignment.getSequenceAt(i), false);\r
@@ -552,118 +570,127 @@ public class SeqPanel extends JPanel implements MouseListener,
 \r
       setStatusMessage(sequence, res, seq);\r
 \r
+\r
+\r
+      tooltipText.setLength(6); // Cuts the buffer back to <html>\r
+\r
+      SequenceGroup []  groups = av.alignment.findAllGroups(sequence);\r
+      if(groups!=null)\r
+      {\r
+        for(int g=0; g<groups.length; g++)\r
+        {\r
+          if(groups[g].getStartRes()<=res && groups[g].getEndRes()>=res)\r
+          {\r
+            if (!groups[g].getName().startsWith("JTreeGroup") &&\r
+                !groups[g].getName().startsWith("JGroup"))\r
+              tooltipText.append(groups[g].getName() + " ");\r
+\r
+            if(groups[g].getDescription()!=null)\r
+              tooltipText.append(groups[g].getDescription()+"<BR>");\r
+          }\r
+        }\r
+      }\r
+\r
+\r
         // use aa to see if the mouse pointer is on a\r
         if (av.showSequenceFeatures)\r
         {\r
-            tooltipText.setLength(6); // Cuts the buffer back to <html>\r
-\r
-            SequenceFeature[] features = findFeaturesAtRes(\r
-                sequence.getDatasetSequence(), res);\r
+          SequenceFeature[] features = findFeaturesAtRes(\r
+              sequence.getDatasetSequence(), sequence.findPosition(res));\r
 \r
-            if(features!=null)\r
+          if (features != null)\r
+          {\r
+            for (int i = 0; i < features.length; i++)\r
             {\r
-              for (int i = 0; i < features.length; i++)\r
+              if (features[i].getType().equals("disulfide bond"))\r
               {\r
-                  if (features[i].getType().equals("disulfide bond"))\r
-                  {\r
-                    if (features[i].getBegin() == sequence.findPosition(res)\r
-                        || features[i].getEnd() == sequence.findPosition(res))\r
-                    {\r
-                      if (tooltipText.length() > 6)\r
-                        tooltipText.append("<br>");\r
-                      tooltipText.append("disulfide bond " + features[i].getBegin() + ":" +\r
+                if (features[i].getBegin() == sequence.findPosition(res)\r
+                    || features[i].getEnd() == sequence.findPosition(res))\r
+                {\r
+                  if (tooltipText.length() > 6)\r
+                    tooltipText.append("<br>");\r
+                  tooltipText.append("disulfide bond " + features[i].getBegin() + ":" +\r
                                      features[i].getEnd());\r
-                      if (features[i].links != null)\r
-                      tooltipText.append(" <img src=\"" + linkImageURL + "\">");\r
-                    }\r
-                  }\r
-                  else\r
-                  {\r
-                    if (tooltipText.length() > 6)\r
-                      tooltipText.append("<br>");\r
+                  if (features[i].links != null)\r
+                    tooltipText.append(" <img src=\"" + linkImageURL + "\">");\r
+                }\r
+              }\r
+              else\r
+              {\r
+                if (tooltipText.length() > 6)\r
+                  tooltipText.append("<br>");\r
 \r
-                    tooltipText.append(features[i].getType() + " " +\r
+                tooltipText.append(features[i].getType() + " " +\r
                                    features[i].begin);\r
-                    if (features[i].begin != features[i].end)\r
-                      tooltipText.append(" " + features[i].end);\r
+                if (features[i].begin != features[i].end)\r
+                  tooltipText.append(" " + features[i].end);\r
 \r
-                    if (features[i].getDescription() != null\r
-                        && !features[i].description.equals(features[i].getType()))\r
-                    {\r
-                      tmpString = features[i].getDescription();\r
-                      int startTag=tmpString.toUpperCase().indexOf("<HTML>");\r
-                      if(startTag>-1)\r
-                      {\r
-                        tmpString = tmpString.substring(startTag + 6);\r
-                      }\r
-                      int endTag=tmpString.toUpperCase().indexOf("</BODY>");\r
-                      if(endTag>-1)\r
-                      {\r
-                        tmpString = tmpString.substring(0, endTag);\r
-                      }\r
-                      endTag = tmpString.toUpperCase().indexOf("</HTML>");\r
-                      if(endTag>-1)\r
-                      {\r
-                        tmpString = tmpString.substring(0, endTag);\r
-                      }\r
-\r
-                      if(startTag>-1)\r
-                      {\r
-                        tooltipText.append("; " + tmpString);\r
-                      }\r
-                      else\r
-                      {\r
-                       if (tmpString.indexOf("<") > -1 || tmpString.indexOf(">") > -1)\r
-                       {\r
-                         //The description does not specify html is to\r
-                         //be used, so we must remove < > symbols\r
-                         tmpString = tmpString.replaceAll("<", "&lt;");\r
-                         tmpString = tmpString.replaceAll(">", "&gt;");\r
-\r
-                         tooltipText.append("; ");\r
-                         tooltipText.append(tmpString);\r
-\r
-                       }\r
-                       else\r
-                         tooltipText.append("; "+tmpString);\r
-                      }\r
-                    }\r
-                    if (features[i].getValue("status") != null )\r
+                if (features[i].getDescription() != null\r
+                    && !features[i].description.equals(features[i].getType()))\r
+                {\r
+                  tmpString = features[i].getDescription();\r
+                  int startTag = tmpString.toUpperCase().indexOf("<HTML>");\r
+                  if (startTag > -1)\r
+                  {\r
+                    tmpString = tmpString.substring(startTag + 6);\r
+                  }\r
+                  int endTag = tmpString.toUpperCase().indexOf("</BODY>");\r
+                  if (endTag > -1)\r
+                  {\r
+                    tmpString = tmpString.substring(0, endTag);\r
+                  }\r
+                  endTag = tmpString.toUpperCase().indexOf("</HTML>");\r
+                  if (endTag > -1)\r
+                  {\r
+                    tmpString = tmpString.substring(0, endTag);\r
+                  }\r
+\r
+                  if (startTag > -1)\r
+                  {\r
+                    tooltipText.append("; " + tmpString);\r
+                  }\r
+                  else\r
+                  {\r
+                    if (tmpString.indexOf("<") > -1 || tmpString.indexOf(">") > -1)\r
                     {\r
-                      String status = features[i].getValue("status").toString();\r
-                      if(status.length()>0)\r
-                        tooltipText.append("; (" + features[i].getValue("status") + ")");\r
-                    }\r
+                      //The description does not specify html is to\r
+                      //be used, so we must remove < > symbols\r
+                      tmpString = tmpString.replaceAll("<", "&lt;");\r
+                      tmpString = tmpString.replaceAll(">", "&gt;");\r
 \r
-                    if (features[i].links != null)\r
-                      tooltipText.append(" <img src=\"" + linkImageURL + "\">");\r
+                      tooltipText.append("; ");\r
+                      tooltipText.append(tmpString);\r
 \r
+                    }\r
+                    else\r
+                      tooltipText.append("; " + tmpString);\r
                   }\r
-\r
-               // else if(features[i].begin==0 && features[i].end==0)\r
+                }\r
+                if (features[i].getValue("status") != null)\r
                 {\r
-                  // seqSpecific.append(features[i].featureGroup+": "\r
-                  //                   + features[i].getType()+" "\r
-                   //                   +features[i].getDescription()+"<br>");\r
-\r
+                  String status = features[i].getValue("status").toString();\r
+                  if (status.length() > 0)\r
+                    tooltipText.append("; (" + features[i].getValue("status") + ")");\r
                 }\r
-              }\r
 \r
+                if (features[i].links != null)\r
+                  tooltipText.append(" <img src=\"" + linkImageURL + "\">");\r
 \r
-              if(tooltipText.length()==6) // <html></html>\r
-              {\r
-\r
-                setToolTipText("");\r
-              }\r
-              else\r
-              {\r
-                tooltipText.append("</html>");\r
-                setToolTipText(tooltipText.toString());\r
               }\r
             }\r
-            else\r
-              setToolTipText("");\r
+          }\r
+        }\r
+        if (tooltipText.length() == 6) // <html></html>\r
+        {\r
+          setToolTipText(null);\r
+        }\r
+        else\r
+        {\r
+          tooltipText.append("</html>");\r
+          setToolTipText(tooltipText.toString());\r
         }\r
+       // else\r
+        //  setToolTipText(null);\r
     }\r
 \r
     void setStatusMessage(SequenceI sequence, int res, int seq)\r
@@ -793,24 +820,20 @@ public class SeqPanel extends JPanel implements MouseListener,
       boolean fixedColumns = false;\r
       SequenceGroup sg = av.getSelectionGroup();\r
 \r
+      SequenceI seq = av.alignment.getSequenceAt(startseq);\r
 \r
+      //No group, but the sequence may represent a group\r
         if (!groupEditing && av.hasHiddenRows)\r
         {\r
-          if (av.alignment.getSequenceAt(startseq).getHiddenSequences() != null)\r
+          if (av.hiddenRepSequences!=null\r
+              && av.hiddenRepSequences.containsKey(seq))\r
           {\r
+            sg = (SequenceGroup)av.hiddenRepSequences.get(seq);\r
             groupEditing = true;\r
           }\r
         }\r
 \r
-        //No group, but the sequence may represent a group\r
-        if (groupEditing\r
-            && sg == null\r
-            && av.alignment.getSequenceAt(startseq).getHiddenSequences() == null)\r
-        {\r
-          groupEditing = false;\r
-        }\r
 \r
-        SequenceI seq = av.alignment.getSequenceAt(startseq);\r
         StringBuffer message = new StringBuffer();\r
         if (groupEditing)\r
         {\r
@@ -839,7 +862,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 \r
         //Are we editing within a selection group?\r
         if (groupEditing\r
-            || (sg != null && sg.getSequences(true).contains(seq)))\r
+            || (sg != null && sg.getSequences(av.hiddenRepSequences).contains(seq)))\r
         {\r
           fixedColumns = true;\r
 \r
@@ -847,9 +870,7 @@ public class SeqPanel extends JPanel implements MouseListener,
           //but the sequence represents a group\r
           if (sg == null)\r
           {\r
-            sg = new SequenceGroup(null, null, false, false, false, 0,\r
-                                   av.alignment.getWidth()-1);\r
-            sg.addSequence(av.alignment.getSequenceAt(startseq), false);\r
+            sg = (SequenceGroup) av.hiddenRepSequences.get(seq);\r
           }\r
 \r
           fixedLeft = sg.getStartRes();\r
@@ -908,7 +929,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 \r
         if (groupEditing)\r
         {\r
-          Vector vseqs = sg.getSequences(true);\r
+          Vector vseqs = sg.getSequences(av.hiddenRepSequences);\r
           int g, groupSize = vseqs.size();\r
           SequenceI[] groupSeqs = new SequenceI[groupSize];\r
           for (g = 0; g < groupSeqs.length; g++)\r
@@ -956,7 +977,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 \r
             if (!blank)\r
             {\r
-              if(sg.getSize(false) == av.alignment.getHeight()  )\r
+              if(sg.getSize() == av.alignment.getHeight()  )\r
               {\r
                 if((av.hasHiddenColumns\r
                     && startres<av.getColumnSelection().getHiddenBoundaryRight(startres)))\r
@@ -1027,7 +1048,7 @@ public class SeqPanel extends JPanel implements MouseListener,
                 editCommand.appendEdit(EditCommand.INSERT_GAP,\r
                                        groupSeqs,\r
                                        startres, startres-lastres,\r
-                                       av.getGapCharacter(),\r
+                                       av.alignment,\r
                                        true);\r
               }\r
             }\r
@@ -1045,7 +1066,7 @@ public class SeqPanel extends JPanel implements MouseListener,
                 editCommand.appendEdit(EditCommand.DELETE_GAP,\r
                                        groupSeqs,\r
                                        startres, lastres - startres,\r
-                                       av.getGapCharacter(),\r
+                                       av.alignment,\r
                                        true);\r
 \r
             }\r
@@ -1068,7 +1089,7 @@ public class SeqPanel extends JPanel implements MouseListener,
                                      new SequenceI[]\r
                                      {seq},\r
                                      lastres, startres-lastres,\r
-                                     av.getGapCharacter(),\r
+                                     av.alignment,\r
                                      true);\r
             }\r
           }\r
@@ -1104,7 +1125,7 @@ public class SeqPanel extends JPanel implements MouseListener,
                                        new SequenceI[]\r
                                        {seq},\r
                                        startres, max,\r
-                                       av.getGapCharacter(),\r
+                                       av.alignment,\r
                                        true);\r
               }\r
             }\r
@@ -1144,11 +1165,11 @@ public class SeqPanel extends JPanel implements MouseListener,
 \r
       editCommand.appendEdit(EditCommand.DELETE_GAP,\r
                              seq,\r
-                             blankColumn, 1, av.getGapCharacter(), true);\r
+                             blankColumn, 1, av.alignment, true);\r
 \r
       editCommand.appendEdit(EditCommand.INSERT_GAP,\r
                              seq,\r
-                             j, 1, av.getGapCharacter(),\r
+                             j, 1, av.alignment,\r
                              true);\r
 \r
     }\r
@@ -1158,11 +1179,11 @@ public class SeqPanel extends JPanel implements MouseListener,
 \r
       editCommand.appendEdit(EditCommand.DELETE_GAP,\r
                              seq,\r
-                             j, 1, av.getGapCharacter(), true);\r
+                             j, 1, av.alignment, true);\r
 \r
       editCommand.appendEdit(EditCommand.INSERT_GAP,\r
                              seq,\r
-                             fixedColumn, 1, av.getGapCharacter(), true);\r
+                             fixedColumn, 1, av.alignment, true);\r
     }\r
 \r
     /**\r
@@ -1202,17 +1223,35 @@ public class SeqPanel extends JPanel implements MouseListener,
 \r
     public void mouseClicked(MouseEvent evt)\r
     {\r
+      SequenceI sequence = av.alignment.getSequenceAt( findSeq(evt) );\r
       if(evt.getClickCount()>1)\r
       {\r
+        if (av.getSelectionGroup().getSize() == 1\r
+            && av.getSelectionGroup().getEndRes()\r
+            - av.getSelectionGroup().getStartRes() < 2)\r
+          av.setSelectionGroup(null);\r
 \r
         SequenceFeature[] features = findFeaturesAtRes(\r
-            av.alignment.getSequenceAt( findSeq(evt) ).getDatasetSequence(),\r
-            findRes(evt)\r
+            sequence.getDatasetSequence(),\r
+            sequence.findPosition( findRes(evt) )\r
             );\r
-        for(int f=0; f<features.length; f++)\r
-          System.out.println("SELECT: "+features[f].getType()+" "\r
-      +features[f].getBegin()+" "+features[f].getEnd());\r
 \r
+        if(features!=null && features.length>0)\r
+        {\r
+          SearchResults highlight = new SearchResults();\r
+          highlight.addResult(sequence,\r
+                              features[0].getBegin(),\r
+                              features[0].getEnd());\r
+          seqCanvas.highlightSearchResults(highlight);\r
+        }\r
+        if(features!=null && features.length>0)\r
+        {\r
+          seqCanvas.getFeatureRenderer().amendFeatures(\r
+              new SequenceI[]\r
+              {sequence}, features, false, ap);\r
+\r
+          seqCanvas.highlightSearchResults(null);\r
+        }\r
       }\r
     }\r
 \r
@@ -1293,7 +1332,7 @@ public class SeqPanel extends JPanel implements MouseListener,
                 stretchGroup = null;\r
             }\r
         }\r
-        else if (!stretchGroup.getSequences(false).contains(sequence) ||\r
+        else if (!stretchGroup.getSequences(null).contains(sequence) ||\r
                 (stretchGroup.getStartRes() > res) ||\r
                 (stretchGroup.getEndRes() < res))\r
         {\r
@@ -1408,15 +1447,20 @@ public class SeqPanel extends JPanel implements MouseListener,
           if (stretchGroup.cs instanceof ClustalxColourScheme)\r
           {\r
             ( (ClustalxColourScheme) stretchGroup.cs).resetClustalX(\r
-                stretchGroup.getSequences(true),\r
+                stretchGroup.getSequences(av.hiddenRepSequences),\r
                 stretchGroup.getWidth());\r
           }\r
 \r
+          if (stretchGroup.cs instanceof Blosum62ColourScheme\r
+              || stretchGroup.cs instanceof PIDColourScheme\r
+              || stretchGroup.cs.conservationApplied()\r
+              || stretchGroup.cs.getThreshold()>0)\r
+            stretchGroup.recalcConservation();\r
+\r
           if (stretchGroup.cs.conservationApplied())\r
           {\r
             SliderPanel.setConservationSlider(ap, stretchGroup.cs,\r
                                               stretchGroup.getName());\r
-            stretchGroup.recalcConservation();\r
           }\r
           else\r
           {\r
@@ -1510,7 +1554,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 \r
             Sequence nextSeq = (Sequence) av.getAlignment().getSequenceAt(oldSeq);\r
 \r
-            if (stretchGroup.getSequences(false).contains(nextSeq))\r
+            if (stretchGroup.getSequences(null).contains(nextSeq))\r
             {\r
                 stretchGroup.deleteSequence(seq, false);\r
             }\r