/******************************************************************************* * Copyright (c) 2016 Weasis Team and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Nicolas Roduit - initial API and implementation *******************************************************************************/ package org.weasis.core.api.gui.util; import java.awt.Component; import java.awt.Container; import java.awt.Dialog; import java.awt.Dimension; import java.awt.Frame; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.Window; import javax.swing.JFrame; import javax.swing.RootPaneContainer; import javax.swing.SwingUtilities; /** * The Class WinUtil. * */ public class WinUtil { private WinUtil() { } public static JFrame getParentJFrame(Component c) { for (Container p = c.getParent(); p != null; p = p.getParent()) { if (p instanceof JFrame) { return (JFrame) p; } } return null; } public static Frame getParentFrame(Component c) { for (Container p = c.getParent(); p != null; p = p.getParent()) { if (p instanceof Frame) { return (Frame) p; } } return null; } public static Dialog getParentDialog(Component c) { for (Container p = c.getParent(); p != null; p = p.getParent()) { if (p instanceof Dialog) { return (Dialog) p; } } return null; } public static RootPaneContainer getRootPaneContainer(Component c) { if (c instanceof RootPaneContainer) { return (RootPaneContainer) c; } for (Container p = c.getParent(); p != null; p = p.getParent()) { if (p instanceof RootPaneContainer) { return (RootPaneContainer) p; } } return null; } public static Window getParentWindow(Component component) { return SwingUtilities.getWindowAncestor(component); } @SuppressWarnings("unchecked") public static <T> T getParentOfClass(Component component, Class<T> class1) { Object obj = component; while (obj != null && !class1.isAssignableFrom(obj.getClass())) { obj = ((Component) (obj)).getParent(); } return (T) (obj); } public static void center(Component component, int i, int j, int k, int l) { int i1 = component.getSize().width; int j1 = component.getSize().height; int k1 = (k - i1) / 2; int l1 = (l - j1) / 2; int i2 = i + k1; int j2 = j + l1; Dimension dimension = getScreenSize(); if (i2 + i1 >= dimension.width) { i2 = dimension.width - i1; } if (j2 + j1 >= dimension.height) { j2 = dimension.height - j1; } if (i2 < 0) { i2 = 0; } if (j2 < 0) { j2 = 0; } component.setLocation(i2, j2); } public static GraphicsConfiguration getGraphicsDeviceConfig(Point p) { GraphicsConfiguration gc = null; // Try to find GraphicsConfiguration, that includes mouse // pointer position GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gd = ge.getScreenDevices(); for (int i = 0; i < gd.length; i++) { if (gd[i].getType() == GraphicsDevice.TYPE_RASTER_SCREEN) { GraphicsConfiguration dgc = gd[i].getDefaultConfiguration(); if (dgc.getBounds().contains(p)) { gc = dgc; break; } } } return gc; } public static Rectangle getClosedScreenBound(Rectangle bound) { Toolkit toolkit = Toolkit.getDefaultToolkit(); GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gd = ge.getScreenDevices(); Rectangle screenBounds = null; Rectangle intersect = null; for (int i = 0; i < gd.length; i++) { GraphicsConfiguration config = gd[i].getDefaultConfiguration(); Rectangle b = config.getBounds(); Rectangle intersection = bound.intersection(b); if (intersection.width > 0 && intersection.height > 0) { if (intersect == null || (intersect.width * intersect.height) < (intersection.width * intersection.height)) { Insets inset = toolkit.getScreenInsets(config); b.x += inset.left; b.y += inset.top; b.width -= (inset.left + inset.right); b.height -= (inset.top + inset.bottom); screenBounds = b; intersect = intersection; } } } return screenBounds; } public static void adjustLocationToFitScreen(Component cp, Point p) { if (cp == null) { return; } if (p == null) { centerOnScreen(cp); return; } Toolkit toolkit = Toolkit.getDefaultToolkit(); Rectangle screenBounds; Insets screenInsets; GraphicsConfiguration gc = getGraphicsDeviceConfig(p); if (gc != null) { // If we have GraphicsConfiguration use it to get // screen bounds and insets screenInsets = toolkit.getScreenInsets(gc); screenBounds = gc.getBounds(); } else { // If we don't have GraphicsConfiguration use primary screen // and empty insets screenInsets = new Insets(0, 0, 0, 0); screenBounds = new Rectangle(toolkit.getScreenSize()); } int scrWidth = screenBounds.width - (screenInsets.left + screenInsets.right); int scrHeight = screenBounds.height - (screenInsets.top + screenInsets.bottom); Dimension size = cp.getPreferredSize(); if ((p.x + size.width) > screenBounds.x + scrWidth) { p.x = screenBounds.x + scrWidth - (size.width + 2); } if ((p.y + size.height) > screenBounds.y + scrHeight) { p.y = screenBounds.y + scrHeight - (size.height + 2); } /* * Change is made to the desired (X,Y) values, when the PopupMenu is too tall OR too wide for the screen */ if (p.x < screenBounds.x) { p.x = screenBounds.x; } if (p.y < screenBounds.y) { p.y = screenBounds.y; } cp.setLocation(p); } public static void center(Component component, Point point, Dimension dimension) { center(component, point.x, point.y, dimension.width, dimension.height); } public static void center(Component component, Component component1) { if (component1 == null) { center(component); } else { center(component, component1.getLocation(), component1.getSize()); } } private static void center(Component component) { Container container = component != null ? component.getParent() : null; Window window = SwingUtilities.getWindowAncestor(container); if (window == null) { centerOnScreen(component); } else { center(component, window); } } public static void centerOnScreen(Component component) { Dimension dimension = getScreenSize(); center(component, 0, 0, dimension.width, dimension.height); } public static Point translate(Component component, Point point) { if (point == null || component == null) { return null; } else { Point point1 = component.getLocationOnScreen(); point1.translate(point.x, point.y); return point1; } } public static Dimension getScreenSize() { return Toolkit.getDefaultToolkit().getScreenSize(); } }