From 295ef5d81ceeb8c1ef9328749f394d97d11133c9 Mon Sep 17 00:00:00 2001
From: tjc <tjc@ee4ac58c-ac51-4696-9907-e4b3aa274f04>
Date: Thu, 7 Apr 2005 16:27:51 +0000
Subject: [PATCH] select features in non-matching regions

git-svn-id: svn+ssh://svn.internal.sanger.ac.uk/repos/svn/pathsoft/artemis/trunk@2386 ee4ac58c-ac51-4696-9907-e4b3aa274f04
---
 uk/ac/sanger/artemis/Selection.java           |   5 +-
 uk/ac/sanger/artemis/components/AddMenu.java  |   6 +-
 .../artemis/components/MultiComparator.java   |  31 +-
 .../sanger/artemis/components/SelectMenu.java | 448 ++++++++++++------
 4 files changed, 312 insertions(+), 178 deletions(-)

diff --git a/uk/ac/sanger/artemis/Selection.java b/uk/ac/sanger/artemis/Selection.java
index 6edc9bbff..3f137afbe 100644
--- a/uk/ac/sanger/artemis/Selection.java
+++ b/uk/ac/sanger/artemis/Selection.java
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/Selection.java,v 1.1 2004-06-09 09:45:04 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/Selection.java,v 1.2 2005-04-07 16:27:51 tjc Exp $
  */
 
 package uk.ac.sanger.artemis;
@@ -40,7 +40,7 @@ import java.awt.datatransfer.*;
  *  the user has selected.
  *
  *  @author Kim Rutherford
- *  @version $Id: Selection.java,v 1.1 2004-06-09 09:45:04 tjc Exp $
+ *  @version $Id: Selection.java,v 1.2 2005-04-07 16:27:51 tjc Exp $
  *
  **/
 
@@ -326,6 +326,7 @@ public class Selection
     }
   }
 
+
   /**
    *  Return true if and only if there is nothing in the selection.
    **/
diff --git a/uk/ac/sanger/artemis/components/AddMenu.java b/uk/ac/sanger/artemis/components/AddMenu.java
index c83c2bb2a..e8e43b508 100644
--- a/uk/ac/sanger/artemis/components/AddMenu.java
+++ b/uk/ac/sanger/artemis/components/AddMenu.java
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/AddMenu.java,v 1.8 2005-04-07 13:57:21 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/AddMenu.java,v 1.9 2005-04-07 16:27:51 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.components;
@@ -54,7 +54,7 @@ import javax.swing.*;
  *  should have been called CreateMenu.
  *
  *  @author Kim Rutherford
- *  @version $Id: AddMenu.java,v 1.8 2005-04-07 13:57:21 tjc Exp $
+ *  @version $Id: AddMenu.java,v 1.9 2005-04-07 16:27:51 tjc Exp $
  **/
 public class AddMenu extends SelectionMenu 
 {
@@ -297,7 +297,7 @@ public class AddMenu extends SelectionMenu
   * @param v2 Vector of Integer coordinates
   *  
   */
-  private Vector union(Vector v1, Vector v2)
+  protected static Vector union(Vector v1, Vector v2)
   {
     Vector union = new Vector();
 
diff --git a/uk/ac/sanger/artemis/components/MultiComparator.java b/uk/ac/sanger/artemis/components/MultiComparator.java
index bae7289ac..dce59ae99 100644
--- a/uk/ac/sanger/artemis/components/MultiComparator.java
+++ b/uk/ac/sanger/artemis/components/MultiComparator.java
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/MultiComparator.java,v 1.10 2005-04-07 09:59:32 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/MultiComparator.java,v 1.11 2005-04-07 16:27:51 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.components;
@@ -57,7 +57,7 @@ import javax.swing.border.BevelBorder;
  *  to keep them synchronized.
  *
  *  @author Kim Rutherford <kmr@sanger.ac.uk>
- *  @version $Id: MultiComparator.java,v 1.10 2005-04-07 09:59:32 tjc Exp $
+ *  @version $Id: MultiComparator.java,v 1.11 2005-04-07 16:27:51 tjc Exp $
  **/
 
 public class MultiComparator extends JFrame 
@@ -576,9 +576,20 @@ public class MultiComparator extends JFrame
     for(int i = 0 ; i < getEntryGroupArray().length ; ++i)
     {
       final EntryGroup entry_group = getEntryGroupArray()[i];
-
       final String sub_menu_name = makeNewSubMenuName(entry_group);
 
+      AlignmentViewer alignQueryViewer;
+      if(i==0)
+        alignQueryViewer = null;
+      else
+        alignQueryViewer = getAlignmentViewerArray()[i-1];
+
+      AlignmentViewer alignSubjectViewer;
+      if(i == getEntryGroupArray().length-1)
+        alignSubjectViewer = null;
+      else
+        alignSubjectViewer = getAlignmentViewerArray()[i];
+
       final EntryGroupMenu this_entries_menu =
         new EntryGroupMenu(this,
                             getEntryGroupArray()[i],
@@ -591,6 +602,7 @@ public class MultiComparator extends JFrame
                         getGotoEventSourceArray()[i],
                         getEntryGroupArray()[i],
                         getBasePlotGroupArray()[i],
+                        alignQueryViewer, alignSubjectViewer,
                         sub_menu_name);
       select_menu.add(this_select_menu);
 
@@ -624,19 +636,6 @@ public class MultiComparator extends JFrame
                         sub_menu_name);
         edit_menu.add(this_edit_menu);
 
-
-        AlignmentViewer alignQueryViewer;
-        if(i==0)
-          alignQueryViewer = null;
-        else
-          alignQueryViewer = getAlignmentViewerArray()[i-1];
-
-        AlignmentViewer alignSubjectViewer;
-        if(i == getEntryGroupArray().length-1)
-          alignSubjectViewer = null;
-        else
-          alignSubjectViewer = getAlignmentViewerArray()[i];
-
         this_create_menu =
           new AddMenu(this, getSelectionArray()[i],
                       getEntryGroupArray()[i],
diff --git a/uk/ac/sanger/artemis/components/SelectMenu.java b/uk/ac/sanger/artemis/components/SelectMenu.java
index 371c54185..2ffa2865d 100644
--- a/uk/ac/sanger/artemis/components/SelectMenu.java
+++ b/uk/ac/sanger/artemis/components/SelectMenu.java
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/SelectMenu.java,v 1.1 2004-06-09 09:47:37 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/SelectMenu.java,v 1.2 2005-04-07 16:27:51 tjc Exp $
  **/
 
 package uk.ac.sanger.artemis.components;
@@ -37,10 +37,12 @@ import uk.ac.sanger.artemis.io.Qualifier;
 import uk.ac.sanger.artemis.io.InvalidKeyException;
 import uk.ac.sanger.artemis.io.InvalidRelationException;
 import uk.ac.sanger.artemis.io.EntryInformation;
+import uk.ac.sanger.artemis.io.Location;
 
 import java.awt.*;
 import java.awt.event.*;
-
+import java.util.Vector;
+import java.util.Enumeration;
 import javax.swing.*;
 
 /**
@@ -48,10 +50,56 @@ import javax.swing.*;
  *  "Select by key".
  *
  *  @author Kim Rutherford
- *  @version $Id: SelectMenu.java,v 1.1 2004-06-09 09:47:37 tjc Exp $
+ *  @version $Id: SelectMenu.java,v 1.2 2005-04-07 16:27:51 tjc Exp $
  **/
 
-public class SelectMenu extends SelectionMenu {
+public class SelectMenu extends SelectionMenu 
+{
+
+  /**
+   *  The EntryGroup object that was passed to the constructor.
+   **/
+  private EntryGroup entry_group;
+
+  /**
+   *  The GotoEventSource object that was passed to the constructor.
+   **/
+  private GotoEventSource goto_event_source;
+
+  private JMenuItem selector_item = null;
+  private JMenuItem all_item = null;
+  private JMenuItem all_bases_item = null;
+  private JMenuItem none_item = null;
+  private JMenuItem selection_toggle_item = null;
+  private JMenuItem select_same_type_item = null;
+  private JMenuItem select_matching_qualifiers_item = null;
+  private JMenuItem select_features_in_range_item = null;
+  private JMenuItem select_base_range_item = null;
+  private JMenuItem select_aa_range_in_feature_item = null;
+  private JMenuItem select_orf_item = null;
+  private JMenuItem select_by_key_item = null;
+  private JMenuItem select_non_pseudo_cds_item = null;
+  private JMenuItem select_all_cds_item = null;
+
+  /**
+   *  The shortcut for Select All
+   **/
+  final static KeyStroke SELECT_ALL_KEY =
+    KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK);
+
+  /**
+   *  The shortcut for Select None
+   **/
+  final static KeyStroke SELECT_NONE_KEY =
+    KeyStroke.getKeyStroke (KeyEvent.VK_N, InputEvent.CTRL_MASK);
+
+
+  /**
+   *  Warn if the user tries to select more than this number of features.
+   **/
+  final private int MAX_FEATURE_TO_SELECT_COUNT = 10000;
+
+
   /**
    *  Create a new SelectMenu object and all it's menu items.
    *  @param frame The JFrame that owns this JMenu.
@@ -65,176 +113,252 @@ public class SelectMenu extends SelectionMenu {
    *    needed to call getCodonUsageAlgorithm()
    *  @param menu_name The name of the new menu.
    **/
-  public SelectMenu (final JFrame frame,
-                     final Selection selection,
-                     final GotoEventSource goto_event_source,
-                     final EntryGroup entry_group,
-                     final BasePlotGroup base_plot_group,
-                     final String menu_name) {
-    super (frame, menu_name, selection);
+  public SelectMenu(final JFrame frame,
+                    final Selection selection,
+                    final GotoEventSource goto_event_source,
+                    final EntryGroup entry_group,
+                    final BasePlotGroup base_plot_group,
+                    final String menu_name)
+ {
+   this(frame,selection,goto_event_source,entry_group,
+        base_plot_group,null,null,menu_name);
+ }
+
+  /**
+   *  Create a new SelectMenu object and all it's menu items.
+   *  @param frame The JFrame that owns this JMenu.
+   *  @param selection The Selection that the commands in the menu will
+   *    operate on.
+   *  @param goto_event_source The object the we will call makeBaseVisible ()
+   *    on.
+   *  @param entry_group The EntryGroup object where features and exons are
+   *    selected from.
+   *  @param base_plot_group The BasePlotGroup associated with this JMenu -
+   *    needed to call getCodonUsageAlgorithm()
+   *  @param menu_name The name of the new menu.
+   **/
+  public SelectMenu(final JFrame frame,
+                    final Selection selection,
+                    final GotoEventSource goto_event_source,
+                    final EntryGroup entry_group,
+                    final BasePlotGroup base_plot_group,
+                    final AlignmentViewer alignQueryViewer,  
+                    final AlignmentViewer alignSubjectViewer,
+                    final String menu_name) 
+ {
+    super(frame, menu_name, selection);
 
     this.entry_group = entry_group;
     this.goto_event_source = goto_event_source;
 
-    selector_item = new JMenuItem ("Feature Selector ...");
-    selector_item.addActionListener (new ActionListener () {
-      public void actionPerformed (ActionEvent event) {
-        new Selector (selection, goto_event_source, getEntryGroup (),
-                      base_plot_group);
+    selector_item = new JMenuItem("Feature Selector ...");
+    selector_item.addActionListener(new ActionListener() 
+    {
+      public void actionPerformed(ActionEvent event) 
+      {
+        new Selector(selection, goto_event_source, getEntryGroup(),
+                     base_plot_group);
       }
     });
 
-    add (selector_item);
+    add(selector_item);
 
-    addSeparator ();
+    addSeparator();
 
-    all_item = new JMenuItem ("All");
-    all_item.setAccelerator (SELECT_ALL_KEY);
-    all_item.addActionListener (new ActionListener () {
-      public void actionPerformed (ActionEvent event) {
-        selectAll ();
+    all_item = new JMenuItem("All");
+    all_item.setAccelerator(SELECT_ALL_KEY);
+    all_item.addActionListener(new ActionListener() 
+    {
+      public void actionPerformed(ActionEvent event) 
+      {
+        selectAll();
       }
     });
 
-    add (all_item);
+    add(all_item);
 
-    all_bases_item = new JMenuItem ("All Bases");
-    all_bases_item.addActionListener (new ActionListener () {
-      public void actionPerformed (ActionEvent event) {
-        selectAllBases ();
+    all_bases_item = new JMenuItem("All Bases");
+    all_bases_item.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent event) 
+      {
+        selectAllBases();
       }
     });
 
-    add (all_bases_item);
+    add(all_bases_item);
+
+
+    if(alignQueryViewer != null || alignSubjectViewer != null)
+    {
+      JMenuItem all_diffs = new JMenuItem("All Features in Non-matching Regions");
+      all_diffs.addActionListener(new ActionListener() 
+      {
+        public void actionPerformed(ActionEvent event) 
+        {
+          Vector diffs = null;
+          if(alignQueryViewer == null || alignSubjectViewer == null)
+          {
+            if(alignQueryViewer != null)
+              diffs = alignQueryViewer.getDifferenceCoords(false);
+            else
+              diffs = alignSubjectViewer.getDifferenceCoords(false);
+          }
+          else
+          {
+            final Vector diffs1 = alignQueryViewer.getDifferenceCoords(false);
+            final Vector diffs2 = alignSubjectViewer.getDifferenceCoords(false);
+            diffs = AddMenu.union(diffs1,diffs2);
+          }
+
+          if(diffs != null)
+            selectAllFeatures(diffs);
+        }
+      });
+
+      add(all_diffs);
+
+    }
 
-    none_item = new JMenuItem ("None");
-    none_item.setAccelerator (SELECT_NONE_KEY);
-    none_item.addActionListener (new ActionListener () {
-      public void actionPerformed (ActionEvent event) {
-        clearSelection ();
+    none_item = new JMenuItem("None");
+    none_item.setAccelerator(SELECT_NONE_KEY);
+    none_item.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent event) 
+      {
+        clearSelection();
       }
     });
 
-    add (none_item);
+    add(none_item);
 
-    select_by_key_item = new JMenuItem ("By Key");
-    select_by_key_item.addActionListener (new ActionListener () {
-      public void actionPerformed (ActionEvent event) {
-        selectByKeyPopup ();
+    select_by_key_item = new JMenuItem("By Key");
+    select_by_key_item.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent event) 
+      {
+        selectByKeyPopup();
       }
     });
 
-    add (select_by_key_item);
+    add(select_by_key_item);
 
     select_non_pseudo_cds_item =
-      new JMenuItem ("CDS Features without /pseudo");
-    select_non_pseudo_cds_item.addActionListener (new ActionListener () {
-      public void actionPerformed (ActionEvent event) {
+      new JMenuItem("CDS Features without /pseudo");
+    select_non_pseudo_cds_item.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent event)
+      {
         // select all CDS features that do not have the /pseudo qualifier
         final FeatureKeyQualifierPredicate predicate =
-          new FeatureKeyQualifierPredicate (Key.CDS, "pseudo", false);
+          new FeatureKeyQualifierPredicate(Key.CDS, "pseudo", false);
 
-        clearSelection ();
+        clearSelection();
 
-        selectFeaturesByPredicate (predicate);
+        selectFeaturesByPredicate(predicate);
       }
     });
 
-    add (select_non_pseudo_cds_item);
+    add(select_non_pseudo_cds_item);
 
-    select_all_cds_item = new JMenuItem ("All CDS Features");
-    select_all_cds_item.addActionListener (new ActionListener () {
-      public void actionPerformed (ActionEvent event) {
+    select_all_cds_item = new JMenuItem("All CDS Features");
+    select_all_cds_item.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent event) 
+      {
         final FeatureKeyPredicate predicate =
-          new FeatureKeyPredicate (Key.CDS);
+          new FeatureKeyPredicate(Key.CDS);
 
-        clearSelection ();
+        clearSelection();
 
-        selectFeaturesByPredicate (predicate);
+        selectFeaturesByPredicate(predicate);
       }
     });
 
-    add (select_all_cds_item);
+    add(select_all_cds_item);
 
-    select_same_type_item = new JMenuItem ("Same Key");
-    select_same_type_item.addActionListener (new ActionListener () {
-      public void actionPerformed (ActionEvent event) {
-        selectSameKey ();
+    select_same_type_item = new JMenuItem("Same Key");
+    select_same_type_item.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent event) 
+      {
+        selectSameKey();
       }
     });
 
-    add (select_same_type_item);
+    add(select_same_type_item);
 
     select_matching_qualifiers_item =
-      new JMenuItem ("Features Matching Qualifier");
-    select_matching_qualifiers_item.addActionListener (new ActionListener () {
-      public void actionPerformed (ActionEvent event) {
-        selectMatchingQualifiers ();
+      new JMenuItem("Features Matching Qualifier");
+    select_matching_qualifiers_item.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent event) 
+      {
+        selectMatchingQualifiers();
       }
     });
 
-    add (select_matching_qualifiers_item);
+    add(select_matching_qualifiers_item);
 
-    select_orf_item = new JMenuItem ("Open Reading Frame");
-    select_orf_item.addActionListener (new ActionListener () {
-      public void actionPerformed (ActionEvent event) {
-        selectOrf ();
+    select_orf_item = new JMenuItem("Open Reading Frame");
+    select_orf_item.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent event) 
+      {
+        selectOrf();
       }
     });
 
-    add (select_orf_item);
+    add(select_orf_item);
 
     select_features_in_range_item =
-      new JMenuItem ("Features Overlapping Selection");
-    select_features_in_range_item.addActionListener (new ActionListener () {
-      public void actionPerformed (ActionEvent event) {
-        selectOverlappingFeatures ();
+      new JMenuItem("Features Overlapping Selection");
+    select_features_in_range_item.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent event) 
+      {
+        selectOverlappingFeatures();
       }
     });
 
-    add (select_features_in_range_item);
+    add(select_features_in_range_item);
 
-    select_base_range_item = new JMenuItem ("Base Range ...");
-    select_base_range_item.addActionListener (new ActionListener () {
-      public void actionPerformed (ActionEvent event) {
-        selectBaseRange ();
+    select_base_range_item = new JMenuItem("Base Range ...");
+    select_base_range_item.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent event) 
+      {
+        selectBaseRange();
       }
     });
 
-    add (select_base_range_item);
+    add(select_base_range_item);
 
-    select_aa_range_in_feature_item = new JMenuItem ("Feature AA Range ...");
-    select_aa_range_in_feature_item.addActionListener (new ActionListener () {
-      public void actionPerformed (ActionEvent event) {
-        selectFeatureAARange ();
+    select_aa_range_in_feature_item = new JMenuItem("Feature AA Range ...");
+    select_aa_range_in_feature_item.addActionListener(new ActionListener() 
+    {
+      public void actionPerformed(ActionEvent event) 
+      {
+        selectFeatureAARange();
       }
     });
 
-    add (select_aa_range_in_feature_item);
+    add(select_aa_range_in_feature_item);
 
-    addSeparator ();
+    addSeparator();
 
-    selection_toggle_item = new JMenuItem ("Toggle Selection");
-    selection_toggle_item.addActionListener (new ActionListener () {
-      public void actionPerformed (ActionEvent event) {
-        toggleSelection ();
+    selection_toggle_item = new JMenuItem("Toggle Selection");
+    selection_toggle_item.addActionListener(new ActionListener() 
+    {
+      public void actionPerformed(ActionEvent event) 
+      {
+        toggleSelection();
       }
     });
 
-    add (selection_toggle_item);
+    add(selection_toggle_item);
   }
 
-  /**
-   *  The shortcut for Select All
-   **/
-  final static KeyStroke SELECT_ALL_KEY =
-    KeyStroke.getKeyStroke (KeyEvent.VK_A, InputEvent.CTRL_MASK);
-
-  /**
-   *  The shortcut for Select None
-   **/
-  final static KeyStroke SELECT_NONE_KEY =
-    KeyStroke.getKeyStroke (KeyEvent.VK_N, InputEvent.CTRL_MASK);
 
   /**
    *  Create a new SelectMenu object and all it's menu items.
@@ -248,72 +372,106 @@ public class SelectMenu extends SelectionMenu {
    *  @param base_plot_group The BasePlotGroup associated with this JMenu -
    *    needed to call getCodonUsageAlgorithm()
    **/
-  public SelectMenu (final JFrame frame,
-                     final Selection selection,
-                     final GotoEventSource goto_event_source,
-                     final EntryGroup entry_group,
-                     final BasePlotGroup base_plot_group) {
+  public SelectMenu(final JFrame frame,
+                    final Selection selection,
+                    final GotoEventSource goto_event_source,
+                    final EntryGroup entry_group,
+                    final BasePlotGroup base_plot_group) 
+  {
     this (frame, selection, goto_event_source, entry_group,
           base_plot_group, "Select");
   }
 
-  /**
-   *  Warn if the user tries to select more than this number of features.
-   **/
-  final private int MAX_FEATURE_TO_SELECT_COUNT = 10000;
 
   /**
    *  Select all the features in the active entries.  If there are more than
    *  1000 features the user is asked for confirmation.
    **/
-  private void selectAll () {
-    if (getEntryGroup ().getAllFeaturesCount () >
-        MAX_FEATURE_TO_SELECT_COUNT) {
+  private void selectAll() 
+  {
+    if(getEntryGroup().getAllFeaturesCount() >
+       MAX_FEATURE_TO_SELECT_COUNT) 
+    {
       final YesNoDialog dialog =
-        new YesNoDialog (getParentFrame (),
-                         "Are you sure you want to select " +
-                          getEntryGroup ().getAllFeaturesCount () +
-                         " features?");
+        new YesNoDialog(getParentFrame(),
+                        "Are you sure you want to select " +
+                         getEntryGroup().getAllFeaturesCount() +
+                        " features?");
 
-      if (!dialog.getResult ()) {
+      if(!dialog.getResult ()) 
         return;
-      }
     }
 
-    final FeatureVector all_features = getEntryGroup ().getAllFeatures ();
+    final FeatureVector all_features = getEntryGroup().getAllFeatures();
 
-    if (getEntryGroup () instanceof SimpleEntryGroup) {
+    if(getEntryGroup() instanceof SimpleEntryGroup) 
+    {
       // special case for speed
-      getSelection ().set (all_features);
-    } else {
-      clearSelection ();
-
-      getSelection ().add (all_features);
+      getSelection().set(all_features);
+    } 
+    else 
+    {
+      clearSelection();
+      getSelection().add(all_features);
     }
   }
 
   /**
    *  Select all the bases.
    **/
-  private void selectAllBases () {
-    try {
-      final Strand strand = getEntryGroup ().getBases ().getForwardStrand ();
+  private void selectAllBases()
+  {
+    try 
+    {
+      final Strand strand = getEntryGroup().getBases().getForwardStrand();
 
       final MarkerRange new_range =
-        strand.makeMarkerRangeFromPositions (1, strand.getSequenceLength ());
+        strand.makeMarkerRangeFromPositions(1, strand.getSequenceLength());
 
-      getSelection ().setMarkerRange (new_range);
-    } catch (OutOfRangeException e) {
+      getSelection().setMarkerRange(new_range);
+    }
+    catch (OutOfRangeException e) 
+    {
       throw new Error ("internal error - unexpected exception: " + e);
     }
   }
 
+  private void selectAllFeatures(final Vector regions)
+  {
+    
+    final FeaturePredicate predicate = new FeaturePredicate()
+    {
+      public boolean testPredicate(final Feature feature)
+      {
+        final Location loc = feature.getLocation();
+        final int feat_start = loc.getFirstBase();
+        final int feat_end   = loc.getLastBase();
+
+        Enumeration eDiffs = regions.elements();
+        while(eDiffs.hasMoreElements())
+        {
+          final Integer coords[] = (Integer[])eDiffs.nextElement();
+          final int start = coords[0].intValue();
+          final int end   = coords[1].intValue();
+          if( (start > feat_start && start < feat_end)  ||  
+              (end > feat_start && end < feat_end) ) 
+            return true;
+        }
+
+        return false;
+      }
+    };
+
+    selectFeaturesByPredicate(predicate);
+  }
+
   /**
    *  Remove the all Features and FeatureSegments in the EntryGroup from the
    *  Selection.  If the current EntryGroup is a SimpleEntryGroup then this
    *  method just calls getSelection ().clear ();
    **/
-  private void clearSelection () {
+  private void clearSelection () 
+  {
     if (getEntryGroup () instanceof SimpleEntryGroup) {
       // special case for speed
       getSelection ().clear ();
@@ -800,28 +958,4 @@ public class SelectMenu extends SelectionMenu {
     return entry_group;
   }
 
-  /**
-   *  The EntryGroup object that was passed to the constructor.
-   **/
-  private EntryGroup entry_group;
-
-  /**
-   *  The GotoEventSource object that was passed to the constructor.
-   **/
-  private GotoEventSource goto_event_source;
-
-  private JMenuItem selector_item = null;
-  private JMenuItem all_item = null;
-  private JMenuItem all_bases_item = null;
-  private JMenuItem none_item = null;
-  private JMenuItem selection_toggle_item = null;
-  private JMenuItem select_same_type_item = null;
-  private JMenuItem select_matching_qualifiers_item = null;
-  private JMenuItem select_features_in_range_item = null;
-  private JMenuItem select_base_range_item = null;
-  private JMenuItem select_aa_range_in_feature_item = null;
-  private JMenuItem select_orf_item = null;
-  private JMenuItem select_by_key_item = null;
-  private JMenuItem select_non_pseudo_cds_item = null;
-  private JMenuItem select_all_cds_item = null;
 }
-- 
GitLab