/** * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE, Version 3, 29 June 2007; * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.gnu.org/licenses/lgpl-3.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE, Version 3, 29 June 2007; * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.gnu.org/licenses/lgpl-3.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.kevoree.tools.ui.framework.elements; import org.kevoree.tools.ui.framework.ErrorHighlightableElement; import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.RenderingHints; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.geom.QuadCurve2D; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.swing.JPanel; import javax.swing.SwingUtilities; /** * @author ffouquet */ public class BindingPanel extends JPanel { private Collection<Binding> bindings = new ArrayList(); private JPanel mySelf; @Override public boolean contains(int x, int y) { Boolean containsResult = false; Boolean changeDetected = false; for (Binding b : bindings) { Point p1 = null; Point ptemp = new Point(); ptemp = b.getFrom().getLocationOnScreen(); ptemp.setLocation(ptemp.getX() + (b.getFrom().getWidth() / 2), ptemp.getY() + (b.getFrom().getHeight() / 2)); SwingUtilities.convertPointFromScreen(ptemp, mySelf); p1 = ptemp; Point p2 = null; ptemp = b.getTo().getLocationOnScreen(); ptemp.setLocation(ptemp.getX() + (b.getTo().getWidth() / 2), ptemp.getY() + (b.getTo().getHeight() / 2)); SwingUtilities.convertPointFromScreen(ptemp, mySelf); p2 = ptemp; if (p1 != null && p2 != null) { Point intermed = new Point(); intermed.y = Math.max(p2.y, p1.y) + 15; intermed.x = (p2.x + p1.x) / 2; QuadCurve2D curve = new QuadCurve2D.Float(p1.x, p1.y - 3, intermed.x, intermed.y - 3, p2.x, p2.y - 3); QuadCurve2D curve2 = new QuadCurve2D.Float(p1.x, p1.y + 3, intermed.x, intermed.y + 3, p2.x, p2.y + 3); if (curve2.contains(x, y) && !curve.contains(x, y)) { containsResult = true; if (!b.isFocused) { changeDetected = true; b.isFocused = true; } } else { if (b.isFocused) { changeDetected = true; b.isFocused = false; } } } } if (changeDetected) { this.repaint(); this.revalidate(); } return containsResult; } public BindingPanel() { this.setOpaque(false); mySelf = this; this.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent mouseEvent) { // System.out.println("Hi" + mouseEvent.getPoint().getX() + "-" + mouseEvent.getPoint().getY()); for (Binding b : bindings) { Point p1 = null; Point ptemp = new Point(); ptemp = b.getFrom().getLocationOnScreen(); ptemp.setLocation(ptemp.getX() + (b.getFrom().getWidth() / 2), ptemp.getY() + (b.getFrom().getHeight() / 2)); SwingUtilities.convertPointFromScreen(ptemp, mySelf); p1 = ptemp; Point p2 = null; ptemp = b.getTo().getLocationOnScreen(); ptemp.setLocation(ptemp.getX() + (b.getTo().getWidth() / 2), ptemp.getY() + (b.getTo().getHeight() / 2)); SwingUtilities.convertPointFromScreen(ptemp, mySelf); p2 = ptemp; if (p1 != null && p2 != null) { Point intermed = new Point(); intermed.y = Math.max(p2.y, p1.y) + 15; intermed.x = (p2.x + p1.x) / 2; /* QuadCurve2D curve = new QuadCurve2D.Float(p1.x, p1.y, intermed.x, intermed.y, p2.x, p2.y); if (curve.contains(mouseEvent.getX(), mouseEvent.getY())) { b.triggerListeners(); } */ QuadCurve2D curve = new QuadCurve2D.Float(p1.x, p1.y - 3, intermed.x, intermed.y - 3, p2.x, p2.y - 3); QuadCurve2D curve2 = new QuadCurve2D.Float(p1.x, p1.y + 3, intermed.x, intermed.y + 3, p2.x, p2.y + 3); if (curve2.contains(mouseEvent.getX(), mouseEvent.getY()) && !curve.contains(mouseEvent.getX(), mouseEvent.getY())) { b.triggerListeners(); } } } } }); } public void addBinding(Binding b) { bindings.add(b); } public void removeBinding(Binding b) { bindings.remove(b); } public void clear() { Collection<Binding> rbindings = new ArrayList(); rbindings.addAll(bindings); for (Binding b : rbindings) { removeBinding(b); } } public Collection<Binding> getBindings() { return bindings; } public void drawCable(Graphics2D g2D, Point start, Point end) { Point intermed = new Point(); intermed.y = Math.max(end.y, start.y) + 15; intermed.x = (end.x + start.x) / 2; g2D.draw(new QuadCurve2D.Float(start.x, start.y, intermed.x, intermed.y, end.x, end.y)); //g2D.draw(new QuadCurve2D.Float(start.x, start.y - 3, intermed.x, intermed.y - 3, end.x, end.y - 3)); //g2D.draw(new QuadCurve2D.Float(start.x, start.y + 3, intermed.x, intermed.y + 3, end.x, end.y + 3)); } @Override public void paint(Graphics g) { super.paint(g); g.setPaintMode(); Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5F)); g2d.setStroke(new BasicStroke(5, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_ROUND)); for (Binding b : bindings) { //g2d.setColor(new Color(243, 238, 39, 150)); Point p1 = null; Point ptemp = new Point(); ptemp = b.getFrom().getLocationOnScreen(); ptemp.setLocation(ptemp.getX() + (b.getFrom().getWidth() / 2), ptemp.getY() + (b.getFrom().getHeight() / 2)); SwingUtilities.convertPointFromScreen(ptemp, this); p1 = ptemp; Point p2 = null; ptemp = b.getTo().getLocationOnScreen(); ptemp.setLocation(ptemp.getX() + (b.getTo().getWidth() / 2), ptemp.getY() + (b.getTo().getHeight() / 2)); SwingUtilities.convertPointFromScreen(ptemp, this); p2 = ptemp; if (p1 != null && p2 != null) { /* if (b.getSelected()) { g2d.setColor(new Color(243, 0, 0, 150)); } else { g2d.setColor(new Color(243, 238, 39, 150)); }*/ if (b.getCurrentState().equals(ErrorHighlightableElement.STATE.IN_ERROR)) { float dash1[] = {10.0f}; BasicStroke dashed = new BasicStroke(5.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, dash1, 0.0f); g2d.setStroke(dashed); } else { //g2d.setStroke(new BasicStroke(5, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_ROUND)); if (b.isFocused) { g2d.setStroke(b.getFocusedStroke()); } else { g2d.setStroke(b.getStroke()); } } g2d.setColor(b.getActualColor()); drawCable(g2d, p1, p2); } } g.setColor(new Color(255, 255, 255, 150)); } }