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