/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.cismap.commons.features;
import com.vividsolutions.jts.geom.Geometry;
import java.awt.Paint;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.Set;
import de.cismet.cismap.commons.gui.piccolo.FeatureAnnotationSymbol;
import de.cismet.tools.collections.TypeSafeCollections;
/**
* DOCUMENT ME!
*
* @author srichter
* @version $Revision$, $Date$
*/
public class PureFeatureGroup implements FeatureGroup, StyledFeature {
//~ Instance fields --------------------------------------------------------
private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass());
private String myAttributeStringInParentFeature = null;
private FeatureGroup parentFeature = null;
private final Set<Feature> groupFeatures;
private final Collection<Feature> readOnlyGroupFeatures;
private Geometry enclosingGeometry;
// private boolean canBeSelected;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new PureFeatureGroup object.
*/
public PureFeatureGroup() {
this(Collections.EMPTY_LIST);
}
/**
* Creates a new PureFeatureGroup object.
*
* @param feature DOCUMENT ME!
*/
public PureFeatureGroup(final Feature feature) {
this();
groupFeatures.add(feature);
}
/**
* Creates a new PureFeatureGroup object.
*
* @param features DOCUMENT ME!
*/
public PureFeatureGroup(final Collection<? extends Feature> features) {
if ((features == null) || (features.size() <= 0)) {
this.groupFeatures = TypeSafeCollections.newHashSet();
} else {
this.groupFeatures = TypeSafeCollections.newHashSet(features);
}
this.readOnlyGroupFeatures = Collections.unmodifiableCollection(groupFeatures);
}
//~ Methods ----------------------------------------------------------------
@Override
public boolean addFeature(final Feature toAdd) {
final boolean changeHappened = groupFeatures.add(toAdd);
if (changeHappened) {
enclosingGeometry = null;
}
return changeHappened;
}
@Override
public boolean addFeatures(final Collection<? extends Feature> toAdd) {
final boolean changeHappened = groupFeatures.addAll(toAdd);
if (changeHappened) {
enclosingGeometry = null;
}
return changeHappened;
}
@Override
public boolean removeFeature(final Feature toRemove) {
final boolean changeHappened = groupFeatures.remove(toRemove);
if (changeHappened) {
enclosingGeometry = null;
}
return changeHappened;
}
@Override
public boolean removeFeatures(final Collection<? extends Feature> toRemove) {
final boolean changeHappened = groupFeatures.removeAll(toRemove);
if (changeHappened) {
enclosingGeometry = null;
}
return changeHappened;
}
@Override
public Geometry getGeometry() {
if (enclosingGeometry == null) {
// lazy refresh, bei parallelem zugriff duch mehrere threads muesste
// hier auf enclosingGeometry syncronisiert werden!
refreshEnclosingGeometry();
}
return enclosingGeometry;
}
@Override
public void setGeometry(final Geometry geom) {
log.warn("Call for setGeometry(...) on FeatureGroup has no effects");
}
@Override
public boolean canBeSelected() {
return false;
}
@Override
public void setCanBeSelected(final boolean canBeSelected) {
}
@Override
public boolean isEditable() {
return false;
}
@Override
public void setEditable(final boolean editable) {
log.warn("Call for setEditable(...) on FeatureGroup has no effects");
}
@Override
public boolean isHidden() {
return true;
}
@Override
public void hide(final boolean hiding) {
}
@Override
public Iterator<Feature> iterator() {
return new IteratorWrapper(groupFeatures.iterator());
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Feature[] toArray() {
return groupFeatures.toArray(new Feature[groupFeatures.size()]);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public int getSize() {
return groupFeatures.size();
}
/**
* DOCUMENT ME!
*/
private void refreshEnclosingGeometry() {
this.enclosingGeometry = FeatureGroups.getEnclosingGeometry(groupFeatures);
}
/**
* DOCUMENT ME!
*
* @return read-only view of all contained features
*/
@Override
public Collection<? extends Feature> getFeatures() {
return readOnlyGroupFeatures;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
if (parentFeature instanceof XStyledFeature) {
sb.append(((XStyledFeature)parentFeature).getName());
} else {
sb.append(parentFeature);
}
sb.append(".");
sb.append(myAttributeStringInParentFeature);
return sb.toString();
}
@Override
public Paint getLinePaint() {
return null;
}
@Override
public void setLinePaint(final Paint linePaint) {
}
@Override
public int getLineWidth() {
return 0;
}
@Override
public void setLineWidth(final int width) {
}
@Override
public Paint getFillingPaint() {
return null;
}
@Override
public void setFillingPaint(final Paint fillingStyle) {
}
@Override
public float getTransparency() {
return 0f;
}
@Override
public void setTransparency(final float transparrency) {
}
@Override
public FeatureAnnotationSymbol getPointAnnotationSymbol() {
return null;
}
@Override
public void setPointAnnotationSymbol(final FeatureAnnotationSymbol featureAnnotationSymbol) {
}
@Override
public boolean isHighlightingEnabled() {
return false;
}
@Override
public void setHighlightingEnabled(final boolean enabled) {
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Geometry getEnclosingGeometry() {
return enclosingGeometry;
}
// public void setEnclosingGeometry(Geometry enclosingGeometry) {
// this.enclosingGeometry = enclosingGeometry;
// }
@Override
public String getMyAttributeStringInParentFeature() {
return myAttributeStringInParentFeature;
}
@Override
public void setMyAttributeStringInParentFeature(final String myAttributeStringInParentFeature) {
this.myAttributeStringInParentFeature = myAttributeStringInParentFeature;
}
@Override
public FeatureGroup getParentFeature() {
return parentFeature;
}
@Override
public void setParentFeature(final FeatureGroup parentFeature) {
this.parentFeature = parentFeature;
}
//~ Inner Classes ----------------------------------------------------------
/**
* private static final String TO_STRING_HEAD = "Gruppe ["; private static final String TO_STRING_SEPARATOR = ", ";
* private static final String TO_STRING_END = "]"; @Override public String toString() { StringBuilder sb = new
* StringBuilder(TO_STRING_HEAD); if (groupFeatures.size() > 0) { for (Feature f : groupFeatures) { if (f instanceof
* XStyledFeature) { sb.append(((XStyledFeature) f).getName()); } else { sb.append(f.getGeometry()); }
* sb.append(TO_STRING_SEPARATOR); } sb.delete(sb.length() - TO_STRING_SEPARATOR.length(), sb.length()); }
* sb.append(TO_STRING_END); return sb.toString(); }
*
* @version $Revision$, $Date$
*/
final class IteratorWrapper implements Iterator<Feature> {
//~ Instance fields ----------------------------------------------------
private final Iterator<Feature> delegate;
//~ Constructors -------------------------------------------------------
/**
* Creates a new IteratorWrapper object.
*
* @param delegate DOCUMENT ME!
*/
public IteratorWrapper(final Iterator<Feature> delegate) {
this.delegate = delegate;
}
//~ Methods ------------------------------------------------------------
@Override
public boolean hasNext() {
return delegate.hasNext();
}
@Override
public Feature next() {
return delegate.next();
}
@Override
public void remove() {
enclosingGeometry = null;
delegate.remove();
}
}
}