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