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