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