package com.kartoflane.superluminal2.tools; import org.eclipse.swt.SWT; 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.components.enums.Directions; import com.kartoflane.superluminal2.components.enums.Images; import com.kartoflane.superluminal2.core.Grid; import com.kartoflane.superluminal2.core.Grid.Snapmodes; import com.kartoflane.superluminal2.core.Manager; import com.kartoflane.superluminal2.ftl.MountObject; import com.kartoflane.superluminal2.mvc.controllers.MountController; import com.kartoflane.superluminal2.mvc.controllers.props.PropController; import com.kartoflane.superluminal2.ui.EditorWindow; import com.kartoflane.superluminal2.ui.OverviewWindow; import com.kartoflane.superluminal2.ui.ShipContainer; import com.kartoflane.superluminal2.ui.sidebar.MountToolComposite; import com.kartoflane.superluminal2.undo.UndoableCreateEdit; public class MountTool extends Tool { private static boolean followHull = false; private boolean canCreate = false; private MountController toolMount = null; private PropController toolProp = null; public MountTool(EditorWindow window) { super(window); } @Override public void select() { if (toolMount == null) { MountObject object = new MountObject(); toolMount = MountController.newInstance(Manager.getCurrentShip(), object); toolMount.setSelectable(false); toolProp = toolMount.getProp(MountController.ARROW_PROP_ID); } cursor.setSnapMode(Snapmodes.FREE); cursor.updateView(); cursor.setVisible(false); setRotated(toolMount.isRotated()); setMirrored(toolMount.isMirrored()); setDirection(toolMount.getDirection()); toolMount.setParent(cursor); toolMount.setVisible(cursor.isVisible()); toolProp.setVisible(cursor.isVisible() && toolMount.getDirection() != Directions.NONE); cursor.resize(MountController.DEFAULT_WIDTH, MountController.DEFAULT_HEIGHT); 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.updateView(); cursor.setVisible(false); toolMount.setParent(null); toolMount.setVisible(false); toolProp.setVisible(false); CreationTool ctool = (CreationTool) Manager.getTool(Tools.CREATOR); ctool.getToolComposite(null).clearDataContainer(); } public void setRotated(boolean rot) { toolMount.setRotated(rot); } public boolean isRotated() { return toolMount.isRotated(); } public void setMirrored(boolean mir) { toolMount.setMirrored(mir); } public boolean isMirrored() { return toolMount.isMirrored(); } public void setDirection(Directions dir) { toolMount.setDirection(dir); } public Directions getDirection() { return toolMount.getDirection(); } public void setFollowHull(boolean follow) { followHull = follow; } public boolean getFollowHull() { return followHull; } @Override public MountToolComposite getToolComposite(Composite parent) { return (MountToolComposite) super.getToolComposite(parent); } @Override public MountToolComposite createToolComposite(Composite parent) { if (parent == null) throw new IllegalArgumentException("Parent must not be null."); compositeInstance = new MountToolComposite(parent); return (MountToolComposite) compositeInstance; } @Override public void mouseDoubleClick(MouseEvent e) { } @Override public void mouseDown(MouseEvent e) { // Check the conditions again in case the variable is outdated canCreate = canPlace(); if (e.button == 1 && canCreate) { ShipContainer container = Manager.getCurrentShip(); MountObject object = new MountObject(); MountController mount = MountController.newInstance(container, object); Rectangle oldBounds = mount.getBounds(); mount.setLocation(e.x, e.y); mount.setRotated(isRotated()); mount.setMirrored(isMirrored()); mount.setDirection(getDirection()); if (getFollowHull()) mount.setParent(Manager.getCurrentShip().getImageController(Images.HULL)); else mount.setParent(Manager.getCurrentShip().getShipController()); mount.updateFollowOffset(); container.add(mount); container.store(mount); window.canvasRedraw(oldBounds); mount.redraw(); OverviewWindow.staticUpdate(); container.postEdit(new UndoableCreateEdit(mount)); } else if (e.button == 3) { if ((e.stateMask & SWT.SHIFT) == SWT.SHIFT) { Directions dir = toolMount.getDirection(); toolMount.setDirection(dir.nextDirection()); toolMount.updateView(); } else if ((e.stateMask & SWT.ALT) == SWT.ALT) { toolMount.setVisible(false); cursor.setVisible(false); toolMount.setMirrored(!toolMount.isMirrored()); toolMount.updateView(); cursor.updateView(); toolMount.setVisible(true); cursor.setVisible(true); } else { toolMount.setVisible(false); cursor.setVisible(false); toolMount.setRotated(!toolMount.isRotated()); toolMount.updateView(); cursor.updateView(); toolMount.setVisible(true); cursor.setVisible(true); } window.updateSidebarContent(); } // handle cursor if (cursor.isVisible() && e.button == 1) { cursor.setVisible(false); toolMount.setVisible(false); toolProp.setVisible(false); } } @Override public void mouseUp(MouseEvent e) { // handle cursor if (!cursor.isVisible() && Grid.getInstance().isLocAccessible(e.x, e.y)) { canCreate = canPlace(); cursor.updateView(); if (e.button == 1) { cursor.setVisible(true); toolMount.setVisible(true); toolProp.setVisible(toolMount.getDirection() != Directions.NONE); } Point p = Grid.getInstance().snapToGrid(e.x, e.y, cursor.getSnapMode()); if (!p.equals(cursor.getLocation())) { cursor.reposition(p.x, p.y); } } } @Override public void mouseMove(MouseEvent e) { // move the cursor around to follow mouse if (Grid.getInstance().isLocAccessible(e.x, e.y)) { canCreate = canPlace(); cursor.updateView(); cursor.setVisible(!Manager.leftMouseDown); Point p = Grid.getInstance().snapToGrid(e.x, e.y, cursor.getSnapMode()); cursor.reposition(p.x, p.y); toolMount.setVisible(cursor.isVisible()); toolProp.setVisible(cursor.isVisible() && toolMount.getDirection() != Directions.NONE); } else if (cursor.isVisible()) { cursor.setVisible(false); toolMount.setVisible(false); toolProp.setVisible(false); } } @Override public void mouseEnter(MouseEvent e) { cursor.setVisible(!Manager.leftMouseDown); toolMount.setVisible(!Manager.leftMouseDown); toolProp.setVisible(!Manager.leftMouseDown && toolMount.getDirection() != Directions.NONE); } @Override public void mouseExit(MouseEvent e) { cursor.setVisible(false); toolMount.setVisible(false); toolProp.setVisible(false); } @Override public void mouseHover(MouseEvent e) { } private boolean canPlace() { ShipContainer container = Manager.getCurrentShip(); return container.isMountsVisible() && container.getMountControllers().length < 8; } public boolean canCreate() { return canCreate; } }