@Override public void drag( Collection<Direction> resizeDirection, int diffX, int diffY, Point mousePosBeforeDrag, boolean isShiftKeyDown, boolean firstDrag, StickableMap stickables, boolean undoable) { Rectangle oldRect = getRectangle(); StickingPolygon stickingPolygonBeforeLocationChange = generateStickingBorder(); String oldAddAttr = getAdditionalAttributes(); if (resizeDirection.isEmpty()) { // Move GridElement setLocationDifference(diffX, diffY); } else { // Resize GridElement Rectangle rect = getRectangle(); if (isShiftKeyDown && diagonalResize(resizeDirection)) { // Proportional Resize boolean mouseToRight = diffX > 0 && diffX > diffY; boolean mouseDown = diffY > 0 && diffY > diffX; boolean mouseLeft = diffX < 0 && diffX < diffY; boolean mouseUp = diffY < 0 && diffY < diffX; if (mouseToRight || mouseLeft) { diffY = diffX; } if (mouseDown || mouseUp) { diffX = diffY; } } if (resizeDirection.contains(Direction.LEFT) && resizeDirection.contains(Direction.RIGHT)) { rect.setX(rect.getX() - diffX / 2); rect.setWidth(Math.max(rect.getWidth() + diffX, minSize())); } else if (resizeDirection.contains(Direction.LEFT)) { int newWidth = rect.getWidth() - diffX; if (newWidth >= minSize()) { rect.setX(rect.getX() + diffX); rect.setWidth(newWidth); } } else if (resizeDirection.contains(Direction.RIGHT)) { rect.setWidth(Math.max(rect.getWidth() + diffX, minSize())); } if (resizeDirection.contains(Direction.UP)) { int newHeight = rect.getHeight() - diffY; if (newHeight >= minSize()) { rect.setY(rect.getY() + diffY); rect.setHeight(newHeight); } } if (resizeDirection.contains(Direction.DOWN)) { rect.setHeight(Math.max(rect.getHeight() + diffY, minSize())); } setRectangle(rect); updateModelFromText(); } moveStickables(stickables, undoable, oldRect, stickingPolygonBeforeLocationChange, oldAddAttr); }