/*
* This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
*
* Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium.
*
* The program is available in open source according to the GNU Affero
* General Public License. All contributions in this program are covered
* by the Geomajas Contributors License Agreement. For full licensing
* details, see LICENSE.txt in the project root.
*/
package org.geomajas.gwt2.client.gfx;
import org.geomajas.annotation.Api;
/**
* Style configuration object for shapes.
*
* @author Pieter De Graef
* @since 2.0.0
*/
@Api(allMethods = true)
public class ShapeStyle {
private static final int PRIME = 31;
private String fillColor;
private float fillOpacity = -1;
private String strokeColor;
private float strokeOpacity = -1;
private int strokeWidth = -1;
private String dashArray;
/**
* No args constructor for configuration and GWT.
*/
public ShapeStyle() {
// NOSONAR nothing to do
}
/**
* Copy constructor. Creates a deep copy of the specified {@link ShapeStyle} object.
*
* @param other the feature style to copy
*/
public ShapeStyle(ShapeStyle other) {
setDashArray(other.getDashArray());
setFillColor(other.getFillColor());
setFillOpacity(other.getFillOpacity());
setStrokeColor(other.getStrokeColor());
setStrokeOpacity(other.getStrokeOpacity());
setStrokeWidth(other.getStrokeWidth());
}
/**
* Applies default values to all properties that have not been set.
*/
public void applyDefaults() {
if (fillColor == null) {
fillColor = "#ffffff"; // white
}
if (strokeColor == null) {
strokeColor = "#000000"; // black
}
if (strokeOpacity == -1) {
strokeOpacity = 1; // fully opaque by default
}
if (fillOpacity == -1) {
fillOpacity = .5f; // 50% transparent by default
}
if (strokeWidth == -1) {
strokeWidth = 1; // white
}
}
/**
* Get fill colour.
*
* @return fill colour (in "#rrggbb" notation)
*/
public String getFillColor() {
return fillColor;
}
/**
* Set fill colour.
*
* @param fillColor fill colour (in "#rrggbb" notation)
*/
public void setFillColor(String fillColor) {
this.fillColor = fillColor;
}
/**
* Get fill opacity. The value should be in the [0,1] range, where 0 is fully transparent, and 1 is opaque.
*
* @return opacity for background fill
*/
public float getFillOpacity() {
return fillOpacity;
}
/**
* Set the fill opacity. The value should be in the [0,1] range, where 0 is fully transparent, and 1 is opaque.
*
* @param fillOpacity opacity for background fill
*/
public void setFillOpacity(float fillOpacity) {
this.fillOpacity = fillOpacity;
}
/**
* Get stroke colour.
*
* @return stroke colour (in "#rrggbb" notation)
*/
public String getStrokeColor() {
return strokeColor;
}
/**
* Set stroke colour.
*
* @param strokeColor stroke colour (in "#rrggbb" notation)
*/
public void setStrokeColor(String strokeColor) {
this.strokeColor = strokeColor;
}
/**
* Get stroke opacity. The value should be in the [0,1] range, where 0 is fully transparent, and 1 is opaque.
*
* @return opacity for stroke colour
*/
public float getStrokeOpacity() {
return strokeOpacity;
}
/**
* Set the stroke opacity. The value should be in the [0,1] range, where 0 is fully transparent, and 1 is opaque.
*
* @param strokeOpacity opacity for the stroke
*/
public void setStrokeOpacity(float strokeOpacity) {
this.strokeOpacity = strokeOpacity;
}
/**
* Get stroke width.
*
* @return stroke width
*/
public int getStrokeWidth() {
return strokeWidth;
}
/**
* Set stroke width.
*
* @param strokeWidth stroke width
*/
public void setStrokeWidth(int strokeWidth) {
this.strokeWidth = strokeWidth;
}
/**
* Get dash array to apply. When null, the line is solid.
*
* @return dash array, comma separated list of dash and gap lengths
*/
public String getDashArray() {
return dashArray;
}
/**
* Set the dash array to apply. When null, the line is solid.
*
* @param dashArray dash array, comma separated list of dash and gap lengths
*/
public void setDashArray(String dashArray) {
this.dashArray = dashArray;
}
@Override
public String toString() {
return "VectorObjectStyle { fillColor='" + fillColor + '\'' + ", fillOpacity=" + fillOpacity + ", " +
"strokeColor='" + strokeColor + '\'' + ", strokeOpacity=" + strokeOpacity + ", " +
"strokeWidth=" + strokeWidth + ", dashArray='" + dashArray + "\' }";
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof ShapeStyle)) {
return false;
}
ShapeStyle that = (ShapeStyle) o;
if (Float.compare(that.fillOpacity, fillOpacity) != 0) {
return false;
}
if (Float.compare(that.strokeOpacity, strokeOpacity) != 0) {
return false;
}
if (strokeWidth != that.strokeWidth) {
return false;
}
if (dashArray != null ? !dashArray.equals(that.dashArray) : that.dashArray != null) {
return false;
}
if (fillColor != null ? !fillColor.equals(that.fillColor) : that.fillColor != null) {
return false;
}
if (strokeColor != null ? !strokeColor.equals(that.strokeColor) : that.strokeColor != null) {
return false;
}
return true;
}
@Override
public int hashCode() {
int result = PRIME;
result = PRIME * result + (fillColor != null ? fillColor.hashCode() : 0);
result = PRIME * result + (fillOpacity != +0.0f ? (int) (fillOpacity * 10000) : 0);
result = PRIME * result + (strokeColor != null ? strokeColor.hashCode() : 0);
result = PRIME * result + (strokeOpacity != +0.0f ? (int) (strokeOpacity * 10000) : 0);
result = PRIME * result + strokeWidth;
result = PRIME * result + (dashArray != null ? dashArray.hashCode() : 0);
return result;
}
}