/*
* 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.view.pst;
import net.sf.latexdraw.models.MathUtils;
import net.sf.latexdraw.models.interfaces.shape.Color;
import net.sf.latexdraw.models.interfaces.shape.IGrid;
import net.sf.latexdraw.models.interfaces.shape.IPoint;
import org.eclipse.jdt.annotation.NonNull;
/**
* Defines a PSTricks view of the LGrid model.
* @author Arnaud Blouin
*/
public class PSTGridView extends PSTShapeView<IGrid> {
/**
* Creates and initialises a LGrid PSTricks view.
* @param model The model to view.
* @throws IllegalArgumentException If the given model is not valid.
* @since 3.0
*/
protected PSTGridView(final @NonNull IGrid model) {
super(model);
}
/**
* Returns the PST code of the parameters of the grid.
*/
private StringBuilder getParamsCode(final float ppc, final double unit) {
final Color gridLabelsColor = shape.getGridLabelsColour();
final Color subGridColor = shape.getSubGridColour();
final Color linesColor = shape.getLineColour();
final StringBuilder params = new StringBuilder();
params.append("gridwidth=").append(MathUtils.INST.getCutNumberFloat(shape.getGridWidth() / ppc)); //$NON-NLS-1$
params.append(", subgridwidth=").append(MathUtils.INST.getCutNumberFloat(shape.getSubGridWidth() / ppc)); //$NON-NLS-1$
params.append(", gridlabels=").append(MathUtils.INST.getCutNumber(shape.getLabelsSize() * 0.6f)).append("pt"); //$NON-NLS-1$ //$NON-NLS-2$
if(shape.getSubGridDiv() != PSTricksConstants.DEFAULT_SUBGRIDDIV)
params.append(", subgriddiv=").append(shape.getSubGridDiv()); //$NON-NLS-1$
if(shape.getGridDots() != PSTricksConstants.DEFAULT_GRIDDOTS)
params.append(", griddots=").append(shape.getGridDots()); //$NON-NLS-1$
if(shape.getSubGridDots() != PSTricksConstants.DEFAULT_SUBGRIDDOTS)
params.append(", subgriddots=").append(shape.getSubGridDots()); //$NON-NLS-1$
if(!gridLabelsColor.equals(PSTricksConstants.DEFAULT_LABELGRIDCOLOR))
params.append(", gridlabelcolor=").append(getColourName(gridLabelsColor)); //$NON-NLS-1$
if(!MathUtils.INST.equalsDouble(unit, PSTricksConstants.DEFAULT_UNIT))
params.append(", unit=").append(MathUtils.INST.getCutNumberFloat(unit)).append(PSTricksConstants.TOKEN_CM); //$NON-NLS-1$
if(!linesColor.equals(PSTricksConstants.DEFAULT_GRIDCOLOR))
params.append(", gridcolor=").append(getColourName(linesColor)); //$NON-NLS-1$
params.append(", subgridcolor=").append(getColourName(subGridColor)); //$NON-NLS-1$
return params;
}
@Override
public String getCode(final IPoint pt, final float ppc) {
if(!MathUtils.INST.isValidPt(pt) || ppc < 1) return "";
final int startX;
final int startY;
final int endX;
final int endY;
final boolean isXLabelSouth = shape.isXLabelSouth();
final boolean isYLabelWest = shape.isYLabelWest();
final IPoint position = shape.getPosition();
final StringBuilder start = new StringBuilder();
final StringBuilder end = new StringBuilder();
final StringBuilder rot = getRotationHeaderCode(ppc, position);
final StringBuilder coord = new StringBuilder();
final double unit = shape.getUnit();
final double gridStartx = shape.getGridStartX();
final double gridStarty = shape.getGridStartY();
final double gridEndx = shape.getGridEndX();
final double gridEndy = shape.getGridEndY();
final StringBuilder code = new StringBuilder();
if(isXLabelSouth) {
startY = (int) gridStarty;
endY = (int) gridEndy;
}else {
startY = (int) gridEndy;
endY = (int) gridStarty;
}
if(isYLabelWest) {
startX = (int) gridStartx;
endX = (int) gridEndx;
}else {
startX = (int) gridEndx;
endX = (int) gridStartx;
}
coord.append('(').append((int) shape.getOriginX()).append(',').append((int) shape.getOriginY()).append(')');
coord.append('(').append(startX).append(',').append(startY).append(')');
coord.append('(').append(endX).append(',').append(endY).append(')');
if(!MathUtils.INST.equalsDouble(unit, PSTricksConstants.DEFAULT_UNIT))
end.append("\n\\psset{unit=").append(PSTricksConstants.DEFAULT_UNIT).append(PSTricksConstants.TOKEN_CM).append('}');//$NON-NLS-1$
if(!MathUtils.INST.equalsDouble(position.getX(), 0.0) || !MathUtils.INST.equalsDouble(position.getY(), 0.0)) {
final float posX = MathUtils.INST.getCutNumberFloat((position.getX() - pt.getX()) / ppc);
final float posY = MathUtils.INST.getCutNumberFloat((pt.getY() - position.getY()) / ppc);
end.append('}');
start.append("\\rput(").append(posX).append(',').append(posY).append(')').append('{');//$NON-NLS-1$
}
if(rot != null) {
start.append(rot);
end.insert(0, '}');
}
code.append(start);
code.append("\\psgrid[");//$NON-NLS-1$
code.append(getParamsCode(ppc, unit));
code.append(']');
code.append(coord);
code.append(end);
return code.toString();
}
}