package net.sourceforge.fidocadj.circuit.controllers;
import java.io.*;
import net.sourceforge.fidocadj.circuit.model.*;
import net.sourceforge.fidocadj.geom.*;
import net.sourceforge.fidocadj.globals.*;
import net.sourceforge.fidocadj.layers.*;
import net.sourceforge.fidocadj.primitives.*;
/** Extends ElementsEdtActions in order to support those events such as
MouseMove, which require a continuous interaction and an immediate
rendering.
<pre>
This file is part of FidoCadJ.
FidoCadJ 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 3 of the License, or
(at your option) any later version.
FidoCadJ 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with FidoCadJ. If not,
@see <a href=http://www.gnu.org/licenses/>http://www.gnu.org/licenses/</a>.
Copyright 2014 by Davide Bucci
</pre>
@author Davide Bucci
*/
public class ContinuosMoveActions extends ElementsEdtActions
{
// A coordinates listener
private ChangeCoordinatesListener coordinatesListener=null;
private int oldx;
private int oldy;
/** Constructor
@param pp the DrawingModel to be associated to the controller
@param s the selection controller.
@param u undo controller, exploited here
@param e editor controller, exploited here
*/
public ContinuosMoveActions(DrawingModel pp, SelectionActions s,
UndoActions u,
EditorActions e)
{
super(pp, s, u, e);
oldx=-1;
oldy=-1;
}
/** Define the listener to be called when the coordinates of the mouse
cursor are changed
@param c the new coordinates listener
*/
public void addChangeCoordinatesListener(ChangeCoordinatesListener c)
{
coordinatesListener=c;
}
/** Handle a continuous move of the pointer device. It can be the result
of a mouse drag for a rectangular selection, or a component move.
@param cs the coordinate mapping which should be used
@param xa the pointer position (x), in screen coordinates
@param ya the pointer position (y), in screen coordinates
@param isControl true if the CTRL key is pressed. This modifies
some behaviors (for example, when introducing an ellipse it is
forced to be a circle and so on).
@return true if a repaint should be done
*/
public boolean continuosMove(MapCoordinates cs,
int xa, int ya,
boolean isControl)
{
// This transformation/antitrasformation is useful to take care
// of the snapping.
int x=cs.mapX(cs.unmapXsnap(xa),0);
int y=cs.mapY(0,cs.unmapYsnap(ya));
// If there is anything interesting to do, leave immediately.
if(oldx==x && oldy==y)
return false;
oldx=x;
oldy=y;
// Notify the current pointer coordinates, if a listener is available.
if (coordinatesListener!=null)
coordinatesListener.changeCoordinates(
cs.unmapXsnap(xa),
cs.unmapYsnap(ya));
boolean toRepaint=false;
// This is the newer code: if primEdit is different from null,
// it will be drawn in the paintComponent event
// We need to differentiate this case since when we are entering a
// macro, primEdit contains some useful hints about the orientation
// and the mirroring
if (actionSelected !=ElementsEdtActions.MACRO)
primEdit = null;
/* MACRO ***********************************************************
+1+# #
# #
#########
## ##### ##
#############
###############
# ########### #
# # # #
#### ####
*/
if (actionSelected == ElementsEdtActions.MACRO) {
try {
int orientation = 0;
boolean mirror = false;
if (primEdit instanceof PrimitiveMacro) {
orientation = ((PrimitiveMacro)primEdit).getOrientation();
mirror = ((PrimitiveMacro)primEdit).isMirrored();
}
PrimitiveMacro n = new PrimitiveMacro(dmp.getLibrary(),
StandardLayers.createEditingLayerArray(), cs.unmapXsnap(x),
cs.unmapYsnap(y),macroKey,"", cs.unmapXsnap(x)+10,
cs.unmapYsnap(y)+5, "", cs.unmapXsnap(x)+10,
cs.unmapYsnap(y)+10,
dmp.getTextFont(),
dmp.getTextFontSize(), orientation, mirror);
n.setDrawOnlyLayer(-1);
primEdit = n;
toRepaint=true;
successiveMove = true;
} catch (IOException E) {
// Here we do not do nothing.
System.out.println("Warning: exception while handling macro: "
+E);
}
}
if (clickNumber == 0) {
return toRepaint;
}
/* LINE **************************************************************
+1+
**
**
**
**
+2+
*/
if (actionSelected == ElementsEdtActions.LINE) {
primEdit = new PrimitiveLine(xpoly[1],
ypoly[1], cs.unmapXsnap(x), cs.unmapYsnap(y), 0,
false, false, 0, 3, 2, 0, dmp.getTextFont(),
dmp.getTextFontSize());
toRepaint=true;
successiveMove = true;
if (coordinatesListener!=null){
double w = Math.sqrt((xpoly[1]-
cs.unmapXsnap(xa))*
(xpoly[1]-cs.unmapXsnap(xa))+
(ypoly[1]-cs.unmapYsnap(ya))*
(ypoly[1]-cs.unmapYsnap(ya)));
double wmm = w*127/1000;
coordinatesListener.changeInfos(
Globals.messages.getString("length")+Globals.roundTo(w,2)+
" ("+Globals.roundTo(wmm,2)+" mm)");
}
}
/* PCBLINE ***********************************************************
+1+
***
***
***
***
+2+
*/
if (actionSelected == ElementsEdtActions.PCB_LINE) {
primEdit = new PrimitivePCBLine(xpoly[1],
ypoly[1], cs.unmapXsnap(x), cs.unmapYsnap(y),
ae.getPCB_thickness(), 0, dmp.getTextFont(),
dmp.getTextFontSize());
toRepaint=true;
successiveMove = true;
if (coordinatesListener!=null){
double w = Math.sqrt((xpoly[1]-
cs.unmapXsnap(xa))*
(xpoly[1]-cs.unmapXsnap(xa))+
(ypoly[1]-cs.unmapYsnap(ya))*
(ypoly[1]-cs.unmapYsnap(ya)));
coordinatesListener.changeInfos(
Globals.messages.getString("length")+
Globals.roundTo(w,2));
}
}
/* BEZIER ************************************************************
+3+
+1+ ******
**** **
+2+ **
**
**
+4+
*/
if (actionSelected == ElementsEdtActions.BEZIER) {
// Since we do not know how to fabricate a cubic curve with less
// than four points, we use a polygon instead.
primEdit = new PrimitivePolygon(false, 0, 0,
dmp.getTextFont(), dmp.getTextFontSize());
for(int i=1; i<=clickNumber; ++i)
((PrimitivePolygon)primEdit).addPoint(xpoly[i], ypoly[i]);
((PrimitivePolygon)primEdit).addPoint(cs.unmapXsnap(x),
cs.unmapYsnap(y));
toRepaint=true;
successiveMove = true;
}
/* POLYGON ***********************************************************
+1+ +3+
**************
***********
********
*****
+2+
*/
if (actionSelected == ElementsEdtActions.POLYGON) {
primEdit = new PrimitivePolygon(false, 0, 0,
dmp.getTextFont(), dmp.getTextFontSize());
for(int i=1; i<=clickNumber && i<ElementsEdtActions.NPOLY; ++i)
((PrimitivePolygon)primEdit).addPoint(xpoly[i], ypoly[i]);
((PrimitivePolygon)primEdit).addPoint(cs.unmapXsnap(x),
cs.unmapYsnap(y));
toRepaint=true;
successiveMove = true;
}
/* COMPLEX CURVE ****************************************************
+1+ +5+
***** *****
****************+4+
+2+***********
****
+3+
*/
if (actionSelected == ElementsEdtActions.COMPLEXCURVE) {
primEdit = new PrimitiveComplexCurve(false, false, 0,
false, false, 0, 3, 2, 0,
dmp.getTextFont(),dmp.getTextFontSize());
for(int i=1; i<=clickNumber && i<ElementsEdtActions.NPOLY; ++i)
((PrimitiveComplexCurve)primEdit).addPoint(xpoly[i], ypoly[i]);
((PrimitiveComplexCurve)primEdit).addPoint(cs.unmapXsnap(x),
cs.unmapYsnap(y));
toRepaint=true;
successiveMove = true;
}
/* RECTANGLE *********************************************************
+1+
**********
**********
**********
**********
+2+
*/
if (actionSelected == ElementsEdtActions.RECTANGLE) {
// If control is hold, trace a square
int ymm;
if(isControl&&clickNumber>0) {
ymm=cs.mapY(xpoly[1],ypoly[1])+x-cs.mapX(xpoly[1],ypoly[1]);
} else {
ymm=y;
}
primEdit = new PrimitiveRectangle(xpoly[1],
ypoly[1], cs.unmapXsnap(x), cs.unmapYsnap(ymm),
false, 0, 0, dmp.getTextFont(), dmp.getTextFontSize());
toRepaint=true;
successiveMove = true;
}
/* ELLIPSE ***********************************************************
+1+
***
*******
*********
*********
*******
***
+2+
*/
if (actionSelected == ElementsEdtActions.ELLIPSE) {
// If control is hold, trace a circle
int ymm;
if(isControl&&clickNumber>0) {
ymm=cs.mapY(xpoly[1],ypoly[1])+x-cs.mapX(xpoly[1],ypoly[1]);
} else {
ymm=y;
}
primEdit = new PrimitiveOval(xpoly[1],
ypoly[1], cs.unmapXsnap(x), cs.unmapYsnap(ymm),
false, 0, 0, dmp.getTextFont(), dmp.getTextFontSize());
toRepaint=true;
successiveMove = true;
}
return toRepaint;
}
}