/*

 * Title: japlot.jaxodraw
 * Description: Graphical user interface for drawing Feynman diagrams
 * @author Daniele Binosi 
 * @author Lukas Theussl  
 * @author Sergei Chekanov 

 Copyright (C) 2003-2006,  Daniele Binosi,  Lukas Theussl, Sergei Chekanov 
*/

package japlot.jaxodraw;
import org.freehep.graphics2d.VectorGraphics;

import japlot.*;

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.ResourceBundle;
import java.util.Vector;
import java.text.DecimalFormat;

import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import jhplot.jadraw.*;

import jplot.LinePars;


/** An instance of the canvas: responsible for all the drawing. */
public class JaxoCanvas extends JPanel implements MouseListener,
    MouseMotionListener, ComponentListener {
    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	//Constants to distinguish among current handle
    /** The upper left handle. */
    public static final int HANDLE_UL = 0;

    /** The lower left handle. */
    public static final int HANDLE_LL = 1;

    /** The lower right handle. */
    public static final int HANDLE_LR = 2;

    /** The upper right handle. */
    public static final int HANDLE_UR = 3;

    /** The background color of the canvas. */
   //  public static final Color BCKG_COLOR = new Color(250, 250, 240);
    public static Color BCKG_COLOR = Color.white;  

    private ResourceBundle language =
        ResourceBundle.getBundle(JaxoPrefs.getPref(JaxoPrefs.PREF_LANGUAGE));
    private JaxoMainPanel thePanel; // Instance of the main panel
    private JaxoGraph canvasGraph; // Instance of the canvas graph
    private String canvasTick =
        ResourceBundle.getBundle(JaxoPrefs.getPref(JaxoPrefs.PREF_LANGUAGE))
                      .getString("Untitled");
    private Image offScreenImage; // Image for double buffering
    private Image backupImage;
    private JaxoGrid grid =
        new JaxoGrid(JaxoPrefs.getIntPref(JaxoPrefs.PREF_GRIDSIZE),
            JaxoPrefs.getPref(JaxoPrefs.PREF_GRIDTYPE));
    private int xin; // For the snap mode
    private int yin; // For the snap mode
    private int lastX; // Last mouse coordinates
    private int lastY; // Last mouse coordinates
    private int startX; // Reference coordinates for resizing
    private int startY; // Reference coordinates for resizing
    private int curDragMode; // Current drag mode: move, resize, or select
    private int curHandle; // Current handle: upper or lower left or right
    private int fboxX;
    private int fboxY;
    private boolean fboxON = false;
    private boolean isUsed = false;
    private DecimalFormat form = new DecimalFormat("#.##");

    /** A boolean variable that indicates whether to draw
     * the handles of the objects or not.
     */
    private boolean withHandles;

    /** A boolean variable that indicates whether to draw
     * the visual aid on arcs, blobs and vertices.
     */
    private boolean withVisualAid;
    private double[] oldbb;
    private int nofclicks = 0;
    private int archand = 0;
    private int[] points = new int[6];
    private int evX;
    private int evY;
    private boolean pointsON;
    private static boolean start = false;

    // uzer zooming
    private static double startUSERx=0.0;
    private static double startUSERy=0.0;
    private static int    zoomPADx=-1; 
    private static int    zoomPADy=-1;
    private static String padInfo="pad[1,1]";
    private static int padX=-1;
    private static int padY=-1;
    private VectorGraphics g2;

    private static JaAxes  jaxes=null;    
    protected JPopupMenu menu;
    public JMenuItem m_info, m_data, m_axes, m_refresh, m_clear;


    /** Constructs a new canvas within the specified panel.
     * @param mainPanel An instance of the main panel.
     */
    public JaxoCanvas(JaxoMainPanel mainPanel) {
    	super();
        this.thePanel = mainPanel;
        this.setBackground(JaxoColor.WHITE);

        int prefSCREENSIZEX = JaxoPrefs.getIntPref(JaxoPrefs.PREF_SCREENSIZEX);
        int prefSCREENSIZEY = JaxoPrefs.getIntPref(JaxoPrefs.PREF_SCREENSIZEY);
        this.setPreferredSize(new Dimension(prefSCREENSIZEX, prefSCREENSIZEY));
        this.addComponentListener(this);
        
       
        menu = new JPopupMenu();
        m_info = new JMenuItem(padInfo);
        m_info.setEnabled(false);
        m_info.setForeground(Color.blue);
        m_axes = new JMenuItem("Edit axes");
        m_data = new JMenuItem("Edit data");
        m_refresh = new JMenuItem("Refresh");
        m_clear = new JMenuItem("Clear");

        m_refresh.addActionListener(new java.awt.event.ActionListener() {
              public void actionPerformed(
              java.awt.event.ActionEvent evt) {
                            thePanel.update();
                                     }
               });

        m_axes.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(
            java.awt.event.ActionEvent evt) {
                                   if (jaxes != null) {
                                                boolean ischanged=jaxes.editPanel(); 
                                                if (ischanged) thePanel.update();
                               } }
             });
        
        m_data.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(
            java.awt.event.ActionEvent evt) {
                         if (jaxes != null) {
                     DataBrowser db = new DataBrowser(jaxes,thePanel); 
                     db.showIt(true);
                         } 
                        }
             });
       
           m_clear.addActionListener(new java.awt.event.ActionListener() {
              public void actionPerformed(
              java.awt.event.ActionEvent evt) {
                            if (padX>-1 && padY>-1) {   
                            thePanel.clearData(padX,padY);                   
                            thePanel.update();
                            }  
                            }
               });

 
        menu.add(m_info);
        menu.addSeparator();
        menu.add(m_axes);
        menu.add(m_data);
        menu.add(m_refresh);
        menu.add(m_clear);


        

       // this.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
       
        
    }

    /** Sets the current graph.
     * @param theGraph The graph to be set.
     */
    public final void setCanvasGraph(JaxoGraph theGraph) {
        this.canvasGraph = theGraph;
    }

    /** Returns the current graph.
     * @return The current graph.
     */
    public final JaxoGraph getCanvasGraph() {
        return this.canvasGraph;
    }

    /** Sets the current tick.
     * @param theTick The current tick.
     */
    public final void setCanvasTick(String theTick) {
        this.canvasTick = theTick;
    }

    /**  Returns the current  tick.
     * @return The current tick.
     */
    public final String getCanvasTick() {
        return this.canvasTick;
    }

    /** Returns the current drag mode.
     * @return The current drag mode.
     */
    public final int getDragMode() {
        return curDragMode;
    }

    /** Sets the current drag mode.
     * @param newDragMode The drag mode to be set.
     */
    public final void setDragMode(int newDragMode) {
        curDragMode = newDragMode;
    }

    /** Returns the old bounding box of the object.
     * @return The bounding box of the object befor dragging.
     */
    public final double[] getOldbb() {
        return oldbb;
    }

    /** Sets the old bounding box of the object.
     * @param bb The old bounding box of the object
     */
    public final void setOldbb(double[] bb) {
        this.oldbb = bb;
    }

    /** Updates the canvas by just calling paintComponent.
     * @param g The specified graphics context.
     */
    public final void update(Graphics g) {
        paintComponent(g);
    }

    /** Paints the canvas.
     * @param g The specified graphics context.
     */
    public final void paintComponent(Graphics g) {
        g2 = VectorGraphics.create(g);
      

        createBackground(); // draw backg
        createScreen();

        g2.clipRect(0, 0, this.getWidth(), this.getHeight());
        int mouseMode = getDragMode();

        if ((mouseMode == JaxoMainPanel.MOVE)
                || (mouseMode == JaxoMainPanel.RESIZE)) {
            JaObject ob = canvasGraph.getSelectedObject();

            if (ob != null) {
                if (Plot.drawFirst(ob)) ob.jaxoDraw(g2, true);
                Plot.drawRest(ob,g2,true); 

            }
        }

        if (withVisualAid) {
            JaObject selectedOb = canvasGraph.getSelectedObject();

            if (selectedOb != null) {
                selectedOb.drawVisualAid(g2);
            }
        }

        if (withHandles) {
            canvasGraph.drawHandles(g2);
        }

        if (thePanel.getMode() == JaxoMainPanel.UNGROUP) {
            canvasGraph.drawGroupHandles(g2);
        }

        if (fboxON) {
            drawFaintBox(g2);
        }

        if (pointsON) {
            drawPointsAid(g2);
        }

        g2.setClip(null);

    }

    /** Returns the current offScreenImage.
     * @return The current offScreenImage.
     */
    public final Image getOffScreenImage() {
        // return offScreenImage;
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        offScreenImage = createImage(d.width, d.height);
        return offScreenImage;


    }

    /** Creates a new offScreenImage. */
    private void createOffScreenImage() {
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        // offScreenImage = createImage(d.width, d.height);
       if (g2 == null) return;
 
        // Graphics2D g2 = (Graphics2D)offScreenImage.getGraphics();
        // VectorGraphics  g2 = (VectorGraphics)offScreenImage.getGraphics();

        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);

        JaxoGraph actCanGraph = getCanvasGraph();
        for (int i = 0; i < actCanGraph.listSize(); i++) {
            JaObject jaxoOb = (JaObject) actCanGraph.listElementAt(i);
            if (Plot.drawFirst(jaxoOb)) jaxoOb.jaxoDraw(g2, true);
            Plot.drawRest(jaxoOb,g2,true);
        }


        //  g2.dispose();
        // repaint();
        // thePanel.reset();
    }

    /** Plot all. */
    private void createScreen() {
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        // offScreenImage = createImage(d.width, d.height);
        if (g2 == null) return;

        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);

        JaxoGraph actCanGraph = getCanvasGraph();
        for (int i = 0; i < actCanGraph.listSize(); i++) {
            JaObject jaxoOb = (JaObject) actCanGraph.listElementAt(i);
            if (Plot.drawFirst(jaxoOb)) jaxoOb.jaxoDraw(g2, true);
            Plot.drawRest(jaxoOb,g2,true);
        }



        //  g2.dispose();
        // repaint();
        // thePanel.reset();
    }




   public void setBackgroundBox(Color c) {
    BCKG_COLOR=c;
   }




   public Color getBackgroundBox() {
    return BCKG_COLOR;
   }




    /** Creates a backup of the offScreenImage. */
    private void createBackground() {
       Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
       // g2.setColor(BCKG_COLOR);

       Rectangle2D rect = new Rectangle2D.Double(0, 0, d.width, d.height);
       g2.setPaint(BCKG_COLOR);
       g2.fill(rect);

       //g2.fillRect(0, 0, d.width, d.height);
       g2.setColor(Color.black);
       if (JaxoPrefs.getBooleanPref(JaxoPrefs.PREF_GRIDONOFF)) {
            grid.jaxoDrawGrid(g2);
        }
        // g2.dispose();
    }






      /** Copies the offScreenImage to backupOffScreenImage. */
    public final void dispose() {

        clearOffScreenImage();
        if ( g2 == null) return; 
        // Graphics2D g2 = (Graphics2D) offScreenImage.getGraphics();
        // VectorGraphics g2 = (VectorGraphics) offScreenImage.getGraphics();
        // offScreenImage.flush(); 
        g2.dispose();
        // offScreenImage=null;
    }


    /** Copies the offScreenImage to backupOffScreenImage. */
    public final void saveBackupImage() {
        if (g2 == null) {
            createBackground();
        }

    }

    /** Swaps the current offScreenImage with the backupImage. */
    public final void swapImages() {
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        Image tmpImage = createImage(d.width, d.height);
        tmpImage.getGraphics().drawImage(offScreenImage, 0, 0, null);
        offScreenImage.getGraphics().drawImage(backupImage, 0, 0, null);
        backupImage.getGraphics().drawImage(tmpImage, 0, 0, null);
        tmpImage.flush();
    }

    /** Clears the offScreenImage. */
    public final void clearOffScreenImage() {
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();

        if (g2 == null) return;

        // Graphics2D g2 = (Graphics2D) offScreenImage.getGraphics();
        // VectorGraphics g2 = ( VectorGraphics) offScreenImage.getGraphics();
 

        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);

        g2.setColor(BCKG_COLOR);

        g2.fillRect(0, 0, d.width, d.height);
        g2.setColor(Color.black);
        if (JaxoPrefs.getBooleanPref(JaxoPrefs.PREF_GRIDONOFF)) {
            grid.jaxoDrawGrid(g2);
        }
        g2.dispose();
    }

    /** Updates the offScreenImage within the current clipping area. */
    public final void updateOffScreenImage() {
        // Graphics2D g2 = (Graphics2D) offScreenImage.getGraphics();
        // VectorGraphics g2 = ( VectorGraphics) offScreenImage.getGraphics();
        if (g2==null) return;

        if (JaxoPrefs.getBooleanPref(JaxoPrefs.PREF_ANTIALIAS)) {
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        }

        g2.setClip((int) oldbb[0] - 5, (int) oldbb[1] - 5,
            (int) (oldbb[2] - oldbb[0]) + 10, (int) (oldbb[3] - oldbb[1]) + 10);
        g2.setColor(BCKG_COLOR);
        g2.fillRect((int) oldbb[0] - 5, (int) oldbb[1] - 5,
            (int) (oldbb[2] - oldbb[0]) + 10, (int) (oldbb[3] - oldbb[1]) + 10);
        if (JaxoPrefs.getBooleanPref(JaxoPrefs.PREF_GRIDONOFF)) {
            grid.jaxoDrawGrid(g2);
        }

        Rectangle oldrect =
            new Rectangle((int) oldbb[0] - 5, (int) oldbb[1] - 5,
                (int) (oldbb[2] - oldbb[0]) + 10,
                (int) (oldbb[3] - oldbb[1]) + 10);




        for (int i = 0; i < canvasGraph.listSize(); i++) {
            JaObject jaxoOb = (JaObject) canvasGraph.listElementAt(i);
            double[] bb;

            bb = jaxoOb.getBoundingBox();

            Rectangle rectOb =
                new Rectangle((int) bb[0] - 5, (int) bb[1] - 5,
                    (int) (bb[2] - bb[0]) + 10, (int) (bb[3] - bb[1]) + 10);

            if (rectOb.intersects(oldrect)) {
                g2.setClip((int) bb[0] - 5, (int) bb[1] - 5,
                    (int) (bb[2] - bb[0]) + 10, (int) (bb[3] - bb[1]) + 10);
                 if (Plot.drawFirst(jaxoOb)) jaxoOb.jaxoDraw(g2, true);
                  Plot.drawRest(jaxoOb, g2, true);
            }
        }



        repaint();
        g2.dispose();
        // offScreenImage.flush();
    }








    /** Updates the offScreenImage without drawing selectedOb.
     * @param selectedOb The JaObject to be excluded from the update.
     */
    public final void updateOffScreenImage(JaObject selectedOb) {
        // Graphics2D g2 = (Graphics2D) offScreenImage.getGraphics();
        //  VectorGraphics g2 = ( VectorGraphics) offScreenImage.getGraphics();
        if (g2==null) return;

        if (JaxoPrefs.getBooleanPref(JaxoPrefs.PREF_ANTIALIAS)) {
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        }

        g2.setClip((int) oldbb[0] - 5, (int) oldbb[1] - 5,
            (int) (oldbb[2] - oldbb[0]) + 10, (int) (oldbb[3] - oldbb[1]) + 10);
        g2.setColor(BCKG_COLOR);
        g2.fillRect((int) oldbb[0] - 5, (int) oldbb[1] - 5,
            (int) (oldbb[2] - oldbb[0]) + 10, (int) (oldbb[3] - oldbb[1]) + 10);
        if (JaxoPrefs.getBooleanPref(JaxoPrefs.PREF_GRIDONOFF)) {
            grid.jaxoDrawGrid(g2);
        }

        Rectangle oldrect =
            new Rectangle((int) oldbb[0] - 5, (int) oldbb[1] - 5,
                (int) (oldbb[2] - oldbb[0]) + 10,
                (int) (oldbb[3] - oldbb[1]) + 10);

        for (int i = 0; i < canvasGraph.listSize(); i++) {
            JaObject jaxoOb = (JaObject) canvasGraph.listElementAt(i);

            if (jaxoOb != selectedOb) {
                double[] bb;

                bb = jaxoOb.getBoundingBox();

                Rectangle rectOb =
                    new Rectangle((int) bb[0] - 5, (int) bb[1] - 5,
                        (int) (bb[2] - bb[0]) + 10, (int) (bb[3] - bb[1]) + 10);

                if (rectOb.intersects(oldrect)) {
                    g2.setClip((int) bb[0] - 5, (int) bb[1] - 5,
                        (int) (bb[2] - bb[0]) + 10, (int) (bb[3] - bb[1]) + 10);
                    if (Plot.drawFirst(jaxoOb)) jaxoOb.jaxoDraw(g2, true); // sss
                     Plot.drawRest(jaxoOb, g2, true);
                }
            }
        }



        repaint();
        g2.dispose();
    }

    /** Determines which objects should be selected as belonging to a group (ie, whose
     * handles are to be painted gray), when the mouse is dragged withthe middle or
     * right button.
     * @param e The mouse event
     */
    private void selectObjectsToGroup(MouseEvent e) {
        lastY = e.getY();
        lastX = e.getX();

        JaObject newSelectedOb = null;
        int i = canvasGraph.listSize();

        while ((newSelectedOb == null) && (i >= 1)) {
            i--;

            JaObject curOb = (JaObject) canvasGraph.listElementAt(i);

            if (curOb != null) {
                int grabStatus =
                    curOb.getGrabbedHandle(lastX, lastY, JaxoMainPanel.MOVE);

                if (grabStatus != JaObject.SELECT_NONE) {
                    newSelectedOb = curOb;
                    newSelectedOb.setAsMarked(!newSelectedOb.isMarked());
                    repaint();
                    canvasGraph.setSelectedObject(curOb);
                }

                setStartCoordinates();
            }
        }
    }

    /** Select the object when the mouse is clicked or pressed by comparing
     * to see if the coordinates of the mouse is in the rectangular area
     * of each object. Loop through the current list of object from the
     * end to the beginning. If the mouse is in the rectangle of more
     * than one object, then the object created later will be selected.
     * @param e the mouse event
     * @param editmode The current edit mode
     */
    private void selectObject(MouseEvent e, int editmode) {
        lastY = e.getY();
        lastX = e.getX();

        JaObject newSelectedOb = null;
        int i = canvasGraph.listSize();

        while ((newSelectedOb == null) && (i >= 1)) {
            i--;

            JaObject curOb = (JaObject) canvasGraph.listElementAt(i);

            if (curOb != null) {
                int grabStatus =
                    curOb.getGrabbedHandle(lastX, lastY, editmode);

                if (grabStatus != JaObject.SELECT_NONE) {
                    newSelectedOb = curOb;
                    canvasGraph.setSelectedObject(curOb);

                    if (grabStatus == JaObject.SELECT_BODY) {
                        setDragMode(JaxoMainPanel.MOVE);
                    } else {
                        if (grabStatus == JaObject.SELECT_UL) {
                            setDragMode(JaxoMainPanel.RESIZE);
                            curHandle = HANDLE_UL;
                        } else if (grabStatus == JaObject.SELECT_UR) {
                            setDragMode(JaxoMainPanel.RESIZE);
                            curHandle = HANDLE_UR;
                        } else if (grabStatus == JaObject.SELECT_LR) {
                            setDragMode(JaxoMainPanel.RESIZE);
                            curHandle = HANDLE_LR;
                        } else if (grabStatus == JaObject.SELECT_LL) {
                            setDragMode(JaxoMainPanel.RESIZE);
                            curHandle = HANDLE_LL;
                        } else { //SKEL
                            archand = grabStatus;
                            setDragMode(JaxoMainPanel.RESIZE);
                        }
                    }

                    setStartCoordinates();
                }
            }
        }

        saveBackupImage();
        canvasGraph.setBackupList(canvasGraph.copyFrom(
                canvasGraph.getObjectList()));
        canvasGraph.setBackupSelectedObject(canvasGraph.getSelectedObject());
        canvasGraph.setSelectedObject(newSelectedOb);
        lastY = e.getY();
        lastX = e.getX();
    }

    /** Set the reference coordinates.
     * If the lower right conner is grabbed, the reference coords
     * should be the upper left and vice versa;
     * if the lower left conner is grabbbed, the reference coords should
     * be the upper right and vice versa.
     */
    private void setStartCoordinates() {
        JaObject selectedOb = canvasGraph.getSelectedObject();

        if (selectedOb == null) {
            return;
        }

        Dimension d = selectedOb.getSize();
        int handle = curHandle;

        // Upper left x and y coords of the rectangle of the object
        startY = selectedOb.getY();
        startX = selectedOb.getX();

        // If the upper left or upper right handle is selected,
        // then the reference coords should be the lower right or lower left.
        // Therefore, increase the y coords of the reference.
        if ((handle == HANDLE_UR) || (handle == HANDLE_UL)) {
            startY += d.height;
        }

        // If the lower left or lower right handle is selected,
        // then the reference coords should be the uper right or lower right.
        // Therefore, increase the x coords of the reference.
        if ((handle == HANDLE_LL) || (handle == HANDLE_UL)) {
            startX += d.width;
        }
    }



   /** Show mouse coordinates 
     * @param e The corresponding mouse event.
     */
    public final void showCoordinates(MouseEvent e) {

              // show location
        evX = e.getX();
        evY = e.getY();
        padX=-1;
        padY=-1;
        String ss1 = form.format( Global.toX(evX) );
        String ss2 = form.format( Global.toY(evY) );
        String ss3=padInfo;
        String mess="NDC(" + ss1 + "," + ss2 + ")";

        thePanel.setFlagPanelCoordinates(mess);

        for (int i = 0; i < canvasGraph.listSize(); i++) {
            JaObject jaxoOb = (JaObject) canvasGraph.listElementAt(i);

            // mark pads
            if (jaxoOb instanceof JaAxes) {
            if (evX>jaxoOb.getX() &&  evXjaxoOb.getY() &&  evY 1) {
                saveBackupImage();
                canvasGraph.setBackupList(canvasGraph.copyFrom(
                        canvasGraph.getObjectList()));

                double[] groupBounds = getGroupBounds(groupObjects);

                JaxoGroup newGroup = new JaxoGroup();
                newGroup.setObList(groupObjects);
                newGroup.setX((int) groupBounds[0]);
                newGroup.setY((int) groupBounds[1]);
                newGroup.setRelw((int) Math.round((groupBounds[2]
                        - groupBounds[0])));
                newGroup.setRelh((int) Math.round((groupBounds[3]
                        - groupBounds[1])));
                newGroup.setAvailableFonts(JaxoStaticCanvasMethods.getSystemFonts());

                removeFromGraph(groupObjects);

                JaObject newob = (JaObject) newGroup;

                canvasGraph.setBackupSelectedObject(newob);

                canvasGraph.addObject(newob);
                canvasGraph.setSelectedObject(newob);
                setDragMode(JaxoMainPanel.STANDBY);
                withHandles = true;
                withVisualAid = false;
                repaint();
                curHandle = HANDLE_LR;
                setStartCoordinates();
                oldbb = newGroup.getBoundingBox();
                lastY = e.getY();
                lastX = e.getX();
            }
            setDefaultAction();
        }

        if ((((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0) && fboxON)
                || (
                    ((e.getModifiers() & InputEvent.BUTTON3_MASK) != 0)
                    && fboxON
                )) {
            fboxON = false;
            thePanel.getClipboard().clear();

            canvasGraph.setAsMarked(false);
        }

        if (((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0) && !fboxON) {
            if (currentMode == JaxoMainPanel.STANDBY) {
                return;
            } else if (currentMode == JaxoMainPanel.GROUP) {
                selectObjectsToGroup(e);
                setDragMode(JaxoMainPanel.STANDBY);
            } else if (currentMode == JaxoMainPanel.UNGROUP) {
                selectObject(e, JaxoMainPanel.MOVE);

                JaObject ob = canvasGraph.getSelectedObject();

                if ((ob != null) && ob instanceof JaxoGroup) {
                    JaxoGroup tempg = (JaxoGroup) ob;

                    for (int i = 0; i < tempg.groupObListSize(); i++) {
                        JaObject tempob =
                            (JaObject) tempg.getObList().elementAt(i);
                        tempob.setAsMarked(false);
                        canvasGraph.addObject(tempob);
                    }

                    canvasGraph.delete(tempg);
                }

                for (int j = 0; j < canvasGraph.listSize(); j++) {
                    JaObject jaxoOb =
                        (JaObject) canvasGraph.listElementAt(j);

                    if (jaxoOb instanceof JaLatexText) {
                        ((JaLatexText) jaxoOb).createLatexPanel();
                        this.add(((JaLatexText) jaxoOb).getLatexPanel());
                        ((JaLatexText) jaxoOb).getLatexPanel().setVisible(false);
                    }
                }
                withHandles = false;
                unsavedCanvas();
                setDefaultAction();
                repaint();
            } else if (currentMode == JaxoMainPanel.MOVE) {
                JaObject selectedOb = canvasGraph.getSelectedObject();

                if (selectedOb != null) {
                    oldbb = selectedOb.getBoundingBox();
                }
            } else if (currentMode == JaxoMainPanel.RESIZE) {
                selectObject(e, JaxoMainPanel.MOVE);

                JaObject ob = canvasGraph.getSelectedObject();

                if ((ob != null) && ob instanceof JaxoGroup) {
                    JaxoRescalePanel rescalep =
                        new JaxoRescalePanel((JaxoGroup) ob);
                    oldbb = ((JaxoGroup) ob).getBoundingBox();
                    updateOffScreenImage();
                    oldbb = ((JaxoGroup) ob).getBoundingBox();
                    updateOffScreenImage();

                    if (rescalep.hasChanged()) {
                        unsavedCanvas();
                    }
                }
            } else if (currentMode == JaxoMainPanel.COPY) {
                selectObject(e, currentMode);
            } else if (currentMode == JaxoMainPanel.COLOR) {
                selectObject(e, JaxoMainPanel.COPY);

                JaObject selectedOb = canvasGraph.getSelectedObject();

                if (selectedOb != null) {
                    showColorChooser(selectedOb);
                }
            } else if (currentMode == JaxoMainPanel.DELETE) {
                selectObject(e, JaxoMainPanel.MOVE);

                JaObject ob = canvasGraph.getSelectedObject();

                saveBackupImage();
                canvasGraph.setBackupSelectedObject(ob);
                canvasGraph.setBackupList(canvasGraph.copyFrom(
                        canvasGraph.getObjectList()));

                if (ob != null) {
                    oldbb = canvasGraph.getSelectedObject().getBoundingBox();

                    canvasGraph.delete(ob);
                    updateOffScreenImage();

                    if (ob instanceof JaLatexText) {
                        ((JaLatexText) ob).getLatexPanel().setVisible(false);
                    }
                }

                unsavedCanvas();
                setDefaultAction();
                setDragMode(JaxoMainPanel.STANDBY);
            } else if (currentMode == JaxoMainPanel.BACKGROUND) {
                selectObject(e, JaxoMainPanel.MOVE);

                saveBackupImage();
                canvasGraph.setBackupSelectedObject(canvasGraph
                    .getSelectedObject());
                canvasGraph.setBackupList(canvasGraph.copyFrom(
                        canvasGraph.getObjectList()));

                if (canvasGraph.getSelectedObject() != null) {
                    canvasGraph.background(canvasGraph.getSelectedObject());
                    oldbb = canvasGraph.getBoundingBox();
                    updateOffScreenImage();
                }
                setDefaultAction();
                setDragMode(JaxoMainPanel.STANDBY);
            } else if (currentMode == JaxoMainPanel.FOREGROUND) {
                selectObject(e, JaxoMainPanel.MOVE);

                saveBackupImage();
                canvasGraph.setBackupSelectedObject(canvasGraph
                    .getSelectedObject());
                canvasGraph.setBackupList(canvasGraph.copyFrom(
                        canvasGraph.getObjectList()));

                if (canvasGraph.getSelectedObject() != null) {
                    canvasGraph.foreground(canvasGraph.getSelectedObject());
                    oldbb = canvasGraph.getBoundingBox();
                    updateOffScreenImage();
                }
                setDefaultAction();
                setDragMode(JaxoMainPanel.STANDBY);
            } else if (thePanel.getMode() == JaxoMainPanel.EDIT) {
                selectObject(e, JaxoMainPanel.MOVE);

                JaObject selectedOb = canvasGraph.getSelectedObject();

             //   System.out.println("Debug= select");


                if (selectedOb != null) {
                    oldbb = selectedOb.getBoundingBox();
                    saveBackupImage();
                    canvasGraph.setBackupSelectedObject(selectedOb);
                    canvasGraph.setBackupList(canvasGraph.copyFrom(
                            canvasGraph.getObjectList()));

                    boolean hasChanged = selectedOb.editPanel();
                    updateOffScreenImage();
                    oldbb = selectedOb.getBoundingBox();
                    updateOffScreenImage();

                    if (selectedOb instanceof JaLatexText) {
                        ((JaLatexText) selectedOb).setLatexLabel(" "
                            + ((JaLatexText) selectedOb).getTextString()
                            + " ");
                    }

                    if (hasChanged) {
                        unsavedCanvas();
                    }
                }
                setDefaultAction();
                setDragMode(JaxoMainPanel.STANDBY);
            }
        }

       // System.out.println("Debug: Mouse clicked");

    }

    /** The action to be taken when the mouse is pressed on the canvas.
     * @param e The corresponding mouse event.
     */
    public final void mousePressed(MouseEvent e) {
  
    	
    	
    	
	// nofclicks must be implemented only upon a left click!  
	if((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0) {
	nofclicks++;
	}

        int currentMode = thePanel.getMode(); // JaObject to be created

          zoomPADx=-1;
          zoomPADy=-1;

        // chekanov zoomin 
        if (((e.getModifiers() & InputEvent.BUTTON2_MASK) != 0) ) { 

        if (currentMode != JaxoMainPanel.ZOOM &&
            currentMode != JaxoMainPanel.MOVE &&
            currentMode != JaxoMainPanel.COPY &&  
            currentMode != JaxoMainPanel.RESIZE &&
            currentMode != JaxoMainPanel.GROUP 
          ) { 
        int evX = e.getX();
        int evY = e.getY();
        for (int i = 0; i < canvasGraph.listSize(); i++) {
            JaObject jaxoOb = (JaObject) canvasGraph.listElementAt(i);
            // mark pads
            if (jaxoOb instanceof JaAxes) {
            if (evX>jaxoOb.getX() &&  evXjaxoOb.getY() &&  evY-1 && zoomPADy>-1) {
          
           int evX = e.getX();
           int evY = e.getY();
          // System.out.println("Debug: Releaze mouse");

           
        for (int i = 0; i < canvasGraph.listSize(); i++) {
            JaObject jaxoOb = (JaObject) canvasGraph.listElementAt(i);
            
            // System.out.println(jaxoOb.toString());
            // mark pads
            if (jaxoOb instanceof JaAxes) {
            
                 	
            	int n1= ((JaAxes)jaxoOb).getPad(0);
                int n2= ((JaAxes)jaxoOb).getPad(1);
                

               //  System.out.println(n1);
               // System.out.println(n2);

                
            	if (n1 == zoomPADx && n2 == zoomPADy) {
            	
            if (evX>jaxoOb.getX() &&  evXjaxoOb.getY() &&  evYx) ja.setRange(0,x,startUSERx);
                   
                   if (startUSERyy) ja.setRange(1,y,startUSERy);
                  
                   if (ja.isContour()==true) {
                             if (ja.getPlotType()==LinePars.CONTOUR)  ja.parseContour(); 
                             if (ja.getPlotType()==LinePars.H2D)      ja.parseH2D(); 
                    }

                    zoom_done=true;  
                    zoomPADx=-1;
                    zoomPADy=-1;
                   }
            } }


            if (jaxoOb instanceof JaLatexText) {
                if (((JaLatexText) jaxoOb).isRolledOver(e.getX(), e.getY())) {
                    ((JaLatexText) jaxoOb).getLatexPanel().setVisible(true);
                } else {
                    ((JaLatexText) jaxoOb).getLatexPanel().setVisible(false);
                }
            }
 
         }

        }

       } // end start zoomin


        
      // update image 
      if (zoom_done) update();
      































        if (currentMode == JaxoMainPanel.ZOOM) {
            JaxoZoom zoom = thePanel.getZoom();
            zoom.eraseZoomWindow();
        }

        // Remove the faintbox; build the group.
        if (((e.getModifiers() & InputEvent.BUTTON2_MASK) != 0) && fboxON) {
            fboxON = false;
            thePanel.getClipboard().clear();

            // Construct the group with the marked objects
            Vector groupObjects = buildGroupList();

            if (groupObjects.size() > 1) {
                saveBackupImage();
                canvasGraph.setBackupList(canvasGraph.copyFrom(
                        canvasGraph.getObjectList()));

                double[] groupBounds = getGroupBounds(groupObjects);

                JaxoGroup newGroup = new JaxoGroup();
                newGroup.setObList(groupObjects);
                newGroup.setX((int) groupBounds[0]);
                newGroup.setY((int) groupBounds[1]);
                newGroup.setRelw((int) Math.round((groupBounds[2]
                        - groupBounds[0])));
                newGroup.setRelh((int) Math.round((groupBounds[3]
                        - groupBounds[1])));
                newGroup.setAvailableFonts(JaxoStaticCanvasMethods.getSystemFonts());

                removeFromGraph(groupObjects);

                JaObject newob = (JaObject) newGroup;
                canvasGraph.setBackupSelectedObject(newob);
                canvasGraph.addObject(newob);
                canvasGraph.setSelectedObject(newob);
                oldbb = newGroup.getBoundingBox();
            }

            canvasGraph.setAsMarked(false);
            repaint();
        }

        if (((e.getModifiers() & InputEvent.BUTTON3_MASK) != 0) && fboxON) {
            fboxON = false;
            canvasGraph.setAsMarked(false);
            repaint();
        }

        if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0) {
            if (fboxON) {
                fboxON = false;
                canvasGraph.setAsMarked(false);
                repaint();
            }

            if ((currentMode == JaxoMainPanel.MOVE)
                    || (currentMode == JaxoMainPanel.COPY)) {
                withHandles = true;
                withVisualAid = false;
                drawSelectedObject();
                setDefaultAction();
            } else if ((currentMode == JaxoMainPanel.FLOOP)
                    || (currentMode == JaxoMainPanel.PLOOP)
                    || (currentMode == JaxoMainPanel.SLOOP)
                    || (currentMode == JaxoMainPanel.GLLOOP)
                    || (currentMode == JaxoMainPanel.GLOOP)
                    || (currentMode == JaxoMainPanel.FLINE)
                    || (currentMode == JaxoMainPanel.SLINE)
                    || (currentMode == JaxoMainPanel.GLINE)
                    || (currentMode == JaxoMainPanel.GLLINE)
                    || (currentMode == JaxoMainPanel.PLINE)
                    || (
                        (currentMode == JaxoMainPanel.SARC)
                        && ((nofclicks % 3) == 0)
                    )
                    || (
                        (currentMode == JaxoMainPanel.GARC)
                        && ((nofclicks % 3) == 0)
                    )
                    || (
                        (currentMode == JaxoMainPanel.GLARC)
                        && ((nofclicks % 3) == 0)
                    )
                    || (
                        (currentMode == JaxoMainPanel.PARC)
                        && ((nofclicks % 3) == 0)
                    )
                    || (
                        (currentMode == JaxoMainPanel.FARC)
                        && ((nofclicks % 3) == 0)
                    )
                    || (
                        (currentMode == JaxoMainPanel.VERTEX)
                        && (
                            (
                                thePanel.getVertexType() == JaxoMainPanel.VERTEXT1
                            )
                            || (
                                thePanel.getVertexType() == JaxoMainPanel.VERTEXT2
                            )
                            || (
                                thePanel.getVertexType() == JaxoMainPanel.VERTEXT3
                            )
                            || (
                                thePanel.getVertexType() == JaxoMainPanel.VERTEXT4
                            )
                            || (
                                (
                                    thePanel.getVertexType() == JaxoMainPanel.VERTEXT5
                                ) && ((nofclicks % 3) == 0)
                            )
                            || (
                                thePanel.getVertexType() == JaxoMainPanel.VERTEXT6
                            )
                        )
                    ) || (currentMode == JaxoMainPanel.BOX)
                    || (currentMode == JaxoMainPanel.BLOB)
                    || (currentMode == JaxoMainPanel.ZIGZAG)) {
                if (!fboxON) {
                    withHandles = false;
                    withVisualAid = false;
                    drawSelectedObject();
                    setDefaultAction();
                }
            } else if (getDragMode() == JaxoMainPanel.RESIZE) {
                JaObject ob = canvasGraph.getSelectedObject();

                if (ob != null) {
                    if (ob instanceof JaFLine || ob instanceof JaSLine
                            || ob instanceof JaGLine) {
                        JaLineObject lineObject = (JaLineObject) ob;

                        if (lineObject.getBack()) {
                            lineObject.setRelWAndH(-lineObject.getRelw(),
                                -lineObject.getRelh());
                            lineObject.setInflip(!lineObject.getInflip());
                            lineObject.setBack(false);
                        }
                    } else if (ob instanceof JaGlLine) {
                        JaGlLine glLineObject = (JaGlLine) ob;

                        if (glLineObject.getBack()) {
                            glLineObject.setRelWAndH(-glLineObject.getRelw(),
                                -glLineObject.getRelh());
                            glLineObject.setAngamp(-glLineObject.getAngamp());
                            glLineObject.setBack(false);
                        }
                    } else if (ob instanceof JaArcObject) {
                        JaArcObject arcOb = (JaArcObject) ob;
                        arcOb.setIsResizing(false);
                    }

                    withVisualAid = false;
                    withHandles = true;
                    // chekanov: determin proper coordinates  
                   //  ob.updateNDC(); 

                    if (Plot.drawFirst(ob)) drawObject(ob);
                    drawRest(ob); 
                    setDefaultAction();
                }
            }
        }
    }

    /** The action to be taken when the mouse exits the canvas.
     * @param e The corresponding mouse event.
     */
    public final void mouseExited(MouseEvent e) {
        //        return;
    }

    /** The action to be taken when the mouse enters the canvas.
     * @param e The corresponding mouse event.
     */
    public final void mouseEntered(MouseEvent e) {
        //        return;
    }

    /** The action to be taken when the mouse is moved on the canvas.
     * @param e The corresponding mouse event.
     */
    public final void mouseMoved(MouseEvent e) {
        evX = e.getX();
        evY = e.getY();




        if (pointsON) {
            if (thePanel.getSnap()) {
                evY = grid.snapY(evY);
                evX = grid.snapX(evX);
            }

            repaint();
        }
    }

    
    /**
     * Redraw all components
     */
    public void update() {
    clearOffScreenImage();
    updateObjectLocation();	 
    	
    }
    /** Sets the size of the grid to the given value.
     * @param gs The grid size to be set.
     */
    public final void setGridSize(int gs) {
        grid.setGridSize(gs);
    }

    /** Returns the current size of the grid.
     * @return The grid size.
     */
    public final int getGridSize() {
        return grid.getGridSize();
    }

    /** Sets the type of the grid.
     * @param type The type of the grid to be set.
     */
    public final void setGridType(boolean type) {
        grid.setGridType(type);
    }

    /** Returns the current type of the grid.
     * @return  The type of the grid.
     */
    public final boolean getGridType() {
        return grid.getGridType();
    }

    /** Draws a light grey box that is used for grouping objects.
     * @param g2 The graphics context to draw
     */
    private void drawFaintBox(VectorGraphics g2) {
        thePanel.getClipboard().clear();

        int width = fboxX - lastX;
        int height = fboxY - lastY;

        Rectangle faintbox;

        if (height < 0) {
            if (width < 0) {
                faintbox = new Rectangle(fboxX, fboxY, -width, -height);
            } else {
                faintbox = new Rectangle(lastX, fboxY, width, -height);
            }
        } else {
            if (width < 0) {
                faintbox = new Rectangle(fboxX, lastY, -width, height);
            } else {
                faintbox = new Rectangle(lastX, lastY, width, height);
            }
        }

        g2.setColor(JaxoColor.GRAYSCALE150);
        g2.setStroke(new BasicStroke(1.f));
        g2.draw(faintbox);

        double[] bb;

        for (int i = 0; i < canvasGraph.listSize(); i++) {
            JaObject jaxoOb = (JaObject) canvasGraph.listElementAt(i);

            bb = jaxoOb.getBoundingBox();

            Rectangle rectOb =
                new Rectangle((int) bb[0] - 5, (int) bb[1] - 5,
                    (int) (bb[2] - bb[0]) + 5, (int) (bb[3] - bb[1]) + 5);

            if (faintbox.contains(rectOb)) {
                thePanel.getClipboard().addObject(jaxoOb.copy());
                jaxoOb.setAsMarked(true);
            } else {
                thePanel.getClipboard().delete(jaxoOb);
                jaxoOb.setAsMarked(false);
            }
        }
    }

    /** Returns a group.
     * @return A vector of JaxoObjects that have been marked for grouping
     */
    private Vector buildGroupList() {
        Vector groupObjects = new Vector(5, 5);

        for (int i = 0; i < canvasGraph.listSize(); i++) {
            JaObject ob = (JaObject) canvasGraph.getObjectList().get(i);

            if (ob.isMarked()) {
                groupObjects.add(ob);
            }
        }

        return groupObjects;
    }

    /** Returns the bounding box of a group.
     * @param groupObList the list of JaxoObjects in the group
     * @return An array containg the bounding box
     */
    private double[] getGroupBounds(Vector groupObList) {
        double minX = 0.;
        double maxX = 1.;
        double minY = 0.;
        double maxY = 1.;
        double[] bBox = {minX, maxX, minY, maxY};

        int length = groupObList.size();

        for (int i = 0; i < length; i++) {
            JaObject ob = (JaObject) groupObList.elementAt(i);

            bBox = ob.getBoundingBox();

            if (i == 0) {
                minX = bBox[0];
                minY = bBox[1];
                maxX = bBox[2];
                maxY = bBox[3];
            } else {
                if (bBox[0] < minX) {
                    minX = bBox[0];
                }

                if (bBox[1] < minY) {
                    minY = bBox[1];
                }

                if (bBox[2] > maxX) {
                    maxX = bBox[2];
                }

                if (bBox[3] > maxY) {
                    maxY = bBox[3];
                }
            }
        }

        bBox[0] = minX;
        bBox[1] = minY;
        bBox[2] = maxX;
        bBox[3] = maxY;

        return bBox;
    }

    /** Removes the JaxoObjects in the vector obList from the current graph.
     * @param obList A vector containg JaxoObjects.
     */
    private void removeFromGraph(Vector obList) {
        for (int i = 0; i < obList.size(); i++) {
            JaObject jaxoOb = (JaObject) obList.elementAt(i);

            if (jaxoOb instanceof JaLatexText) {
                ((JaLatexText) jaxoOb).getLatexPanel().setVisible(false);
            }

            canvasGraph.delete((JaObject) obList.elementAt(i));
        }
    }

    /** Indicates that the canvas contains a graph that is not saved. */
    public final void unsavedCanvas() {
        canvasGraph.setSaved(false);
        isUsed = true;
        thePanel.getCanvasPanel().setModifiedIcon(thePanel.getCanvasPanel()
                                                          .indexOfComponent(this));
    }

    /** Indicates whether the current canvas has been used.
     * @return True, if the canvas has been modified, false otherwise.
     */
    public final boolean hasBeenUsed() {
        return isUsed;
    }

    /** Indicates whether handles are drawn.
     * @return True, if handles are drawn, false otherwise.
     */
    public final boolean isWithHandles() {
        return withHandles;
    }

    /** Sets handles to draw or not.
     @param draw True, if handles should be drawn, false otherwise.
     */
    public final void drawWithHandles(boolean draw) {
        this.withHandles = draw;
    }

    /** Indicates whether the visual aid is drawn.
     * @return True, if the visual aid is drawn, false otherwise.
     */
    public final boolean isWithVisualAid() {
        return withVisualAid;
    }

    /** Sets the visual aid to draw or not.
     @param draw True, if the visual aid should be drawn, false otherwise.
     */
    public final void drawVisualAid(boolean draw) {
        this.withVisualAid = draw;
    }

    private void drawText(JaObject newob, boolean drawToScreen) {
        // Graphics2D g2 = (Graphics2D) offScreenImage.getGraphics();
        VectorGraphics g2 = ( VectorGraphics) offScreenImage.getGraphics();

        if (JaxoPrefs.getBooleanPref(JaxoPrefs.PREF_ANTIALIAS)) {
            g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        }

        if (Plot.drawFirst(newob)) newob.jaxoDraw(g2, drawToScreen);
        Plot.drawRest(newob, g2, drawToScreen);
    }

    /** Sets the text in different languages.
     * @param languageString A string specifying the language to be set.
     */
    public final void setLanguage(String languageString) {
        this.language = ResourceBundle.getBundle(languageString);
    }

    private void reSnap(JaObject ob) {
        int cx = 0;
        int cy = 0;
        int qx = 0;
        int qy = 0;

        if ((ob.getRelw() >= 0) && (ob.getRelh() > 0)) {
            cx = ob.getX();
            cy = ob.getY();
        } else if ((ob.getRelw() > 0) && (ob.getRelh() <= 0)) {
            cx = ob.getX();
            cy = ob.getY() + ob.getHeight();
        } else if ((ob.getRelw() <= 0) && (ob.getRelh() < 0)) {
            cx = ob.getX() + ob.getWidth();
            cy = ob.getY() + ob.getHeight();
        } else if ((ob.getRelw() < 0) && (ob.getRelh() >= 0)) {
            cx = ob.getX() + ob.getWidth();
            cy = ob.getY();
        }

        // Snap first y and then x because the order for an hexagonal grid
        // matters
        qy = grid.snapY(cy);
        qx = grid.snapX(cx);

        if (grid.getGridType() && (Math.abs(cx - qx) == grid.getGridSize())) {
            qx = cx;
        }

        ob.moveBy(qx - cx, qy - cy);
    }

    /**  When drawing arc objects: resets the number of clicks to zero. */
    public final void resetNOfClicks() {
        this.nofclicks = 0;
    }

    private void drawPointsAid(VectorGraphics g2) {
        GeneralPath gp = new GeneralPath();

        if ((nofclicks % 3) == 1) {
            gp.moveTo((float) points[0], ((float) points[1]));
            gp.lineTo(evX, evY);
        } else if ((nofclicks % 3) == 2) {
            gp.moveTo((float) points[0], (float) points[1]);
            gp.lineTo((float) points[2], (float) points[3]);
            gp.lineTo(evX, evY);
        }

        g2.setColor(JaxoColor.RED);
        g2.setStroke(new BasicStroke(1.f));
        g2.draw(gp);
    }

    private JaObject createNewObject(int currentMode, int x, int y) {
        canvasGraph.setSelectedObject(null);
        JaxoStaticCanvasMethods.setNofClicks(nofclicks);
        JaxoStaticCanvasMethods.setLanguage(language);
        JaxoStaticCanvasMethods.setPoints(points);
        JaxoStaticCanvasMethods.setPointsON(pointsON);
        JaxoStaticCanvasMethods.setVertexType(thePanel.getVertexType());

        JaObject newob =
            JaxoStaticCanvasMethods.createNewObject(currentMode, x, y);

        this.pointsON = JaxoStaticCanvasMethods.getPointsON();
        this.points = JaxoStaticCanvasMethods.getPoints();

        if (newob instanceof JaLatexText) {
            this.add(((JaLatexText) newob).getLatexPanel());
            ((JaLatexText) newob).getLatexPanel().setVisible(false);
            drawText(newob, true);
            setDefaultAction();
        } else if (newob instanceof JaText) {
            drawText(newob, true);
            setDefaultAction();
        }

        return newob;
    }

    private void showColorChooser(JaObject ob) {
        saveBackupImage();
        canvasGraph.setBackupSelectedObject(ob);
        canvasGraph.setBackupList(canvasGraph.copyFrom(
                canvasGraph.getObjectList()));

        Color oldColor = ob.getColor();
        Color newColor = oldColor;
        JaxoColorChooser colorChooser = new JaxoColorChooser();

        if (ob instanceof JaFillObject) {
            JaFillObject fillObject = (JaFillObject) ob;
            Color oldFillColor = fillObject.getFillColor();
            Color newFillColor = oldFillColor;

            newFillColor = colorChooser.color(oldFillColor, true);

            if (!oldFillColor.equals(newFillColor) && (newFillColor != null)) {
                fillObject.setFillColor(newFillColor);

                if (JaxoColor.isGrayScale(newFillColor)) {
                    fillObject.setColor(JaxoColor.BLACK);
                }

                unsavedCanvas();
            }
        } else if (ob instanceof JaxoGroup) {
            newColor = colorChooser.color(newColor, false);

            if (newColor != null) {
                ((JaxoGroup) ob).setGroupColor(newColor);
                unsavedCanvas();
            }
        } else if (ob instanceof JaText) {
            newColor = colorChooser.color(ob, true);

            if (!oldColor.equals(newColor) && (newColor != null)) {
                ob.setColor(newColor);
                unsavedCanvas();
            }
        } else {
            newColor = colorChooser.color(ob, false);

            if (!oldColor.equals(newColor) && (newColor != null)) {
                ob.setColor(newColor);
                unsavedCanvas();
            }
        }

        oldbb = ob.getBoundingBox();
        updateOffScreenImage();
        setDefaultAction();
        setDragMode(JaxoMainPanel.STANDBY);
    }

    private void drawSelectedObject() {
        // Graphics2D g2 = (Graphics2D) offScreenImage.getGraphics();
        // VectorGraphics g2 = ( VectorGraphics) offScreenImage.getGraphics();

        if (g2 == null) return;


        if (JaxoPrefs.getBooleanPref(JaxoPrefs.PREF_ANTIALIAS)) {
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        }

        JaObject ob = canvasGraph.getSelectedObject();

        if (ob != null) {
            // ob.updateNDC(); // chekanov
            if (Plot.drawFirst(ob)) ob.jaxoDraw(g2, true);
            Plot.drawRest(ob, g2, true);


            //Remove zero size objects.
            if (((int) ob.getSize().getWidth() == 0)
                    && ((int) ob.getSize().getHeight() == 0)) {
                canvasGraph.delete(ob);
            }
        }

        repaint();
        g2.dispose();
    }

    private void drawObject(JaObject ob) {

        if (g2 == null) return;
        // Graphics2D g2 = (Graphics2D) offScreenImage.getGraphics();
        // VectorGraphics g2 = ( VectorGraphics) offScreenImage.getGraphics();

        if (JaxoPrefs.getBooleanPref(JaxoPrefs.PREF_ANTIALIAS)) {
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        }

        if (ob != null) {
                 if (Plot.drawFirst(ob)) ob.jaxoDraw(g2, true);
                 Plot.drawRest(ob, g2, true); 
      }

        repaint();
        g2.dispose();
    }



    // draw data
    private void drawRest(JaObject ob) {

        if (g2 == null) return;

        //  Graphics2D g2 = (Graphics2D) offScreenImage.getGraphics();
        //  VectorGraphics g2 = ( VectorGraphics) offScreenImage.getGraphics();

        if (JaxoPrefs.getBooleanPref(JaxoPrefs.PREF_ANTIALIAS)) {
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        }


        if (ob != null) {
                            Plot.drawRest(ob, g2, true); 


        }

        repaint();
        g2.dispose();
    }











    private void setDefaultAction() {
        int def = JaxoPrefs.getIntPref(JaxoPrefs.PREF_DEFAULTACTION);
        if (def != 0) {
            if ((def < 16) && ((thePanel.getMode() - def - 2) != 0)) {
                thePanel.getPbtPanel().clickButton(def - 1);
            } else if ((def > 15) && (def < 22)
                    && ((thePanel.getMode() - def - 14) != 0)) {
                thePanel.getMbtPanel().clickButton(def - 16);
            } else if ((def > 21) && ((thePanel.getMode() - def - 28) != 0)) {
                thePanel.getEbtPanel().clickButton(def - 22);
            }
        }
    }



   // update objects and redraw
   public void updateObjectLocation() {

      if (canvasGraph == null || canvasGraph.listSize() == 0) return;

      // draw all objects
      for (int i = 0; i < canvasGraph.listSize(); i++) {
            JaObject jaxoOb = (JaObject) canvasGraph.listElementAt(i);
              if (jaxoOb != null) { 
              jaxoOb.updateCoor();
              drawObject(jaxoOb );
              drawRest(jaxoOb);
           }
 
         }


    }


  // update objects and redraw
   public void updateLocations() {

      if (canvasGraph == null || canvasGraph.listSize() == 0) return;

      for (int i = 0; i < canvasGraph.listSize(); i++) {
            JaObject jaxoOb = (JaObject) canvasGraph.listElementAt(i);
              if (jaxoOb != null) {
              jaxoOb.updateCoor();
           }

         }
    }

    

  //Define the methods of the ComponentListener interface
    public void componentResized(ComponentEvent e){
         
    	
         /* chekanov  
         */
  
   	 if (start) {
    	    Dimension d= getSize(); 
            Global.sizeX=(int)d.getWidth();
            Global.sizeY=(int)d.getHeight();
            clearOffScreenImage();
            updateObjectLocation();
    	}
    	 start=true; 
         



 //      System.out.println("Resized\n" + e.getSource());
    }//end componentResized()

    public void componentMoved(ComponentEvent e){
     // System.out.println("Moved\n" + e.getSource());
    }//end componentMoved()

    public void componentShown(ComponentEvent e){
    //  System.out.println("Shown\n" + e.getSource());
    }//end componentShown()

    public void componentHidden(ComponentEvent e){
      //System.out.println("Hidden\n" + e.getSource());
    }//end componentHidden()


   


}

 

Ads help maintain this website.