diff --git a/etc/versions b/etc/versions index e9e6db733650269b69961ec002acba9a3dc000bb..4586459d47ef2fc5bc03cc81b1c890bff9b6cf8a 100644 --- a/etc/versions +++ b/etc/versions @@ -1,4 +1,4 @@ -Artemis Release 16.0.2 -ACT Release 13.0.2 +Artemis Release 16.0.3 +ACT Release 13.0.3 DNAPlotter Release 1.11 BamView 1.2.11 \ No newline at end of file diff --git a/uk/ac/sanger/artemis/components/SelectMenu.java b/uk/ac/sanger/artemis/components/SelectMenu.java index 4d801fa1f5029a0f9751b3ea55b28de0d39c4900..c2ac0e93ea9d70fc4ccb0cb2323736e21c8a163a 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; } /**