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