// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.mappaint.styleelement;
import java.util.Objects;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.visitor.paint.MapPaintSettings;
import org.openstreetmap.josm.data.osm.visitor.paint.StyledMapRenderer;
import org.openstreetmap.josm.gui.mappaint.Cascade;
import org.openstreetmap.josm.gui.mappaint.Environment;
import org.openstreetmap.josm.gui.mappaint.Keyword;
import org.openstreetmap.josm.gui.mappaint.styleelement.placement.PartiallyInsideAreaStrategy;
import org.openstreetmap.josm.gui.mappaint.styleelement.placement.PositionForAreaStrategy;
import org.openstreetmap.josm.gui.util.RotationAngle;
/**
* This class defines how an icon is rendered onto the area.
* @author Michael Zangl
* @since 11730
*/
public class AreaIconElement extends StyleElement {
/**
* The icon that is displayed on the center of the area.
*/
private final MapImage iconImage;
/**
* The rotation of the {@link #iconImageAngle}
*/
private final RotationAngle iconImageAngle;
/**
* The position of the icon inside the area.
*/
private final PositionForAreaStrategy iconPosition;
protected AreaIconElement(Cascade c, MapImage iconImage, RotationAngle iconImageAngle, PositionForAreaStrategy iconPosition) {
super(c, 4.8f);
this.iconImage = Objects.requireNonNull(iconImage, "iconImage");
this.iconImageAngle = Objects.requireNonNull(iconImageAngle, "iconImageAngle");
this.iconPosition = Objects.requireNonNull(iconPosition, "iconPosition");
}
@Override
public void paintPrimitive(OsmPrimitive osm, MapPaintSettings paintSettings, StyledMapRenderer painter,
boolean selected, boolean outermember, boolean member) {
if (painter.isShowIcons()) {
painter.drawAreaIcon(osm, iconImage, painter.isInactiveMode() || osm.isDisabled(), selected, member,
iconImageAngle.getRotationAngle(osm), iconPosition);
}
}
/**
* Create a new {@link AreaIconElement}
* @param env The current style definitions
* @return The area element or <code>null</code> if there is no icon.
*/
public static AreaIconElement create(final Environment env) {
final Cascade c = env.mc.getCascade(env.layer);
MapImage iconImage = NodeElement.createIcon(env);
if (iconImage != null) {
RotationAngle rotationAngle = NodeElement.createRotationAngle(env);
Keyword positionKeyword = c.get(AreaElement.ICON_POSITION, null, Keyword.class);
PositionForAreaStrategy position = PositionForAreaStrategy.forKeyword(positionKeyword, PartiallyInsideAreaStrategy.INSTANCE);
return new AreaIconElement(c, iconImage, rotationAngle, position);
} else {
return null;
}
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((iconImage == null) ? 0 : iconImage.hashCode());
result = prime * result + ((iconImageAngle == null) ? 0 : iconImageAngle.hashCode());
result = prime * result + ((iconPosition == null) ? 0 : iconPosition.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!super.equals(obj)) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
AreaIconElement other = (AreaIconElement) obj;
return Objects.equals(iconImage, other.iconImage) &&
Objects.equals(iconImageAngle, other.iconImageAngle) &&
Objects.equals(iconPosition, other.iconPosition);
}
@Override
public String toString() {
return "AreaIconElement{" + super.toString() + "iconImage=[" + iconImage + "] iconImageAngle=[" + iconImageAngle + "]}";
}
}