All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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.

There is a newer version: 6.3.1
Show newest version
/*
 * 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);
        }
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy