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