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.ColumnSelection;
12 import jalview.datamodel.SequenceFeature;
13 import jalview.datamodel.SequenceGroup;
14 import jalview.datamodel.SequenceI;
16 public class AlignViewController implements AlignViewControllerI
18 AlignViewportI viewport=null;
19 AlignmentViewPanel alignPanel=null;
21 * the GUI container that is handling interactions with the user
23 private AlignViewControllerGuiI avcg;
25 protected void finalize() throws Throwable {
31 public AlignViewController(AlignViewControllerGuiI alignFrame, AlignViewportI viewport,
32 AlignmentViewPanel alignPanel)
34 this.avcg = alignFrame;
35 this.viewport=viewport;
36 this.alignPanel = alignPanel;
39 public void setViewportAndAlignmentPanel(AlignViewportI viewport,AlignmentViewPanel alignPanel)
41 this.alignPanel = alignPanel;
42 this.viewport = viewport;
46 public boolean makeGroupsFromSelection()
49 if (viewport.getSelectionGroup() != null)
51 SequenceGroup[] gps = jalview.analysis.Grouping.makeGroupsFrom(
52 viewport.getSequenceSelection(),
53 viewport.getAlignmentView(true).getSequenceStrings(
54 viewport.getGapCharacter()), viewport.getAlignment()
56 viewport.getAlignment().deleteAllGroups();
57 viewport.clearSequenceColours();
58 viewport.setSelectionGroup(null);
59 // set view properties for each group
60 for (int g = 0; g < gps.length; g++)
62 // gps[g].setShowunconserved(viewport.getShowUnconserved());
63 gps[g].setshowSequenceLogo(viewport.isShowSequenceLogo());
64 viewport.getAlignment().addGroup(gps[g]);
65 Color col = new Color((int) (Math.random() * 255),
66 (int) (Math.random() * 255), (int) (Math.random() * 255));
68 for (SequenceI sq : gps[g].getSequences(null))
69 viewport.setSequenceColour(sq, col);
76 public boolean createGroup()
79 SequenceGroup sg = viewport.getSelectionGroup();
82 viewport.getAlignment().addGroup(sg);
88 public boolean unGroup()
90 SequenceGroup sg = viewport.getSelectionGroup();
93 viewport.getAlignment().deleteGroup(sg);
99 public boolean deleteGroups()
101 if (viewport.getAlignment().getGroups()!=null && viewport.getAlignment().getGroups().size()>0)
103 viewport.getAlignment().deleteAllGroups();
104 viewport.clearSequenceColours();
105 viewport.setSelectionGroup(null);
112 public boolean markColumnsContainingFeatures(boolean invert,
115 // JBPNote this routine could also mark rows, not just columns.
116 // need a decent query structure to allow all types of feature searches
117 BitSet bs = new BitSet();
118 List<SequenceI> seqs = viewport.getAlignment().getSequences();
119 int alw = viewport.getAlignment().getWidth();
121 for (SequenceI sq : seqs)
126 SequenceI dsq = sq.getDatasetSequence();
127 while (dsq.getDatasetSequence() != null)
129 dsq = dsq.getDatasetSequence();
132 SequenceFeature[] sf = dsq.getSequenceFeatures();
135 for (SequenceFeature sfpos : sf)
137 // future functionalty - featureType == null means mark columns
138 // containing all displayed features
139 if (sfpos != null && (featureType.equals(sfpos.getType())))
142 // optimisation - could consider 'spos,apos' like cursor argument
143 // - findIndex wastes time by starting from first character and
146 int i = sq.findIndex(sfpos.getBegin());
147 int ist = sq.findIndex(sq.getStart());
152 int j = sq.findIndex(sfpos.getEnd());
171 if (bs.cardinality() > 0 || invert)
173 ColumnSelection cs = viewport.getColumnSelection();
176 cs = new ColumnSelection();
180 for (int i = bs.nextClearBit(0), ibs = bs.nextSetBit(0); i >= 0
183 if (ibs < 0 || i < ibs)
189 i = bs.nextClearBit(ibs);
190 ibs = bs.nextSetBit(i);
196 for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1))
201 viewport.setColumnSelection(cs);
202 alignPanel.paintAlignment(true);
203 avcg.setStatus("Marked "
204 + (invert ? alw - bs.cardinality() : bs.cardinality())
205 + " columns containing features of type " + featureType
206 + " across " + nseq);
211 avcg.setStatus("No features of type " + featureType + " found.");