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