package latexDraw.ui;
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Point;
import java.awt.event.*;
import java.awt.geom.Arc2D;
import java.io.File;
import java.io.ObjectInputStream;
import javax.swing.*;
import latexDraw.figures.*;
import latexDraw.figures.properties.Arrowable;
import latexDraw.lang.LaTeXDrawLang;
import latexDraw.psTricks.PSTricksConstants;
import latexDraw.ui.dialog.ExceptionFrameDialog;
import latexDraw.util.LaTeXDrawCursor;
import latexDraw.util.LaTeXDrawNamespace;
import latexDraw.util.LaTeXDrawPoint2D;
import latexDraw.util.LaTeXDrawResources;
import latexDraw.util.UndoRedoManager;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
/**
*
* This class defines the panel which contains the drawing which is used to generate the psTricks code.<br>
*<br>
* This file is part of LaTeXDraw.<br>
* Copyright (c) 2005-2008 Arnaud BLOUIN<br>
*<br>
* 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
* any later version.<br>
*<br>
* 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.<br>
*<br>
* 01/20/06<br>
* @author Arnaud BLOUIN<br>
* @version 2.0.0<br>
*/
public final class DrawPanel extends JScrollPane implements MouseListener, MouseMotionListener, ActionListener, MouseWheelListener
{
private static final long serialVersionUID = 1L;
/** Contains all figures of the current project */
protected DrawContainer draw;
/** Correspond to the codepanel of the program */
protected CodePanel codePanel;
/** Correspond to the current figure in drawing */
protected Figure currentFigure;
/** The former position of the cursor. Useful for
* figure shifting */
protected Point formerPoint;
/** The frame parent of the drawPanel @see LaTeXDrawFrame */
protected LaTeXDrawFrame frameParent;
/** The pop-up menu which allows to do some actions about general
* Functions (draw a figure, select a figure,...) */
protected JPopupMenu popupGeneral;
/** This pop-up menu allows the user to do some actions about
* the selected figure (delete, properties, ...) */
protected JPopupMenu popupFigure;
/** If not null, it represents a figure before being moved */
protected Draw cloneForDragged;
protected LaTeXDrawRectangle bordersSelection;
private JRadioButtonMenuItem menuLine;
private JRadioButtonMenuItem menuDot;
private JRadioButtonMenuItem menuRect;
private JRadioButtonMenuItem menuCircle;
private JRadioButtonMenuItem menuEllipse;
private JRadioButtonMenuItem menuSquare;
private JRadioButtonMenuItem menuRhombus;
private JRadioButtonMenuItem menuPoly;
private JRadioButtonMenuItem menuArc;
private JRadioButtonMenuItem menuWedge;
private JRadioButtonMenuItem menuTriangle;
private JRadioButtonMenuItem menuSelect;
private JRadioButtonMenuItem menuText;
private JRadioButtonMenuItem menuPointsAkin;
private JRadioButtonMenuItem menuGrid;
private JRadioButtonMenuItem menuAxes;
private JRadioButtonMenuItem menuChord;
private JRadioButtonMenuItem menuBezier;
private JRadioButtonMenuItem menuClosedBezier;
private JRadioButtonMenuItem menuJoinedLines;
private JMenuItem menuDel;
private JMenuItem menuProperties;
private JMenuItem menuJoin;
private JMenuItem menuSeparate;
public JMenuItem menuUpdateToGrid;
private JCheckBoxMenuItem menuRotate;
/** Allows to know if the user must select a figure to put
* the selected figure behind the clicked figure */
private boolean onWaitingClicDispositionBehind;
/** Allows to know if the user must select a figure to put
* the selected figure in front of the clicked figure */
private boolean onWaitingClicDispositionFront;
/** This field allows to know if the last selection was empty or not (useful to the method onDragged). */
private transient boolean formerSelectionEmpty = true;
public static final String LABEL_UPDATE_TO_GRID = LaTeXDrawLang.getString1_9("DrawPanel.0"); //$NON-NLS-1$
public static final String ACTION_CMD_UPDATETOGRID = "updToGrid";//$NON-NLS-1$
/**
* The second constructor
* @param d The drawing of the project (compulsory in order to
* call the super-constructor of the @see JScrollPane class to use
* elevator
*/
public DrawPanel(DrawContainer d, CodePanel codePanel, LaTeXDrawFrame parent)
{
super(d);
d.getGrid().setMagnetic(false);
bordersSelection = null;
cloneForDragged = null;
frameParent = parent;
this.codePanel = codePanel;
currentFigure = null;
draw = d;
draw.setParentPanel(this);
draw.addMouseListener(this);
draw.addMouseMotionListener(this);
addMouseWheelListener(this);
draw.updatePreferredSize();
draw.revalidate();
onWaitingClicDispositionBehind = false;
onWaitingClicDispositionFront = false;
createPopupGeneral();
createPopupFigure();
setDoubleBuffered(true);
}
public boolean isOnRotation()
{
return draw.isOnRotation();
}
public void setOnRotation(boolean on)
{
draw.setOnRotation(on);
menuRotate.setSelected(on);
}
/**
* Allows to put the selected figure in the background
*/
public void selectedInBackground()
{
draw.selectedInBackground();
if(codePanel.isInAutoUpdate())
updateCode();
}
/**
* Allows to put the selected figure in the foreground
*/
public void selectedInForeground()
{
draw.selectedInForeground();
if(codePanel.isInAutoUpdate())
updateCode();
}
/**
* Allows to zoom in the drawing (up to 450%)
*/
public void zoomIn()
{
draw.zoomIn();
}
/**
* Allows to zoom out the drawing (up to 25%)
*/
public void zoomOut()
{
draw.zoomOut();
}
/**
* Allows to set the zoom to default
*/
public void zoomDefault()
{
draw.zoomDefault();
}
/**
* Allows to get the current zoom
* @return The zoom
*/
public double getZoom()
{
return draw.getZoom();
}
/**
* Allows to create the pop-up menu which concern a selected figure
*/
private void createPopupFigure()
{
popupFigure = new JPopupMenu();
menuDel = new JMenuItem(LaTeXDrawResources.LABEL_DELETE, LaTeXDrawResources.delIcon);
menuDel.setActionCommand(LaTeXDrawResources.LABEL_DELETE);
menuDel.addActionListener(frameParent.menusListener);
popupFigure.add(menuDel);
popupFigure.addSeparator();
menuProperties = new JMenuItem(LaTeXDrawResources.LABEL_FIGURE_PROPERTIES, LaTeXDrawResources.propertiesIcon);
menuProperties.setActionCommand(LaTeXDrawResources.LABEL_FIGURE_PROPERTIES);
menuProperties.addActionListener(frameParent.menusListener);
popupFigure.add(menuProperties);
popupFigure.addSeparator();
JMenuItem menu2 = new JMenuItem(LaTeXDrawResources.LABEL_FOREGROUND, LaTeXDrawResources.foregroundIcon);
menu2.setActionCommand(LaTeXDrawResources.LABEL_FOREGROUND);
menu2.addActionListener(frameParent);
popupFigure.add(menu2);
menu2 = new JMenuItem(LaTeXDrawResources.LABEL_BACKGROUND, LaTeXDrawResources.backgroundIcon);
menu2.setActionCommand(LaTeXDrawResources.LABEL_BACKGROUND);
menu2.addActionListener(frameParent);
popupFigure.add(menu2);
menu2 = new JMenuItem(LaTeXDrawResources.LABEL_FRONT_SEL, LaTeXDrawResources.inFrontOfSelIcon);
menu2.setActionCommand(LaTeXDrawResources.LABEL_FRONT_SEL);
menu2.addActionListener(frameParent);
popupFigure.add(menu2);
menu2 = new JMenuItem(LaTeXDrawResources.LABEL_BEHIND_SEL, LaTeXDrawResources.behindSelIcon);
menu2.setActionCommand(LaTeXDrawResources.LABEL_BEHIND_SEL);
menu2.addActionListener(frameParent);
popupFigure.add(menu2);
popupFigure.addSeparator();
menuJoin = new JMenuItem(LaTeXDrawResources.LABEL_JOIN, LaTeXDrawResources.joinIcon);
menuJoin.setActionCommand(LaTeXDrawResources.LABEL_JOIN);
menuJoin.addActionListener(frameParent);
popupFigure.add(menuJoin);
menuSeparate = new JMenuItem(LaTeXDrawResources.LABEL_SEPARATE, LaTeXDrawResources.separateIcon);
menuSeparate.setActionCommand(LaTeXDrawResources.LABEL_SEPARATE);
menuSeparate.addActionListener(frameParent);
popupFigure.add(menuSeparate);
popupFigure.addSeparator();
menuRotate = new JCheckBoxMenuItem(LaTeXDrawResources.LABEL_ROTATE, LaTeXDrawResources.rotateIcon);
menuRotate.setActionCommand(LaTeXDrawResources.LABEL_ROTATE);
menuRotate.addActionListener(frameParent);
popupFigure.add(menuRotate);
popupFigure.addSeparator();
menuUpdateToGrid = new JMenuItem(LABEL_UPDATE_TO_GRID, LaTeXDrawResources.emptyIcon);
menuUpdateToGrid.setActionCommand(ACTION_CMD_UPDATETOGRID);
menuUpdateToGrid.addActionListener(this);
popupFigure.add(menuUpdateToGrid);
popupFigure.addSeparator();
menu2 = new JMenuItem(LaTeXDrawResources.LABEL_TEMPLATE_EXPORT, LaTeXDrawResources.emptyIcon);
menu2.setActionCommand(LaTeXDrawResources.LABEL_TEMPLATE_EXPORT);
menu2.addActionListener(frameParent.menusListener);
popupFigure.add(menu2);
}
/**
* Allows to create a pop-up menu concerning general actions
*/
private void createPopupGeneral()
{
ButtonGroup drawGroup = new ButtonGroup();
popupGeneral = new JPopupMenu();
menuSelect = new JRadioButtonMenuItem(LaTeXDrawResources.LABEL_SELECT_FIGURE, LaTeXDrawResources.selectIcon);
menuSelect.setActionCommand(LaTeXDrawResources.LABEL_SELECT_FIGURE);
menuSelect.addActionListener(frameParent.menusListener);
menuSelect.setSelected(true);
popupGeneral.add(menuSelect);
drawGroup.add(menuSelect);
popupGeneral.addSeparator();
menuLine = new JRadioButtonMenuItem(LaTeXDrawResources.LABEL_LINE, LaTeXDrawResources.lineIcon);
menuLine.setActionCommand(LaTeXDrawResources.LABEL_LINE);
menuLine.addActionListener(frameParent.menusListener);
popupGeneral.add(menuLine);
drawGroup.add(menuLine);
menuJoinedLines = new JRadioButtonMenuItem(LaTeXDrawResources.LABEL_JOINED_LINES, LaTeXDrawResources.joinedLinesIcon);
menuJoinedLines.setActionCommand(LaTeXDrawResources.LABEL_JOINED_LINES);
menuJoinedLines.addActionListener(frameParent.menusListener);
popupGeneral.add(menuJoinedLines);
drawGroup.add(menuJoinedLines);
menuPoly = new JRadioButtonMenuItem(LaTeXDrawResources.LABEL_POLY, LaTeXDrawResources.polygonIcon);
menuPoly.setActionCommand(LaTeXDrawResources.LABEL_POLY);
menuPoly.addActionListener(frameParent.menusListener);
popupGeneral.add(menuPoly);
drawGroup.add(menuPoly);
menuDot = new JRadioButtonMenuItem(LaTeXDrawResources.LABEL_DOT, LaTeXDrawResources.dotIcon);
menuDot.setActionCommand(LaTeXDrawResources.LABEL_DOT);
menuDot.addActionListener(frameParent.menusListener);
popupGeneral.add(menuDot);
drawGroup.add(menuDot);
menuRect = new JRadioButtonMenuItem(LaTeXDrawResources.LABEL_RECT, LaTeXDrawResources.rectIcon);
menuRect.setActionCommand(LaTeXDrawResources.LABEL_RECT);
menuRect.addActionListener(frameParent.menusListener);
popupGeneral.add(menuRect);
drawGroup.add(menuRect);
menuSquare = new JRadioButtonMenuItem(LaTeXDrawResources.LABEL_SQUARE, LaTeXDrawResources.squareIcon);
menuSquare.setActionCommand(LaTeXDrawResources.LABEL_SQUARE);
menuSquare.addActionListener(frameParent.menusListener);
popupGeneral.add(menuSquare);
drawGroup.add(menuSquare);
menuRhombus = new JRadioButtonMenuItem(LaTeXDrawResources.LABEL_RHOMBUS, LaTeXDrawResources.rhombusIcon);
menuRhombus.setActionCommand(LaTeXDrawResources.LABEL_RHOMBUS);
menuRhombus.addActionListener(frameParent.menusListener);
popupGeneral.add(menuRhombus);
drawGroup.add(menuRhombus);
menuTriangle = new JRadioButtonMenuItem(LaTeXDrawResources.LABEL_TRIANGLE, LaTeXDrawResources.triangleIcon);
menuTriangle.setActionCommand(LaTeXDrawResources.LABEL_TRIANGLE);
menuTriangle.addActionListener(frameParent.menusListener);
popupGeneral.add(menuTriangle);
drawGroup.add(menuTriangle);
menuEllipse = new JRadioButtonMenuItem(LaTeXDrawResources.LABEL_ELLIPSE, LaTeXDrawResources.ellipseIcon);
menuEllipse.setActionCommand(LaTeXDrawResources.LABEL_ELLIPSE);
menuEllipse.addActionListener(frameParent.menusListener);
popupGeneral.add(menuEllipse);
drawGroup.add(menuEllipse);
menuCircle = new JRadioButtonMenuItem(LaTeXDrawResources.LABEL_CIRCLE, LaTeXDrawResources.circleIcon);
menuCircle.setActionCommand(LaTeXDrawResources.LABEL_CIRCLE);
menuCircle.addActionListener(frameParent.menusListener);
popupGeneral.add(menuCircle);
drawGroup.add(menuCircle);
menuArc = new JRadioButtonMenuItem(LaTeXDrawResources.LABEL_ARC, LaTeXDrawResources.arcIcon);
menuArc.setActionCommand(LaTeXDrawResources.LABEL_ARC);
menuArc.addActionListener(frameParent.menusListener);
popupGeneral.add(menuArc);
drawGroup.add(menuArc);
menuChord = new JRadioButtonMenuItem(LaTeXDrawResources.LABEL_CHORD, LaTeXDrawResources.chordIcon);
menuChord.setActionCommand(LaTeXDrawResources.LABEL_CHORD);
menuChord.addActionListener(frameParent.menusListener);
popupGeneral.add(menuChord);
drawGroup.add(menuChord);
menuWedge = new JRadioButtonMenuItem(LaTeXDrawResources.LABEL_WEDGE, LaTeXDrawResources.wedgeIcon);
menuWedge.setActionCommand(LaTeXDrawResources.LABEL_WEDGE);
menuWedge.addActionListener(frameParent.menusListener);
popupGeneral.add(menuWedge);
drawGroup.add(menuWedge);
menuGrid = new JRadioButtonMenuItem(LaTeXDrawResources.LABEL_GRID, LaTeXDrawResources.gridIcon);
menuGrid.setActionCommand(LaTeXDrawResources.LABEL_GRID);
menuGrid.addActionListener(frameParent.menusListener);
popupGeneral.add(menuGrid);
drawGroup.add(menuGrid);
menuAxes = new JRadioButtonMenuItem(LaTeXDrawResources.LABEL_AXES, LaTeXDrawResources.axesIcon);
menuAxes.setActionCommand(LaTeXDrawResources.LABEL_AXES);
menuAxes.addActionListener(frameParent.menusListener);
popupGeneral.add(menuAxes);
drawGroup.add(menuAxes);
menuBezier = new JRadioButtonMenuItem(LaTeXDrawResources.LABEL_BEZIER_CURVE, LaTeXDrawResources.bezierCurveIcon);
menuBezier.setActionCommand(LaTeXDrawResources.LABEL_BEZIER_CURVE);
menuBezier.addActionListener(frameParent.menusListener);
popupGeneral.add(menuBezier);
drawGroup.add(menuBezier);
menuClosedBezier = new JRadioButtonMenuItem(LaTeXDrawResources.LABEL_CLOSED_BEZIER_CURVE, LaTeXDrawResources.closedBezierIcon);
menuClosedBezier.setActionCommand(LaTeXDrawResources.LABEL_CLOSED_BEZIER_CURVE);
menuClosedBezier.addActionListener(frameParent.menusListener);
popupGeneral.add(menuClosedBezier);
drawGroup.add(menuClosedBezier);
menuPointsAkin = new JRadioButtonMenuItem(LaTeXDrawResources.LABEL_POINTS_AKIN, LaTeXDrawResources.pointsAkinIcon);
menuPointsAkin.setActionCommand(LaTeXDrawResources.LABEL_POINTS_AKIN);
menuPointsAkin.addActionListener(frameParent.menusListener);
popupGeneral.add(menuPointsAkin);
drawGroup.add(menuPointsAkin);
menuText = new JRadioButtonMenuItem(LaTeXDrawResources.LABEL_TEXT, LaTeXDrawResources.textIcon);
menuText.setActionCommand(LaTeXDrawResources.LABEL_TEXT);
menuText.addActionListener(frameParent.menusListener);
popupGeneral.add(menuText);
drawGroup.add(menuText);
}
/**
* Allows to select a menu in the general pop-up
* @param select The label of the new selected menu
*/
public void setMenuSelectedPopupGeneral(String select, boolean state)
{
int i=0, size = popupGeneral.getComponentCount();
boolean found = false;
Component c=null;
while(!found && i<size)
{
c = popupGeneral.getComponent(i);
if(c instanceof JMenuItem)
{
if(((JMenuItem)c).getActionCommand().equals(select))
found = true;
else i++;
}
else i++;
}
if(found && c!=null)
((JMenuItem)c).setSelected(state);
}
/**
* Allows to get the frame parent of the panel
* @return The LaTeXDrawFrame frame parent
*/
public LaTeXDrawFrame getFrameParent()
{
return frameParent;
}
/**
* Allows to set the attribute drawing with an another
* @param d The new drawing
*/
public void setDraw(DrawContainer d)
{
draw.copy(d);
updateDraw(true);
}
/**
* Allows to get the drawing
* @return The drawing
*/
public DrawContainer getDraw()
{
return draw;
}
/**
* Exports the drawing as a picture.
* @param file The new picture to create.
* @param format The extension of the picture to create.
* @param compressionRate The compression rate for jpg pictures.
*/
public void exportAsPicture(File file, String format, float compressionRate)
{
if(format.equals(LaTeXDrawResources.LABEL_EXPORT_JPG))
draw.exportAsJPG(file, compressionRate);
else if(format.equals(LaTeXDrawResources.LABEL_EXPORT_EPS))
draw.exportAsEPS(file);
else if(format.equals(LaTeXDrawResources.LABEL_EXPORT_PNG))
draw.exportAsPNG(file);
else if(format.equals(LaTeXDrawResources.LABEL_EXPORT_BMP))
draw.exportAsBMP(file);
else if(format.equals(LaTeXDrawResources.LABEL_EXPORT_PPM))
draw.exportAsPPMFile(file);
else if(format.equals(LaTeXDrawResources.LABEL_EXPORT_PDF_LATEX))
draw.createPDFFile(frameParent.getPathDistribLatex(), file.getPath(), false);
else if(format.equals(LaTeXDrawResources.LABEL_EXPORT_PDF_LATEX_CROP))
draw.createPDFFile(frameParent.getPathDistribLatex(), file.getPath(), true);
else if(format.equals(LaTeXDrawResources.LABEL_EXPORT_EPS_LATEX))
draw.createPSFile(frameParent.getPathDistribLatex(), file.getPath());
else throw new IllegalArgumentException(format);
}
/**
* Allows to set the variable isModified
* @param state The new state of isModified
*/
public void setIsModified(boolean state)
{
draw.setIsModified(state);
}
/**
* Allows to get the number of pixels per centimetre
* @return The number of pixels per centimetre
*/
public int getPixelsPerCm()
{
return draw.getPixelsPerCm();
}
/**
* Allows to set the number of pixels per centimetre
* @param pPerCm The new number of pixels per centimetre
*/
public void setPixelsPerCm(int pPerCm)
{
draw.setPixelsPerCm(pPerCm);
if(codePanel.isInAutoUpdate())
updateCode();
}
/**
* Allows to set the value of the attribute
* onWaitingClicDispositionFront
* @param state Its new state
*/
public void setOnWaitingClicDispositionFront(boolean state)
{
onWaitingClicDispositionFront = state;
}
/**
* Allows to set the value of the attribute
* onWaitingClicDispositionBehind
* @param state Its new state
*/
public void setOnWaitingClicDispositionBehind(boolean state)
{
onWaitingClicDispositionBehind = state;
}
/**
* Allows to set the boolean autoAdjustement in the drawing
*/
public void setAutoAdjustement(boolean state)
{
draw.setAutoAdjustement(state);
}
/**
* This method allows the user to delete the selected figure
* in the drawing.
* @return The new number of figures
*/
public int deleteSelection()
{
try
{
draw.deleteSelection(frameParent.getUndoManager());
frameParent.updateUndoRedo();
updateDraw(true);
return draw.getNbFigures();
}catch(Exception ex)
{
ex.printStackTrace();
ExceptionFrameDialog.showExceptionDialog(ex);
}
return 0;
}
/**
* Allow the display or to hide the borders of the drawing
*
* @param display Allow to know if the user want to display the borders
* of the drawing.
*/
public void displayBorders(boolean display)
{
draw.displayBorders(display);
}
/**
* Allows to know if the program is in figure selection
* @param is Return true if the program is in figure selection
*/
public void isSelection(boolean is)
{
draw.isSelection(is);
}
/**
* Allows to know if the grid must be displayed
* @return True if the grid must be displayed
*/
public boolean isGridDisplayed()
{
return draw.isGridDisplayed();
}
/**
* This method allows to know if the project has been
* modified or not
* @return true if the project has been modified
*/
public boolean isModified()
{
return draw.isModified();
}
/**
* Allows to get the current figure in drawing
* @return The current figure in drawing
*/
public Figure getCurrentFigure()
{
return currentFigure;
}
public LaTeXDrawRectangle getBordersSelection()
{
return bordersSelection;
}
/**
* Allows to create a new project.
*/
public void newProject()
{
currentFigure=null;
formerPoint=null;
formerSelectionEmpty = true;
draw.newDrawing();
updateDraw(true);
}
/**
* Actions to do on a mouse left button pressed
* @param e The event
*/
public void mousePressedLeftButton(MouseEvent e)
{
// these actions are managed is mouse clicked
if(onWaitingClicDispositionBehind || onWaitingClicDispositionFront)
return;
Point point = e.getPoint();
// We must put the point in the user's view : rescale the point
point.x/=draw.getZoom();
point.y/=draw.getZoom();
formerPoint = draw.getGrid().getTransformedPointToGrid(point, true);
String currentChoice = frameParent.getCurrentChoice();
// If the user wants to draw a line.
if(currentChoice.equals(LaTeXDrawResources.LABEL_LINE))
{
point = draw.getGrid().getTransformedPointToGrid(point, true);
currentFigure = new Line(new LaTeXDrawPoint2D(point.x, point.y), new LaTeXDrawPoint2D(point.x, point.y), true);
}
else
// If the user wants to draw a rectangle.
if(currentChoice.equals(LaTeXDrawResources.LABEL_RECT))
{
point = draw.getGrid().getTransformedPointToGrid(point, true);
currentFigure = new LaTeXDrawRectangle(new LaTeXDrawPoint2D(point.x, point.y), new LaTeXDrawPoint2D(point.x, point.y),
new LaTeXDrawPoint2D(point.x, point.y), new LaTeXDrawPoint2D(point.x, point.y), true);
}
else
// If the user wants to draw a square.
if(currentChoice.equals(LaTeXDrawResources.LABEL_SQUARE))
{
point = draw.getGrid().getTransformedPointToGrid(point, true);
currentFigure = new Square(new LaTeXDrawPoint2D(point.x, point.y), new LaTeXDrawPoint2D(point.x, point.y),
new LaTeXDrawPoint2D(point.x, point.y), new LaTeXDrawPoint2D(point.x, point.y), true);
}
else
// If the user wants to draw a rhombus.
if(currentChoice.equals(LaTeXDrawResources.LABEL_RHOMBUS))
{
point = draw.getGrid().getTransformedPointToGrid(point, true);
currentFigure = new Rhombus(new LaTeXDrawPoint2D(point.x, point.y), new LaTeXDrawPoint2D(point.x, point.y),
new LaTeXDrawPoint2D(point.x, point.y), new LaTeXDrawPoint2D(point.x, point.y), true);
}
else
// If the user wants to draw a triangle.
if(currentChoice.equals(LaTeXDrawResources.LABEL_TRIANGLE))
{
point = draw.getGrid().getTransformedPointToGrid(point, true);
currentFigure = new Triangle(new LaTeXDrawPoint2D(point.x, point.y), new LaTeXDrawPoint2D(point.x, point.y),
new LaTeXDrawPoint2D(point.x, point.y), new LaTeXDrawPoint2D(point.x, point.y), true);
}
else
// If the user wants to draw a circle.
if(currentChoice.equals(LaTeXDrawResources.LABEL_CIRCLE))
{
point = draw.getGrid().getTransformedPointToGrid(point, true);
currentFigure = new Circle(new LaTeXDrawPoint2D(point.x, point.y), new LaTeXDrawPoint2D(point.x, point.y),
new LaTeXDrawPoint2D(point.x, point.y), new LaTeXDrawPoint2D(point.x, point.y), true);
}
else
// If the user wants to draw a circle.
if(currentChoice.equals(LaTeXDrawResources.LABEL_ELLIPSE))
{
point = draw.getGrid().getTransformedPointToGrid(point, true);
currentFigure = new Ellipse(new LaTeXDrawPoint2D(point.x, point.y), new LaTeXDrawPoint2D(point.x, point.y),
new LaTeXDrawPoint2D(point.x, point.y), new LaTeXDrawPoint2D(point.x, point.y), true);
}
else
// If the user wants to draw an arc.
if(currentChoice.equals(LaTeXDrawResources.LABEL_ARC))
{
point = draw.getGrid().getTransformedPointToGrid(point, true);
currentFigure = new Arc(new LaTeXDrawPoint2D(point.x, point.y), new LaTeXDrawPoint2D(point.x, point.y), Arc2D.OPEN, true);
}
else
// If the user wants to draw a chord.
if(currentChoice.equals(LaTeXDrawResources.LABEL_CHORD))
{
point = draw.getGrid().getTransformedPointToGrid(point, true);
currentFigure = new Arc(new LaTeXDrawPoint2D(point.x, point.y), new LaTeXDrawPoint2D(point.x, point.y), Arc2D.CHORD, true);
}
else
// If the user wants to draw a wedge.
if(currentChoice.equals(LaTeXDrawResources.LABEL_WEDGE))
{
point = draw.getGrid().getTransformedPointToGrid(point, true);
currentFigure = new Arc(new LaTeXDrawPoint2D(point.x, point.y), new LaTeXDrawPoint2D(point.x, point.y), Arc2D.PIE, true);
}
else
// If the user wants to draw a dot.
if(currentChoice.equals(LaTeXDrawResources.LABEL_DOT))
{
point = draw.getGrid().getTransformedPointToGrid(point, true);
currentFigure = new Dot(new LaTeXDrawPoint2D(point.x, point.y), frameParent.genDotS, frameParent.genDotSize, true);
setCurrentFigureGeneralValues();
draw.addFigure(currentFigure, frameParent.getUndoManager());
currentFigure = null;
updateDraw(true);
frameParent.updateUndoRedo();
frameParent.setExportAsMenu(true);
}
else
// If the user wants to draw akin points.
if(currentChoice.equals(LaTeXDrawResources.LABEL_POINTS_AKIN))
{
point = draw.getGrid().getTransformedPointToGrid(point, true);
currentFigure = new AkinPoints(new LaTeXDrawPoint2D(point.x, point.y), true);
updateDraw(false);
}
if(currentFigure!=null)
{
setCurrentFigureGeneralValues();
return ;
}
// If the user wants to select a figure.
if(currentChoice.equals(LaTeXDrawResources.LABEL_SELECT_FIGURE))
{
try
{
boolean in = draw.onClick(point, e);
DrawBorders db = draw.getCompleteBorders();
if(db!=null && db.isSelected() && db.isADelimitorSelected())
return ;
Draw selection = draw.getSelected();
int mod = e.getModifiers();
if((selection!=null && selection.isEmpty()) ||
mod==InputEvent.CTRL_MASK+InputEvent.BUTTON1_MASK || mod==InputEvent.SHIFT_MASK+InputEvent.BUTTON1_MASK)
{
frameParent.setSelection(selection!=null && !selection.isEmpty());
bordersSelection = new LaTeXDrawRectangle(new LaTeXDrawPoint2D(point.x, point.y),
new LaTeXDrawPoint2D(point.x, point.y), false);
bordersSelection.setLineStyle(PSTricksConstants.LINE_DASHED_STYLE);
bordersSelection.setLinesColor(Color.GRAY);
bordersSelection.setThickness(1);
}
else
if(!in)
draw.setSelected(null);
else
{
frameParent.setSelection(true);
if(selection!=null)
{
selection.setOnRotation(draw.isOnRotation());
if(draw.isOnRotation())
selection.beginRotation();
}
}
if(selection!=null && !selection.isEmpty())
{
Figure f;
if(selection.size()==1)
f = selection.getFigureAt(0);
else
f = selection;
if(f.isDelimitorSelected())
{
int delimitorOrient = f.getSelectedDelimitorOrientation();
switch(delimitorOrient)
{
case Figure.DELIMITOR_ORIENTATION_EAST:
frameParent.setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
break;
case Figure.DELIMITOR_ORIENTATION_WEST:
frameParent.setCursor(Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR));
break;
case Figure.DELIMITOR_ORIENTATION_SOUTH:
frameParent.setCursor(Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR));
break;
case Figure.DELIMITOR_ORIENTATION_NORTH:
frameParent.setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR));
break;
case Figure.DELIMITOR_ORIENTATION_NW:
frameParent.setCursor(Cursor.getPredefinedCursor(Cursor.NW_RESIZE_CURSOR));
break;
case Figure.DELIMITOR_ORIENTATION_NE:
frameParent.setCursor(Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR));
break;
case Figure.DELIMITOR_ORIENTATION_SE:
frameParent.setCursor(Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR));
break;
case Figure.DELIMITOR_ORIENTATION_SW:
frameParent.setCursor(Cursor.getPredefinedCursor(Cursor.SW_RESIZE_CURSOR));
break;
case Figure.DELIMITOR_ROTATION:
frameParent.setCursor(LaTeXDrawCursor.ROTATE_CURSOR);
break;
default:
frameParent.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
}
}
else
frameParent.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
}
repaint();
}catch(Exception ex)
{
ex.printStackTrace();
ExceptionFrameDialog.showExceptionDialog(ex);
}
return;
}
}
/**
* Set the general parameters to the current figure in creation.
* @since 1.9.1
*/
protected void setCurrentFigureGeneralValues()
{
if(currentFigure!=null)
{
currentFigure.setLinesColor(frameParent.genLineCB.getColor());
currentFigure.setInteriorColor(frameParent.genInteriorCB.getColor());
currentFigure.setThickness(frameParent.genThickness);
if(currentFigure.canBeFilled())
currentFigure.setIsFilled(frameParent.genIsFilled);
if(currentFigure.canBeHatched())
{
currentFigure.setHatchingStyle(frameParent.genHatchS);
currentFigure.setHatchingColor(frameParent.genHatchCB.getColor());
currentFigure.setGradientStartColor(frameParent.genGradientStartCB.getColor());
currentFigure.setGradientEndColor(frameParent.genGradientEndCB.getColor());
}
if(currentFigure.isBordersMovable())
currentFigure.setBordersPosition(frameParent.genBordPosS);
if(currentFigure.isDoubleBoundaryable())
{
currentFigure.setHasDoubleBoundary(frameParent.genHasDbleBord);
currentFigure.setDoubleColor(frameParent.genDbleBordCB.getColor());
}
if(currentFigure.isDashableOrDotable())
currentFigure.setLineStyle(frameParent.genLineStyleS);
if(currentFigure.canHaveShadow())
{
currentFigure.setShadowColor(frameParent.genShadowCB.getColor());
currentFigure.setHasShadow(frameParent.genHasShadow);
}
if(currentFigure.canHaveArrow())
{
((Arrowable)currentFigure).setArrow1Style(frameParent.genLeftArrS);
((Arrowable)currentFigure).setArrow2Style(((Arrowable)currentFigure).hasTwoLeftArrows() ?
ArrowHead.invertArrowStyle(frameParent.genRightArrS) : frameParent.genRightArrS);
}
}
}
/**
* Define the actions that it must be realised by a click of the mouse.
* @param e The event
*/
public void mouseClicked(MouseEvent e)
{
try
{
frameParent.requestFocus();
switch(e.getButton())
{
case MouseEvent.BUTTON1 :
mouseClickedLeftButton(e);
break;
case MouseEvent.BUTTON2 :
break;
case MouseEvent.BUTTON3 :
mouseClickedRightButton(e);
break;
default : break;
} // switch
}catch(Exception ex)
{
ex.printStackTrace();
ExceptionFrameDialog.showExceptionDialog(ex);
}
e.consume();
}
/**
* Defines the actions that it must be realised by a left click
* of the mouse.
* @param e Corresponds to the click of the mouse
*/
public void mouseClickedLeftButton(MouseEvent e)
{
Point point = e.getPoint();
point.x/=draw.getZoom();
point.y/=draw.getZoom();
String currentChoice = frameParent.getCurrentChoice();
if(onWaitingClicDispositionBehind)
{
onWaitingClicDispositionBehind = false;
frameParent.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
Draw listSelected = draw.getSelected();
boolean thereIsOne = draw.onClick(point, e);
if(thereIsOne && !listSelected.contains(draw.getSelected().getFigureAt(0)))
{
draw.getSelected().setSelected(false);
listSelected.setSelected(true);
draw.putBehind(listSelected, draw.getSelected().getFigureAt(0));
draw.setSelected(listSelected);
frameParent.setIsModified(true);
updateDraw(true);
}
else
{
draw.isSelection(false);
frameParent.setSelection(false);
draw.repaint();
}
return;
}
if(onWaitingClicDispositionFront)
{
onWaitingClicDispositionFront = false;
frameParent.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
Draw listSelected = draw.getSelected();
boolean thereIsOne = draw.onClick(point, e);
if(thereIsOne && !listSelected.contains(draw.getSelected().getFigureAt(0)))
{
draw.getSelected().setSelected(false);
listSelected.setSelected(true);
draw.putInFrontOf(listSelected, draw.getSelected().getFigureAt(0));
draw.setSelected(listSelected);
frameParent.setIsModified(true);
updateDraw(true);
}
else
{
draw.isSelection(false);
frameParent.setSelection(false);
draw.repaint();
}
return;
}
// A double click = show the frame which allows to set the parameters of the figure or
// stop the creation of the current figure.
if(e.getClickCount()==2)
{
if(currentFigure!=null && (currentChoice.equals(LaTeXDrawResources.LABEL_POLY) ||
currentChoice.equals(LaTeXDrawResources.LABEL_CLOSED_BEZIER_CURVE) ||
currentChoice.equals(LaTeXDrawResources.LABEL_BEZIER_CURVE) ||
currentChoice.equals(LaTeXDrawResources.LABEL_JOINED_LINES)))
{
if(((LaTeXDrawPolygon)currentFigure).getNbPoints()>3 ||
((currentChoice.equals(LaTeXDrawResources.LABEL_CLOSED_BEZIER_CURVE) ||
currentChoice.equals(LaTeXDrawResources.LABEL_BEZIER_CURVE)) &&
((LaTeXDrawPolygon)currentFigure).getNbPoints()>2))
{
((LaTeXDrawPolygon)currentFigure).removePointAt(-1);
draw.addFigure(currentFigure,frameParent.getUndoManager());
updateDraw(true);
currentFigure = null;
frameParent.updateUndoRedo();
frameParent.setExportAsMenu(true);
}
else
{
currentFigure = null;
draw.repaint();
}
}
else
if(draw.getSelected()!=null && draw.getSelected().size()==1)
frameParent.showParamFrame(draw.getSelected().whereIsIt(point), false);
return ;
}
if(currentChoice.equals(LaTeXDrawResources.LABEL_POLY) ||
currentChoice.equals(LaTeXDrawResources.LABEL_JOINED_LINES))
{ // If the user wants to draw a polygon (menu polygon selected)
point = draw.getGrid().getTransformedPointToGrid(point, true);
if(currentFigure==null)// We create of new polygon
{
if(currentChoice.equals(LaTeXDrawResources.LABEL_POLY))
currentFigure = new LaTeXDrawPolygon(new LaTeXDrawPoint2D(point.x, point.y),
new LaTeXDrawPoint2D(point.x, point.y), true);
else currentFigure = new JoinedLines(new LaTeXDrawPoint2D(point.x, point.y),
new LaTeXDrawPoint2D(point.x, point.y), true);
}
else // We add a point to the polygon
if(currentFigure.getClass().getSimpleName().equals("LaTeXDrawPolygon") ||//$NON-NLS-1$
currentFigure instanceof JoinedLines)
{
((LaTeXDrawPolygon)currentFigure).setLastPoint(point);
((LaTeXDrawPolygon)currentFigure).addPoint(new LaTeXDrawPoint2D(point.x+1, point.y+1));
}
draw.repaint();
}else
if(currentChoice.equals(LaTeXDrawResources.LABEL_TEXT))
{
point = draw.getGrid().getTransformedPointToGrid(point, true);
Figure f = new Text("", new LaTeXDrawPoint2D(point.x,point.y), true); //$NON-NLS-1$
draw.addFigure(f, null);
int size = draw.getNbFigures();
frameParent.showParamFrame(f, true);
if(size==draw.getNbFigures())
{
draw.deleteFigure(f, null);
draw.addFigure(f, frameParent.getUndoManager());
frameParent.updateUndoRedo();
updateDraw(true);
}
}else
if(currentChoice.equals(LaTeXDrawResources.LABEL_GRID))
{
point = draw.getGrid().getTransformedPointToGrid(point, true);
Figure f = new Grid(new LaTeXDrawPoint2D(point.x,point.y), true);
draw.addFigure(f, null);
int size = draw.getNbFigures();
frameParent.showParamFrame(f, true);
if(size==draw.getNbFigures())
{
draw.deleteFigure(f, null);
draw.addFigure(f, frameParent.getUndoManager());
frameParent.updateUndoRedo();
updateDraw(true);
}
}
else
if(currentChoice.equals(LaTeXDrawResources.LABEL_AXES))
{
point = draw.getGrid().getTransformedPointToGrid(point, true);
Figure f = new Axe(new LaTeXDrawPoint2D(point.x,point.y), true);
draw.addFigure(f, null);
int size = draw.getNbFigures();
frameParent.showParamFrame(f, true);
if(size==draw.getNbFigures())
{
draw.deleteFigure(f, null);
draw.addFigure(f, frameParent.getUndoManager());
frameParent.updateUndoRedo();
updateDraw(true);
}
}
else
if(currentChoice.equals(LaTeXDrawResources.LABEL_BEZIER_CURVE) ||
currentChoice.equals(LaTeXDrawResources.LABEL_CLOSED_BEZIER_CURVE))
{
point = draw.getGrid().getTransformedPointToGrid(point, true);
if(currentFigure==null)
currentFigure = new BezierCurve(new LaTeXDrawPoint2D(point.x, point.y),
new LaTeXDrawPoint2D(point.x, point.y),
currentChoice.equals(LaTeXDrawResources.LABEL_BEZIER_CURVE), true);
else
{
((BezierCurve)currentFigure).setLastPoint(point);
((BezierCurve)currentFigure).addPoint(new LaTeXDrawPoint2D(point.x, point.y));
}
}
if(currentFigure!=null)
setCurrentFigureGeneralValues();
}
/**
* Defines the actions that it must be realised by a right click
* of the mouse.
* @param e Corresponds to the click of the mouse
*/
public void mouseClickedRightButton(MouseEvent e)
{
try
{
Point point = e.getPoint();
if(currentFigure!=null)
{// If the user draw a polygon and if he do a right click, we
String currentChoice = frameParent.getCurrentChoice();
// must stop the creation of the polygon
if(currentChoice.equals(LaTeXDrawResources.LABEL_POLY) ||
currentChoice.equals(LaTeXDrawResources.LABEL_CLOSED_BEZIER_CURVE) ||
currentChoice.equals(LaTeXDrawResources.LABEL_BEZIER_CURVE) ||
currentChoice.equals(LaTeXDrawResources.LABEL_JOINED_LINES))
if(((LaTeXDrawPolygon)currentFigure).getNbPoints()>2 ||
((currentChoice.equals(LaTeXDrawResources.LABEL_CLOSED_BEZIER_CURVE) ||
currentChoice.equals(LaTeXDrawResources.LABEL_BEZIER_CURVE)) &&
((LaTeXDrawPolygon)currentFigure).getNbPoints()>1))
{
draw.addFigure(currentFigure,frameParent.getUndoManager());
updateDraw(true);
currentFigure = null;
frameParent.updateUndoRedo();
frameParent.setExportAsMenu(true);
}
else
{
currentFigure = null;
draw.repaint();
}
}
else
{// We must show a popup menu
int nbFiguresSelected = draw.getSelected().size();
if(frameParent.getCurrentChoice().equals(LaTeXDrawResources.LABEL_SELECT_FIGURE) && nbFiguresSelected>0)
{
menuProperties.setEnabled(nbFiguresSelected==1);
menuJoin.setEnabled(nbFiguresSelected>1);
menuSeparate.setEnabled(nbFiguresSelected==1 && draw.getSelected().getFigureAt(0) instanceof Draw);
popupFigure.show(e.getComponent(), point.x, point.y);
}
else
popupGeneral.show(e.getComponent(), point.x, point.y);
}
}catch(Exception ex)
{
ex.printStackTrace();
ExceptionFrameDialog.showExceptionDialog(ex);
}
}
/**
* Actions to do on a mouse button pressed
* @param e The event
*/
public void mousePressed(MouseEvent e)
{
try
{
frameParent.requestFocus();
switch(e.getButton())
{
case MouseEvent.BUTTON1 : mousePressedLeftButton(e);
break;
case MouseEvent.BUTTON2 : break;
case MouseEvent.BUTTON3 :
Draw selection = draw.getSelected();
if(selection!=null && !selection.isEmpty())
frameParent.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
break;
}
}catch(Exception ex)
{
ex.printStackTrace();
ExceptionFrameDialog.showExceptionDialog(ex);
}
e.consume();
}
/**
* Actions to do when the mouse is released
* @param e The event
*/
public void mouseReleased(MouseEvent e)
{
try
{
Draw selection = draw.getSelected();
frameParent.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
if(bordersSelection != null)
{
int mod = e.getModifiers();
Point pt = e.getPoint();
// We must put the point in the user's view : rescale the point
pt.x/=draw.getZoom();
pt.y/=draw.getZoom();
bordersSelection.setLastPoint(new LaTeXDrawPoint2D(pt.x, pt.y));
draw.defineSelected(bordersSelection, mod==InputEvent.SHIFT_MASK+InputEvent.BUTTON1_MASK,
mod==InputEvent.CTRL_MASK+InputEvent.BUTTON1_MASK);
if(!draw.getSelected().isEmpty() || formerSelectionEmpty != draw.getSelected().isEmpty())
frameParent.setSelection(!draw.getSelected().isEmpty());
formerSelectionEmpty = draw.getSelected().isEmpty();
draw.repaint();
bordersSelection=null;
formerPoint = null;
draw.repaint();
return ;
}
if(selection!=null && selection.isOnRotation() && selection.isSelected())
selection.endRotation();
DrawBorders db = draw.getCompleteBorders();
if(db!=null && db.isSelected() && db.isADelimitorSelected())
{
setIsModified(true);
db.onDelimitorRelease();
return ;
}
if(currentFigure!=null &&
!currentFigure.getClass().getSimpleName().equals("LaTeXDrawPolygon") &&//$NON-NLS-1$
!(currentFigure instanceof JoinedLines) && !(currentFigure instanceof BezierCurve))
{
if(!currentFigure.getTheNWPoint().equals(currentFigure.getTheSEPoint(), 0.001))
{
draw.addFigure(currentFigure, frameParent.getUndoManager());
frameParent.updateUndoRedo();
frameParent.setExportAsMenu(true);
}
updateDraw(true);
currentFigure = null;
formerPoint = null;
return;
}
Draw listSelected = draw.getSelected();
if(!listSelected.isEmpty())
{
if(cloneForDragged!=null)
{
int[] id = new int[listSelected.size()];
for(int i=0, size=listSelected.size(); i<size; i++)
{
id[i] = draw.getFigures().indexOf(listSelected.getFigureAt(i));
if(id[i]<0)
throw new IndexOutOfBoundsException();
}
frameParent.getUndoManager().add(UndoRedoManager.LABEL_CHANGE_MOVE, id, cloneForDragged, false);
frameParent.updateUndoRedo();
cloneForDragged = null;
}
updateDraw(true);
listSelected.onDelimitorRelease();
formerPoint = null;
return ;
}
if(!draw.isAutoAdjustement() && draw.getCompleteBorders()!=null &&
draw.getCompleteBorders().isSelected())
{// fixing #1554162
updateDraw(true);
setIsModified(true);
}
}catch(Exception ex)
{
ex.printStackTrace();
ExceptionFrameDialog.showExceptionDialog(ex);
}
formerPoint = null;
}
/**
* Actions to do when the mouse is entered
* @param e The event
*/
public void mouseEntered(MouseEvent e)
{
/*
* No action to do
*/
}
/**
* Actions to do when the mouse is exited
* @param e The event
*/
public void mouseExited(MouseEvent e)
{
/*
* No action to do
*/
}
/**
* Actions to do when the mouse is dragged
* @param e The event
*/
public void mouseDragged(MouseEvent e)
{
try
{
Point pt = e.getPoint();
DrawBorders db = draw.getCompleteBorders();
frameParent.requestFocus();
// We must put the point in the user's view : rescale the point
pt.x/=draw.getZoom();
pt.y/=draw.getZoom();
if(db!=null && db.isSelected() && db.isADelimitorSelected())
{
if(formerPoint!=null)
db.onDragged(formerPoint, pt);
formerPoint = pt;
draw.updateDraw();
return ;
}
if(bordersSelection!=null)
{
int mod = e.getModifiers();
bordersSelection.setLastPoint(new LaTeXDrawPoint2D(pt.x, pt.y));
draw.defineSelected(bordersSelection, mod==InputEvent.SHIFT_MASK+InputEvent.BUTTON1_MASK,
mod==InputEvent.CTRL_MASK+InputEvent.BUTTON1_MASK);
formerSelectionEmpty = draw.getSelected().isEmpty();
draw.repaint();
return ;
}
if(currentFigure!=null)
{
pt = draw.getGrid().getTransformedPointToGrid(pt, true);
// We must not draw out the desktop
if(pt.x>currentFigure.getThickness()/2 && pt.y>currentFigure.getThickness()/2)
{
if(currentFigure instanceof AkinPoints)
((AkinPoints)currentFigure).addPoint(new LaTeXDrawPoint2D(pt.x, pt.y));
else //We move the south-east point
currentFigure.setLastPoint(new LaTeXDrawPoint2D(pt.x, pt.y));
draw.repaint();
setIsModified(true);
return;
}
}
Draw selected = draw.getSelected();
if(!selected.isEmpty())
{// We must not draw out the desktop
pt = draw.getGrid().getTransformedPointToGrid(pt, true);
if(pt.x>selected.getThickness()/2 && pt.y>selected.getThickness()/2)
{
if(formerPoint!=null)
{
if(cloneForDragged==null)
cloneForDragged = (Draw) selected.clone();
selected.onDragged(formerPoint, pt);
if(selected.size()==1 && (selected.getFigureAt(0) instanceof Dot))
frameParent.setDotFieldValue(((Dot)selected.getFigureAt(0)).getWidth());
getDraw().repaint();
}
formerPoint = pt;
setIsModified(true);
}
}
}catch(Exception ex)
{
ex.printStackTrace();
ExceptionFrameDialog.showExceptionDialog(ex);
}
}
/**
* Actions to do when the mouse is moved
* @param e The event
*/
public void mouseMoved(MouseEvent e)
{
Point pt = e.getPoint();
// We must put the point in the user's view : rescale the point
pt.x/=draw.getZoom();
pt.y/=draw.getZoom();
if(currentFigure!=null)
{
pt = draw.getGrid().getTransformedPointToGrid(pt, true);
// We must not draw out the desktop
if(pt.x>currentFigure.getThickness()/2 && pt.y>currentFigure.getThickness()/2)
if(currentFigure.getClass().getSimpleName().equals("LaTeXDrawPolygon") || //$NON-NLS-1$
currentFigure instanceof JoinedLines || currentFigure instanceof BezierCurve)
{
currentFigure.setLastPoint(new LaTeXDrawPoint2D(pt.x, pt.y));
if(currentFigure instanceof BezierCurve)
((BezierCurve)currentFigure).equilibrate();
draw.repaint();
return ;
}
}
}
/**
* Allows to update the drawing.
* @param withCode If true, the code is updated (if in auto update).
*/
public void updateDraw(boolean withCode)
{
frameParent.requestFocus();
draw.updateDraw();
if(codePanel.isInAutoUpdate() && withCode)
updateCode();
}
/**
* Allows to update the code of the codepanel
*/
public void updateCode()
{
try
{
if(draw.getNbFigures()==0)
codePanel.setEmpty();
else
{
codePanel.setStart(draw.getTheCompleteSWPoint(), draw.getTheCompleteNEPoint(),
draw.getPixelsPerCm(), draw.getRealBorders().getOriginPoint());
codePanel.setBody(draw.getCode());
}
}catch(Exception ex)
{
ex.printStackTrace();
ExceptionFrameDialog.showExceptionDialog(ex);
}
}
/**
* A drawPanel is not serializable
*/
@SuppressWarnings("unused")
private void readObject(ObjectInputStream ois)
{
/*
* We don't read anything
*/
}
/**
* Allows to copy the selected figure
*/
public void copy()
{
draw.copy();
}
/**
* Allows to paste a copied or a cut figure
*/
public void paste()
{
draw.paste();
updateDraw(true);
}
/**
* Allows to cut the selected figure
*/
public void cut()
{
draw.cut();
}
/**
* Allows to join the selected figures
* @param undoManager The undo/redo manager
*/
public void joinSelection(UndoRedoManager undoManager)
{
draw.joinSelection(undoManager);
updateDraw(false);
}
/**
* Allows to join the figures of the selected drawing
* @param undoManager The undo/redo manager
*/
public void separateSelection(UndoRedoManager undoManager)
{
draw.separateSelection(undoManager);
updateDraw(true);
}
/**
* Allows to insert a picture into the drawing
* @param undoManager The undo/redo manager
* @param path The path of the picture
* @return True is the picture is inserted
*/
public boolean insertPicture(UndoRedoManager undoManager, String path)
{
boolean state = draw.insertPicture(undoManager, path);
updateDraw(true);
return state;
}
/**
* Allows to set if the grid must be displayed or not
* @param isDisplay True : the grid must be displayed
*/
public void setIsGridDisplay(boolean isDisplay)
{
draw.getGrid().setGridDisplayed(isDisplay);
menuUpdateToGrid.setEnabled(isDisplay);
frameParent.menuBar.getUpdateToGridMenu().setEnabled(isDisplay);
updateDraw(false);
}
/**
* @return the gridIsMagnetic.
*/
public boolean isGridMagnetic()
{
return draw.getGrid().isMagnetic();
}
/**
* @param gridIsMagnetic the gridIsMagnetic to set.
*/
public void setGridIsMagnetic(boolean gridIsMagnetic)
{
if(gridIsMagnetic!=isGridMagnetic())
setIsModified(true);
draw.getGrid().setMagnetic(gridIsMagnetic);
menuUpdateToGrid.setEnabled(true);
}
/**
* Move the horizontal scrollbar.
* @since 1.9
* @param add This value is added to the current position of the scollbar.
*/
public void moveHorizontalScrollbar(int add)
{
getHorizontalScrollBar().setValue(getHorizontalScrollBar().getValue()+add);
}
/**
* Move the vertical scrollbar.
* @since 1.9
* @param add This value is added to the current position of the scollbar.
*/
public void moveVerticalScrollbar(int add)
{
getVerticalScrollBar().setValue(getVerticalScrollBar().getValue()+add);
}
/**
* Move horizontally the selected figures.<br>
* The increment is 1 pixel or, if the magnetic is activated, the gap of the
* grid.
* @since 1.9
* @param direction The direction of the movement:<br>
* <ul>
* <li>1: the X-coordinates of the figures are increased;</li>
* <li>-1: the X-coordinates of the figures are decreased.</li>
* </ul>
*/
public void moveSelectedFiguresHorizontally(int direction)
{
try
{
if(direction!=-1 && direction!=1)
return;
Draw selection = draw.getSelected();
if(selection!=null && !selection.isEmpty())
{
double gap = draw.getGrid().isMagnetic() ? draw.getGrid().getMagneticGridGap() : 1.;
if(direction==-1)
gap*=-1;
selection.shift(gap, 0);
updateDraw(true);
}
}
catch(Exception e)
{
e.printStackTrace();
ExceptionFrameDialog.showExceptionDialog(e);
}
}
/**
* Move vertically the selected figures.<br>
* The increment is 1 pixel or, if the magnetic is activated, the gap of the
* grid.
* @since 1.9
* @param direction The direction of the movement:<br>
* <ul>
* <li>1: the Y-coordinates of the figures are increased;</li>
* <li>-1: the Y-coordinates of the figures are decreased.</li>
* </ul>
*/
public void moveSelectedFiguresVertically(int direction)
{
try
{
if(direction!=-1 && direction!=1)
return;
Draw selection = draw.getSelected();
if(selection!=null && !selection.isEmpty())
{
double gap = draw.getGrid().isMagnetic() ? draw.getGrid().getMagneticGridGap() : 1.;
if(direction==-1)
gap*=-1;
selection.shift(0, gap);
updateDraw(true);
}
}
catch(Exception e)
{
e.printStackTrace();
ExceptionFrameDialog.showExceptionDialog(e);
}
}
/**
* Update the selected figures of the drawing to the displayed grid.
* @since 1.9
*/
public void updateSelectionToGrid()
{
Draw selection = draw.getSelected();
if(selection!=null && !selection.isEmpty() && isGridMagnetic())
{
try
{
Figure clone = (Draw) selection.clone();
int[] id = new int[selection.size()];
for(int i=0, size=selection.size(); i<size; i++)
{
id[i] = draw.getFigures().indexOf(selection.getFigureAt(i));
if(id[i]<0)
throw new IndexOutOfBoundsException();
}
frameParent.getUndoManager().add(UndoRedoManager.LABEL_TRANSFORM, id, clone, false);
frameParent.updateUndoRedo();
selection.updateToGrid(draw.getGrid());
updateDraw(true);
}catch(CloneNotSupportedException e)
{
e.printStackTrace();
}
}
}
/**
* @since 1.9
*/
public void actionPerformed(ActionEvent e)
{
try
{
Object src = e.getSource();
if(src instanceof JMenuItem)
{
AbstractButton ab = ((AbstractButton)src);
String label = ab.getActionCommand();
if(label.equals(ACTION_CMD_UPDATETOGRID))
{
updateSelectionToGrid();
return ;
}
return ;
}
}
catch(Exception ex)
{
ex.printStackTrace();
ExceptionFrameDialog.showExceptionDialog(ex);
}
}
/**
* @since 1.9
*/
public void mouseWheelMoved(MouseWheelEvent e)
{
int mod = e.getModifiers();
if(mod==InputEvent.CTRL_MASK)
{// ctrl+wheel = zoom in/out
int wheelRot = e.getWheelRotation();
boolean zoomed = false;
if(wheelRot>0)
{
zoomOut();
zoomed = true;
}
else
if(wheelRot<0)
{
zoomIn();
zoomed = true;
}
if(zoomed)
{
frameParent.getXScale().repaint();
frameParent.getYScale().repaint();
frameParent.getToolbar().getZoomField().setValue(getZoom()*100);
}
return ;
}
}
/**
* Sets the XML element "meta" with the parameters of the code panel.
* @param document The XML document.
* @param meta The Element to fill.
* @throws IllegalArgumentException If document or meta is null.
* @since 2.0.0
*/
public void getXMLMetadata(Document document, Element meta)
{
if(document==null || meta==null)
throw new IllegalArgumentException();
Element magnet = document.createElement(LaTeXDrawNamespace.LATEXDRAW_NAMESPACE+':'+LaTeXDrawNamespace.XML_MAGNETIC_GRID);
magnet.appendChild(document.createTextNode(String.valueOf(isGridMagnetic())));
meta.appendChild(magnet);
}
/**
* Sets the latexdraw parameters from the <code>metadata</code> SVG tag.
* @param nl The list of the parameters.
* @since 2.0.0
*/
public void setXMLMetadata(NodeList nl) {
// Nothing to do.
}
/**
* @return the codePanel.
* @since 2.0.0
*/
public CodePanel getCodePanel()
{
return codePanel;
}
}
|