JAL-612 - catch hidden OOM related to filling in cut and paste text boxes
[jalview.git] / src / jalview / gui / AlignFrame.java
index 2e6ea52..b0d30a2 100755 (executable)
@@ -30,12 +30,15 @@ import javax.swing.*;
 import javax.swing.event.MenuEvent;
 
 import jalview.analysis.*;
+import jalview.bin.Cache;
 import jalview.commands.*;
 import jalview.datamodel.*;
 import jalview.io.*;
 import jalview.jbgui.*;
 import jalview.schemes.*;
 import jalview.ws.*;
+import jalview.ws.jws1.Discoverer;
+import jalview.ws.jws2.Jws2Discoverer;
 
 /**
  * DOCUMENT ME!
@@ -513,32 +516,43 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   private void addServiceListeners()
   {
     final java.beans.PropertyChangeListener thisListener;
-    // Do this once to get current state
-    BuildWebServiceMenu();
-    Desktop.discoverer
-            .addPropertyChangeListener(thisListener = new java.beans.PropertyChangeListener()
+    Desktop.instance.addJalviewPropertyChangeListener("services",
+            thisListener = new java.beans.PropertyChangeListener()
             {
               public void propertyChange(PropertyChangeEvent evt)
               {
-                // System.out.println("Discoverer property change.");
-                if (evt.getPropertyName().equals("services"))
+                // // System.out.println("Discoverer property change.");
+                // if (evt.getPropertyName().equals("services"))
                 {
-                  // System.out.println("Rebuilding web service menu");
-                  BuildWebServiceMenu();
+                  SwingUtilities.invokeLater(new Runnable()
+                  {
+
+                    public void run()
+                    {
+                      System.err
+                              .println("Rebuild WS Menu for service change");
+                      BuildWebServiceMenu();
+                    }
+
+                  });
                 }
               }
             });
-
     addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
     {
       public void internalFrameClosed(
               javax.swing.event.InternalFrameEvent evt)
       {
-        // System.out.println("deregistering discoverer listener");
-        Desktop.discoverer.removePropertyChangeListener(thisListener);
+        System.out.println("deregistering discoverer listener");
+        Desktop.instance.removeJalviewPropertyChangeListener("services",
+                thisListener);
         closeMenuItem_actionPerformed(true);
       };
     });
+    // Finally, build the menu once to get current service state
+    javax.swing.SwingUtilities.invokeLater(new Runnable() {
+    public void run() { BuildWebServiceMenu();}
+    });
   }
 
   public void setGUINucleotide(boolean nucleotide)
@@ -588,7 +602,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     annotationPanelMenuItem.setState(av.showAnnotation);
     viewBoxesMenuItem.setSelected(av.showBoxes);
     viewTextMenuItem.setSelected(av.showText);
-    showUnconservedMenuItem.setSelected(av.showUnconserved);
+    showNonconservedMenuItem.setSelected(av.showUnconserved);
     showGroupConsensus.setSelected(av.showGroupConsensus);
     showGroupConservation.setSelected(av.showGroupConservation);
     showConsensusHistogram.setSelected(av.showConsensusHistogram);
@@ -991,11 +1005,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     CutAndPasteTransfer cap = new CutAndPasteTransfer();
     cap.setForInput(null);
+
+    try {
+      cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
+            viewport.alignment, omitHidden, viewport.colSel));
     Desktop.addInternalFrame(cap, "Alignment output - "
             + e.getActionCommand(), 600, 500);
+    } catch (OutOfMemoryError oom)
+    {
+      new OOMWarning("Outputting alignment as "+e.getActionCommand(),oom);
+      cap.dispose();
+    }
 
-    cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
-            viewport.alignment, omitHidden, viewport.colSel));
   }
 
   /**
@@ -1530,15 +1551,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     if (viewport.hasHiddenColumns)
     {
       hiddenColumns = new Vector();
-      int hiddenOffset = viewport.getSelectionGroup().getStartRes();
+      int hiddenOffset = viewport.getSelectionGroup().getStartRes(), hiddenCutoff = viewport
+              .getSelectionGroup().getEndRes();
       for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()
               .size(); i++)
       {
         int[] region = (int[]) viewport.getColumnSelection()
                 .getHiddenColumns().elementAt(i);
-
-        hiddenColumns.addElement(new int[]
-        { region[0] - hiddenOffset, region[1] - hiddenOffset });
+        if (region[0] >= hiddenOffset && region[1] <= hiddenCutoff)
+        {
+          hiddenColumns.addElement(new int[]
+          { region[0] - hiddenOffset, region[1] - hiddenOffset });
+        }
       }
     }
 
@@ -3782,87 +3806,134 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     return tp;
   }
 
+  private boolean buildingMenu = false;
+
   /**
    * Generates menu items and listener event actions for web service clients
    * 
    */
   public void BuildWebServiceMenu()
   {
-    // TODO: add support for context dependent disabling of services based on
-    // alignment and current selection
-    // TODO: add additional serviceHandle parameter to specify abstract handler
-    // class independently of AbstractName
-    // TODO: add in rediscovery GUI function to restart discoverer
-    // TODO: group services by location as well as function and/or introduce
-    // object broker mechanism.
-    if ((Discoverer.services != null) && (Discoverer.services.size() > 0))
-    {
-      // TODO: refactor to allow list of AbstractName/Handler bindings to be
-      // stored or retrieved from elsewhere
-      Vector msaws = (Vector) Discoverer.services.get("MsaWS");
-      Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
-      Vector seqsrch = (Vector) Discoverer.services.get("SeqSearch");
-      // TODO: move GUI generation code onto service implementation - so a
-      // client instance attaches itself to the GUI with method call like
-      // jalview.ws.MsaWSClient.bind(servicehandle, Desktop.instance,
-      // alignframe)
+    while (buildingMenu)
+    {
+      try
+      {
+        System.err.println("Waiting for building menu to finish.");
+        Thread.sleep(10);
+      } catch (Exception e)
+      {
+      }
+      ;
+    }
+    buildingMenu = true;
+    try
+    {
+      System.err
+              .println("Building ws menu again " + Thread.currentThread());
+      // TODO: add support for context dependent disabling of services based on
+      // alignment and current selection
+      // TODO: add additional serviceHandle parameter to specify abstract
+      // handler
+      // class independently of AbstractName
+      // TODO: add in rediscovery GUI function to restart discoverer
+      // TODO: group services by location as well as function and/or introduce
+      // object broker mechanism.
       Vector wsmenu = new Vector();
       final IProgressIndicator af = this;
-      if (msaws != null)
+      if (Cache.getDefault("SHOW_JWS1_SERVICES", true)
+              && Discoverer.services != null
+              && (Discoverer.services.size() > 0))
       {
-        // Add any Multiple Sequence Alignment Services
-        final JMenu msawsmenu = new JMenu("Alignment");
-        for (int i = 0, j = msaws.size(); i < j; i++)
+        // TODO: refactor to allow list of AbstractName/Handler bindings to be
+        // stored or retrieved from elsewhere
+        Vector msaws = (Vector) Discoverer.services.get("MsaWS");
+        Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
+        Vector seqsrch = (Vector) Discoverer.services.get("SeqSearch");
+        // TODO: move GUI generation code onto service implementation - so a
+        // client instance attaches itself to the GUI with method call like
+        // jalview.ws.MsaWSClient.bind(servicehandle, Desktop.instance,
+        // alignframe)
+        if (msaws != null)
         {
-          final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws
-                  .get(i);
-          jalview.ws.WSClient impl = jalview.ws.Discoverer
-                  .getServiceClient(sh);
-          impl.attachWSMenuEntry(msawsmenu, this);
+          // Add any Multiple Sequence Alignment Services
+          final JMenu msawsmenu = new JMenu("Alignment");
+          for (int i = 0, j = msaws.size(); i < j; i++)
+          {
+            final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws
+                    .get(i);
+            jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer
+                    .getServiceClient(sh);
+            impl.attachWSMenuEntry(msawsmenu, this);
 
+          }
+          wsmenu.add(msawsmenu);
+        }
+        if (secstrpr != null)
+        {
+          // Add any secondary structure prediction services
+          final JMenu secstrmenu = new JMenu(
+                  "Secondary Structure Prediction");
+          for (int i = 0, j = secstrpr.size(); i < j; i++)
+          {
+            final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) secstrpr
+                    .get(i);
+            jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer
+                    .getServiceClient(sh);
+            impl.attachWSMenuEntry(secstrmenu, this);
+          }
+          wsmenu.add(secstrmenu);
+        }
+        if (seqsrch != null)
+        {
+          // Add any sequence search services
+          final JMenu seqsrchmenu = new JMenu("Sequence Database Search");
+          for (int i = 0, j = seqsrch.size(); i < j; i++)
+          {
+            final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) seqsrch
+                    .elementAt(i);
+            jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer
+                    .getServiceClient(sh);
+            impl.attachWSMenuEntry(seqsrchmenu, this);
+          }
+          wsmenu.add(seqsrchmenu);
         }
-        wsmenu.add(msawsmenu);
       }
-      if (secstrpr != null)
+
+      // TODO: move into separate menu builder class.
+      if (Cache.getDefault("SHOW_JWS2_SERVICES", true))
       {
-        // Add any secondary structure prediction services
-        final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
-        for (int i = 0, j = secstrpr.size(); i < j; i++)
+        Jws2Discoverer jws2servs = Jws2Discoverer.getDiscoverer();
+        if (jws2servs != null)
         {
-          final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) secstrpr
-                  .get(i);
-          jalview.ws.WSClient impl = jalview.ws.Discoverer
-                  .getServiceClient(sh);
-          impl.attachWSMenuEntry(secstrmenu, this);
+          if (jws2servs.hasServices())
+          {
+            JMenu jws2men = new JMenu("Jalview 2 Services");
+            jws2servs.attachWSMenuEntry(jws2men, this);
+            for (int i = 0, iSize = jws2men.getMenuComponentCount(); i < iSize; i++)
+            {
+              wsmenu.add(jws2men.getMenuComponent(i));
+            }
+          }
         }
-        wsmenu.add(secstrmenu);
       }
-      if (seqsrch != null)
+      resetWebServiceMenu();
+      // finally, add the whole shebang onto the webservices menu
+      if (wsmenu.size() > 0)
       {
-        // Add any sequence search services
-        final JMenu seqsrchmenu = new JMenu("Sequence Database Search");
-        for (int i = 0, j = seqsrch.size(); i < j; i++)
+        for (int i = 0, j = wsmenu.size(); i < j; i++)
         {
-          final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) seqsrch
-                  .elementAt(i);
-          jalview.ws.WSClient impl = jalview.ws.Discoverer
-                  .getServiceClient(sh);
-          impl.attachWSMenuEntry(seqsrchmenu, this);
+          webService.add((JMenu) wsmenu.get(i));
         }
-        wsmenu.add(seqsrchmenu);
       }
-      // finally, add the whole shebang onto the webservices menu
-      resetWebServiceMenu();
-      for (int i = 0, j = wsmenu.size(); i < j; i++)
+      else
       {
-        webService.add((JMenu) wsmenu.get(i));
+        this.webService.add(this.webServiceNoServices);
       }
-    }
-    else
+    } catch (Exception e)
     {
-      resetWebServiceMenu();
-      this.webService.add(this.webServiceNoServices);
     }
+    ;
+    buildingMenu = false;
   }
 
   /**
@@ -3884,8 +3955,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    */
   private void build_urlServiceMenu(JMenu webService)
   {
-    jalview.ws.EnfinEnvision2OneWay.getInstance().attachWSMenuEntry(
-            webService, this);
+    if (Cache.getDefault("SHOW_ENFIN_SERVICES", true))
+    {
+      jalview.ws.EnfinEnvision2OneWay.getInstance().attachWSMenuEntry(
+              webService, this);
+    }
   }
 
   /*
@@ -4555,7 +4629,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    */
   protected void showUnconservedMenuItem_actionPerformed(ActionEvent e)
   {
-    viewport.setShowUnconserved(showUnconservedMenuItem.getState());
+    viewport.setShowUnconserved(showNonconservedMenuItem.getState());
     alignPanel.paintAlignment(true);
   }
 
@@ -4638,9 +4712,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       // set view properties for each group
       for (int g = 0; g < gps.length; g++)
       {
-        gps[g].setShowunconserved(viewport.getShowUnconserved());
-        gps[g].setIncludeAllConsSymbols(viewport
-                .isIncludeAllConsensusSymbols());
+        gps[g].setShowNonconserved(viewport.getShowUnconserved());
+        gps[g].setshowSequenceLogo(viewport.isShowSequenceLogo());
         viewport.alignment.addGroup(gps[g]);
         Color col = new Color((int) (Math.random() * 255), (int) (Math
                 .random() * 255), (int) (Math.random() * 255));