From c3ca87ad8fcb0447786079028c3379b3d5adbd95 Mon Sep 17 00:00:00 2001 From: xrgman Date: Mon, 16 Mar 2015 19:36:03 +0100 Subject: [PATCH] Added resizing and scrolling Still buggs while dragging scaled. --- Applicatie/DrawObject.java | 125 ++++++++++++++++++++++++++++++-- Applicatie/Panel.java | 144 ++++++------------------------------- Applicatie/Window.java | 4 +- Listeners/Mouse.java | 84 +++++++++++++--------- Listeners/MouseMotion.java | 93 ++++++++++++++++-------- Listeners/MouseWheel.java | 54 ++------------ Objects/Toilet.java | 2 +- 7 files changed, 261 insertions(+), 245 deletions(-) diff --git a/Applicatie/DrawObject.java b/Applicatie/DrawObject.java index 22b1ad3..adc10f4 100644 --- a/Applicatie/DrawObject.java +++ b/Applicatie/DrawObject.java @@ -1,9 +1,12 @@ package Applicatie; +import java.awt.BasicStroke; +import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; -import java.awt.Point; import java.awt.Shape; import java.awt.geom.AffineTransform; +import java.awt.geom.Ellipse2D; +import java.awt.geom.NoninvertibleTransformException; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; @@ -14,12 +17,24 @@ public class DrawObject { Point2D position; double rotation; double scale; - Image image; + private Image image; + private Image rotateImage; protected boolean selected; + private Rectangle2D rektAngle; + private Rectangle2D upperLeftCorner; + private Rectangle2D upperRightCorner; + private Rectangle2D bottomLeftCorner; + private Rectangle2D bottomRightCorner; + private Ellipse2D rotateDot; + static final int UPPERLEFT = 0; + static final int UPPERRIGHT = 1; + static final int BOTTOMLEFT = 2; + static final int BOTTOMRIGHT = 3; public DrawObject(String filename, Point2D position) { image = new ImageIcon(filename).getImage(); + rotateImage = new ImageIcon("rotate.png").getImage(); scale = 1; rotation = 0; this.position = position; @@ -29,6 +44,26 @@ public class DrawObject { { AffineTransform tx = getTransform(); g.drawImage(image, tx, null); + if(selected) { + g.setColor(Color.BLACK); + g.setStroke(new BasicStroke(7)); + rektAngle = new Rectangle2D.Double((int) position.getX(), (int) position.getY(), image.getWidth(null), image.getHeight(null)); + tx = getTransformRectangle(); + rektAngle.setFrame(tx.createTransformedShape(rektAngle).getBounds()); + g.draw(rektAngle); + g.setColor(Color.YELLOW); + upperLeftCorner = new Rectangle2D.Double(rektAngle.getX()-7,rektAngle.getY()-7,15,15); + upperRightCorner = new Rectangle2D.Double(rektAngle.getX() + rektAngle.getWidth()-8,rektAngle.getY()-7,15,15); + bottomLeftCorner = new Rectangle2D.Double(rektAngle.getX()-7,rektAngle.getY() + rektAngle.getHeight()-8,15,15); + bottomRightCorner = new Rectangle2D.Double(rektAngle.getX() + rektAngle.getWidth()-8,rektAngle.getY() + rektAngle.getHeight()-8,15,15); + g.fill(upperLeftCorner); //upperleft + g.fill(upperRightCorner); //upperright + g.fill(bottomLeftCorner); //bottomleft + g.fill(bottomRightCorner); //bottomright + g.setColor(Color.RED); + rotateDot = new Ellipse2D.Double((rektAngle.getX() + (rektAngle.getWidth()/2))-8,rektAngle.getY()-8,15,15); + g.fill(rotateDot); + } } protected AffineTransform getTransform() { @@ -38,14 +73,83 @@ public class DrawObject { tx.rotate(Math.toRadians(rotation), image.getWidth(null) / 2, image.getHeight(null) / 2); return tx; } + + protected AffineTransform getTransformSelection() { + AffineTransform tx = new AffineTransform(); + tx.scale(scale, scale); + tx.translate(position.getX(), position.getY()); + return tx; + } - public boolean contains(Point2D clickPoint) { - Shape shape = new Rectangle2D.Double(0,0,image.getWidth(null), image.getHeight(null)); - return getTransform().createTransformedShape(shape).contains(clickPoint); + /** + * Special transformation for the selection rectangle, because the translation of the image one places the rectangle translated from the image. + * @return affineTransform + */ + private AffineTransform getTransformRectangle() { + AffineTransform tx = new AffineTransform(); + tx.scale(scale, scale); + return tx; } - public void setSelected(boolean b) - { + public boolean contains(Point2D clickPoint) { + Shape shape; + if(rektAngle == null) { + shape = new Rectangle2D.Double(0,0,image.getWidth(null), image.getHeight(null)); + return getTransform().createTransformedShape(shape).contains(clickPoint); + } + else { + shape = new Rectangle2D.Double(-7,-7,image.getWidth(null)+7, image.getHeight(null)+7); + return getTransformSelection().createTransformedShape(shape).contains(clickPoint); + } + + } + + public Point2D getObjectPoint(Point2D point) { + try { + return getTransform().inverseTransform(point, null); + } catch (NoninvertibleTransformException e) { + e.printStackTrace(); + } + return null; + } + + /** + * This method checks if the place thats clicked is inside one of the corners. + * + * @param point + * @param corner + * @return if the clicked point is inside one of the corners + */ + public boolean containsCorner(Point2D point, int corner) { + Rectangle2D chosenCorner = null; + switch(corner) { + case 0: + chosenCorner = upperLeftCorner; + break; + case 1: + chosenCorner = upperRightCorner; + break; + case 2: + chosenCorner = bottomLeftCorner; + break; + case 3: + chosenCorner = bottomRightCorner; + break; + case 4: + if(point.getX() > rotateDot.getX() && point.getX() < rotateDot.getX() + rotateDot.getWidth() + && point.getY() > rotateDot.getY() && point.getY() < rotateDot.getY() + rotateDot.getHeight()) + return true; + else + return false; + } + if(point.getX() > chosenCorner.getX() && point.getX() < chosenCorner.getX() + chosenCorner.getWidth() + && point.getY() > chosenCorner.getY() && point.getY() < chosenCorner.getY() + chosenCorner.getHeight()) + return true; + else + return false; + } + + public void setSelected(boolean b) { selected = b; } @@ -85,5 +189,12 @@ public class DrawObject { return selected; } + public Rectangle2D getRectangle() { + return rektAngle; + } + + public void setRectangle(Rectangle2D rectangle) { + rektAngle = rectangle; + } } diff --git a/Applicatie/Panel.java b/Applicatie/Panel.java index 0270e30..ef248c8 100644 --- a/Applicatie/Panel.java +++ b/Applicatie/Panel.java @@ -4,6 +4,7 @@ import java.awt.Graphics2D; import java.awt.Point; import java.awt.TexturePaint; import java.awt.geom.AffineTransform; +import java.awt.geom.Ellipse2D; import java.awt.geom.NoninvertibleTransformException; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; @@ -18,67 +19,35 @@ import javax.swing.JPanel; import Listeners.Mouse; import Listeners.MouseMotion; import Listeners.MouseWheel; -import Objects.Entrance; -import Objects.Path; import Objects.Podium; -import Objects.Toilet; -import Objects.Wall; -@SuppressWarnings("serial") public class Panel extends JPanel { BufferedImage background; - BufferedImage podiumImage, toiletImage, entranceImage, pathImage,wallImage; - - private int panelInfox, panelInfoy,scrollfactor; - - private ArrayList panelInfo = new ArrayList(); -// private ArrayList panelTypes = new ArrayList(); ArrayList objects = new ArrayList<>(); DrawObject dragObject = null; + private DrawObject selectedObject; + private String clickedOption = "drag"; Point2D cameraPoint = new Point2D.Double(getWidth()/2,getHeight()/2); float cameraScale = 1; - PropertiesPanel pp; - Point2D lastClickPosition = new Point(0,0); Point lastMousePosition = new Point(0,0); - //how to nieuwe dingen aan het panel toe te voegen: - //maak bufferedimage global aan, voeg er een image aan toe, en voeg de image aan panelInfo toe en het object aan panelTypes. - //en maak een case statement die een new Object returnt in createNewDrawObject. - - - Panel(PropertiesPanel pp) + Panel() { - this.pp = pp; - pp.setPanel(this); try { background = ImageIO.read(new File("images/grass.jpg")); - podiumImage = ImageIO.read(new File("images/stageIcon.png")); - toiletImage = ImageIO.read(new File("images/wcIcon.png")); - entranceImage = ImageIO.read(new File("images/entranceIcon.png")); - pathImage = ImageIO.read(new File("images/pathIcon.png")); - wallImage = ImageIO.read(new File("images/wallIcon.png")); } catch (IOException e) { e.printStackTrace(); } - panelInfo.add(podiumImage); - panelInfo.add(toiletImage); - panelInfo.add(entranceImage); - panelInfo.add(pathImage); - panelInfo.add(wallImage); - panelInfox = 0; - panelInfoy = 0; - scrollfactor = 0; - -// objects.add(new Podium(new Point2D.Double(100, 100))); -// objects.add(new Podium(new Point2D.Double(500, 100))); -// objects.add(new Podium(new Point2D.Double(300, 400))); + objects.add(new Podium(new Point2D.Double(100, 100))); + objects.add(new Podium(new Point2D.Double(500, 100))); + objects.add(new Podium(new Point2D.Double(300, 400))); addMouseListener(new Mouse(this)); @@ -88,35 +57,6 @@ public class Panel extends JPanel { } - public int getPanelInfoLength() - { - int panelInfoLength = 0; - for(BufferedImage image : panelInfo) - { - panelInfoLength += image.getWidth(); - } - - return panelInfoLength; - } - - public DrawObject createNewDrawObject(int index) - { - switch(index) - { - case 0: - return new Podium(null); - case 1: - return new Toilet(null); - case 2: - return new Entrance(null); - case 3: - return new Path(null); - case 4: - return new Wall(null); - default: - return null; - } - } public void add(DrawObject dragObject) { @@ -127,30 +67,21 @@ public class Panel extends JPanel { { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; - g2.setClip(new Rectangle2D.Double(0,0, getWidth(), 300)); + g2.setClip(new Rectangle2D.Double(0,0, 200, getHeight())); -// g2.fill(new Ellipse2D.Double(0,0,300,300)); + g2.fill(new Ellipse2D.Double(0,0,300,300)); -// g2.drawImage(podiumImage, 0, 0, null); - for(BufferedImage image : panelInfo) - { - g2.drawImage(image, panelInfox + scrollfactor, panelInfoy, null); - panelInfox += image.getWidth(); - } - panelInfox = 0; - g2.setClip(new Rectangle2D.Double(0,150, getWidth(), getHeight())); + g2.setClip(new Rectangle2D.Double(200,0, getWidth()-200, getHeight())); AffineTransform oldTransform = g2.getTransform(); g2.setTransform(getCamera()); TexturePaint p = new TexturePaint(background, new Rectangle2D.Double(0, 0, 100, 100)); g2.setPaint(p); - g2.fill(new Rectangle2D.Double(-1920,-1080,3840,2160)); + g2.fill(new Rectangle2D.Double(0,0,1920,1080)); - for(DrawObject o : objects){ + for(DrawObject o : objects) o.draw(g2); - } - g2.setClip(null); @@ -161,7 +92,6 @@ public class Panel extends JPanel { AffineTransform tx = new AffineTransform(); tx.translate(-cameraPoint.getX() + getWidth()/2, -cameraPoint.getY() + getHeight()/2); tx.scale(cameraScale, cameraScale); - return tx; } @@ -174,24 +104,18 @@ public class Panel extends JPanel { return null; } - - public void setBackground(BufferedImage background) { this.background = background; } - - public ArrayList getObjects() { return objects; } - public void setObjects(ArrayList objects) { this.objects = objects; } - public DrawObject getDragObject() { return dragObject; } @@ -242,50 +166,22 @@ public class Panel extends JPanel { } - public BufferedImage getPodiumImage() { - return podiumImage; + public DrawObject getSelectedObject() { + return selectedObject; } - public void setPodiumImage(BufferedImage podiumImage) { - this.podiumImage = podiumImage; + public void setSelectedObject(DrawObject selectedObject) { + this.selectedObject = selectedObject; } - public ArrayList getPanelInfo() { - return panelInfo; + public String getClickedOption() { + return clickedOption; } - public void setPanelInfo(ArrayList panelInfo) { - this.panelInfo = panelInfo; + public void setClickedOption(String clickedOption) { + this.clickedOption = clickedOption; } - - - public int getScrollfactor() { - return scrollfactor; - } - - public void setScrollfactor(int scrollfactor) { - this.scrollfactor = scrollfactor; - } - - public int getPanelInfox() { - return panelInfox; - } - - public void setPanelInfox(int panelInfox) { - this.panelInfox = panelInfox; - } - - public PropertiesPanel getPP() - { - return pp; - } - - public void update() - { - repaint(); - } - } diff --git a/Applicatie/Window.java b/Applicatie/Window.java index e22ee95..dbb87c3 100644 --- a/Applicatie/Window.java +++ b/Applicatie/Window.java @@ -17,10 +17,8 @@ public class Window extends JFrame { //CONTENT PANELS JPanel contentPanel = new JPanel(new BorderLayout()); - PropertiesPanel pp = new PropertiesPanel(); - Panel fp = new Panel(pp); + Panel fp = new Panel(); contentPanel.add(fp, BorderLayout.CENTER); - contentPanel.add(pp, BorderLayout.EAST); setContentPane(contentPanel); //END CONTENT PANELS diff --git a/Listeners/Mouse.java b/Listeners/Mouse.java index e6993aa..7c47296 100644 --- a/Listeners/Mouse.java +++ b/Listeners/Mouse.java @@ -3,69 +3,85 @@ package Listeners; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; -import java.awt.image.BufferedImage; -import java.util.Iterator; -import java.util.Map; import Applicatie.DrawObject; import Applicatie.Panel; import Objects.Podium; +import Objects.Toilet; +import Applicatie.Panel; public class Mouse extends MouseAdapter { private Panel panel; + private DrawObject selectedObject; public Mouse(Panel panel) { this.panel = panel; + selectedObject = null; } public void mousePressed(MouseEvent e) { Point2D clickPoint = panel.getClickPoint(e.getPoint()); panel.setLastClickPosition(clickPoint); panel.setLastMousePosition(e.getPoint()); - if(e.getY() < 150) + + if(e.getX() < 200) { -// if(e.getX() < 51) //51 = width podium image -// panel.setDragObject(new Podium(clickPoint)); -// else -// panel.setDragObject(new Toilet(clickPoint)); - int i = 0; - int last = 0; - for(BufferedImage image : panel.getPanelInfo()) - { - if(e.getX() >= panel.getScrollfactor() && e.getX() < last + image.getWidth() + panel.getScrollfactor()) - { - DrawObject tempDrawObj = panel.createNewDrawObject(i); - tempDrawObj.setPosition(clickPoint); - panel.setDragObject(tempDrawObj); - break; - } - i++; - last += image.getWidth(); - - } - if(panel.getDragObject() != null) - { - panel.add(panel.getDragObject()); - } + if(e.getY() < 300) + panel.setDragObject(new Podium(clickPoint)); + else + panel.setDragObject(new Toilet(clickPoint)); + panel.add(panel.getDragObject()); } else { for(DrawObject o : panel.getObjects()) - { - if(o.contains(clickPoint)) - { + if(o.contains(clickPoint)) { + if(o == selectedObject) { + boolean upperLeft = o.containsCorner(clickPoint,0); + boolean upperRight = o.containsCorner(clickPoint,1); + boolean bottomLeft = o.containsCorner(clickPoint,2); + boolean bottomRight = o.containsCorner(clickPoint,3); + boolean rotate = o.containsCorner(clickPoint,4); + if(upperLeft) { + panel.setClickedOption("upperLeft"); + } + else if(upperRight) { + panel.setClickedOption("upperRight"); + } + else if(bottomLeft) { + panel.setClickedOption("bottomLeft"); + } + else if(bottomRight) { + panel.setClickedOption("bottomRight"); + } + else if(rotate) { + panel.setClickedOption("rotate"); + } + else { + panel.setClickedOption("drag"); + } + } + if(selectedObject != null) + selectedObject.setSelected(false); panel.setDragObject(o); - panel.getPP().setSelected(o); - return; + o.setSelected(true); + selectedObject = o; } - } - panel.getPP().clearSelected(); } + if(panel.getDragObject() == null && selectedObject != null) { + System.out.println("deselected"); + selectedObject.setSelected(false); + selectedObject = null; + } + panel.repaint(); } + public void mouseReleased(MouseEvent e) { panel.setDragObject(null); + panel.setClickedOption("drag"); + panel.repaint(); } } diff --git a/Listeners/MouseMotion.java b/Listeners/MouseMotion.java index 66def0f..d6563ed 100644 --- a/Listeners/MouseMotion.java +++ b/Listeners/MouseMotion.java @@ -1,13 +1,8 @@ package Listeners; -import Applicatie.Panel; - import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.geom.Point2D; -import javax.swing.JPanel; -import javax.swing.SwingUtilities; - import Applicatie.Panel; public class MouseMotion extends MouseMotionAdapter { @@ -21,33 +16,75 @@ public class MouseMotion extends MouseMotionAdapter { public void mouseDragged(MouseEvent e) { Point2D clickPoint = panel.getClickPoint(e.getPoint()); - if(panel.getDragObject() != null) - { - if(SwingUtilities.isLeftMouseButton(e)){ - - - panel.getDragObject().setPosition(new Point2D.Double( - panel.getDragObject().getPosition().getX() - (panel.getLastClickPosition().getX() - clickPoint.getX()), - panel.getDragObject().getPosition().getY() - (panel.getLastClickPosition().getY() - clickPoint.getY()))); + if(panel.getDragObject() != null) { + Point2D objectPoint = panel.getDragObject().getObjectPoint(panel.getDragObject().getPosition()); + switch(panel.getClickedOption()) { + case "drag": + if(panel.getDragObject() != null) + panel.getDragObject().setPosition(new Point2D.Double( + (panel.getDragObject().getPosition().getX() ) - ((panel.getLastClickPosition().getX() - clickPoint.getX()) ), + (panel.getDragObject().getPosition().getY()) - (panel.getLastClickPosition().getY() - clickPoint.getY()) )); + break; + case "upperLeft": + if(clickPoint.getX() < panel.getDragObject().getPosition().getX() && clickPoint.getY() < panel.getDragObject().getPosition().getY()) { + resizeBigger(); + } + else if (clickPoint.getX() > panel.getDragObject().getPosition().getX() && clickPoint.getY() > panel.getDragObject().getPosition().getY()) { + resizeSmaller(); + } + break; + case "upperRight": + if(clickPoint.getX() > panel.getDragObject().getRectangle().getX() + panel.getDragObject().getRectangle().getWidth() && clickPoint.getY() < panel.getDragObject().getRectangle().getY()) { + resizeBigger(); + } + else if (clickPoint.getX() < panel.getDragObject().getRectangle().getX() + panel.getDragObject().getRectangle().getWidth() && clickPoint.getY() > panel.getDragObject().getRectangle().getY()) { + resizeSmaller(); + } + break; + case "bottomLeft": + if(clickPoint.getX() < panel.getDragObject().getRectangle().getX() && clickPoint.getY() > panel.getDragObject().getRectangle().getY() + panel.getDragObject().getRectangle().getHeight()) { + resizeBigger(); + } + else if (clickPoint.getX() > panel.getDragObject().getRectangle().getX() && clickPoint.getY() < panel.getDragObject().getRectangle().getY() + panel.getDragObject().getRectangle().getHeight()) { + resizeSmaller(); + } + break; + case "bottomRight": + if(clickPoint.getX() > panel.getDragObject().getRectangle().getX() + panel.getDragObject().getRectangle().getWidth() && clickPoint.getY() > panel.getDragObject().getRectangle().getY() + panel.getDragObject().getRectangle().getHeight()) { + resizeBigger(); + } + else if (clickPoint.getX() < panel.getDragObject().getRectangle().getX() + panel.getDragObject().getRectangle().getWidth() && clickPoint.getY() < panel.getDragObject().getRectangle().getY() + panel.getDragObject().getRectangle().getHeight()) { + resizeSmaller(); + } + break; + case "rotate": + double tempval = panel.getDragObject().getRotation() + (panel.getLastClickPosition().getX() - clickPoint.getX()); + panel.getDragObject().setRotation(tempval); + break; } - else - { - - double tempval = panel.getDragObject().getRotation() + (panel.getLastClickPosition().getX() - clickPoint.getX()); - panel.getDragObject().setRotation(tempval); - } - panel.repaint(); } - else - { + else { panel.setCameraPoint(new Point2D.Double( - panel.getCameraPoint().getX() + (panel.getLastMousePosition().getX() - e.getX()), - panel.getCameraPoint().getY() + (panel.getLastMousePosition().getY() - e.getY()) - )); - panel.repaint(); - } + panel.getCameraPoint().getX() + (panel.getLastMousePosition().getX() - e.getX()), + panel.getCameraPoint().getY() + (panel.getLastMousePosition().getY() - e.getY()) + )); + } + panel.repaint(); panel.setLastMousePosition(e.getPoint()); panel.setLastClickPosition(clickPoint); - panel.getPP().update(); + } + + private void resizeBigger() { + double scale = panel.getDragObject().getScale()*1 + 0.02; + panel.getDragObject().setScale(scale); + panel.getDragObject().setPosition(new Point2D.Double(panel.getDragObject().getPosition().getX()-2,panel.getDragObject().getPosition().getY()-2)); + } + + private void resizeSmaller() { + if(panel.getDragObject().getScale() > 0.2) { + double scale = panel.getDragObject().getScale()*1 - 0.02; + panel.getDragObject().setScale(scale); + panel.getDragObject().setPosition(new Point2D.Double(panel.getDragObject().getPosition().getX()+2,panel.getDragObject().getPosition().getY()+2)); + } } } diff --git a/Listeners/MouseWheel.java b/Listeners/MouseWheel.java index 1b9269c..b3221da 100644 --- a/Listeners/MouseWheel.java +++ b/Listeners/MouseWheel.java @@ -9,58 +9,16 @@ import Applicatie.Panel; public class MouseWheel implements MouseWheelListener { private Panel panel; - private int scrollfactor; - + public MouseWheel(Panel panel) { this.panel = panel; - scrollfactor = 20; } - - public void mouseWheelMoved(MouseWheelEvent e) { - Point2D clickPoint = panel.getClickPoint(e.getPoint()); - for(DrawObject o : panel.getObjects()) - { - if(o.contains(clickPoint)) - { - double scale = o.getScale()* 1 + (e.getPreciseWheelRotation()/10.0); - o.setScale(scale); - panel.getPP().update(); - panel.repaint(); - return; - } - } - - if(e.getY() < 150) - { - - if(e.getPreciseWheelRotation() < 0) - { - if(panel.getScrollfactor() + scrollfactor + panel.getPanelInfoLength() < panel.getWidth()) - { - panel.setScrollfactor(panel.getScrollfactor() + scrollfactor); - } - - } - else - { - if(panel.getScrollfactor() - scrollfactor >= 0) - { - panel.setScrollfactor(panel.getScrollfactor() - scrollfactor); - } - - } - - } - else - { - // cameraPoint - double cameraScale = panel.getCameraScale() * 1 - (e.getPreciseWheelRotation()/10); - panel.setCameraScale((float) cameraScale); - - } - - + + public void mouseWheelMoved(MouseWheelEvent e) { +// cameraPoint + double cameraScale = panel.getCameraScale() * 1 - (e.getPreciseWheelRotation()/10); + panel.setCameraScale((float) cameraScale); panel.repaint(); } } diff --git a/Objects/Toilet.java b/Objects/Toilet.java index 162b4d7..bbba72c 100644 --- a/Objects/Toilet.java +++ b/Objects/Toilet.java @@ -7,7 +7,7 @@ import Applicatie.DrawObject; public class Toilet extends DrawObject { public Toilet(Point2D position) { - super("images/wc.png", position); + super("images/toilet.png", position); } }