Update of /cvsroot/gmod/apollo/src/java/apollo/gui/detailviewers/exonviewer
In directory sc8-pr-cvs1:/tmp/cvs-serv373/src/java/apollo/gui/detailviewers/exonviewer
Modified Files:
BaseEditorPanel.java BaseFineEditor.java
Log Message:
I set out to add a transcript JComboBox/selectable list to the ede, which i did.
But I ended up doing a lot of refactoring. With the new selection
event that needed to go out, selection in the EDE was becoming this
entangled disaster that I couldnt get my head around anymore. There
were now 4 things causing selections, external selection to sometime
take in, and a bunch of things reflecting the selection state. So I
thought I would put in a mini selection manager/controller for the
ede. Then it occurred to me that I could use the main
SelectionManager/Controller, I would just have to do a bit more source
checking. So both the BaseEditorPanel and BaseFineEditor listen for
and spit out selections. If they see selections from each other they
deem it an internal selection that doesnt get filtered if the user has
clicked off external selection. This made selection a lot simpler than
trying to coordinate selection state between themselves and externally.
Index: BaseEditorPanel.java
===================================================================
RCS file: /cvsroot/gmod/apollo/src/java/apollo/gui/detailviewers/exonviewer/BaseEditorPanel.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -C2 -d -r1.17 -r1.18
*** BaseEditorPanel.java 28 Jan 2003 01:06:43 -0000 1.17
--- BaseEditorPanel.java 31 Jan 2003 00:11:13 -0000 1.18
***************
*** 66,70 ****
RightClickActionListener rightClickListener;
! Vector featureSelectionListeners = new Vector();
CurationSet curationSet;
--- 66,70 ----
RightClickActionListener rightClickListener;
! //Vector featureSelectionListeners = new Vector();
CurationSet curationSet;
***************
*** 91,98 ****
/** Need lowestBase for offset of sequence */
public BaseEditorPanel(ApolloPanel controllingPanel,
! BaseFineEditor baseFineEditor,
boolean reverseStrand,
int lowestBase,
! int highestBase) {
super(1, (int)lowestBase, (int)highestBase);
transcripts = new Vector();
--- 91,99 ----
/** Need lowestBase for offset of sequence */
public BaseEditorPanel(ApolloPanel controllingPanel,
! final BaseFineEditor baseFineEditor,
boolean reverseStrand,
int lowestBase,
! int highestBase,
! FeatureSetI annotFeatureSet) {
super(1, (int)lowestBase, (int)highestBase);
transcripts = new Vector();
***************
*** 115,119 ****
--- 116,153 ----
createRightClickMenu();
attachListeners();
+ baseFineEditor.getController().addListener(new FeatureSelectionListener() {
+ public boolean handleFeatureSelectionEvent(FeatureSelectionEvent e) {
+ if (!baseFineEditor.canHandleSelection(e,this)) return false;
+ // canHandleSel ensures itsa GenericAnnotationI
+ GenericAnnotationI ga = (GenericAnnotationI)e.getFeatures().elementAt(0);
+ displayAnnot(ga);
+ return true;
+ } } );
+ addTranscriptsFromFeatSet(annotFeatureSet); // retrieves and adds the transcripts
+ }
+
+ /** Digs out Transcripts from annotFeatureSet and adds them */
+ private void addTranscriptsFromFeatSet(FeatureSetI annotFeatureSet) {
+ Vector transList = new Vector();
+ getTranscripts(annotFeatureSet, transList);
+ attachTranscripts(transList); // adds trans and amino seqs
+ }
+ /** Recurses featureSet looking for Transcripts. Adds Transcripts to
+ Vector output if they are fully in range */
+ private void getTranscripts(FeatureSetI annotFeatureSet, Vector output) {
+ if (annotFeatureSet instanceof Transcript) {
+ Transcript trans = (Transcript)annotFeatureSet;
+ // only add if in cur set range
+ if (trans.haveWholeSequence())
+ output.addElement(trans);
+ }
+ else {
+ for(int i=0; i < annotFeatureSet.getFeatures().size(); i++) {
+ SeqFeatureI feature = annotFeatureSet.getFeatureAt(i);
+ if (feature.hasChildren())
+ getTranscripts((FeatureSet) feature, output);
+ }
+ }
}
***************
*** 178,200 ****
}
- public void addFeatureSelectionListener(FeatureSelectionListener listener) {
- featureSelectionListeners.addElement(listener);
- }
-
- public void removeFeatureSelectionListener(FeatureSelectionListener listener) {
- featureSelectionListeners.removeElement(listener);
- }
-
- protected void fireFeatureSelectionEvent(FeatureSelectionEvent event) {
- baseFineEditor.getController().handleFeatureSelectionEvent (event);
- /*
- for(int i=0; i < featureSelectionListeners.size(); i++) {
- FeatureSelectionListener listener = (FeatureSelectionListener)
- featureSelectionListeners.elementAt(i);
- listener.handleFeatureSelectionEvent(event);
- }
- */
- }
-
public SeqFeatureI getSelectedFeature() {
return selectedFeature;
--- 212,215 ----
***************
*** 464,467 ****
--- 479,483 ----
}
+ /** Middle mouse scrolls to where clicked, left mouse selects */
public void mouseClicked(MouseEvent e) {
setPos (e.getX(), e.getY());
***************
*** 503,514 ****
private void setSelectedFeature (int pos, int tier) {
SeqFeatureI sf = getFeatureSetAtPosition(pos, tier);
! // dont need to do this anymore as bfe.scrollToFeature(sf,true) does this
! //setSelectedFeature (sf, tier,true); // true -> fire selection event
! // Scroll to feature updates the TranslationViewer
! // A little wierd but have to do this here rather than at setSelFeat(SFI,int)
! // because that would end up in an endless loop as BFE.scrollToFeature calls
! // selectFeature which calls setSelFeat(SFI,int)
! // true is to fire selection event as it is internal
! if (sf != null) baseFineEditor.scrollToFeature((Transcript)sf,true);
}
--- 519,523 ----
private void setSelectedFeature (int pos, int tier) {
SeqFeatureI sf = getFeatureSetAtPosition(pos, tier);
! setSelectedFeature (sf, tier,true); // true -> fire selection event
}
***************
*** 523,542 ****
// this should only fire if selection comes from self
if (fireSelectionEvent) {
! fireFeatureSelectionEvent(new FeatureSelectionEvent(baseFineEditor,
! selectedFeature));
! baseFineEditor.getSelectionManager().select(selectedFeature, baseFineEditor);
}
}
}
! /** Select SeqFeatureI sf.
! If fireSelectionEvent is false, no selection event will be fired. This
! is done for selections coming from outside. Internal selections should
! fire a selection event.
If SeqFeatureI is a gene, its first transcript is selected, as selection
is done at the transcript(or exon) level. It makes no sense to select
a gene in the BaseEditorPanel.
*/
! void selectFeature (SeqFeatureI sf, boolean fireSelectionEvent) {
if (sf instanceof Gene) sf = ((Gene)sf).getTranscript(0);
int tier = getTierForFeature(sf);
--- 532,548 ----
// this should only fire if selection comes from self
if (fireSelectionEvent) {
! // selection manager select fires event
! baseFineEditor.getSelectionManager().select(selectedFeature, this);
}
}
}
! /** Display GenericAnnotationI sf.
! This is for external selection. No selection event is fired.
If SeqFeatureI is a gene, its first transcript is selected, as selection
is done at the transcript(or exon) level. It makes no sense to select
a gene in the BaseEditorPanel.
*/
! void displayAnnot(GenericAnnotationI sf) {
if (sf instanceof Gene) sf = ((Gene)sf).getTranscript(0);
int tier = getTierForFeature(sf);
***************
*** 546,550 ****
" because it can't be found");
} else {
! setSelectedFeature (sf, tier, fireSelectionEvent);
scrollToFeature (sf);
repaint(); // repaint to show new selection, scrollToFeat doesnt repaint if no scroll
--- 552,556 ----
" because it can't be found");
} else {
! setSelectedFeature (sf, tier, false); // red box around annot
scrollToFeature (sf);
repaint(); // repaint to show new selection, scrollToFeat doesnt repaint if no scroll
***************
*** 1203,1216 ****
}
! public void attachTranscripts(Vector trans) {
! if (trans.size() < 1)
return;
-
- transcripts = new Vector();
- for(int i=0; i < trans.size(); i++) {
- DrawableFeatureSet dfs = (DrawableFeatureSet) trans.
- elementAt(i);
- transcripts.addElement(dfs.getFeature());
- }
SeqFeatureI transcript = (SeqFeatureI) transcripts.elementAt(0);
--- 1209,1219 ----
}
! /** Expects a vector of Transcripts.
! This also creates the 3 amino acid sequences.
! This method is essential for BaseEditorPanel initialization.
! */
! public void attachTranscripts(Vector transcripts) {
! if (transcripts.size() < 1)
return;
SeqFeatureI transcript = (SeqFeatureI) transcripts.elementAt(0);
Index: BaseFineEditor.java
===================================================================
RCS file: /cvsroot/gmod/apollo/src/java/apollo/gui/detailviewers/exonviewer/BaseFineEditor.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -C2 -d -r1.16 -r1.17
*** BaseFineEditor.java 29 Jan 2003 20:15:09 -0000 1.16
--- BaseFineEditor.java 31 Jan 2003 00:11:13 -0000 1.17
***************
*** 43,47 ****
protected JLabel lengthLabel;
! protected JLabel featureNameLabel;
StrandedZoomableApolloPanel szap;
--- 43,48 ----
protected JLabel lengthLabel;
! //protected JLabel featureNameLabel;
! private JComboBox transcriptComboBox;
StrandedZoomableApolloPanel szap;
***************
*** 117,121 ****
// false - dont fire sel event (?)
// im thinking this scroll to feature should be taken out
! scrollToFeature (getTranscriptOfFeature (sf),false);
repaint();
} else if (evt.getType() == FeatureChangeEvent.DELETE &&
--- 118,122 ----
// false - dont fire sel event (?)
// im thinking this scroll to feature should be taken out
! displayAnnot (getTranscriptOfFeature (sf),false);
repaint();
} else if (evt.getType() == FeatureChangeEvent.DELETE &&
***************
*** 167,193 ****
/** Handle the selection event
(feature was selected in another window--select it here)
! Only handle external selection if this is the most recent instance of
! BaseFineEditor. Old instances do not react to selection */
public boolean handleFeatureSelectionEvent (FeatureSelectionEvent evt) {
! if (!followSelectionCheckBox.isSelected())
! return false; // if selection checkbox not selected return
! if (this.isVisible() &&
! evt.getFeatures().size() > 0) {
! SeqFeatureI sf = (SeqFeatureI)evt.getFeatures().elementAt(0);
! // if strand of selection is our strand then deal with selection
! boolean is_reverse = (sf.getStrand() == -1);
! if (is_reverse == editorPanel.getReverseStrand()) {
! // now we do something
! if (evt.getSource() != this && sf instanceof GenericAnnotationI) {
! //Transcript t = getTranscriptOfFeature (sf);
! // Since this is an external selection, scrollToFeat fireSelEvent is
! // false as we dont want to cause another selection event
! //if (t != null)
! scrollToFeature ((GenericAnnotationI)sf,false);
! } else
! translationViewer.repaint();
! }
! }
! return false;
}
--- 168,205 ----
/** Handle the selection event
(feature was selected in another window--select it here)
! Only handle if followSelection is checked */
public boolean handleFeatureSelectionEvent (FeatureSelectionEvent evt) {
! // if selection checkbox not selected return unless from editor panel
! // (editor panel selections come this way as well)
! if (!canHandleSelection(evt,this)) return false;
! // now we do something
! SeqFeatureI sf = (SeqFeatureI)evt.getFeatures().elementAt(0);
! displayAnnot ((GenericAnnotationI)sf,false);
! return true;
! }
!
! /** Does all the handle selection checks for BaseFineEditor and BaseEditorPanel */
! boolean canHandleSelection(FeatureSelectionEvent evt,Object self) {
! if (noExternalSelection() && isExternalSelection(evt)) return false;
! if (evt.getSource() == self) return false;
! if (!this.isVisible()) return false;
! if (evt.getFeatures().size() == 0) return false;
! SeqFeatureI sf = (SeqFeatureI)evt.getFeatures().elementAt(0);
! // if strand of selection is not our strand return
! boolean is_reverse = (sf.getStrand() == -1);
! if (is_reverse != editorPanel.getReverseStrand()) return false;
! if ( ! (sf instanceof GenericAnnotationI) ) return false;//repaint transVw?
! return true;
! }
!
! /** True if the selection comes from outside world. false if from this
! OR editorPanel */
! private boolean isExternalSelection(FeatureSelectionEvent e) {
! if (e.getSource() == this || e.getSource() == editorPanel) return false;
! return true;
! }
!
! private boolean noExternalSelection() {
! return !followSelectionCheckBox.isSelected();
}
***************
*** 204,234 ****
}
! public void populateEditorPanel() {
! editorPanel.clear();
! FeatureSetI allFeatures = view.getFeatureSet();
! Vector annotList = new Vector();
! getAnnotations((DrawableFeatureSet) allFeatures, annotList);
! editorPanel.attachTranscripts(annotList);
! }
! /** Recurses featureSet looking for Transcripts. Adds Transcripts to
! Vector output if they are fully in range */
! private void getAnnotations(DrawableFeatureSet featureSet, Vector output) {
! if (featureSet.getFeature() instanceof Transcript) {
! // only add if in cur set range
! Transcript trans = (Transcript)featureSet.getFeature();
! if (trans.haveWholeSequence())//szap.getCurationSet()))
! output.addElement(featureSet);
! }
! else {
! for(int i=0; i < featureSet.getFeatures().size(); i++) {
! SeqFeatureI feature = (SeqFeatureI)
! featureSet.getFeatures().elementAt(i);
! if (feature instanceof DrawableFeatureSet)
! getAnnotations((DrawableFeatureSet) feature, output);
! }
! }
! }
public Color getIndicatorColor() {
--- 216,246 ----
}
! // private void populateEditorPanel() {
! // editorPanel.clear();
! // FeatureSetI allFeatures = view.getFeatureSet();
! // Vector annotList = new Vector();
! // getAnnotations((DrawableFeatureSet) allFeatures, annotList);
! // editorPanel.attachTranscripts(annotList);
! // }
! // /** Recurses featureSet looking for Transcripts. Adds Transcripts to
! // Vector output if they are fully in range */
! // private void getAnnotations(DrawableFeatureSet featureSet, Vector output) {
! // if (featureSet.getFeature() instanceof Transcript) {
! // // only add if in cur set range
! // Transcript trans = (Transcript)featureSet.getFeature();
! // if (trans.haveWholeSequence())//szap.getCurationSet()))
! // output.addElement(featureSet);
! // }
! // else {
! // for(int i=0; i < featureSet.getFeatures().size(); i++) {
! // SeqFeatureI feature = (SeqFeatureI)
! // featureSet.getFeatures().elementAt(i);
! // if (feature instanceof DrawableFeatureSet)
! // getAnnotations((DrawableFeatureSet) feature, output);
! // }
! // }
! // }
public Color getIndicatorColor() {
***************
*** 238,242 ****
public BaseFineEditor(ApolloPanel controllingPanel,
AnnotationView view,
! boolean reverse) {
super((reverse ? "Reverse " : "Forward ") + "Strand Exon Editor");
editors.add(this);
--- 250,255 ----
public BaseFineEditor(ApolloPanel controllingPanel,
AnnotationView view,
! boolean reverse,
! GenericAnnotationI editMe) {
super((reverse ? "Reverse " : "Forward ") + "Strand Exon Editor");
editors.add(this);
***************
*** 247,283 ****
int seqStart = szap.getCurationSet().getLow();
int seqEnd = szap.getCurationSet().getHigh();
editorPanel = new BaseEditorPanel(controllingPanel,
this,
reverse,
seqStart,
! seqEnd);
! populateEditorPanel();
! editorPanel.setFont(new Font("Courier", 0, 14));
! translationViewer = new TranslationViewer(editorPanel);
! translationViewer.setBackground(Color.black);
! featureNameLabel = new JLabel("Transcript name: "+
! "<no feature selected>");
! featureNameLabel.setForeground(Color.black);
! lengthLabel = new JLabel("Translation length: <no feature selected>");
! lengthLabel.setForeground(Color.black);
! showFindBox = new JCheckBox("Show search hits");
! showIntronBox = new JCheckBox("Show introns in translation viewer",
! true);
! showFindBox.setBackground (Color.white);
! showIntronBox.setBackground (Color.white);
! followSelectionCheckBox = new JCheckBox("Follow external selection",false);
! followSelectionCheckBox.setBackground(Color.white);
! upstream_button = new JButton ();
! downstream_button = new JButton ();
!
! colorSwatch = new JPanel();
! init();
! editorPanel.addFeatureSelectionListener(this);
attachListeners();
setVisible(true);
}
! public void showEditRegion() {
colorIndex = (colorIndex + 1) % colorList.length;
indicatorColor = colorList[colorIndex];
--- 260,284 ----
int seqStart = szap.getCurationSet().getLow();
int seqEnd = szap.getCurationSet().getHigh();
+ FeatureSetI annFeatSet = ((DrawableFeatureSet)view.getFeatureSet()).getFeatureSet();
editorPanel = new BaseEditorPanel(controllingPanel,
this,
reverse,
seqStart,
! seqEnd,
! annFeatSet);
! //populateEditorPanel();
! initGui(); // cant do til after editorPanel made
! // cant do this til after initGui (editorPanel needs to know size)
! editorPanel.displayAnnot(editMe);
attachListeners();
+ showEditRegion();
+ displayAnnot(editMe,false);
setVisible(true);
}
! /** puts up vertical lines in szap(main window) indicating the region EDE is
! displaying - make private?*/
! private void showEditRegion() {
colorIndex = (colorIndex + 1) % colorList.length;
indicatorColor = colorList[colorIndex];
***************
*** 313,318 ****
upstream_button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
! // true -> fireSelectionEvent
! scrollToFeature(neighbor_up,true);
}
}
--- 314,318 ----
upstream_button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
! selectAnnot(neighbor_up);
}
}
***************
*** 320,325 ****
downstream_button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
! // true -> fire selection event
! scrollToFeature(neighbor_down,true);
}
}
--- 320,324 ----
downstream_button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
! selectAnnot(neighbor_down);
}
}
***************
*** 365,369 ****
lengthLabel = null;
! featureNameLabel = null;
szap = null;
--- 364,369 ----
lengthLabel = null;
! //featureNameLabel = null;
! transcriptComboBox = null;
szap = null;
***************
*** 386,390 ****
}
! public void init() {
setSize(824,500);
JScrollPane pane = new JScrollPane(editorPanel);
--- 386,410 ----
}
! private void initGui() {
!
! editorPanel.setFont(new Font("Courier", 0, 14));
! translationViewer = new TranslationViewer(editorPanel);
! translationViewer.setBackground(Color.black);
! transcriptComboBox = new JComboBox();
! lengthLabel = new JLabel("Translation length: <no feature selected>");
! lengthLabel.setForeground(Color.black);
! showFindBox = new JCheckBox("Show search hits");
! showIntronBox = new JCheckBox("Show introns in translation viewer",
! true);
! showFindBox.setBackground (Color.white);
! showIntronBox.setBackground (Color.white);
! followSelectionCheckBox = new JCheckBox("Follow external selection",false);
! followSelectionCheckBox.setBackground(Color.white);
! upstream_button = new JButton ();
! downstream_button = new JButton ();
!
! colorSwatch = new JPanel();
!
!
setSize(824,500);
JScrollPane pane = new JScrollPane(editorPanel);
***************
*** 401,408 ****
getContentPane().add(pane, "Center");
! Box featureNameLabelBox = new Box(BoxLayout.X_AXIS);
! featureNameLabelBox.setBackground(Color.white);
! featureNameLabelBox.add(featureNameLabel);
! featureNameLabelBox.add(Box.createHorizontalGlue());
Box lengthLabelBox = new Box(BoxLayout.X_AXIS);
--- 421,432 ----
getContentPane().add(pane, "Center");
! Box transcriptListBox = new Box(BoxLayout.X_AXIS);
! JLabel tranLabel = new JLabel("Transcript: ");
! tranLabel.setForeground(Color.black);
! transcriptListBox.add(tranLabel);
! transcriptListBox.setBackground(Color.white);
! transcriptComboBox.setMaximumSize(new Dimension(300,30));
! transcriptListBox.add(transcriptComboBox);
! transcriptListBox.add(Box.createHorizontalGlue());
Box lengthLabelBox = new Box(BoxLayout.X_AXIS);
***************
*** 428,432 ****
Box labelPanel = new Box(BoxLayout.Y_AXIS);
labelPanel.setBackground(Color.white);
! labelPanel.add(featureNameLabelBox);
labelPanel.add(lengthLabelBox);
labelPanel.add(checkboxes);
--- 452,456 ----
Box labelPanel = new Box(BoxLayout.Y_AXIS);
labelPanel.setBackground(Color.white);
! labelPanel.add(transcriptListBox);
labelPanel.add(lengthLabelBox);
labelPanel.add(checkboxes);
***************
*** 455,476 ****
}
! /** Scroll to GenericAnnotationI feature.
! Exon, Transcript, and Gene are all GenericAnnoationI
! Calls BaseEditorPanel.selectFeature(annot,fireSelectionEvent) to get the
! annot selected in the panel. If fireSelectionEvent is false a selection
! event will not be fired off (for selections of external source). Call with
! true for internal selections. */
! public void scrollToFeature(GenericAnnotationI annot, boolean fireSelectionEvent) {
Transcript transcript = null;
if (annot == null) {
! featureNameLabel.setText("Transcript name: <no feature selected>");
lengthLabel.setText("Translation length: <no feature selected>");
upstream_button.setLabel("");
downstream_button.setLabel("");
} else {
- // this will do the scrolling
- editorPanel.selectFeature(annot,fireSelectionEvent);
transcript = getTranscript(annot);
! featureNameLabel.setText("Transcript name: " + transcript.getName());
Gene gene = transcript.getGene();
if (gene.getType().equalsIgnoreCase ("gene")) {
--- 479,509 ----
}
!
! /** Both fires off selection event and displays annot */
! private void selectAnnot(GenericAnnotationI annot) {
! displayAnnot(annot);
! getSelectionManager().select(annot,this); // sends off selection
! }
!
! /** Display GenericAnnotationI feature.
! Exon, Transcript, and Gene are all GenericAnnotationI. Call with
! true for internal selections. Rename this! */
! private void displayAnnot(GenericAnnotationI annot) {
! displayAnnot(annot,true);
! }
! private void displayAnnot(GenericAnnotationI annot,
! boolean setUpTranscriptComboBox) {
Transcript transcript = null;
if (annot == null) {
! //featureNameLabel.setText("Transcript name: <no feature selected>");
! transcriptComboBox.removeAllItems();
! transcriptComboBox.addItem("<no feature selected>");
lengthLabel.setText("Translation length: <no feature selected>");
upstream_button.setLabel("");
downstream_button.setLabel("");
} else {
transcript = getTranscript(annot);
! setupTranscriptComboBox(transcript);
!
Gene gene = transcript.getGene();
if (gene.getType().equalsIgnoreCase ("gene")) {
***************
*** 519,522 ****
--- 552,584 ----
}
+
+ private void setupTranscriptComboBox(Transcript transcript) {
+ // could also check for gene change before doing a removeAll
+ if (transcriptComboBox.getSelectedItem() == transcript) return;
+ // adding and removing items causes item events to fire so need to remove
+ // listener here - is there any other way to supress firing?
+ transcriptComboBox.removeItemListener(transItemListener);
+ transcriptComboBox.removeAllItems();
+ if (transcript==null) {
+ transcriptComboBox.addItem("<no feature selected>");
+ return;
+ }
+ Gene gene = transcript.getGene();
+ Vector transcripts = gene.getTranscripts();
+ for (int i=0; i<transcripts.size(); i++)
+ transcriptComboBox.addItem(transcripts.elementAt(i));
+ transcriptComboBox.setSelectedItem(transcript);//.getName());
+ transcriptComboBox.addItemListener(transItemListener);
+ }
+ private TranscriptComboBoxItemListener transItemListener
+ = new TranscriptComboBoxItemListener();
+ private class TranscriptComboBoxItemListener implements ItemListener {
+ public void itemStateChanged(ItemEvent e) {
+ if (e.getStateChange() == ItemEvent.SELECTED
+ && e.getItem() instanceof Transcript)
+ selectAnnot((Transcript)e.getItem());
+ }
+ }
+
/** AssemblyFeature is the only GAI at the moment that has no relation to
|