Class |
Line # |
Actions |
|||
---|---|---|---|---|---|
APopupMenu | 79 | 529 | 139 |
1 | /* | |
2 | * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) | |
3 | * Copyright (C) $$Year-Rel$$ The Jalview Authors | |
4 | * | |
5 | * This file is part of Jalview. | |
6 | * | |
7 | * Jalview is free software: you can redistribute it and/or | |
8 | * modify it under the terms of the GNU General Public License | |
9 | * as published by the Free Software Foundation, either version 3 | |
10 | * of the License, or (at your option) any later version. | |
11 | * | |
12 | * Jalview is distributed in the hope that it will be useful, but | |
13 | * WITHOUT ANY WARRANTY; without even the implied warranty | |
14 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR | |
15 | * PURPOSE. See the GNU General Public License for more details. | |
16 | * | |
17 | * You should have received a copy of the GNU General Public License | |
18 | * along with Jalview. If not, see <http://www.gnu.org/licenses/>. | |
19 | * The Jalview Authors are detailed in the 'AUTHORS' file. | |
20 | */ | |
21 | package jalview.appletgui; | |
22 | ||
23 | import java.awt.CheckboxMenuItem; | |
24 | import java.awt.Frame; | |
25 | import java.awt.Menu; | |
26 | import java.awt.MenuItem; | |
27 | import java.awt.event.ActionEvent; | |
28 | import java.awt.event.ActionListener; | |
29 | import java.awt.event.ItemEvent; | |
30 | import java.awt.event.ItemListener; | |
31 | import java.util.ArrayList; | |
32 | import java.util.Arrays; | |
33 | import java.util.Collection; | |
34 | import java.util.Collections; | |
35 | import java.util.LinkedHashMap; | |
36 | import java.util.List; | |
37 | import java.util.Map; | |
38 | import java.util.SortedMap; | |
39 | import java.util.TreeMap; | |
40 | import java.util.Vector; | |
41 | ||
42 | import jalview.analysis.AAFrequency; | |
43 | import jalview.analysis.AlignmentAnnotationUtils; | |
44 | import jalview.analysis.AlignmentUtils; | |
45 | import jalview.analysis.Conservation; | |
46 | import jalview.bin.JalviewLite; | |
47 | import jalview.commands.ChangeCaseCommand; | |
48 | import jalview.commands.EditCommand; | |
49 | import jalview.commands.EditCommand.Action; | |
50 | import jalview.datamodel.AlignmentAnnotation; | |
51 | import jalview.datamodel.AlignmentI; | |
52 | import jalview.datamodel.PDBEntry; | |
53 | import jalview.datamodel.SequenceFeature; | |
54 | import jalview.datamodel.SequenceGroup; | |
55 | import jalview.datamodel.SequenceI; | |
56 | import jalview.io.AppletFormatAdapter; | |
57 | import jalview.io.DataSourceType; | |
58 | import jalview.io.FileFormatI; | |
59 | import jalview.io.FileFormats; | |
60 | import jalview.io.SequenceAnnotationReport; | |
61 | import jalview.renderer.ResidueShader; | |
62 | import jalview.renderer.ResidueShaderI; | |
63 | import jalview.schemes.Blosum62ColourScheme; | |
64 | import jalview.schemes.BuriedColourScheme; | |
65 | import jalview.schemes.ClustalxColourScheme; | |
66 | import jalview.schemes.HelixColourScheme; | |
67 | import jalview.schemes.HydrophobicColourScheme; | |
68 | import jalview.schemes.JalviewColourScheme; | |
69 | import jalview.schemes.NucleotideColourScheme; | |
70 | import jalview.schemes.PIDColourScheme; | |
71 | import jalview.schemes.PurinePyrimidineColourScheme; | |
72 | import jalview.schemes.StrandColourScheme; | |
73 | import jalview.schemes.TaylorColourScheme; | |
74 | import jalview.schemes.TurnColourScheme; | |
75 | import jalview.schemes.ZappoColourScheme; | |
76 | import jalview.util.MessageManager; | |
77 | import jalview.util.UrlLink; | |
78 | ||
79 | public class APopupMenu extends java.awt.PopupMenu | |
80 | implements ActionListener, ItemListener | |
81 | { | |
82 | Menu groupMenu = new Menu(); | |
83 | ||
84 | MenuItem editGroupName = new MenuItem(); | |
85 | ||
86 | CheckboxMenuItem noColour = new CheckboxMenuItem(); | |
87 | ||
88 | protected CheckboxMenuItem clustalColour = new CheckboxMenuItem(); | |
89 | ||
90 | protected CheckboxMenuItem zappoColour = new CheckboxMenuItem(); | |
91 | ||
92 | protected CheckboxMenuItem taylorColour = new CheckboxMenuItem(); | |
93 | ||
94 | protected CheckboxMenuItem hydrophobicityColour = new CheckboxMenuItem(); | |
95 | ||
96 | protected CheckboxMenuItem helixColour = new CheckboxMenuItem(); | |
97 | ||
98 | protected CheckboxMenuItem strandColour = new CheckboxMenuItem(); | |
99 | ||
100 | protected CheckboxMenuItem turnColour = new CheckboxMenuItem(); | |
101 | ||
102 | protected CheckboxMenuItem buriedColour = new CheckboxMenuItem(); | |
103 | ||
104 | protected CheckboxMenuItem PIDColour = new CheckboxMenuItem(); | |
105 | ||
106 | protected CheckboxMenuItem BLOSUM62Colour = new CheckboxMenuItem(); | |
107 | ||
108 | CheckboxMenuItem nucleotideColour = new CheckboxMenuItem(); | |
109 | ||
110 | CheckboxMenuItem purinePyrimidineColour = new CheckboxMenuItem(); | |
111 | ||
112 | protected MenuItem userDefinedColour = new MenuItem(); | |
113 | ||
114 | protected CheckboxMenuItem abovePIDColour = new CheckboxMenuItem(); | |
115 | ||
116 | MenuItem modifyPID = new MenuItem(); | |
117 | ||
118 | protected CheckboxMenuItem conservationColour = new CheckboxMenuItem(); | |
119 | ||
120 | MenuItem modifyConservation = new MenuItem(); | |
121 | ||
122 | MenuItem noColourmenuItem = new MenuItem(); | |
123 | ||
124 | final AlignmentPanel ap; | |
125 | ||
126 | MenuItem unGroupMenuItem = new MenuItem(); | |
127 | ||
128 | MenuItem createGroupMenuItem = new MenuItem(); | |
129 | ||
130 | Menu colourMenu = new Menu(); | |
131 | ||
132 | CheckboxMenuItem showBoxes = new CheckboxMenuItem(); | |
133 | ||
134 | CheckboxMenuItem showText = new CheckboxMenuItem(); | |
135 | ||
136 | CheckboxMenuItem showColourText = new CheckboxMenuItem(); | |
137 | ||
138 | CheckboxMenuItem displayNonconserved = new CheckboxMenuItem(); | |
139 | ||
140 | Menu seqShowAnnotationsMenu = new Menu( | |
141 | MessageManager.getString("label.show_annotations")); | |
142 | ||
143 | Menu seqHideAnnotationsMenu = new Menu( | |
144 | MessageManager.getString("label.hide_annotations")); | |
145 | ||
146 | MenuItem seqAddReferenceAnnotations = new MenuItem( | |
147 | MessageManager.getString("label.add_reference_annotations")); | |
148 | ||
149 | Menu groupShowAnnotationsMenu = new Menu( | |
150 | MessageManager.getString("label.show_annotations")); | |
151 | ||
152 | Menu groupHideAnnotationsMenu = new Menu( | |
153 | MessageManager.getString("label.hide_annotations")); | |
154 | ||
155 | MenuItem groupAddReferenceAnnotations = new MenuItem( | |
156 | MessageManager.getString("label.add_reference_annotations")); | |
157 | ||
158 | Menu editMenu = new Menu(MessageManager.getString("action.edit")); | |
159 | ||
160 | MenuItem copy = new MenuItem(MessageManager.getString("action.copy")); | |
161 | ||
162 | MenuItem cut = new MenuItem(MessageManager.getString("action.cut")); | |
163 | ||
164 | MenuItem toUpper = new MenuItem( | |
165 | MessageManager.getString("label.to_upper_case")); | |
166 | ||
167 | MenuItem toLower = new MenuItem( | |
168 | MessageManager.getString("label.to_lower_case")); | |
169 | ||
170 | MenuItem toggleCase = new MenuItem( | |
171 | MessageManager.getString("label.toggle_case")); | |
172 | ||
173 | Menu outputmenu = new Menu(); | |
174 | ||
175 | Menu seqMenu = new Menu(); | |
176 | ||
177 | MenuItem pdb = new MenuItem(); | |
178 | ||
179 | MenuItem hideSeqs = new MenuItem(); | |
180 | ||
181 | MenuItem repGroup = new MenuItem(); | |
182 | ||
183 | MenuItem sequenceName = new MenuItem( | |
184 | MessageManager.getString("label.edit_name_description")); | |
185 | ||
186 | MenuItem sequenceFeature = new MenuItem( | |
187 | MessageManager.getString("label.create_sequence_feature")); | |
188 | ||
189 | MenuItem editSequence = new MenuItem( | |
190 | MessageManager.getString("label.edit_sequence")); | |
191 | ||
192 | MenuItem sequenceDetails = new MenuItem( | |
193 | MessageManager.getString("label.sequence_details")); | |
194 | ||
195 | MenuItem selSeqDetails = new MenuItem( | |
196 | MessageManager.getString("label.sequence_details")); | |
197 | ||
198 | MenuItem makeReferenceSeq = new MenuItem(); | |
199 | ||
200 | SequenceI seq; | |
201 | ||
202 | MenuItem revealAll = new MenuItem(); | |
203 | ||
204 | MenuItem revealSeq = new MenuItem(); | |
205 | ||
206 | /** | |
207 | * index of sequence to be revealed | |
208 | */ | |
209 | int revealSeq_index = -1; | |
210 | ||
211 | Menu menu1 = new Menu(); | |
212 | ||
213 | 0 | public APopupMenu(AlignmentPanel apanel, final SequenceI seq, |
214 | List<String> links) | |
215 | { | |
216 | // ///////////////////////////////////////////////////////// | |
217 | // If this is activated from the sequence panel, the user may want to | |
218 | // edit or annotate a particular residue. Therefore display the residue menu | |
219 | // | |
220 | // If from the IDPanel, we must display the sequence menu | |
221 | // //////////////////////////////////////////////////////// | |
222 | ||
223 | 0 | this.ap = apanel; |
224 | 0 | this.seq = seq; |
225 | ||
226 | 0 | try |
227 | { | |
228 | 0 | jbInit(); |
229 | } catch (Exception e) | |
230 | { | |
231 | 0 | e.printStackTrace(); |
232 | } | |
233 | ||
234 | 0 | for (String ff : FileFormats.getInstance().getWritableFormats(true)) |
235 | { | |
236 | 0 | MenuItem item = new MenuItem(ff); |
237 | ||
238 | 0 | item.addActionListener(this); |
239 | 0 | outputmenu.add(item); |
240 | } | |
241 | ||
242 | 0 | buildAnnotationSubmenus(); |
243 | ||
244 | 0 | SequenceGroup sg = ap.av.getSelectionGroup(); |
245 | 0 | if (sg != null && sg.getSize() > 0) |
246 | { | |
247 | 0 | if (sg.isNucleotide()) |
248 | { | |
249 | 0 | conservationColour.setEnabled(false); |
250 | 0 | clustalColour.setEnabled(false); |
251 | 0 | BLOSUM62Colour.setEnabled(false); |
252 | 0 | zappoColour.setEnabled(false); |
253 | 0 | taylorColour.setEnabled(false); |
254 | 0 | hydrophobicityColour.setEnabled(false); |
255 | 0 | helixColour.setEnabled(false); |
256 | 0 | strandColour.setEnabled(false); |
257 | 0 | turnColour.setEnabled(false); |
258 | 0 | buriedColour.setEnabled(false); |
259 | } | |
260 | else | |
261 | { | |
262 | 0 | purinePyrimidineColour.setEnabled(false); |
263 | 0 | nucleotideColour.setEnabled(false); |
264 | } | |
265 | 0 | editGroupName.setLabel( |
266 | MessageManager.formatMessage("label.name_param", new Object[] | |
267 | { sg.getName() })); | |
268 | 0 | showText.setState(sg.getDisplayText()); |
269 | 0 | showColourText.setState(sg.getColourText()); |
270 | 0 | showBoxes.setState(sg.getDisplayBoxes()); |
271 | 0 | displayNonconserved.setState(sg.getShowNonconserved()); |
272 | 0 | if (!ap.av.getAlignment().getGroups().contains(sg)) |
273 | { | |
274 | 0 | menu1.setLabel(MessageManager.getString("action.edit_new_group")); |
275 | 0 | groupMenu.remove(unGroupMenuItem); |
276 | } | |
277 | else | |
278 | { | |
279 | 0 | menu1.setLabel(MessageManager.getString("action.edit_group")); |
280 | 0 | groupMenu.remove(createGroupMenuItem); |
281 | 0 | if (sg.cs != null) |
282 | { | |
283 | 0 | abovePIDColour.setState(sg.cs.getThreshold() > 0); |
284 | 0 | conservationColour.setState(sg.cs.conservationApplied()); |
285 | 0 | modifyPID.setEnabled(abovePIDColour.getState()); |
286 | 0 | modifyConservation.setEnabled(conservationColour.getState()); |
287 | } | |
288 | } | |
289 | 0 | setSelectedColour(sg.cs); |
290 | } | |
291 | else | |
292 | { | |
293 | 0 | remove(hideSeqs); |
294 | 0 | remove(groupMenu); |
295 | } | |
296 | ||
297 | 0 | if (links != null && links.size() > 0) |
298 | { | |
299 | 0 | addFeatureLinks(seq, links); |
300 | } | |
301 | ||
302 | // TODO: add group link menu entry here | |
303 | 0 | if (seq != null) |
304 | { | |
305 | 0 | seqMenu.setLabel(seq.getName()); |
306 | 0 | if (seq == ap.av.getAlignment().getSeqrep()) |
307 | { | |
308 | 0 | makeReferenceSeq.setLabel( |
309 | MessageManager.getString("action.unmark_as_reference"));// Unmark | |
310 | // representative"); | |
311 | } | |
312 | else | |
313 | { | |
314 | 0 | makeReferenceSeq.setLabel( |
315 | MessageManager.getString("action.set_as_reference")); // ); | |
316 | } | |
317 | 0 | repGroup.setLabel(MessageManager |
318 | .formatMessage("label.represent_group_with", new Object[] | |
319 | { seq.getName() })); | |
320 | } | |
321 | else | |
322 | { | |
323 | 0 | remove(seqMenu); |
324 | } | |
325 | ||
326 | 0 | if (!ap.av.hasHiddenRows()) |
327 | { | |
328 | 0 | remove(revealAll); |
329 | 0 | remove(revealSeq); |
330 | } | |
331 | else | |
332 | { | |
333 | 0 | final int index = ap.av.getAlignment().findIndex(seq); |
334 | ||
335 | 0 | if (ap.av.adjustForHiddenSeqs(index) |
336 | - ap.av.adjustForHiddenSeqs(index - 1) > 1) | |
337 | { | |
338 | 0 | revealSeq_index = index; |
339 | } | |
340 | else | |
341 | { | |
342 | 0 | remove(revealSeq); |
343 | } | |
344 | } | |
345 | } | |
346 | ||
347 | /** | |
348 | * Select the menu item (if any) matching the current colour scheme. This | |
349 | * works by matching the menu item name (not display text) to the canonical | |
350 | * name of the colour scheme. | |
351 | * | |
352 | * @param cs | |
353 | */ | |
354 | 0 | protected void setSelectedColour(ResidueShaderI cs) |
355 | { | |
356 | 0 | if (cs == null || cs.getColourScheme() == null) |
357 | { | |
358 | 0 | noColour.setState(true); |
359 | } | |
360 | else | |
361 | { | |
362 | 0 | String name = cs.getColourScheme().getSchemeName(); |
363 | 0 | for (int i = 0; i < colourMenu.getItemCount(); i++) |
364 | { | |
365 | 0 | MenuItem item = colourMenu.getItem(i); |
366 | 0 | if (item instanceof CheckboxMenuItem) |
367 | { | |
368 | 0 | if (name.equals(item.getName())) |
369 | { | |
370 | 0 | ((CheckboxMenuItem) item).setState(true); |
371 | } | |
372 | } | |
373 | } | |
374 | } | |
375 | } | |
376 | ||
377 | /** | |
378 | * Adds a 'Link' menu item with a sub-menu item for each hyperlink provided. | |
379 | * | |
380 | * @param seq | |
381 | * @param links | |
382 | */ | |
383 | 0 | void addFeatureLinks(final SequenceI seq, List<String> links) |
384 | { | |
385 | 0 | Menu linkMenu = new Menu(MessageManager.getString("action.link")); |
386 | 0 | Map<String, List<String>> linkset = new LinkedHashMap<>(); |
387 | ||
388 | 0 | for (String link : links) |
389 | { | |
390 | 0 | UrlLink urlLink = null; |
391 | 0 | try |
392 | { | |
393 | 0 | urlLink = new UrlLink(link); |
394 | } catch (Exception foo) | |
395 | { | |
396 | 0 | jalview.bin.Console.errPrintln("Exception for URLLink '" + link |
397 | + "': " + foo.getMessage()); | |
398 | 0 | continue; |
399 | } | |
400 | ||
401 | 0 | if (!urlLink.isValid()) |
402 | { | |
403 | 0 | jalview.bin.Console.errPrintln(urlLink.getInvalidMessage()); |
404 | 0 | continue; |
405 | } | |
406 | ||
407 | 0 | urlLink.createLinksFromSeq(seq, linkset); |
408 | } | |
409 | ||
410 | 0 | addshowLinks(linkMenu, linkset.values()); |
411 | ||
412 | // disable link menu if there are no valid entries | |
413 | 0 | if (linkMenu.getItemCount() > 0) |
414 | { | |
415 | 0 | linkMenu.setEnabled(true); |
416 | } | |
417 | else | |
418 | { | |
419 | 0 | linkMenu.setEnabled(false); |
420 | } | |
421 | ||
422 | 0 | if (seq != null) |
423 | { | |
424 | 0 | seqMenu.add(linkMenu); |
425 | } | |
426 | else | |
427 | { | |
428 | 0 | add(linkMenu); |
429 | } | |
430 | ||
431 | } | |
432 | ||
433 | 0 | private void addshowLinks(Menu linkMenu, Collection<List<String>> linkset) |
434 | { | |
435 | 0 | for (List<String> linkstrset : linkset) |
436 | { | |
437 | // split linkstr into label and url | |
438 | 0 | addshowLink(linkMenu, linkstrset.get(1), linkstrset.get(3)); |
439 | } | |
440 | } | |
441 | ||
442 | /** | |
443 | * Build menus for annotation types that may be shown or hidden, and for | |
444 | * 'reference annotations' that may be added to the alignment. | |
445 | */ | |
446 | 0 | private void buildAnnotationSubmenus() |
447 | { | |
448 | /* | |
449 | * First for the currently selected sequence (if there is one): | |
450 | */ | |
451 | 0 | final List<SequenceI> selectedSequence = (seq == null |
452 | ? Collections.<SequenceI> emptyList() | |
453 | : Arrays.asList(seq)); | |
454 | 0 | buildAnnotationTypesMenus(seqShowAnnotationsMenu, |
455 | seqHideAnnotationsMenu, selectedSequence); | |
456 | 0 | configureReferenceAnnotationsMenu(seqAddReferenceAnnotations, |
457 | selectedSequence); | |
458 | ||
459 | /* | |
460 | * and repeat for the current selection group (if there is one): | |
461 | */ | |
462 | 0 | final List<SequenceI> selectedGroup = (ap.av.getSelectionGroup() == null |
463 | ? Collections.<SequenceI> emptyList() | |
464 | : ap.av.getSelectionGroup().getSequences()); | |
465 | 0 | buildAnnotationTypesMenus(groupShowAnnotationsMenu, |
466 | groupHideAnnotationsMenu, selectedGroup); | |
467 | 0 | configureReferenceAnnotationsMenu(groupAddReferenceAnnotations, |
468 | selectedGroup); | |
469 | } | |
470 | ||
471 | /** | |
472 | * Determine whether or not to enable 'add reference annotations' menu item. | |
473 | * It is enable if there are any annotations, on any of the selected | |
474 | * sequences, which are not yet on the alignment (visible or not). | |
475 | * | |
476 | * @param menu | |
477 | * @param forSequences | |
478 | */ | |
479 | 0 | private void configureReferenceAnnotationsMenu(MenuItem menuItem, |
480 | List<SequenceI> forSequences) | |
481 | { | |
482 | 0 | menuItem.setEnabled(false); |
483 | ||
484 | /* | |
485 | * Temporary store to hold distinct calcId / type pairs for the tooltip. | |
486 | * Using TreeMap means calcIds are shown in alphabetical order. | |
487 | */ | |
488 | 0 | SortedMap<String, String> tipEntries = new TreeMap<>(); |
489 | 0 | final Map<SequenceI, List<AlignmentAnnotation>> candidates = new LinkedHashMap<>(); |
490 | 0 | AlignmentI al = this.ap.av.getAlignment(); |
491 | 0 | AlignmentUtils.findAddableReferenceAnnotations(forSequences, tipEntries, |
492 | candidates, al); | |
493 | 0 | if (!candidates.isEmpty()) |
494 | { | |
495 | 0 | StringBuilder tooltip = new StringBuilder(64); |
496 | 0 | tooltip.append(MessageManager.getString("label.add_annotations_for")); |
497 | ||
498 | /* | |
499 | * Found annotations that could be added. Enable the menu item, and | |
500 | * configure its action. | |
501 | */ | |
502 | 0 | menuItem.setEnabled(true); |
503 | ||
504 | 0 | menuItem.addActionListener(new ActionListener() |
505 | { | |
506 | 0 | @Override |
507 | public void actionPerformed(ActionEvent e) | |
508 | { | |
509 | 0 | addReferenceAnnotations_actionPerformed(candidates); |
510 | } | |
511 | }); | |
512 | } | |
513 | } | |
514 | ||
515 | /** | |
516 | * Add annotations to the sequences and to the alignment. | |
517 | * | |
518 | * @param candidates | |
519 | * a map whose keys are sequences on the alignment, and values a list | |
520 | * of annotations to add to each sequence | |
521 | */ | |
522 | 0 | protected void addReferenceAnnotations_actionPerformed( |
523 | Map<SequenceI, List<AlignmentAnnotation>> candidates) | |
524 | { | |
525 | 0 | final SequenceGroup selectionGroup = this.ap.av.getSelectionGroup(); |
526 | 0 | final AlignmentI alignment = this.ap.getAlignment(); |
527 | 0 | AlignmentUtils.addReferenceAnnotations(candidates, alignment, |
528 | selectionGroup); | |
529 | 0 | refresh(); |
530 | } | |
531 | ||
532 | /** | |
533 | * add a show URL menu item to the given linkMenu | |
534 | * | |
535 | * @param linkMenu | |
536 | * @param target | |
537 | * - menu label string | |
538 | * @param url | |
539 | * - url to open | |
540 | */ | |
541 | 0 | private void addshowLink(Menu linkMenu, final String target, |
542 | final String url) | |
543 | { | |
544 | 0 | addshowLink(linkMenu, target, target, url); |
545 | } | |
546 | ||
547 | /** | |
548 | * add a show URL menu item to the given linkMenu | |
549 | * | |
550 | * @param linkMenu | |
551 | * @param target | |
552 | * - URL target window | |
553 | * @param label | |
554 | * - menu label string | |
555 | * @param url | |
556 | * - url to open | |
557 | */ | |
558 | 0 | private void addshowLink(Menu linkMenu, final String target, |
559 | final String label, final String url) | |
560 | { | |
561 | 0 | MenuItem item = new MenuItem(label); |
562 | 0 | item.addActionListener(new java.awt.event.ActionListener() |
563 | { | |
564 | 0 | @Override |
565 | public void actionPerformed(ActionEvent e) | |
566 | { | |
567 | 0 | ap.alignFrame.showURL(url, target); |
568 | } | |
569 | }); | |
570 | 0 | linkMenu.add(item); |
571 | } | |
572 | ||
573 | /** | |
574 | * Actions on selecting / unselecting a checkbox menu item | |
575 | */ | |
576 | 0 | @Override |
577 | public void itemStateChanged(ItemEvent evt) | |
578 | { | |
579 | 0 | Object source = evt.getSource(); |
580 | 0 | if (source == noColour) |
581 | { | |
582 | 0 | noColourmenuItem_actionPerformed(); |
583 | } | |
584 | 0 | else if (source == clustalColour) |
585 | { | |
586 | 0 | clustalColour_actionPerformed(); |
587 | } | |
588 | 0 | else if (source == BLOSUM62Colour) |
589 | { | |
590 | 0 | BLOSUM62Colour_actionPerformed(); |
591 | } | |
592 | 0 | else if (evt.getSource() == PIDColour) |
593 | { | |
594 | 0 | PIDColour_actionPerformed(); |
595 | } | |
596 | 0 | else if (source == zappoColour) |
597 | { | |
598 | 0 | zappoColour_actionPerformed(); |
599 | } | |
600 | 0 | else if (source == taylorColour) |
601 | { | |
602 | 0 | taylorColour_actionPerformed(); |
603 | } | |
604 | 0 | else if (source == hydrophobicityColour) |
605 | { | |
606 | 0 | hydrophobicityColour_actionPerformed(); |
607 | } | |
608 | 0 | else if (source == helixColour) |
609 | { | |
610 | 0 | helixColour_actionPerformed(); |
611 | } | |
612 | 0 | else if (source == strandColour) |
613 | { | |
614 | 0 | strandColour_actionPerformed(); |
615 | } | |
616 | 0 | else if (source == turnColour) |
617 | { | |
618 | 0 | turnColour_actionPerformed(); |
619 | } | |
620 | 0 | else if (source == buriedColour) |
621 | { | |
622 | 0 | buriedColour_actionPerformed(); |
623 | } | |
624 | 0 | else if (source == nucleotideColour) |
625 | { | |
626 | 0 | nucleotideMenuItem_actionPerformed(); |
627 | } | |
628 | 0 | else if (source == purinePyrimidineColour) |
629 | { | |
630 | 0 | purinePyrimidineColour_actionPerformed(); |
631 | } | |
632 | 0 | else if (source == abovePIDColour) |
633 | { | |
634 | 0 | abovePIDColour_itemStateChanged(); |
635 | } | |
636 | 0 | else if (source == conservationColour) |
637 | { | |
638 | 0 | conservationMenuItem_itemStateChanged(); |
639 | } | |
640 | 0 | else if (source == showColourText) |
641 | { | |
642 | 0 | showColourText_itemStateChanged(); |
643 | } | |
644 | 0 | else if (source == showText) |
645 | { | |
646 | 0 | showText_itemStateChanged(); |
647 | } | |
648 | 0 | else if (source == showBoxes) |
649 | { | |
650 | 0 | showBoxes_itemStateChanged(); |
651 | } | |
652 | 0 | else if (source == displayNonconserved) |
653 | { | |
654 | 0 | this.showNonconserved_itemStateChanged(); |
655 | } | |
656 | } | |
657 | ||
658 | /** | |
659 | * Actions on clicking a menu item | |
660 | */ | |
661 | 0 | @Override |
662 | public void actionPerformed(ActionEvent evt) | |
663 | { | |
664 | 0 | Object source = evt.getSource(); |
665 | 0 | if (source == userDefinedColour) |
666 | { | |
667 | 0 | userDefinedColour_actionPerformed(); |
668 | } | |
669 | 0 | else if (source == modifyConservation) |
670 | { | |
671 | 0 | conservationMenuItem_itemStateChanged(); |
672 | } | |
673 | 0 | else if (source == modifyPID) |
674 | { | |
675 | 0 | abovePIDColour_itemStateChanged(); |
676 | } | |
677 | 0 | else if (source == unGroupMenuItem) |
678 | { | |
679 | 0 | unGroupMenuItem_actionPerformed(); |
680 | } | |
681 | ||
682 | 0 | else if (source == createGroupMenuItem) |
683 | { | |
684 | 0 | createGroupMenuItem_actionPerformed(); |
685 | } | |
686 | ||
687 | 0 | else if (source == sequenceName) |
688 | { | |
689 | 0 | editName(); |
690 | } | |
691 | 0 | else if (source == makeReferenceSeq) |
692 | { | |
693 | 0 | makeReferenceSeq_actionPerformed(); |
694 | } | |
695 | 0 | else if (source == sequenceDetails) |
696 | { | |
697 | 0 | showSequenceDetails(); |
698 | } | |
699 | 0 | else if (source == selSeqDetails) |
700 | { | |
701 | 0 | showSequenceSelectionDetails(); |
702 | } | |
703 | 0 | else if (source == pdb) |
704 | { | |
705 | 0 | addPDB(); |
706 | } | |
707 | 0 | else if (source == hideSeqs) |
708 | { | |
709 | 0 | hideSequences(false); |
710 | } | |
711 | 0 | else if (source == repGroup) |
712 | { | |
713 | 0 | hideSequences(true); |
714 | } | |
715 | 0 | else if (source == revealSeq) |
716 | { | |
717 | 0 | ap.av.showSequence(revealSeq_index); |
718 | } | |
719 | 0 | else if (source == revealAll) |
720 | { | |
721 | 0 | ap.av.showAllHiddenSeqs(); |
722 | } | |
723 | ||
724 | 0 | else if (source == editGroupName) |
725 | { | |
726 | 0 | EditNameDialog dialog = new EditNameDialog(getGroup().getName(), |
727 | getGroup().getDescription(), " Group Name", | |
728 | "Group Description", ap.alignFrame, | |
729 | "Edit Group Name / Description", 500, 100, true); | |
730 | ||
731 | 0 | if (dialog.accept) |
732 | { | |
733 | 0 | getGroup().setName(dialog.getName().replace(' ', '_')); |
734 | 0 | getGroup().setDescription(dialog.getDescription()); |
735 | } | |
736 | ||
737 | } | |
738 | 0 | else if (source == copy) |
739 | { | |
740 | 0 | ap.alignFrame.copy_actionPerformed(); |
741 | } | |
742 | 0 | else if (source == cut) |
743 | { | |
744 | 0 | ap.alignFrame.cut_actionPerformed(); |
745 | } | |
746 | 0 | else if (source == editSequence) |
747 | { | |
748 | 0 | SequenceGroup sg = ap.av.getSelectionGroup(); |
749 | ||
750 | 0 | if (sg != null) |
751 | { | |
752 | 0 | if (seq == null) |
753 | { | |
754 | 0 | seq = sg.getSequenceAt(0); |
755 | } | |
756 | ||
757 | 0 | EditNameDialog dialog = new EditNameDialog( |
758 | seq.getSequenceAsString(sg.getStartRes(), | |
759 | sg.getEndRes() + 1), | |
760 | null, "Edit Sequence ", null, | |
761 | ||
762 | ap.alignFrame, "Edit Sequence", 500, 100, true); | |
763 | ||
764 | 0 | if (dialog.accept) |
765 | { | |
766 | 0 | EditCommand editCommand = new EditCommand( |
767 | MessageManager.getString("label.edit_sequences"), | |
768 | Action.REPLACE, | |
769 | dialog.getName().replace(' ', ap.av.getGapCharacter()), | |
770 | sg.getSequencesAsArray(ap.av.getHiddenRepSequences()), | |
771 | sg.getStartRes(), sg.getEndRes() + 1, | |
772 | ap.av.getAlignment()); | |
773 | ||
774 | 0 | ap.alignFrame.addHistoryItem(editCommand); |
775 | ||
776 | 0 | ap.av.firePropertyChange("alignment", null, |
777 | ap.av.getAlignment().getSequences()); | |
778 | } | |
779 | } | |
780 | } | |
781 | 0 | else if (source == toUpper || source == toLower || source == toggleCase) |
782 | { | |
783 | 0 | SequenceGroup sg = ap.av.getSelectionGroup(); |
784 | 0 | if (sg != null) |
785 | { | |
786 | 0 | List<int[]> startEnd = ap.av.getVisibleRegionBoundaries( |
787 | sg.getStartRes(), sg.getEndRes() + 1); | |
788 | ||
789 | 0 | String description; |
790 | 0 | int caseChange; |
791 | ||
792 | 0 | if (source == toggleCase) |
793 | { | |
794 | 0 | description = "Toggle Case"; |
795 | 0 | caseChange = ChangeCaseCommand.TOGGLE_CASE; |
796 | } | |
797 | 0 | else if (source == toUpper) |
798 | { | |
799 | 0 | description = "To Upper Case"; |
800 | 0 | caseChange = ChangeCaseCommand.TO_UPPER; |
801 | } | |
802 | else | |
803 | { | |
804 | 0 | description = "To Lower Case"; |
805 | 0 | caseChange = ChangeCaseCommand.TO_LOWER; |
806 | } | |
807 | ||
808 | 0 | ChangeCaseCommand caseCommand = new ChangeCaseCommand(description, |
809 | sg.getSequencesAsArray(ap.av.getHiddenRepSequences()), | |
810 | startEnd, caseChange); | |
811 | ||
812 | 0 | ap.alignFrame.addHistoryItem(caseCommand); |
813 | ||
814 | 0 | ap.av.firePropertyChange("alignment", null, |
815 | ap.av.getAlignment().getSequences()); | |
816 | ||
817 | } | |
818 | } | |
819 | 0 | else if (source == sequenceFeature) |
820 | { | |
821 | 0 | SequenceGroup sg = ap.av.getSelectionGroup(); |
822 | 0 | if (sg == null) |
823 | { | |
824 | 0 | return; |
825 | } | |
826 | ||
827 | 0 | int gSize = sg.getSize(); |
828 | 0 | List<SequenceI> seqs = new ArrayList<>(); |
829 | 0 | List<SequenceFeature> features = new ArrayList<>(); |
830 | ||
831 | 0 | for (int i = 0; i < gSize; i++) |
832 | { | |
833 | 0 | int start = sg.getSequenceAt(i).findPosition(sg.getStartRes()); |
834 | 0 | int end = sg.findEndRes(sg.getSequenceAt(i)); |
835 | 0 | if (start <= end) |
836 | { | |
837 | 0 | seqs.add(sg.getSequenceAt(i)); |
838 | 0 | features.add( |
839 | new SequenceFeature(null, null, start, end, "Jalview")); | |
840 | } | |
841 | } | |
842 | ||
843 | 0 | if (!seqs.isEmpty()) |
844 | { | |
845 | 0 | if (ap.seqPanel.seqCanvas.getFeatureRenderer().amendFeatures(seqs, |
846 | features, true, ap)) | |
847 | { | |
848 | 0 | ap.alignFrame.sequenceFeatures.setState(true); |
849 | 0 | ap.av.setShowSequenceFeatures(true); |
850 | 0 | ap.av.setSearchResults(null); // clear highlighting |
851 | 0 | ap.repaint(); // draw new/amended features |
852 | } | |
853 | } | |
854 | } | |
855 | else | |
856 | { | |
857 | 0 | outputText(evt); |
858 | } | |
859 | ||
860 | } | |
861 | ||
862 | 0 | void outputText(ActionEvent e) |
863 | { | |
864 | 0 | CutAndPasteTransfer cap = new CutAndPasteTransfer(true, ap.alignFrame); |
865 | ||
866 | 0 | Frame frame = new Frame(); |
867 | 0 | frame.add(cap); |
868 | 0 | JalviewLite.addFrame(frame, MessageManager |
869 | .formatMessage("label.selection_output_command", new Object[] | |
870 | { e.getActionCommand() }), 600, 500); | |
871 | // JBPNote: getSelectionAsNewSequence behaviour has changed - this method | |
872 | // now returns a full copy of sequence data | |
873 | // TODO consider using getSequenceSelection instead here | |
874 | ||
875 | 0 | FileFormatI fileFormat = FileFormats.getInstance() |
876 | .forName(e.getActionCommand()); | |
877 | 0 | cap.setText(new AppletFormatAdapter().formatSequences(fileFormat, |
878 | ap.av.getShowJVSuffix(), ap, true)); | |
879 | ||
880 | } | |
881 | ||
882 | 0 | protected void showSequenceSelectionDetails() |
883 | { | |
884 | 0 | createSequenceDetailsReport(ap.av.getSequenceSelection()); |
885 | } | |
886 | ||
887 | 0 | protected void showSequenceDetails() |
888 | { | |
889 | 0 | createSequenceDetailsReport(new SequenceI[] { seq }); |
890 | } | |
891 | ||
892 | 0 | public void createSequenceDetailsReport(SequenceI[] sequences) |
893 | { | |
894 | ||
895 | 0 | CutAndPasteTransfer cap = new CutAndPasteTransfer(false, ap.alignFrame); |
896 | ||
897 | 0 | StringBuilder contents = new StringBuilder(128); |
898 | 0 | for (SequenceI seq : sequences) |
899 | { | |
900 | 0 | contents.append(MessageManager |
901 | .formatMessage("label.annotation_for_displayid", new Object[] | |
902 | { seq.getDisplayId(true) })); | |
903 | 0 | new SequenceAnnotationReport(false).createSequenceAnnotationReport( |
904 | contents, seq, true, true, ap.seqPanel.seqCanvas.fr); | |
905 | 0 | contents.append("</p>"); |
906 | } | |
907 | 0 | Frame frame = new Frame(); |
908 | 0 | frame.add(cap); |
909 | 0 | jalview.bin.JalviewLite.addFrame(frame, |
910 | 0 | "Sequence Details for " + (sequences.length == 1 |
911 | ? sequences[0].getDisplayId(true) | |
912 | : "Selection"), | |
913 | 600, 500); | |
914 | 0 | cap.setText( |
915 | MessageManager.formatMessage("label.html_content", new Object[] | |
916 | { contents.toString() })); | |
917 | } | |
918 | ||
919 | 0 | void editName() |
920 | { | |
921 | 0 | EditNameDialog dialog = new EditNameDialog(seq.getName(), |
922 | seq.getDescription(), " Sequence Name", | |
923 | "Sequence Description", ap.alignFrame, | |
924 | "Edit Sequence Name / Description", 500, 100, true); | |
925 | ||
926 | 0 | if (dialog.accept) |
927 | { | |
928 | 0 | seq.setName(dialog.getName()); |
929 | 0 | seq.setDescription(dialog.getDescription()); |
930 | 0 | ap.paintAlignment(false, false); |
931 | } | |
932 | } | |
933 | ||
934 | 0 | void addPDB() |
935 | { | |
936 | 0 | Vector<PDBEntry> pdbs = seq.getAllPDBEntries(); |
937 | 0 | if (pdbs != null && !pdbs.isEmpty()) |
938 | { | |
939 | 0 | PDBEntry entry = pdbs.firstElement(); |
940 | ||
941 | 0 | if (ap.av.applet.jmolAvailable) |
942 | { | |
943 | 0 | new AppletJmol(entry, new SequenceI[] { seq }, null, ap, |
944 | DataSourceType.URL); | |
945 | } | |
946 | else | |
947 | { | |
948 | 0 | new mc_view.AppletPDBViewer(entry, new SequenceI[] { seq }, null, |
949 | ap, DataSourceType.URL); | |
950 | } | |
951 | ||
952 | } | |
953 | else | |
954 | { | |
955 | 0 | CutAndPasteTransfer cap = new CutAndPasteTransfer(true, |
956 | ap.alignFrame); | |
957 | 0 | cap.setText(MessageManager.getString("label.paste_pdb_file")); |
958 | 0 | cap.setPDBImport(seq); |
959 | 0 | Frame frame = new Frame(); |
960 | 0 | frame.add(cap); |
961 | 0 | JalviewLite.addFrame(frame, MessageManager.formatMessage( |
962 | "label.paste_pdb_file_for_sequence", new Object[] | |
963 | { seq.getName() }), 400, 300); | |
964 | } | |
965 | } | |
966 | ||
967 | 0 | private void jbInit() throws Exception |
968 | { | |
969 | 0 | groupMenu.setLabel(MessageManager.getString("label.selection")); |
970 | 0 | sequenceFeature.addActionListener(this); |
971 | ||
972 | 0 | editGroupName.addActionListener(this); |
973 | 0 | unGroupMenuItem |
974 | .setLabel(MessageManager.getString("action.remove_group")); | |
975 | 0 | unGroupMenuItem.addActionListener(this); |
976 | ||
977 | 0 | createGroupMenuItem |
978 | .setLabel(MessageManager.getString("action.create_group")); | |
979 | 0 | createGroupMenuItem.addActionListener(this); |
980 | ||
981 | 0 | modifyPID.setEnabled(abovePIDColour.getState()); |
982 | 0 | modifyConservation.setEnabled(conservationColour.getState()); |
983 | 0 | colourMenu.setLabel(MessageManager.getString("label.group_colour")); |
984 | 0 | showBoxes.setLabel(MessageManager.getString("action.boxes")); |
985 | 0 | showBoxes.setState(true); |
986 | 0 | showBoxes.addItemListener(this); |
987 | 0 | sequenceName.addActionListener(this); |
988 | 0 | sequenceDetails.addActionListener(this); |
989 | 0 | selSeqDetails.addActionListener(this); |
990 | 0 | displayNonconserved |
991 | .setLabel(MessageManager.getString("label.show_non_conserved")); | |
992 | 0 | displayNonconserved.setState(false); |
993 | 0 | displayNonconserved.addItemListener(this); |
994 | 0 | showText.setLabel(MessageManager.getString("action.text")); |
995 | 0 | showText.addItemListener(this); |
996 | 0 | showColourText.setLabel(MessageManager.getString("label.colour_text")); |
997 | 0 | showColourText.addItemListener(this); |
998 | 0 | outputmenu.setLabel(MessageManager.getString("label.out_to_textbox")); |
999 | 0 | seqMenu.setLabel(MessageManager.getString("label.sequence")); |
1000 | 0 | pdb.setLabel(MessageManager.getString("label.view_pdb_structure")); |
1001 | 0 | hideSeqs.setLabel(MessageManager.getString("action.hide_sequences")); |
1002 | 0 | repGroup.setLabel(MessageManager |
1003 | .formatMessage("label.represent_group_with", new Object[] | |
1004 | { "" })); | |
1005 | 0 | revealAll.setLabel(MessageManager.getString("action.reveal_all")); |
1006 | 0 | revealSeq.setLabel(MessageManager.getString("action.reveal_sequences")); |
1007 | 0 | menu1.setLabel(MessageManager.getString("label.group:")); |
1008 | 0 | add(groupMenu); |
1009 | 0 | this.add(seqMenu); |
1010 | 0 | this.add(hideSeqs); |
1011 | 0 | this.add(revealSeq); |
1012 | 0 | this.add(revealAll); |
1013 | // groupMenu.add(selSeqDetails); | |
1014 | 0 | groupMenu.add(groupShowAnnotationsMenu); |
1015 | 0 | groupMenu.add(groupHideAnnotationsMenu); |
1016 | 0 | groupMenu.add(groupAddReferenceAnnotations); |
1017 | 0 | groupMenu.add(editMenu); |
1018 | 0 | groupMenu.add(outputmenu); |
1019 | 0 | groupMenu.add(sequenceFeature); |
1020 | 0 | groupMenu.add(createGroupMenuItem); |
1021 | 0 | groupMenu.add(unGroupMenuItem); |
1022 | 0 | groupMenu.add(menu1); |
1023 | ||
1024 | 0 | colourMenu.add(noColour); |
1025 | 0 | colourMenu.add(clustalColour); |
1026 | 0 | colourMenu.add(BLOSUM62Colour); |
1027 | 0 | colourMenu.add(PIDColour); |
1028 | 0 | colourMenu.add(zappoColour); |
1029 | 0 | colourMenu.add(taylorColour); |
1030 | 0 | colourMenu.add(hydrophobicityColour); |
1031 | 0 | colourMenu.add(helixColour); |
1032 | 0 | colourMenu.add(strandColour); |
1033 | 0 | colourMenu.add(turnColour); |
1034 | 0 | colourMenu.add(buriedColour); |
1035 | 0 | colourMenu.add(nucleotideColour); |
1036 | 0 | colourMenu.add(purinePyrimidineColour); |
1037 | 0 | colourMenu.add(userDefinedColour); |
1038 | 0 | colourMenu.addSeparator(); |
1039 | 0 | colourMenu.add(conservationColour); |
1040 | 0 | colourMenu.add(modifyConservation); |
1041 | 0 | colourMenu.add(abovePIDColour); |
1042 | 0 | colourMenu.add(modifyPID); |
1043 | ||
1044 | 0 | noColour.setLabel(MessageManager.getString("label.none")); |
1045 | 0 | noColour.addItemListener(this); |
1046 | ||
1047 | /* | |
1048 | * setName allows setSelectedColour to do its thing | |
1049 | */ | |
1050 | 0 | clustalColour.setLabel( |
1051 | MessageManager.getString("label.colourScheme_clustal")); | |
1052 | 0 | clustalColour.setName(JalviewColourScheme.Clustal.toString()); |
1053 | 0 | clustalColour.addItemListener(this); |
1054 | 0 | BLOSUM62Colour.setLabel( |
1055 | MessageManager.getString("label.colourScheme_blosum62")); | |
1056 | 0 | BLOSUM62Colour.setName(JalviewColourScheme.Blosum62.toString()); |
1057 | 0 | BLOSUM62Colour.addItemListener(this); |
1058 | 0 | PIDColour.setLabel( |
1059 | MessageManager.getString("label.colourScheme_%identity")); | |
1060 | 0 | PIDColour.setName(JalviewColourScheme.PID.toString()); |
1061 | 0 | PIDColour.addItemListener(this); |
1062 | 0 | zappoColour |
1063 | .setLabel(MessageManager.getString("label.colourScheme_zappo")); | |
1064 | 0 | zappoColour.setName(JalviewColourScheme.Zappo.toString()); |
1065 | 0 | zappoColour.addItemListener(this); |
1066 | 0 | taylorColour.setLabel( |
1067 | MessageManager.getString("label.colourScheme_taylor")); | |
1068 | 0 | taylorColour.setName(JalviewColourScheme.Taylor.toString()); |
1069 | 0 | taylorColour.addItemListener(this); |
1070 | 0 | hydrophobicityColour.setLabel( |
1071 | MessageManager.getString("label.colourScheme_hydrophobic")); | |
1072 | 0 | hydrophobicityColour |
1073 | .setName(JalviewColourScheme.Hydrophobic.toString()); | |
1074 | 0 | hydrophobicityColour.addItemListener(this); |
1075 | 0 | helixColour.setLabel( |
1076 | MessageManager.getString("label.colourScheme_helixpropensity")); | |
1077 | 0 | helixColour.setName(JalviewColourScheme.Helix.toString()); |
1078 | 0 | helixColour.addItemListener(this); |
1079 | 0 | strandColour.setLabel(MessageManager |
1080 | .getString("label.colourScheme_strandpropensity")); | |
1081 | 0 | strandColour.setName(JalviewColourScheme.Strand.toString()); |
1082 | 0 | strandColour.addItemListener(this); |
1083 | 0 | turnColour.setLabel( |
1084 | MessageManager.getString("label.colourScheme_turnpropensity")); | |
1085 | 0 | turnColour.setName(JalviewColourScheme.Turn.toString()); |
1086 | 0 | turnColour.addItemListener(this); |
1087 | 0 | buriedColour.setLabel( |
1088 | MessageManager.getString("label.colourScheme_buriedindex")); | |
1089 | 0 | buriedColour.setName(JalviewColourScheme.Buried.toString()); |
1090 | 0 | buriedColour.addItemListener(this); |
1091 | 0 | nucleotideColour.setLabel( |
1092 | MessageManager.getString("label.colourScheme_nucleotide")); | |
1093 | 0 | nucleotideColour.setName(JalviewColourScheme.Nucleotide.toString()); |
1094 | 0 | nucleotideColour.addItemListener(this); |
1095 | 0 | purinePyrimidineColour.setLabel(MessageManager |
1096 | .getString("label.colourScheme_purine/pyrimidine")); | |
1097 | 0 | purinePyrimidineColour |
1098 | .setName(JalviewColourScheme.PurinePyrimidine.toString()); | |
1099 | 0 | purinePyrimidineColour.addItemListener(this); |
1100 | ||
1101 | 0 | userDefinedColour |
1102 | .setLabel(MessageManager.getString("action.user_defined")); | |
1103 | 0 | userDefinedColour.addActionListener(this); |
1104 | ||
1105 | 0 | abovePIDColour.setLabel( |
1106 | MessageManager.getString("label.above_identity_threshold")); | |
1107 | 0 | abovePIDColour.addItemListener(this); |
1108 | 0 | modifyPID.setLabel( |
1109 | MessageManager.getString("label.modify_identity_threshold")); | |
1110 | 0 | modifyPID.addActionListener(this); |
1111 | 0 | conservationColour |
1112 | .setLabel(MessageManager.getString("action.by_conservation")); | |
1113 | 0 | conservationColour.addItemListener(this); |
1114 | 0 | modifyConservation.setLabel(MessageManager |
1115 | .getString("label.modify_conservation_threshold")); | |
1116 | 0 | modifyConservation.addActionListener(this); |
1117 | ||
1118 | 0 | PIDColour.addActionListener(this); |
1119 | 0 | BLOSUM62Colour.addActionListener(this); |
1120 | ||
1121 | 0 | editMenu.add(copy); |
1122 | 0 | copy.addActionListener(this); |
1123 | 0 | editMenu.add(cut); |
1124 | 0 | cut.addActionListener(this); |
1125 | ||
1126 | 0 | editMenu.add(editSequence); |
1127 | 0 | editSequence.addActionListener(this); |
1128 | ||
1129 | 0 | editMenu.add(toUpper); |
1130 | 0 | toUpper.addActionListener(this); |
1131 | 0 | editMenu.add(toLower); |
1132 | 0 | toLower.addActionListener(this); |
1133 | 0 | editMenu.add(toggleCase); |
1134 | 0 | seqMenu.add(seqShowAnnotationsMenu); |
1135 | 0 | seqMenu.add(seqHideAnnotationsMenu); |
1136 | 0 | seqMenu.add(seqAddReferenceAnnotations); |
1137 | 0 | seqMenu.add(sequenceName); |
1138 | 0 | seqMenu.add(makeReferenceSeq); |
1139 | // seqMenu.add(sequenceDetails); | |
1140 | ||
1141 | 0 | if (!ap.av.applet.useXtrnalSviewer) |
1142 | { | |
1143 | 0 | seqMenu.add(pdb); |
1144 | } | |
1145 | 0 | seqMenu.add(repGroup); |
1146 | 0 | menu1.add(editGroupName); |
1147 | 0 | menu1.add(colourMenu); |
1148 | 0 | menu1.add(showBoxes); |
1149 | 0 | menu1.add(showText); |
1150 | 0 | menu1.add(showColourText); |
1151 | 0 | menu1.add(displayNonconserved); |
1152 | 0 | toggleCase.addActionListener(this); |
1153 | 0 | pdb.addActionListener(this); |
1154 | 0 | hideSeqs.addActionListener(this); |
1155 | 0 | repGroup.addActionListener(this); |
1156 | 0 | revealAll.addActionListener(this); |
1157 | 0 | revealSeq.addActionListener(this); |
1158 | 0 | makeReferenceSeq.addActionListener(this); |
1159 | } | |
1160 | ||
1161 | 0 | void refresh() |
1162 | { | |
1163 | 0 | ap.paintAlignment(true, true); |
1164 | } | |
1165 | ||
1166 | 0 | protected void clustalColour_actionPerformed() |
1167 | { | |
1168 | 0 | SequenceGroup sg = getGroup(); |
1169 | 0 | sg.cs = new ResidueShader( |
1170 | new ClustalxColourScheme(sg, ap.av.getHiddenRepSequences())); | |
1171 | 0 | refresh(); |
1172 | } | |
1173 | ||
1174 | 0 | protected void zappoColour_actionPerformed() |
1175 | { | |
1176 | 0 | getGroup().cs = new ResidueShader(new ZappoColourScheme()); |
1177 | 0 | refresh(); |
1178 | } | |
1179 | ||
1180 | 0 | protected void taylorColour_actionPerformed() |
1181 | { | |
1182 | 0 | getGroup().cs = new ResidueShader(new TaylorColourScheme()); |
1183 | 0 | refresh(); |
1184 | } | |
1185 | ||
1186 | 0 | protected void hydrophobicityColour_actionPerformed() |
1187 | { | |
1188 | 0 | getGroup().cs = new ResidueShader(new HydrophobicColourScheme()); |
1189 | 0 | refresh(); |
1190 | } | |
1191 | ||
1192 | 0 | protected void helixColour_actionPerformed() |
1193 | { | |
1194 | 0 | getGroup().cs = new ResidueShader(new HelixColourScheme()); |
1195 | 0 | refresh(); |
1196 | } | |
1197 | ||
1198 | 0 | protected void strandColour_actionPerformed() |
1199 | { | |
1200 | 0 | getGroup().cs = new ResidueShader(new StrandColourScheme()); |
1201 | 0 | refresh(); |
1202 | } | |
1203 | ||
1204 | 0 | protected void turnColour_actionPerformed() |
1205 | { | |
1206 | 0 | getGroup().cs = new ResidueShader(new TurnColourScheme()); |
1207 | 0 | refresh(); |
1208 | } | |
1209 | ||
1210 | 0 | protected void buriedColour_actionPerformed() |
1211 | { | |
1212 | 0 | getGroup().cs = new ResidueShader(new BuriedColourScheme()); |
1213 | 0 | refresh(); |
1214 | } | |
1215 | ||
1216 | 0 | public void nucleotideMenuItem_actionPerformed() |
1217 | { | |
1218 | 0 | getGroup().cs = new ResidueShader(new NucleotideColourScheme()); |
1219 | 0 | refresh(); |
1220 | } | |
1221 | ||
1222 | 0 | public void purinePyrimidineColour_actionPerformed() |
1223 | { | |
1224 | 0 | getGroup().cs = new ResidueShader(new PurinePyrimidineColourScheme()); |
1225 | 0 | refresh(); |
1226 | } | |
1227 | ||
1228 | 0 | protected void abovePIDColour_itemStateChanged() |
1229 | { | |
1230 | 0 | SequenceGroup sg = getGroup(); |
1231 | 0 | if (sg.cs == null) |
1232 | { | |
1233 | 0 | return; |
1234 | } | |
1235 | ||
1236 | 0 | if (abovePIDColour.getState()) |
1237 | { | |
1238 | 0 | sg.cs.setConsensus(AAFrequency.calculate( |
1239 | sg.getSequences(ap.av.getHiddenRepSequences()), 0, | |
1240 | ap.av.getAlignment().getWidth())); | |
1241 | 0 | int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs, |
1242 | getGroup().getName()); | |
1243 | ||
1244 | 0 | sg.cs.setThreshold(threshold, ap.av.isIgnoreGapsConsensus()); |
1245 | ||
1246 | 0 | SliderPanel.showPIDSlider(); |
1247 | ||
1248 | } | |
1249 | else | |
1250 | // remove PIDColouring | |
1251 | { | |
1252 | 0 | SliderPanel.hidePIDSlider(); |
1253 | 0 | sg.cs.setThreshold(0, ap.av.isIgnoreGapsConsensus()); |
1254 | } | |
1255 | 0 | modifyPID.setEnabled(abovePIDColour.getState()); |
1256 | 0 | refresh(); |
1257 | } | |
1258 | ||
1259 | 0 | protected void userDefinedColour_actionPerformed() |
1260 | { | |
1261 | 0 | new UserDefinedColours(ap, getGroup()); |
1262 | } | |
1263 | ||
1264 | 0 | protected void PIDColour_actionPerformed() |
1265 | { | |
1266 | 0 | SequenceGroup sg = getGroup(); |
1267 | 0 | sg.cs = new ResidueShader(new PIDColourScheme()); |
1268 | 0 | sg.cs.setConsensus(AAFrequency.calculate( |
1269 | sg.getSequences(ap.av.getHiddenRepSequences()), 0, | |
1270 | ap.av.getAlignment().getWidth())); | |
1271 | 0 | refresh(); |
1272 | } | |
1273 | ||
1274 | 0 | protected void BLOSUM62Colour_actionPerformed() |
1275 | { | |
1276 | 0 | SequenceGroup sg = getGroup(); |
1277 | ||
1278 | 0 | sg.cs = new ResidueShader(new Blosum62ColourScheme()); |
1279 | ||
1280 | 0 | sg.cs.setConsensus(AAFrequency.calculate( |
1281 | sg.getSequences(ap.av.getHiddenRepSequences()), 0, | |
1282 | ap.av.getAlignment().getWidth())); | |
1283 | ||
1284 | 0 | refresh(); |
1285 | } | |
1286 | ||
1287 | 0 | protected void noColourmenuItem_actionPerformed() |
1288 | { | |
1289 | 0 | getGroup().cs = null; |
1290 | 0 | refresh(); |
1291 | } | |
1292 | ||
1293 | 0 | protected void conservationMenuItem_itemStateChanged() |
1294 | { | |
1295 | 0 | SequenceGroup sg = getGroup(); |
1296 | 0 | if (sg.cs == null) |
1297 | { | |
1298 | 0 | return; |
1299 | } | |
1300 | ||
1301 | 0 | if (conservationColour.getState()) |
1302 | { | |
1303 | 0 | Conservation conservation = Conservation.calculateConservation( |
1304 | "Group", sg.getSequences(ap.av.getHiddenRepSequences()), 0, | |
1305 | ap.av.getAlignment().getWidth(), false, | |
1306 | ap.av.getConsPercGaps(), false); | |
1307 | 0 | sg.getGroupColourScheme().setConservation(conservation); |
1308 | 0 | SliderPanel.setConservationSlider(ap, sg.cs, sg.getName()); |
1309 | 0 | SliderPanel.showConservationSlider(); |
1310 | } | |
1311 | else | |
1312 | // remove ConservationColouring | |
1313 | { | |
1314 | 0 | SliderPanel.hideConservationSlider(); |
1315 | 0 | sg.cs.setConservation(null); |
1316 | } | |
1317 | 0 | modifyConservation.setEnabled(conservationColour.getState()); |
1318 | 0 | refresh(); |
1319 | } | |
1320 | ||
1321 | 0 | SequenceGroup getGroup() |
1322 | { | |
1323 | 0 | SequenceGroup sg = ap.av.getSelectionGroup(); |
1324 | ||
1325 | // this method won't add a new group if it already exists | |
1326 | 0 | if (sg != null) |
1327 | { | |
1328 | 0 | ap.av.getAlignment().addGroup(sg); |
1329 | } | |
1330 | ||
1331 | 0 | return sg; |
1332 | } | |
1333 | ||
1334 | 0 | void unGroupMenuItem_actionPerformed() |
1335 | { | |
1336 | 0 | SequenceGroup sg = ap.av.getSelectionGroup(); |
1337 | 0 | ap.av.getAlignment().deleteGroup(sg); |
1338 | 0 | ap.av.setSelectionGroup(null); |
1339 | 0 | ap.paintAlignment(true, true); |
1340 | } | |
1341 | ||
1342 | 0 | void createGroupMenuItem_actionPerformed() |
1343 | { | |
1344 | 0 | getGroup(); // implicitly create group |
1345 | 0 | refresh(); |
1346 | } | |
1347 | ||
1348 | 0 | public void showColourText_itemStateChanged() |
1349 | { | |
1350 | 0 | getGroup().setColourText(showColourText.getState()); |
1351 | 0 | refresh(); |
1352 | } | |
1353 | ||
1354 | 0 | public void showText_itemStateChanged() |
1355 | { | |
1356 | 0 | getGroup().setDisplayText(showText.getState()); |
1357 | 0 | refresh(); |
1358 | } | |
1359 | ||
1360 | 0 | public void makeReferenceSeq_actionPerformed() |
1361 | { | |
1362 | 0 | if (!ap.av.getAlignment().hasSeqrep()) |
1363 | { | |
1364 | // initialise the display flags so the user sees something happen | |
1365 | 0 | ap.av.setDisplayReferenceSeq(true); |
1366 | 0 | ap.av.setColourByReferenceSeq(true); |
1367 | 0 | ap.av.getAlignment().setSeqrep(seq); |
1368 | } | |
1369 | else | |
1370 | { | |
1371 | 0 | if (ap.av.getAlignment().getSeqrep() == seq) |
1372 | { | |
1373 | 0 | ap.av.getAlignment().setSeqrep(null); |
1374 | } | |
1375 | else | |
1376 | { | |
1377 | 0 | ap.av.getAlignment().setSeqrep(seq); |
1378 | } | |
1379 | } | |
1380 | 0 | refresh(); |
1381 | } | |
1382 | ||
1383 | 0 | public void showNonconserved_itemStateChanged() |
1384 | { | |
1385 | 0 | getGroup().setShowNonconserved(this.displayNonconserved.getState()); |
1386 | 0 | refresh(); |
1387 | } | |
1388 | ||
1389 | 0 | public void showBoxes_itemStateChanged() |
1390 | { | |
1391 | 0 | getGroup().setDisplayBoxes(showBoxes.getState()); |
1392 | 0 | refresh(); |
1393 | } | |
1394 | ||
1395 | 0 | void hideSequences(boolean representGroup) |
1396 | { | |
1397 | 0 | ap.av.hideSequences(seq, representGroup); |
1398 | } | |
1399 | ||
1400 | /** | |
1401 | * Add annotation types to 'Show annotations' and/or 'Hide annotations' menus. | |
1402 | * "All" is added first, followed by a separator. Then add any annotation | |
1403 | * types associated with the current selection. Separate menus are built for | |
1404 | * the selected sequence group (if any), and the selected sequence. | |
1405 | * <p> | |
1406 | * Some annotation rows are always rendered together - these can be identified | |
1407 | * by a common graphGroup property > -1. Only one of each group will be marked | |
1408 | * as visible (to avoid duplication of the display). For such groups we add a | |
1409 | * composite type name, e.g. | |
1410 | * <p> | |
1411 | * IUPredWS (Long), IUPredWS (Short) | |
1412 | * | |
1413 | * @param seq | |
1414 | */ | |
1415 | 0 | protected void buildAnnotationTypesMenus(Menu showMenu, Menu hideMenu, |
1416 | List<SequenceI> forSequences) | |
1417 | { | |
1418 | 0 | showMenu.removeAll(); |
1419 | 0 | hideMenu.removeAll(); |
1420 | ||
1421 | 0 | final List<String> all = Arrays |
1422 | .asList(new String[] | |
1423 | { MessageManager.getString("label.all") }); | |
1424 | 0 | addAnnotationTypeToShowHide(showMenu, forSequences, "", all, true, |
1425 | true); | |
1426 | 0 | addAnnotationTypeToShowHide(hideMenu, forSequences, "", all, true, |
1427 | false); | |
1428 | 0 | showMenu.addSeparator(); |
1429 | 0 | hideMenu.addSeparator(); |
1430 | ||
1431 | 0 | final AlignmentAnnotation[] annotations = ap.getAlignment() |
1432 | .getAlignmentAnnotation(); | |
1433 | ||
1434 | /* | |
1435 | * Find shown/hidden annotations types, distinguished by source (calcId), | |
1436 | * and grouped by graphGroup. Using LinkedHashMap means we will retrieve in | |
1437 | * the insertion order, which is the order of the annotations on the | |
1438 | * alignment. | |
1439 | */ | |
1440 | 0 | Map<String, List<List<String>>> shownTypes = new LinkedHashMap<>(); |
1441 | 0 | Map<String, List<List<String>>> hiddenTypes = new LinkedHashMap<>(); |
1442 | 0 | AlignmentAnnotationUtils.getShownHiddenTypes(shownTypes, hiddenTypes, |
1443 | AlignmentAnnotationUtils.asList(annotations), forSequences); | |
1444 | ||
1445 | 0 | for (String calcId : hiddenTypes.keySet()) |
1446 | { | |
1447 | 0 | for (List<String> type : hiddenTypes.get(calcId)) |
1448 | { | |
1449 | 0 | addAnnotationTypeToShowHide(showMenu, forSequences, calcId, type, |
1450 | false, true); | |
1451 | } | |
1452 | } | |
1453 | // grey out 'show annotations' if none are hidden | |
1454 | 0 | showMenu.setEnabled(!hiddenTypes.isEmpty()); |
1455 | ||
1456 | 0 | for (String calcId : shownTypes.keySet()) |
1457 | { | |
1458 | 0 | for (List<String> type : shownTypes.get(calcId)) |
1459 | { | |
1460 | 0 | addAnnotationTypeToShowHide(hideMenu, forSequences, calcId, type, |
1461 | false, false); | |
1462 | } | |
1463 | } | |
1464 | // grey out 'hide annotations' if none are shown | |
1465 | 0 | hideMenu.setEnabled(!shownTypes.isEmpty()); |
1466 | } | |
1467 | ||
1468 | /** | |
1469 | * Add one annotation type to the 'Show Annotations' or 'Hide Annotations' | |
1470 | * menus. | |
1471 | * | |
1472 | * @param showOrHideMenu | |
1473 | * the menu to add to | |
1474 | * @param forSequences | |
1475 | * the sequences whose annotations may be shown or hidden | |
1476 | * @param calcId | |
1477 | * @param types | |
1478 | * the label to add | |
1479 | * @param allTypes | |
1480 | * if true this is a special label meaning 'All' | |
1481 | * @param actionIsShow | |
1482 | * if true, the select menu item action is to show the annotation | |
1483 | * type, else hide | |
1484 | */ | |
1485 | 0 | protected void addAnnotationTypeToShowHide(Menu showOrHideMenu, |
1486 | final List<SequenceI> forSequences, String calcId, | |
1487 | final List<String> types, final boolean allTypes, | |
1488 | final boolean actionIsShow) | |
1489 | { | |
1490 | 0 | String label = types.toString(); // [a, b, c] |
1491 | 0 | label = label.substring(1, label.length() - 1); |
1492 | 0 | final MenuItem item = new MenuItem(label); |
1493 | 0 | item.addActionListener(new java.awt.event.ActionListener() |
1494 | { | |
1495 | 0 | @Override |
1496 | public void actionPerformed(ActionEvent e) | |
1497 | { | |
1498 | 0 | AlignmentUtils.showOrHideSequenceAnnotations(ap.getAlignment(), |
1499 | types, forSequences, allTypes, actionIsShow); | |
1500 | 0 | refresh(); |
1501 | } | |
1502 | }); | |
1503 | 0 | showOrHideMenu.add(item); |
1504 | } | |
1505 | ||
1506 | } |