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