From e930678ad2370a510a7fe5177aa826473cf3291f Mon Sep 17 00:00:00 2001 From: tcarver <tjc> Date: Fri, 31 Jan 2014 13:58:32 +0000 Subject: [PATCH] add the ability to find features contained by ranges defined by selected features as well as selected base ranges --- .../sanger/artemis/components/SelectMenu.java | 68 +++++++++++++------ 1 file changed, 48 insertions(+), 20 deletions(-) diff --git a/uk/ac/sanger/artemis/components/SelectMenu.java b/uk/ac/sanger/artemis/components/SelectMenu.java index 4d801fa1f..c2ac0e93e 100644 --- a/uk/ac/sanger/artemis/components/SelectMenu.java +++ b/uk/ac/sanger/artemis/components/SelectMenu.java @@ -1000,37 +1000,65 @@ public class SelectMenu extends SelectionMenu } } } - /** - * If there are some selected bases select the features that are + * If there are some selected bases or features select the features that are * fully contained within that selection. **/ private void selectContainedFeatures () { final MarkerRange selected_marker_range = getSelection ().getMarkerRange (); - if (selected_marker_range == null) { - new MessageDialog (getParentFrame (), "sequence range is not selected"); - return; - } else { - try { - final FeatureVector featuresInRange = - getEntryGroup ().getFeaturesInRange (selected_marker_range.getRawRange ()); - final FeatureVector featuresContainedByRange = new FeatureVector(); - for(int i=0; i<featuresInRange.size(); i++) - { - Feature f = featuresInRange.elementAt(i); - Range maxR = f.getMaxRawRange(); - if(selected_marker_range.getRawStart().getRawPosition() <= maxR.getStart() && - selected_marker_range.getRawEnd().getRawPosition() >= maxR.getEnd()) - featuresContainedByRange.add(f); + final FeatureVector featuresContainedByRange; + try + { + if (selected_marker_range == null) { + final FeatureVector selected_features = getSelection ().getAllFeatures (); + if (selected_features.size () == 0) { + new MessageDialog (getParentFrame (), "nothing selected"); + return; } - getSelection ().set (featuresContainedByRange); - } catch (OutOfRangeException e) { - throw new Error ("internal error - unexpected exception: " + e); + + featuresContainedByRange = new FeatureVector(); + for(int i=0; i<selected_features.size(); i++) { + Range r = selected_features.elementAt(i).getMaxRawRange(); + final FeatureVector featuresContained = getFeaturesContainedByRange(r); + for(int j=0; j<featuresContained.size(); j++) { + final Feature f = featuresContained.elementAt(j); + if(!featuresContainedByRange.contains(f) && !selected_features.contains(f)) + featuresContainedByRange.add(f); + } + } + } else { + featuresContainedByRange = getFeaturesContainedByRange( + selected_marker_range.getRawRange()); } + } catch (OutOfRangeException e) { + throw new Error ("internal error - unexpected exception: " + e); + } + getSelection ().set (featuresContainedByRange); + } + + /** + * Return the features that are contained by a given range + * @param r + * @return + * @throws OutOfRangeException + */ + private FeatureVector getFeaturesContainedByRange(Range r) throws OutOfRangeException + { + final FeatureVector featuresInRange = + getEntryGroup ().getFeaturesInRange (r); + final FeatureVector featuresContainedByRange = new FeatureVector(); + for(int i=0; i<featuresInRange.size(); i++) + { + Feature f = featuresInRange.elementAt(i); + Range maxR = f.getMaxRawRange(); + if(r.getStart() <= maxR.getStart() && + r.getEnd() >= maxR.getEnd()) + featuresContainedByRange.add(f); } + return featuresContainedByRange; } /** -- GitLab