+/*
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9)
+ * Copyright (C) 2015 The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
package jalview.viewmodel.styles;
-import java.awt.Color;
-import java.lang.reflect.Method;
-import java.util.HashMap;
-
import jalview.api.ViewStyleI;
+import java.awt.Color;
+
/**
* A container for holding alignment view properties. View properties are
* data-independent, which means they can be safely copied between views
*/
public class ViewStyle implements ViewStyleI
{
-
private boolean abovePIDThreshold = false;
int charHeight;
*/
private boolean scaleProteinAsCdna = true;
- public ViewStyle(ViewStyleI viewStyle)
- {
- ViewStyle.configureFrom(this, viewStyle);
+ /**
+ * Copy constructor
+ *
+ * @param vs
+ */
+ public ViewStyle(ViewStyleI vs)
+ {
+ setAbovePIDThreshold(vs.getAbovePIDThreshold());
+ setCentreColumnLabels(vs.isCentreColumnLabels());
+ setCharHeight(vs.getCharHeight());
+ setCharWidth(vs.getCharWidth());
+ setColourAppliesToAllGroups(vs.getColourAppliesToAllGroups());
+ setColourByReferenceSeq(vs.isColourByReferenceSeq());
+ setColourText(vs.getColourText());
+ setConservationColourSelected(vs.isConservationColourSelected());
+ setConservationSelected(vs.getConservationSelected());
+ setDisplayReferenceSeq(vs.isDisplayReferenceSeq());
+ setFontName(vs.getFontName());
+ setFontSize(vs.getFontSize());
+ setFontStyle(vs.getFontStyle());
+ setIdWidth(vs.getIdWidth());
+ setIncrement(vs.getIncrement());
+ setRenderGaps(vs.isRenderGaps());
+ setRightAlignIds(vs.isRightAlignIds());
+ setScaleAboveWrapped(vs.getScaleAboveWrapped());
+ setScaleLeftWrapped(vs.getScaleLeftWrapped());
+ setScaleProteinAsCdna(vs.isScaleProteinAsCdna());
+ setScaleRightWrapped(vs.getScaleRightWrapped());
+ setSeqNameItalics(vs.isSeqNameItalics());
+ setShowAnnotation(vs.isShowAnnotation());
+ setShowBoxes(vs.getShowBoxes());
+ setShowColourText(vs.isShowColourText());
+ setShowDBRefs(vs.isShowDBRefs());
+ setShowHiddenMarkers(vs.getShowHiddenMarkers());
+ setShowJVSuffix(vs.getShowJVSuffix());
+ setShowNPFeats(vs.isShowNPFeats());
+ setShowSequenceFeaturesHeight(vs.isShowSequenceFeaturesHeight());
+ setShowSequenceFeatures(vs.isShowSequenceFeatures());
+ setShowText(vs.getShowText());
+ setShowUnconserved(vs.getShowUnconserved());
+ setTextColour(vs.getTextColour());
+ setTextColour2(vs.getTextColour2());
+ setThreshold(vs.getThreshold());
+ setThresholdTextColour(vs.getThresholdTextColour());
+ setUpperCasebold(vs.isUpperCasebold());
+ setWrapAlignment(vs.getWrapAlignment());
+ setWrappedWidth(vs.getWrappedWidth());
+ // ViewStyle.configureFrom(this, viewStyle);
}
public ViewStyle()
{
}
- private static HashMap<String, Method> getters, isErs, setters;
- static
+ /**
+ * Returns true if all attributes of the ViewStyles have the same value
+ */
+ @Override
+ public boolean equals(Object other)
{
- 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())
+ if (other == null || !(other instanceof ViewStyle))
{
- 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 false;
}
-
- return true;
- }
-
- public boolean equals(ViewStyleI other)
- {
- return other == null ? false : equivalent(this, other);
+ ViewStyle vs = (ViewStyle) other;
+
+ boolean match = (getAbovePIDThreshold() == vs.getAbovePIDThreshold()
+ && isCentreColumnLabels() == vs.isCentreColumnLabels()
+ && getCharHeight() == vs.getCharHeight()
+ && getCharWidth() == vs.getCharWidth()
+ && getColourAppliesToAllGroups() == vs
+ .getColourAppliesToAllGroups()
+ && isColourByReferenceSeq() == vs.isColourByReferenceSeq()
+ && getColourText() == vs.getColourText()
+ && isConservationColourSelected() == vs
+ .isConservationColourSelected()
+ && getConservationSelected() == vs.getConservationSelected()
+ && isDisplayReferenceSeq() == vs.isDisplayReferenceSeq()
+ && getFontSize() == vs.getFontSize()
+ && getFontStyle() == vs.getFontStyle()
+ && getIdWidth() == vs.getIdWidth()
+ && getIncrement() == vs.getIncrement()
+ && isRenderGaps() == vs.isRenderGaps()
+ && isRightAlignIds() == vs.isRightAlignIds()
+ && getScaleAboveWrapped() == vs.getScaleAboveWrapped()
+ && getScaleLeftWrapped() == vs.getScaleLeftWrapped()
+ && isScaleProteinAsCdna() == vs.isScaleProteinAsCdna()
+ && getScaleRightWrapped() == vs.getScaleRightWrapped()
+ && isSeqNameItalics() == vs.isSeqNameItalics()
+ && isShowAnnotation() == vs.isShowAnnotation()
+ && getShowBoxes() == vs.getShowBoxes()
+ && isShowColourText() == vs.isShowColourText()
+ && isShowDBRefs() == vs.isShowDBRefs()
+ && getShowHiddenMarkers() == vs.getShowHiddenMarkers()
+ && getShowJVSuffix() == vs.getShowJVSuffix()
+ && isShowNPFeats() == vs.isShowNPFeats()
+ && isShowSequenceFeaturesHeight() == vs
+ .isShowSequenceFeaturesHeight()
+ && isShowSequenceFeatures() == vs.isShowSequenceFeatures()
+ && getShowText() == vs.getShowText()
+ && getShowUnconserved() == vs.getShowUnconserved()
+ && getThreshold() == vs.getThreshold()
+ && getThresholdTextColour() == vs.getThresholdTextColour()
+ && isUpperCasebold() == vs.isUpperCasebold()
+ && getWrapAlignment() == vs.getWrapAlignment() && getWrappedWidth() == vs
+ .getWrappedWidth());
+ /*
+ * and compare non-primitive types; syntax below will match null with null
+ * values
+ */
+ match = match
+ && String.valueOf(getFontName()).equals(
+ String.valueOf(vs.getFontName()));
+ match = match
+ && String.valueOf(getTextColour()).equals(
+ String.valueOf(vs.getTextColour()));
+ match = match
+ && String.valueOf(getTextColour2()).equals(
+ String.valueOf(vs.getTextColour2()));
+ return match;
+ // return equivalent(this, (ViewStyle) other);
+ }
+
+ /**
+ * Overridden to ensure that whenever vs1.equals(vs2) then vs1.hashCode() ==
+ * vs2.hashCode()
+ */
+ @Override
+ public int hashCode()
+ {
+ /*
+ * No need to include all properties, just a selection...
+ */
+ int hash = 0;
+ int m = 1;
+ // Boolean.hashCode returns 1231 or 1237
+ hash += m++ * Boolean.valueOf(this.abovePIDThreshold).hashCode();
+ hash += m++ * Boolean.valueOf(this.centreColumnLabels).hashCode();
+ hash += m++ * Boolean.valueOf(this.colourAppliesToAllGroups).hashCode();
+ hash += m++ * Boolean.valueOf(this.displayReferenceSeq).hashCode();
+ hash += m++ * Boolean.valueOf(this.renderGaps).hashCode();
+ hash += m++ * Boolean.valueOf(this.rightAlignIds).hashCode();
+ hash += m++ * Boolean.valueOf(this.scaleProteinAsCdna).hashCode();
+ hash += m++ * Boolean.valueOf(this.scaleRightWrapped).hashCode();
+ hash += m++ * Boolean.valueOf(this.seqNameItalics).hashCode();
+ hash += m++ * Boolean.valueOf(this.showAnnotation).hashCode();
+ hash += m++ * Boolean.valueOf(this.showBoxes).hashCode();
+ hash += m++ * Boolean.valueOf(this.showdbrefs).hashCode();
+ hash += m++ * Boolean.valueOf(this.showJVSuffix).hashCode();
+ hash += m++ * Boolean.valueOf(this.showSequenceFeatures).hashCode();
+ hash += m++ * Boolean.valueOf(this.showUnconserved).hashCode();
+ hash += m++ * Boolean.valueOf(this.wrapAlignment).hashCode();
+ hash += m++ * this.charHeight;
+ hash += m++ * this.charWidth;
+ hash += m++ * fontSize;
+ hash += m++ * fontStyle;
+ hash += m++ * idWidth;
+ hash += String.valueOf(this.fontName).hashCode();
+ return hash;
}
/**
* @return the showSeqFeaturesHeight
*/
@Override
- public boolean isShowSeqFeaturesHeight()
+ public boolean isShowSequenceFeaturesHeight()
{
return showSeqFeaturesHeight;
}
return showSequenceFeatures;
}
- @Override
- public boolean isShowSequenceFeaturesHeight()
- {
-
- return showSeqFeaturesHeight;
- }
-
/**
* GUI state
*
abovePIDThreshold = b;
}
-
/**
* DOCUMENT ME!
*
this.charWidth = w;
}
-
/**
* @param value
* indicating if subsequent colourscheme changes will be propagated
}
@Override
- public void setShowSeqFeaturesHeight(boolean selected)
+ public void setShowSequenceFeaturesHeight(boolean selected)
{
showSeqFeaturesHeight = selected;
}
@Override
- public boolean sameStyle(ViewStyleI them)
+ public boolean sameStyle(ViewStyleI that)
{
- return equivalent(this, them);
+ return this.equals(that);
}
@Override