blob: b6add373da5b7b074e6f02a713d5698e4d3bf949 [file] [log] [blame]
/*
* Copyright 2000-2009 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 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;
}
}