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