/*
JWildfire - an image and animation processor written in Java
Copyright (C) 1995-2014 Andreas Maschke
This is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser
General Public License as published by the Free Software Foundation; either version 2.1 of the
License, or (at your option) any later version.
This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with this software;
if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jwildfire.create.tina.swing.flamepanel;
import java.awt.Graphics2D;
import org.jwildfire.base.Prefs;
import org.jwildfire.create.tina.base.XForm;
import org.jwildfire.create.tina.swing.MouseDragOperation;
public class CrosshairControlHandler extends AbstractControlHandler<TriangleControlShape> {
public CrosshairControlHandler(Prefs pPrefs, FlamePanelConfig pConfig) {
super(pPrefs, pConfig);
}
@Override
public void drawXForm(Graphics2D g, XForm pXForm, int pIndex, int pXFormCount, boolean pIsFinal, boolean pShadow, boolean pIsSelected) {
if (!pShadow) {
if (config.isWithColoredTransforms()) {
int row = pIsFinal ? pXFormCount + pIndex : pIndex;
int colorIdx = row % FlamePanelConfig.XFORM_COLORS.length;
g.setColor(XFORM_COLORS[colorIdx]);
}
else {
g.setColor(pIsFinal ? XFORM_POST_COLOR : XFORM_COLOR);
}
}
TriangleControlShape triangle = convertXFormToShape(pXForm);
if (pShadow) {
for (int i = 0; i < triangle.viewX.length; i++) {
triangle.viewX[i] += SHADOW_DIST;
triangle.viewY[i] += SHADOW_DIST;
}
}
g.setStroke(pIsSelected ? SELECTED_LINE_NEW : NORMAL_LINE_NEW);
// selected point
if (pIsSelected) {
if ((config.getMouseDragOperation() == MouseDragOperation.POINTS)) {
int radius = 10;
g.fillOval(triangle.viewX[config.getSelectedPoint()] - radius / 2, triangle.viewY[config.getSelectedPoint()] - radius / 2, radius, radius);
}
int dx, dy;
dx = triangle.viewX[0] - triangle.viewX[1];
dy = triangle.viewY[0] - triangle.viewY[1];
g.drawLine(triangle.viewX[1], triangle.viewY[1], triangle.viewX[1] + dx, triangle.viewY[1] + dy);
g.drawLine(triangle.viewX[1], triangle.viewY[1], triangle.viewX[1] - dx, triangle.viewY[1] - dy);
dx = triangle.viewX[2] - triangle.viewX[1];
dy = triangle.viewY[2] - triangle.viewY[1];
g.drawLine(triangle.viewX[1], triangle.viewY[1], triangle.viewX[1] + dx, triangle.viewY[1] + dy);
g.drawLine(triangle.viewX[1], triangle.viewY[1], triangle.viewX[1] - dx, triangle.viewY[1] - dy);
}
}
private final static double TRIANGLE_SCALE_CROSS = 0.1;
@Override
public boolean isInsideXForm(XForm pXForm, int pX, int pY) {
return insideTriange(convertXFormToShape(pXForm), pX, pY);
}
@Override
public TriangleControlShape convertXFormToShape(XForm pXForm) {
return new TriangleControlShape(config, pXForm, TRIANGLE_SCALE_CROSS);
}
@Override
public int selectNearestPoint(XForm pXForm, int pViewX, int pViewY) {
return selectNearestPointFromTriangle(convertXFormToShape(pXForm), pViewX, pViewY);
}
}