package com.kartoflane.superluminal2.tools;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import com.kartoflane.superluminal2.core.Grid;
import com.kartoflane.superluminal2.core.Grid.Snapmodes;
import com.kartoflane.superluminal2.core.LayeredPainter;
import com.kartoflane.superluminal2.core.Manager;
import com.kartoflane.superluminal2.ftl.DoorObject;
import com.kartoflane.superluminal2.mvc.controllers.AbstractController;
import com.kartoflane.superluminal2.mvc.controllers.DoorController;
import com.kartoflane.superluminal2.mvc.controllers.RoomController;
import com.kartoflane.superluminal2.ui.EditorWindow;
import com.kartoflane.superluminal2.ui.OverviewWindow;
import com.kartoflane.superluminal2.ui.ShipContainer;
import com.kartoflane.superluminal2.ui.sidebar.DoorToolComposite;
import com.kartoflane.superluminal2.undo.UndoableCreateEdit;
import com.kartoflane.superluminal2.utils.Utils;
public class DoorTool extends Tool {
/** A flag indicating whether or not the door can be placed */
private boolean canCreate = false;
private boolean horizontal = false;
public DoorTool(EditorWindow window) {
super(window);
}
@Override
public void select() {
cursor.setSnapMode(Snapmodes.EDGES);
cursor.setVisible(false);
CreationTool ctool = (CreationTool) Manager.getTool(Tools.CREATOR);
ctool.getToolComposite(null).clearDataContainer();
Composite dataC = ctool.getToolComposite(null).getDataContainer();
createToolComposite(dataC);
dataC.layout(true);
}
@Override
public void deselect() {
cursor.setVisible(false);
CreationTool ctool = (CreationTool) Manager.getTool(Tools.CREATOR);
ctool.getToolComposite(null).clearDataContainer();
}
@Override
public DoorToolComposite getToolComposite(Composite parent) {
return (DoorToolComposite) super.getToolComposite(parent);
}
@Override
public DoorToolComposite createToolComposite(Composite parent) {
if (parent == null)
throw new IllegalArgumentException("Parent must not be null.");
compositeInstance = new DoorToolComposite(parent);
return (DoorToolComposite) compositeInstance;
}
@Override
public void mouseDoubleClick(MouseEvent e) {
}
@Override
public void mouseDown(MouseEvent e) {
// Check the conditions again in case the variable is outdated
canCreate = canCreate();
if (e.button == 1 && canCreate) {
ShipContainer container = Manager.getCurrentShip();
DoorObject object = new DoorObject(horizontal);
DoorController doorController = DoorController.newInstance(container, object);
Rectangle oldBounds = doorController.getBounds();
doorController.setLocation(Grid.getInstance().snapToGrid(e.x, e.y, cursor.getSnapMode()));
doorController.setBounded(true);
Point p = doorController.getLocation();
doorController.setFollowOffset(p.x - doorController.getParent().getX(), p.y - doorController.getParent().getY());
container.add(doorController);
container.store(doorController);
window.canvasRedraw(oldBounds);
doorController.redraw();
container.updateBoundingArea();
OverviewWindow.staticUpdate(doorController);
container.postEdit(new UndoableCreateEdit(doorController));
}
// handle cursor
if (cursor.isVisible() && e.button == 1) {
cursor.setVisible(false);
}
}
@Override
public void mouseUp(MouseEvent e) {
// handle cursor
if (e.button == 1) {
Point p = Grid.getInstance().snapToGrid(e.x, e.y, cursor.getSnapMode());
horizontal = p.y % ShipContainer.CELL_SIZE == 0;
cursor.resize(horizontal ? 34 : ShipContainer.CELL_SIZE / 3, horizontal ? ShipContainer.CELL_SIZE / 3 : 34);
cursor.reposition(p.x, p.y);
canCreate = canCreate();
cursor.updateView();
cursor.redraw();
}
}
@Override
public void mouseMove(MouseEvent e) {
// move the cursor around to follow mouse
Point p = Grid.getInstance().snapToGrid(e.x, e.y, cursor.getSnapMode());
horizontal = p.y % ShipContainer.CELL_SIZE == 0;
cursor.resize(horizontal ? 34 : ShipContainer.CELL_SIZE / 3, horizontal ? ShipContainer.CELL_SIZE / 3 : 34);
cursor.reposition(p.x, p.y);
canCreate = canCreate();
cursor.updateView();
cursor.redraw();
}
@Override
public void mouseEnter(MouseEvent e) {
cursor.setVisible(!Manager.leftMouseDown);
cursor.redraw();
}
@Override
public void mouseExit(MouseEvent e) {
cursor.setVisible(false);
cursor.redraw();
}
@Override
public void mouseHover(MouseEvent e) {
}
private boolean canCreate() {
if (!Manager.getCurrentShip().isDoorsVisible())
return false;
AbstractController control = LayeredPainter.getInstance().getSelectableControllerAt(cursor.getLocation());
if (control != null && control instanceof RoomController) {
return control.getBounds().intersects(cursor.getBounds()) && !Utils.contains(control.getBounds(), cursor.getBounds());
} else
return false;
}
public boolean canPlace() {
return canCreate;
}
public boolean isHorizontal() {
return horizontal;
}
}