Wrap alignment with annotations
[jalview.git] / src / jalview / gui / AlignViewport.java
1  /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.gui;\r
20 \r
21 import jalview.analysis.*;\r
22 \r
23 import jalview.bin.*;\r
24 \r
25 import jalview.datamodel.*;\r
26 \r
27 import jalview.schemes.*;\r
28 \r
29 import java.awt.*;\r
30 \r
31 import java.util.*;\r
32 \r
33 \r
34 /**\r
35  * DOCUMENT ME!\r
36  *\r
37  * @author $author$\r
38  * @version $Revision$\r
39  */\r
40 public class AlignViewport\r
41 {\r
42     int startRes;\r
43     int endRes;\r
44     int startSeq;\r
45     int endSeq;\r
46     boolean showFullId = false;\r
47     boolean showText = true;\r
48     boolean showColourText = false;\r
49     boolean showBoxes = true;\r
50     boolean wrapAlignment = false;\r
51     boolean renderGaps = true;\r
52     boolean showSequenceFeatures = false;\r
53     boolean showAnnotation = true;\r
54     boolean showConservation = true;\r
55     boolean showQuality = true;\r
56     boolean showIdentity = true;\r
57     boolean colourAppliesToAllGroups = true;\r
58     ColourSchemeI globalColourScheme = null;\r
59     boolean conservationColourSelected = false;\r
60     boolean abovePIDThreshold = false;\r
61     SequenceGroup selectionGroup;\r
62     int charHeight;\r
63     int charWidth;\r
64     int wrappedWidth;\r
65     Font font = new Font("SansSerif", Font.PLAIN, 10);\r
66     AlignmentI alignment;\r
67     ColumnSelection colSel = new ColumnSelection();\r
68     int threshold;\r
69     int increment;\r
70     NJTree currentTree = null;\r
71     boolean scaleAboveWrapped = false;\r
72     boolean scaleLeftWrapped = true;\r
73     boolean scaleRightWrapped = true;\r
74 \r
75     /** DOCUMENT ME!! */\r
76     public Vector vconsensus;\r
77     AlignmentAnnotation consensus;\r
78     AlignmentAnnotation conservation;\r
79     AlignmentAnnotation quality;\r
80 \r
81     /** DOCUMENT ME!! */\r
82     public int ConsPercGaps = 25; // JBPNote : This should be a scalable property!\r
83 \r
84     // JBPNote Prolly only need this in the applet version.\r
85     private java.beans.PropertyChangeSupport changeSupport = new java.beans.PropertyChangeSupport(this);\r
86 \r
87     boolean ignoreGapsInConsensusCalculation = false;\r
88 \r
89     /**\r
90      * Creates a new AlignViewport object.\r
91      *\r
92      * @param al DOCUMENT ME!\r
93      */\r
94     public AlignViewport(AlignmentI al)\r
95     {\r
96         setAlignment(al);\r
97         this.startRes = 0;\r
98         this.endRes = al.getWidth() - 1;\r
99         this.startSeq = 0;\r
100         this.endSeq = al.getHeight() - 1;\r
101 \r
102         updateFromPreferences();\r
103     }\r
104 \r
105     /**\r
106      * DOCUMENT ME!\r
107      */\r
108     public void updateFromPreferences()\r
109     {\r
110       showFullId = Cache.getDefault("SHOW_FULL_ID", true);\r
111       showAnnotation = Cache.getDefault("SHOW_ANNOTATIONS", true);\r
112       showConservation = Cache.getDefault("SHOW_CONSERVATION", true);\r
113 \r
114       showQuality = Cache.getDefault("SHOW_QUALITY", true);\r
115       showIdentity = Cache.getDefault("SHOW_IDENTITY", true);\r
116 \r
117        String fontName = Cache.getDefault("FONT_NAME", "SansSerif");\r
118        String fontStyle = Cache.getDefault("FONT_STYLE", Font.PLAIN + "") ;\r
119        String fontSize = Cache.getDefault("FONT_SIZE", "10");\r
120 \r
121        int style = 0;\r
122 \r
123        if (fontStyle.equals("bold"))\r
124        {\r
125          style = 1;\r
126        }\r
127        else if (fontStyle.equals("italic"))\r
128        {\r
129          style = 2;\r
130        }\r
131 \r
132        setFont(new Font(fontName, style, Integer.parseInt(fontSize)));\r
133 \r
134 \r
135        alignment.setGapCharacter( Cache.getDefault("GAP_SYMBOL", "-").charAt(0) );\r
136 \r
137 \r
138         // We must set conservation and consensus before setting colour,\r
139         // as Blosum and Clustal require this to be done\r
140         updateConservation();\r
141         updateConsensus();\r
142 \r
143         if (jalview.bin.Cache.getProperty("DEFAULT_COLOUR") != null)\r
144         {\r
145           globalColourScheme = ColourSchemeProperty.getColour(alignment,\r
146               jalview.bin.Cache.getProperty("DEFAULT_COLOUR"));\r
147 \r
148             if (globalColourScheme instanceof UserColourScheme)\r
149             {\r
150                 globalColourScheme = UserDefinedColours.loadDefaultColours();\r
151                 ((UserColourScheme)globalColourScheme).setThreshold(0, getIgnoreGapsConsensus());\r
152             }\r
153 \r
154             if (globalColourScheme != null)\r
155             {\r
156                 globalColourScheme.setConsensus(vconsensus);\r
157             }\r
158         }\r
159     }\r
160 \r
161 \r
162 \r
163     /**\r
164      * DOCUMENT ME!\r
165      *\r
166      * @param b DOCUMENT ME!\r
167      */\r
168     public void showSequenceFeatures(boolean b)\r
169     {\r
170         showSequenceFeatures = b;\r
171     }\r
172 \r
173     /**\r
174      * DOCUMENT ME!\r
175      */\r
176     public void updateConservation()\r
177     {\r
178       try{\r
179         Conservation cons = new jalview.analysis.Conservation("All",\r
180             jalview.schemes.ResidueProperties.propHash, 3,\r
181             alignment.getSequences(), 0, alignment.getWidth() - 1);\r
182         cons.calculate();\r
183         cons.verdict(false, ConsPercGaps);\r
184         cons.findQuality();\r
185 \r
186         int alWidth = alignment.getWidth();\r
187         Annotation[] annotations = new Annotation[alWidth];\r
188         Annotation[] qannotations = new Annotation[alWidth];\r
189         String sequence = cons.getConsSequence().getSequence();\r
190         float minR;\r
191         float minG;\r
192         float minB;\r
193         float maxR;\r
194         float maxG;\r
195         float maxB;\r
196         minR = 0.3f;\r
197         minG = 0.0f;\r
198         minB = 0f;\r
199         maxR = 1.0f - minR;\r
200         maxG = 0.9f - minG;\r
201         maxB = 0f - minB; // scalable range for colouring both Conservation and Quality\r
202 \r
203         float min = 0f;\r
204         float max = 11f;\r
205         float qmin = cons.qualityRange[0].floatValue();\r
206         float qmax = cons.qualityRange[1].floatValue();\r
207 \r
208         for (int i = 0; i < alWidth; i++)\r
209         {\r
210           float value = 0;\r
211 \r
212           try\r
213           {\r
214             value = Integer.parseInt(sequence.charAt(i) + "");\r
215           }\r
216           catch (Exception ex)\r
217           {\r
218             if (sequence.charAt(i) == '*')\r
219             {\r
220               value = 11;\r
221             }\r
222 \r
223             if (sequence.charAt(i) == '+')\r
224             {\r
225               value = 10;\r
226             }\r
227           }\r
228 \r
229           float vprop = value - min;\r
230           vprop /= max;\r
231           annotations[i] = new Annotation(sequence.charAt(i) + "",\r
232                                           String.valueOf(value), ' ', value,\r
233                                           new Color(minR + (maxR * vprop),\r
234               minG + (maxG * vprop),\r
235               minB + (maxB * vprop)));\r
236 \r
237           // Quality calc\r
238           value = ( (Double) cons.quality.get(i)).floatValue();\r
239           vprop = value - qmin;\r
240           vprop /= qmax;\r
241           qannotations[i] = new Annotation(" ", String.valueOf(value), ' ',\r
242                                            value,\r
243                                            new Color(minR + (maxR * vprop),\r
244               minG + (maxG * vprop),\r
245               minB + (maxB * vprop)));\r
246         }\r
247 \r
248         if (conservation == null)\r
249         {\r
250           conservation = new AlignmentAnnotation("Conservation",\r
251                                                  "Conservation of total alignment less than " +\r
252                                                  ConsPercGaps + "% gaps",\r
253                                                  annotations, 0f, // cons.qualityRange[0].floatValue(),\r
254                                                  11f, // cons.qualityRange[1].floatValue()\r
255                                                  1);\r
256 \r
257           if (showConservation)\r
258           {\r
259             alignment.addAnnotation(conservation);\r
260           }\r
261 \r
262           quality = new AlignmentAnnotation("Quality",\r
263                                             "Alignment Quality based on Blosum62 scores",\r
264                                             qannotations,\r
265                                             cons.qualityRange[0].floatValue(),\r
266                                             cons.qualityRange[1].floatValue(),\r
267                                             1);\r
268 \r
269           if (showQuality)\r
270           {\r
271             alignment.addAnnotation(quality);\r
272           }\r
273         }\r
274         else\r
275         {\r
276           conservation.annotations = annotations;\r
277           quality.annotations = qannotations;\r
278           quality.graphMax = cons.qualityRange[1].floatValue();\r
279         }\r
280       }\r
281       catch (OutOfMemoryError error)\r
282       {\r
283         javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
284             "Out of memory calculating conservation!!"\r
285             +\r
286             "\nSee help files for increasing Java Virtual Machine memory."\r
287             , "Out of memory",\r
288             javax.swing.JOptionPane.WARNING_MESSAGE);\r
289         System.out.println("Conservation calculation: " + error);\r
290         System.gc();\r
291 \r
292       }\r
293     }\r
294 \r
295     /**\r
296      * DOCUMENT ME!\r
297      */\r
298     public void updateConsensus()\r
299     {\r
300       try{\r
301         Annotation[] annotations = new Annotation[alignment.getWidth()];\r
302 \r
303         // this routine prevents vconsensus becoming a new object each time\r
304         // consenus is calculated. Important for speed of Blosum62\r
305         // and PID colouring of alignment\r
306         if (vconsensus == null)\r
307         {\r
308           vconsensus = alignment.getAAFrequency();\r
309         }\r
310         else\r
311         {\r
312           Vector temp = alignment.getAAFrequency();\r
313           vconsensus.clear();\r
314 \r
315           Enumeration e = temp.elements();\r
316 \r
317           while (e.hasMoreElements())\r
318           {\r
319             vconsensus.add(e.nextElement());\r
320           }\r
321         }\r
322 \r
323         Hashtable hash = null;\r
324 \r
325         for (int i = 0; i < alignment.getWidth(); i++)\r
326         {\r
327           hash = (Hashtable) vconsensus.elementAt(i);\r
328 \r
329           float value = 0;\r
330           if (ignoreGapsInConsensusCalculation)\r
331             value = ( (Float) hash.get("pid_nogaps")).floatValue();\r
332           else\r
333             value = ( (Float) hash.get("pid_gaps")).floatValue();\r
334 \r
335           String maxRes = hash.get("maxResidue").toString();\r
336           String mouseOver = hash.get("maxResidue") + " ";\r
337 \r
338           if (maxRes.length() > 1)\r
339           {\r
340             mouseOver = "[" + maxRes + "] ";\r
341             maxRes = "+";\r
342           }\r
343 \r
344           mouseOver += ( (int) value + "%");\r
345           annotations[i] = new Annotation(maxRes, mouseOver, ' ', value);\r
346         }\r
347 \r
348         if (consensus == null)\r
349         {\r
350           consensus = new AlignmentAnnotation("Consensus", "PID",\r
351                                               annotations, 0f, 100f, 1);\r
352 \r
353           if (showIdentity)\r
354           {\r
355             alignment.addAnnotation(consensus);\r
356           }\r
357         }\r
358         else\r
359         {\r
360           consensus.annotations = annotations;\r
361         }\r
362 \r
363         if (globalColourScheme != null)\r
364           globalColourScheme.setConsensus(vconsensus);\r
365 \r
366       }catch(OutOfMemoryError error)\r
367       {\r
368         javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
369             "Out of memory calculating consensus!!"\r
370             +\r
371             "\nSee help files for increasing Java Virtual Machine memory."\r
372             , "Out of memory",\r
373             javax.swing.JOptionPane.WARNING_MESSAGE);\r
374         System.out.println("Consensus calculation: " + error);\r
375         System.gc();\r
376       }\r
377 \r
378     }\r
379 \r
380     /**\r
381      * DOCUMENT ME!\r
382      *\r
383      * @return DOCUMENT ME!\r
384      */\r
385     public SequenceGroup getSelectionGroup()\r
386     {\r
387         return selectionGroup;\r
388     }\r
389 \r
390     /**\r
391      * DOCUMENT ME!\r
392      *\r
393      * @param sg DOCUMENT ME!\r
394      */\r
395     public void setSelectionGroup(SequenceGroup sg)\r
396     {\r
397         selectionGroup = sg;\r
398     }\r
399 \r
400     /**\r
401      * DOCUMENT ME!\r
402      *\r
403      * @return DOCUMENT ME!\r
404      */\r
405     public boolean getConservationSelected()\r
406     {\r
407         return conservationColourSelected;\r
408     }\r
409 \r
410     /**\r
411      * DOCUMENT ME!\r
412      *\r
413      * @param b DOCUMENT ME!\r
414      */\r
415     public void setConservationSelected(boolean b)\r
416     {\r
417         conservationColourSelected = b;\r
418     }\r
419 \r
420     /**\r
421      * DOCUMENT ME!\r
422      *\r
423      * @return DOCUMENT ME!\r
424      */\r
425     public boolean getAbovePIDThreshold()\r
426     {\r
427         return abovePIDThreshold;\r
428     }\r
429 \r
430     /**\r
431      * DOCUMENT ME!\r
432      *\r
433      * @param b DOCUMENT ME!\r
434      */\r
435     public void setAbovePIDThreshold(boolean b)\r
436     {\r
437         abovePIDThreshold = b;\r
438     }\r
439 \r
440     /**\r
441      * DOCUMENT ME!\r
442      *\r
443      * @return DOCUMENT ME!\r
444      */\r
445     public int getStartRes()\r
446     {\r
447         return startRes;\r
448     }\r
449 \r
450     /**\r
451      * DOCUMENT ME!\r
452      *\r
453      * @return DOCUMENT ME!\r
454      */\r
455     public int getEndRes()\r
456     {\r
457         return endRes;\r
458     }\r
459 \r
460     /**\r
461      * DOCUMENT ME!\r
462      *\r
463      * @return DOCUMENT ME!\r
464      */\r
465     public int getStartSeq()\r
466     {\r
467         return startSeq;\r
468     }\r
469 \r
470     /**\r
471      * DOCUMENT ME!\r
472      *\r
473      * @param cs DOCUMENT ME!\r
474      */\r
475     public void setGlobalColourScheme(ColourSchemeI cs)\r
476     {\r
477         globalColourScheme = cs;\r
478     }\r
479 \r
480     /**\r
481      * DOCUMENT ME!\r
482      *\r
483      * @return DOCUMENT ME!\r
484      */\r
485     public ColourSchemeI getGlobalColourScheme()\r
486     {\r
487         return globalColourScheme;\r
488     }\r
489 \r
490     /**\r
491      * DOCUMENT ME!\r
492      *\r
493      * @param res DOCUMENT ME!\r
494      */\r
495     public void setStartRes(int res)\r
496     {\r
497         this.startRes = res;\r
498     }\r
499 \r
500     /**\r
501      * DOCUMENT ME!\r
502      *\r
503      * @param seq DOCUMENT ME!\r
504      */\r
505     public void setStartSeq(int seq)\r
506     {\r
507         this.startSeq = seq;\r
508     }\r
509 \r
510     /**\r
511      * DOCUMENT ME!\r
512      *\r
513      * @param res DOCUMENT ME!\r
514      */\r
515     public void setEndRes(int res)\r
516     {\r
517         if (res > (alignment.getWidth() - 1))\r
518         {\r
519             // log.System.out.println(" Corrected res from " + res + " to maximum " + (alignment.getWidth()-1));\r
520             res = alignment.getWidth() - 1;\r
521         }\r
522 \r
523         if (res < 0)\r
524         {\r
525             res = 0;\r
526         }\r
527 \r
528         this.endRes = res;\r
529     }\r
530 \r
531     /**\r
532      * DOCUMENT ME!\r
533      *\r
534      * @param seq DOCUMENT ME!\r
535      */\r
536     public void setEndSeq(int seq)\r
537     {\r
538         if (seq > alignment.getHeight())\r
539         {\r
540             seq = alignment.getHeight();\r
541         }\r
542 \r
543         if (seq < 0)\r
544         {\r
545             seq = 0;\r
546         }\r
547 \r
548         this.endSeq = seq;\r
549     }\r
550 \r
551     /**\r
552      * DOCUMENT ME!\r
553      *\r
554      * @return DOCUMENT ME!\r
555      */\r
556     public int getEndSeq()\r
557     {\r
558         return endSeq;\r
559     }\r
560 \r
561     /**\r
562      * DOCUMENT ME!\r
563      *\r
564      * @param f DOCUMENT ME!\r
565      */\r
566     public void setFont(Font f)\r
567     {\r
568         font = f;\r
569 \r
570         Container c = new Container();\r
571 \r
572         java.awt.FontMetrics fm = c.getFontMetrics(font);\r
573         setCharHeight(fm.getHeight());\r
574         setCharWidth(fm.charWidth('M'));\r
575     }\r
576 \r
577     /**\r
578      * DOCUMENT ME!\r
579      *\r
580      * @return DOCUMENT ME!\r
581      */\r
582     public Font getFont()\r
583     {\r
584         return font;\r
585     }\r
586 \r
587     /**\r
588      * DOCUMENT ME!\r
589      *\r
590      * @param w DOCUMENT ME!\r
591      */\r
592     public void setCharWidth(int w)\r
593     {\r
594         this.charWidth = w;\r
595     }\r
596 \r
597     /**\r
598      * DOCUMENT ME!\r
599      *\r
600      * @return DOCUMENT ME!\r
601      */\r
602     public int getCharWidth()\r
603     {\r
604         return charWidth;\r
605     }\r
606 \r
607     /**\r
608      * DOCUMENT ME!\r
609      *\r
610      * @param h DOCUMENT ME!\r
611      */\r
612     public void setCharHeight(int h)\r
613     {\r
614         this.charHeight = h;\r
615     }\r
616 \r
617     /**\r
618      * DOCUMENT ME!\r
619      *\r
620      * @return DOCUMENT ME!\r
621      */\r
622     public int getCharHeight()\r
623     {\r
624         return charHeight;\r
625     }\r
626 \r
627     /**\r
628      * DOCUMENT ME!\r
629      *\r
630      * @param w DOCUMENT ME!\r
631      */\r
632     public void setWrappedWidth(int w)\r
633     {\r
634         this.wrappedWidth = w;\r
635     }\r
636 \r
637     /**\r
638      * DOCUMENT ME!\r
639      *\r
640      * @return DOCUMENT ME!\r
641      */\r
642     public int getWrappedWidth()\r
643     {\r
644         return wrappedWidth;\r
645     }\r
646 \r
647 \r
648     /**\r
649      * DOCUMENT ME!\r
650      *\r
651      * @return DOCUMENT ME!\r
652      */\r
653     public AlignmentI getAlignment()\r
654     {\r
655         return alignment;\r
656     }\r
657 \r
658     /**\r
659      * DOCUMENT ME!\r
660      *\r
661      * @param align DOCUMENT ME!\r
662      */\r
663     public void setAlignment(AlignmentI align)\r
664     {\r
665         this.alignment = align;\r
666     }\r
667 \r
668     /**\r
669      * DOCUMENT ME!\r
670      *\r
671      * @param state DOCUMENT ME!\r
672      */\r
673     public void setWrapAlignment(boolean state)\r
674     {\r
675         wrapAlignment = state;\r
676     }\r
677 \r
678     /**\r
679      * DOCUMENT ME!\r
680      *\r
681      * @param state DOCUMENT ME!\r
682      */\r
683     public void setShowText(boolean state)\r
684     {\r
685         showText = state;\r
686     }\r
687 \r
688     /**\r
689      * DOCUMENT ME!\r
690      *\r
691      * @param state DOCUMENT ME!\r
692      */\r
693     public void setRenderGaps(boolean state)\r
694     {\r
695         renderGaps = state;\r
696     }\r
697 \r
698     /**\r
699      * DOCUMENT ME!\r
700      *\r
701      * @return DOCUMENT ME!\r
702      */\r
703     public boolean getColourText()\r
704     {\r
705         return showColourText;\r
706     }\r
707 \r
708     /**\r
709      * DOCUMENT ME!\r
710      *\r
711      * @param state DOCUMENT ME!\r
712      */\r
713     public void setColourText(boolean state)\r
714     {\r
715         showColourText = state;\r
716     }\r
717 \r
718     /**\r
719      * DOCUMENT ME!\r
720      *\r
721      * @param state DOCUMENT ME!\r
722      */\r
723     public void setShowBoxes(boolean state)\r
724     {\r
725         showBoxes = state;\r
726     }\r
727 \r
728     /**\r
729      * DOCUMENT ME!\r
730      *\r
731      * @return DOCUMENT ME!\r
732      */\r
733     public boolean getWrapAlignment()\r
734     {\r
735         return wrapAlignment;\r
736     }\r
737 \r
738     /**\r
739      * DOCUMENT ME!\r
740      *\r
741      * @return DOCUMENT ME!\r
742      */\r
743     public boolean getShowText()\r
744     {\r
745         return showText;\r
746     }\r
747 \r
748     /**\r
749      * DOCUMENT ME!\r
750      *\r
751      * @return DOCUMENT ME!\r
752      */\r
753     public boolean getShowBoxes()\r
754     {\r
755         return showBoxes;\r
756     }\r
757 \r
758     /**\r
759      * DOCUMENT ME!\r
760      *\r
761      * @return DOCUMENT ME!\r
762      */\r
763     public char getGapCharacter()\r
764     {\r
765         return getAlignment().getGapCharacter();\r
766     }\r
767 \r
768     /**\r
769      * DOCUMENT ME!\r
770      *\r
771      * @param gap DOCUMENT ME!\r
772      */\r
773     public void setGapCharacter(char gap)\r
774     {\r
775         if (getAlignment() != null)\r
776         {\r
777             getAlignment().setGapCharacter(gap);\r
778         }\r
779     }\r
780 \r
781     /**\r
782      * DOCUMENT ME!\r
783      *\r
784      * @param thresh DOCUMENT ME!\r
785      */\r
786     public void setThreshold(int thresh)\r
787     {\r
788         threshold = thresh;\r
789     }\r
790 \r
791     /**\r
792      * DOCUMENT ME!\r
793      *\r
794      * @return DOCUMENT ME!\r
795      */\r
796     public int getThreshold()\r
797     {\r
798         return threshold;\r
799     }\r
800 \r
801     /**\r
802      * DOCUMENT ME!\r
803      *\r
804      * @param inc DOCUMENT ME!\r
805      */\r
806     public void setIncrement(int inc)\r
807     {\r
808         increment = inc;\r
809     }\r
810 \r
811     /**\r
812      * DOCUMENT ME!\r
813      *\r
814      * @return DOCUMENT ME!\r
815      */\r
816     public int getIncrement()\r
817     {\r
818         return increment;\r
819     }\r
820 \r
821     /**\r
822      * DOCUMENT ME!\r
823      *\r
824      * @param y DOCUMENT ME!\r
825      *\r
826      * @return DOCUMENT ME!\r
827      */\r
828     public int getIndex(int y)\r
829     {\r
830         int y1 = 0;\r
831         int starty = getStartSeq();\r
832         int endy = getEndSeq();\r
833 \r
834         for (int i = starty; i <= endy; i++)\r
835         {\r
836             if ((i < alignment.getHeight()) &&\r
837                     (alignment.getSequenceAt(i) != null))\r
838             {\r
839                 int y2 = y1 + getCharHeight();\r
840 \r
841                 if ((y >= y1) && (y <= y2))\r
842                 {\r
843                     return i;\r
844                 }\r
845 \r
846                 y1 = y2;\r
847             }\r
848             else\r
849             {\r
850                 return -1;\r
851             }\r
852         }\r
853 \r
854         return -1;\r
855     }\r
856 \r
857     /**\r
858      * DOCUMENT ME!\r
859      *\r
860      * @return DOCUMENT ME!\r
861      */\r
862     public ColumnSelection getColumnSelection()\r
863     {\r
864         return colSel;\r
865     }\r
866 \r
867 \r
868     /**\r
869      * DOCUMENT ME!\r
870      *\r
871      * @param tree DOCUMENT ME!\r
872      */\r
873     public void setCurrentTree(NJTree tree)\r
874     {\r
875         currentTree = tree;\r
876     }\r
877 \r
878     /**\r
879      * DOCUMENT ME!\r
880      *\r
881      * @return DOCUMENT ME!\r
882      */\r
883     public NJTree getCurrentTree()\r
884     {\r
885         return currentTree;\r
886     }\r
887 \r
888     /**\r
889      * DOCUMENT ME!\r
890      *\r
891      * @param b DOCUMENT ME!\r
892      */\r
893     public void setColourAppliesToAllGroups(boolean b)\r
894     {\r
895         colourAppliesToAllGroups = b;\r
896     }\r
897 \r
898     /**\r
899      * DOCUMENT ME!\r
900      *\r
901      * @return DOCUMENT ME!\r
902      */\r
903     public boolean getColourAppliesToAllGroups()\r
904     {\r
905         return colourAppliesToAllGroups;\r
906     }\r
907 \r
908     /**\r
909      * DOCUMENT ME!\r
910      *\r
911      * @return DOCUMENT ME!\r
912      */\r
913     public boolean getShowFullId()\r
914     {\r
915         return showFullId;\r
916     }\r
917 \r
918     /**\r
919      * DOCUMENT ME!\r
920      *\r
921      * @param b DOCUMENT ME!\r
922      */\r
923     public void setShowFullId(boolean b)\r
924     {\r
925         showFullId = b;\r
926     }\r
927 \r
928     /**\r
929      * DOCUMENT ME!\r
930      *\r
931      * @return DOCUMENT ME!\r
932      */\r
933     public boolean getShowAnnotation()\r
934     {\r
935         return showAnnotation;\r
936     }\r
937 \r
938     /**\r
939      * DOCUMENT ME!\r
940      *\r
941      * @param b DOCUMENT ME!\r
942      */\r
943     public void setShowAnnotation(boolean b)\r
944     {\r
945         showAnnotation = b;\r
946     }\r
947 \r
948     /**\r
949      * DOCUMENT ME!\r
950      *\r
951      * @return DOCUMENT ME!\r
952      */\r
953     public boolean getScaleAboveWrapped()\r
954     {\r
955         return scaleAboveWrapped;\r
956     }\r
957 \r
958     /**\r
959      * DOCUMENT ME!\r
960      *\r
961      * @return DOCUMENT ME!\r
962      */\r
963     public boolean getScaleLeftWrapped()\r
964     {\r
965         return scaleLeftWrapped;\r
966     }\r
967 \r
968     /**\r
969      * DOCUMENT ME!\r
970      *\r
971      * @return DOCUMENT ME!\r
972      */\r
973     public boolean getScaleRightWrapped()\r
974     {\r
975         return scaleRightWrapped;\r
976     }\r
977 \r
978     /**\r
979      * DOCUMENT ME!\r
980      *\r
981      * @param b DOCUMENT ME!\r
982      */\r
983     public void setScaleAboveWrapped(boolean b)\r
984     {\r
985         scaleAboveWrapped = b;\r
986     }\r
987 \r
988     /**\r
989      * DOCUMENT ME!\r
990      *\r
991      * @param b DOCUMENT ME!\r
992      */\r
993     public void setScaleLeftWrapped(boolean b)\r
994     {\r
995         scaleLeftWrapped = b;\r
996     }\r
997 \r
998     /**\r
999      * DOCUMENT ME!\r
1000      *\r
1001      * @param b DOCUMENT ME!\r
1002      */\r
1003     public void setScaleRightWrapped(boolean b)\r
1004     {\r
1005         scaleRightWrapped = b;\r
1006     }\r
1007 \r
1008     /**\r
1009      * Property change listener for changes in alignment\r
1010      *\r
1011      * @param listener DOCUMENT ME!\r
1012      */\r
1013     public void addPropertyChangeListener(\r
1014         java.beans.PropertyChangeListener listener)\r
1015     {\r
1016         changeSupport.addPropertyChangeListener(listener);\r
1017     }\r
1018 \r
1019     /**\r
1020      * DOCUMENT ME!\r
1021      *\r
1022      * @param listener DOCUMENT ME!\r
1023      */\r
1024     public void removePropertyChangeListener(\r
1025         java.beans.PropertyChangeListener listener)\r
1026     {\r
1027         changeSupport.removePropertyChangeListener(listener);\r
1028     }\r
1029 \r
1030     /**\r
1031      * Property change listener for changes in alignment\r
1032      *\r
1033      * @param prop DOCUMENT ME!\r
1034      * @param oldvalue DOCUMENT ME!\r
1035      * @param newvalue DOCUMENT ME!\r
1036      */\r
1037     public void firePropertyChange(String prop, Object oldvalue, Object newvalue)\r
1038     {\r
1039         changeSupport.firePropertyChange(prop, oldvalue, newvalue);\r
1040     }\r
1041 \r
1042     public void setIgnoreGapsConsensus(boolean b)\r
1043     {\r
1044       ignoreGapsInConsensusCalculation = b;\r
1045       updateConsensus();\r
1046       if(globalColourScheme!=null)\r
1047       {\r
1048         globalColourScheme.setThreshold(globalColourScheme.getThreshold(), ignoreGapsInConsensusCalculation);\r
1049       }\r
1050 \r
1051     }\r
1052 \r
1053     public boolean getIgnoreGapsConsensus()\r
1054     {\r
1055      return ignoreGapsInConsensusCalculation;\r
1056     }\r
1057 }\r