/*
* 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.models.impl;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleIntegerProperty;
import net.sf.latexdraw.models.MathUtils;
import net.sf.latexdraw.models.ShapeFactory;
import net.sf.latexdraw.models.interfaces.prop.IStdGridProp;
import net.sf.latexdraw.models.interfaces.shape.IPoint;
import net.sf.latexdraw.models.interfaces.shape.IShape;
import net.sf.latexdraw.models.interfaces.shape.IStandardGrid;
/**
* A implementation of an abstract latex grid.
* @author Arnaud Blouin
*/
abstract class LAbstractGrid extends LPositionShape implements IStandardGrid {
/** The x-minimum values of the axes */
protected final DoubleProperty gridStartx;
/** The y-minimum values of the axes */
protected final DoubleProperty gridStarty;
/** The x-maximum values of the axes */
protected final DoubleProperty gridEndx;
/** The y-maximum values of the axes */
protected final DoubleProperty gridEndy;
/** The x-coordinate of the origin of the grid */
protected final DoubleProperty originx;
/** The y-coordinate of the origin of the grid */
protected final DoubleProperty originy;
/** The size of the labels. */
protected final IntegerProperty labelSize;
/**
* Creates an abstract grid.
* @param pt The position
*/
LAbstractGrid(final IPoint pt) {
super(pt);
originx = new SimpleDoubleProperty(0d);
originy = new SimpleDoubleProperty(0d);
gridStartx = new SimpleDoubleProperty(0d);
gridStarty = new SimpleDoubleProperty(0d);
gridEndx = new SimpleDoubleProperty(2d);
gridEndy = new SimpleDoubleProperty(2d);
labelSize = new SimpleIntegerProperty(10);
}
@Override
public double getGridMinX() {
return getGridEndX() < getGridStartX() ? getGridEndX() : getGridStartX();
}
@Override
public double getGridMaxX() {
return getGridEndX() >= getGridStartX() ? getGridEndX() : getGridStartX();
}
@Override
public double getGridMinY() {
return getGridEndY() < getGridStartY() ? getGridEndY() : getGridStartY();
}
@Override
public double getGridMaxY() {
return getGridEndY() >= getGridStartY() ? getGridEndY() : getGridStartY();
}
@Override
public IPoint getBottomRightPoint() {
final IPoint pos = getPosition();
return ShapeFactory.INST.createPoint(pos.getX() + getGridMaxX() * PPC, pos.getY() - getGridMinY() * PPC);
}
@Override
public IPoint getTopLeftPoint() {
final IPoint pos = getPosition();
return ShapeFactory.INST.createPoint(pos.getX() + getGridMinX() * PPC, pos.getY() - getGridMaxY() * PPC);
}
@Override
public IPoint getTopRightPoint() {
final IPoint pos = getPosition();
final double step = getStep();
//FIXME strange: different from getTopLeftPoint and co. but works for scale.
return ShapeFactory.INST.createPoint(pos.getX() + step * (getGridEndX() - getGridStartX()), pos.getY() - step * (getGridEndY() - getGridStartY()));
}
@Override
public void mirrorHorizontal(final IPoint origin) {
if(origin == null) return;
final IPoint bl = points.get(0).horizontalSymmetry(origin);
final IPoint br = getBottomRightPoint().horizontalSymmetry(origin);
points.get(0).setPoint(br.getX() < bl.getX() ? br.getX() : bl.getX(), br.getY());
}
@Override
public void mirrorVertical(final IPoint origin) {
if(origin == null) return;
final IPoint bl = points.get(0).verticalSymmetry(origin);
final IPoint tl = getTopLeftPoint().verticalSymmetry(origin);
points.get(0).setPoint(bl.getX(), bl.getY() > tl.getY() ? bl.getY() : tl.getY());
}
@Override
public void setLabelsSize(final int labelsSize) {
if(labelsSize >= 0) {
labelSize.set(labelsSize);
}
}
@Override
public double getGridEndX() {
return gridEndx.get();
}
@Override
public double getGridEndY() {
return gridEndy.get();
}
@Override
public double getGridStartX() {
return gridStartx.get();
}
@Override
public double getGridStartY() {
return gridStarty.get();
}
@Override
public int getLabelsSize() {
return labelSize.get();
}
@Override
public double getOriginX() {
return originx.get();
}
@Override
public double getOriginY() {
return originy.get();
}
@Override
public void setGridEnd(final double x, final double y) {
setGridEndX(x);
setGridEndY(y);
}
@Override
public void setGridEndX(final double x) {
if(x >= getGridStartX() && MathUtils.INST.isValidCoord(x)) {
gridEndx.set(x);
}
}
@Override
public void setGridEndY(final double y) {
if(y >= getGridStartY() && MathUtils.INST.isValidCoord(y)) {
gridEndy.set(y);
}
}
@Override
public void setGridStart(final double x, final double y) {
setGridStartX(x);
setGridStartY(y);
}
@Override
public void setGridStartX(final double x) {
if(x <= getGridEndX() && MathUtils.INST.isValidCoord(x)) {
gridStartx.set(x);
}
}
@Override
public void setGridStartY(final double y) {
if(y <= getGridEndY() && MathUtils.INST.isValidCoord(y)) {
gridStarty.set(y);
}
}
@Override
public void setOrigin(final double x, final double y) {
setOriginX(x);
setOriginY(y);
}
@Override
public void setOriginX(final double x) {
if(MathUtils.INST.isValidCoord(x)) {
originx.set(x);
}
}
@Override
public void setOriginY(final double y) {
if(MathUtils.INST.isValidCoord(y)) {
originy.set(y);
}
}
@Override
public void copy(final IShape s) {
super.copy(s);
if(s instanceof IStdGridProp) {
final IStdGridProp grid = (IStdGridProp) s;
gridEndx.set(grid.getGridEndX());
gridEndy.set(grid.getGridEndY());
gridStartx.set(grid.getGridStartX());
gridStarty.set(grid.getGridStartY());
originx.set(grid.getOriginX());
originy.set(grid.getOriginY());
setLabelsSize(grid.getLabelsSize());
}
}
@Override
public IPoint getGridStart() {
return ShapeFactory.INST.createPoint(getGridStartX(), getGridStartY());
}
@Override
public IPoint getGridEnd() {
return ShapeFactory.INST.createPoint(getGridEndX(), getGridEndY());
}
@Override
public IntegerProperty labelsSizeProperty() {
return labelSize;
}
@Override
public DoubleProperty gridStartXProperty() {
return gridStartx;
}
@Override
public DoubleProperty gridStartYProperty() {
return gridStarty;
}
@Override
public DoubleProperty gridEndXProperty() {
return gridEndx;
}
@Override
public DoubleProperty gridEndYProperty() {
return gridEndy;
}
@Override
public DoubleProperty originXProperty() {
return originx;
}
@Override
public DoubleProperty originYProperty() {
return originy;
}
}