diff --git a/uk/ac/sanger/artemis/components/FeatureEdit.java b/uk/ac/sanger/artemis/components/FeatureEdit.java index dc2214fc9cc124476d4fa54ae741cc8acb203551..b62005fdedbefc29ce8940fda7bd37f58cdfb1e1 100644 --- a/uk/ac/sanger/artemis/components/FeatureEdit.java +++ b/uk/ac/sanger/artemis/components/FeatureEdit.java @@ -72,6 +72,7 @@ import java.util.Set; import java.util.Vector; import java.util.Collections; import java.util.Comparator; + import javax.swing.*; @@ -1809,6 +1810,8 @@ public class FeatureEdit extends JPanel qualifiers = qualifier_text_area.getParsedQualifiers(getEntryInformation ()); + updateGffIds(qualifiers); + // if using controlled vocab form if(cvForm != null) { @@ -1916,6 +1919,53 @@ public class FeatureEdit extends JPanel return true; } + /** + * Propagate any changes to GFF ID qualifiers through the + * gene model + * @param qualifiers + */ + private void updateGffIds(QualifierVector qualifiers) + { + if( !GeneUtils.isDatabaseEntry(getFeature().getEmblFeature()) && + getFeature().getEmblFeature() instanceof GFFStreamFeature ) + { + final GFFStreamFeature gffFeature = (GFFStreamFeature)getFeature().getEmblFeature(); + if(gffFeature.getChadoGene() != null) + { + try + { + final String newName = ((String) (qualifiers.getQualifierByName("ID").getValues().get(0))).trim(); + final String oldName = ((String) (gffFeature.getQualifierByName("ID").getValues().get(0))).trim(); + + if(!newName.equals(oldName)) + { + int val = JOptionPane.showConfirmDialog(null, + "Change name of children based on this ["+newName+"]?", + "Name Change", JOptionPane.OK_CANCEL_OPTION); + if(val == JOptionPane.CANCEL_OPTION) + return; + + final Set<uk.ac.sanger.artemis.io.Feature> children = + gffFeature.getChadoGene().getChildren(gffFeature); + GeneUtils.propagateId(gffFeature, newName, children); + GeneUtils.fixParentQualifier(oldName, newName, children); + + final Iterator<uk.ac.sanger.artemis.io.Feature> it = children.iterator(); + while(it.hasNext()) + { + final GFFStreamFeature child = (GFFStreamFeature)it.next(); + if( child.getSegmentRangeStore().size() == 1 && + !child.getKey().getKeyString().equals("CDS") && + child.getKey().getKeyString().indexOf("exon") == -1) + child.setSegmentRangeStore(null); + } + } + } + catch(Exception e){ } + } + } + } + /** * Return the Feature we are editing as passed to the constructor. **/