C:\home\java\src\jguitest\ShapesTest.java

/* 
 * Copyright (c) 2004 imagero Andrei Kouznetsov. All Rights Reserved. 
 * http://jgui.imagero.com 
 * 
 * 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 2, 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, write to the Free Software 
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
 */ 
package jguitest; 
 
import com.imagero.gui.flowin.util.SharedDragHandler; 
import com.imagero.gui.swing.JShape; 
import com.imagero.gui.swing.PaintConfig; 
import com.imagero.gui.swing.ScrollPaneNavigator; 
import com.imagero.gui.swing.ShapeUnit; 
import com.imagero.gui.swing.Shapes; 
 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.geom.AffineTransform; 
import java.awt.geom.Area; 
import java.awt.geom.NoninvertibleTransformException; 
 
public class ShapesTest extends JApplet { 
 
    public void init() { 
        int size = 24; 
        int shapeSize = 200; 
        Area[] shapes; 
 
        JPanel panel = new JPanel(null); 
        panel.setPreferredSize(new Dimension(800, 600)); 
        JScrollPane jsp = new JScrollPane(panel); 
        getContentPane().add(jsp); 
        new ScrollPaneNavigator(jsp); 
 
        try { 
            shapes = createShapes(size, shapeSize); 
            JShape[] components = createComponents(shapes, shapeSize); 
            for (int i = 0; i < components.length; i++) { 
                panel.add(components[i]); 
            } 
        } 
        catch (NoninvertibleTransformException ex) { 
            ex.printStackTrace(); 
        } 
    }
public static void main(String[] args) throws NoninvertibleTransformException { int size = 24; int shapeSize = 200; Area[] shapes = createShapes(size, shapeSize); final JShape[] components = createComponents(shapes, shapeSize); final JFrame frame = new JFrame(); JDialog dialog = new JDialog(frame); final JTextField rotateField = new JTextField("0", 5); final JTextField shearField = new JTextField("0", 5); final JTextField scaleField = new JTextField("0", 5); dialog.getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5)); dialog.getContentPane().add(new JLabel("rotate:")); dialog.getContentPane().add(rotateField); dialog.getContentPane().add(new JLabel("shear:")); dialog.getContentPane().add(shearField); dialog.getContentPane().add(new JLabel("scale:")); dialog.getContentPane().add(scaleField); rotateField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String text = rotateField.getText(); try { int angle = Integer.parseInt(text); for (int i = 0; i < components.length; i++) { JShape component = components[i]; component.setRotate(angle); component.setSize(component.getPreferredSize()); } frame.repaint(); } catch(NumberFormatException ex) { ex.printStackTrace(); } } }); shearField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String text = shearField.getText(); try { double shear = Double.parseDouble(text); double shearX = Math.floor(shear) / 10.0; double shearY = shear - shearX * 10; for (int i = 0; i < components.length; i++) { JShape component = components[i]; component.setShear(shearX, shearY); component.setSize(component.getPreferredSize()); } frame.repaint(); } catch(NumberFormatException ex) { } } }); scaleField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String text = scaleField.getText(); try { double scale = Double.parseDouble(text); for (int i = 0; i < components.length; i++) { JShape component = components[i]; component.setScale(scale, scale); component.setSize(component.getPreferredSize()); } frame.repaint(); } catch(NumberFormatException ex) { } } }); frame.getContentPane().setBackground(Color.white); JPanel panel = new JPanel(null); panel.setPreferredSize(new Dimension(800, 600)); JScrollPane jsp = new JScrollPane(panel); frame.getContentPane().add(jsp); new ScrollPaneNavigator(jsp); for (int i = 0; i < components.length; i++) { panel.add(components[i]); } frame.setSize(820, 620); frame.setVisible(true); dialog.pack(); dialog.setVisible(true); }
private static JShape[] createComponents(Area[] shapes, int shapeSize) { JShape[] components = new JShape[shapes.length]; SharedDragHandler dh = SharedDragHandler.getInstance(); int x = 0, y = 0; for (int i = 0; i < components.length; i++) { ShapeUnit unit = new ShapeUnit(shapes[i]); AffineTransform at2 = AffineTransform.getScaleInstance(0.5, 0.5); Rectangle r = shapes[i].getBounds(); at2.translate(r.width / 2, r.height / 2); components[i] = new JShape(new ShapeUnit[]{unit/*, unit2*/}) { public String getToolTipText() { Rectangle r = getBounds(); return new String(getName() + " [" + r.x + " " + r.y + " " + r.width + " " + r.height + "]"); } }; components[i].setName("" + i); components[i].setAlpha(0.5f); components[i].setLocation(x, y); x += shapeSize; if (x > 800) { x = 0; y += shapeSize; } final Color color1 = new Color((i * 20) & 0xFF, (i * 30) & 0xFF, i * 10); components[i].getShapeUnit(0).setPaintConfig(new PaintConfig(color1)); components[i].getShapeUnit(0).setPaintConfigBorder(new PaintConfig(Color.red)); components[i].getShapeUnit(0).setStroke(new BasicStroke(2, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); components[i].getShapeUnit(0).setDrawShapeOutline(true); components[i].setRotate(90); Dimension preferredSize = components[i].getPreferredSize(); components[i].setSize(preferredSize); ToolTipManager.sharedInstance().registerComponent(components[i]); components[i].putClientProperty("isSelected", Boolean.TRUE); dh.register(components[i]); } return components; }
String[] names =
new String[]{ "rect", "roundRect", "circle", "isoscelesTriangle.NORTH", "isoscelesTriangle.SOUTH", "isoscelesTriangle.WEST", "isoscelesTriangle.EAST", "rightArrow.NORTH", "rightArrow.SOUTH", "rightArrow.EAST", "rightArrow.WEST", "equilateralTriangle.NORTH", "equilateralTriangle.SOUTH", "equilateralTriangle.EAST", "equilateralTriangle.WEST", "rightTriangle.NORTH", "rightTriangle.SOUTH", "rightTriangle.EAST", "rightTriangle.WEST", "circle", "twinRightArrow.NORTH", "twinRightArrow.EAST", "quadRightArrow" };
private static Area[] createShapes(int count, int shapeSize) throws NoninvertibleTransformException { Area[] shapes = new Area[count]; shapes[0] = Shapes.createRect(shapeSize); shapes[1] = Shapes.createRoundRect(shapeSize); shapes[2] = Shapes.createCircle(shapeSize); shapes[3] = Shapes.createIsoscelesTriangle(shapeSize, Shapes.NORTH); shapes[4] = Shapes.createIsoscelesTriangle(shapeSize, Shapes.SOUTH); shapes[5] = Shapes.createIsoscelesTriangle(shapeSize, Shapes.WEST); shapes[6] = Shapes.createIsoscelesTriangle(shapeSize, Shapes.EAST); shapes[7] = Shapes.createRightArrow(shapeSize / 3, shapeSize, Shapes.NORTH); shapes[8] = Shapes.createRightArrow(shapeSize / 3, shapeSize, Shapes.SOUTH); shapes[9] = Shapes.createRightArrow(shapeSize / 3, shapeSize, Shapes.EAST); shapes[10] = Shapes.createRightArrow(shapeSize / 3, shapeSize, Shapes.WEST); shapes[11] = Shapes.createEquilateralTriangle(shapeSize, Shapes.NORTH); shapes[12] = Shapes.createEquilateralTriangle(shapeSize, Shapes.SOUTH); shapes[13] = Shapes.createEquilateralTriangle(shapeSize, Shapes.EAST); shapes[14] = Shapes.createEquilateralTriangle(shapeSize, Shapes.WEST); shapes[15] = Shapes.createRightTriangle(shapeSize, Shapes.NORTH); shapes[16] = Shapes.createRightTriangle(shapeSize, Shapes.SOUTH); shapes[17] = Shapes.createRightTriangle(shapeSize, Shapes.EAST); shapes[18] = Shapes.createRightTriangle(shapeSize, Shapes.WEST); shapes[19] = Shapes.createCircle(shapeSize); shapes[21] = Shapes.createTwinRightArrow(shapeSize / 3, shapeSize, Shapes.NORTH); shapes[22] = Shapes.createTwinRightArrow(shapeSize / 3, shapeSize, Shapes.EAST); shapes[23] = Shapes.createQuadRightArrow(shapeSize / 3, shapeSize); Rectangle r0 = shapes[19].getBounds(); Point p = Shapes.computeMedian(shapes[11]); Area a = Shapes.createCircle(p.x - 10, p.y - 10, 20); shapes[11].subtract(a); // shapes[19].subtract(shapes[11]); int diffx = p.x; int diffy = p.y; final AffineTransform translateInstance = AffineTransform.getTranslateInstance(r0.width / 2 - diffx, r0.height / 2 - diffy); shapes[11].transform(translateInstance); shapes[19].subtract(shapes[11]); shapes[11].transform(translateInstance.createInverse()); shapes[20] = Shapes.createCircle(shapeSize); for (int i = 0; i < shapes.length; i++) { Area shape = shapes[i]; if (shape != null) { Rectangle r2 = shape.getBounds(); Area area0 = Shapes.createCruz(r2.x, r2.y, r2.width, r2.height, 4); shape.subtract(area0); } } return shapes; } }