/*******************************************************************************
* Copyright 2010 Simon Mieth
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package org.kabeja.processing;
import java.util.Iterator;
import java.util.Map;
import org.kabeja.DraftDocument;
import org.kabeja.common.Layer;
import org.kabeja.common.Type;
import org.kabeja.entities.Entity;
import org.kabeja.math.Bounds;
public class BoundsFilter extends AbstractPostProcessor {
public final static String PROPERTY_X = "boundsfilter.x";
public final static String PROPERTY_Y = "boundsfilter.y";
public final static String PROPERTY_WIDTH = "boundsfilter.width";
public final static String PROPERTY_HEIGHT = "boundsfilter.height";
public final static String PROPERTY_PROCESS = "boundsfilter.process";
public void process(DraftDocument doc, Map context)
throws ProcessorException {
if (this.properties.containsKey(PROPERTY_PROCESS)
&& Boolean.valueOf(
(String) this.properties.get(PROPERTY_PROCESS))
.booleanValue()) {
Bounds bounds = new Bounds();
if (this.properties.containsKey(PROPERTY_X)) {
bounds.setMinimumX(Double.parseDouble((String) this.properties
.get(PROPERTY_X)));
}
if (this.properties.containsKey(PROPERTY_Y)) {
bounds.setMinimumY(Double.parseDouble((String) this.properties
.get(PROPERTY_Y)));
}
if (this.properties.containsKey(PROPERTY_WIDTH)) {
bounds.setMaximumX(bounds.getMinimumX()
+ Double.parseDouble((String) this.properties
.get(PROPERTY_WIDTH)));
}
if (this.properties.containsKey(PROPERTY_WIDTH)) {
bounds.setMaximumY(bounds.getMinimumY()
+ Double.parseDouble((String) this.properties
.get(PROPERTY_HEIGHT)));
}
// the bounds should be setup now
// we remove all entities which are
// not inside our bounds
for (Layer layer : doc.getLayers()) {
filterLayer(layer, bounds);
}
}
}
protected void filterLayer(Layer layer, Bounds bounds) {
for (Type<?> type : layer.getEntityTypes()) {
Iterator<?> entities = layer.getEntitiesByType(type).iterator();
while (entities.hasNext()) {
Entity entity = (Entity) entities.next();
if (!bounds.enclose(entity.getBounds())) {
// the bounds not contains this entity
// we remove it
entities.remove();
}
}
}
}
}