1 package jalview.controller;
4 import java.util.BitSet;
7 import jalview.api.AlignViewControllerGuiI;
8 import jalview.api.AlignViewControllerI;
9 import jalview.api.AlignViewportI;
10 import jalview.api.AlignmentViewPanel;
11 import jalview.datamodel.AlignmentI;
12 import jalview.datamodel.AnnotatedCollectionI;
13 import jalview.datamodel.ColumnSelection;
14 import jalview.datamodel.SequenceCollectionI;
15 import jalview.datamodel.SequenceFeature;
16 import jalview.datamodel.SequenceGroup;
17 import jalview.datamodel.SequenceI;
19 public class AlignViewController implements AlignViewControllerI
21 AlignViewportI viewport=null;
22 AlignmentViewPanel alignPanel=null;
24 * the GUI container that is handling interactions with the user
26 private AlignViewControllerGuiI avcg;
28 protected void finalize() throws Throwable {
34 public AlignViewController(AlignViewControllerGuiI alignFrame, AlignViewportI viewport,
35 AlignmentViewPanel alignPanel)
37 this.avcg = alignFrame;
38 this.viewport=viewport;
39 this.alignPanel = alignPanel;
42 public void setViewportAndAlignmentPanel(AlignViewportI viewport,AlignmentViewPanel alignPanel)
44 this.alignPanel = alignPanel;
45 this.viewport = viewport;
49 public boolean makeGroupsFromSelection()
52 if (viewport.getSelectionGroup() != null)
54 SequenceGroup[] gps = jalview.analysis.Grouping.makeGroupsFrom(
55 viewport.getSequenceSelection(),
56 viewport.getAlignmentView(true).getSequenceStrings(
57 viewport.getGapCharacter()), viewport.getAlignment()
59 viewport.getAlignment().deleteAllGroups();
60 viewport.clearSequenceColours();
61 viewport.setSelectionGroup(null);
62 // set view properties for each group
63 for (int g = 0; g < gps.length; g++)
65 // gps[g].setShowunconserved(viewport.getShowUnconserved());
66 gps[g].setshowSequenceLogo(viewport.isShowSequenceLogo());
67 viewport.getAlignment().addGroup(gps[g]);
68 Color col = new Color((int) (Math.random() * 255),
69 (int) (Math.random() * 255), (int) (Math.random() * 255));
71 for (SequenceI sq : gps[g].getSequences(null))
72 viewport.setSequenceColour(sq, col);
79 public boolean createGroup()
82 SequenceGroup sg = viewport.getSelectionGroup();
85 viewport.getAlignment().addGroup(sg);
91 public boolean unGroup()
93 SequenceGroup sg = viewport.getSelectionGroup();
96 viewport.getAlignment().deleteGroup(sg);
102 public boolean deleteGroups()
104 if (viewport.getAlignment().getGroups()!=null && viewport.getAlignment().getGroups().size()>0)
106 viewport.getAlignment().deleteAllGroups();
107 viewport.clearSequenceColours();
108 viewport.setSelectionGroup(null);
115 public boolean markColumnsContainingFeatures(boolean invert, boolean extendCurrent, boolean toggle, String featureType)
117 // JBPNote this routine could also mark rows, not just columns.
118 // need a decent query structure to allow all types of feature searches
119 BitSet bs = new BitSet();
121 SequenceCollectionI sqcol = (viewport.getSelectionGroup() == null ? viewport.getAlignment() : viewport.getSelectionGroup());
122 alStart = sqcol.getStartRes();
123 alw = sqcol.getEndRes()+1;
124 List<SequenceI> seqs = sqcol.getSequences();
126 for (SequenceI sq : seqs)
131 SequenceI dsq = sq.getDatasetSequence();
132 while (dsq.getDatasetSequence() != null)
134 dsq = dsq.getDatasetSequence();
137 SequenceFeature[] sf = dsq.getSequenceFeatures();
140 int ist = sq.findIndex(sq.getStart());
141 int iend = sq.findIndex(sq.getEnd());
142 if (iend < alStart || ist> alw)
144 // sequence not in region
147 for (SequenceFeature sfpos : sf)
149 // future functionalty - featureType == null means mark columns
150 // containing all displayed features
151 if (sfpos != null && (featureType.equals(sfpos.getType())))
154 // optimisation - could consider 'spos,apos' like cursor argument
155 // - findIndex wastes time by starting from first character and
158 int i = sq.findIndex(sfpos.getBegin());
159 int j = sq.findIndex(sfpos.getEnd());
160 if (j<alStart || i>alw)
162 // feature is outside selected region
190 ColumnSelection cs = viewport.getColumnSelection();
191 if (bs.cardinality() > 0 || invert)
195 cs = new ColumnSelection();
204 // invert only in the currently selected sequence region
205 for (int i = bs.nextClearBit(alStart), ibs = bs.nextSetBit(alStart); i >= alStart
208 if (ibs < 0 || i < ibs)
210 if (toggle && cs.contains(i))
212 cs.removeElement(i++);
220 i = bs.nextClearBit(ibs);
221 ibs = bs.nextSetBit(i);
227 for (int i = bs.nextSetBit(alStart); i >= alStart; i = bs.nextSetBit(i + 1))
229 if (toggle && cs.contains(i))
238 viewport.setColumnSelection(cs);
239 alignPanel.paintAlignment(true);
240 avcg.setStatus((toggle ? "Toggled ": "Marked ")
241 + (invert ? (alw-alStart) - bs.cardinality() : bs.cardinality())
242 + " columns "+(invert ? "not " : "") + "containing features of type " + featureType
243 + " across " + nseq + " sequence(s)");
248 avcg.setStatus("No features of type " + featureType + " found.");
249 if (!extendCurrent && cs!=null)
252 alignPanel.paintAlignment(true);