JAL-3949 Complete new abstracted logging framework in jalview.log. Updated log calls...
[jalview.git] / src / jalview / gui / VamsasApplication.java
index 777d71b..7881ec9 100644 (file)
@@ -1,26 +1,29 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)
- * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
  * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
+ * This file is part of Jalview.
  * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * PURPOSE.  See the GNU General Public License for more details.
  * 
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
  */
 package jalview.gui;
 
 import jalview.bin.Cache;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.HiddenColumns;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.io.VamsasAppDatastore;
@@ -28,24 +31,24 @@ import jalview.structure.SelectionListener;
 import jalview.structure.SelectionSource;
 import jalview.structure.StructureSelectionManager;
 import jalview.structure.VamsasListener;
+import jalview.structure.VamsasSource;
+import jalview.util.MessageManager;
+import jalview.viewmodel.AlignmentViewport;
 
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.io.File;
 import java.io.IOException;
-import java.util.Enumeration;
 import java.util.Hashtable;
 import java.util.IdentityHashMap;
 import java.util.Iterator;
 
 import javax.swing.JInternalFrame;
-import javax.swing.JOptionPane;
 
 import uk.ac.vamsas.client.ClientHandle;
 import uk.ac.vamsas.client.IClient;
 import uk.ac.vamsas.client.IClientDocument;
 import uk.ac.vamsas.client.InvalidSessionDocumentException;
-import uk.ac.vamsas.client.NoDefaultSessionException;
 import uk.ac.vamsas.client.UserHandle;
 import uk.ac.vamsas.client.VorbaId;
 import uk.ac.vamsas.client.picking.IMessageHandler;
@@ -62,7 +65,7 @@ import uk.ac.vamsas.objects.core.Seg;
  * @author jimp
  * 
  */
-public class VamsasApplication implements SelectionSource
+public class VamsasApplication implements SelectionSource, VamsasSource
 {
   IClient vclient = null;
 
@@ -72,12 +75,13 @@ public class VamsasApplication implements SelectionSource
 
   Desktop jdesktop = null; // our jalview desktop reference
 
-  private boolean inInitialUpdate=true;
+  private boolean inInitialUpdate = true;
 
   // Cache.preferences for vamsas client session arena
   // preferences for check for default session at startup.
   // user and organisation stuff.
-  public VamsasApplication(Desktop jdesktop, File sessionPath, String sessionName)
+  public VamsasApplication(Desktop jdesktop, File sessionPath,
+          String sessionName)
   {
     // JBPNote:
     // we should create a session URI from the sessionPath and pass it to
@@ -86,7 +90,6 @@ public class VamsasApplication implements SelectionSource
     initClientSession(null, sessionPath, sessionName);
   }
 
-
   private static uk.ac.vamsas.client.IClientFactory getClientFactory()
           throws IOException
   {
@@ -138,10 +141,11 @@ public class VamsasApplication implements SelectionSource
    */
   private void initClientSession(String sess, File vamsasDocument)
   {
-    initClientSession(sess,vamsasDocument,null);
+    initClientSession(sess, vamsasDocument, null);
   }
 
-  private boolean initClientSession(String sess, File vamsasDocument, String newDocSessionName)
+  private boolean initClientSession(String sess, File vamsasDocument,
+          String newDocSessionName)
   {
     try
     {
@@ -152,28 +156,30 @@ public class VamsasApplication implements SelectionSource
       {
         if (sess != null)
         {
-          throw new Error(
-                  "Implementation Error - cannot import existing vamsas document into an existing session, Yet!");
+          throw new Error(MessageManager.getString(
+                  "error.implementation_error_cannot_import_vamsas_doc"));
         }
         try
         {
-          if (newDocSessionName!=null)
+          if (newDocSessionName != null)
           {
             vclient = clientfactory.openAsNewSessionIClient(app,
-                    vamsasDocument,newDocSessionName);
-          } else {
+                    vamsasDocument, newDocSessionName);
+          }
+          else
+          {
             vclient = clientfactory.openAsNewSessionIClient(app,
-                  vamsasDocument);
+                    vamsasDocument);
           }
         } catch (InvalidSessionDocumentException e)
         {
-          JOptionPane
-                  .showInternalMessageDialog(
-                          Desktop.desktop,
+          JvOptionPane.showInternalMessageDialog(Desktop.desktop,
 
-                          "VAMSAS Document could not be opened as a new session - please choose another",
-                          "VAMSAS Document Import Failed",
-                          JOptionPane.ERROR_MESSAGE);
+                  MessageManager.getString(
+                          "label.vamsas_doc_couldnt_be_opened_as_new_session"),
+                  MessageManager
+                          .getString("label.vamsas_document_import_failed"),
+                  JvOptionPane.ERROR_MESSAGE);
 
         }
       }
@@ -195,8 +201,8 @@ public class VamsasApplication implements SelectionSource
 
     } catch (Exception e)
     {
-      jalview.bin.Cache.log
-              .error("Couldn't instantiate vamsas client !", e);
+      Cache.error("Couldn't instantiate vamsas client !",
+              e);
       return false;
     }
     return true;
@@ -219,16 +225,14 @@ public class VamsasApplication implements SelectionSource
       }
     } catch (Error e)
     {
-      Cache.log
-              .warn(
-                      "Probable SERIOUS VAMSAS client incompatibility - carrying on regardless",
-                      e);
+      Cache.warn(
+              "Probable SERIOUS VAMSAS client incompatibility - carrying on regardless",
+              e);
     } catch (Exception e)
     {
-      Cache.log
-              .warn(
-                      "Probable VAMSAS client incompatibility - carrying on regardless",
-                      e);
+      Cache.warn(
+              "Probable VAMSAS client incompatibility - carrying on regardless",
+              e);
     }
   }
 
@@ -239,8 +243,8 @@ public class VamsasApplication implements SelectionSource
    */
   private ClientHandle getJalviewHandle()
   {
-    return new ClientHandle("jalview.bin.Jalview", jalview.bin.Cache
-            .getProperty("VERSION"));
+    return new ClientHandle("jalview.bin.Jalview",
+            Cache.getProperty("VERSION"));
   }
 
   /**
@@ -261,18 +265,18 @@ public class VamsasApplication implements SelectionSource
     if (!inSession())
     {
       throw new Error(
-              "Impementation error! Vamsas Operations when client not initialised and connected.");
+              "Implementation error! Vamsas Operations when client not initialised and connected");
     }
     addDocumentUpdateHandler();
     addStoreDocumentHandler();
     startSession();
     inInitialUpdate = true;
-    Cache.log
-            .debug("Jalview loading the Vamsas Session for the first time.");
+    Cache.debug(
+            "Jalview loading the Vamsas Session for the first time.");
     dealWithDocumentUpdate(false); // we don't push an update out to the
     inInitialUpdate = false;
     // document yet.
-    Cache.log.debug("... finished update for the first time.");
+    Cache.debug("... finished update for the first time.");
   }
 
   /**
@@ -302,10 +306,9 @@ public class VamsasApplication implements SelectionSource
       }
     } catch (Exception e)
     {
-      Cache.log
-              .warn(
-                      "Exception whilst refreshing jalview windows after a vamsas document update.",
-                      e);
+      Cache.warn(
+              "Exception whilst refreshing jalview windows after a vamsas document update.",
+              e);
     }
   }
 
@@ -314,13 +317,13 @@ public class VamsasApplication implements SelectionSource
     Thread udthread = new Thread(new Runnable()
     {
 
+      @Override
       public void run()
       {
-        Cache.log.info("Jalview updating to the Vamsas Session.");
+        Cache.info("Jalview updating to the Vamsas Session.");
 
-        
         dealWithDocumentUpdate(true);
-        Cache.log.info("Jalview finished updating to the Vamsas Session.");
+        Cache.info("Jalview finished updating to the Vamsas Session.");
       }
 
     });
@@ -347,8 +350,10 @@ public class VamsasApplication implements SelectionSource
   public void end_session(boolean promptUser)
   {
     if (!inSession())
-      throw new Error("Jalview not connected to Vamsas session.");
-    Cache.log.info("Jalview disconnecting from the Vamsas Session.");
+    {
+      throw new Error("Jalview not connected to Vamsas session");
+    }
+    Cache.info("Jalview disconnecting from the Vamsas Session.");
     try
     {
       if (joinedSession)
@@ -356,13 +361,13 @@ public class VamsasApplication implements SelectionSource
         boolean ourprompt = this.promptUser;
         this.promptUser = promptUser;
         vclient.finalizeClient();
-        Cache.log.info("Jalview has left the session.");
+        Cache.info("Jalview has left the session.");
         this.promptUser = ourprompt; // restore default value
       }
       else
       {
-        Cache.log
-                .warn("JV Client leaving a session that's its not joined yet.");
+        Cache.warn(
+                "JV Client leaving a session that's its not joined yet.");
       }
       joinedSession = false;
       vclient = null;
@@ -372,13 +377,13 @@ public class VamsasApplication implements SelectionSource
       vobj2jv = null;
     } catch (Exception e)
     {
-      Cache.log.error("Vamsas Session finalization threw exceptions!", e);
+      Cache.error("Vamsas Session finalization threw exceptions!", e);
     }
   }
 
   public void updateJalview(IClientDocument cdoc)
   {
-    Cache.log.debug("Jalview updating from sesion document ..");
+    Cache.debug("Jalview updating from sesion document ..");
     ensureJvVamsas();
     VamsasAppDatastore vds = new VamsasAppDatastore(cdoc, vobj2jv, jv2vobj,
             baseProvEntry(), alRedoState);
@@ -387,7 +392,7 @@ public class VamsasApplication implements SelectionSource
       vds.updateToJalview();
     } catch (Exception e)
     {
-      Cache.log.error("Failed to update Jalview from vamsas document.", e);
+      Cache.error("Failed to update Jalview from vamsas document.", e);
     }
     try
     {
@@ -399,10 +404,10 @@ public class VamsasApplication implements SelectionSource
       }
     } catch (Exception e)
     {
-      Cache.log.error(
+      Cache.error(
               "Exception when updating Jalview settings from Appdata.", e);
     }
-    Cache.log.debug(".. finished updating from sesion document.");
+    Cache.debug(".. finished updating from sesion document.");
 
   }
 
@@ -441,7 +446,7 @@ public class VamsasApplication implements SelectionSource
    */
   public int updateVamsasDocument(IClientDocument doc)
   {
-    int storedviews=0;
+    int storedviews = 0;
     ensureJvVamsas();
     errorsDuringUpdate = false;
     errorsDuringAppUpdate = false;
@@ -476,11 +481,10 @@ public class VamsasApplication implements SelectionSource
             } catch (Exception e)
             {
               errorsDuringUpdate = true;
-              Cache.log.error("Exception synchronizing "
-                      + af.getTitle()
+              Cache.error("Exception synchronizing " + af.getTitle()
                       + " "
-                      + (af.getViewport().viewName == null ? "" : " view "
-                              + af.getViewport().viewName)
+                      + (af.getViewport().getViewName() == null ? ""
+                              : " view " + af.getViewport().getViewName())
                       + " to document.", e);
               stored = false;
             }
@@ -515,7 +519,7 @@ public class VamsasApplication implements SelectionSource
       }
     } catch (Exception e)
     {
-      Cache.log.error("Exception synchronizing Views to Document :", e);
+      Cache.error("Exception synchronizing Views to Document :", e);
       errorsDuringUpdate = true;
     }
 
@@ -532,7 +536,7 @@ public class VamsasApplication implements SelectionSource
       }
     } catch (Exception e)
     {
-      Cache.log.error("Client Appdata Write exception", e);
+      Cache.error("Client Appdata Write exception", e);
       errorsDuringAppUpdate = true;
     }
     vds.clearSkipList();
@@ -554,38 +558,38 @@ public class VamsasApplication implements SelectionSource
    * 
    * @param fromJalview
    *          true to update from jalview to the vamsas document
-   *          @return total number of stored alignments in the document after the update 
+   * @return total number of stored alignments in the document after the update
    */
   protected int dealWithDocumentUpdate(boolean fromJalview)
   {
     int storedviews = 0;
     // called by update handler for document update.
-    Cache.log.debug("Updating jalview from changed vamsas document.");
+    Cache.debug("Updating jalview from changed vamsas document.");
     disableGui(true);
     try
     {
       long time = System.currentTimeMillis();
       IClientDocument cdoc = vclient.getClientDocument();
-      if (Cache.log.isDebugEnabled())
+      if (Cache.isDebugEnabled())
       {
-        Cache.log.debug("Time taken to get ClientDocument = "
+        Cache.debug("Time taken to get ClientDocument = "
                 + (System.currentTimeMillis() - time));
         time = System.currentTimeMillis();
       }
       if (fromJalview)
       {
-        storedviews+=updateVamsasDocument(cdoc);
-        if (Cache.log.isDebugEnabled())
+        storedviews += updateVamsasDocument(cdoc);
+        if (Cache.isDebugEnabled())
         {
-          Cache.log
-                  .debug("Time taken to update Vamsas Document from jalview\t= "
+          Cache.debug(
+                  "Time taken to update Vamsas Document from jalview\t= "
                           + (System.currentTimeMillis() - time));
           time = System.currentTimeMillis();
         }
         cdoc.setVamsasRoots(cdoc.getVamsasRoots());
-        if (Cache.log.isDebugEnabled())
+        if (Cache.isDebugEnabled())
         {
-          Cache.log.debug("Time taken to set Document Roots\t\t= "
+          Cache.debug("Time taken to set Document Roots\t\t= "
                   + (System.currentTimeMillis() - time));
           time = System.currentTimeMillis();
         }
@@ -593,19 +597,19 @@ public class VamsasApplication implements SelectionSource
       else
       {
         updateJalview(cdoc);
-        if (Cache.log.isDebugEnabled())
+        if (Cache.isDebugEnabled())
         {
-          Cache.log
-                  .debug("Time taken to update Jalview from vamsas document Roots\t= "
+          Cache.debug(
+                  "Time taken to update Jalview from vamsas document Roots\t= "
                           + (System.currentTimeMillis() - time));
           time = System.currentTimeMillis();
         }
 
       }
       vclient.updateDocument(cdoc);
-      if (Cache.log.isDebugEnabled())
+      if (Cache.isDebugEnabled())
       {
-        Cache.log.debug("Time taken to update Session Document\t= "
+        Cache.debug("Time taken to update Session Document\t= "
                 + (System.currentTimeMillis() - time));
         time = System.currentTimeMillis();
       }
@@ -617,9 +621,9 @@ public class VamsasApplication implements SelectionSource
       // recover object map backup, since its probably corrupted with references
       // to Vobjects that don't exist anymore.
       recover_objectMappingBackup();
-      storedviews=0;
+      storedviews = 0;
     }
-    Cache.log.debug("Finished updating from document change.");
+    Cache.debug("Finished updating from document change.");
     disableGui(false);
     return storedviews;
   }
@@ -629,14 +633,15 @@ public class VamsasApplication implements SelectionSource
     final VamsasApplication client = this;
     vclient.addDocumentUpdateHandler(new PropertyChangeListener()
     {
+      @Override
       public void propertyChange(PropertyChangeEvent evt)
       {
-        Cache.log.debug("Dealing with document update event.");
+        Cache.debug("Dealing with document update event.");
         client.dealWithDocumentUpdate(false);
-        Cache.log.debug("finished dealing with event.");
+        Cache.debug("finished dealing with event.");
       }
     });
-    Cache.log.debug("Added Jalview handler for vamsas document updates.");
+    Cache.debug("Added Jalview handler for vamsas document updates.");
   }
 
   private void addStoreDocumentHandler()
@@ -646,43 +651,43 @@ public class VamsasApplication implements SelectionSource
             uk.ac.vamsas.client.Events.DOCUMENT_REQUESTTOCLOSE,
             new PropertyChangeListener()
             {
+              @Override
               public void propertyChange(PropertyChangeEvent evt)
               {
                 if (client.promptUser)
                 {
-                  Cache.log
-                          .debug("Asking user if the vamsas session should be stored.");
-                  int reply = JOptionPane
-                          .showInternalConfirmDialog(
-                                  Desktop.desktop,
-                                  "The current VAMSAS session has unsaved data - do you want to save it ?",
-                                  "VAMSAS Session Shutdown",
-                                  JOptionPane.YES_NO_OPTION,
-                                  JOptionPane.QUESTION_MESSAGE);
-
-                  if (reply == JOptionPane.YES_OPTION)
+                  Cache.debug(
+                          "Asking user if the vamsas session should be stored.");
+                  int reply = JvOptionPane.showInternalConfirmDialog(
+                          Desktop.desktop,
+                          "The current VAMSAS session has unsaved data - do you want to save it ?",
+                          "VAMSAS Session Shutdown",
+                          JvOptionPane.YES_NO_OPTION,
+                          JvOptionPane.QUESTION_MESSAGE);
+
+                  if (reply == JvOptionPane.YES_OPTION)
                   {
-                    Cache.log.debug("Prompting for vamsas store filename.");
+                    Cache.debug("Prompting for vamsas store filename.");
                     Desktop.instance.vamsasSave_actionPerformed(null);
-                    Cache.log
-                            .debug("Finished attempt at storing document.");
+                    Cache.debug("Finished attempt at storing document.");
                   }
-                  Cache.log
-                          .debug("finished dealing with REQUESTTOCLOSE event.");
+                  Cache.debug(
+                          "finished dealing with REQUESTTOCLOSE event.");
                 }
                 else
                 {
-                  Cache.log
-                          .debug("Ignoring store document request (promptUser==false)");
+                  Cache.debug(
+                          "Ignoring store document request (promptUser==false)");
                 }
               }
             });
-    Cache.log.debug("Added Jalview handler for vamsas document updates.");
+    Cache.debug("Added Jalview handler for vamsas document updates.");
   }
 
   public void disableGui(boolean b)
   {
-    Desktop.instance.setVamsasUpdate(b);
+    // JAL-3311 TODO: remove this class!
+    // Desktop.instance.setVamsasUpdate(b);
   }
 
   Hashtable _backup_vobj2jv;
@@ -709,13 +714,14 @@ public class VamsasApplication implements SelectionSource
   {
     if (_backup_vobj2jv == null)
     {
-      if (inInitialUpdate) {
+      if (inInitialUpdate)
+      {
         // nothing to recover so just
         return;
       }
-      
+
       throw new Error(
-              "IMPLEMENTATION ERROR: Cannot recover vamsas object mappings - no backup was made.");
+              "IMPLEMENTATION ERROR: Cannot recover vamsas object mappings - no backup was made");
     }
     jv2vobj.clear();
     Iterator el = _backup_jv2vobj.entrySet().iterator();
@@ -749,19 +755,20 @@ public class VamsasApplication implements SelectionSource
       } catch (Exception e)
       {
         // Complain to GUI
-        Cache.log.error("Failed to join vamsas session.", e);
+        Cache.error("Failed to join vamsas session.", e);
         vclient = null;
       }
       try
       {
         final IPickManager pm = vclient.getPickManager();
         final StructureSelectionManager ssm = StructureSelectionManager
-                .getStructureSelectionManager();
-        final SelectionSource me = this;
+                .getStructureSelectionManager(Desktop.instance);
+        final VamsasApplication me = this;
         pm.registerMessageHandler(new IMessageHandler()
         {
           String last = null;
 
+          @Override
           public void handleMessage(Message message)
           {
             if (vobj2jv == null)
@@ -777,20 +784,20 @@ public class VamsasApplication implements SelectionSource
               {
                 return;
               }
-              // if (Cache.log.isDebugEnabled())
+              // if (Cache.isDebugEnabled())
               // {
-              // Cache.log.debug("Received MouseOverMessage "+mm.getVorbaID()+"
+              // Cache.debug("Received MouseOverMessage "+mm.getVorbaID()+"
               // "+mm.getPosition());
               // }
               Object jvobj = vobj2jv.get(mm.getVorbaID());
               if (jvobj != null && jvobj instanceof SequenceI)
               {
                 last = mstring;
-                // Cache.log.debug("Handling Mouse over "+mm.getVorbaID()+"
+                // Cache.debug("Handling Mouse over "+mm.getVorbaID()+"
                 // bound to "+jvobj+" at "+mm.getPosition());
                 // position is character position in aligned sequence
-                ssm.mouseOverVamsasSequence((SequenceI) jvobj, mm
-                        .getPosition());
+                ssm.mouseOverVamsasSequence((SequenceI) jvobj,
+                        mm.getPosition(), me);
               }
             }
             if (message instanceof uk.ac.vamsas.client.picking.SelectionMessage)
@@ -805,7 +812,7 @@ public class VamsasApplication implements SelectionSource
               {
                 // TODO: rationalise : can only clear a selection over a
                 // referred to object
-                ssm.sendSelection(null, null, me);
+                ssm.sendSelection(null, null, null, me);
                 return;
               }
               Class type = null;
@@ -910,23 +917,22 @@ public class VamsasApplication implements SelectionSource
                     for (int p = 0; p < prange.length; p += 2)
                     {
                       int d = (prange[p] <= prange[p + 1]) ? 1 : -1;
-                        // try to join up adjacent columns to make a larger
-                        // selection
-                        // lower and upper bounds
-                        int l = (d < 0) ? 1 : 0;
-                        int u = (d > 0) ? 1 : 0;
-
-                        if (jselection.getStartRes() > 0
-                                && prange[p + l] == jselection
-                                        .getStartRes())
-                        {
-                          jselection.setStartRes(prange[p + l] - 1);
-                        }
-                        if (jselection.getEndRes() <= maxWidth
-                                && prange[p + u] == (jselection.getEndRes() + 2))
-                        {
-                          jselection.setEndRes(prange[p + u] - 1);
-                        }
+                      // try to join up adjacent columns to make a larger
+                      // selection
+                      // lower and upper bounds
+                      int l = (d < 0) ? 1 : 0;
+                      int u = (d > 0) ? 1 : 0;
+
+                      if (jselection.getStartRes() > 0
+                              && prange[p + l] == jselection.getStartRes())
+                      {
+                        jselection.setStartRes(prange[p + l] - 1);
+                      }
+                      if (jselection.getEndRes() <= maxWidth && prange[p
+                              + u] == (jselection.getEndRes() + 2))
+                      {
+                        jselection.setEndRes(prange[p + u] - 1);
+                      }
                       // mark all the columns in the range.
                       for (int sr = prange[p], er = prange[p + 1], de = er
                               + d; sr != de; sr += d)
@@ -940,7 +946,7 @@ public class VamsasApplication implements SelectionSource
               }
               if (send)
               {
-                ssm.sendSelection(jselection, colsel, me);
+                ssm.sendSelection(jselection, colsel, null, me);
               }
               // discard message.
               for (int c = 0; c < jvobjs.length; c++)
@@ -959,17 +965,21 @@ public class VamsasApplication implements SelectionSource
 
           int i = -1;
 
-          public void mouseOver(SequenceI seq, int index)
+          @Override
+          public void mouseOverSequence(SequenceI seq, int index,
+                  VamsasSource source)
           {
             if (jv2vobj == null)
+            {
               return;
+            }
             if (seq != last || i != index)
             {
               VorbaId v = (VorbaId) jv2vobj.get(seq);
               if (v != null)
               {
                 // this should really be a trace message.
-                // Cache.log.debug("Mouse over " + v.getId() + " bound to "
+                // Cache.debug("Mouse over " + v.getId() + " bound to "
                 // + seq + " at " + index);
                 last = seq;
                 i = index;
@@ -983,13 +993,15 @@ public class VamsasApplication implements SelectionSource
         selecter = new SelectionListener()
         {
 
+          @Override
           public void selection(SequenceGroup seqsel,
-                  ColumnSelection colsel, SelectionSource source)
+                  ColumnSelection colsel, HiddenColumns hidden,
+                  SelectionSource source)
           {
             if (vobj2jv == null)
             {
-              Cache.log
-                      .warn("Selection listener still active for dead session.");
+              Cache.warn(
+                      "Selection listener still active for dead session.");
               // not in a session.
               return;
             }
@@ -998,19 +1010,21 @@ public class VamsasApplication implements SelectionSource
               AlignmentI visal = null;
               if (source instanceof AlignViewport)
               {
-                visal = ((AlignViewport) source).getAlignment();
+                visal = ((AlignmentViewport) source).getAlignment();
               }
               SelectionMessage sm = null;
               if ((seqsel == null || seqsel.getSize() == 0)
-                      && (colsel == null || colsel.getSelected() == null || colsel
-                              .getSelected().size() == 0))
+                      && (colsel == null || colsel.getSelected() == null
+                              || colsel.getSelected().size() == 0))
               {
                 if (source instanceof AlignViewport)
                 {
                   // the empty selection.
-                  sm = new SelectionMessage("jalview", new String[]
-                  { ((AlignViewport) source).getSequenceSetId() }, null,
-                          true);
+                  sm = new SelectionMessage("jalview",
+                          new String[]
+                          { ((AlignmentViewport) source)
+                                  .getSequenceSetId() },
+                          null, true);
                 }
                 else
                 {
@@ -1022,10 +1036,8 @@ public class VamsasApplication implements SelectionSource
               {
                 String[] vobj = new String[seqsel.getSize()];
                 int o = 0;
-                Enumeration sels = seqsel.getSequences(null).elements();
-                while (sels.hasMoreElements())
+                for (SequenceI sel : seqsel.getSequences(null))
                 {
-                  SequenceI sel = (SequenceI) sels.nextElement();
                   VorbaId v = (VorbaId) jv2vobj.get(sel);
                   if (v != null)
                   {
@@ -1052,25 +1064,25 @@ public class VamsasApplication implements SelectionSource
                   {
                     // gather selected columns outwith the sequence positions
                     // too
-                    Enumeration cols = colsel.getSelected().elements();
-                    while (cols.hasMoreElements())
+                    for (Integer ival : colsel.getSelected())
                     {
-                      int ival = ((Integer) cols.nextElement()).intValue();
                       Pos p = new Pos();
-                      p.setI(ival + 1);
+                      p.setI(ival.intValue() + 1);
                       range.addPos(p);
                     }
                   }
                   else
                   {
-                    int[] intervals = colsel.getVisibleContigs(seqsel
-                            .getStartRes(), seqsel.getEndRes() + 1);
-                    for (int iv = 0; iv < intervals.length; iv += 2)
+                    Iterator<int[]> intervals = hidden
+                            .getVisContigsIterator(seqsel.getStartRes(),
+                                    seqsel.getEndRes() + 1, false);
+                    while (intervals.hasNext())
                     {
+                      int[] region = intervals.next();
                       Seg s = new Seg();
-                      s.setStart(intervals[iv] + 1); // vamsas indices begin at
-                                                     // 1, not zero.
-                      s.setEnd(intervals[iv + 1] + 1);
+                      s.setStart(region[0] + 1); // vamsas indices begin at 1,
+                                                 // not zero.
+                      s.setEnd(region[1] + 1);
                       s.setInclusive(true);
                       range.addSeg(s);
                     }
@@ -1088,7 +1100,7 @@ public class VamsasApplication implements SelectionSource
               if (sm != null)
               {
                 sm.validate(); // debug
-                Cache.log.debug("Selection Message\n" + sm.getRawMessage());
+                Cache.debug("Selection Message\n" + sm.getRawMessage());
                 pm.sendMessage(sm);
               }
             }
@@ -1099,7 +1111,7 @@ public class VamsasApplication implements SelectionSource
         ssm.addSelectionListener(selecter);
       } catch (Exception e)
       {
-        Cache.log.error("Failed to init Vamsas Picking", e);
+        Cache.error("Failed to init Vamsas Picking", e);
       }
     }
   }