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