/* * This file is part of LaTeXDraw. * Copyright (c) 2005-2017 Arnaud BLOUIN * LaTeXDraw is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later version. * LaTeXDraw is distributed without any warranty; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ package net.sf.latexdraw.instruments; import java.net.URL; import java.util.ResourceBundle; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Button; import javafx.scene.layout.VBox; import net.sf.latexdraw.actions.shape.AlignShapes; import net.sf.latexdraw.actions.shape.DistributeShapes; import net.sf.latexdraw.actions.shape.MirrorShapes; import net.sf.latexdraw.models.interfaces.shape.IGroup; import org.malai.javafx.binding.ButtonBinding; /** * This instrument transforms (mirror, etc.) the selected shapes. * @author Arnaud Blouin */ public class ShapeTransformer extends ShapePropertyCustomiser implements Initializable { /** The widget to mirror horizontally. */ @FXML private Button mirrorH; /** The widget to mirror vertically. */ @FXML private Button mirrorV; /** The widget to BOTTOM align the shapes. */ @FXML private Button alignBot; /** The widget to LEFT align the shapes. */ @FXML private Button alignLeft; /** The widget to RIGHT align the shapes. */ @FXML private Button alignRight; /** The widget to TOP align the shapes. */ @FXML private Button alignTop; /** The widget to middle horizontal align the shapes. */ @FXML private Button alignMidHoriz; /** The widget to middle vertical align the shapes. */ @FXML private Button alignMidVert; /** The widget to BOTTOM-vertically distribute the shapes. */ @FXML private Button distribVertBot; /** The widget to equal-vertically distribute the shapes. */ @FXML private Button distribVertEq; /** The widget to middle-vertically distribute the shapes. */ @FXML private Button distribVertMid; /** The widget to TOP-vertically distribute the shapes. */ @FXML private Button distribVertTop; /** The widget to equal-horizontally distribute the shapes. */ @FXML private Button distribHorizEq; /** The widget to LEFT-horizontally distribute the shapes. */ @FXML private Button distribHorizLeft; /** The widget to middle-horizontally distribute the shapes. */ @FXML private Button distribHorizMid; /** The widget to RIGHT-horizontally distribute the shapes. */ @FXML private Button distribHorizRight; @FXML private VBox mainPane; /** * Creates the instrument. */ ShapeTransformer() { super(); } @Override public void initialize(final URL location, final ResourceBundle resources) { mainPane.managedProperty().bind(mainPane.visibleProperty()); alignBot.setUserData(AlignShapes.Alignment.BOTTOM); alignLeft.setUserData(AlignShapes.Alignment.LEFT); alignMidHoriz.setUserData(AlignShapes.Alignment.MID_HORIZ); alignMidVert.setUserData(AlignShapes.Alignment.MID_VERT); alignRight.setUserData(AlignShapes.Alignment.RIGHT); alignTop.setUserData(AlignShapes.Alignment.TOP); distribHorizEq.setUserData(DistributeShapes.Distribution.HORIZ_EQ); distribHorizLeft.setUserData(DistributeShapes.Distribution.HORIZ_LEFT); distribHorizMid.setUserData(DistributeShapes.Distribution.HORIZ_MID); distribHorizRight.setUserData(DistributeShapes.Distribution.HORIZ_RIGHT); distribVertBot.setUserData(DistributeShapes.Distribution.VERT_BOT); distribVertEq.setUserData(DistributeShapes.Distribution.VERT_EQ); distribVertMid.setUserData(DistributeShapes.Distribution.VERT_MID); distribVertTop.setUserData(DistributeShapes.Distribution.VERT_BOT); } @Override protected void setWidgetsVisible(final boolean visible) { mainPane.setVisible(visible); } @Override protected void update(final IGroup shape) { setActivated(hand.isActivated() && shape.size() > 1); } @Override protected void configureBindings() throws IllegalAccessException, InstantiationException { addBinding(new Button2Align(this)); addBinding(new Button2Mirror(this)); addBinding(new Button2Distribute(this)); } private static class Button2Align extends ButtonBinding<AlignShapes, ShapeTransformer> { Button2Align(final ShapeTransformer ins) throws InstantiationException, IllegalAccessException { super(ins, AlignShapes.class, ins.alignBot, ins.alignLeft, ins.alignMidHoriz, ins.alignMidVert, ins.alignRight, ins.alignTop); } @Override public void initAction() { action.setAlignment((AlignShapes.Alignment) getInteraction().getWidget().getUserData()); action.setCanvas(getInstrument().canvas); action.setShape(instrument.pencil.canvas.getDrawing().getSelection().duplicateDeep(false)); } } private static class Button2Mirror extends ButtonBinding<MirrorShapes, ShapeTransformer> { Button2Mirror(final ShapeTransformer ins) throws InstantiationException, IllegalAccessException { super(ins, MirrorShapes.class, ins.mirrorH, ins.mirrorV); } @Override public void initAction() { action.setHorizontally(interaction.getWidget() == instrument.mirrorH); action.setShape(instrument.pencil.canvas.getDrawing().getSelection().duplicateDeep(false)); } } private static class Button2Distribute extends ButtonBinding<DistributeShapes, ShapeTransformer> { Button2Distribute(final ShapeTransformer ins) throws InstantiationException, IllegalAccessException { super(ins, DistributeShapes.class, ins.distribHorizEq, ins.distribHorizLeft, ins.distribHorizMid, ins.distribHorizRight, ins.distribVertBot, ins.distribVertEq, ins.distribVertMid, ins.distribVertTop); } @Override public void initAction() { action.setDistribution((DistributeShapes.Distribution) getInteraction().getWidget().getUserData()); action.setCanvas(getInstrument().canvas); action.setShape(instrument.pencil.canvas.getDrawing().getSelection().duplicateDeep(false)); } } }