org.netbeans.modeler.provider.node.move.AlignSupport Maven / Gradle / Ivy
Go to download
Jeddict is an open source Jakarta EE application development platform that accelerates developers productivity and simplifies development tasks of creating complex entity relationship models.
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.
*/
package org.netbeans.modeler.provider.node.move;
import java.awt.Point;
import java.awt.Rectangle;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import org.netbeans.api.visual.action.AlignWithMoveDecorator;
import org.netbeans.api.visual.action.AlignWithWidgetCollector;
import org.netbeans.api.visual.widget.ConnectionWidget;
import org.netbeans.api.visual.widget.LayerWidget;
import org.netbeans.api.visual.widget.Widget;
/**
* @author David Kaspar Unmodified file
*/
public class AlignSupport {
private static final int GRAVITY = 10;
private AlignWithWidgetCollector collector;
private LayerWidget interractionLayer;
private AlignWithMoveDecorator decorator;
private ConnectionWidget lineWidget1, lineWidget2;
public AlignSupport(AlignWithWidgetCollector collector, LayerWidget interractionLayer, AlignWithMoveDecorator decorator) {
this.collector = collector;
this.interractionLayer = interractionLayer;
this.decorator = decorator;
}
protected Point locationSuggested(Widget widget, Rectangle sceneWidgetBounds, Point suggestedLocation, boolean horizontal, boolean vertical, boolean bothSides, boolean snapHack) {
Point point = new Point(suggestedLocation);
Collection regions = collector.getRegions(widget);
// widget.getScene()
if (horizontal) {
boolean snap = false; // true : means line exist
int xs = 0, x = 0, dx = 0, y1 = 0, y2 = 0;
int b1 = sceneWidgetBounds.x;
int b2 = sceneWidgetBounds.x + sceneWidgetBounds.width;
int b3 = sceneWidgetBounds.x + (sceneWidgetBounds.width / 2);
for (Rectangle rectangle : regions) {
int a1 = rectangle.x;
int a2 = a1 + rectangle.width;
int a3 = a1 + (rectangle.width / 2);
int d;
boolean snapNow = false;
d = Math.abs(a1 - b1);
if ((snap && d < dx) || (!snap && d < GRAVITY)) {
snap = snapNow = true;
x = xs = a1;
dx = d;
}
if (bothSides) {
d = Math.abs(a1 - b2);
if ((snap && d < dx) || (!snap && d < GRAVITY)) {
snap = snapNow = true;
x = a1;
xs = a1 - sceneWidgetBounds.width;
dx = d;
}
}
d = Math.abs(a2 - b1);
if ((snap && d < dx) || (!snap && d < GRAVITY)) {
snap = snapNow = true;
x = xs = a2;
dx = d;
}
if (bothSides) {
d = Math.abs(a2 - b2);
if ((snap && d < dx) || (!snap && d < GRAVITY)) {
snap = snapNow = true;
x = a2;
xs = a2 - sceneWidgetBounds.width;
dx = d;
}
}
d = Math.abs(a3 - b3);
if ((snap && d < dx) || (!snap && d < GRAVITY)) {
snap = snapNow = true;
xs = a3 - (b3 - b1);
x = a3;
dx = d;
}
if (snapNow) {
y1 = rectangle.y;
y2 = rectangle.y + rectangle.height;
}
}
if (snap) {
point.x = xs;
if (snapHack) {
point.x -= widget.getBounds().x;
}
}
if (interractionLayer != null) {
lineWidget1.setControlPoints(snap ? Arrays.asList(
new Point(x, Math.min(sceneWidgetBounds.y, y1)),
new Point(x, Math.max(sceneWidgetBounds.y + sceneWidgetBounds.height, y2))
) : Collections.emptyList(), true);
}
}
if (vertical) {
boolean snap = false;
int ys = 0, y = 0, dy = 0, x1 = 0, x2 = 0;
int b1 = sceneWidgetBounds.y;
int b2 = sceneWidgetBounds.y + sceneWidgetBounds.height;
int b3 = sceneWidgetBounds.y + (sceneWidgetBounds.height / 2);
for (Rectangle rectangle : regions) {
int a1 = rectangle.y;
int a2 = a1 + rectangle.height;
int a3 = a1 + (rectangle.height / 2);
int d;
boolean snapNow = false;
d = Math.abs(a1 - b1);
if ((snap && d < dy) || (!snap && d < GRAVITY)) {
snap = snapNow = true;
y = ys = a1;
dy = d;
}
d = Math.abs(a1 - b2);
if ((snap && d < dy) || (!snap && d < GRAVITY)) {
snap = snapNow = true;
ys = a1 - sceneWidgetBounds.height;
y = a1;
dy = d;
}
d = Math.abs(a2 - b1);
if ((snap && d < dy) || (!snap && d < GRAVITY)) {
snap = snapNow = true;
y = ys = a2;
dy = d;
}
d = Math.abs(a2 - b2);
if ((snap && d < dy) || (!snap && d < GRAVITY)) {
snap = snapNow = true;
ys = a2 - sceneWidgetBounds.height;
y = a2;
dy = d;
}
d = Math.abs(a3 - b3);
if ((snap && d < dy) || (!snap && d < GRAVITY)) {
snap = snapNow = true;
ys = a3 - (b3 - b1);
y = a3;
dy = d;
}
if (snapNow) {
x1 = rectangle.x;
x2 = rectangle.x + rectangle.width;
}
}
if (snap) {
point.y = ys;
if (snapHack) {
point.y -= widget.getBounds().y;
}
}
if (interractionLayer != null) {
lineWidget2.setControlPoints(snap ? Arrays.asList(
new Point(Math.min(sceneWidgetBounds.x, x1), y),
new Point(Math.max(sceneWidgetBounds.x + sceneWidgetBounds.width, x2), y)
) : Collections.emptyList(), true);
}
}
return point;
}
public void show() {
if (interractionLayer != null) {
if (lineWidget1 == null) {
lineWidget1 = decorator.createLineWidget(interractionLayer.getScene());
}
if (lineWidget2 == null) {
lineWidget2 = decorator.createLineWidget(interractionLayer.getScene());
}
interractionLayer.addChild(lineWidget1);
interractionLayer.addChild(lineWidget2);
lineWidget1.setControlPoints(Collections.emptySet(), true);
lineWidget2.setControlPoints(Collections.emptySet(), true);
}
}
public void hide() {
if (interractionLayer != null) {
interractionLayer.removeChild(lineWidget1);
interractionLayer.removeChild(lineWidget2);
}
}
}