264 lines
9.6 KiB
Java
264 lines
9.6 KiB
Java
/*
|
|
* Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
* published by the Free Software Foundation. Oracle designates this
|
|
* particular file as subject to the "Classpath" exception as provided
|
|
* by Oracle in the LICENSE file that accompanied this code.
|
|
*
|
|
* This code 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 General Public License
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
* accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU General Public License version
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
* questions.
|
|
*/
|
|
|
|
package sun.tools.jconsole;
|
|
|
|
import java.awt.*;
|
|
import java.awt.event.*;
|
|
import java.beans.*;
|
|
|
|
import javax.swing.*;
|
|
import javax.swing.border.*;
|
|
import javax.swing.text.*;
|
|
|
|
import static javax.swing.JOptionPane.*;
|
|
|
|
@SuppressWarnings("serial")
|
|
public final class SheetDialog {
|
|
// Reusable objects
|
|
private static Rectangle iconR = new Rectangle();
|
|
private static Rectangle textR = new Rectangle();
|
|
private static Rectangle viewR = new Rectangle();
|
|
private static Insets viewInsets = new Insets(0, 0, 0, 0);
|
|
|
|
/** Don't let anyone instantiate this class */
|
|
private SheetDialog() {
|
|
}
|
|
|
|
static JOptionPane showOptionDialog(final VMPanel vmPanel, Object message,
|
|
int optionType, int messageType,
|
|
Icon icon, Object[] options, Object initialValue) {
|
|
|
|
JRootPane rootPane = SwingUtilities.getRootPane(vmPanel);
|
|
JPanel glassPane = (JPanel)rootPane.getGlassPane();
|
|
|
|
if (!(glassPane instanceof SlideAndFadeGlassPane)) {
|
|
glassPane = new SlideAndFadeGlassPane();
|
|
glassPane.setName(rootPane.getName()+".glassPane");
|
|
rootPane.setGlassPane(glassPane);
|
|
rootPane.revalidate();
|
|
}
|
|
|
|
final SlideAndFadeGlassPane safGlassPane = (SlideAndFadeGlassPane)glassPane;
|
|
|
|
// Workaround for the fact that JOptionPane does not handle
|
|
// limiting the width when using multi-line html messages.
|
|
// See Swing bug 5074006 and JConsole bug 6426317
|
|
message = fixWrapping(message, rootPane.getWidth() - 75); // Leave room for icon
|
|
|
|
final SheetOptionPane optionPane = new SheetOptionPane(message, messageType, optionType,
|
|
icon, options, initialValue);
|
|
|
|
optionPane.setComponentOrientation(vmPanel.getComponentOrientation());
|
|
optionPane.addPropertyChangeListener(new PropertyChangeListener() {
|
|
public void propertyChange(PropertyChangeEvent event) {
|
|
if (event.getPropertyName().equals(VALUE_PROPERTY) &&
|
|
event.getNewValue() != null &&
|
|
event.getNewValue() != UNINITIALIZED_VALUE) {
|
|
((SlideAndFadeGlassPane)optionPane.getParent()).hide(optionPane);
|
|
}
|
|
}
|
|
});
|
|
|
|
// Delay this (even though we're already on the EDT)
|
|
EventQueue.invokeLater(new Runnable() {
|
|
public void run() {
|
|
safGlassPane.show(optionPane);
|
|
}
|
|
});
|
|
|
|
return optionPane;
|
|
}
|
|
|
|
private static Object fixWrapping(Object message, final int maxWidth) {
|
|
if (message instanceof Object[]) {
|
|
Object[] arr = (Object[])message;
|
|
for (int i = 0; i < arr.length; i++) {
|
|
arr[i] = fixWrapping(arr[i], maxWidth);
|
|
}
|
|
} else if (message instanceof String &&
|
|
((String)message).startsWith("<html>")) {
|
|
message = new JLabel((String)message) {
|
|
public Dimension getPreferredSize() {
|
|
String text = getText();
|
|
Insets insets = getInsets(viewInsets);
|
|
FontMetrics fm = getFontMetrics(getFont());
|
|
Dimension pref = super.getPreferredSize();
|
|
Dimension min = getMinimumSize();
|
|
|
|
iconR.x = iconR.y = iconR.width = iconR.height = 0;
|
|
textR.x = textR.y = textR.width = textR.height = 0;
|
|
int dx = insets.left + insets.right;
|
|
int dy = insets.top + insets.bottom;
|
|
viewR.x = dx;
|
|
viewR.y = dy;
|
|
viewR.width = viewR.height = Short.MAX_VALUE;
|
|
|
|
View v = (View)getClientProperty("html");
|
|
if (v != null) {
|
|
// Use pref width if less than 300, otherwise
|
|
// min width up to size of window.
|
|
int w = Math.min(maxWidth,
|
|
Math.min(pref.width,
|
|
Math.max(min.width, 300)));
|
|
v.setSize((float)w, 0F);
|
|
|
|
SwingUtilities.layoutCompoundLabel(this, fm, text, null,
|
|
getVerticalAlignment(),
|
|
getHorizontalAlignment(),
|
|
getVerticalTextPosition(),
|
|
getHorizontalTextPosition(),
|
|
viewR, iconR, textR,
|
|
getIconTextGap());
|
|
return new Dimension(textR.width + dx,
|
|
textR.height + dy);
|
|
} else {
|
|
return pref; // Should not happen
|
|
}
|
|
}
|
|
};
|
|
}
|
|
return message;
|
|
}
|
|
|
|
private static class SlideAndFadeGlassPane extends JPanel {
|
|
SheetOptionPane optionPane;
|
|
|
|
int fade = 20;
|
|
boolean slideIn = true;
|
|
|
|
SlideAndFadeGlassPane() {
|
|
super(null);
|
|
setVisible(false);
|
|
setOpaque(false);
|
|
|
|
// Grab mouse input, making the dialog modal
|
|
addMouseListener(new MouseAdapter() {});
|
|
}
|
|
|
|
public void show(SheetOptionPane optionPane) {
|
|
this.optionPane = optionPane;
|
|
removeAll();
|
|
add(optionPane);
|
|
setVisible(true);
|
|
slideIn = true;
|
|
revalidate();
|
|
repaint();
|
|
doSlide();
|
|
}
|
|
|
|
public void hide(SheetOptionPane optionPane) {
|
|
if (optionPane != this.optionPane) {
|
|
return;
|
|
}
|
|
|
|
slideIn = false;
|
|
revalidate();
|
|
repaint();
|
|
doSlide();
|
|
}
|
|
|
|
private void doSlide() {
|
|
if (optionPane.getParent() == null) {
|
|
return;
|
|
}
|
|
|
|
if (optionPane.getWidth() == 0) {
|
|
optionPane.setSize(optionPane.getPreferredSize());
|
|
}
|
|
|
|
int glassPaneWidth = getWidth();
|
|
if (glassPaneWidth == 0 && getParent() != null) {
|
|
glassPaneWidth = getParent().getWidth();
|
|
}
|
|
|
|
int x = (glassPaneWidth - optionPane.getWidth()) / 2;
|
|
|
|
if (!slideIn) {
|
|
remove(optionPane);
|
|
setVisible(false);
|
|
return;
|
|
} else {
|
|
optionPane.setLocation(x, 0);
|
|
setGrayLevel(fade);
|
|
return;
|
|
}
|
|
}
|
|
|
|
public void setGrayLevel(int gray) {
|
|
gray = gray * 255 / 100;
|
|
setBackground(new Color(0, 0, 0, gray));
|
|
}
|
|
|
|
public void paint(Graphics g) {
|
|
g.setColor(getBackground());
|
|
g.fillRect(0, 0, getWidth(), getHeight());
|
|
super.paint(g);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static class SheetOptionPane extends JOptionPane {
|
|
SheetOptionPane(Object message, int messageType, int optionType,
|
|
Icon icon, Object[] options, Object initialValue) {
|
|
super(message, messageType, optionType, icon, options, initialValue);
|
|
|
|
setBorder(new CompoundBorder(new LineBorder(new Color(204, 204, 204), 1),
|
|
new EmptyBorder(4, 4, 4, 4)));
|
|
}
|
|
|
|
|
|
private static Composite comp =
|
|
AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8F);
|
|
|
|
private static Color bgColor = new Color(241, 239, 239);
|
|
|
|
public void setVisible(boolean visible) {
|
|
SlideAndFadeGlassPane glassPane = (SlideAndFadeGlassPane)getParent();
|
|
if (glassPane != null) {
|
|
if (visible) {
|
|
glassPane.show(this);
|
|
} else {
|
|
glassPane.hide(this);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void paint(Graphics g) {
|
|
Graphics2D g2d = (Graphics2D)g;
|
|
Composite oldComp = g2d.getComposite();
|
|
g2d.setComposite(comp);
|
|
Color oldColor = g2d.getColor();
|
|
g2d.setColor(bgColor);
|
|
g2d.fillRect(0, 0, getWidth(), getHeight());
|
|
g2d.setColor(oldColor);
|
|
g2d.setComposite(oldComp);
|
|
super.paint(g);
|
|
}
|
|
}
|
|
|
|
}
|