/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.pepsoft.worldpainter;
import org.pepsoft.util.undo.Snapshot;
import org.pepsoft.util.undo.UndoManager;
import org.pepsoft.worldpainter.layers.Layer;
import org.pepsoft.worldpainter.layers.exporters.ExporterSettings;
import java.awt.*;
import java.beans.PropertyChangeListener;
import java.util.*;
/**
*
* @author pepijn
*/
public final class DimensionSnapshot extends Dimension {
public DimensionSnapshot(Dimension dimension, Snapshot snapshot) {
super(dimension.getMinecraftSeed(), dimension.getTileFactory(), dimension.getDim(), dimension.getMaxHeight());
this.dimension = dimension;
this.snapshot = snapshot;
super.setBorder(dimension.getBorder());
super.setBorderSize(dimension.getBorderSize());
super.setBorderLevel(dimension.getBorderLevel());
super.setMinecraftSeed(dimension.getMinecraftSeed());
super.setSubsurfaceMaterial(dimension.getSubsurfaceMaterial());
super.setWorld(dimension.getWorld());
super.setBedrockWall(dimension.isBedrockWall());
super.setDarkLevel(dimension.isDarkLevel());
super.setPopulate(dimension.isPopulate());
width = dimension.getWidth();
height = dimension.getHeight();
lowestX = dimension.getLowestX();
highestX = dimension.getHighestX();
lowestY = dimension.getLowestY();
highestY = dimension.getHighestY();
}
@Override
public void addDimensionListener(Listener listener) {
// Do nothing
}
@Override
public void addPropertyChangeListener(PropertyChangeListener listener) {
// Do nothing
}
@Override
public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
// Do nothing
}
@Override
public void addTile(Tile tile) {
throw new UnsupportedOperationException();
}
@Override
public void applyTheme(int x, int y) {
throw new UnsupportedOperationException();
}
@Override
public void applyTheme(Point coords) {
throw new UnsupportedOperationException();
}
@Override
public void unregister() {
// Do nothing
}
@Override
public void clearRedo() {
// Do nothing
}
@Override
public void armSavePoint() {
// Do nothing
}
@Override
public void clearUndo() {
// Do nothing
}
@Override
public boolean undoChanges() {
return false;
}
@Override
public void register(UndoManager undoManager) {
// Do nothing
}
@Override
public boolean isUndoAvailable() {
return false;
}
@Override
public int getHeight() {
return height;
}
@Override
public int getHighestX() {
return highestX;
}
@Override
public int getHighestY() {
return highestY;
}
@Override
public ExporterSettings getLayerSettings(Layer layer) {
throw new UnsupportedOperationException();
}
@Override
public Map<Layer, ExporterSettings> getAllLayerSettings() {
throw new UnsupportedOperationException();
}
@Override
public int getLowestX() {
return lowestX;
}
@Override
public int getLowestY() {
return lowestY;
}
@Override
public Tile getTile(Point coords) {
// In theory this is not correct, since the dimension might have gained
// or lost tiles in the mean time. However the expected usage pattern
// of the functionality is such that that should not happen in practice,
// and creating tile snapshots of all tiles when the dimension snapshot
// is created would be a performance hit
TileSnapshot tileSnapshot = tileSnapshots.get(coords);
if (tileSnapshot == null) {
Tile tile = dimension.getTile(coords);
if (tile != null) {
tileSnapshot = new TileSnapshot(tile, snapshot);
tileSnapshots.put(coords, tileSnapshot);
}
}
return tileSnapshot;
}
@Override
public Collection<? extends Tile> getTiles() {
Collection<? extends Tile> tiles = dimension.getTiles();
for (Tile tile: tiles) {
Point coords = new Point(tile.getX(), tile.getY());
if (! tileSnapshots.containsKey(coords)) {
TileSnapshot tileSnapshot = new TileSnapshot(tile, snapshot);
tileSnapshots.put(coords, tileSnapshot);
}
}
return Collections.unmodifiableCollection(tileSnapshots.values());
}
@Override
public Set<Point> getTileCoords() {
// In theory this is not correct, since the dimension might have gained
// or lost tiles in the mean time. However the expected usage pattern
// of the functionality is such that that should not happen in practice,
// and creating tile snapshots of all tiles when the dimension snapshot
// is created would be a performance hit
return dimension.getTileCoords();
}
@Override
public int getWidth() {
return width;
}
@Override
public boolean isEventsInhibited() {
return false;
}
@Override
public void removeTile(Tile tile) {
throw new UnsupportedOperationException();
}
@Override
public void setBedrockWall(boolean bedrockWall) {
throw new UnsupportedOperationException();
}
@Override
public void setBitLayerValueAt(Layer layer, int x, int y, boolean value) {
throw new UnsupportedOperationException();
}
@Override
public void setBorder(Border border) {
throw new UnsupportedOperationException();
}
@Override
public void setBorderLevel(int borderLevel) {
throw new UnsupportedOperationException();
}
@Override
public void setBorderSize(int borderSize) {
throw new UnsupportedOperationException();
}
@Override
public void setDarkLevel(boolean darkLevel) {
throw new UnsupportedOperationException();
}
@Override
public void setDirty(boolean dirty) {
throw new UnsupportedOperationException();
}
@Override
public void setEventsInhibited(boolean eventsInhibited) {
throw new UnsupportedOperationException();
}
@Override
public void setHeightAt(int x, int y, float height) {
throw new UnsupportedOperationException();
}
@Override
public void setHeightAt(Point coords, float height) {
throw new UnsupportedOperationException();
}
@Override
public void setLayerSettings(Layer layer, ExporterSettings settings) {
throw new UnsupportedOperationException();
}
@Override
public void setLayerValueAt(Layer layer, int x, int y, int value) {
throw new UnsupportedOperationException();
}
@Override
public void setMinecraftSeed(long minecraftSeed) {
throw new UnsupportedOperationException();
}
@Override
public void setPopulate(boolean populate) {
throw new UnsupportedOperationException();
}
@Override
public void setSubsurfaceMaterial(Terrain subsurfaceMaterial) {
throw new UnsupportedOperationException();
}
@Override
public void setTerrainAt(int x, int y, Terrain terrain) {
throw new UnsupportedOperationException();
}
@Override
public void setTerrainAt(Point coords, Terrain terrain) {
throw new UnsupportedOperationException();
}
@Override
public void setWaterLevelAt(int x, int y, int waterLevel) {
throw new UnsupportedOperationException();
}
@Override
void setWorld(World2 world) {
throw new UnsupportedOperationException();
}
private final Dimension dimension;
private final Snapshot snapshot;
private final int width, height, lowestX, highestX, lowestY, highestY;
private final Map<Point, TileSnapshot> tileSnapshots = new HashMap<>();
private static final long serialVersionUID = 2011101501L;
}