public GridElement cloneFromMe() { try { java.lang.Class<? extends GridElement> cx = this.getClass(); // get class of dynamic object GridElement c = cx.newInstance(); c.setPanelAttributes(getPanelAttributes()); // copy states c.setRectangle(getRectangle()); getDiagramHandler().setHandlerAndInitListeners(c); return c; } catch (Exception e) { log.error("Error at calling CloneFromMe() on entity", e); } return null; }
/** * Must be overwritten because Swing uses this method to tell if 2 elements are overlapping It's * also used to determine which element gets selected if there are overlapping elements (the * smallest one) IMPORTANT: on overlapping elements, contains is called for all elements until the * first one returns true, then the others contain methods are not called * * <p>In future this logic should be the same as in * BaseletGWT.DrawPanel.getGridElementOnPosition() which is much simpler because its externally * calculated (this migration is only possible if there are not GridElement Listeners, but instead * only one Diagram Listener which delegates the event to the specific GridElement like in GWT) */ public static boolean checkForOverlap(GridElement gridElement, Point p) { JComponent component = (JComponent) gridElement.getComponent(); java.awt.Rectangle rectangle = component.getVisibleRect(); Point absolute = new Point( gridElement.getRectangle().getX() + p.getX(), gridElement.getRectangle().getY() + p.getY()); if (!rectangle.contains(p.x, p.y)) { return false; } DrawPanel drawPanel = HandlerElementMap.getHandlerForElement(gridElement).getDrawPanel(); List<GridElement> elements = drawPanel.getGridElements(); Selector selector = drawPanel.getSelector(); for (GridElement other : elements) { if (other == gridElement || other.getLayer() < gridElement.getLayer() || !other.isSelectableOn(absolute)) { continue; // ignore this element, elements with a lower layer and elements which are not // selectable on the point } // issue #260: if a relation is the only selected element its selection should be retained if (gridElement instanceof Relation && other instanceof Relation) { if (selector.isSelectedOnly(gridElement)) { return true; } if (selector.isSelectedOnly(other)) { return false; } } JComponent otherComponent = (JComponent) other.getComponent(); if (other.getLayer() > gridElement .getLayer()) { // elements with higher layer can "overwrite" contains-value of this // move point to coordinate system of other entity Point other_p = new Point( p.x + gridElement.getRectangle().x - other.getRectangle().x, p.y + gridElement.getRectangle().y - other.getRectangle().y); if (otherComponent.contains(Converter.convert(other_p))) { return false; } } java.awt.Rectangle other_rectangle = otherComponent.getVisibleRect(); // move bounds to coordinate system of this component other_rectangle.x += other.getRectangle().x - gridElement.getRectangle().x; other_rectangle.y += other.getRectangle().y - gridElement.getRectangle().y; // when elements intersect, select the smaller element except if it is an old relation // (because they have a larger rectangle than they use). NOTE: Old Relations are not checked // because they do not properly implement isSelectableOn if (!(other instanceof com.baselet.element.old.element.Relation) && rectangle.intersects(other_rectangle) && firstSmallerThanSecond(other_rectangle, rectangle)) { return false; } } return true; }