blob: f0882f1a853a84b2b157e4f79dc538177dbb387b [file] [log] [blame]
/*
* 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.apache.log4j.chainsaw.helper;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
/**
* A collection of standard utility methods for use within Swing.
*
* @author Paul Smith <psmith@apache.org>
*
*/
public final class SwingHelper {
/**
* Centers the Component on screen.
*
* @param component
*/
public static void centerOnScreen(Component component) {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
component.setLocation(
(screenSize.width / 2) - (component.getWidth() / 2),
(screenSize.height / 2) - (component.getHeight() / 2));
}
/**
* This method configures a standard Cancel action, bound to the ESC key, to dispose of the dialog,
* and sets the buttons action to be this action, and adds the action to the dialog's rootPane
* action map
* @param dialog
* @param cancelButton
*/
public static void configureCancelForDialog(final JDialog dialog, JButton cancelButton) {
String CANCEL_ACTION_KEY = "CANCEL_ACTION_KEY";
int noModifiers = 0;
KeyStroke escapeKey = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, noModifiers, false);
InputMap inputMap = dialog.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
inputMap.put(escapeKey, CANCEL_ACTION_KEY);
Action closeAction = new AbstractAction("Cancel") {
public void actionPerformed(ActionEvent arg0) {
dialog.dispose();
}};
cancelButton.setAction(closeAction);
dialog.getRootPane().getActionMap().put(CANCEL_ACTION_KEY, closeAction);
}
public static void invokeOnEDT(Runnable runnable) {
if (EventQueue.isDispatchThread()) {
runnable.run();
} else {
EventQueue.invokeLater(runnable);
}
}
public static boolean isMacOSX() {
return System.getProperty("os.name").toLowerCase(Locale.ENGLISH).startsWith("mac os x");
}
public static List<JButton> orderOKCancelButtons(JButton okButton, JButton cancelButton) {
List<JButton> result = new ArrayList<>();
if (isMacOSX()) {
result.add(cancelButton);
result.add(okButton);
} else {
result.add(okButton);
result.add(cancelButton);
}
return result;
}
public static File promptForFile(Container parent, String defaultPath, String title, boolean loadDialog) {
if (SwingHelper.isMacOSX()) {
//use filedialog on mac
Component root = SwingUtilities.getRoot(parent);
Frame frame = null;
if (root instanceof Frame) {
frame = (Frame) root;
}
FileDialog fileDialog = new FileDialog(frame, title);
fileDialog.setModal(true);
fileDialog.setMode(loadDialog ? FileDialog.LOAD : FileDialog.SAVE);
if (defaultPath != null) {
fileDialog.setDirectory(defaultPath);
}
fileDialog.setVisible(true);
String fileString = fileDialog.getFile();
if (fileString == null) {
return null;
}
if (fileDialog.getDirectory() != null) {
return new File(fileDialog.getDirectory(), fileString);
} else {
return new File(fileString);
}
} else {
JFileChooser chooser;
if (defaultPath != null) {
chooser = new JFileChooser(defaultPath);
} else {
chooser = new JFileChooser();
}
chooser.setDialogTitle(title);
chooser.setAcceptAllFileFilterUsed(true);
int i;
if (loadDialog) {
i = chooser.showOpenDialog(parent);
} else {
i = chooser.showSaveDialog(parent);
}
if (i != JFileChooser.APPROVE_OPTION) {
return null;
}
return chooser.getSelectedFile();
}
}
}