Merge remote-tracking branch 'origin/merge/JAL-845_JAL-1640' into
[jalview.git] / src / jalview / viewmodel / styles / ViewStyle.java
diff --git a/src/jalview/viewmodel/styles/ViewStyle.java b/src/jalview/viewmodel/styles/ViewStyle.java
new file mode 100644 (file)
index 0000000..1e97af4
--- /dev/null
@@ -0,0 +1,1007 @@
+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;
+  }
+}