Package cc.sketchchair.core

Source Code of cc.sketchchair.core.UITools

/*******************************************************************************
* This is part of SketchChair, an open-source tool for designing your own furniture.
*     www.sketchchair.cc
*    
*     Copyright (C) 2012, Diatom Studio ltd.  Contact: hello@diatom.cc
*
*     This program is free software: you can redistribute it and/or modify
*     it under the terms of the GNU General Public License as published by
*     the Free Software Foundation, either version 3 of the License, or
*     (at your option) any later version.
*
*     This program is distributed in the hope that it will be useful,
*     but WITHOUT ANY WARRANTY; without even the implied warranty of
*     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*     GNU General Public License for more details.
*
*     You should have received a copy of the GNU General Public License
*     along with this program.  If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package cc.sketchchair.core;

import java.awt.Desktop;
import java.awt.Frame;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;

import javax.jnlp.FileContents;
import javax.jnlp.FileOpenService;
import javax.jnlp.FileSaveService;
import javax.jnlp.ServiceManager;
import javax.jnlp.UnavailableServiceException;
import javax.vecmath.Matrix4f;
import javax.vecmath.Vector3f;

import nu.xom.Attribute;
import nu.xom.Builder;
import nu.xom.Document;
import nu.xom.Element;
import nu.xom.ParsingException;
import nu.xom.Serializer;
import nu.xom.ValidityException;
import processing.core.PApplet;
import processing.core.PGraphics;
import processing.core.PImage;
import toxi.geom.Plane;
import toxi.geom.Ray3D;
import toxi.geom.Vec2D;
import toxi.geom.Vec3D;
import ModalGUI.GUIButton;
import ModalGUI.GUIComponentSet;
import ModalGUI.GUIEvent;
import ModalGUI.GUIImage;
import ModalGUI.GUIToggle;
import ModalGUI.GUIWindow;
import ModalGUI.ModalGUI;
import ShapePacking.BezierControlNode;

import cc.sketchchair.environments.Environment;
import cc.sketchchair.functions.functions;
import cc.sketchchair.geometry.SlicePlane;
import cc.sketchchair.ragdoll.ergoDoll;
import cc.sketchchair.sketch.SETTINGS_SKETCH;
import cc.sketchchair.sketch.SketchPoint;
import cc.sketchchair.sketch.SketchShape;
import cc.sketchchair.sketch.SketchTools;
import cc.sketchchair.widgets.WidgetLoad;

import com.bulletphysics.dynamics.RigidBody;
import com.bulletphysics.linearmath.Transform;

/**
* Acts as a interface between the GUI and the SketchChair engine.
* This class also proves some functions such as mapping a 2d position into model space that might be best put else where later.
* This class could do with some tidying up.
* @author gregsaul
*
*/

public class UITools {

  public static final int DRAW_TOOL = 1;
  public static final int SELECT_TOOL = 2;
  public static final int SELECT_BEZIER_TOOL = 9;
  public static int LEG_TOOL = 7;

  public static final int MOVE_CAM_TOOL = 3;

  public static final int ZOOM_CAM_TOOL = 4;

  public static final int ROTATE_CAM_TOOL = 5;

  public static final int ADD_DOLL_TOOL = 6;
  public static final int SCALE_PERSON_TOOL = 8;
  public static final int VIEW_SHAPE_PACK = 1;
  public static final int VIEW_CHAIR_EDIT = 2;
  public static final int VIEW_SAVE_CHAIR = 3;
  public static final int DRAW_PATH_TOOL = 12;
  public static final int MOVE_OBJECT = 16;

  public static final int SCALE_TOOL = 19;
  public static final int MOVE_2D_TOOL = 20;
  public static final int SLICES_SINGLE_SLICE = 23;
  public static final int SLICES_GROUP_SLICES = 24;
  public static final int SLICES_SINGLE_SLAT = 28;
  public static final int SLICES_SLATSLICE_GROUP = 29;
  public static final int SLICES_EDIT = 30;

 
  GUIComponentSet toggleSet = new GUIComponentSet();

  static void doLoad() {
    load("chair.cha");

  }

  static void doSave() {

    save("chair.cha");

  }

  static void load(Document doc) {

    LOGGER.debug("UITools: about to load Document");

    //return fd.getFile();
    //FileInputStream fileIn = new FileInputStream(name);
    //ObjectInputStream in = new ObjectInputStream(fileIn);
    Element e = (Element) doc.getChild(0);

    //check to make sure that it's a sketch chair doc.
    if (!e.getQualifiedName().equals("SketchChairDoc"))
      return;

    e = (Element) e.getChild(0);

    SketchChair loadedChair = null;
    LOGGER.debug("UITools: about to load chair structure");

    //loading a chair
    if (e.getQualifiedName().equals("SketchChair")) {
      loadedChair = new SketchChair(e);
    }
    LOGGER.debug("UITools: loaded chair object");

    if (loadedChair != null) {

      //  loadedChair.justLoaded();

      GLOBAL.sketchChairs.add(loadedChair);
      //GLOBAL.sketchChairs.setCurChair(loadedChair);

      if (GLOBAL.planesWidget != null
          && GLOBAL.planesWidget.slider != null) {
        GLOBAL.planesWidget.slider.setVal(loadedChair.getWidth());
        //GLOBAL.planesWidget.SlatSliderStart.setVal(loadedChair.startCoverPercent);
        // GLOBAL.planesWidget.SlatSliderEnd.setVal(loadedChair.endCoverPercent);
        // GLOBAL.planesWidget.SlatSliderSpacing.setVal(loadedChair.slatSpacingX);
        GLOBAL.slicesWidget.rebuild(loadedChair.crossSliceSelections);
      }

      GLOBAL.sketchChairs.getCurChair().localSavelocation = GLOBAL.lastLoadLocation;

    } else {
      LOGGER.error("Could not load chair from XML.");
    }

  }

  static void load(InputStream inputStream) {

    Builder builder = new Builder();

    Document doc = null;

    try {
      doc = builder.build(inputStream);
      load(doc);
    } catch (ValidityException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (ParsingException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

  }

  public static void load(String name) {

    Builder builder = new Builder();
    InputStream input = null;

    GLOBAL.lastLoadLocation = name;
    LOGGER.debug("loading about to open file pointer.");
    try {
      input = new FileInputStream(name);
    } catch (FileNotFoundException e1) {
      LOGGER.debug("UITolls: FileNotFoundException");
      e1.printStackTrace();
    }
    LOGGER.debug("loading file pointer open.");

    Document doc = null;

    if (input == null)
      LOGGER.debug("UITools: File input is null.");

    try {
      if (builder == null)
        LOGGER.debug("UITools: XOM builder is null.");

      LOGGER.debug("UITools: about to build XML from input.");

      doc = builder.build(input);

      if (doc == null)
        LOGGER.debug("UITools: doc XOM obj is null.");

      load(doc);
    } catch (ValidityException e) {
      // TODO Auto-generated catch block
      LOGGER.error("UITools: Could not make XML document: ValidityException");
      e.printStackTrace();
    } catch (ParsingException e) {
      // TODO Auto-generated catch block
      LOGGER.error("UITools: Could not make XML document: ParsingException");
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      LOGGER.error("UITools: Could not make XML document: IOException");
      e.printStackTrace();
    }

  }

  static void save(OutputStream stream, String name) {

    if (GLOBAL.sketchChairs.getCurChair() != null) {
      PGraphics saveImg = GLOBAL.sketchChairs.getCurChair()
          .renderToFile();

      if (saveImg.width > 0 && saveImg.height > 0)
        saveImg.save(name + ".png");

    }

  }

  static void save(String name) {

    if (GLOBAL.sketchChairs.getCurChair() != null) {
      try {
        Element root = new Element("SketchChairDoc");
        root.addAttribute(new Attribute("version", String
            .valueOf(SETTINGS.version)));
       
        root.appendChild(GLOBAL.sketchChairs.getCurChair().toXML());

        Document doc = new Document(root);
        OutputStream outXML = new FileOutputStream(name);
        outXML = new BufferedOutputStream(outXML);
        Serializer serializer = new Serializer(outXML, "ISO-8859-1");
        serializer.write(doc);

        GLOBAL.sketchChairs.getCurChair().localSavelocation = name;

      } catch (FileNotFoundException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
      float rememberThis = GLOBAL.rotateModelsX;
      GLOBAL.rotateModelsX = .01f;
     
      /*
      PImage saveImg = GLOBAL.sketchChairs.getCurChair().renderDiagram(
          SETTINGS.THUMBNAIL_HEIGHT, SETTINGS.THUMBNAIL_HEIGHT,
          (float) -(Math.PI / 8), (float) -(Math.PI / 4), false);

      GLOBAL.rotateModelsX = rememberThis;
      if (saveImg.width > 0 && saveImg.height > 0)
        saveImg.save(name + ".png");
        */

    }
  }
 
 
  static void savePattern(String name) {
    GLOBAL.shapePack.makeSVG(GLOBAL.applet, name);
/*
    if (GLOBAL.sketchChairs.getCurChair() != null) {
      try {
        Element root = new Element("SketchChairDoc");
        root.addAttribute(new Attribute("version", String
            .valueOf(SETTINGS.version)));

        root.appendChild(GLOBAL.sketchChairs.getCurChair().toXML());

        Document doc = new Document(root);
        OutputStream outXML = new FileOutputStream(name);
        outXML = new BufferedOutputStream(outXML);
        Serializer serializer = new Serializer(outXML, "ISO-8859-1");
        serializer.write(doc);

        GLOBAL.sketchChairs.getCurChair().localSavelocation = name;

      } catch (FileNotFoundException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
      float rememberThis = GLOBAL.rotateModelsX;
      GLOBAL.rotateModelsX = .01f;
      PImage saveImg = GLOBAL.sketchChairs.getCurChair().renderDiagram(
          SETTINGS.THUMBNAIL_HEIGHT, SETTINGS.THUMBNAIL_HEIGHT,
          (float) -(Math.PI / 8), (float) -(Math.PI / 4), false);

      GLOBAL.rotateModelsX = rememberThis;
      if (saveImg.width > 0 && saveImg.height > 0)
        saveImg.save(name + ".png");

    }
    */
  }

 
 
 

  private int currentTool = 1;
  public int currentView = 2;
  public static int MEASURE_TOOL = 21;

  public static int CROSSSLICE_EDIT = 22;
  public static  PImage DRAW_TOOL_CURSOR = null;
  public static  PImage SELECT_TOOL_CURSOR = null;
  public static  PImage ADD_DOLL_TOOL_CURSOR = null;
  public static  PImage MOVE_OBJECT_CURSOR = null;
 
 
 
  public static  PImage ROTATE_CAM_TOOL_CURSOR =null;
  public static  PImage ZOOM_CAM_TOOL_CURSOR = null;
  public static  PImage MOVE_CAM_TOOL_CURSOR = null;

  public static  PImage CURSOR_ADD_SLICE = null;

  public static  PImage LINE_TOOL_CURSOR;
  public static  PImage SCALE_TOOL_CURSOR;
  private PGraphics pickBuffer;
  private SketchPoint selectedVec = new SketchPoint(0, 0);
  public boolean render3dPreview = false;
  private SlicePlane selectedVecPlane = null;

  public SlicePlane curSliceplane = null;

  private SketchShape selectedShape = null;
  private boolean isSelectedVecOnOutline = false;
  public static int MOUSE_RIGHT = 39;
  public static int MOUSE_MIDDLE = 3;
  public static final int MOUSE_LEFT = 37;
  static final int LANGUAGE_ENG = 1;
  static final int LANGUAGE_JP = 2;
  private static final int NONE = -1;
  public static final int SLICE_EDIT_MODE_ADD = 0;
  public static final int SLICE_EDIT_MODE_POS = 1;
  public static final int SLICE_EDIT_MODE_SPACING = 2;
  private int editing = 1;
  public int preview = 2;

  public int editingMode = isEditing();
  public int pmouseX;
  public int pmouseY;
  public int mouseX;
  public int mouseY;
  public float mouseXworld;
  public float mouseYworld;
  public float pmouseXworld;
  public float pmouseYworld;
  public boolean mouseDown = false;

  public int mouseButton;
  public boolean renderNodesFlag = false;
  boolean useGrid = false;
  float gridWidth = 50f;
  float gridHeight = 50f;
  float minorGridnumber = 10;
  public RigidBody selectedBody;
  public boolean keyPressed;

  public char key;
  public int keyCode;
  private int selectCooldown;
  public MeasureTool measureTool = new MeasureTool();

  private PImage MEASURE_TOOL_CURSOR;

  private ArrayList<Clickable> clickables = new ArrayList<Clickable>();
  public boolean patternView = false;
  public float brush_dia = 40;
  public boolean mousePressed = false;
  private int mousePressedTime = 0;
  private int mouseSingleClickTime;
  public int loadedCursor;
  private boolean waitingForSingleClick;
  public boolean hasCursorControl = false;
  private PImage CURSOR_EDIT_SLICE_POS;
  private PImage CURSOR_EDIT_SLICE_SPACING;
  public int sliceToolMode = 0;
  private boolean prevMouseWasMove = false;
  public static SketchTools SketchTools;

  UITools(PApplet applet) {
    SketchTools = new SketchTools(applet);
  }

  public void addListener(Clickable clickable) {
    this.clickables.add(clickable);
  }

  public void addPlane(GUIEvent e) {
    if (GLOBAL.sketchChairs.getCurChair() != null)
      GLOBAL.sketchChairs.getCurChair().addLayer();

  }

  public void autoLoad() {
    load("autoSave.cha");
  }

  public void autoRotate(GUIEvent e) {

    GLOBAL.autoRotate = !GLOBAL.autoRotate;

    setCurrentTool(ROTATE_CAM_TOOL);
    if (!GLOBAL.autoRotate)
      GLOBAL.rotateModelsY = 0;
   
    GLOBAL.slicesWidget.unselectAll();
    GLOBAL.planesWidget.unselectAll();
   
  }

  public void autoSave() {

    save("autoSave.cha");
  }

  void build(PApplet applet) {
    DRAW_TOOL_CURSOR = applet.loadImage("gui/GUI_DRAW_TOOL_CURSOR.png");
    SELECT_TOOL_CURSOR = applet.loadImage("gui/cursors/CURSOR_SELECT.png");
    ADD_DOLL_TOOL_CURSOR = applet
        .loadImage("gui/cursors/CURSOR_HAND_UP.png");
    MOVE_CAM_TOOL_CURSOR = applet
        .loadImage("gui/cursors/CURSOR_CAM_MOVE.png");
    ROTATE_CAM_TOOL_CURSOR = applet
        .loadImage("gui/cursors/CURSOR_CAM_ROTATE.png");
    ZOOM_CAM_TOOL_CURSOR = applet.loadImage("gui/cursors/CURSOR_CAM_ZOOM.png");
    LINE_TOOL_CURSOR = applet.loadImage("gui/GUI_LINE_TOOL_UP.png");
    SCALE_TOOL_CURSOR = applet.loadImage("gui/GUI_SCALE_TOOL_CURSOR.png");
    MEASURE_TOOL_CURSOR = applet
        .loadImage("gui/GUI_MEASURE_TOOL_CURSOR.png");
    MOVE_OBJECT_CURSOR = applet
        .loadImage("gui/cursors/CURSOR_HAND_UP.png");
    CURSOR_ADD_SLICE = applet
        .loadImage("gui/cursors/CURSOR_SLAT_ADD.png");
    this.SketchTools.build(GLOBAL.applet);
   
    CURSOR_EDIT_SLICE_POS = applet
        .loadImage("gui/cursors/CURSOR_SLAT_EDIT.png");
    this.SketchTools.build(GLOBAL.applet);
   
    CURSOR_EDIT_SLICE_SPACING = applet
        .loadImage("gui/cursors/CURSOR_SLAT_EDIT_SPACING.png");
    this.SketchTools.build(GLOBAL.applet);
   
    //GLOBAL.applet.cursor(UITools.SELECT_TOOL_CURSOR, 1,1);
    // buffer is created using applet dimensions
    //this.pickBuffer = applet.createGraphics(applet.width, applet.height,
    //  PConstants.P3D);
    //this.pickBuffer.ortho(-(applet.width / 2), (applet.width / 2),
    //-(applet.height / 2), (applet.height / 2), -1000, 10000);
  }

  public void camJumpFront(GUIEvent e) {
    GLOBAL.rotateModelsX = 0;
    GLOBAL.rotateModelsY = 0;

  }

  public void camJumpSide(GUIEvent e) {
    GLOBAL.rotateModelsX = 0;
    GLOBAL.rotateModelsY = (float) -(Math.PI / 2);

  }

  public void camJumpTop(GUIEvent e) {
    GLOBAL.rotateModelsX = (float) -(Math.PI / 2);
    GLOBAL.rotateModelsY = 0;

  }

  public void camJumpIso(GUIEvent e) {
    GLOBAL.rotateModelsX = (float) -(Math.PI / 8);
    GLOBAL.rotateModelsY = (float) -(Math.PI / 4);

    //g.rotateY(rotateRend);

  }

  public void captureScreen(GUIEvent e) {
    GLOBAL.captureScreen = true;

  }

  public void changeModeBasic(GUIEvent e) {
    SETTINGS.EXPERT_MODE = false;

    UI.setupGUITabsBasic(GLOBAL.applet, GLOBAL.gui);

    GLOBAL.modeChanged = true;
  }

  public void changeModeExpert(GUIEvent e) {
    SETTINGS.EXPERT_MODE = true;
    UI.setupGUITabsExpert(GLOBAL.applet, GLOBAL.gui);


    GLOBAL.modeChanged = true;
  }

  public void changeView(GUIEvent e) {

    this.toggleView(e);

    //  GLOBAL.sketchChairs.curChair.slicePlanesY.update();
    //GLOBAL.sketchChairs.curChair.addToShapePack();

    //  this.currentView = (int) e.val;

  }

  public void copyChair() {
    GLOBAL.copyOfChair = GLOBAL.sketchChairs.getCurChair().copy();
  }

  public void deleteAllChairsFlag(GUIEvent e) {
    GLOBAL.deleteAllChairsFlag = true;
  }

  public void deleteAllChairs(GUIEvent e) {
    //this.saveChairToFileAuto(null);
    //this.captureScreen(null);
    //GLOBAL.applet.draw();

    GLOBAL.sketchChairs.killAll();

  }

  public void deleteLastChair(GUIEvent e) {
    this.saveChairToFileAuto(null);
    this.captureScreen(null);
    GLOBAL.applet.draw();
    GLOBAL.sketchChairs.killLast();

  }

  public void flipChair(GUIEvent e) {
    if (GLOBAL.sketchChairs.getCurChair() != null)
      GLOBAL.sketchChairs.getCurChair().flipDesign();
  }

  /**
   * @return the currentTool
   */
  public int getCurrentTool() {
    return currentTool;
  }

  /**
   * @return the pickBuffer
   */
  public PGraphics getPickBuffer() {
    return pickBuffer;
  }

  public Vec2D getPointOnPlane(Vec2D mousePoint, Plane planeIn) {

    Plane plane = new Plane(planeIn.copy(), planeIn.normal.copy());

    Vec3D mouseRayPos = new Vec3D(mousePoint.x, mousePoint.y, planeIn.z); // this only works for planes perpendicular to the screen
    Vec3D mouseRayDir = new Vec3D(0, 0, -1);

    Vec3D focusCentre = new Vec3D(
        ((GLOBAL.windowWidth / 2) - (float)GLOBAL.CAM_OFFSET_X),
        ((GLOBAL.windowHeight / 2) - (float)GLOBAL.CAM_OFFSET_Y), 0);

    //now mouse pos is refereced from the centre of the screen
    mouseRayPos.x -= (GLOBAL.windowWidth / 2);
    mouseRayPos.y -= (GLOBAL.windowHeight / 2);
    mouseRayPos.scaleSelf((float) (1 / GLOBAL.getZOOM()));

    mouseRayPos.addSelf(focusCentre);

    Ray3D ray;

    Vec3D mousePos = null;
    Vec3D intersect;
    mouseRayDir = new Vec3D(0, 0, -1);

    plane.z = 0;
    //we need to rotate the plane so that it matches the one on the draw view
    plane.normal.rotateY(GLOBAL.rotateModelsY);
    plane.normal.rotateX(GLOBAL.rotateModelsX);

    plane.addSelf(plane.normal.scale(planeIn.z));
    //mouseRayDir.rotateY(GLOBAL.rotateModelsY);
    //mouseRayDir.rotateX(GLOBAL.rotateModelsX);

    mouseRayPos.subSelf(focusCentre);
    ray = new Ray3D(mouseRayPos, mouseRayDir); // this should be the world position of the mouse poiner on the 0,0,-1 plane

    intersect = plane.getIntersectionWithRay(ray);

    if (intersect == null) {
      ray = new Ray3D(mouseRayPos, mouseRayDir.invert());
      intersect = plane.getIntersectionWithRay(ray);
    }

    ray = new Ray3D(mouseRayPos, mouseRayDir);
    ray.addSelf(focusCentre);

    //if(this.mouseDown)
    //  GLOBAL.debugRay = ray;

    if (intersect != null) {

      //  System.out.println(plane.getProjectedPoint(intersect));
      //  intersect.z -= plane.z*2;
      //intersect.x += 70; 
      //  System.out.println("before rotate " +intersect);
      //  intersect.subSelf(focusCentre.scale(GLOBAL.getZOOM()));

      //   intersect.
      intersect.rotateX(-GLOBAL.rotateModelsX);
      intersect.rotateY(-GLOBAL.rotateModelsY);

      intersect.addSelf(focusCentre);

      //intersect.x += (GLOBAL.CAM_OFFSET_X*GLOBAL.getZOOM());
      //intersect.y += GLOBAL.CAM_OFFSET_Y;

      //intersect.rotateAroundAxis(axis, theta)
      mousePos = intersect;
      //mousePos.x += intersect.z;
      //System.out.println("after rotate " +intersect);
    }

    //get the chair matrix
    Matrix4f chairMatrix = new Matrix4f();
    Vec3D chairCentreOfMass = new Vec3D();
    if (GLOBAL.sketchChairs.getCurChair() != null
        && GLOBAL.sketchChairs.getCurChair().rigidBody != null) {
      Transform transform = new Transform();
      GLOBAL.sketchChairs.getCurChair().rigidBody
          .getWorldTransform(transform);
      transform.getMatrix(chairMatrix);
      chairCentreOfMass = GLOBAL.sketchChairs.getCurChair().centreOfMass;
    }

    if (GLOBAL.sketchChairs.getCurChair() != null
        && GLOBAL.sketchChairs.getCurChair().rigidBody != null
        && chairMatrix != null && mousePos != null) {
      float centreMouseDeltaX = mousePos.x
          - ((chairMatrix.m03) / GLOBAL.jBullet.scale);
      float centreMouseDeltaY = mousePos.y
          - ((chairMatrix.m13) / GLOBAL.jBullet.scale);
      float centreMouseDeltaZ = mousePos.z
          - ((chairMatrix.m23) / GLOBAL.jBullet.scale);
      centreMouseDeltaZ = 0;

      float newX = ((chairMatrix.m00) * centreMouseDeltaX)
          + ((chairMatrix.m01) * centreMouseDeltaY)
          + ((chairMatrix.m02) * centreMouseDeltaZ);
      float newY = (((chairMatrix.m10) * centreMouseDeltaX)
          + ((chairMatrix.m11) * centreMouseDeltaY) +
          ((chairMatrix.m12) * centreMouseDeltaZ));
      float newZ = ((chairMatrix.m20) * centreMouseDeltaX)
          + ((chairMatrix.m21) * centreMouseDeltaY)
          + ((chairMatrix.m22) * centreMouseDeltaZ);

      newY = newY * -1;

      mousePos.x = newX + ((chairCentreOfMass.x) / GLOBAL.jBullet.scale);
      mousePos.y = newY + ((chairCentreOfMass.y) / GLOBAL.jBullet.scale);
      //mousePos.z = centreMouseDeltaZ + chairCentreOfMass.Z;
    }

    Vec2D intersect2D = null;
    if (mousePos != null) {
      intersect2D = new Vec2D(mousePos.x, mousePos.y);
      //intersect2D = new Vec2D(mousePoint.x, mousePoint.y);

    } else {
      intersect2D = new Vec2D(mousePoint.x, mousePoint.y);
    }
    if (intersect2D == null)
      intersect2D = new Vec2D(mousePoint.x, mousePoint.y);

    return intersect2D;

  }

  public Vec2D getPointOnPlaneOld(Vec2D mousePoint, Plane planeIn) {
    //get the chair matrix
    Matrix4f chairMatrix = new Matrix4f();
    Vec3D chairCentreOfMass = new Vec3D();
    if (GLOBAL.sketchChairs.getCurChair() != null
        && GLOBAL.sketchChairs.getCurChair().rigidBody != null) {
      Transform transform = new Transform();
      GLOBAL.sketchChairs.getCurChair().rigidBody
          .getWorldTransform(transform);
      transform.getMatrix(chairMatrix);
      chairCentreOfMass = GLOBAL.sketchChairs.getCurChair().centreOfMass;
    }

    Plane plane = new Plane(planeIn.copy(), planeIn.normal.copy());

    Vec3D mouseRayPos = new Vec3D(mousePoint.x, mousePoint.y, plane.z); // this only works for planes perpendicular to the screen
    Vec3D mouseRayDir = new Vec3D(0, 0, -1);

    Vec3D focusCentre = new Vec3D(
        ((GLOBAL.windowWidth / 2) - (float)GLOBAL.CAM_OFFSET_X),
        ((GLOBAL.windowHeight / 2) - (float)GLOBAL.CAM_OFFSET_Y), 0);

    //now mouse pos is refereced from the centre of the screen
    mouseRayPos.x -= (GLOBAL.windowWidth / 2);
    mouseRayPos.y -= (GLOBAL.windowHeight / 2);
    mouseRayPos.scaleSelf((float) (1 / GLOBAL.getZOOM()));

    //mouseRayPos.addSelf(-screenCentre.x,-screenCentre.y, 0);
    mouseRayPos.rotateX((GLOBAL.rotateModelsX));
    mouseRayPos.rotateY((GLOBAL.rotateModelsY));

    mouseRayPos.addSelf(focusCentre);

    mouseRayDir.x = mouseRayDir.x - mouseRayPos.x;
    mouseRayDir.y = mouseRayDir.y - mouseRayPos.y;
    mouseRayDir.z = mouseRayDir.z - mouseRayPos.z;

    mouseRayDir.rotateX((GLOBAL.rotateModelsX));
    mouseRayDir.rotateY((GLOBAL.rotateModelsY));

    Ray3D ray = new Ray3D(mouseRayPos, mouseRayDir);

    Vec3D mousePos = null;

    if (GLOBAL.rotateModelsX == 0 && GLOBAL.rotateModelsY == 0
        && plane.normal.x == 0 && plane.normal.y == 0)
      mousePos = new Vec3D(ray.x, ray.y, ray.z);

    //put these back in for 3d
    //  if(mousePos == null) 
    //    mousePos = plane.getIntersectionWithRay(ray);

    if (mousePos == null) {

      mouseRayDir = new Vec3D(0, 0, 1);
      mouseRayDir.x = mouseRayDir.x - mouseRayPos.x;
      mouseRayDir.y = mouseRayDir.y - mouseRayPos.y;
      mouseRayDir.z = mouseRayDir.z - mouseRayPos.z;

      mouseRayDir.rotateX((GLOBAL.rotateModelsX));
      mouseRayDir.rotateY((GLOBAL.rotateModelsY));

      ray = new Ray3D(mouseRayPos, mouseRayDir);
      plane.normal.z *= -1;
      //put these back in for 3d
      //  mousePos = plane.getIntersectionWithRay(ray);
    }

    if (GLOBAL.sketchChairs.getCurChair() != null
        && GLOBAL.sketchChairs.getCurChair().rigidBody != null
        && chairMatrix != null && mousePos != null) {
      float centreMouseDeltaX = mousePos.x
          - ((chairMatrix.m03) / GLOBAL.jBullet.scale);
      float centreMouseDeltaY = mousePos.y
          - ((chairMatrix.m13) / GLOBAL.jBullet.scale);
      float centreMouseDeltaZ = mousePos.z
          - ((chairMatrix.m23) / GLOBAL.jBullet.scale);
      centreMouseDeltaZ = 0;

      float newX = ((chairMatrix.m00) * centreMouseDeltaX)
          + ((chairMatrix.m01) * centreMouseDeltaY)
          + ((chairMatrix.m02) * centreMouseDeltaZ);
      float newY = (((chairMatrix.m10) * centreMouseDeltaX)
          + ((chairMatrix.m11) * centreMouseDeltaY) + ((chairMatrix.m12) * centreMouseDeltaZ));
      float newZ = ((chairMatrix.m20) * centreMouseDeltaX)
          + ((chairMatrix.m21) * centreMouseDeltaY)
          + ((chairMatrix.m22) * centreMouseDeltaZ);

      newY = newY * -1;

      mousePos.x = newX + ((chairCentreOfMass.x) / GLOBAL.jBullet.scale);
      mousePos.y = newY + ((chairCentreOfMass.y) / GLOBAL.jBullet.scale);
      //mousePos.z = centreMouseDeltaZ + chairCentreOfMass.Z;
    }

    Vec2D intersect2D = null;
    if (mousePos != null) {
      intersect2D = new Vec2D(mousePos.x, mousePos.y);
      //intersect2D = new Vec2D(mousePoint.x, mousePoint.y);

    } else {
      intersect2D = new Vec2D(mousePoint.x, mousePoint.y);
    }
    if (intersect2D == null)
      intersect2D = new Vec2D(mousePoint.x, mousePoint.y);

    return intersect2D;

  }

  public Vec2D getPointTranslated(Vec2D mousePoint) {

    Vec2D mouseRayPos = new Vec2D(mousePoint.x, mousePoint.y); // this only works for planes perpendicular to the screen

    Vec2D focusCentre = new Vec2D(
        ((GLOBAL.windowWidth / 2) - (float)GLOBAL.CAM_OFFSET_X),
        ((GLOBAL.windowHeight / 2) - (float)GLOBAL.CAM_OFFSET_Y));

    mouseRayPos.x -= (GLOBAL.windowWidth / 2);
    mouseRayPos.y -= (GLOBAL.windowHeight / 2);
    mouseRayPos.scaleSelf((float) (1 / GLOBAL.getZOOM()));

    mouseRayPos.addSelf(focusCentre);
    return mouseRayPos;

  }

  Vec2D getPointTranslatedFromWorld(Vec2D mousePoint) {

    Vec2D mouseRayPos = new Vec2D(mousePoint.x, mousePoint.y); // this only works for planes perpendicular to the screen

    Vec2D focusCentre = new Vec2D(
        ((GLOBAL.windowWidth / 2) - (float)GLOBAL.CAM_OFFSET_X),
        ((GLOBAL.windowHeight / 2) - (float)GLOBAL.CAM_OFFSET_Y));

    mouseRayPos.subSelf(focusCentre);

    mouseRayPos.scaleSelf((float) GLOBAL.getZOOM());

    mouseRayPos.x += (GLOBAL.windowWidth / 2);
    mouseRayPos.y += (GLOBAL.windowHeight / 2);

    return mouseRayPos;

  }

  public void gotoWebsite(GUIEvent e) {
    /*
    String url = "http://www.sketchChair.com";
    try {
      // not compatible in JRE 1.5
      //java.awt.Desktop.getDesktop().browse(java.net.URI.create(url));
    } catch (IOException e2) {
      // TODO Auto-generated catch block
      e2.printStackTrace();
    }
    */

  }

  public void hybernateChairToFileAuto(GUIEvent e) {

    if (GLOBAL.sketchChairs.getCurChair() != null)
      GLOBAL.sketchChairs.getCurChair().addToShapePack();

    String computername = functions.getComputerName();
    String currentDir = new File(".").getAbsolutePath();
    currentDir = currentDir.substring(0, currentDir.length() - 1);

    int id = 0;
    boolean nameFound = false;
    String location = "";

    while (!nameFound && id < 10000) {
      location = currentDir + "savedChairs\\hybernate\\" + computername
          + "_chair-" + id + ".cha";
      File f = new File(location);

      if (!f.exists())
        nameFound = true;

      id++;
    }

    save(location);
    //System.out.println("saving to " + location);
    SETTINGS.chairSaveNum = id;
    GLOBAL.LAST_SAVED_LOCATION = location;

  }

  /**
   * @return the editing
   */
  public int isEditing() {
    return editing;
  }

  boolean isEditingTool(int TOOL) {

    if (TOOL == DRAW_TOOL || TOOL == SELECT_TOOL || TOOL == LEG_TOOL
        || TOOL == SELECT_BEZIER_TOOL || TOOL == DRAW_PATH_TOOL
        || TOOL == SCALE_TOOL || TOOL == MOVE_2D_TOOL)
      return true;
    else
      return false;

  }

  public void runAutomatedActions(GUIEvent e) {

    GLOBAL.skchAutomatic.start();

  }

  public void loadTemplateChair(GUIEvent e) {

    //if(GLOBAL.widgetLoad  == null){
    GLOBAL.widgetLoad = new WidgetLoad();
    GLOBAL.widgetLoad.setupGUI(GLOBAL.applet, GLOBAL.gui);
    //  }
    GLOBAL.widgetLoad.show();
  }

  public void mouseDown() {

   
    if (GLOBAL.gui.overComponent())
      GLOBAL.planesWidget.mousePressed(mouseX, mouseY);
   
    //let the gui handle any mouse down events
    if (GLOBAL.gui.overComponent() && GLOBAL.gui.hasFocus())
    return;
   
 
//Jump to front if we're in?
   
      if (mouseButton == UITools.MOUSE_LEFT
          && isEditingTool(this.getCurrentTool()))
        this.camJumpFront(null);
     
     
     

      for (Clickable obj : this.clickables) {
        obj.mousePressed();
      }

     
     
     
     
     
     
      //model manip!
      if (this.getCurrentTool() == UITools.MOVE_OBJECT
          || this.SketchTools.getCurrentTool() == SketchTools.LEG_TOOL
          || this.SketchTools.getCurrentTool() == SketchTools.DRAW_TOOL
          || this.SketchTools.getCurrentTool() == SketchTools.SELECT_TOOL
          && !GLOBAL.gui.overComponent()
          && !GLOBAL.sketchChairs.getCurChair().overSelectPoint(
              GLOBAL.uiTools.mouseX, GLOBAL.uiTools.mouseY)) {
        Vec2D mousePos = this.getPointTranslated(new Vec2D(this.mouseX,
            this.mouseY));
        GLOBAL.jBullet.mouseDragged(mousePos.x, mousePos.y);
      }

      if ((GLOBAL.uiTools.getCurrentTool() == UITools.SCALE_TOOL)
          && !GLOBAL.gui.overComponent()) {
        //GLOBAL.person.dragScale(mouseX,mouseX); 
      }

      // middle click
      if (mouseButton == UITools.MOUSE_RIGHT
          || this.getCurrentTool() == UITools.MOVE_CAM_TOOL) {

        if (SETTINGS.render_chairs
            && GLOBAL.uiTools.currentView == UITools.VIEW_CHAIR_EDIT) {
         
          if(this.prevMouseWasMove){
           
          moveView((UI.mouseX - UI.pmouseX)
              * (float)(1 / GLOBAL.ZOOM),
              (UI.mouseY - UI.pmouseY)
              * (float)(1 / GLOBAL.ZOOM));     
          }else{
            this.prevMouseWasMove = true;
          }
         
         
          }

       
       
        if (GLOBAL.uiTools.currentView == UITools.VIEW_SHAPE_PACK) {
          GLOBAL.shapePack.CAM_OFFSET_X += (UI.mouseX - UI.pmouseX)
              * (1 / GLOBAL.shapePack.ZOOM);
          GLOBAL.shapePack.CAM_OFFSET_Y += (UI.mouseY - UI.pmouseY)
              * (1 / GLOBAL.shapePack.ZOOM);

        }
       
       
       
      }

      if (!GLOBAL.gui.overComponent()) {
        if (this.getCurrentTool() == UITools.ZOOM_CAM_TOOL) {

          if (SETTINGS.render_chairs
              && GLOBAL.uiTools.currentView == UITools.VIEW_CHAIR_EDIT){
           
            this.zoomView(((UI.mouseY - UI.pmouseY) * .01f));
           
           
          }

          if (SETTINGS.render_chairs
              && GLOBAL.uiTools.currentView == UITools.VIEW_SHAPE_PACK) {
            GLOBAL.shapePack.zoomView((UI.mouseY - UI.pmouseY) * .01f, this.mouseX, this.mouseY) ;

          }

        }

        if (this.getCurrentTool() == UITools.ROTATE_CAM_TOOL
            || mouseButton == UITools.MOUSE_MIDDLE) {
          if (SETTINGS.render_chairs
              && GLOBAL.uiTools.currentView == UITools.VIEW_CHAIR_EDIT) {
            GLOBAL.rotateModelsY -= (UI.pmouseX - UI.mouseX) / 90f;
            GLOBAL.rotateModelsX += (UI.pmouseY - UI.mouseY) / 90f;
          }
        }

        if (this.getCurrentTool() == UITools.SELECT_TOOL
            && GLOBAL.uiTools.currentView == UITools.VIEW_CHAIR_EDIT) {
          updateVecMove();
        }

      }

      if (this.getCurrentTool() != UITools.ROTATE_CAM_TOOL && GLOBAL.uiTools.currentView == UITools.VIEW_CHAIR_EDIT)
        GLOBAL.person.mouseDown(mouseX, mouseY);

      Vec2D mousePos = this.getPointTranslated(new Vec2D(this.mouseX,
          this.mouseY));

      GLOBAL.measuretTool.mousePressed(mousePos.x, mousePos.y);

   

  }

  public void mouseDragged() {
   
   
 
   
   
    if (!GLOBAL.gui.overComponent() && !GLOBAL.gui.hasFocus() && !GLOBAL.gui.clickStartedOn()&& GLOBAL.uiTools.currentView == UITools.VIEW_CHAIR_EDIT) {

      for (Clickable obj : this.clickables) {
        obj.mouseDragged();
      }
     
     
     
      GLOBAL.sketchChairs.mouseDragged(mouseX, mouseY);

      Vec2D MousePos = this.getPointTranslated(new Vec2D(this.mouseX,this.mouseY));

      GLOBAL.environments.mouseDragged(MousePos.x, MousePos.y);
    }

    if (GLOBAL.gui.overComponent())
      GLOBAL.planesWidget.mouseDragged(mouseX, mouseY);

  }

  void mousePressed() {


    //see if this is a fast press
    this.mousePressedTime = GLOBAL.applet.millis();

    if (!GLOBAL.gui.overComponent() && !SETTINGS.EXPERT_MODE
        && GLOBAL.uiTools.currentView == GLOBAL.uiTools.VIEW_SHAPE_PACK)
      this.toggleView(null);
   

    //unselect auto rotate
    if (GLOBAL.autoRotate && !GLOBAL.gui.overComponent()) {
      GLOBAL.autoRotate = false;
      GLOBAL.rotateModelsY = 0;

    }

   
    //NOT OVER GUI
    //IF a press starts over GUI and drags outside it's included as still over GUI
    if (!GLOBAL.gui.overComponent() && !GLOBAL.gui.hasFocus() && !GLOBAL.gui.clickStartedOn()&& GLOBAL.uiTools.currentView == UITools.VIEW_CHAIR_EDIT) {
      GLOBAL.undo.addChair(GLOBAL.sketchChairs.getCurChair().copy());

      for (Clickable obj : this.clickables) {
        obj.mouseClicked();
      }

      Vec2D MousePosPerson = this.getPointTranslated(new Vec2D(
          this.mouseX, this.mouseY));
      GLOBAL.person.mouseClicked(MousePosPerson.x, MousePosPerson.y);

      if (this.getCurrentTool() == UITools.SCALE_TOOL
          && GLOBAL.sketchChairs.getCurChair() != null) {
        GLOBAL.sketchChairs.getCurChair().mousePressed(
            MousePosPerson.x, MousePosPerson.y);
      }

      if (this.getCurrentTool() == UITools.MOVE_2D_TOOL
          && GLOBAL.sketchChairs.getCurChair() != null) {
        GLOBAL.sketchChairs.getCurChair().mousePressed(
            MousePosPerson.x, MousePosPerson.y);
      }

      if (this.getCurrentTool() == UITools.SELECT_TOOL
          || this.SketchTools.getCurrentTool() == SketchTools.SELECT_BEZIER_TOOL
          && !GLOBAL.person.clickedOnPerson) {
        //getVecOver();
        if (GLOBAL.sketchChairs.getCurChair() != null) {
          GLOBAL.sketchChairs.getCurChair().mousePressed(
              MousePosPerson.x, MousePosPerson.y);
        }
      }

      if (this.getCurrentTool() == UITools.MOVE_OBJECT
          || GLOBAL.person.clickedOnPerson) {
        Vec2D mousePos = this.getPointTranslated(new Vec2D(this.mouseX,
            this.mouseY));
        GLOBAL.jBullet.mouseDown(mousePos.x, mousePos.y);
      }

      if (this.SketchTools.getCurrentTool() == SketchTools.SELECT_TOOL
          && GLOBAL.sketchChairs.getCurChair() != null
          && GLOBAL.sketchChairs.getCurChair().countSelectedNodes() <= 0) {
        Vec2D mousePos = this.getPointTranslated(new Vec2D(this.mouseX,
            this.mouseY));

        if (GLOBAL.jBullet.physics_on)
          GLOBAL.jBullet.mouseDown(mousePos.x, mousePos.y);
      }

      if (this.getCurrentTool() == UITools.SELECT_TOOL
          && GLOBAL.sketchChairs.getCurChair() == null) {
        Vec2D mousePos = this.getPointTranslated(new Vec2D(this.mouseX,
            this.mouseY));
        GLOBAL.jBullet.mouseDown(mousePos.x, mousePos.y);
      }

      if (this.getCurrentTool() == UITools.ADD_DOLL_TOOL) {
        /*new SittingDoll(GLOBAL.jBullet.myWorld, new Vector3f(
            GLOBAL.applet.mouseX, GLOBAL.applet.mouseY, 0), 1);
        selectedVec = null;
        selectedVecPlane = null;
        */
      }

      Vec2D MousePos = this.getPointTranslated(new Vec2D(this.mouseX,
          this.mouseY));

      if (!GLOBAL.sketchChairs.getCurChair().mouseOver(MousePos.x,
          MousePos.y))
        GLOBAL.environments.mousePressed(MousePos.x, MousePos.y);

      GLOBAL.sketchChairs.mousePressed(this.mouseX, this.mouseY);

      //  if(  this.currentView == UITools.VIEW_SHAPE_PACK && this.mouseButton  == this.MOUSE_LEFT)
      //    this.changeView(null);

    }

    if (GLOBAL.gui.overComponent())
      GLOBAL.planesWidget.mouseClicked(mouseX, mouseY);
   
   
    //GLOBAL.undo.setMouseUpChair(GLOBAL.sketchChairs.getCurChair().copy());
    //if(GLOBAL.undo.getMouseUpChair() != null)GLOBAL.undo.getMouseUpChair().build();
   

  }

  void mouseReleased() {
   
   
    if(GLOBAL.uiTools.currentView != UITools.VIEW_CHAIR_EDIT)
      return;
   
    //
    this.prevMouseWasMove = false;
   
   
    if(!waitingForSingleClick && GLOBAL.applet.millis() - this.mousePressedTime < SETTINGS.MOUSE_PRESSED_MIN_TIME)
    this.waitingForSingleClick = true;
    else
      waitingForSingleClick = false;
   
    this.mouseSingleClickTime = GLOBAL.applet.millis();
    /*
    //see if this is a fast press
    if (GLOBAL.applet.millis() - this.mousePressedTime < SETTINGS.MOUSE_CLICKED_MIN_TIME) {

      if (GLOBAL.applet.millis() - this.mouseSingleClickTime < SETTINGS.MOUSE_CLICKED_MIN_TIME*2)
        this.mouseDoubleClick();
      else
        this.mouseSingleClick();

      this.mouseSingleClickTime = GLOBAL.applet.millis();
    */

    if (GLOBAL.resetting)
      return;

    GLOBAL.person.mouseReleased(mouseX, mouseY);

    GLOBAL.measuretTool.mouseReleased(mouseX, mouseY);

    if (this.getCurrentTool() == UITools.ROTATE_CAM_TOOL
        && !SETTINGS.EXPERT_MODE)
      this.camJumpFront(null);

    if (SETTINGS.EXPERT_MODE && GLOBAL.gui.overComponent())
      GLOBAL.planesWidget.mouseReleased(mouseX, mouseY);

    if (!GLOBAL.gui.overComponent())
      GLOBAL.sketchChairs.mouseReleased(mouseX, mouseY);

    if (!GLOBAL.gui.overComponent())
      GLOBAL.environments.mouseReleased(mouseX, mouseY);

   

    if (!GLOBAL.gui.overComponent()) {
     
     
     
     
      for (Clickable obj : this.clickables) {
      //  obj.mouseReleased();
      }
     
     
    }

    if (selectedVec != null && selectedVecPlane != null) {
      GLOBAL.sketchChairs.getCurChair().selectedPlanes
          .buildCurrentSketch();
      selectedVecPlane.getSketch().buildOutline();
      selectedVecPlane.getSketch().getSketchShapes().sketchOutlines
          .optimize();
      selectedVec = null;
      this.selectedVecPlane.getSketch().getSketchShapes().renderShapes = false;
      this.selectedShape.offset();
    }

    if (GLOBAL.sketchChairs.getCurChair() != null) {
      //  GLOBAL.sketchChairs.curChair.updateCollisionShape();
    }

    if (!SETTINGS.EXPERT_MODE) {
      GLOBAL.rotateModelsX = 0;
      GLOBAL.rotateModelsY = 0;
      //BASIC MODE EXHIBITION MODE
      if (this.SketchTools.getCurrentTool() != SketchTools.LEG_TOOL)
        GLOBAL.sketchChairs.getCurChair().selectedPlanes
            .add(GLOBAL.sketchChairs.getCurChair()
                .getSlicePlanesY());
    }

    //rebuild cross selections widget every click
    if (SETTINGS.EXPERT_MODE)
      GLOBAL.slicesWidget
          .rebuild(GLOBAL.sketchChairs.getCurChair().crossSliceSelections);

   
    GLOBAL.undo.setMouseUpChair(GLOBAL.sketchChairs.getCurChair());


   
  }

  void mouseSingleClick() {


    if(GLOBAL.uiTools.currentView != UITools.VIEW_CHAIR_EDIT)
      return;
   

    //Select planes with the select tool
    if ((!GLOBAL.gui.overComponent() &&
        this.SketchTools.getCurrentTool() == SketchTools.SELECT_TOOL)
        || GLOBAL.previewWidget.isMouseOver()) {
     
     
      if(GLOBAL.uiTools.isSideView() && !GLOBAL.previewWidget.isMouseOver()){
        GLOBAL.planesWidget.selectAllPlanes(null);
        GLOBAL.gui.reRender();
      return
      }
     

      Object obj = PickBuffer.getInstance().getObject(mouseX, mouseY);
      if (obj instanceof SlicePlane) {
        SlicePlane splane = (SlicePlane) obj;

       
        if (splane.getCrossSliceSelection() == null) {
          GLOBAL.planesWidget.planeClickedOn(splane);
        } else {
          if (GLOBAL.designToolbarAdvanced != null)
            GLOBAL.designToolbarAdvanced.selectTab("slices");

          GLOBAL.slicesWidget.selectSlice(splane
              .getCrossSliceSelection());

        }
       
        GLOBAL.previewWidget.rebuildPatternPreview();
      } else {
        if(!GLOBAL.previewWidget.isMouseOver()){
        GLOBAL.slicesWidget.unselectAll();
        GLOBAL.planesWidget.unselectAll();
        }
      }
    }
   
   
    //IF no planes are selected we can select one with the slat tools
   
    if((this.getCurrentTool() == UITools.SLICES_GROUP_SLICES ||
        this.getCurrentTool() == UITools.SLICES_SINGLE_SLAT ||
        this.getCurrentTool() == UITools.SLICES_SINGLE_SLICE ||
        this.getCurrentTool() == UITools.SLICES_SLATSLICE_GROUP) &&
        (GLOBAL.sketchChairs.getCurChair() != null &&
        GLOBAL.sketchChairs.getCurChair().selectedPlanes.size() == 0)
        ){
      Object obj = PickBuffer.getInstance().getObject(mouseX, mouseY);
      if (obj instanceof SlicePlane) {
        SlicePlane splane = (SlicePlane) obj;

       
        if (splane.getCrossSliceSelection() == null) {
          GLOBAL.planesWidget.planeClickedOn(splane);
         
        }
     
    }
    }
   
    GLOBAL.undo.setMouseUpChair(GLOBAL.sketchChairs.getCurChair());
   
    //LOGGER.debug("mouseSingleClick()"+GLOBAL.sketchChairs.getCurChair().selectedPlanes.size());
    GLOBAL.gui.reRender();

  }

  void mouseDoubleClick() {
   
    if (!GLOBAL.gui.overComponent())
      GLOBAL.sketchChairs.mouseDoubleClick(mouseX, mouseY);
   
    GLOBAL.undo.setMouseUpChair(GLOBAL.sketchChairs.getCurChair());

  }

  public void newChair(GUIEvent e) {
    this.hybernateChairToFileAuto(e);
  }

  public void openChairFromFile(GUIEvent e) {
 
      GLOBAL.applet.selectInput("select design file.", "openChairFromFileCallback", null, this);
           
  }
 
 
  public void openChairFromFileCallback(File file) {

     GLOBAL.loadChairLocation = file.getAbsolutePath();

  }
 

  public void openChairFromFileAuto(GUIEvent e) {
    // in response to a button click:

    if (GLOBAL.sketchChairs.getCurChair() != null)
      GLOBAL.sketchChairs.killAll();

    String computername = functions.getComputerName();
    String currentDir = new File(".").getAbsolutePath();
    currentDir = currentDir.substring(0, currentDir.length() - 1);

    int id = SETTINGS.chairSaveNum;
    boolean nameFound = false;
    String location = null;

    while (!nameFound && id >= 0) {
      location = currentDir + "savedChairs\\" + computername + "_chair-"
          + id + ".cha";
      File f = new File(location);

      if (f.exists()) {
        nameFound = true;

      } else {
        id--;
      }

    }

    LOGGER.info("Loading chair from: " + location);

    SETTINGS.chairSaveNum = (id - 1);
    if (location != null)
      load(location);
    else
      SETTINGS.chairSaveNum = 2000;
  }

  public void openEnvironmentFromFile(GUIEvent e) {
    GLOBAL.environments.openEnvironmentFromFile(e);
  }

  public void pasteChair() {
    LOGGER.info("paste");

    if (GLOBAL.copyOfChair != null) {
      GLOBAL.sketchChairs.killAll();
      GLOBAL.sketchChairs.add(GLOBAL.copyOfChair);
      GLOBAL.sketchChairs.getCurChair().build();
    }

  }

  public void physicsPause(GUIEvent e) {
    GLOBAL.jBullet.physics_on = !GLOBAL.jBullet.physics_on;
  }

  public void physicsPlay(GUIEvent e) {
    GLOBAL.jBullet.physics_on = !GLOBAL.jBullet.physics_on;
  }
 
  public void physicsPlayPause(GUIEvent e) {

    if (!GLOBAL.jBullet.physics_on) {
      GLOBAL.jBullet.physics_on = true;
    } else {
      GLOBAL.jBullet.physics_on = false;
   
    }
    }

  public void physicsRewind(GUIEvent e) {
    GLOBAL.jBullet.resetCollisons();
    GLOBAL.jBullet.physics_on = false;
    GLOBAL.person.resetPhysics();
   
    if(GLOBAL.sketchChairs.getCurChair() != null)
    GLOBAL.sketchChairs.getCurChair().resetPhysics();
  }

  public void print(GUIEvent e) {
    LOGGER.info("PRINT");

    if (GLOBAL.sketchChairs.getCurChair() != null) {
      //GLOBAL.shapePack.empty();
      //GLOBAL.sketchChairs.getCurChair().addToShapePack();
      //GLOBAL.shapePack.build();

      String currentDir = new File(".").getAbsolutePath();
      currentDir = currentDir.substring(0, currentDir.length() - 1);

      int id = 0;
      boolean nameFound = false;
      String location = "";
      location = currentDir + "print.pdf";

      GLOBAL.pdfSaveLocation = location;
      GLOBAL.savePDF = true;
      GLOBAL.autoOpenPDF = true;
    }
  }

  void printOpen(String fileLoc) {
    // not compatible in JRE 1.5
   
           Desktop desktop = null;
           // Before more Desktop API is used, first check
           // whether the API is supported by this particular
           // virtual machine (VM) on this particular host.
           if (Desktop.isDesktopSupported()) {
               desktop = Desktop.getDesktop();
               File file = new File(fileLoc);
               try {
            desktop.open(file);
          } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
           }
   

  }

  public void redo(GUIEvent e) {
    //  GLOBAL.undo.undo();

  }

 

 
 
  public void removeSelectedPlanes(GUIEvent e) {
    if (GLOBAL.sketchChairs.getCurChair() != null)
      GLOBAL.sketchChairs.getCurChair().removeSelectedPlanes();
  }

  void render(PGraphics g) {

    if(GLOBAL.gui.overComponent()){
      ModalGUI.setCursor(GLOBAL.applet,SELECT_TOOL_CURSOR,15,9);
      return;
    }
   
   
   
    //are we rotating? maybe we should set a flag for this instead of testing the buttons?
    if(this.mouseDown && this.mouseButton == UITools.MOUSE_MIDDLE){
      ModalGUI.setCursor(GLOBAL.applet,ROTATE_CAM_TOOL_CURSOR,17,16);
      this.hasCursorControl = true;

      return;
    }
   
   
    if(this.mouseDown && this.mouseButton == UITools.MOUSE_RIGHT){
      ModalGUI.setCursor(GLOBAL.applet,MOVE_CAM_TOOL_CURSOR,16,16);
      this.hasCursorControl = true;

      return;
    }
   
   

    g.fill(255);
    g.ellipseMode(PApplet.CENTER);

    Vec2D physicsMousePos = this.getPointTranslated(new Vec2D(this.mouseX,
        this.mouseY));

    //
    if ((this.SketchTools.getCurrentTool() == SketchTools.SELECT_TOOL
        || this.SketchTools.getCurrentTool() == SketchTools.DRAW_TOOL)
        && GLOBAL.person.mouseOver(physicsMousePos.x, physicsMousePos.y)) {
      ModalGUI.setCursor(GLOBAL.applet,MOVE_OBJECT_CURSOR, 16,16);
      return;
    }

    if (this.SketchTools.getCurrentTool() == SketchTools.SELECT_TOOL) {
     
     
     
      if (GLOBAL.sketchChairs.getCurChair() != null) {

        if (!GLOBAL.sketchChairs.getCurChair().overSelectPoint(mouseX,
            mouseY)
            && GLOBAL.sketchChairs.getCurChair().mouseOver(
                physicsMousePos.x, physicsMousePos.y)) {
         
          ModalGUI.setCursor(GLOBAL.applet,MOVE_OBJECT_CURSOR, 16,16);

          this.hasCursorControl = true;
          return;

        }

       

      }
     
    }
   
   
    if (this.getCurrentTool() == UITools.MOVE_CAM_TOOL) {
     
     
      ModalGUI.setCursor(GLOBAL.applet,MOVE_CAM_TOOL_CURSOR,16,16);

     
      this.hasCursorControl = true;
      return;
    } else if (this.getCurrentTool() == UITools.ROTATE_CAM_TOOL) {
      ModalGUI.setCursor(GLOBAL.applet,ROTATE_CAM_TOOL_CURSOR,16,16);
      this.hasCursorControl = true;
      return;
    } else if (this.getCurrentTool() == UITools.ZOOM_CAM_TOOL) {
      ModalGUI.setCursor(GLOBAL.applet,ZOOM_CAM_TOOL_CURSOR,15,14);
      this.hasCursorControl = true;
      return;
    } else if (this.getCurrentTool() == UITools.SLICES_GROUP_SLICES ||
        this.getCurrentTool() == UITools.SLICES_SINGLE_SLAT ||
        this.getCurrentTool() == UITools.SLICES_SINGLE_SLICE ||
        this.getCurrentTool() == UITools.SLICES_SLATSLICE_GROUP ||
            this.getCurrentTool() == UITools.SLICES_EDIT) {
     
     
      if(sliceToolMode ==  UITools.SLICE_EDIT_MODE_ADD){
        ModalGUI.setCursor(GLOBAL.applet,CURSOR_ADD_SLICE,5,7);
      this.hasCursorControl = true;
      return;
      }
     
      if(sliceToolMode ==  UITools.SLICE_EDIT_MODE_POS){
        ModalGUI.setCursor(GLOBAL.applet,CURSOR_EDIT_SLICE_POS,5,7);
        this.hasCursorControl = true;
        return;
        }
     
      if(sliceToolMode ==  UITools.SLICE_EDIT_MODE_SPACING){
        ModalGUI.setCursor(GLOBAL.applet,CURSOR_EDIT_SLICE_SPACING,5,7);
        this.hasCursorControl = true;
        return;
        }
     
     
    }
    //CURSOR_EDIT_SLICE_POS
   
   

    this.hasCursorControl = false;
    this.SketchTools.render(g);
 
    /*
    if (!GLOBAL.gui.overComponent() || this.selectCooldown > 0) {

      if (this.getCurrentTool() == DRAW_TOOL) {

        g.noFill();
        g.stroke(100, 100, 100);
        //LOGGER.info("SET CURSOR D");

        if(this.loadedCursor != DRAW_TOOL){
        GLOBAL.applet.cursor(UITools.DRAW_TOOL_CURSOR, 1,1);
        this.loadedCursor = DRAW_TOOL;
        }
        return;
        } else if (this.getCurrentTool() == LEG_TOOL) {
       
        if(this.loadedCursor != DRAW_TOOL){
          GLOBAL.applet.cursor(UITools.DRAW_TOOL_CURSOR, 1,1);
        this.loadedCursor = DRAW_TOOL;
        }

      } else if (this.getCurrentTool() == SELECT_TOOL) {
       
        if(this.loadedCursor != SELECT_TOOL){
        GLOBAL.applet.cursor(UITools.SELECT_TOOL_CURSOR, 1,1);
        this.loadedCursor = SELECT_TOOL;
        }
       
        //g.image(UITools.SELECT_TOOL_CURSOR, mouseX - 10, mouseY - 8);
      } else if (this.getCurrentTool() == ADD_DOLL_TOOL) {
        if(this.loadedCursor != ADD_DOLL_TOOL){
        GLOBAL.applet.cursor(ADD_DOLL_TOOL_CURSOR, 1,1);
        this.loadedCursor = ADD_DOLL_TOOL;
        }
      } else if (this.getCurrentTool() == UITools.MOVE_CAM_TOOL) {
        if(this.loadedCursor != MOVE_CAM_TOOL){
        GLOBAL.applet.cursor(MOVE_CAM_TOOL_CURSOR, 1,1);
        this.loadedCursor = MOVE_CAM_TOOL;
        }
      } else if (this.getCurrentTool() == UITools.ROTATE_CAM_TOOL) {
        if(this.loadedCursor != ROTATE_CAM_TOOL){
          GLOBAL.applet.cursor(ROTATE_CAM_TOOL_CURSOR, 1,1);
        this.loadedCursor = ROTATE_CAM_TOOL;
        }
      } else if (this.getCurrentTool() == UITools.ZOOM_CAM_TOOL) {
        if(this.loadedCursor != ZOOM_CAM_TOOL){
          GLOBAL.applet.cursor(ZOOM_CAM_TOOL_CURSOR, 1,1);
        this.loadedCursor = ZOOM_CAM_TOOL;
        }
      } else if (this.getCurrentTool() == UITools.LEG_TOOL) {
        if(this.loadedCursor != LEG_TOOL){
          GLOBAL.applet.cursor(LINE_TOOL_CURSOR, 1,1);
        this.loadedCursor = LEG_TOOL;
        }
      } else if (this.getCurrentTool() == UITools.SCALE_PERSON_TOOL) {
        if(this.loadedCursor != SCALE_PERSON_TOOL){
        GLOBAL.applet.cursor(ADD_DOLL_TOOL_CURSOR, 1,1);
        this.loadedCursor = SCALE_PERSON_TOOL;
        }
      } else if (this.getCurrentTool() == UITools.MOVE_OBJECT) {
        if(this.loadedCursor != MOVE_OBJECT){
          GLOBAL.applet.cursor(ADD_DOLL_TOOL_CURSOR, 1,1);
        this.loadedCursor = MOVE_OBJECT;
        }
      } else if (this.getCurrentTool() == UITools.SCALE_TOOL) {
        if(this.loadedCursor != SCALE_TOOL){
          GLOBAL.applet.cursor(SCALE_TOOL_CURSOR, 1,1);
        this.loadedCursor = SCALE_TOOL;
        }
      } else if (this.getCurrentTool() == UITools.MEASURE_TOOL) {
        if(this.loadedCursor != MEASURE_TOOL){
          GLOBAL.applet.cursor(MEASURE_TOOL_CURSOR, 1,1);
        this.loadedCursor = MEASURE_TOOL;
        }
      } else if (this.getCurrentTool() == UITools.MOVE_2D_TOOL) {
        if(this.loadedCursor != MOVE_2D_TOOL){
          GLOBAL.applet.cursor(MOVE_CAM_TOOL_CURSOR, 1,1);
        this.loadedCursor = MOVE_2D_TOOL;
        }
      } else {
        if(this.loadedCursor != SELECT_TOOL){
          GLOBAL.applet.cursor(UITools.SELECT_TOOL_CURSOR, 1,1);
          this.loadedCursor = SELECT_TOOL;
        }

        //
        // g.fill(255,0,0);
        // g.ellipse(UI.mouseX , UI.mouseY ,2,2);
      }
    } else {


      if(this.loadedCursor != SELECT_TOOL){
      //  GLOBAL.applet.cursor(UITools.SELECT_TOOL_CURSOR, 1,1);
      //  this.loadedCursor = SELECT_TOOL;
      }
     
    }
*/
    // g.image(this.pickBuffer,0,0);
  }

  void renderGrid(PGraphics g) {

    if (this.useGrid && this.gridWidth * GLOBAL.getZOOM() > 2) {

      g.stroke(SETTINGS.GRID_MAJOR_LINE);
      g.strokeWeight(SETTINGS.GRID_MAJOR_LINE_WEIGHT);
      //float offset_x =  GLOBAL.CAM_OFFSET_X % (this.gridWidth);

      //calculate the number of grid squares between the centre of the screen and the edge to  see where our grid should start
      double offset_x = (GLOBAL.windowWidth / 2)
          - (Math.floor((GLOBAL.windowWidth / 2)
              / (this.gridWidth * GLOBAL.getZOOM()))
              * this.gridWidth * GLOBAL.getZOOM());
      offset_x = (((GLOBAL.CAM_OFFSET_X * GLOBAL.getZOOM()) + offset_x) % (this.gridWidth * GLOBAL
          .getZOOM())) - this.gridWidth * GLOBAL.getZOOM();

      for (float x = (float) offset_x; x < GLOBAL.windowWidth; x += this.gridWidth
          * GLOBAL.getZOOM()) {

        g.stroke(SETTINGS.GRID_MAJOR_LINE);
        g.strokeWeight(SETTINGS.GRID_MAJOR_LINE_WEIGHT);

        g.line(x, 0, x, GLOBAL.windowHeight);

        if (this.gridWidth * GLOBAL.getZOOM() > minorGridnumber * 5) {
          g.stroke(SETTINGS.GRID_MINOR_LINE);
          g.strokeWeight(SETTINGS.GRID_MINOR_LINE_WEIGHT);

          for (float x2 = (float) (x + (this.gridWidth * GLOBAL.getZOOM())
              / minorGridnumber); x2 < x + this.gridWidth
              * GLOBAL.getZOOM(); x2 += (this.gridWidth * GLOBAL
              .getZOOM()) / minorGridnumber) {
            g.line(x2, 0, x2, GLOBAL.windowHeight);
          }
        }

      }

      double offset_y = (GLOBAL.windowHeight / 2)
          - (Math.floor((GLOBAL.windowHeight / 2)
              / (this.gridHeight * GLOBAL.getZOOM()))
              * this.gridHeight * GLOBAL.getZOOM());
      offset_y = (((GLOBAL.CAM_OFFSET_Y * GLOBAL.getZOOM()) + offset_y) % (this.gridHeight * GLOBAL
          .getZOOM())) - this.gridHeight * GLOBAL.getZOOM(); // Y offset

      for (float y = (float) offset_y; y < GLOBAL.windowHeight; y += this.gridHeight
          * GLOBAL.getZOOM()) {
        g.stroke(SETTINGS.GRID_MAJOR_LINE);
        g.strokeWeight(SETTINGS.GRID_MAJOR_LINE_WEIGHT);

        g.line(0, y, GLOBAL.windowWidth, y);

        if (this.gridWidth * GLOBAL.getZOOM() > minorGridnumber * 5) {
          g.stroke(SETTINGS.GRID_MINOR_LINE);
          g.strokeWeight(SETTINGS.GRID_MINOR_LINE_WEIGHT);

          for (float y2 = (float) (y + (this.gridHeight * GLOBAL.getZOOM())
              / minorGridnumber); y2 < y + this.gridWidth
              * GLOBAL.getZOOM(); y2 += (this.gridHeight * GLOBAL
              .getZOOM()) / minorGridnumber) {
            g.line(0, y2, GLOBAL.windowWidth, y2);
          }
        }

      }

    }
  }

  public void reset(GUIEvent e) {

    GLOBAL.forceResize = true;

    GLOBAL.setZOOM(.5f);
    GLOBAL.CAM_OFFSET_X = -400;
    GLOBAL.CAM_OFFSET_Y = (float) -((700 - GLOBAL.windowHeight) + 900);
    GLOBAL.autoRotate = false;
    //GLOBAL.forceResize = true;
    /*
    GLOBAL.resetting = true;
   
    if(!SETTINGS.APPLET_MODE){
    this.saveChairToFileAuto(null);
    this.captureScreen(null);
    GLOBAL.applet.draw();
    }
    */
    //GLOBAL.gui.reset();
    //  GLOBAL.applet.removeAll();
    //GLOBAL.person.resetPhysics();
    //GLOBAL.forceReset = true;

    this.currentView = UITools.VIEW_CHAIR_EDIT;
    SETTINGS.EXPERT_MODE = false;
    GLOBAL.displayIntroPanel = true;
    GLOBAL.gui.reload();
    GLOBAL.gui.reset();

    if (SETTINGS.EXPERT_MODE)
      UI.setupGUITabsExpert(GLOBAL.applet, GLOBAL.gui);

    if (!SETTINGS.EXPERT_MODE)
      UI.setupGUITabsBasic(GLOBAL.applet, GLOBAL.gui);

    GLOBAL.sketchChairs.killAll();
    GLOBAL.jBullet = new jBullet();
    GLOBAL.person = new ergoDoll(GLOBAL.jBullet.myWorld, new Vector3f(-80,
        -10, 0), 1f);
    this.physicsRewind(null);
    //GLOBAL.applet.setup(); 
    //GLOBAL.resetting = false;
    SETTINGS_SKETCH.plane_thickness = SETTINGS_SKETCH.plane_thickness_default;

  }

  public void saveChairToFile(GUIEvent e) {
    GLOBAL.saveChairToFile = true;
  }

  public void saveChairToFile() {
    if (SETTINGS.APPLET_MODE) {

      try {
        FileSaveService save = (FileSaveService) ServiceManager
            .lookup("javax.jnlp.FileSaveService");

        Element root = new Element("SketchChairDoc");
        root.addAttribute(new Attribute("version", String
            .valueOf(SETTINGS.version)));
        root.appendChild(GLOBAL.sketchChairs.getCurChair().toXML());

        Document doc = new Document(root);
        //   outXML = ;// new FileOutputStream(name+".xml");

        ByteArrayOutputStream outXML = new ByteArrayOutputStream();
        Serializer serializer = new Serializer(outXML, "ISO-8859-1");
        serializer.write(doc);

        FileContents fc = save.saveFileDialog(null,
            new String[] { "chair" }, new ByteArrayInputStream(
                outXML.toByteArray()), null);

      } catch (Exception ex) {
        LOGGER.error("exception: " + ex);
      }

    } else {
      //Create a file chooser
      GLOBAL.applet.selectOutput("select design file.", "saveChairToFileCallback", null, this);
    }
      
      

  }
 
 
  public void savePattern(GUIEvent e) {
    this.savePatternToFile();
  }
 
  public void savePatternToFile() {
    if (SETTINGS.APPLET_MODE) {

      try {
        FileSaveService save = (FileSaveService) ServiceManager
            .lookup("javax.jnlp.FileSaveService");

        Element root = new Element("SketchChairDoc");
        root.addAttribute(new Attribute("version", String
            .valueOf(SETTINGS.version)));
        root.appendChild(GLOBAL.sketchChairs.getCurChair().toXML());

        Document doc = new Document(root);
        //   outXML = ;// new FileOutputStream(name+".xml");

        ByteArrayOutputStream outXML = new ByteArrayOutputStream();
        Serializer serializer = new Serializer(outXML, "ISO-8859-1");
        serializer.write(doc);

        FileContents fc = save.saveFileDialog(null,
            new String[] { "chair" }, new ByteArrayInputStream(
                outXML.toByteArray()), null);

      } catch (Exception ex) {
        LOGGER.error("exception: " + ex);
      }

    } else {
      //Create a file chooser

      GLOBAL.applet.selectOutput("select design file.", "savePatternToFileCallback", null, this);
    }
      
      

  }
 
 
 
 
  public void saveChairToFileCallback(File file) {
    GLOBAL.saveChairLocation = file.getAbsolutePath();
   
    if(!GLOBAL.saveChairLocation.endsWith(".skchr"))
      GLOBAL.saveChairLocation += ".skchr";
  }
 
  public void savePatternToFileCallback(File file) {
    GLOBAL.savePatternLocation = file.getAbsolutePath();
   
    if(!GLOBAL.savePatternLocation.endsWith(".svg"))
      GLOBAL.savePatternLocation += ".svg";
   
  }
 
 
  public void saveChairToFileAuto(GUIEvent e) {
    GLOBAL.saveChairToFileAuto = true;
   
   
   
  }

  public void saveChairToFileAuto() {

    if (GLOBAL.sketchChairs.getCurChair() != null) {
     
      if(GLOBAL.sketchChairs.getCurChair().localSavelocation == null){
        this.saveChairToFile();
        return;
       
      }
     
      GLOBAL.sketchChairs.getCurChair().addToShapePack();

      String location = "";
      int id = 0;

      if (GLOBAL.sketchChairs.getCurChair().localSavelocation != null) {
        location = GLOBAL.sketchChairs.getCurChair().localSavelocation;
      } else {

        String computername = functions.getComputerName();
        String currentDir = new File(".").getAbsolutePath();
        currentDir = currentDir.substring(0, currentDir.length() - 1);

        boolean nameFound = false;

        while (!nameFound && id < 10000) {
          location = currentDir + "savedChairs\\chair-" + id + ".xml";
          GLOBAL.sketchChairs.getCurChair().localSavelocation = location;
          File f = new File(location);

          if (!f.exists())
            nameFound = true;

          id++;
        }
      }

      save(location);
      //System.out.println("saving to " + location);
      SETTINGS.chairSaveNum = id;
      GLOBAL.LAST_SAVED_LOCATION = location;
    }
  }

  public void saveCraftRobo(GUIEvent e) {

    if (GLOBAL.sketchChairs.getCurChair() != null)
      GLOBAL.sketchChairs.getCurChair().addToShapePack();

    //  GLOBAL.shapePack.build();
    GLOBAL.shapePack.printToCraftRobo();

  }

  public void saveModelDxf(GUIEvent e) {

    GLOBAL.dxfCapture = true;

    if (SETTINGS.APPLET_MODE) {

      FileSaveService save;
      try {
        save = (FileSaveService) ServiceManager
            .lookup("javax.jnlp.FileSaveService");
        GLOBAL.shapePack.build();
        FileContents fc = save.saveFileDialog(null,
            new String[] { "pdf" }, new ByteArrayInputStream(
                GLOBAL.shapePack.getPDFBuffered(GLOBAL.applet)
                    .toByteArray()), null);

      } catch (UnavailableServiceException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
      } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
      }

    } else {
      GLOBAL.applet.selectOutput("select design file.", "saveModelDxfCallback", null, this);

    }
  }
 
  public void saveModelDxfCallback(File file) {
    GLOBAL.dxfLocation = file.getAbsolutePath();
    GLOBAL.dxfCapture = true;
  }

  public void savePatternDXF(GUIEvent e) {

    if (GLOBAL.sketchChairs.getCurChair() != null)
      GLOBAL.sketchChairs.getCurChair().addToShapePack();

    if (SETTINGS.APPLET_MODE) {

      FileSaveService save;
      try {
        save = (FileSaveService) ServiceManager
            .lookup("javax.jnlp.FileSaveService");
        GLOBAL.shapePack.build();
        FileContents fc = save.saveFileDialog(null,
            new String[] { "dxf" }, new ByteArrayInputStream(
                GLOBAL.shapePack.getDXFBuffered(GLOBAL.applet)
                    .toByteArray()), null);

      } catch (UnavailableServiceException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
      } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
      }

    } else {
      //GLOBAL.shapePack.printToCraftRobo();

      GLOBAL.applet.selectOutput("select design file.", "savePatternDXFCallback", null, this);


    }

  }

  public void savePatternDXFCallback(File file) {

   GLOBAL.dxfSaveLocation = file.getAbsolutePath();
    GLOBAL.saveDXF = true;
   
    if(!GLOBAL.dxfSaveLocation.endsWith(".dxf"))
      GLOBAL.dxfSaveLocation += ".dxf";
   
   
  }
  public void savePDF(GUIEvent e) {

    if (GLOBAL.sketchChairs.getCurChair() != null)
      GLOBAL.sketchChairs.getCurChair().addToShapePack();

    if (SETTINGS.APPLET_MODE) {

      FileSaveService save;
      try {
        save = (FileSaveService) ServiceManager
            .lookup("javax.jnlp.FileSaveService");
        GLOBAL.shapePack.build();
        FileContents fc = save.saveFileDialog(null,
            new String[] { "pdf" }, new ByteArrayInputStream(
                GLOBAL.shapePack.getPDFBuffered(GLOBAL.applet)
                    .toByteArray()), null);

      } catch (UnavailableServiceException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
      } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
      }

    } else {
      //GLOBAL.shapePack.printToCraftRobo();

      //Create a file chooser
      GLOBAL.applet.selectOutput("select design file.", "savePDFCallback", null, this);


    }

  }
 
  public void savePDFCallback(File file) {

     String filename = file.getAbsolutePath();
    if (!filename.endsWith("pdf"))
      filename += ".pdf";
   
    GLOBAL.pdfSaveLocation = filename;
    GLOBAL.savePDF = true;
   
  }
  public void layersSelectNext(GUIEvent e){
 
    if (GLOBAL.sketchChairs.getCurChair() != null) {
      GLOBAL.sketchChairs.getCurChair().selectedPlaneNumber++;
     
      if(GLOBAL.sketchChairs.getCurChair().selectedPlaneNumber >= GLOBAL.sketchChairs.getCurChair().getSlicePlanesY().size()){
        if(GLOBAL.planesWidget.mirrorSelection && GLOBAL.sketchChairs.getCurChair().getSlicePlanesY().size()>1)
          GLOBAL.sketchChairs.getCurChair().selectedPlaneNumber = 1;
        else
          GLOBAL.sketchChairs.getCurChair().selectedPlaneNumber = 0;

       
      }

      GLOBAL.planesWidget.planeClickedOn(GLOBAL.sketchChairs.getCurChair().getSlicePlanesY().get(GLOBAL.sketchChairs.getCurChair().selectedPlaneNumber));
    }
  }

  public void layersSelectPrev(GUIEvent e){
 
   
    if (GLOBAL.sketchChairs.getCurChair() != null) {
      GLOBAL.sketchChairs.getCurChair().selectedPlaneNumber--;
     
      if(GLOBAL.sketchChairs.getCurChair().selectedPlaneNumber < 0){
        if(GLOBAL.planesWidget.mirrorSelection && GLOBAL.sketchChairs.getCurChair().getSlicePlanesY().size()>1)
          GLOBAL.sketchChairs.getCurChair().selectedPlaneNumber = GLOBAL.sketchChairs.getCurChair().getSlicePlanesY().size()-1;
        else
          GLOBAL.sketchChairs.getCurChair().selectedPlaneNumber = GLOBAL.sketchChairs.getCurChair().getSlicePlanesY().size();

       
      }

      GLOBAL.planesWidget.planeClickedOn(GLOBAL.sketchChairs.getCurChair().getSlicePlanesY().get(GLOBAL.sketchChairs.getCurChair().selectedPlaneNumber));
    }
   
   
  }

  public void exportPreview(GUIEvent e) {

    if (SETTINGS.APPLET_MODE) {

    } else {

      //Create a file chooser
      GLOBAL.applet.selectOutput("select design file.", "exportPreviewCallback", null, this);



    }

  }
 
  public void exportPreviewCallback(File file) {

    String filename = file.getAbsolutePath();
   
  if (!filename.endsWith("png"))
    filename += ".png";
 
  GLOBAL.pngPreviewSaveLocation =  filename;
  GLOBAL.exportPreviewPNG = true;
  }
  public void savePDFauto(GUIEvent e) {

    if (GLOBAL.sketchChairs.getCurChair() != null)
      GLOBAL.sketchChairs.getCurChair().addToShapePack();

    String computername = functions.getComputerName();
    String currentDir = new File(".").getAbsolutePath();
    currentDir = currentDir.substring(0, currentDir.length() - 1);

    int id = 0;
    boolean nameFound = false;
    String location = "";

    String dropBoxDir = SETTINGS.autoSaveMakeLocation;
    while (!nameFound && id < 10000) {
      location = dropBoxDir + "/" + "_exhibitionChair-" + id + ".pdf";
      File f = new File(location);

      if (!f.exists())
        nameFound = true;

      id++;
    }

    LOGGER.info("Saving PDF to: " + location);
    GLOBAL.pdfSaveLocation = location;
    GLOBAL.savePDF = true;
    SETTINGS.chairSaveNum++;

  }

  public void selectLanguage(GUIEvent e) {

    if (e.val == UITools.LANGUAGE_ENG) {
      SETTINGS.LANGUAGE = "ENG";
      GLOBAL.modeChanged = true;

    }

    if (e.val == UITools.LANGUAGE_JP) {
      SETTINGS.LANGUAGE = "JP";
      GLOBAL.modeChanged = true;

    }

  }

  public void setDisplaypanelAsShown(GUIEvent e) {
    GLOBAL.displayIntroPanel = false;

  }

  public void selectLegPlanes(GUIEvent e) {

    if (GLOBAL.sketchChairs.getCurChair() != null) {
      GLOBAL.sketchChairs.getCurChair().selectedPlanes.clear();
      GLOBAL.sketchChairs.getCurChair().selectedPlanes
          .add(GLOBAL.sketchChairs.getCurChair().getSlicePlanesY()
              .getFirst());
      GLOBAL.sketchChairs.getCurChair().selectedPlanes
          .add(GLOBAL.sketchChairs.getCurChair().getSlicePlanesY()
              .getLast());
    }

  }

  public void selectTool(GUIEvent e) {
    this.selectTool((int) e.val);
    this.selectCooldown = 50;

  }

  public void makeChairWindow(GUIEvent e) {
    float windowWidth = SETTINGS.GUIDE_WINDOW_WIDTH;
    float windowHeight = SETTINGS.GUIDE_WINDOW_HEIGHT;

    GUIWindow window = new GUIWindow(0f, 0f, windowWidth, windowHeight,
        GLOBAL.gui);
    window.setLightboxed(true);
    window.centre();
    GLOBAL.gui.add(window);

    float posX = 100;
    float posY = 100;
    float spacingY = 80;

    GUIImage guiImg;
    guiImg = new GUIImage(0, 50, "gui/WINDOW_TITLE_MAKE.png", GLOBAL.gui);
    window.add(guiImg);

    GUIButton button;
    button = new GUIToggle(400, 50, "gui/WINDOW_MAKE_PREVIEW_PATTERN.png",
        GLOBAL.gui);
    button.addActionListener(GLOBAL.uiTools, "toggleView", UITools.LEG_TOOL);
    button.addActionListener(window, "close", UITools.LEG_TOOL);
    window.add(button);
    posY += spacingY;

    button = new GUIToggle(400, 200, "gui/WINDOW_MAKE_CUT_PATTERN.png",
        GLOBAL.gui);
    button.addActionListener(window, "close", UITools.LEG_TOOL);
    if (SETTINGS.autoSaveMakePattern)
      button.addActionListener(GLOBAL.uiTools, "savePDFauto",
          UITools.LEG_TOOL);
    else
      button.addActionListener(GLOBAL.uiTools, "print", UITools.LEG_TOOL);

    window.add(button);

    posY += spacingY;

  }

  public void selectTool(int toolNum) {
   
    setCurrentTool(toolNum);

    if (this.getCurrentTool() == UITools.SELECT_TOOL
        && !SETTINGS.EXPERT_MODE) {
      if (GLOBAL.sketchChairs.getCurChair() != null) {
        GLOBAL.sketchChairs.getCurChair().selectedPlanes.clear();
        GLOBAL.sketchChairs.getCurChair().selectedPlanes
            .add(GLOBAL.sketchChairs.getCurChair()
                .getSlicePlanesY());
      }

    }

    //GLOBAL.forceResize = true;
    // System.out.print(toolNum);
  }

  public void setBrushDia(float val) {

    GLOBAL.uiTools.SketchTools.brush_dia = val;

    if (GLOBAL.sketchChairs.getCurChair() != null)
      GLOBAL.sketchChairs.getCurChair().setBrushDia(val);

  }

  public void setChairColour(GUIEvent e) {
    if (GLOBAL.sketchChairs.getCurChair() != null) {
      GLOBAL.sketchChairs.getCurChair().chairColour = (int) e.val;
    }

  }

  /**
   * @param currentTool the currentTool to set
   */
  public void setCurrentTool(int currentTool) {
    this.SketchTools.selectTool(SketchTools.NONE);
    this.currentTool = currentTool;

     
  }

  /**
   * @param editing the editing to set
   */
  public void setEditing(int editing) {
    this.editing = editing;
  }

  /**
   * @param pickBuffer the pickBuffer to set
   */
  public void setPickBuffer(PGraphics pickBuffer) {
    this.pickBuffer = pickBuffer;
  }

  public void showBugsWebpage(GUIEvent e) {

    String url = "http://www.sketchchair.cc/forum/index.php?board=8.0";
    if (java.awt.Desktop.isDesktopSupported()) {
      try {
        // not compatible in JRE 1.5
        java.awt.Desktop.getDesktop().browse(java.net.URI.create(url));
      } catch (IOException e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
      }
    }

  }

  public void showForumWebpage(GUIEvent e) {

    String url = "http://www.sketchchair.cc/forum/";
    if (java.awt.Desktop.isDesktopSupported()) {
      try {
        // not compatible in JRE 1.5
        java.awt.Desktop.getDesktop().browse(java.net.URI.create(url));
      } catch (IOException e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
      }
    }

  }

  public void showInstructionMovie(GUIEvent e) {
    //GLOBAL.tittleImageNum = 0;
    //GLOBAL.myMovie = new FasterMovie(GLOBAL.applet,"./introVideos/"+GLOBAL.tittleImageNum+".mov");
    //GLOBAL.myMovie.loop(); 
  }

  public void showInstructions(GUIEvent e) {
    GLOBAL.tittleImageNum = 0;
    GLOBAL.tittleImg = GLOBAL.applet.loadImage("./tittleImage/"
        + GLOBAL.tittleImageNum + SETTINGS.LANGUAGE + ".jpg");

  }

  public void showReferenceWebpage(GUIEvent e) {

    String url = "http://www.sketchchair.cc/development/description-of-features/";
    if (java.awt.Desktop.isDesktopSupported()) {
      try {
        // not compatible in JRE 1.5
        java.awt.Desktop.getDesktop().browse(java.net.URI.create(url));
      } catch (IOException e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
      }
    }

  }

 


 
 
  public void sitStand(GUIEvent e) {

    if (!GLOBAL.jBullet.physics_on) {
      GLOBAL.jBullet.physics_on = true;
    } else {
      this.physicsRewind(null);
      GLOBAL.jBullet.physics_on = false;
    }
  }

  public void toggleCentreConstraintChair(GUIEvent e) {
    if (GLOBAL.sketchChairs.getCurChair() != null)
      GLOBAL.sketchChairs.getCurChair().toggleCentreConstraint();

  }

 
  public void figureGrow(GUIEvent e) {
  GLOBAL.person.bigger();
  }
 
 
  public void figureShrink(GUIEvent e) {
  GLOBAL.person.smaller();

   
  }
  public void toggleExpert(GUIEvent e) {

    SETTINGS.EXPERT_MODE = !SETTINGS.EXPERT_MODE;
   
    if(this.currentView == UITools.VIEW_CHAIR_EDIT) {

    if (SETTINGS.EXPERT_MODE) {
      UI.setupGUITabsExpert(GLOBAL.applet, GLOBAL.gui);
    } else {
      UI.setupGUITabsBasic(GLOBAL.applet, GLOBAL.gui);
    }
        }

   
    if (GLOBAL.slicesWidget != null
        && GLOBAL.sketchChairs.getCurChair() != null)
      GLOBAL.slicesWidget
          .rebuild(GLOBAL.sketchChairs.getCurChair().crossSliceSelections);

    GLOBAL.forceResize = true;
  }

  public void togglePerformance(GUIEvent e) {
    GLOBAL.performanceMode = !GLOBAL.performanceMode;

    GLOBAL.gui.performanceMode = GLOBAL.performanceMode;

    if (GLOBAL.gui.performanceMode) {
      SETTINGS.cylinder_res = 4;
      SETTINGS.sphere_res = 9;
    } else {

      SETTINGS.cylinder_res = 12;
      SETTINGS.sphere_res = 7;

    }

  }

  public void togglePerson(GUIEvent e) {

    GLOBAL.person.toggleON();
  }
 
  public void toggleFloor(GUIEvent e){
    GLOBAL.floorOn = !GLOBAL.floorOn;

  }

  public void toggleReferenceGeom(GUIEvent e) {
    GLOBAL.environments.render = !GLOBAL.environments.render;

  }
  public void toggleGrid(GUIEvent e) {
    LOGGER.info("snap to grid");
    this.useGrid = !this.useGrid;
    this.SketchTools.useGrid = !this.SketchTools.useGrid ;
  }
 
  public void importSVG(GUIEvent e) {

   
    GLOBAL.applet.selectInput("select design file.", "importSVGCallback", null, this);
   

  }
  public void importSVGCallback(File file) {
     GLOBAL.importSVGLocation = file.getAbsolutePath();

  }
 
  public void applyMaterialSettings(GUIEvent e) {
  if(GLOBAL.sketchChairs.getCurChair() != null)
    GLOBAL.sketchChairs.getCurChair().addToShapePack();
 
  //LOGGER.info("applyMaterialSettings");
  }
 
  public void toggleView(GUIEvent e) {

    System.gc();//clean up before we hit the memory
   
    if (this.currentView == UITools.VIEW_CHAIR_EDIT)
      this.currentView = UITools.VIEW_SHAPE_PACK;
    else
      this.currentView = UITools.VIEW_CHAIR_EDIT;

    if (this.currentView == UITools.VIEW_SHAPE_PACK) {
      UI.setupGUIPattern(GLOBAL.applet, GLOBAL.gui);
      GLOBAL.sketchChairs.getCurChair().getSlicePlanesY().update();
      GLOBAL.sketchChairs.getCurChair().addToShapePack();
     
   
     
    }else{
     
      if(SETTINGS.EXPERT_MODE)
      UI.setupGUITabsExpert(GLOBAL.applet, GLOBAL.gui);
      else
      UI.setupGUITabsBasic(GLOBAL.applet, GLOBAL.gui);

      if(GLOBAL.designToolbarPattern != null)
      GLOBAL.designToolbarPattern.hide();

     
      if(GLOBAL.designToolbarBasic != null)
        GLOBAL.designToolbarBasic.show();
     
      if(GLOBAL.designToolbarAdvanced != null)
        GLOBAL.designToolbarAdvanced.show();
     
     
    }

  }
 
  public void viewPattern(GUIEvent e) {

    GLOBAL.previewWidget.makeItBtn.hide();
    GLOBAL.previewWidget.designItBtn.hide();
   
    GLOBAL.patternCameraPanel.show();
    GLOBAL.cameraPanel.hide();
   
    this.currentView = UITools.VIEW_SHAPE_PACK;

    UI.setupGUIPattern(GLOBAL.applet, GLOBAL.gui);
    GLOBAL.sketchChairs.getCurChair().getSlicePlanesY().update();
    GLOBAL.sketchChairs.getCurChair().addToShapePack();
   
  }
 
 
  public void viewModel(GUIEvent e) {

    GLOBAL.previewWidget.makeItBtn.show();
    GLOBAL.previewWidget.designItBtn.hide();
   
    GLOBAL.patternCameraPanel.hide();
    GLOBAL.cameraPanel.show();
   
   
    this.currentView = UITools.VIEW_CHAIR_EDIT;

    if(SETTINGS.EXPERT_MODE)
      UI.setupGUITabsExpert(GLOBAL.applet, GLOBAL.gui);
      else
      UI.setupGUITabsBasic(GLOBAL.applet, GLOBAL.gui);
}
 
 

  public void undo(GUIEvent e) {
    System.out.print("UNDO");

    GLOBAL.undo.undoChair(GLOBAL.sketchChairs.getCurChair());

  }

  public void ShareChairOnline(GUIEvent e) {
    SketchChairCloudhook.getInstance().ShareChairOnline(null);
  }

  void update() {
   
    updateVecMove();

    if(GLOBAL.autoRotate){
      GLOBAL.slicesWidget.unselectAll();
      GLOBAL.planesWidget.unselectAll();
    }
   
    if (this.SketchTools.getCurrentTool() != SketchTools.NONE)
      this.currentTool = NONE;

    //if(this.waitingForSingleClick)
    //  LOGGER.info("waitingForSingleClick"+(GLOBAL.applet.millis() - this.mousePressedTime));
   
   
    if((GLOBAL.applet.millis() - this.mousePressedTime) > SETTINGS.MOUSE_CLICKED_MIN_TIME )
    this.waitingForSingleClick = false;
   
    if (this.waitingForSingleClick &&
         (GLOBAL.applet.millis() - this.mousePressedTime) < SETTINGS.MOUSE_CLICKED_MIN_TIME &&
        (mouseX == pmouseX && mouseY == pmouseY)
       
        ){
      this.mouseSingleClick();
      waitingForSingleClick = false;
    }


    this.selectCooldown--;
  }

  public void updateMouse(int mouseX2, int mouseY2, int pmouseX2,
      int pmouseY2, boolean mouseDown2, int mouseButton2) {
    GLOBAL.uiTools.pmouseX = GLOBAL.uiTools.mouseX;
    GLOBAL.uiTools.pmouseY = GLOBAL.uiTools.mouseY;

    GLOBAL.uiTools.mouseX = mouseX2;
    GLOBAL.uiTools.mouseY = mouseY2;

    GLOBAL.uiTools.mouseDown = mouseDown2;
    GLOBAL.uiTools.mouseButton = mouseButton2;

    if (this.useGrid ) {

      float m_gridW = this.gridWidth;
      float m_gridH = this.gridHeight;

      if (this.gridWidth * GLOBAL.getZOOM() > minorGridnumber * 5) {
        m_gridW /= minorGridnumber;
        m_gridH /= minorGridnumber;
      }

      //calculate the number of grid squares between the centre of the screen and the edge to  see where our grid should start
      float offset_x = (float) (Math.round((((float)mouseX2 - ((float)GLOBAL.windowWidth / 2.0f)) / (m_gridW * GLOBAL.getZOOM()))) * (m_gridW * GLOBAL.getZOOM()));
      offset_x +=(float)(GLOBAL.windowWidth / 2)+ ((GLOBAL.CAM_OFFSET_X * GLOBAL.getZOOM()) % (m_gridW * GLOBAL.getZOOM()));
     
     
      float offset_y = (float) (Math.round((((float)mouseY2 - ((float)GLOBAL.windowHeight / 2.0f)) / (m_gridH * GLOBAL.getZOOM()))) * (m_gridH * GLOBAL.getZOOM()));
      offset_y += (float)(GLOBAL.windowHeight / 2)+ ((GLOBAL.CAM_OFFSET_Y * GLOBAL.getZOOM()) % (m_gridH * GLOBAL.getZOOM()));

      int newMouseX = (int) offset_x;
      int newMouseY = (int) offset_y;
      GLOBAL.uiTools.mouseX = newMouseX;
      GLOBAL.uiTools.mouseY = newMouseY;

    }
  }

  public void updateMouseWorld() {

    GLOBAL.uiTools.pmouseXworld = GLOBAL.uiTools.mouseXworld;
    GLOBAL.uiTools.pmouseYworld = GLOBAL.uiTools.mouseYworld;

    Vec2D MouseWorld = this.getPointTranslated(new Vec2D(this.mouseX,
        this.mouseY));

    GLOBAL.uiTools.mouseXworld = MouseWorld.x;
    GLOBAL.uiTools.mouseYworld = MouseWorld.y;

  }

  void updateVecMove() {
    /*
      if (selectedVec != null && selectedVecPlane != null) {
        // System.out.println(selectedVec.x);
        if (UI.mouseDown) {
          //Vec2D planePoint = getPointOnPlane(new Vec2D(UI.mouseX,
              UI.mouseY), this.selectedVecPlane, GLOBAL.g);
          // selectedVec.x += (UI.mouseX - UI.pmouseX) / GLOBAL.ZOOM;
          // selectedVec.y += (UI.mouseY - UI.pmouseY) / GLOBAL.ZOOM;

          if (planePoint != null) {
            // selectedVec.x = planePoint.x;
            // / selectedVec.y = planePoint.y;

            if (this.selectedShape != null) {
              this.selectedShape.movePoint(selectedVec, planePoint);

            }
          }
          //
        }
      }
      */
  }

 
  boolean isSideView(){
    return(GLOBAL.rotateModelsX == 0 && GLOBAL.rotateModelsY == 0);
  }
 
 
  void zoomView(float _zoomDelta){
   
   
    float deltaMouseXBefore = (float) (((GLOBAL.applet.width/2)-UI.mouseX)/GLOBAL.ZOOM);
    float deltaMouseYBefore = (float) (((GLOBAL.applet.height/2)-UI.mouseY)/GLOBAL.ZOOM);
   
   
    GLOBAL.ZOOM -= _zoomDelta;

   
    if( (_zoomDelta > 0 && GLOBAL.ZOOM < SETTINGS.MIN_ZOOM)){
      GLOBAL.ZOOM = SETTINGS.MIN_ZOOM;
    }
       
    if(_zoomDelta < 0 && GLOBAL.ZOOM > SETTINGS.MAX_ZOOM){
    GLOBAL.ZOOM = SETTINGS.MAX_ZOOM;
    }
   
     float deltaMouseXAfter = (float) (((GLOBAL.applet.width/2)-UI.mouseX)/GLOBAL.ZOOM);
     float deltaMouseYAfter = (float) (((GLOBAL.applet.height/2)-UI.mouseY)/GLOBAL.ZOOM);
   
    
     float deltaMouseX = deltaMouseXAfter - deltaMouseXBefore;
     float deltaMouseY = deltaMouseYAfter - deltaMouseYBefore;
    
     moveView(-deltaMouseX,-deltaMouseY);

  }
 
  void centreView(float _x, float _y){
   
   
    float deltaMouseX = (GLOBAL.applet.width/2)-_x;
    float deltaMouseY = (GLOBAL.applet.height/2)-_y;
       
    GLOBAL.CAM_OFFSET_X += ((deltaMouseX/GLOBAL.ZOOM));
    GLOBAL.CAM_OFFSET_Y += ((deltaMouseY/GLOBAL.ZOOM));
   
   
   
  }
 
  void moveView(float _deltaX, float _deltaY){
   
   
     GLOBAL.CAM_OFFSET_X +=  _deltaX;
     GLOBAL.CAM_OFFSET_Y +=  _deltaY;
 
    
     float leftEdge = (float) (GLOBAL.CAM_OFFSET_X - ((GLOBAL.applet.width/2)/GLOBAL.ZOOM));
      if(leftEdge < SETTINGS.MIN_CAM_X_OFFSET)
        GLOBAL.CAM_OFFSET_X = SETTINGS.MIN_CAM_X_OFFSET + ((GLOBAL.applet.width/2)/GLOBAL.ZOOM);
     
     
       float rightEdge = (float) (GLOBAL.CAM_OFFSET_X + ((GLOBAL.applet.width/2)/GLOBAL.ZOOM));
      if(rightEdge > SETTINGS.MAX_CAM_X_OFFSET)
        GLOBAL.CAM_OFFSET_X = SETTINGS.MAX_CAM_X_OFFSET - ((GLOBAL.applet.width/2)/GLOBAL.ZOOM);
     
      double topEdge = (double) GLOBAL.CAM_OFFSET_Y + ((GLOBAL.applet.height/2)/GLOBAL.ZOOM);
      if(topEdge > SETTINGS.MAX_CAM_Y_OFFSET)
        GLOBAL.CAM_OFFSET_Y = SETTINGS.MAX_CAM_Y_OFFSET - ((GLOBAL.applet.height/2)/GLOBAL.ZOOM);
     
      float bottomEdge = (float) (GLOBAL.CAM_OFFSET_Y - ((GLOBAL.applet.height/2)/GLOBAL.ZOOM));
      if(bottomEdge < SETTINGS.MIN_CAM_Y_OFFSET)
        GLOBAL.CAM_OFFSET_Y = SETTINGS.MIN_CAM_Y_OFFSET + ((GLOBAL.applet.height/2)/GLOBAL.ZOOM);
     
    
  }
 
}
TOP

Related Classes of cc.sketchchair.core.UITools

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.