package com.revolsys.swing.map.layer.record.renderer;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.swing.Icon;
import com.revolsys.geometry.model.BoundingBox;
import com.revolsys.geometry.model.TopologyException;
import com.revolsys.logging.Logs;
import com.revolsys.swing.Icons;
import com.revolsys.swing.map.Viewport2D;
import com.revolsys.swing.map.layer.AbstractLayer;
import com.revolsys.swing.map.layer.LayerRenderer;
import com.revolsys.swing.map.layer.record.AbstractRecordLayer;
import com.revolsys.swing.map.layer.record.LayerRecord;
import com.revolsys.swing.map.layer.record.style.GeometryStyle;
import com.revolsys.util.Cancellable;
/**
* Use all the specified renderers to render the layer. All features are
* rendered using the first renderer, then the second etc.
*/
public class MultipleRenderer extends AbstractMultipleRenderer {
private static final Icon ICON = Icons.getIcon("style_multiple");
public MultipleRenderer(final AbstractRecordLayer layer) {
super("multipleStyle", "Multiple Styles");
setIcon(ICON);
}
public MultipleRenderer(final AbstractRecordLayer layer, final LayerRenderer<?> parent) {
super("multipleStyle", layer, parent);
setIcon(ICON);
}
public MultipleRenderer(final AbstractRecordLayer layer,
final List<? extends AbstractRecordLayerRenderer> renderers) {
super("multipleStyle", "Multiple Styles");
setIcon(ICON);
setRenderers(renderers);
}
public MultipleRenderer(final Map<String, ? extends Object> properties) {
super("multipleStyle", "Multiple Styles");
setIcon(ICON);
setProperties(properties);
}
public void addStyle(final GeometryStyle style) {
final GeometryStyleRenderer renderer = new GeometryStyleRenderer(getLayer(), this, style);
addRenderer(renderer);
}
// Needed for filter styles
@Override
public void renderRecord(final Viewport2D viewport, final BoundingBox visibleArea,
final AbstractLayer layer, final LayerRecord record) {
if (isVisible(record)) {
for (final AbstractRecordLayerRenderer renderer : getRenderers()) {
final long scaleForVisible = (long)viewport.getScaleForVisible();
if (renderer.isVisible(scaleForVisible)) {
try {
renderer.renderRecord(viewport, visibleArea, layer, record);
} catch (final TopologyException e) {
} catch (final Throwable e) {
Logs.error(this, "Unabled to render " + layer.getName() + " #" + record.getIdentifier(),
e);
}
}
}
}
}
@Override
protected void renderRecords(final Viewport2D viewport, final Cancellable cancellable,
final AbstractRecordLayer layer, final List<LayerRecord> records) {
final List<LayerRecord> visibleRecords = new ArrayList<>();
for (final LayerRecord record : cancellable.cancellable(records)) {
if (isVisible(record) && !layer.isHidden(record)) {
visibleRecords.add(record);
}
}
for (final AbstractRecordLayerRenderer renderer : cancellable.cancellable(getRenderers())) {
final long scaleForVisible = (long)viewport.getScaleForVisible();
if (renderer.isVisible(scaleForVisible)) {
try {
renderer.renderRecords(viewport, cancellable, layer, visibleRecords);
} catch (final TopologyException e) {
}
}
}
}
@Override
public void renderSelectedRecord(final Viewport2D viewport, final AbstractLayer layer,
final LayerRecord record) {
if (isVisible(record)) {
for (final AbstractRecordLayerRenderer renderer : getRenderers()) {
final long scaleForVisible = (long)viewport.getScaleForVisible();
if (renderer.isVisible(scaleForVisible)) {
try {
renderer.renderSelectedRecord(viewport, layer, record);
} catch (final Throwable e) {
Logs.error(this, "Unabled to render " + layer.getName() + " #" + record.getIdentifier(),
e);
}
}
}
}
}
}