package com.pixelmaid.dresscode.app; import java.awt.Color; import java.awt.Cursor; import java.awt.Image; import java.awt.Toolkit; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.pixelmaid.dresscode.app.ui.tools.PenTool; import com.pixelmaid.dresscode.app.ui.tools.TargetTool; import com.pixelmaid.dresscode.app.ui.tools.Tool; import com.pixelmaid.dresscode.app.ui.usercreated.UserUI; import com.pixelmaid.dresscode.drawing.datatype.Point; import com.pixelmaid.dresscode.drawing.math.UnitManager; import com.pixelmaid.dresscode.drawing.primitive2d.Drawable; import com.pixelmaid.dresscode.events.CustomEvent; import com.pixelmaid.dresscode.events.CustomEventListener; import com.pixelmaid.dresscode.events.EventInterface; import processing.core.*; import processing.dxf.RawDXF; import processing.opengl.PGraphicsOpenGL; import javax.swing.JFrame; import processing.pdf.PGraphicsPDF; public class Canvas extends PApplet implements EventInterface{ /** * */ protected List<CustomEventListener> _listeners = new ArrayList<CustomEventListener>(); private static final long serialVersionUID = 1L; public int DEFAULT_BG = 242; public Color backgroundColor; private double gridUnits = 10; private double gridIncrement = 10; private double counterIncrement = 100; private int unitType = 0; private float zoomAmount = 1f; private int translateYAmount = 0; private int translateXAmount = 0; protected int defaultCanvasWidth = 500; protected int defaultCanvasHeight = 500; private double drawingBoardWidth = 500; private double drawingBoardHeight = 500; private boolean showOrigin = false; // determines whether or not to show origin; private Drawable selectedObject = null; private double selectDist = 5; private boolean objectMoved = false; private int gridHeight = 7000; private int gridWidth = 7000; private int gridX = -gridWidth/2; private int gridY = -gridHeight/2; private int gridNum = 0; //toggles state of grid private double zeroX= 0; private double zeroY=0; private ArrayList<Drawable> tempDrawables; private ArrayList<UserUI> userUI; private boolean drawGrid = true; private int currentMode = -1; private static final int NO_MODE = -1; private static final int TARGET_MODE = 0; private static final int PAN_MODE = 1; private static final int SELECT_MODE = 2; private static final int PEN_MODE = 3; private static final int RECT_MODE = 4; private static final int ELLIPSE_MODE = 5; private static final int POLY_MODE = 6; private static final int LINE_MODE = 7; private static final int CURVE_MODE = 8; private static final int ZOOM_MODE = 9; public Console console; public JFrame parent; private int id=0; PGraphicsOpenGL pG; RawDXF dxf; PGraphicsPDF pdf; public void setId(int i){ id=i; } public void setDimensions(int width, int height){ defaultCanvasWidth = width; defaultCanvasHeight = height; /*gridHeight = width; gridWidth = height; gridX = 0; gridY = 0;*/ } public void setDrawingBoardDimensions(double width, double height,int units){ drawingBoardWidth = width; drawingBoardHeight =height; zeroX = defaultCanvasWidth/2-drawingBoardWidth/2-13; //magic numbers here... not sure why these values are needed zeroY= defaultCanvasHeight/2-drawingBoardHeight/2+12; //System.out.println("drawing board="+drawingBoardWidth+","+drawingBoardHeight); unitType = units; if(gridNum!=1){ if(unitType==UnitManager.STANDARD){ setGridtoIn(); } if(unitType==UnitManager.METRIC){ setGridtoMm(); } } } public void setGridtoPix(){ gridUnits=10; gridIncrement = 10; counterIncrement = 100; System.out.println("grid units="+gridUnits); } public void setGridtoIn(){ gridUnits=UnitManager.PIX_IN_INCH/8; gridIncrement = 7; counterIncrement = 1; System.out.println("grid units="+gridUnits); } public void setGridtoMm(){ gridUnits=UnitManager.PIX_IN_MM; counterIncrement =10; gridIncrement=9; } public float getZeroX(){ return (float)this.zeroX; } public float getZeroY(){ return (float)this.zeroY; } public double getCanvasWidth(){ return defaultCanvasWidth; } public double getCanvasHeight(){ return defaultCanvasHeight; } public void setGrid(){ gridNum=gridNum+1; if(gridNum>2){ gridNum=0; } if(gridNum==0){ drawGrid = true; if(unitType==UnitManager.STANDARD){ setGridtoIn(); } if(unitType==UnitManager.METRIC){ setGridtoMm(); } } else if(gridNum==1){ drawGrid = true; setGridtoPix(); } else{ drawGrid = false; if(unitType==UnitManager.STANDARD){ setGridtoIn(); } if(unitType==UnitManager.METRIC){ setGridtoMm(); } } } public boolean getGrid(){ return drawGrid; } public void setup() { System.out.println("setting up canvas"); tempDrawables = new ArrayList<Drawable>(); userUI = new ArrayList<UserUI>(); //tempDrawables.add(new Ellipse(100,100)); PFont f; f = createFont("Monospaced", 11); textFont(f); size(defaultCanvasWidth,defaultCanvasHeight); noLoop(); // //pG =(PGraphicsOpenGL)this.g; //pProjectionView = pG.projection; //modelview= pG.modelview; /*dxf = (RawDXF) createGraphics(width, height, DXF, "outputDC.dxf"); beginRaw(dxf); dxf.ellipse(0,0,100,100); endRaw(); noLoop();*/ System.out.println("setup_called"); parent.setSize(parent.getPreferredSize()); } public void setDrawables(ArrayList<Drawable> d){ this.tempDrawables=d; //System.out.println("drawables set:"+id); } public void setUserUI(ArrayList<UserUI> d){ this.userUI=d; } public void draw() { System.out.println("drawing"); pushMatrix(); background(backgroundColor.getRed(),backgroundColor.getGreen(),backgroundColor.getBlue()); //translate(translateXAmount,translateYAmount,zoomAmount); translate(translateXAmount,translateYAmount); scale(zoomAmount); dimensions(false); pushMatrix(); //translate(zeroX,zeroY,0); translate((float)zeroX,(float)zeroY); for (int i=0;i<tempDrawables.size();i++){ tempDrawables.get(i).draw(this); if(showOrigin){ if(!tempDrawables.get(i).getHide()){ tempDrawables.get(i).drawOrigin(this); } // tempDrawables.get(i).drawBoundingBox(this); } } popMatrix(); if(drawGrid){ grid(); } dimensions(true); popMatrix(); rulers(); drawUserUI(); } private void drawUserUI(){ System.out.println("num of uis ="+userUI.size()); for(int i=0;i<userUI.size();i++){ userUI.get(i).draw(this); } } public void print(File file){ String pdfFilename = file.getAbsolutePath(); String dxfFilename = file.getAbsolutePath(); String subStr = pdfFilename.substring(pdfFilename.length()-4, pdfFilename.length()); //System.out.println(subStr); if(!subStr.contentEquals(".pdf")){ //System.out.println("substr!=pdf"); pdfFilename =pdfFilename.concat(".pdf"); } pdf = (PGraphicsPDF) createGraphics(((Double)drawingBoardWidth).intValue(), ((Double)drawingBoardHeight).intValue(), PDF, pdfFilename); pdf.beginDraw(); for (int i=0;i<tempDrawables.size();i++){ tempDrawables.get(i).print(pdf); } pdf.dispose(); pdf.endDraw(); /* dxf = (RawDXF) createGraphics(width, height, DXF, dxfFilename+".dxf"); beginRaw(dxf); for (int i=0;i<tempDrawables.size();i++){ tempDrawables.get(i).print(dxf); } endRaw(); dxf.dispose(); dxf = null;*/ } public void mousePressed() { //System.out.println(mousePressed); System.out.println("mouse pos="+mouseX+","+mouseY); this.fireMousePressedEvent(this, CustomEvent.CANVAS_MOUSE_PRESSED); for(int i=0;i<userUI.size();i++){ userUI.get(i).checkForMousePress(mouseX, mouseY); } /*if(currentMode == SELECT_MODE){ checkSelect(); } Toolkit toolkit = Toolkit.getDefaultToolkit(); Image cursorImage = toolkit.getImage(ClassLoader.getSystemResource("com/pixelmaid/dresscode/resources/pen.png"));//toolkit.getImage("cursor.gif"); java.awt.Point cursorHotSpot = new java.awt.Point(0,0); Cursor customCursor = toolkit.createCustomCursor(cursorImage, cursorHotSpot, "Cursor"); setCursor(customCursor);*/ } public void mouseReleased() { this.fireMousePressedEvent(this, CustomEvent.CANVAS_MOUSE_RELEASED); for(int i=0;i<userUI.size();i++){ userUI.get(i).checkForMouseRelease(mouseX, mouseY); } //currentTool.mouseReleased(relativeMouseX(),relativeMouseY()); } public void mouseDragged(){ this.fireMousePressedEvent(this, CustomEvent.CANVAS_MOUSE_DRAGGED); for(int i=0;i<userUI.size();i++){ userUI.get(i).checkForMouseDrag(mouseX, mouseY); } redraw(); //checkModeMove(); //redraw(); //currentTool.mouseDragged(mouseX,mouseY); } //===========================MODE AND TOOL FUNCTIONS===========================// public void clearMode() { currentMode = NO_MODE; showOrigin=false; cursor(ARROW); } public void showOrigins() { showOrigin=true; } public void pan(){ translateXAmount+= mouseX-pmouseX; translateYAmount+= mouseY-pmouseY; } public void selectMove(){ if(selectedObject!=null){ selectedObject.moveTo(relativeMouseX(),relativeMouseY()); objectMoved=true; } } //sets cursor according to mode public void changeCursor(Cursor cursorImage){ if(cursorImage!=null){ setCursor(cursorImage); } else{ cursor(ARROW); } } /*public void checkModeMouse(){ switch(currentMode){ case TARGET_MODE: this.fireToolEvent(this,CustomEvent.TARGET_SELECTED); break; case SELECT_MODE: if(objectMoved==true){ objectMoved = false; this.fireToolEvent(this,CustomEvent.DRAWABLE_MOVED); } selectedObject = null; break; default: break; } } */ /* public void checkModeMove(){ switch(currentMode){ case PAN_MODE: translateXAmount+= mouseX-pmouseX; translateYAmount+= mouseY-pmouseY; break; case SELECT_MODE: if(selectedObject!=null){ selectedObject.moveTo(relativeMouseX(),relativeMouseY()); objectMoved=true; } } }*/ public double relativeMouseX(){ double x1 = (mouseX - translateXAmount) / zoomAmount; double x = x1-(width/2-(drawingBoardWidth)/2); return x; } public double relativeMouseY(){ double y1 = (mouseY - translateYAmount)/ zoomAmount ; double y = y1-(height/2-(drawingBoardHeight)/2); return y; } public void rulers(){ noStroke(); fill(255,255,255); rect(0,0,gridWidth,40); rect(0,0,40,gridHeight); stroke(0,0,0); strokeWeight(1.5f); double heightGridPos=gridY; double widthGridPos=gridX; int countX=0; int countY=0; float shortener = 10; int counter=0; if(gridNum==1){ counter = 0-gridHeight/2; } else{ counter =0-((Double)(UnitManager.toUnits(gridHeight, this.unitType)/2)).intValue(); } while( heightGridPos<gridHeight){ if(countX==gridIncrement){ fill(0,0,0); text(counter,20,(float)((heightGridPos*zoomAmount)+translateYAmount)); stroke(0,0,0); strokeWeight(1f); countX=0; shortener=5; counter+=counterIncrement; } else{ stroke(0,0,0); strokeWeight(0.5f); countX++; shortener=10; } this.line(0,(float)((heightGridPos*zoomAmount)+translateYAmount),20-shortener,(float)((heightGridPos*zoomAmount)+translateYAmount)); heightGridPos+=gridUnits; } if(gridNum==1){ counter = 0-gridWidth/2; } else{ counter =0-((Double)(UnitManager.toUnits(gridWidth, this.unitType)/2)).intValue(); if(this.unitType==UnitManager.METRIC){ counter+=4; } } while( widthGridPos<gridWidth){ if(countY==gridIncrement){ fill(0,0,0); text(counter,(float)((widthGridPos*zoomAmount)+translateXAmount),20); stroke(0,0,0); strokeWeight(1f); countY=0; shortener=5; counter+=counterIncrement; } else{ stroke(0,0,0); strokeWeight(0.5f); countY++; shortener=10; } this.line((float)((widthGridPos*zoomAmount)+translateXAmount),0,(float)((widthGridPos*zoomAmount)+translateXAmount),20-shortener); widthGridPos+=gridUnits; } } public void grid(){ double heightGridPos=gridY; double widthGridPos=gridX; int countX=0; int countY=0; while( heightGridPos<gridHeight){ if(countX==gridIncrement){ stroke(0,0,0,75f); strokeWeight(1.5f); countX=0; } else{ stroke(0,0,0,50f); strokeWeight(1); countX++; } this.line(gridX,(float)heightGridPos,gridWidth,(float)heightGridPos); heightGridPos+=gridUnits; } while( widthGridPos<gridWidth){ if(countY==gridIncrement){ stroke(0,0,0,75f); strokeWeight(1f); countY=0; } else{ stroke(0,0,0,50f); strokeWeight(1); countY++; } this.line((float)widthGridPos,gridY,(float)widthGridPos,gridHeight); widthGridPos+=gridUnits; } } public void dimensions(boolean frame){ stroke(0); strokeWeight(0.5f); this.fill(DEFAULT_BG); rectMode(CENTER); if(frame){ noFill(); } else{ noStroke(); } rect(width/2,height/2,(float)drawingBoardWidth,(float)drawingBoardHeight); } public void zoomIn(){ zoomAmount+=0.05; //selectDist-=5; if(zoomAmount>10){ zoomAmount = 10; } //System.out.println(zoomAmount); } public void zoomOut(){ zoomAmount-=0.05; if(zoomAmount<0){ zoomAmount = 0; } //System.out.println(zoomAmount); } public Drawable checkSelect(){ double x= relativeMouseX(); double y = relativeMouseY(); System.out.println("rel x,y="+x+","+y); for(int i=tempDrawables.size()-1;i>=0;i--){ Point origin = tempDrawables.get(i).getOrigin(); System.out.println("obj x,y="+origin.getX()+","+origin.getY()); System.out.println("selectDist ="+selectDist); System.out.println("xy dist="+Math.abs(x-origin.getX())+","+Math.abs(y-origin.getY())); if((Math.abs(x-origin.getX())<selectDist)&&(Math.abs(y-origin.getY())<selectDist)){ selectedObject = tempDrawables.get(i); System.out.println("selected object at"+i); return tempDrawables.get(i); } } return null; } public void panMode() { currentMode = PAN_MODE; } @Override public synchronized void addEventListener(CustomEventListener listener) { _listeners.add(listener); } @Override public synchronized CustomEventListener getListenerAt(int index) { return (CustomEventListener) _listeners.get(index); } @Override public synchronized void removeEventListener(CustomEventListener listener) { _listeners.remove(listener); } // fires tool events to listeners private void fireToolEvent(Object source, int event) { Iterator<CustomEventListener> i = _listeners.iterator(); while(i.hasNext()) { ((CustomEventListener) i.next()).handleCustomToolEvent(source, event); } } // fires tool events to listeners private void fireMousePressedEvent(Object source, int event) { Iterator<CustomEventListener> i = _listeners.iterator(); while(i.hasNext()) { ((CustomEventListener) i.next()).handleCustomToolEvent(source, event); } } }