JAL-1690 show 'scale protein' in protein _and_ dna menus; default true
[jalview.git] / src / jalview / viewmodel / styles / ViewStyle.java
1 package jalview.viewmodel.styles;
2
3 import java.awt.Color;
4 import java.lang.reflect.Method;
5 import java.util.HashMap;
6
7 import jalview.api.ViewStyleI;
8
9 /**
10  * A container for holding alignment view properties. View properties are
11  * data-independent, which means they can be safely copied between views
12  * involving different alignment data without causing exceptions in the
13  * rendering system.
14  * 
15  * @author jprocter
16  *
17  */
18 public class ViewStyle implements ViewStyleI
19 {
20
21   private boolean abovePIDThreshold = false;
22
23   int charHeight;
24
25   int charWidth;
26
27   int idWidth = -1;
28
29   /**
30    * gui state - changes to colour scheme propagated to all groups
31    */
32   private boolean colourAppliesToAllGroups;
33
34   /**
35    * centre columnar annotation labels in displayed alignment annotation
36    */
37   boolean centreColumnLabels = false;
38
39   private boolean showdbrefs;
40
41   private boolean shownpfeats;
42
43   // --------END Structure Conservation
44
45   /**
46    * colour according to the reference sequence defined on the alignment
47    */
48   private boolean colourByReferenceSeq = false;
49
50   boolean conservationColourSelected = false;
51
52   /**
53    * show the reference sequence in the alignment view
54    */
55   private boolean displayReferenceSeq = false;
56
57   private int increment;
58
59   /**
60    * display gap characters
61    */
62   boolean renderGaps = true;
63
64   private boolean rightAlignIds = false;
65
66   boolean scaleAboveWrapped = false;
67
68   boolean scaleLeftWrapped = true;
69
70   boolean scaleRightWrapped = true;
71
72   boolean seqNameItalics;
73
74   /**
75    * show annotation tracks on the alignment
76    */
77   private boolean showAnnotation = true;
78
79   /**
80    * render each residue in a coloured box
81    */
82   boolean showBoxes = true;
83
84   /**
85    * Colour sequence text
86    */
87   boolean showColourText = false;
88
89   /**
90    * show blue triangles
91    */
92   boolean showHiddenMarkers = true;
93
94   /**
95    * show /start-end in ID panel
96    */
97   boolean showJVSuffix = true;
98
99   /**
100    * scale features height according to score
101    */
102   boolean showSeqFeaturesHeight;
103
104   /**
105    * display setting for showing/hiding sequence features on alignment view
106    */
107   boolean showSequenceFeatures = false;
108
109   /**
110    * display sequence symbols
111    */
112   boolean showText = true;
113
114   /**
115    * show non-conserved residues only
116    */
117   protected boolean showUnconserved = false;
118
119   Color textColour = Color.black;
120
121   Color textColour2 = Color.white;
122
123   /**
124    * PID or consensus threshold
125    */
126   int threshold;
127
128   /**
129    * threshold for switching between textColour & textColour2
130    */
131   int thresholdTextColour = 0;
132
133   /**
134    * upper case characters in sequence are shown in bold
135    */
136   boolean upperCasebold = false;
137
138   /**
139    * name of base font for view
140    */
141   private String fontName;
142
143   /**
144    * size for base font
145    */
146   private int fontSize;
147
148   /*
149    * If true, scale protein residues to 3 times width of cDNA bases (in
150    * SplitFrame views only)
151    */
152   private boolean scaleProteinAsCdna = true;
153
154   public ViewStyle(ViewStyleI viewStyle)
155   {
156     ViewStyle.configureFrom(this, viewStyle);
157   }
158
159   public ViewStyle()
160   {
161   }
162
163   private static HashMap<String, Method> getters, isErs, setters;
164   static
165   {
166     getters = new HashMap<String, Method>();
167     isErs = new HashMap<String, Method>();
168     setters = new HashMap<String, Method>();
169     // Match Getters and Setters
170     for (Method m : ViewStyleI.class.getMethods())
171     {
172       if (m.getDeclaringClass() == ViewStyleI.class)
173       {
174         if (m.getName().startsWith("get"))
175         {
176           getters.put(m.getName().substring(3), m);
177         }
178         if (m.getName().startsWith("is"))
179         {
180           isErs.put(m.getName().substring(2), m);
181         }
182         if (m.getName().startsWith("set"))
183         {
184           setters.put(m.getName().substring(3), m);
185         }
186       }
187     }
188   }
189
190   private static void configureFrom(ViewStyle us, ViewStyleI viewStyle)
191   {
192       // try and do the set thing
193       for (String prop : setters.keySet())
194       {
195         Method getter = getters.get(prop);
196         Method setter = setters.get(prop);
197         if (getter == null)
198         {
199           getter = isErs.get(prop);
200         }
201       if (getter != null && setter != null)
202       {
203         try
204         {
205           setter.invoke(us, getter.invoke(viewStyle));
206         } catch (Exception q)
207         {
208           System.err.println("Unexpected exception setting view property "
209                   + prop + " by reflection");
210           q.printStackTrace();
211         }
212
213       }
214       }
215   }
216
217   private static boolean equivalent(ViewStyle us, ViewStyleI them)
218   {
219     // look for properties we can set
220     for (String prop : setters.keySet())
221     {
222       Method getter = getters.get(prop);
223       if (getter == null)
224       {
225         getter = isErs.get(prop);
226       }
227       if (getter != null)
228       {
229         try
230         {
231           if (!getter.invoke(them).equals(getter.invoke(us)))
232           {
233             return false;
234           }
235         } catch (Exception q)
236         {
237           System.err.println("Unexpected exception testing equivalence of property "
238                   + prop + " by reflection");
239           q.printStackTrace();
240         }
241       }
242     }
243
244     return true;
245   }
246
247   public boolean equals(ViewStyleI other)
248   {
249     return other == null ? false : equivalent(this, other);
250   }
251
252   /**
253    * @return the upperCasebold
254    */
255   @Override
256   public boolean isUpperCasebold()
257   {
258     return upperCasebold;
259   }
260
261   /**
262    * @param upperCasebold
263    *          the upperCasebold to set
264    */
265   @Override
266   public void setUpperCasebold(boolean upperCasebold)
267   {
268     this.upperCasebold = upperCasebold;
269   }
270
271   /**
272    * flag for wrapping
273    */
274   boolean wrapAlignment = false;
275
276   /**
277    * number columns in wrapped alignment
278    */
279   int wrappedWidth;
280
281   private int fontStyle;
282
283   /**
284    * GUI state
285    * 
286    * @return true if percent identity threshold is applied to shading
287    */
288   @Override
289   public boolean getAbovePIDThreshold()
290   {
291     return abovePIDThreshold;
292   }
293
294   /**
295    * DOCUMENT ME!
296    * 
297    * @return DOCUMENT ME!
298    */
299   @Override
300   public int getCharHeight()
301   {
302     return charHeight;
303   }
304
305   /**
306    * DOCUMENT ME!
307    * 
308    * @return DOCUMENT ME!
309    */
310   @Override
311   public int getCharWidth()
312   {
313     return charWidth;
314   }
315
316   /**
317    * 
318    * 
319    * @return flag indicating if colourchanges propagated to all groups
320    */
321   @Override
322   public boolean getColourAppliesToAllGroups()
323   {
324     return colourAppliesToAllGroups;
325   }
326
327   /**
328    * DOCUMENT ME!
329    * 
330    * @return DOCUMENT ME!
331    */
332   @Override
333   public boolean getColourText()
334   {
335     return showColourText;
336   }
337
338   /**
339    * GUI state
340    * 
341    * @return true if conservation based shading is enabled
342    */
343   @Override
344   public boolean getConservationSelected()
345   {
346     return conservationColourSelected;
347   }
348
349   /**
350    * GUI State
351    * 
352    * @return get scalar for bleaching colourschemes by conservation
353    */
354   @Override
355   public int getIncrement()
356   {
357     return increment;
358   }
359
360   /**
361    * DOCUMENT ME!
362    * 
363    * @return DOCUMENT ME!
364    */
365   @Override
366   public boolean getScaleAboveWrapped()
367   {
368     return scaleAboveWrapped;
369   }
370
371   /**
372    * DOCUMENT ME!
373    * 
374    * @return DOCUMENT ME!
375    */
376   @Override
377   public boolean getScaleLeftWrapped()
378   {
379     return scaleLeftWrapped;
380   }
381
382   /**
383    * DOCUMENT ME!
384    * 
385    * @return DOCUMENT ME!
386    */
387   @Override
388   public boolean getScaleRightWrapped()
389   {
390     return scaleRightWrapped;
391   }
392
393   /**
394    * DOCUMENT ME!
395    * 
396    * @return DOCUMENT ME!
397    */
398   @Override
399   public boolean getShowBoxes()
400   {
401     return showBoxes;
402   }
403
404   @Override
405   public boolean getShowHiddenMarkers()
406   {
407     return showHiddenMarkers;
408   }
409
410   /**
411    * DOCUMENT ME!
412    * 
413    * @return DOCUMENT ME!
414    */
415   @Override
416   public boolean getShowJVSuffix()
417   {
418     return showJVSuffix;
419   }
420
421   /**
422    * DOCUMENT ME!
423    * 
424    * @return DOCUMENT ME!
425    */
426   @Override
427   public boolean getShowText()
428   {
429     return showText;
430   }
431
432   @Override
433   public boolean getShowUnconserved()
434   {
435     return showUnconserved;
436   }
437
438   /**
439    * @return the textColour
440    */
441   @Override
442   public Color getTextColour()
443   {
444     return textColour;
445   }
446
447   /**
448    * @return the textColour2
449    */
450   @Override
451   public Color getTextColour2()
452   {
453     return textColour2;
454   }
455
456   /**
457    * DOCUMENT ME!
458    * 
459    * @return DOCUMENT ME!
460    */
461   @Override
462   public int getThreshold()
463   {
464     return threshold;
465   }
466
467   /**
468    * @return the thresholdTextColour
469    */
470   @Override
471   public int getThresholdTextColour()
472   {
473     return thresholdTextColour;
474   }
475
476   /**
477    * DOCUMENT ME!
478    * 
479    * @return DOCUMENT ME!
480    */
481   @Override
482   public boolean getWrapAlignment()
483   {
484     return wrapAlignment;
485   }
486
487   /**
488    * DOCUMENT ME!
489    * 
490    * @return DOCUMENT ME!
491    */
492   @Override
493   public int getWrappedWidth()
494   {
495     return wrappedWidth;
496   }
497
498   @Override
499   public boolean isColourByReferenceSeq()
500   {
501     return colourByReferenceSeq;
502   }
503
504   /**
505    * @return the conservationColourSelected
506    */
507   @Override
508   public boolean isConservationColourSelected()
509   {
510     return conservationColourSelected;
511   }
512
513   @Override
514   public boolean isDisplayReferenceSeq()
515   {
516     return displayReferenceSeq;
517   }
518
519   /**
520    * @return the renderGaps
521    */
522   @Override
523   public boolean isRenderGaps()
524   {
525     return renderGaps;
526   }
527
528   @Override
529   public boolean isRightAlignIds()
530   {
531     return rightAlignIds;
532   }
533
534   /**
535    * @return the seqNameItalics
536    */
537   @Override
538   public boolean isSeqNameItalics()
539   {
540     return seqNameItalics;
541   }
542
543   @Override
544   public boolean isShowAnnotation()
545   {
546     return showAnnotation;
547   }
548
549   /**
550    * @return the showColourText
551    */
552   @Override
553   public boolean isShowColourText()
554   {
555     return showColourText;
556   }
557
558   /**
559    * @return the showSeqFeaturesHeight
560    */
561   @Override
562   public boolean isShowSeqFeaturesHeight()
563   {
564     return showSeqFeaturesHeight;
565   }
566
567   @Override
568   public boolean isShowSequenceFeatures()
569   {
570     return showSequenceFeatures;
571   }
572
573   @Override
574   public boolean isShowSequenceFeaturesHeight()
575   {
576
577     return showSeqFeaturesHeight;
578   }
579
580   /**
581    * GUI state
582    * 
583    * 
584    * @param b
585    *          indicate if percent identity threshold is applied to shading
586    */
587   @Override
588   public void setAbovePIDThreshold(boolean b)
589   {
590     abovePIDThreshold = b;
591   }
592
593   
594   /**
595    * DOCUMENT ME!
596    * 
597    * @param h
598    *          DOCUMENT ME!
599    */
600   @Override
601   public void setCharHeight(int h)
602   {
603     this.charHeight = h;
604   }
605
606   /**
607    * DOCUMENT ME!
608    * 
609    * @param w
610    *          DOCUMENT ME!
611    */
612   @Override
613   public void setCharWidth(int w)
614   {
615     this.charWidth = w;
616   }
617
618
619   /**
620    * @param value
621    *          indicating if subsequent colourscheme changes will be propagated
622    *          to all groups
623    */
624   @Override
625   public void setColourAppliesToAllGroups(boolean b)
626   {
627     colourAppliesToAllGroups = b;
628   }
629
630   @Override
631   public void setColourByReferenceSeq(boolean colourByReferenceSeq)
632   {
633     this.colourByReferenceSeq = colourByReferenceSeq;
634   }
635
636   /**
637    * DOCUMENT ME!
638    * 
639    * @param state
640    *          DOCUMENT ME!
641    */
642   @Override
643   public void setColourText(boolean state)
644   {
645     showColourText = state;
646   }
647
648   /**
649    * @param conservationColourSelected
650    *          the conservationColourSelected to set
651    */
652   @Override
653   public void setConservationColourSelected(
654           boolean conservationColourSelected)
655   {
656     this.conservationColourSelected = conservationColourSelected;
657   }
658
659   /**
660    * GUI state
661    * 
662    * @param b
663    *          enable conservation based shading
664    */
665   @Override
666   public void setConservationSelected(boolean b)
667   {
668     conservationColourSelected = b;
669   }
670
671   @Override
672   public void setDisplayReferenceSeq(boolean displayReferenceSeq)
673   {
674     this.displayReferenceSeq = displayReferenceSeq;
675   }
676
677   /**
678    * 
679    * @param inc
680    *          set the scalar for bleaching colourschemes according to degree of
681    *          conservation
682    */
683   @Override
684   public void setIncrement(int inc)
685   {
686     increment = inc;
687   }
688
689   /**
690    * DOCUMENT ME!
691    * 
692    * @param state
693    *          DOCUMENT ME!
694    */
695   @Override
696   public void setRenderGaps(boolean state)
697   {
698     renderGaps = state;
699   }
700
701   @Override
702   public void setRightAlignIds(boolean rightAlignIds)
703   {
704     this.rightAlignIds = rightAlignIds;
705   }
706
707   /**
708    * DOCUMENT ME!
709    * 
710    * @param b
711    *          DOCUMENT ME!
712    */
713   @Override
714   public void setScaleAboveWrapped(boolean b)
715   {
716     scaleAboveWrapped = b;
717   }
718
719   /**
720    * DOCUMENT ME!
721    * 
722    * @param b
723    *          DOCUMENT ME!
724    */
725   @Override
726   public void setScaleLeftWrapped(boolean b)
727   {
728     scaleLeftWrapped = b;
729   }
730
731   /**
732    * 
733    * 
734    * @param scaleRightWrapped
735    *          - true or false
736    */
737
738   @Override
739   public void setScaleRightWrapped(boolean b)
740   {
741     scaleRightWrapped = b;
742   }
743
744   @Override
745   public void setSeqNameItalics(boolean italics)
746   {
747     seqNameItalics = italics;
748   }
749
750   @Override
751   public void setShowAnnotation(boolean b)
752   {
753     showAnnotation = b;
754   }
755
756   /**
757    * DOCUMENT ME!
758    * 
759    * @param state
760    *          DOCUMENT ME!
761    */
762   @Override
763   public void setShowBoxes(boolean state)
764   {
765     showBoxes = state;
766   }
767
768   /**
769    * @param showColourText
770    *          the showColourText to set
771    */
772   @Override
773   public void setShowColourText(boolean showColourText)
774   {
775     this.showColourText = showColourText;
776   }
777
778   @Override
779   public void setShowHiddenMarkers(boolean show)
780   {
781     showHiddenMarkers = show;
782   }
783
784   /**
785    * DOCUMENT ME!
786    * 
787    * @param b
788    *          DOCUMENT ME!
789    */
790   @Override
791   public void setShowJVSuffix(boolean b)
792   {
793     showJVSuffix = b;
794   }
795
796   @Override
797   public void setShowSeqFeaturesHeight(boolean selected)
798   {
799     showSeqFeaturesHeight = selected;
800
801   }
802
803   /**
804    * set the flag
805    * 
806    * @param b
807    *          features are displayed if true
808    */
809   @Override
810   public void setShowSequenceFeatures(boolean b)
811   {
812     showSequenceFeatures = b;
813   }
814
815   /**
816    * DOCUMENT ME!
817    * 
818    * @param state
819    *          DOCUMENT ME!
820    */
821   @Override
822   public void setShowText(boolean state)
823   {
824     showText = state;
825   }
826
827   @Override
828   public void setShowUnconserved(boolean showunconserved)
829   {
830     showUnconserved = showunconserved;
831   }
832
833   /**
834    * @param textColour
835    *          the textColour to set
836    */
837   @Override
838   public void setTextColour(Color textColour)
839   {
840     this.textColour = textColour;
841   }
842
843   /**
844    * @param textColour2
845    *          the textColour2 to set
846    */
847   @Override
848   public void setTextColour2(Color textColour2)
849   {
850     this.textColour2 = textColour2;
851   }
852
853   /**
854    * DOCUMENT ME!
855    * 
856    * @param thresh
857    *          DOCUMENT ME!
858    */
859   @Override
860   public void setThreshold(int thresh)
861   {
862     threshold = thresh;
863   }
864
865   /**
866    * @param thresholdTextColour
867    *          the thresholdTextColour to set
868    */
869   @Override
870   public void setThresholdTextColour(int thresholdTextColour)
871   {
872     this.thresholdTextColour = thresholdTextColour;
873   }
874
875   /**
876    * DOCUMENT ME!
877    * 
878    * @param state
879    *          DOCUMENT ME!
880    */
881   @Override
882   public void setWrapAlignment(boolean state)
883   {
884     wrapAlignment = state;
885   }
886
887   /**
888    * DOCUMENT ME!
889    * 
890    * @param w
891    *          DOCUMENT ME!
892    */
893   @Override
894   public void setWrappedWidth(int w)
895   {
896     this.wrappedWidth = w;
897   }
898
899   @Override
900   public boolean sameStyle(ViewStyleI them)
901   {
902     return equivalent(this, them);
903   }
904
905   @Override
906   public String getFontName()
907   {
908     return fontName;
909   }
910
911   @Override
912   public int getFontSize()
913   {
914     return fontSize;
915   }
916
917   @Override
918   public int getFontStyle()
919   {
920     return fontStyle;
921   }
922
923   @Override
924   public void setFontName(String name)
925   {
926     fontName = name;
927   }
928
929   @Override
930   public void setFontSize(int size)
931   {
932     fontSize = size;
933
934   }
935
936   @Override
937   public void setFontStyle(int style)
938   {
939     fontStyle = style;
940   }
941
942   @Override
943   public int getIdWidth()
944   {
945     return idWidth;
946   }
947
948   /**
949    * @param idWidth
950    *          the idWidth to set
951    */
952   @Override
953   public void setIdWidth(int idWidth)
954   {
955     this.idWidth = idWidth;
956   }
957
958   /**
959    * @return the centreColumnLabels
960    */
961   @Override
962   public boolean isCentreColumnLabels()
963   {
964     return centreColumnLabels;
965   }
966
967   /**
968    * @param centreColumnLabels
969    *          the centreColumnLabels to set
970    */
971   @Override
972   public void setCentreColumnLabels(boolean centreColumnLabels)
973   {
974     this.centreColumnLabels = centreColumnLabels;
975   }
976
977   /**
978    * @return the showdbrefs
979    */
980   @Override
981   public boolean isShowDBRefs()
982   {
983     return showdbrefs;
984   }
985
986   /**
987    * @param showdbrefs
988    *          the showdbrefs to set
989    */
990   @Override
991   public void setShowDBRefs(boolean showdbrefs)
992   {
993     this.showdbrefs = showdbrefs;
994   }
995
996   /**
997    * @return the shownpfeats
998    */
999   @Override
1000   public boolean isShowNPFeats()
1001   {
1002     return shownpfeats;
1003   }
1004
1005   /**
1006    * @param shownpfeats
1007    *          the shownpfeats to set
1008    */
1009   @Override
1010   public void setShowNPFeats(boolean shownpfeats)
1011   {
1012     this.shownpfeats = shownpfeats;
1013   }
1014
1015   @Override
1016   public boolean isScaleProteinAsCdna()
1017   {
1018     return this.scaleProteinAsCdna;
1019   }
1020
1021   @Override
1022   public void setScaleProteinAsCdna(boolean b)
1023   {
1024     this.scaleProteinAsCdna = b;
1025   }
1026 }