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