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