263 lines · 9.6 KB · Java
RawDownload
/* * 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);        }    } }