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