/* * This file is part of Caliph & Emir. * * Caliph & Emir is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Caliph & Emir 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 Caliph & Emir; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Copyright statement: * -------------------- * (c) 2005 by Werner Klieber (werner@klieber.info) * http://caliph-emir.sourceforge.net */ package at.wklieber.gui; import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; public class IDot extends IComponent { private static java.util.logging.Logger cat = java.util.logging.Logger.getLogger(IDot.class.getName()); public static final int DEFAULT_DOT_SIZE = 10; //private static Console console = Console.getReference(); // By default the point position is seen as the center of the box. // these constansts can be used to move this position to a border. // e.g. MOVE_UP_LEFT means the upper left corner public static final int DOT_CENTER = 0; public static final int DOT_UP = 1; public static final int DOT_DOWN = 2; public static final int DOT_LEFT = 3; public static final int DOT_RIGHT = 4; public static final int DOT_UP_LEFT = 5; public static final int DOT_UP_RIGHT = 6; public static final int DOT_DOWN_LEFT = 7; public static final int DOT_DOWN_RIGHT = 8; public static final int DOT_NONE = 9; // use this do avoid setting the position automatically //private int componentSize_ = DEFAULT_DOT_SIZE; // default size of the dot private int dotPosInParent = DOT_CENTER; // define to which positio in the shape the dot corresponds to private int dotPos = DOT_CENTER; // on which border side does this dot lie on on the parent rectangle public int getId() { return id; } public void setId(int id) { this.id = id; } // optional id that can be set from the parent. // used in IShape to identify which point has been moved private int id = 0; /** * Constructor for IColorRectangle as parent */ public IDot(JPanel drawPanel1, IComponent parent1, Color drawColor1, Color backgroundColor1, int dotPosInParent1) { init(drawPanel1, parent1, 0, 0, drawColor1, backgroundColor1, false, true, false, false, dotPosInParent1, dotPosInParent1); } /** * Constructor for IShape as parent: set the position */ public IDot(JPanel drawPanel1, IComponent parent1, int posX1, int posY1, Color drawColor1, Color backgroundColor1) { init(drawPanel1, parent1, posX1, posY1, drawColor1, backgroundColor1, false, true, false, false, DOT_CENTER, DOT_NONE); } private void init(JPanel drawPanel1, IComponent parent1, int posX1, int posY1, Color drawColor1, Color backgroundColor1, boolean resizeable1, boolean isMoveable1, boolean selected1, boolean doDnd1, int dotPos1, int dotPosInParent1) { dotPos = dotPos1; Point pos = correctPointPos(posX1, posY1); componentMinSize = DEFAULT_DOT_SIZE; super.init(drawPanel1, parent1, (int) pos.getX(), (int) pos.getY(), DEFAULT_DOT_SIZE, DEFAULT_DOT_SIZE, drawColor1, backgroundColor1, resizeable1, isMoveable1, selected1, doDnd1, ""); componentMinSize = DEFAULT_DOT_SIZE; //parent = parent1; // DOTO : if parent is null, an exception should dotPosInParent = dotPosInParent1; //cat.fine("Dot: " + dotPos + ", in Parent: " + dotPosInParent + ", " + posX1 + ", " + posY1); // set the boundary relative to the edge setBoundaryByParent(); validate(); repaint(); } // override public void setDoShow(boolean doShow1) { super.setDoShow(doShow1); if (doShow1) { this.boundary.setSize(MIN_SIZE, MIN_SIZE); } else { this.boundary.setSize(0, 0); } } // get the coordinate of the dot from the parent border // if parent is null, nothing is done // if dotPosInPartent is one of the recangle postion (DOT_LEFT, ...) the bounds are set // relative to it (used in IRectangle) // if dotPosInPartent = DOT_NONE, the origin of the coordinate system is the upper // left corner of the parent (0,0) private void setBoundaryByParent() { Point dot = new Point(0, 0); if ((parent == null) || (dotPosInParent == DOT_NONE)) return; Rectangle rect = parent.getComponentBounds(); int x = (int) rect.getX(); int xMid = (int) (x + rect.getWidth() / 2); int xFull = (int) (x + rect.getWidth()); int y = (int) rect.getY(); int yMid = (int) (y + rect.getHeight() / 2); int yFull = (int) (y + rect.getHeight()); switch (dotPosInParent) { case DOT_CENTER: dot.setLocation(xMid, yMid); break; case DOT_UP_LEFT: dot.setLocation(x, y); break; case DOT_UP: dot.setLocation(xMid, y); break; case DOT_UP_RIGHT: dot.setLocation(xFull, y); break; case DOT_RIGHT: dot.setLocation(xFull, yMid); break; case DOT_DOWN_RIGHT: dot.setLocation(xFull, yFull); break; case DOT_DOWN: dot.setLocation(xMid, yFull); break; case DOT_DOWN_LEFT: dot.setLocation(x, yFull); break; case DOT_LEFT: dot.setLocation(x, yMid); break; } // end switch Point correctedPoint = correctPointPos((int) dot.getX(), (int) dot.getY()); boundary = new Rectangle((int) correctedPoint.getX(), (int) correctedPoint.getY(), DEFAULT_DOT_SIZE, DEFAULT_DOT_SIZE); //cat.fine("after corr: " + boundary.toString()); } private Point correctPointPos(int x1, int y1) { //cat.fine("IDOT pos x: " + x1 + ", y: " + y1 + ", move: " + dotPosInParent); if ((dotPos == DOT_UP) || (dotPos == DOT_DOWN) || (dotPos == DOT_CENTER)) { x1 -= DEFAULT_DOT_SIZE / 2; } else if ((dotPos == DOT_UP_RIGHT) || (dotPos == DOT_RIGHT) || (dotPos == DOT_DOWN_RIGHT)) { x1 -= DEFAULT_DOT_SIZE; } if ((dotPos == DOT_LEFT) || (dotPos == DOT_CENTER) || (dotPos == DOT_RIGHT)) { y1 -= DEFAULT_DOT_SIZE / 2; } else if ((dotPos == DOT_DOWN_LEFT) || (dotPos == DOT_DOWN) || (dotPos == DOT_DOWN_RIGHT)) { y1 -= DEFAULT_DOT_SIZE; } //cat.fine("new pos x: " + x1 + ", y: " + y1); return new Point(x1, y1); } private Point unCorrectPointPos(int x1, int y1) { //cat.fine("IDOT pos x: " + x1 + ", y: " + y1 + ", move: " + cursorPos); if ((dotPos == DOT_UP) || (dotPos == DOT_DOWN) || (dotPos == DOT_CENTER)) { x1 += DEFAULT_DOT_SIZE / 2; } else if ((dotPos == DOT_UP_RIGHT) || (dotPos == DOT_RIGHT) || (dotPos == DOT_DOWN_RIGHT)) { x1 += DEFAULT_DOT_SIZE; } if ((dotPos == DOT_LEFT) || (dotPos == DOT_CENTER) || (dotPos == DOT_RIGHT)) { y1 += DEFAULT_DOT_SIZE / 2; } else if ((dotPos == DOT_DOWN_LEFT) || (dotPos == DOT_DOWN) || (dotPos == DOT_DOWN_RIGHT)) { y1 += DEFAULT_DOT_SIZE; } //cat.fine("new pos x: " + x1 + ", y: " + y1); return new Point(x1, y1); } protected void drawComponent(Graphics2D g2) { //Graphics2D g2 = (Graphics2D) g; g2.setPaint(drawColor); setBoundaryByParent(); Rectangle thisRect; thisRect = this.getBounds(); g2.fill3DRect((int) boundary.getX(), (int) boundary.getY(), (int) boundary.getWidth() - 1, (int) boundary.getHeight() - 1, true); } // end method paint // this method is for visualizing when the component is under the mouse-pointer protected void drawMouseOver(Graphics2D g2) { if (isMouseOverComponent) { Color borderColor; borderColor = java2dTools.getContrastColor(backgroundColor); g2.setPaint(borderColor); g2.draw3DRect((int) boundary.getX(), (int) boundary.getY(), (int) boundary.getWidth() - 1, (int) boundary.getHeight() - 1, false); g2.draw3DRect((int) boundary.getX() - 1, (int) boundary.getY() - 1, (int) boundary.getWidth() + 1, (int) boundary.getHeight() + 1, false); //g2.draw3DRect((int) boundary.getX() - 2, (int) boundary.getY() - 2, (int) boundary.getWidth() + 3, (int) boundary.getHeight() + 3, false); } } /* public int getComponentSize_() { return DEFAULT_DOT_SIZE; } public void setComponentSize_(int componentSize_) { this.DEFAULT_DOT_SIZE = componentSize_; }*/ // end building a shape on a right-click public void mouseClicked(MouseEvent e) { // if a right mouse button in a shape is clicked // and shape is in build mode, the shape has to be informed if (SwingUtilities.isRightMouseButton(e)) { if ((parent != null) && (IShape.class.isInstance(parent))) { IShape shape = (IShape) parent; shape.endDoBuildShape(); return; } } super.mouseClicked(e); } public void mouseDragged(MouseEvent e) { super.mouseDragged(e); if (SwingUtilities.isLeftMouseButton(e)) { // inform the parent of the update //cat.fine(" update parent" + this.getComponentBounds().toString()); if (parent != null) { parent.updateParent(this); } } } public Point getComponentPoint() { return unCorrectPointPos((int) boundary.getX(), (int) boundary.getY()); } public void setComponentPoint(Point point1) { Point newPoint = correctPointPos((int) point1.getX(), (int) point1.getY()); boundary.setBounds((int) newPoint.getX(), (int) newPoint.getY(), DEFAULT_DOT_SIZE, DEFAULT_DOT_SIZE); } public int getDotPosInParent() { return dotPosInParent; } public String toString() { return "Pos: " + boundary.toString(); } }