package com.clearlyspam23.GLE.basic.layers.tile.edit.commands;
import java.util.ArrayList;
import java.util.List;
import org.piccolo2d.PCamera;
import org.piccolo2d.event.PInputEvent;
import com.clearlyspam23.GLE.basic.layers.tile.TileData;
import com.clearlyspam23.GLE.basic.layers.tile.edit.TileLayerEditManager;
import com.clearlyspam23.GLE.basic.layers.tile.edit.actions.PlaceTileAction;
import com.clearlyspam23.GLE.basic.layers.tile.gui.TileLayerPNode;
import com.clearlyspam23.GLE.basic.layers.tile.gui.TilePNode;
import com.clearlyspam23.GLE.util.Pair;
public class FloodFillTileCommand extends TileDragCommand {
protected List<Pair<TilePNode, TileData>> replacedList;
public FloodFillTileCommand(TileLayerEditManager data){
super(data);
}
protected void setTile(TilePNode tile, PCamera cam){
// tile.setImage((Image)null);
floodFill(tile, tile.getTileData(), ((TileLayerPNode)tile.getParent()).getNodeGrid());
// tile.invalidatePaint();
}
private boolean aChangeExists(){
for(Pair<TilePNode, TileData> p : replacedList){
if(!p.second.equals(data.getCurrentTileset(), data.getSelectedX(), data.getSelectedY()))
return true;
}
return false;
}
private void floodFill(TilePNode node, TileData target, TilePNode[][] grid){
if(!target.equals(node.getTileData()))
return;
Pair<TilePNode, TileData> pair = new Pair<TilePNode, TileData>(node, node.getTileData());
if(!node.setTileset(data.getCurrentTileset(), data.getSelectedX(), data.getSelectedY()))
return;
replacedList.add(pair);
int x = node.getGridX();
int y = node.getGridY();
if(x-1>=0)
floodFill(grid[x-1][y], target, grid);
if(x+1<grid.length)
floodFill(grid[x+1][y], target, grid);
if(y-1>=0)
floodFill(grid[x][y-1], target, grid);
if(y+1<grid[x].length)
floodFill(grid[x][y+1], target, grid);
}
@Override
protected void onFinish(PInputEvent event) {
if(aChangeExists()){
PlaceTileAction action = new PlaceTileAction(replacedList, new TileData(data.getCurrentTileset(), data.getSelectedX(), data.getSelectedY()));
data.registerEditAction(action);
}
}
@Override
protected boolean onStart(PInputEvent event) {
replacedList = new ArrayList<Pair<TilePNode, TileData>>();
return true;
}
}