trim hidden regions outside selection when copying selected region to clipboard ...
[jalview.git] / src / jalview / gui / AlignFrame.java
index 2e6ea52..2d1fc1e 100755 (executable)
@@ -36,6 +36,8 @@ import jalview.io.*;
 import jalview.jbgui.*;
 import jalview.schemes.*;
 import jalview.ws.*;
+import jalview.ws.jws1.Discoverer;
+import jalview.ws.jws2.Jws2Discoverer;
 
 /**
  * DOCUMENT ME!
@@ -512,7 +514,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   /* Set up intrinsic listeners for dynamically generated GUI bits. */
   private void addServiceListeners()
   {
-    final java.beans.PropertyChangeListener thisListener;
+    final java.beans.PropertyChangeListener thisListener, thatListener;
     // Do this once to get current state
     BuildWebServiceMenu();
     Desktop.discoverer
@@ -523,12 +525,32 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                 // System.out.println("Discoverer property change.");
                 if (evt.getPropertyName().equals("services"))
                 {
-                  // System.out.println("Rebuilding web service menu");
-                  BuildWebServiceMenu();
+                  SwingUtilities.invokeLater(new Runnable()
+                  {
+
+                    @Override
+                    public void run()
+                    {
+                      System.err
+                              .println("Change support JWS1: build services again.");
+                      BuildWebServiceMenu();
+                    }
+
+                  });
                 }
               }
             });
-
+    jalview.ws.jws2.Jws2Discoverer.getDiscoverer()
+            .addPropertyChangeListener(
+                    thatListener = new java.beans.PropertyChangeListener()
+                    {
+                      public void propertyChange(PropertyChangeEvent evt)
+                      {
+                        System.err
+                                .println("Change support JWS2: build services again.");
+                        BuildWebServiceMenu();
+                      }
+                    });
     addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
     {
       public void internalFrameClosed(
@@ -536,6 +558,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       {
         // System.out.println("deregistering discoverer listener");
         Desktop.discoverer.removePropertyChangeListener(thisListener);
+        jalview.ws.jws2.Jws2Discoverer.getDiscoverer()
+                .removePropertyChangeListener(thatListener);
         closeMenuItem_actionPerformed(true);
       };
     });
@@ -588,7 +612,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);
@@ -1530,15 +1554,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 +3809,135 @@ 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 ((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.
       {
-        // 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);
+            wsmenu.add(jws2men);
+          }
+          else
+          {
+            if (!jws2servs.isRunning())
+            {
+              new Thread(jws2servs).start();
+            }
+          }
         }
-        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;
   }
 
   /**
@@ -4555,7 +4630,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,7 +4713,7 @@ 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].setShowNonconserved(viewport.getShowUnconserved());
         gps[g].setIncludeAllConsSymbols(viewport
                 .isIncludeAllConsensusSymbols());
         viewport.alignment.addGroup(gps[g]);