import vix.*; import java.awt.*; import java.awt.geom.*; import java.awt.event.*; import java.awt.image.*; import java.util.*; import javax.swing.*; public class Cubica extends Desenho { private static final String NOME = "Cubica"; private static final float MARGEM = 5; protected static JPopupMenu popup; static { popup = new JPopupMenu(NOME); final JMenuItem item1 = new JMenuItem("Info"); item1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { JPopupMenu popup = (JPopupMenu)item1.getParent(); Cubica cubica = (Cubica)popup.getClientProperty(DESENHO); String msg = "Cubica: "+cubica.cubica; JOptionPane.showMessageDialog(null, msg, "Descrição", JOptionPane.INFORMATION_MESSAGE); } }); popup.add(item1); } protected CubicCurve2D cubica; protected Shape contorno; public Cubica(Point2D[] pontos) { this(pontos[0], pontos[1], pontos[2], pontos[3]); } public Cubica(Point2D p1, Point2D cp1, Point2D cp2, Point2D p2) { cubica = new CubicCurve2D.Float(); cubica.setCurve(p1, cp1, cp2, p2); atualizaNome(); } protected void atualizaContorno() { Stroke s = vs.getGraphics2D().getStroke(); contorno = s.createStrokedShape(cubica); } protected void atualizaNome() { String p1 = "("+cubica.getX1()+","+cubica.getY1()+")"; String c1 = "("+cubica.getCtrlX1()+","+cubica.getCtrlY1()+")"; String c2 = "("+cubica.getCtrlX2()+","+cubica.getCtrlY2()+")"; String p2 = "("+cubica.getX2()+","+cubica.getY2()+")"; nome = NOME+" ["+p1+","+c1+","+c2+","+p2+"]"; } public Rectangle2D getBounds2D() { return cubica.getBounds2D(); } public TypeVO pick(Point2D pt) { float x = (float)pt.getX()-MARGEM; float y = (float)pt.getY()-MARGEM; float w = 2*MARGEM; float h = 2*MARGEM; if (contorno == null) atualizaContorno(); if (contorno.intersects(x,y,w,h)) return this; return null; } public void callbackRepaint(Graphics2D g) { g.setColor(Color.black); g.draw(cubica); } public boolean msgHandlerVO(Message msg) { if (msg instanceof ExibePopupElementoMsg) { exibePopup(popup, (ExibePopupElementoMsg)msg); return true; } return super.msgHandlerVO(msg); } public boolean move(float dx, float dy) { float x1 = (float)cubica.getX1()+dx; float y1 = (float)cubica.getY1()+dy; float cx1 = (float)cubica.getCtrlX1()+dx; float cy1 = (float)cubica.getCtrlY1()+dy; float cx2 = (float)cubica.getCtrlX2()+dx; float cy2 = (float)cubica.getCtrlY2()+dy; float x2 = (float)cubica.getX2()+dx; float y2 = (float)cubica.getY2()+dy; cubica.setCurve(x1,y1, cx1,cy1, cx2,cy2, x2,y2); atualizaContorno(); atualizaNome(); return true; } public void desenhaRascunho(Graphics2D g) { g.setColor(Color.black); g.draw(cubica); } public void marcaControles(Graphics2D g) { g.setColor(Color.blue); float x = (float)cubica.getX1(); float y = (float)cubica.getY1(); g.draw(new Rectangle2D.Float(x-MARGEM/2, y-MARGEM/2, MARGEM, MARGEM)); x = (float)cubica.getCtrlX1(); y = (float)cubica.getCtrlY1(); g.draw(new Rectangle2D.Float(x-MARGEM/2, y-MARGEM/2, MARGEM, MARGEM)); x = (float)cubica.getCtrlX2(); y = (float)cubica.getCtrlY2(); g.draw(new Rectangle2D.Float(x-MARGEM/2, y-MARGEM/2, MARGEM, MARGEM)); x = (float)cubica.getX2(); y = (float)cubica.getY2(); g.draw(new Rectangle2D.Float(x-MARGEM/2, y-MARGEM/2, MARGEM, MARGEM)); } public int pegaControle(Point2D pt) { if (cubica.getP1().distance(pt) <= MARGEM) return 0; if (cubica.getCtrlP1().distance(pt) <= MARGEM) return 1; if (cubica.getCtrlP2().distance(pt) <= MARGEM) return 2; if (cubica.getP2().distance(pt) <= MARGEM) return 3; return -1; } public void desenhaRascunho(Graphics2D g, int controle, Point2D pt) { Point2D p = null; switch (controle) { case 0 : p = cubica.getP1(); break; case 1 : p = cubica.getCtrlP1(); break; case 2 : p = cubica.getCtrlP2(); break; case 3 : p = cubica.getP2(); break; default : // Not reached. System.out.println("Cubica: desenhaRascunho de "+controle+"?"); return; } g.setColor(Color.black); mudaControle(controle, pt); g.draw(cubica); mudaControle(controle, p); } public void mudaControle(int controle, Point2D pt) { float x1 = (float)cubica.getX1(); float y1 = (float)cubica.getY1(); float cx1 = (float)cubica.getCtrlX1(); float cy1 = (float)cubica.getCtrlY1(); float cx2 = (float)cubica.getCtrlX2(); float cy2 = (float)cubica.getCtrlY2(); float x2 = (float)cubica.getX2(); float y2 = (float)cubica.getY2(); switch (controle) { case 0 : x1 = (float)pt.getX(); y1 = (float)pt.getY(); break; case 1 : cx1 = (float)pt.getX(); cy1 = (float)pt.getY(); break; case 2 : cx2 = (float)pt.getX(); cy2 = (float)pt.getY(); break; case 3 : x2 = (float)pt.getX(); y2 = (float)pt.getY(); break; default : // Not reached. System.out.println("Cubica: mudaControle de "+controle+"?"); return; } cubica.setCurve(x1,y1, cx1,cy1, cx2,cy2, x2,y2); atualizaContorno(); atualizaNome(); } }