/* * The JTS Topology Suite is a collection of Java classes that * implement the fundamental operations required to validate a given * geo-spatial data set to a known topological specification. * * Copyright (C) 2001 Vivid Solutions * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * For more information, contact: * * Vivid Solutions * Suite #1A * 2328 Government Street * Victoria BC V8T 5G5 * Canada * * (250)385-6040 * www.vividsolutions.com */ package com.revolsys.geometry.test.testrunner; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Toolkit; import java.beans.PropertyVetoException; import java.io.File; import javax.swing.JComponent; import javax.swing.JDesktopPane; import javax.swing.JFileChooser; import javax.swing.JInternalFrame; import javax.swing.JList; import javax.swing.JTable; import javax.swing.SwingUtilities; import javax.swing.text.JTextComponent; /** * Useful GUI utilities * * @version 1.7 */ public class GuiUtil { /** * Centers the first component on the second */ public static void center(final Component componentToMove, final Component componentToCenterOn) { final Dimension componentToCenterOnSize = componentToCenterOn.getSize(); componentToMove.setLocation( componentToCenterOn.getX() + (componentToCenterOnSize.width - componentToMove.getWidth()) / 2, componentToCenterOn.getY() + (componentToCenterOnSize.height - componentToMove.getHeight()) / 2); } /** * Centers the component on the screen */ public static void centerOnScreen(final Component componentToMove) { final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); componentToMove.setLocation((screenSize.width - componentToMove.getWidth()) / 2, (screenSize.height - componentToMove.getHeight()) / 2); } /** * Centers the component on its window */ public static void centerOnWindow(final Component componentToMove) { center(componentToMove, SwingUtilities.windowForComponent(componentToMove)); } // Save the contents of the cell that the user is in the middle of editing // From Question of the Week No. 23 // http://developer.java.sun.com/developer/qow/archive/23/ public static void commitChanges(final JTable table) { if (table.isEditing()) { final String text = ((JTextComponent)table.getEditorComponent()).getText(); table.setValueAt(text, table.getEditingRow(), table.getEditingColumn()); table.getCellEditor().cancelCellEditing(); } } /** * Changes the tooltip text of the JComponent to be multiline HTML. */ public static void formatTooltip(final JComponent jcomponent) { String tip = jcomponent.getToolTipText(); if (tip == null || tip.length() == 0) { return; } if (tip.toLowerCase().indexOf("<html>") > -1) { return; } tip = StringUtil.wrap(tip, 50); tip = StringUtil.replaceAll(tip, "\n", "<p>"); tip = "<html>" + tip + "</html>"; jcomponent.setToolTipText(tip); } /** * Changes the tooltip text of each component in the Container to be * multiline HTML. Modifies all descendants (children, grandchildren, etc.). */ public static void formatTooltips(final Container container) { for (int i = 0; i < container.getComponentCount(); i++) { final Component component = container.getComponent(i); if (component instanceof JComponent) { formatTooltip((JComponent)component); } if (component instanceof Container) { formatTooltips((Container)component); } } } /** * Workaround for Swing bug: JFileChooser does not support multi-file selection * See Sun bug database 4218431. * http://manning.spindoczine.com/sbe/files/uts2/Chapter14html/Chapter14.htm) */ public static File[] getSelectedFiles(final JFileChooser chooser) { // Although JFileChooser won't give us this information, // we need it... Container c1 = (Container)chooser.getComponent(3); JList list = null; while (c1 != null) { final Container c = (Container)c1.getComponent(0); if (c instanceof JList) { list = (JList)c; break; } c1 = c; } final Object[] entries = list.getSelectedValues(); final File[] files = new File[entries.length]; for (int k = 0; k < entries.length; k++) { if (entries[k] instanceof File) { files[k] = (File)entries[k]; } } return files; } /** * Runs r in the event dispatch thread, which may be the current thread. * Waits for r to finish before returning. */ public static void invokeAndWait(final Runnable r) throws InterruptedException, java.lang.reflect.InvocationTargetException { if (SwingUtilities.isEventDispatchThread()) { r.run(); } else { SwingUtilities.invokeAndWait(r); } } /** * Workaround for bug: can't re-show internal frames. See bug parade 4138031. */ public static void show(final JInternalFrame internalFrame, final JDesktopPane desktopPane) throws PropertyVetoException { if (!desktopPane.isAncestorOf(internalFrame)) { desktopPane.add(internalFrame); } internalFrame.setClosed(false); internalFrame.setVisible(true); internalFrame.toFront(); } }