/* * Copyright 2000-2016 JetBrains s.r.o. * * Licensed 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 com.intellij.ui.awt; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; public class RelativePoint { private Component myComponent; private Point myPointOnComponent; private Component myOriginalComponent; private Point myOriginalPoint; public RelativePoint(@NotNull MouseEvent event) { init(event.getComponent(), event.getPoint()); myOriginalComponent = event.getComponent(); myOriginalPoint = event.getPoint(); } public RelativePoint(@NotNull Component aComponent, Point aPointOnComponent) { init(aComponent, aPointOnComponent); } public RelativePoint(@NotNull Point screenPoint) { Point p = new Point(screenPoint.x, screenPoint.y); Window[] windows = Window.getWindows(); Window targetWindow = null; for (Window each : windows) { if (each.isActive()) { targetWindow = each; break; } } if (targetWindow == null) { targetWindow = JOptionPane.getRootFrame(); } SwingUtilities.convertPointFromScreen(p, targetWindow); init(targetWindow, p); } private void init(@NotNull Component aComponent, Point aPointOnComponent) { if (aComponent.isShowing()) { myComponent = SwingUtilities.getRootPane(aComponent); myPointOnComponent = SwingUtilities.convertPoint(aComponent, aPointOnComponent, myComponent); } else { myComponent = aComponent; myPointOnComponent = aPointOnComponent; } myOriginalComponent = myComponent; myOriginalPoint = myPointOnComponent; } public Component getComponent() { return myComponent; } public Point getPoint() { return myPointOnComponent; } public Point getPoint(@Nullable Component aTargetComponent) { //todo: remove that after implementation of DND to html design time controls boolean window = aTargetComponent instanceof Window; if (aTargetComponent == null || !window && (aTargetComponent.getParent() == null || SwingUtilities.getWindowAncestor(aTargetComponent) == null)) { return new Point(); } return SwingUtilities.convertPoint(getComponent(), getPoint(), aTargetComponent); } @NotNull public RelativePoint getPointOn(@NotNull Component aTargetComponent) { final Point point = getPoint(aTargetComponent); return new RelativePoint(aTargetComponent, point); } @NotNull public Point getScreenPoint() { final Point point = (Point) getPoint().clone(); SwingUtilities.convertPointToScreen(point, getComponent()); return point; } @NotNull public MouseEvent toMouseEvent() { return new MouseEvent(myComponent, 0, 0, 0, myPointOnComponent.x, myPointOnComponent.y, 1, false); } @NotNull public String toString() { //noinspection HardCodedStringLiteral return getPoint() + " on " + getComponent().toString(); } @NotNull public static RelativePoint getCenterOf(@NotNull JComponent component) { final Rectangle visibleRect = component.getVisibleRect(); final Point point = new Point(visibleRect.x + visibleRect.width/2, visibleRect.y + visibleRect.height/2); return new RelativePoint(component, point); } @NotNull public static RelativePoint getSouthEastOf(@NotNull JComponent component) { final Rectangle visibleRect = component.getVisibleRect(); final Point point = new Point(visibleRect.x + visibleRect.width, visibleRect.y + visibleRect.height); return new RelativePoint(component, point); } @NotNull public static RelativePoint getSouthWestOf(@NotNull JComponent component) { final Rectangle visibleRect = component.getVisibleRect(); final Point point = new Point(visibleRect.x, visibleRect.y + visibleRect.height); return new RelativePoint(component, point); } @NotNull public static RelativePoint getSouthOf(@NotNull JComponent component) { final Rectangle visibleRect = component.getVisibleRect(); final Point point = new Point(visibleRect.x + visibleRect.width / 2, visibleRect.y + visibleRect.height); return new RelativePoint(component, point); } @NotNull public static RelativePoint getNorthWestOf(@NotNull JComponent component) { final Rectangle visibleRect = component.getVisibleRect(); final Point point = new Point(visibleRect.x, visibleRect.y); return new RelativePoint(component, point); } @NotNull public static RelativePoint getNorthEastOf(@NotNull JComponent component) { final Rectangle visibleRect = component.getVisibleRect(); final Point point = new Point(visibleRect.x + visibleRect.width, visibleRect.y); return new RelativePoint(component, point); } @NotNull public static RelativePoint fromScreen(Point screenPoint) { Frame root = JOptionPane.getRootFrame(); SwingUtilities.convertPointFromScreen(screenPoint, root); return new RelativePoint(root, screenPoint); } public Component getOriginalComponent() { return myOriginalComponent; } public Point getOriginalPoint() { return myOriginalPoint; } }