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