JAL-1173 try to catch OOMs when loading annotation onto alignment (need JAL-1176...
[jalview.git] / src / jalview / gui / AlignFrame.java
index 8672dec..8396e6a 100755 (executable)
@@ -880,7 +880,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         for (int i = 0; i < frames.length; i++)
         {
           if (frames[i] instanceof AlignFrame && frames[i] != this
-                  && ((AlignFrame) frames[i]).fileName.equals(fileName))
+                  && ((AlignFrame) frames[i]).fileName!=null && ((AlignFrame) frames[i]).fileName.equals(fileName))
           {
             try
             {
@@ -1781,6 +1781,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       }
 
       int alwidth = 0;
+      ArrayList<Integer> newGraphGroups=new ArrayList<Integer>();
+      int fgroup=-1;
 
       if (newAlignment)
       {
@@ -1848,6 +1850,16 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         {
           newDs.clear(); // tidy up
         }
+        if (alignment.getAlignmentAnnotation()!=null)
+        {
+          for (AlignmentAnnotation alan:alignment.getAlignmentAnnotation())
+          {
+            if (alan.graphGroup>fgroup)
+            {
+              fgroup=alan.graphGroup;
+            }
+          }
+        }
         if (pastedal.getAlignmentAnnotation() != null)
         {
           // Add any annotation attached to alignment.
@@ -1858,6 +1870,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
             if (alann[i].sequenceRef == null && !alann[i].autoCalculated)
             {
               AlignmentAnnotation newann = new AlignmentAnnotation(alann[i]);
+              if (newann.graphGroup>-1)
+              {
+                if (newGraphGroups.size()<=newann.graphGroup || newGraphGroups.get(newann.graphGroup)==null)
+                {
+                  for (int q=newGraphGroups.size();q<=newann.graphGroup; q++)
+                  {
+                    newGraphGroups.add(q, null);
+                  }
+                  newGraphGroups.set(newann.graphGroup,new Integer(++fgroup));
+                }
+                newann.graphGroup = newGraphGroups.get(newann.graphGroup).intValue();
+              }
+
               newann.padAnnotation(alwidth);
               alignment.addAnnotation(newann);
             }
@@ -1877,11 +1902,28 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       {
         if (sequences[i].getAnnotation() != null)
         {
+          AlignmentAnnotation newann;
           for (int a = 0; a < sequences[i].getAnnotation().length; a++)
           {
             annotationAdded = true;
-            sequences[i].getAnnotation()[a].adjustForAlignment();
-            sequences[i].getAnnotation()[a].padAnnotation(alwidth);
+            newann=sequences[i].getAnnotation()[a];
+            newann.adjustForAlignment();
+            newann.padAnnotation(alwidth);
+            if (newann.graphGroup>-1)
+            {
+              if (newann.graphGroup>-1)
+              {
+                if (newGraphGroups.size()<=newann.graphGroup || newGraphGroups.get(newann.graphGroup)==null)
+                {
+                  for (int q=newGraphGroups.size();q<=newann.graphGroup; q++)
+                  {
+                    newGraphGroups.add(q, null);
+                  }
+                  newGraphGroups.set(newann.graphGroup,new Integer(++fgroup));
+                }
+                newann.graphGroup = newGraphGroups.get(newann.graphGroup).intValue();
+              }
+            }
             alignment.addAnnotation(sequences[i].getAnnotation()[a]); // annotation
             // was
             // duplicated
@@ -1921,6 +1963,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                   newann.padAnnotation(avwidth);
                   alview[avnum].addAnnotation(newann); // annotation was
                   // duplicated earlier
+                  // TODO JAL-1145 graphGroups are not updated for sequence annotation added to several views. This may cause strangeness
                   alview[avnum].setAnnotationIndex(newann, a);
                 }
               }
@@ -1930,6 +1973,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         }
         viewport.firePropertyChange("alignment", null,
                 alignment.getSequences());
+        if (alignPanels!=null ) {for (AlignmentPanel ap:((Vector<AlignmentPanel>)alignPanels))
+        {
+          ap.validateAnnotationDimensions(false);
+        }} else { alignPanel.validateAnnotationDimensions(false);}
 
       }
       else
@@ -4114,7 +4161,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                   "Secondary Structure Prediction");
           final JMenu seqsrchmenu = new JMenu("Sequence Database Search");
           final JMenu analymenu = new JMenu("Analysis");
-          final JMenu dismenu = new JMenu("Disorder");
+          final JMenu dismenu = new JMenu("Protein Disorder");
           // JAL-940 - only show secondary structure prediction services from
           // the legacy server
           if (// Cache.getDefault("SHOW_JWS1_SERVICES", true)
@@ -4242,6 +4289,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                 }
               } catch (Exception e)
               {
+                Cache.log.debug("Exception during web service menu building process.",e);
               }
               ;
             }
@@ -4928,6 +4976,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     {
       ex.printStackTrace();
     }
+    catch (OutOfMemoryError oom)
+    {
+      try {
+        System.gc();
+      } catch (Exception x){};
+      new OOMWarning("loading data "+(protocol!=null ? (protocol.equals(FormatAdapter.PASTE) ? "from clipboard." : "using "+protocol+" from "+file) : ".")+(format!=null ? "(parsing as '"+format+"' file)" :""), oom, Desktop.desktop);
+    }
   }
 
   @Override
@@ -5355,6 +5410,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   @Override
   protected void normaliseSequenceLogo_actionPerformed(ActionEvent e)
   {
+    showSequenceLogo.setState(true);
+    viewport.setShowSequenceLogo(true);
     viewport.setNormaliseSequenceLogo(normaliseSequenceLogo.getState());
     alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
   }