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