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