--- /dev/null
+package jalview.viewmodel.styles;
+
+import jalview.api.ViewStyleI;
+
+import java.awt.Color;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+
+/**
+ * A container for holding alignment view properties. View properties are
+ * data-independent, which means they can be safely copied between views
+ * involving different alignment data without causing exceptions in the
+ * rendering system.
+ *
+ * @author jprocter
+ *
+ */
+public class ViewStyle implements ViewStyleI
+{
+
+ private boolean abovePIDThreshold = false;
+
+ int charHeight;
+
+ int charWidth;
+
+ int idWidth = -1;
+
+ /**
+ * gui state - changes to colour scheme propagated to all groups
+ */
+ private boolean colourAppliesToAllGroups;
+
+ /**
+ * centre columnar annotation labels in displayed alignment annotation
+ */
+ boolean centreColumnLabels = false;
+
+ private boolean showdbrefs;
+
+ private boolean shownpfeats;
+
+ // --------END Structure Conservation
+
+ /**
+ * colour according to the reference sequence defined on the alignment
+ */
+ private boolean colourByReferenceSeq = false;
+
+ boolean conservationColourSelected = false;
+
+ /**
+ * show the reference sequence in the alignment view
+ */
+ private boolean displayReferenceSeq = false;
+
+ private int increment;
+
+ /**
+ * display gap characters
+ */
+ boolean renderGaps = true;
+
+ private boolean rightAlignIds = false;
+
+ boolean scaleAboveWrapped = false;
+
+ boolean scaleLeftWrapped = true;
+
+ boolean scaleRightWrapped = true;
+
+ boolean seqNameItalics;
+
+ /**
+ * show annotation tracks on the alignment
+ */
+ private boolean showAnnotation = true;
+
+ /**
+ * render each residue in a coloured box
+ */
+ boolean showBoxes = true;
+
+ /**
+ * Colour sequence text
+ */
+ boolean showColourText = false;
+
+ /**
+ * show blue triangles
+ */
+ boolean showHiddenMarkers = true;
+
+ /**
+ * show /start-end in ID panel
+ */
+ boolean showJVSuffix = true;
+
+ /**
+ * scale features height according to score
+ */
+ boolean showSeqFeaturesHeight;
+
+ /**
+ * display setting for showing/hiding sequence features on alignment view
+ */
+ boolean showSequenceFeatures = false;
+
+ /**
+ * display sequence symbols
+ */
+ boolean showText = true;
+
+ /**
+ * show non-conserved residues only
+ */
+ protected boolean showUnconserved = false;
+
+ Color textColour = Color.black;
+
+ Color textColour2 = Color.white;
+
+ /**
+ * PID or consensus threshold
+ */
+ int threshold;
+
+ /**
+ * threshold for switching between textColour & textColour2
+ */
+ int thresholdTextColour = 0;
+
+ /**
+ * upper case characters in sequence are shown in bold
+ */
+ boolean upperCasebold = false;
+
+ /**
+ * name of base font for view
+ */
+ private String fontName;
+ /**
+ * size for base font
+ */
+ private int fontSize;
+
+ public ViewStyle(ViewStyleI viewStyle)
+ {
+ ViewStyle.configureFrom(this, viewStyle);
+ }
+
+ public ViewStyle()
+ {
+ }
+
+ private static HashMap<String, Method> getters, isErs, setters;
+ static
+ {
+ getters = new HashMap<String, Method>();
+ isErs = new HashMap<String, Method>();
+ setters = new HashMap<String, Method>();
+ // Match Getters and Setters
+ for (Method m : ViewStyleI.class.getMethods())
+ {
+ if (m.getDeclaringClass() == ViewStyleI.class)
+ {
+ if (m.getName().startsWith("get"))
+ {
+ getters.put(m.getName().substring(3), m);
+ }
+ if (m.getName().startsWith("is"))
+ {
+ isErs.put(m.getName().substring(2), m);
+ }
+ if (m.getName().startsWith("set"))
+ {
+ setters.put(m.getName().substring(3), m);
+ }
+ }
+ }
+ }
+
+ private static void configureFrom(ViewStyle us, ViewStyleI viewStyle)
+ {
+ // try and do the set thing
+ for (String prop : setters.keySet())
+ {
+ Method getter = getters.get(prop);
+ Method setter = setters.get(prop);
+ if (getter == null)
+ {
+ getter = isErs.get(prop);
+ }
+ if (getter != null && setter != null)
+ {
+ try
+ {
+ setter.invoke(us, getter.invoke(viewStyle));
+ } catch (Exception q)
+ {
+ System.err.println("Unexpected exception setting view property "
+ + prop + " by reflection");
+ q.printStackTrace();
+ }
+
+ }
+ }
+ }
+
+ private static boolean equivalent(ViewStyle us, ViewStyleI them)
+ {
+ // look for properties we can set
+ for (String prop : setters.keySet())
+ {
+ Method getter = getters.get(prop);
+ if (getter == null)
+ {
+ getter = isErs.get(prop);
+ }
+ if (getter != null)
+ {
+ try
+ {
+ if (!getter.invoke(them).equals(getter.invoke(us)))
+ {
+ return false;
+ }
+ } catch (Exception q)
+ {
+ System.err.println("Unexpected exception testing equivalence of property "
+ + prop + " by reflection");
+ q.printStackTrace();
+ }
+ }
+ }
+
+ return true;
+ }
+
+ public boolean equals(ViewStyleI other)
+ {
+ return other == null ? false : equivalent(this, other);
+ }
+
+ /**
+ * @return the upperCasebold
+ */
+ @Override
+ public boolean isUpperCasebold()
+ {
+ return upperCasebold;
+ }
+
+ /**
+ * @param upperCasebold
+ * the upperCasebold to set
+ */
+ @Override
+ public void setUpperCasebold(boolean upperCasebold)
+ {
+ this.upperCasebold = upperCasebold;
+ }
+
+ /**
+ * flag for wrapping
+ */
+ boolean wrapAlignment = false;
+
+ /**
+ * number columns in wrapped alignment
+ */
+ int wrappedWidth;
+
+ private int fontStyle;
+
+ /**
+ * GUI state
+ *
+ * @return true if percent identity threshold is applied to shading
+ */
+ @Override
+ public boolean getAbovePIDThreshold()
+ {
+ return abovePIDThreshold;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ @Override
+ public int getCharHeight()
+ {
+ return charHeight;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ @Override
+ public int getCharWidth()
+ {
+ return charWidth;
+ }
+
+ /**
+ *
+ *
+ * @return flag indicating if colourchanges propagated to all groups
+ */
+ @Override
+ public boolean getColourAppliesToAllGroups()
+ {
+ return colourAppliesToAllGroups;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ @Override
+ public boolean getColourText()
+ {
+ return showColourText;
+ }
+
+ /**
+ * GUI state
+ *
+ * @return true if conservation based shading is enabled
+ */
+ @Override
+ public boolean getConservationSelected()
+ {
+ return conservationColourSelected;
+ }
+
+ /**
+ * GUI State
+ *
+ * @return get scalar for bleaching colourschemes by conservation
+ */
+ @Override
+ public int getIncrement()
+ {
+ return increment;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ @Override
+ public boolean getScaleAboveWrapped()
+ {
+ return scaleAboveWrapped;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ @Override
+ public boolean getScaleLeftWrapped()
+ {
+ return scaleLeftWrapped;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ @Override
+ public boolean getScaleRightWrapped()
+ {
+ return scaleRightWrapped;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ @Override
+ public boolean getShowBoxes()
+ {
+ return showBoxes;
+ }
+
+ @Override
+ public boolean getShowHiddenMarkers()
+ {
+ return showHiddenMarkers;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ @Override
+ public boolean getShowJVSuffix()
+ {
+ return showJVSuffix;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ @Override
+ public boolean getShowText()
+ {
+ return showText;
+ }
+
+ @Override
+ public boolean getShowUnconserved()
+ {
+ return showUnconserved;
+ }
+
+ /**
+ * @return the textColour
+ */
+ @Override
+ public Color getTextColour()
+ {
+ return textColour;
+ }
+
+ /**
+ * @return the textColour2
+ */
+ @Override
+ public Color getTextColour2()
+ {
+ return textColour2;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ @Override
+ public int getThreshold()
+ {
+ return threshold;
+ }
+
+ /**
+ * @return the thresholdTextColour
+ */
+ @Override
+ public int getThresholdTextColour()
+ {
+ return thresholdTextColour;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ @Override
+ public boolean getWrapAlignment()
+ {
+ return wrapAlignment;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ @Override
+ public int getWrappedWidth()
+ {
+ return wrappedWidth;
+ }
+
+ @Override
+ public boolean isColourByReferenceSeq()
+ {
+ return colourByReferenceSeq;
+ }
+
+ /**
+ * @return the conservationColourSelected
+ */
+ @Override
+ public boolean isConservationColourSelected()
+ {
+ return conservationColourSelected;
+ }
+
+ @Override
+ public boolean isDisplayReferenceSeq()
+ {
+ return displayReferenceSeq;
+ }
+
+ /**
+ * @return the renderGaps
+ */
+ @Override
+ public boolean isRenderGaps()
+ {
+ return renderGaps;
+ }
+
+ @Override
+ public boolean isRightAlignIds()
+ {
+ return rightAlignIds;
+ }
+
+ /**
+ * @return the seqNameItalics
+ */
+ @Override
+ public boolean isSeqNameItalics()
+ {
+ return seqNameItalics;
+ }
+
+ @Override
+ public boolean isShowAnnotation()
+ {
+ return showAnnotation;
+ }
+
+ /**
+ * @return the showColourText
+ */
+ @Override
+ public boolean isShowColourText()
+ {
+ return showColourText;
+ }
+
+ /**
+ * @return the showSeqFeaturesHeight
+ */
+ @Override
+ public boolean isShowSeqFeaturesHeight()
+ {
+ return showSeqFeaturesHeight;
+ }
+
+ @Override
+ public boolean isShowSequenceFeatures()
+ {
+ return showSequenceFeatures;
+ }
+
+ @Override
+ public boolean isShowSequenceFeaturesHeight()
+ {
+
+ return showSeqFeaturesHeight;
+ }
+
+ /**
+ * GUI state
+ *
+ *
+ * @param b
+ * indicate if percent identity threshold is applied to shading
+ */
+ @Override
+ public void setAbovePIDThreshold(boolean b)
+ {
+ abovePIDThreshold = b;
+ }
+
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param h
+ * DOCUMENT ME!
+ */
+ @Override
+ public void setCharHeight(int h)
+ {
+ this.charHeight = h;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param w
+ * DOCUMENT ME!
+ */
+ @Override
+ public void setCharWidth(int w)
+ {
+ this.charWidth = w;
+ }
+
+
+ /**
+ * @param value
+ * indicating if subsequent colourscheme changes will be propagated
+ * to all groups
+ */
+ @Override
+ public void setColourAppliesToAllGroups(boolean b)
+ {
+ colourAppliesToAllGroups = b;
+ }
+
+ @Override
+ public void setColourByReferenceSeq(boolean colourByReferenceSeq)
+ {
+ this.colourByReferenceSeq = colourByReferenceSeq;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param state
+ * DOCUMENT ME!
+ */
+ @Override
+ public void setColourText(boolean state)
+ {
+ showColourText = state;
+ }
+
+ /**
+ * @param conservationColourSelected
+ * the conservationColourSelected to set
+ */
+ @Override
+ public void setConservationColourSelected(
+ boolean conservationColourSelected)
+ {
+ this.conservationColourSelected = conservationColourSelected;
+ }
+
+ /**
+ * GUI state
+ *
+ * @param b
+ * enable conservation based shading
+ */
+ @Override
+ public void setConservationSelected(boolean b)
+ {
+ conservationColourSelected = b;
+ }
+
+ @Override
+ public void setDisplayReferenceSeq(boolean displayReferenceSeq)
+ {
+ this.displayReferenceSeq = displayReferenceSeq;
+ }
+
+ /**
+ *
+ * @param inc
+ * set the scalar for bleaching colourschemes according to degree of
+ * conservation
+ */
+ @Override
+ public void setIncrement(int inc)
+ {
+ increment = inc;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param state
+ * DOCUMENT ME!
+ */
+ @Override
+ public void setRenderGaps(boolean state)
+ {
+ renderGaps = state;
+ }
+
+ @Override
+ public void setRightAlignIds(boolean rightAlignIds)
+ {
+ this.rightAlignIds = rightAlignIds;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param b
+ * DOCUMENT ME!
+ */
+ @Override
+ public void setScaleAboveWrapped(boolean b)
+ {
+ scaleAboveWrapped = b;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param b
+ * DOCUMENT ME!
+ */
+ @Override
+ public void setScaleLeftWrapped(boolean b)
+ {
+ scaleLeftWrapped = b;
+ }
+
+ /**
+ *
+ *
+ * @param scaleRightWrapped
+ * - true or false
+ */
+
+ @Override
+ public void setScaleRightWrapped(boolean b)
+ {
+ scaleRightWrapped = b;
+ }
+
+ @Override
+ public void setSeqNameItalics(boolean italics)
+ {
+ seqNameItalics = italics;
+ }
+
+ @Override
+ public void setShowAnnotation(boolean b)
+ {
+ showAnnotation = b;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param state
+ * DOCUMENT ME!
+ */
+ @Override
+ public void setShowBoxes(boolean state)
+ {
+ showBoxes = state;
+ }
+
+ /**
+ * @param showColourText
+ * the showColourText to set
+ */
+ @Override
+ public void setShowColourText(boolean showColourText)
+ {
+ this.showColourText = showColourText;
+ }
+
+ @Override
+ public void setShowHiddenMarkers(boolean show)
+ {
+ showHiddenMarkers = show;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param b
+ * DOCUMENT ME!
+ */
+ @Override
+ public void setShowJVSuffix(boolean b)
+ {
+ showJVSuffix = b;
+ }
+
+ @Override
+ public void setShowSeqFeaturesHeight(boolean selected)
+ {
+ showSeqFeaturesHeight = selected;
+
+ }
+
+ /**
+ * set the flag
+ *
+ * @param b
+ * features are displayed if true
+ */
+ @Override
+ public void setShowSequenceFeatures(boolean b)
+ {
+ showSequenceFeatures = b;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param state
+ * DOCUMENT ME!
+ */
+ @Override
+ public void setShowText(boolean state)
+ {
+ showText = state;
+ }
+
+ @Override
+ public void setShowUnconserved(boolean showunconserved)
+ {
+ showUnconserved = showunconserved;
+ }
+
+ /**
+ * @param textColour
+ * the textColour to set
+ */
+ @Override
+ public void setTextColour(Color textColour)
+ {
+ this.textColour = textColour;
+ }
+
+ /**
+ * @param textColour2
+ * the textColour2 to set
+ */
+ @Override
+ public void setTextColour2(Color textColour2)
+ {
+ this.textColour2 = textColour2;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param thresh
+ * DOCUMENT ME!
+ */
+ @Override
+ public void setThreshold(int thresh)
+ {
+ threshold = thresh;
+ }
+
+ /**
+ * @param thresholdTextColour
+ * the thresholdTextColour to set
+ */
+ @Override
+ public void setThresholdTextColour(int thresholdTextColour)
+ {
+ this.thresholdTextColour = thresholdTextColour;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param state
+ * DOCUMENT ME!
+ */
+ @Override
+ public void setWrapAlignment(boolean state)
+ {
+ wrapAlignment = state;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param w
+ * DOCUMENT ME!
+ */
+ @Override
+ public void setWrappedWidth(int w)
+ {
+ this.wrappedWidth = w;
+ }
+
+ @Override
+ public boolean sameStyle(ViewStyleI them)
+ {
+ return equivalent(this, them);
+ }
+
+ @Override
+ public String getFontName()
+ {
+ return fontName;
+ }
+
+ @Override
+ public int getFontSize()
+ {
+ return fontSize;
+ }
+
+ @Override
+ public int getFontStyle()
+ {
+ return fontStyle;
+ }
+
+ @Override
+ public void setFontName(String name)
+ {
+ fontName = name;
+ }
+
+ @Override
+ public void setFontSize(int size)
+ {
+ fontSize = size;
+
+ }
+
+ @Override
+ public void setFontStyle(int style)
+ {
+ fontStyle = style;
+ }
+
+ @Override
+ public int getIdWidth()
+ {
+ return idWidth;
+ }
+
+ /**
+ * @param idWidth
+ * the idWidth to set
+ */
+ @Override
+ public void setIdWidth(int idWidth)
+ {
+ this.idWidth = idWidth;
+ }
+
+ /**
+ * @return the centreColumnLabels
+ */
+ @Override
+ public boolean isCentreColumnLabels()
+ {
+ return centreColumnLabels;
+ }
+
+ /**
+ * @param centreColumnLabels
+ * the centreColumnLabels to set
+ */
+ @Override
+ public void setCentreColumnLabels(boolean centreColumnLabels)
+ {
+ this.centreColumnLabels = centreColumnLabels;
+ }
+
+ /**
+ * @return the showdbrefs
+ */
+ @Override
+ public boolean isShowDBRefs()
+ {
+ return showdbrefs;
+ }
+
+ /**
+ * @param showdbrefs
+ * the showdbrefs to set
+ */
+ @Override
+ public void setShowDBRefs(boolean showdbrefs)
+ {
+ this.showdbrefs = showdbrefs;
+ }
+
+ /**
+ * @return the shownpfeats
+ */
+ @Override
+ public boolean isShowNPFeats()
+ {
+ return shownpfeats;
+ }
+
+ /**
+ * @param shownpfeats
+ * the shownpfeats to set
+ */
+ @Override
+ public void setShowNPFeats(boolean shownpfeats)
+ {
+ this.shownpfeats = shownpfeats;
+ }
+}