package com.clearlyspam23.GLE.basic.layers.tile.gui; import java.awt.Image; import java.util.ArrayList; import java.util.List; import org.piccolo2d.nodes.PImage; import com.clearlyspam23.GLE.basic.layers.tile.Tile; import com.clearlyspam23.GLE.basic.layers.tile.TileData; import com.clearlyspam23.GLE.basic.layers.tile.TileLocation; import com.clearlyspam23.GLE.basic.layers.tile.TilesetHandle; public class TilePNode extends PImage { public static interface TileChangeListener{ public void onChange(TilePNode changedNode, TileData previous, TileData next); } /** * */ private static final long serialVersionUID = 1L; private Tile tile; // private TilesetHandle currentTileset; // private int tilesetX; // private int tilesetY; // private int gridX; // private int gridY; // // private TileLocation offset; private boolean silentlyIgnoreInput; private List<TileChangeListener> listeners = new ArrayList<TileChangeListener>(); public TilePNode(){ this(null, -1, -1, new TileLocation()); } public TilePNode(TilesetHandle set, int x, int y){ this(set, x, y, new TileLocation()); } public TilePNode(TilesetHandle set, int x, int y, TileLocation offset){ this(new Tile(set, x, y, new TileLocation(), offset)); } public TilePNode(Tile t){ tile = t.copyTile(); if(tile.isValid()) setImage(tile.getTileImage()); } public void setTileOffsetReference(TileLocation offset){ tile.offset = offset; } public boolean setTileset(TilesetHandle set, int x, int y) { return setTileset(new TileData(set, x, y)); // if(silentlyIgnoreInput) // return false; // TileData prev = getTileData(); // TileData curr = new TileData(set, x, y); // if(!prev.equals(curr)){ // tile.setTileset(set, x, y); // if(tile.isValid()) // setImage(tile.getTileImage()); // for(TileChangeListener l : listeners) // l.onChange(this, prev, curr); // return true; // } // return false; } public boolean setTileset(TileData data){ if(!data.isValid()) return resetTileset(); if(!couldSet(data)) return false; TileData prev = getTileData(); tile.setTileset(data); if(tile.isValid()) setImage(tile.getTileImage()); for(TileChangeListener l : listeners) l.onChange(this, prev, data); return true; } public boolean couldSet(TilesetHandle set, int x, int y){ return couldSet(new TileData(set, x, y)); } public boolean couldSet(TileData data){ return !silentlyIgnoreInput&&!getTileData().equals(data); } public boolean setTilesetHard(TilesetHandle set, int x, int y){ boolean b = silentlyIgnoreInput; silentlyIgnoreInput = false; boolean out = setTileset(set, x, y); silentlyIgnoreInput = b; return out; } public boolean setTilesetHard(TileData data){ return setTilesetHard(data.tileset, data.tileX, data.tileY); } public boolean resetTileset(){ if(silentlyIgnoreInput) return false; TileData prev = getTileData(); if(prev!=new TileData()){ tile.resetTileset(); setImage((Image)null); invalidatePaint(); for(TileChangeListener l : listeners) l.onChange(this, prev, getTileData()); return true; } return false; } public boolean resetTilesetHard(){ boolean b = silentlyIgnoreInput; silentlyIgnoreInput = false; boolean out = resetTilesetHard(); silentlyIgnoreInput = b; return out; } public TilesetHandle getTileset() { return tile.tileset; } public int getTilesetX() { return tile.tileX; } public int getTilesetY() { return tile.tileY; } public void setGridLocation(int x, int y){ tile.relativeLocation.set(x, y); } public int getGridX(){ return tile.getLocation().gridX; } public int getGridY(){ return tile.getLocation().gridY; } public TileLocation getTileLocation(){ return tile.getLocation(); } public int getRawGridX(){ return tile.relativeLocation.gridX; } public int getRawGridy(){ return tile.relativeLocation.gridY; } @Override public void setImage(final Image newImage) { double x = getX(); double y = getY(); double width = getWidth(); double height = getHeight(); super.setImage(newImage); setBounds(x, y, width, height); } public TilePNode getCopy(){ TilePNode ans = new TilePNode(tile.copyTile()); ans.setBounds(getX(), getY(), getWidth(), getHeight()); return ans; } public TileData getTileData(){ return tile.copyTileData(); } public Tile getTile(){ return tile.copyTile(); } public boolean isSilentlyIgnoringInput() { return silentlyIgnoreInput; } public void silentlyIgnoreInput(boolean silentlyIgnoreInput) { this.silentlyIgnoreInput = silentlyIgnoreInput; } public void addChangeListener(TileChangeListener l){ listeners.add(l); } public void removeChangeListener(TileChangeListener l){ listeners.remove(l); } public TileLayerPNode getTilePNodeLayer(){ return (TileLayerPNode) getParent(); } }