package com.clearlyspam23.GLE.basic.layers.tile.edit; import java.awt.Image; import java.awt.geom.Point2D; import java.util.ArrayList; import java.util.List; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.piccolo2d.PInputManager; import org.piccolo2d.event.PInputEvent; import org.piccolo2d.event.PInputEventListener; import org.piccolo2d.util.PBounds; import com.clearlyspam23.GLE.GUI.util.BasicEditorButton; import com.clearlyspam23.GLE.GUI.util.BasicEditorPanel; import com.clearlyspam23.GLE.basic.layers.tile.Tile; import com.clearlyspam23.GLE.basic.layers.tile.TileLayer; import com.clearlyspam23.GLE.basic.layers.tile.TileLocation; import com.clearlyspam23.GLE.basic.layers.tile.TilesetHandle; import com.clearlyspam23.GLE.basic.layers.tile.edit.actions.CutSelectionAction; import com.clearlyspam23.GLE.basic.layers.tile.edit.commands.EraseTileCommand; import com.clearlyspam23.GLE.basic.layers.tile.edit.commands.FloodFillTileCommand; import com.clearlyspam23.GLE.basic.layers.tile.edit.commands.PlaceTileCommand; import com.clearlyspam23.GLE.basic.layers.tile.edit.commands.TileSelectCommand; import com.clearlyspam23.GLE.basic.layers.tile.edit.menu.AnchorMenuItem; import com.clearlyspam23.GLE.basic.layers.tile.edit.menu.GridMenuItem; import com.clearlyspam23.GLE.basic.layers.tile.gui.MovableTileSelection; import com.clearlyspam23.GLE.basic.layers.tile.gui.TileLayerSelectionListener; import com.clearlyspam23.GLE.basic.layers.tile.gui.TileSelection; import com.clearlyspam23.GLE.basic.layers.tile.gui.TilesetSelectionPanel; import com.clearlyspam23.GLE.edit.LayerEditManager; import com.clearlyspam23.GLE.edit.LayerMenuItem; public class TileLayerEditManager extends LayerEditManager<TileLayer> implements ChangeListener, PInputEventListener, TileLayerSelectionListener{ // private Tileset currentTileset; // // private int selectedX = -1; // private int selectedY = -1; private PInputEventListener currentEvent; private GridMenuItem gridItem; private AnchorMenuItem anchorItem; private List<PInputEventListener> allEvents = new ArrayList<PInputEventListener>(); private TilesetSelectionPanel selectionPanel; private List<Tile> cutSelection; private int selectionWidth; private int selectionHeight; public TileLayerEditManager() { gridItem = new GridMenuItem(); anchorItem = new AnchorMenuItem(this); allEvents.add(new PlaceTileCommand(this)); allEvents.add(new EraseTileCommand(this)); allEvents.add(new FloodFillTileCommand(this)); allEvents.add(new TileSelectCommand(this)); selectionPanel = new TilesetSelectionPanel(); BasicEditorPanel panel = new BasicEditorPanel (new BasicEditorButton("images/Pencil.png", "Pencil", "Places Tiles"), new BasicEditorButton("images/Eraser.png", "Eraser", "Removes Tiles"), new BasicEditorButton("images/Bucket.png", "Bucket", "Fill Tiles"), new BasicEditorButton("images/FingerPointer.png", "Pointer", "Select Tiles")); panel.addChangeListener(this); panel.selectButton(0); setMainComponent(panel, "Tile Editor"); addSubComponents(selectionPanel, "Tileset"); } public TilesetHandle getCurrentTileset() { return selectionPanel.getCurrentTileset(); } public int getSelectedX() { return selectionPanel.getSelectedX(); } public int getSelectedY(){ return selectionPanel.getSelectedY(); } public void addTileset(TilesetHandle t){ selectionPanel.addTileset(t); } public void clearTilesets(){ selectionPanel.clearTilesets(); } public Image getSelectedTile(){ return selectionPanel.getSelectedTile(); } @Override public void stateChanged(ChangeEvent e) { int index = ((BasicEditorPanel)e.getSource()).getSelectedButtonIndex(); if(index>=0&&index<allEvents.size()) currentEvent = allEvents.get(index); else currentEvent = null; } @Override public void processEvent(PInputEvent arg0, int arg1) { if(currentEvent!=null) currentEvent.processEvent(arg0, arg1); } @Override public String getName() { return "Tile Layer"; } public void onActive(TileLayer layer){ layer.addSelectionListener(this); checkCopyCut(layer); } public void onLayerChange(TileLayer oldLayer, TileLayer newLayer){ oldLayer.removeSelectionListener(this); newLayer.addSelectionListener(this); checkCopyCut(newLayer); } public void onInActive(TileLayer layer){ layer.removeSelectionListener(this); } private void checkCopyCut(TileLayer layer){ if(layer.canCopy()!=canCopy()) toggleCanCopy(layer.canCopy()); if(layer.canCut()!=canCut()) toggleCanCut(layer.canCut()); } public void onCopy(TileLayer currentLayer){ selectionWidth = currentLayer.getBase().getSelection().getTileWidth(); selectionHeight = currentLayer.getBase().getSelection().getTileHeight(); cutSelection = currentLayer.getBase().getSelection().onCopy(); if(canPaste()!=(cutSelection!=null)) toggleCanPaste(cutSelection!=null); } public void onCut(TileLayer currentLayer){ selectionWidth = currentLayer.getBase().getSelection().getTileWidth(); selectionHeight = currentLayer.getBase().getSelection().getTileHeight(); cutSelection = currentLayer.getBase().getSelection().onCopy(); TileSelection selection = currentLayer.getBase().getSelection(); selection.onClear(); currentLayer.getBase().anchorSelection(); this.registerEditAction(new CutSelectionAction(cutSelection, selection, currentLayer.getBase())); if(canPaste()!=(cutSelection!=null)) toggleCanPaste(cutSelection!=null); } public void onPaste(TileLayer currentLayer){ PInputManager inputManager = currentLayer.getBase().getRoot().getDefaultInputManager(); Point2D p = (Point2D) inputManager.getCurrentCanvasPosition().clone(); PBounds globalBounds = inputManager.getMouseOver().getBottomCamera().getGlobalBounds(); if(!globalBounds.contains(p)) p = new Point2D.Double(globalBounds.width/2+globalBounds.x, globalBounds.height/2+globalBounds.y); p = inputManager.getMouseOver().getBottomCamera().localToView(p); TileLocation l = new TileLocation((int) (p.getX()/currentLayer.getBase().getTiles().getGridWidth()), (int) (p.getY()/currentLayer.getBase().getTiles().getGridHeight())); l.gridX-=selectionWidth/2; l.gridY-=selectionHeight/2; MovableTileSelection selection = new MovableTileSelection(inputManager.getMouseOver().getBottomCamera(), currentLayer.getBase().getTiles(), cutSelection, l); currentLayer.getBase().setSelectionWithAction(selection, this); } @Override public void selectionChange(TileLayer layer, TileSelection oldSelection, TileSelection newSelection) { checkCopyCut(layer); } @Override public List<LayerMenuItem<TileLayer, ?>> getLayerItems(TileLayer layer) { List<LayerMenuItem<TileLayer, ?>> items = new ArrayList<LayerMenuItem<TileLayer, ?>>(); items.add(gridItem); items.add(anchorItem); return items; } }