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