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