Use Container to get fontMetrics
[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 = 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         Container c = new Container();\r
535 \r
536         java.awt.FontMetrics fm = c.getFontMetrics(font);\r
537         setCharHeight(fm.getHeight());\r
538         setCharWidth(fm.charWidth('M'));\r
539     }\r
540 \r
541     /**\r
542      * DOCUMENT ME!\r
543      *\r
544      * @return DOCUMENT ME!\r
545      */\r
546     public Font getFont()\r
547     {\r
548         return font;\r
549     }\r
550 \r
551     /**\r
552      * DOCUMENT ME!\r
553      *\r
554      * @param w DOCUMENT ME!\r
555      */\r
556     public void setCharWidth(int w)\r
557     {\r
558         this.charWidth = w;\r
559     }\r
560 \r
561     /**\r
562      * DOCUMENT ME!\r
563      *\r
564      * @return DOCUMENT ME!\r
565      */\r
566     public int getCharWidth()\r
567     {\r
568         return charWidth;\r
569     }\r
570 \r
571     /**\r
572      * DOCUMENT ME!\r
573      *\r
574      * @param h DOCUMENT ME!\r
575      */\r
576     public void setCharHeight(int h)\r
577     {\r
578         this.charHeight = h;\r
579     }\r
580 \r
581     /**\r
582      * DOCUMENT ME!\r
583      *\r
584      * @return DOCUMENT ME!\r
585      */\r
586     public int getCharHeight()\r
587     {\r
588         return charHeight;\r
589     }\r
590 \r
591     /**\r
592      * DOCUMENT ME!\r
593      *\r
594      * @param w DOCUMENT ME!\r
595      */\r
596     public void setChunkWidth(int w)\r
597     {\r
598         this.chunkWidth = w;\r
599     }\r
600 \r
601     /**\r
602      * DOCUMENT ME!\r
603      *\r
604      * @return DOCUMENT ME!\r
605      */\r
606     public int getChunkWidth()\r
607     {\r
608         return chunkWidth;\r
609     }\r
610 \r
611     /**\r
612      * DOCUMENT ME!\r
613      *\r
614      * @param h DOCUMENT ME!\r
615      */\r
616     public void setChunkHeight(int h)\r
617     {\r
618         this.chunkHeight = h;\r
619     }\r
620 \r
621     /**\r
622      * DOCUMENT ME!\r
623      *\r
624      * @return DOCUMENT ME!\r
625      */\r
626     public int getChunkHeight()\r
627     {\r
628         return chunkHeight;\r
629     }\r
630 \r
631     /**\r
632      * DOCUMENT ME!\r
633      *\r
634      * @return DOCUMENT ME!\r
635      */\r
636     public AlignmentI getAlignment()\r
637     {\r
638         return alignment;\r
639     }\r
640 \r
641     /**\r
642      * DOCUMENT ME!\r
643      *\r
644      * @param align DOCUMENT ME!\r
645      */\r
646     public void setAlignment(AlignmentI align)\r
647     {\r
648         this.alignment = align;\r
649     }\r
650 \r
651     /**\r
652      * DOCUMENT ME!\r
653      *\r
654      * @param state DOCUMENT ME!\r
655      */\r
656     public void setWrapAlignment(boolean state)\r
657     {\r
658         wrapAlignment = state;\r
659     }\r
660 \r
661     /**\r
662      * DOCUMENT ME!\r
663      *\r
664      * @param state DOCUMENT ME!\r
665      */\r
666     public void setShowText(boolean state)\r
667     {\r
668         showText = state;\r
669     }\r
670 \r
671     /**\r
672      * DOCUMENT ME!\r
673      *\r
674      * @param state DOCUMENT ME!\r
675      */\r
676     public void setRenderGaps(boolean state)\r
677     {\r
678         renderGaps = state;\r
679     }\r
680 \r
681     /**\r
682      * DOCUMENT ME!\r
683      *\r
684      * @return DOCUMENT ME!\r
685      */\r
686     public boolean getColourText()\r
687     {\r
688         return showColourText;\r
689     }\r
690 \r
691     /**\r
692      * DOCUMENT ME!\r
693      *\r
694      * @param state DOCUMENT ME!\r
695      */\r
696     public void setColourText(boolean state)\r
697     {\r
698         showColourText = state;\r
699     }\r
700 \r
701     /**\r
702      * DOCUMENT ME!\r
703      *\r
704      * @param state DOCUMENT ME!\r
705      */\r
706     public void setShowBoxes(boolean state)\r
707     {\r
708         showBoxes = state;\r
709     }\r
710 \r
711     /**\r
712      * DOCUMENT ME!\r
713      *\r
714      * @return DOCUMENT ME!\r
715      */\r
716     public boolean getWrapAlignment()\r
717     {\r
718         return wrapAlignment;\r
719     }\r
720 \r
721     /**\r
722      * DOCUMENT ME!\r
723      *\r
724      * @return DOCUMENT ME!\r
725      */\r
726     public boolean getShowText()\r
727     {\r
728         return showText;\r
729     }\r
730 \r
731     /**\r
732      * DOCUMENT ME!\r
733      *\r
734      * @return DOCUMENT ME!\r
735      */\r
736     public boolean getShowBoxes()\r
737     {\r
738         return showBoxes;\r
739     }\r
740 \r
741     /**\r
742      * DOCUMENT ME!\r
743      *\r
744      * @return DOCUMENT ME!\r
745      */\r
746     public char getGapCharacter()\r
747     {\r
748         return getAlignment().getGapCharacter();\r
749     }\r
750 \r
751     /**\r
752      * DOCUMENT ME!\r
753      *\r
754      * @param gap DOCUMENT ME!\r
755      */\r
756     public void setGapCharacter(char gap)\r
757     {\r
758         if (getAlignment() != null)\r
759         {\r
760             getAlignment().setGapCharacter(gap);\r
761         }\r
762     }\r
763 \r
764     /**\r
765      * DOCUMENT ME!\r
766      *\r
767      * @param thresh DOCUMENT ME!\r
768      */\r
769     public void setThreshold(int thresh)\r
770     {\r
771         threshold = thresh;\r
772     }\r
773 \r
774     /**\r
775      * DOCUMENT ME!\r
776      *\r
777      * @return DOCUMENT ME!\r
778      */\r
779     public int getThreshold()\r
780     {\r
781         return threshold;\r
782     }\r
783 \r
784     /**\r
785      * DOCUMENT ME!\r
786      *\r
787      * @param inc DOCUMENT ME!\r
788      */\r
789     public void setIncrement(int inc)\r
790     {\r
791         increment = inc;\r
792     }\r
793 \r
794     /**\r
795      * DOCUMENT ME!\r
796      *\r
797      * @return DOCUMENT ME!\r
798      */\r
799     public int getIncrement()\r
800     {\r
801         return increment;\r
802     }\r
803 \r
804     /**\r
805      * DOCUMENT ME!\r
806      *\r
807      * @param y DOCUMENT ME!\r
808      *\r
809      * @return DOCUMENT ME!\r
810      */\r
811     public int getIndex(int y)\r
812     {\r
813         int y1 = 0;\r
814         int starty = getStartSeq();\r
815         int endy = getEndSeq();\r
816 \r
817         for (int i = starty; i <= endy; i++)\r
818         {\r
819             if ((i < alignment.getHeight()) &&\r
820                     (alignment.getSequenceAt(i) != null))\r
821             {\r
822                 int y2 = y1 + getCharHeight();\r
823 \r
824                 if ((y >= y1) && (y <= y2))\r
825                 {\r
826                     return i;\r
827                 }\r
828 \r
829                 y1 = y2;\r
830             }\r
831             else\r
832             {\r
833                 return -1;\r
834             }\r
835         }\r
836 \r
837         return -1;\r
838     }\r
839 \r
840     /**\r
841      * DOCUMENT ME!\r
842      *\r
843      * @return DOCUMENT ME!\r
844      */\r
845     public ColumnSelection getColumnSelection()\r
846     {\r
847         return colSel;\r
848     }\r
849 \r
850     /**\r
851      * DOCUMENT ME!\r
852      *\r
853      * @param height DOCUMENT ME!\r
854      */\r
855     public void resetSeqLimits(int height)\r
856     {\r
857         setEndSeq(height / getCharHeight());\r
858     }\r
859 \r
860     /**\r
861      * DOCUMENT ME!\r
862      *\r
863      * @param tree DOCUMENT ME!\r
864      */\r
865     public void setCurrentTree(NJTree tree)\r
866     {\r
867         currentTree = tree;\r
868     }\r
869 \r
870     /**\r
871      * DOCUMENT ME!\r
872      *\r
873      * @return DOCUMENT ME!\r
874      */\r
875     public NJTree getCurrentTree()\r
876     {\r
877         return currentTree;\r
878     }\r
879 \r
880     /**\r
881      * DOCUMENT ME!\r
882      *\r
883      * @param b DOCUMENT ME!\r
884      */\r
885     public void setColourAppliesToAllGroups(boolean b)\r
886     {\r
887         colourAppliesToAllGroups = b;\r
888     }\r
889 \r
890     /**\r
891      * DOCUMENT ME!\r
892      *\r
893      * @return DOCUMENT ME!\r
894      */\r
895     public boolean getColourAppliesToAllGroups()\r
896     {\r
897         return colourAppliesToAllGroups;\r
898     }\r
899 \r
900     /**\r
901      * DOCUMENT ME!\r
902      *\r
903      * @return DOCUMENT ME!\r
904      */\r
905     public boolean getShowFullId()\r
906     {\r
907         return showFullId;\r
908     }\r
909 \r
910     /**\r
911      * DOCUMENT ME!\r
912      *\r
913      * @param b DOCUMENT ME!\r
914      */\r
915     public void setShowFullId(boolean b)\r
916     {\r
917         showFullId = b;\r
918     }\r
919 \r
920     /**\r
921      * DOCUMENT ME!\r
922      *\r
923      * @return DOCUMENT ME!\r
924      */\r
925     public boolean getShowAnnotation()\r
926     {\r
927         return showAnnotation;\r
928     }\r
929 \r
930     /**\r
931      * DOCUMENT ME!\r
932      *\r
933      * @param b DOCUMENT ME!\r
934      */\r
935     public void setShowAnnotation(boolean b)\r
936     {\r
937         showAnnotation = b;\r
938     }\r
939 \r
940     /**\r
941      * DOCUMENT ME!\r
942      *\r
943      * @return DOCUMENT ME!\r
944      */\r
945     public boolean getScaleAboveWrapped()\r
946     {\r
947         return scaleAboveWrapped;\r
948     }\r
949 \r
950     /**\r
951      * DOCUMENT ME!\r
952      *\r
953      * @return DOCUMENT ME!\r
954      */\r
955     public boolean getScaleLeftWrapped()\r
956     {\r
957         return scaleLeftWrapped;\r
958     }\r
959 \r
960     /**\r
961      * DOCUMENT ME!\r
962      *\r
963      * @return DOCUMENT ME!\r
964      */\r
965     public boolean getScaleRightWrapped()\r
966     {\r
967         return scaleRightWrapped;\r
968     }\r
969 \r
970     /**\r
971      * DOCUMENT ME!\r
972      *\r
973      * @param b DOCUMENT ME!\r
974      */\r
975     public void setScaleAboveWrapped(boolean b)\r
976     {\r
977         scaleAboveWrapped = b;\r
978     }\r
979 \r
980     /**\r
981      * DOCUMENT ME!\r
982      *\r
983      * @param b DOCUMENT ME!\r
984      */\r
985     public void setScaleLeftWrapped(boolean b)\r
986     {\r
987         scaleLeftWrapped = b;\r
988     }\r
989 \r
990     /**\r
991      * DOCUMENT ME!\r
992      *\r
993      * @param b DOCUMENT ME!\r
994      */\r
995     public void setScaleRightWrapped(boolean b)\r
996     {\r
997         scaleRightWrapped = b;\r
998     }\r
999 \r
1000     /**\r
1001      * DOCUMENT ME!\r
1002      *\r
1003      * @param listener DOCUMENT ME!\r
1004      */\r
1005     public void addPropertyChangeListener(\r
1006         java.beans.PropertyChangeListener listener)\r
1007     {\r
1008         changeSupport.addPropertyChangeListener(listener);\r
1009     }\r
1010 \r
1011     /**\r
1012      * DOCUMENT ME!\r
1013      *\r
1014      * @param listener DOCUMENT ME!\r
1015      */\r
1016     public void removePropertyChangeListener(\r
1017         java.beans.PropertyChangeListener listener)\r
1018     {\r
1019         changeSupport.removePropertyChangeListener(listener);\r
1020     }\r
1021 \r
1022     /**\r
1023      * DOCUMENT ME!\r
1024      *\r
1025      * @param prop DOCUMENT ME!\r
1026      * @param oldvalue DOCUMENT ME!\r
1027      * @param newvalue DOCUMENT ME!\r
1028      */\r
1029     public void firePropertyChange(String prop, Object oldvalue, Object newvalue)\r
1030     {\r
1031         changeSupport.firePropertyChange(prop, oldvalue, newvalue);\r
1032     }\r
1033 }\r