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 Linha extends Desenho { private static final String NOME = "Linha"; 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(); Linha linha = (Linha)popup.getClientProperty(DESENHO); String msg = "Linha: "+linha.linha; JOptionPane.showMessageDialog(null, msg, "Descrição", JOptionPane.INFORMATION_MESSAGE); } }); popup.add(item1); } protected Line2D linha; public Linha(Point2D[] pontos) { this(pontos[0], pontos[1]); } public Linha(Point2D p1, Point2D p2) { linha = new Line2D.Float(p1, p2); atualizaNome(); } protected void atualizaNome() { String p1 = "("+linha.getX1()+","+linha.getY1()+")"; String p2 = "("+linha.getX2()+","+linha.getY2()+")"; nome = NOME+" ["+p1+","+p2+"]"; } public Rectangle2D getBounds2D() { return linha.getBounds2D(); } public TypeVO pick(Point2D pt) { if (linha.ptSegDist(pt) <= MARGEM) return this; return null; } public void callbackRepaint(Graphics2D g) { g.setColor(Color.black); g.draw(linha); } 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) { linha.setLine(linha.getX1()+dx, linha.getY1()+dy, linha.getX2()+dx, linha.getY2()+dy); atualizaNome(); return true; } public void desenhaRascunho(Graphics2D g) { g.setColor(Color.black); g.draw(linha); } public void marcaControles(Graphics2D g) { g.setColor(Color.blue); float x = (float)linha.getX1()-MARGEM/2; float y = (float)linha.getY1()-MARGEM/2; g.draw(new Rectangle2D.Float(x, y, MARGEM, MARGEM)); x = (float)linha.getX2()-MARGEM/2; y = (float)linha.getY2()-MARGEM/2; g.draw(new Rectangle2D.Float(x, y, MARGEM, MARGEM)); } public int pegaControle(Point2D pt) { if (linha.getP1().distance(pt) <= MARGEM) return 0; if (linha.getP2().distance(pt) <= MARGEM) return 1; return -1; } public void desenhaRascunho(Graphics2D g, int controle, Point2D pt) { Point2D p = (controle==0 ? linha.getP2() : linha.getP1()); g.setColor(Color.black); g.draw(new Line2D.Float(pt, p)); } public void mudaControle(int controle, Point2D pt) { Point2D p = (controle==0 ? linha.getP2() : linha.getP1()); linha.setLine(pt, p); atualizaNome(); } }