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