Merge branch 'develop' (JAL-4102 2.11.2.6 patch release) into features/r2_11_2_alphaf...
[jalview.git] / src / jalview / gui / AnnotationPanel.java
index c3b44ce..e146754 100755 (executable)
@@ -57,6 +57,7 @@ import jalview.datamodel.Annotation;
 import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.ContactListI;
 import jalview.datamodel.ContactRange;
+import jalview.datamodel.GraphLine;
 import jalview.datamodel.HiddenColumns;
 import jalview.datamodel.SequenceI;
 import jalview.gui.JalviewColourChooser.ColourChooserListener;
@@ -598,6 +599,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
         }
         else
         {
+          GraphLine thr = aa[graphStretch].getThreshold();
           int currentX = getColumnForXPos(evt.getX());
           ContactListI forCurrentX = av.getContactList(aa[graphStretch],
                   currentX);
@@ -610,11 +612,48 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
             int fr, to;
             fr = Math.min(cXci.cStart, cXci.cEnd);
             to = Math.max(cXci.cStart, cXci.cEnd);
-            for (int c = fr; c <= to; c++)
+            // select corresponding range in segment under mouse
             {
-              av.getColumnSelection().addElement(c);
+              for (int c = fr; c <= to; c++)
+              {
+                av.getColumnSelection().addElement(c);
+              }
+              av.getColumnSelection().addElement(currentX);
+            }
+            // and also select everything lower than the max range adjacent
+            // (kind of works)
+            {
+              int c = fr - 1;
+              ContactRange cr = forCurrentX.getRangeFor(fr, to);
+              double cval;
+              while (c > 0)
+              {
+                cval = forCurrentX.getContactAt(c);
+                if (// cr.getMin() <= cval &&
+                cval <= cr.getMax())
+                {
+                  av.getColumnSelection().addElement(c--);
+                }
+                else
+                {
+                  break;
+                }
+              }
+              c = to;
+              while (c < forCurrentX.getContactHeight())
+              {
+                cval = forCurrentX.getContactAt(c);
+                if (// cr.getMin() <= cval &&
+                cval <= cr.getMax())
+                {
+                  av.getColumnSelection().addElement(c++);
+                }
+                else
+                {
+                  break;
+                }
+              }
             }
-            av.getColumnSelection().addElement(currentX);
           }
         }
       }
@@ -1284,24 +1323,37 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
     if (image == null || imgWidth != image.getWidth(this)
             || image.getHeight(this) != getHeight())
     {
-      try
-      {
-        image = new BufferedImage(imgWidth,
-                ap.getAnnotationPanel().getHeight(),
-                BufferedImage.TYPE_INT_RGB);
-      } catch (OutOfMemoryError oom)
+      boolean tried = false;
+      image = null;
+      while (image == null && !tried)
       {
         try
         {
-          System.gc();
-        } catch (Exception x)
+          image = new BufferedImage(imgWidth,
+                  ap.getAnnotationPanel().getHeight(),
+                  BufferedImage.TYPE_INT_RGB);
+          tried = true;
+        } catch (IllegalArgumentException exc)
         {
+          System.err.println(
+                  "Serious issue with viewport geometry imgWidth requested was "
+                          + imgWidth);
+          return;
+        } catch (OutOfMemoryError oom)
+        {
+          try
+          {
+            System.gc();
+          } catch (Exception x)
+          {
+          }
+          ;
+          new OOMWarning(
+                  "Couldn't allocate memory to redraw screen. Please restart Jalview",
+                  oom);
+          return;
         }
-        ;
-        new OOMWarning(
-                "Couldn't allocate memory to redraw screen. Please restart Jalview",
-                oom);
-        return;
+
       }
       gg = (Graphics2D) image.getGraphics();