|
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;
}
}