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