JAL-1807 Bob's JalviewJS prototype first commit
[jalviewjs.git] / bin / jalview / controller / AlignViewController.js
1 Clazz.declarePackage ("jalview.controller");\r
2 Clazz.load (["jalview.api.AlignViewControllerI"], "jalview.controller.AlignViewController", ["jalview.analysis.AlignmentSorter", "$.Grouping", "jalview.commands.OrderCommand", "jalview.datamodel.ColumnSelection", "jalview.io.FeaturesFile", "jalview.util.MessageManager", "java.awt.Color", "java.util.ArrayList", "$.BitSet"], function () {\r
3 c$ = Clazz.decorateAsClass (function () {\r
4 this.viewport = null;\r
5 this.alignPanel = null;\r
6 this.avcg = null;\r
7 Clazz.instantialize (this, arguments);\r
8 }, jalview.controller, "AlignViewController", null, jalview.api.AlignViewControllerI);\r
9 Clazz.overrideMethod (c$, "finalize", \r
10 function () {\r
11 this.viewport = null;\r
12 this.alignPanel = null;\r
13 this.avcg = null;\r
14 });\r
15 Clazz.makeConstructor (c$, \r
16 function (alignFrame, viewport, alignPanel) {\r
17 this.avcg = alignFrame;\r
18 this.viewport = viewport;\r
19 this.alignPanel = alignPanel;\r
20 }, "jalview.api.AlignViewControllerGuiI,jalview.api.AlignViewportI,jalview.api.AlignmentViewPanel");\r
21 Clazz.overrideMethod (c$, "setViewportAndAlignmentPanel", \r
22 function (viewport, alignPanel) {\r
23 this.alignPanel = alignPanel;\r
24 this.viewport = viewport;\r
25 }, "jalview.api.AlignViewportI,jalview.api.AlignmentViewPanel");\r
26 Clazz.overrideMethod (c$, "makeGroupsFromSelection", \r
27 function () {\r
28 var sg = this.viewport.getSelectionGroup ();\r
29 var cs = this.viewport.getColumnSelection ();\r
30 var gps = null;\r
31 if (sg != null && (cs == null || cs.getSelected () == null || cs.size () == 0)) {\r
32 gps = jalview.analysis.Grouping.makeGroupsFrom (this.viewport.getSequenceSelection (), this.viewport.getAlignmentView (true).getSequenceStrings (this.viewport.getGapCharacter ()), this.viewport.getAlignment ().getGroups ());\r
33 } else {\r
34 if (cs != null) {\r
35 gps = jalview.analysis.Grouping.makeGroupsFromCols ((sg == null) ? this.viewport.getAlignment ().getSequencesArray () : sg.getSequences ().toArray ( new Array (0)), cs, this.viewport.getAlignment ().getGroups ());\r
36 }}if (gps != null) {\r
37 this.viewport.getAlignment ().deleteAllGroups ();\r
38 this.viewport.clearSequenceColours ();\r
39 this.viewport.setSelectionGroup (null);\r
40 for (var g = 0; g < gps.length; g++) {\r
41 gps[g].setshowSequenceLogo (this.viewport.isShowSequenceLogo ());\r
42 this.viewport.getAlignment ().addGroup (gps[g]);\r
43 var col =  new java.awt.Color (Clazz.doubleToInt (Math.random () * 255), Clazz.doubleToInt (Math.random () * 255), Clazz.doubleToInt (Math.random () * 255));\r
44 col = col.brighter ();\r
45 for (var sq, $sq = gps[g].getSequences (null).iterator (); $sq.hasNext () && ((sq = $sq.next ()) || true);) {\r
46 this.viewport.setSequenceColour (sq, col);\r
47 }\r
48 }\r
49 return true;\r
50 }return false;\r
51 });\r
52 Clazz.overrideMethod (c$, "createGroup", \r
53 function () {\r
54 var sg = this.viewport.getSelectionGroup ();\r
55 if (sg != null) {\r
56 this.viewport.getAlignment ().addGroup (sg);\r
57 return true;\r
58 }return false;\r
59 });\r
60 Clazz.overrideMethod (c$, "unGroup", \r
61 function () {\r
62 var sg = this.viewport.getSelectionGroup ();\r
63 if (sg != null) {\r
64 this.viewport.getAlignment ().deleteGroup (sg);\r
65 return true;\r
66 }return false;\r
67 });\r
68 Clazz.overrideMethod (c$, "deleteGroups", \r
69 function () {\r
70 if (this.viewport.getAlignment ().getGroups () != null && this.viewport.getAlignment ().getGroups ().size () > 0) {\r
71 this.viewport.getAlignment ().deleteAllGroups ();\r
72 this.viewport.clearSequenceColours ();\r
73 this.viewport.setSelectionGroup (null);\r
74 return true;\r
75 }return false;\r
76 });\r
77 Clazz.overrideMethod (c$, "markColumnsContainingFeatures", \r
78 function (invert, extendCurrent, toggle, featureType) {\r
79 var bs =  new java.util.BitSet ();\r
80 var alw;\r
81 var alStart;\r
82 var sqcol = (this.viewport.getSelectionGroup () == null ? this.viewport.getAlignment () : this.viewport.getSelectionGroup ());\r
83 alStart = sqcol.getStartRes ();\r
84 alw = sqcol.getEndRes () + 1;\r
85 var seqs = sqcol.getSequences ();\r
86 var nseq = 0;\r
87 for (var sq, $sq = seqs.iterator (); $sq.hasNext () && ((sq = $sq.next ()) || true);) {\r
88 var tfeat = 0;\r
89 if (sq != null) {\r
90 var sf = sq.getSequenceFeatures ();\r
91 if (sf != null) {\r
92 var ist = sq.findIndex (sq.getStart ());\r
93 var iend = sq.findIndex (sq.getEnd ());\r
94 if (iend < alStart || ist > alw) {\r
95 continue;\r
96 }for (var sfpos, $sfpos = 0, $$sfpos = sf; $sfpos < $$sfpos.length && ((sfpos = $$sfpos[$sfpos]) || true); $sfpos++) {\r
97 if (sfpos != null && (featureType.equals (sfpos.getType ()))) {\r
98 tfeat++;\r
99 var i = sq.findIndex (sfpos.getBegin ());\r
100 var j = sq.findIndex (sfpos.getEnd ());\r
101 if (j < alStart || i > alw) {\r
102 continue;\r
103 }if (i < alStart) {\r
104 i = alStart;\r
105 }if (i < ist) {\r
106 i = ist;\r
107 }if (j > alw) {\r
108 j = alw;\r
109 }for (; i <= j; i++) {\r
110 bs.set (i - 1);\r
111 }\r
112 }}\r
113 }if (tfeat > 0) {\r
114 nseq++;\r
115 }}}\r
116 var cs = this.viewport.getColumnSelection ();\r
117 if (bs.cardinality () > 0 || invert) {\r
118 if (cs == null) {\r
119 cs =  new jalview.datamodel.ColumnSelection ();\r
120 } else {\r
121 if (!extendCurrent) {\r
122 cs.clear ();\r
123 }}if (invert) {\r
124 for (var i = bs.nextClearBit (alStart), ibs = bs.nextSetBit (alStart); i >= alStart && i < (alw); ) {\r
125 if (ibs < 0 || i < ibs) {\r
126 if (toggle && cs.contains (i)) {\r
127 cs.removeElement (i++);\r
128 } else {\r
129 cs.addElement (i++);\r
130 }} else {\r
131 i = bs.nextClearBit (ibs);\r
132 ibs = bs.nextSetBit (i);\r
133 }}\r
134 } else {\r
135 for (var i = bs.nextSetBit (alStart); i >= alStart; i = bs.nextSetBit (i + 1)) {\r
136 if (toggle && cs.contains (i)) {\r
137 cs.removeElement (i);\r
138 } else {\r
139 cs.addElement (i);\r
140 }}\r
141 }this.viewport.setColumnSelection (cs);\r
142 this.alignPanel.paintAlignment (true);\r
143 this.avcg.setStatus (jalview.util.MessageManager.formatMessage ("label.view_controller_toggled_marked",  Clazz.newArray (-1, [(toggle ? jalview.util.MessageManager.getString ("label.toggled") : jalview.util.MessageManager.getString ("label.marked")), (invert ? (Integer.$valueOf ((alw - alStart) - bs.cardinality ()).toString ()) : (Integer.$valueOf (bs.cardinality ()).toString ())), featureType, Integer.$valueOf (nseq).toString ()])));\r
144 return true;\r
145 } else {\r
146 this.avcg.setStatus (jalview.util.MessageManager.formatMessage ("label.no_feature_of_type_found",  Clazz.newArray (-1, [featureType])));\r
147 if (!extendCurrent && cs != null) {\r
148 cs.clear ();\r
149 this.alignPanel.paintAlignment (true);\r
150 }return false;\r
151 }}, "~B,~B,~B,~S");\r
152 Clazz.overrideMethod (c$, "sortAlignmentByFeatureDensity", \r
153 function (typ) {\r
154 this.sortBy (typ, "Sort by Density", jalview.analysis.AlignmentSorter.FEATURE_DENSITY);\r
155 }, "~A");\r
156 Clazz.defineMethod (c$, "sortBy", \r
157 function (typ, methodText, method) {\r
158 var fr = this.alignPanel.getFeatureRenderer ();\r
159 if (typ == null) {\r
160 typ = fr == null ? null : fr.getDisplayedFeatureTypes ();\r
161 }var gps = null;\r
162 gps = fr == null ? null : fr.getDisplayedFeatureGroups ();\r
163 if (typ != null) {\r
164 var types =  new java.util.ArrayList ();\r
165 for (var i = 0; i < typ.length; i++) {\r
166 if (typ[i] != null) {\r
167 types.add (typ[i]);\r
168 }typ =  new Array (types.size ());\r
169 types.toArray (typ);\r
170 }\r
171 }if (gps != null) {\r
172 var grps =  new java.util.ArrayList ();\r
173 for (var i = 0; i < gps.length; i++) {\r
174 if (gps[i] != null) {\r
175 grps.add (gps[i]);\r
176 }}\r
177 gps =  new Array (grps.size ());\r
178 grps.toArray (gps);\r
179 }var al = this.viewport.getAlignment ();\r
180 var start;\r
181 var stop;\r
182 var sg = this.viewport.getSelectionGroup ();\r
183 if (sg != null) {\r
184 start = sg.getStartRes ();\r
185 stop = sg.getEndRes ();\r
186 } else {\r
187 start = 0;\r
188 stop = al.getWidth ();\r
189 }var oldOrder = al.getSequencesArray ();\r
190 jalview.analysis.AlignmentSorter.sortByFeature (typ, gps, start, stop, al, method);\r
191 this.avcg.addHistoryItem ( new jalview.commands.OrderCommand (methodText, oldOrder, this.viewport.getAlignment ()));\r
192 this.alignPanel.paintAlignment (true);\r
193 }, "~A,~S,~S");\r
194 Clazz.overrideMethod (c$, "sortAlignmentByFeatureScore", \r
195 function (typ) {\r
196 this.sortBy (typ, "Sort by Feature Score", jalview.analysis.AlignmentSorter.FEATURE_SCORE);\r
197 }, "~A");\r
198 Clazz.overrideMethod (c$, "parseFeaturesFile", \r
199 function (file, protocol, relaxedIdMatching) {\r
200 var featuresFile = false;\r
201 try {\r
202 featuresFile =  new jalview.io.FeaturesFile (file, protocol).parse (this.viewport.getAlignment ().getDataset (), this.alignPanel.getFeatureRenderer ().getFeatureColours (), false, relaxedIdMatching);\r
203 } catch (ex) {\r
204 if (Clazz.exceptionOf (ex, Exception)) {\r
205 ex.printStackTrace ();\r
206 } else {\r
207 throw ex;\r
208 }\r
209 }\r
210 if (featuresFile) {\r
211 this.avcg.refreshFeatureUI (true);\r
212 if (this.alignPanel.getFeatureRenderer () != null) {\r
213 this.alignPanel.getFeatureRenderer ().findAllFeatures (true);\r
214 }if (this.avcg.getFeatureSettingsUI () != null) {\r
215 this.avcg.getFeatureSettingsUI ().discoverAllFeatureData ();\r
216 }this.alignPanel.paintAlignment (true);\r
217 }return featuresFile;\r
218 }, "~S,~S,~B");\r
219 });\r