jdk/src/solaris/classes/sun/awt/X11/InfoWindow.java
author mchung
Tue, 29 Sep 2009 16:03:03 -0700
changeset 3938 ef327bd847c0
parent 2472 b7aba00cabb6
child 4366 4446f3b8a9b4
permissions -rw-r--r--
6879044: Eliminate the dependency on logging from the AWT/2D/Swing classes Summary: Replace calls to Logger with sun.util.logging.PlatformLogger Reviewed-by: prr, art, alexp, dcherepanov, igor, dav, anthony
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2472
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
     1
/*
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
     2
 * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
     4
 *
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Sun designates this
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
     9
 * by Sun in the LICENSE file that accompanied this code.
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    10
 *
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    15
 * accompanied this code).
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    16
 *
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    20
 *
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    21
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    22
 * CA 95054 USA or visit www.sun.com if you need additional information or
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    23
 * have any questions.
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    24
 */
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    25
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    26
package sun.awt.X11;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    27
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    28
import java.awt.*;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    29
import java.awt.event.*;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    30
import java.awt.peer.TrayIconPeer;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    31
import sun.awt.*;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    32
import java.awt.image.*;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    33
import java.text.BreakIterator;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    34
import java.util.concurrent.ArrayBlockingQueue;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    35
import java.security.AccessController;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    36
import java.security.PrivilegedAction;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    37
import java.lang.reflect.InvocationTargetException;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    38
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    39
/**
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    40
 * An utility window class. This is a base class for Tooltip and Balloon.
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    41
 */
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    42
public abstract class InfoWindow extends Window {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    43
    private Container container;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    44
    private Closer closer;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    45
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    46
    protected InfoWindow(Frame parent, Color borderColor) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    47
        super(parent);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    48
        container = new Container() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    49
            @Override
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    50
            public Insets getInsets() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    51
                return new Insets(1, 1, 1, 1);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    52
            }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    53
        };
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    54
        setLayout(new BorderLayout());
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    55
        setBackground(borderColor);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    56
        add(container, BorderLayout.CENTER);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    57
        container.setLayout(new BorderLayout());
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    58
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    59
        closer = new Closer();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    60
    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    61
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    62
    public Component add(Component c) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    63
        container.add(c, BorderLayout.CENTER);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    64
        return c;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    65
    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    66
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    67
    protected void setCloser(Runnable action, int time) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    68
        closer.set(action, time);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    69
    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    70
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    71
    // Must be executed on EDT.
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    72
    protected void show(Point corner, int indent) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    73
        assert SunToolkit.isDispatchThreadForAppContext(this);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    74
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    75
        pack();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    76
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    77
        Dimension size = getSize();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    78
        // TODO: When 6356322 is fixed we should get screen bounds in
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    79
        // this way: eframe.getGraphicsConfiguration().getBounds().
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    80
        Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    81
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    82
        if (corner.x < scrSize.width/2 && corner.y < scrSize.height/2) { // 1st square
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    83
            setLocation(corner.x + indent, corner.y + indent);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    84
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    85
        } else if (corner.x >= scrSize.width/2 && corner.y < scrSize.height/2) { // 2nd square
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    86
            setLocation(corner.x - indent - size.width, corner.y + indent);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    87
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    88
        } else if (corner.x < scrSize.width/2 && corner.y >= scrSize.height/2) { // 3rd square
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    89
            setLocation(corner.x + indent, corner.y - indent - size.height);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    90
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    91
        } else if (corner.x >= scrSize.width/2 && corner.y >= scrSize.height/2) { // 4th square
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    92
            setLocation(corner.x - indent - size.width, corner.y - indent - size.height);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    93
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    94
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    95
        super.show();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    96
        closer.schedule();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    97
    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    98
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
    99
    public void hide() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   100
        closer.close();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   101
    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   102
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   103
    private class Closer implements Runnable {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   104
        Runnable action;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   105
        int time;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   106
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   107
        public void run() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   108
            doClose();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   109
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   110
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   111
        void set(Runnable action, int time) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   112
            this.action = action;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   113
            this.time = time;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   114
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   115
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   116
        void schedule() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   117
            XToolkit.schedule(this, time);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   118
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   119
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   120
        void close() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   121
            XToolkit.remove(this);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   122
            doClose();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   123
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   124
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   125
        // WARNING: this method may be executed on Toolkit thread.
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   126
        private void doClose() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   127
            SunToolkit.executeOnEventHandlerThread(InfoWindow.this, new Runnable() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   128
                public void run() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   129
                    InfoWindow.super.hide();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   130
                    invalidate();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   131
                    if (action != null) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   132
                        action.run();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   133
                    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   134
                }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   135
            });
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   136
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   137
    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   138
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   139
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   140
    private interface LiveArguments {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   141
        /** Whether the target of the InfoWindow is disposed. */
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   142
        boolean isDisposed();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   143
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   144
        /** The bounds of the target of the InfoWindow. */
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   145
        Rectangle getBounds();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   146
    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   147
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   148
    public static class Tooltip extends InfoWindow {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   149
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   150
        public interface LiveArguments extends InfoWindow.LiveArguments {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   151
            /** The tooltip to be displayed. */
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   152
            String getTooltipString();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   153
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   154
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   155
        private final Object target;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   156
        private final LiveArguments liveArguments;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   157
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   158
        private final Label textLabel = new Label("");
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   159
        private final Runnable starter = new Runnable() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   160
                public void run() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   161
                    display();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   162
                }};
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   163
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   164
        private final static int TOOLTIP_SHOW_TIME = 10000;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   165
        private final static int TOOLTIP_START_DELAY_TIME = 1000;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   166
        private final static int TOOLTIP_MAX_LENGTH = 64;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   167
        private final static int TOOLTIP_MOUSE_CURSOR_INDENT = 5;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   168
        private final static Color TOOLTIP_BACKGROUND_COLOR = new Color(255, 255, 220);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   169
        private final static Font TOOLTIP_TEXT_FONT = XWindow.getDefaultFont();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   170
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   171
        public Tooltip(Frame parent, Object target,
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   172
                LiveArguments liveArguments)
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   173
        {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   174
            super(parent, Color.black);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   175
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   176
            this.target = target;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   177
            this.liveArguments = liveArguments;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   178
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   179
            XTrayIconPeer.suppressWarningString(this);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   180
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   181
            setCloser(null, TOOLTIP_SHOW_TIME);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   182
            textLabel.setBackground(TOOLTIP_BACKGROUND_COLOR);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   183
            textLabel.setFont(TOOLTIP_TEXT_FONT);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   184
            add(textLabel);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   185
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   186
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   187
        /*
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   188
         * WARNING: this method is executed on Toolkit thread!
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   189
         */
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   190
        private void display() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   191
            String tooltipString = liveArguments.getTooltipString();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   192
            if (tooltipString == null) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   193
                return;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   194
            } else if (tooltipString.length() >  TOOLTIP_MAX_LENGTH) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   195
                textLabel.setText(tooltipString.substring(0, TOOLTIP_MAX_LENGTH));
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   196
            } else {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   197
                textLabel.setText(tooltipString);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   198
            }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   199
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   200
            // Execute on EDT to avoid deadlock (see 6280857).
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   201
            SunToolkit.executeOnEventHandlerThread(target, new Runnable() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   202
                    public void run() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   203
                        if (liveArguments.isDisposed()) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   204
                            return;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   205
                        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   206
                        Point pointer = (Point)AccessController.doPrivileged(new PrivilegedAction() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   207
                                public Object run() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   208
                                    if (!isPointerOverTrayIcon(liveArguments.getBounds())) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   209
                                        return null;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   210
                                    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   211
                                    return MouseInfo.getPointerInfo().getLocation();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   212
                                }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   213
                            });
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   214
                        if (pointer == null) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   215
                            return;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   216
                        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   217
                        show(new Point(pointer.x, pointer.y), TOOLTIP_MOUSE_CURSOR_INDENT);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   218
                    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   219
                });
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   220
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   221
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   222
        public void enter() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   223
            XToolkit.schedule(starter, TOOLTIP_START_DELAY_TIME);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   224
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   225
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   226
        public void exit() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   227
            XToolkit.remove(starter);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   228
            if (isVisible()) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   229
                hide();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   230
            }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   231
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   232
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   233
        private boolean isPointerOverTrayIcon(Rectangle trayRect) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   234
            Point p = MouseInfo.getPointerInfo().getLocation();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   235
            return !(p.x < trayRect.x || p.x > (trayRect.x + trayRect.width) ||
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   236
                     p.y < trayRect.y || p.y > (trayRect.y + trayRect.height));
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   237
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   238
    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   239
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   240
    public static class Balloon extends InfoWindow {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   241
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   242
        public interface LiveArguments extends InfoWindow.LiveArguments {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   243
            /** The action to be performed upon clicking the baloon. */
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   244
            String getActionCommand();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   245
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   246
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   247
        private final LiveArguments liveArguments;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   248
        private final Object target;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   249
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   250
        private final static int BALLOON_SHOW_TIME = 10000;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   251
        private final static int BALLOON_TEXT_MAX_LENGTH = 256;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   252
        private final static int BALLOON_WORD_LINE_MAX_LENGTH = 16;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   253
        private final static int BALLOON_WORD_LINE_MAX_COUNT = 4;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   254
        private final static int BALLOON_ICON_WIDTH = 32;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   255
        private final static int BALLOON_ICON_HEIGHT = 32;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   256
        private final static int BALLOON_TRAY_ICON_INDENT = 0;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   257
        private final static Color BALLOON_CAPTION_BACKGROUND_COLOR = new Color(200, 200 ,255);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   258
        private final static Font BALLOON_CAPTION_FONT = new Font(Font.DIALOG, Font.BOLD, 12);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   259
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   260
        private Panel mainPanel = new Panel();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   261
        private Panel captionPanel = new Panel();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   262
        private Label captionLabel = new Label("");
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   263
        private Button closeButton = new Button("X");
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   264
        private Panel textPanel = new Panel();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   265
        private XTrayIconPeer.IconCanvas iconCanvas = new XTrayIconPeer.IconCanvas(BALLOON_ICON_WIDTH, BALLOON_ICON_HEIGHT);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   266
        private Label[] lineLabels = new Label[BALLOON_WORD_LINE_MAX_COUNT];
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   267
        private ActionPerformer ap = new ActionPerformer();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   268
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   269
        private Image iconImage;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   270
        private Image errorImage;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   271
        private Image warnImage;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   272
        private Image infoImage;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   273
        private boolean gtkImagesLoaded;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   274
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   275
        private Displayer displayer = new Displayer();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   276
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   277
        public Balloon(Frame parent, Object target, LiveArguments liveArguments) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   278
            super(parent, new Color(90, 80 ,190));
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   279
            this.liveArguments = liveArguments;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   280
            this.target = target;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   281
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   282
            XTrayIconPeer.suppressWarningString(this);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   283
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   284
            setCloser(new Runnable() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   285
                    public void run() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   286
                        if (textPanel != null) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   287
                            textPanel.removeAll();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   288
                            textPanel.setSize(0, 0);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   289
                            iconCanvas.setSize(0, 0);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   290
                            XToolkit.awtLock();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   291
                            try {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   292
                                displayer.isDisplayed = false;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   293
                                XToolkit.awtLockNotifyAll();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   294
                            } finally {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   295
                                XToolkit.awtUnlock();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   296
                            }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   297
                        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   298
                    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   299
                }, BALLOON_SHOW_TIME);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   300
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   301
            add(mainPanel);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   302
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   303
            captionLabel.setFont(BALLOON_CAPTION_FONT);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   304
            captionLabel.addMouseListener(ap);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   305
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   306
            captionPanel.setLayout(new BorderLayout());
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   307
            captionPanel.add(captionLabel, BorderLayout.WEST);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   308
            captionPanel.add(closeButton, BorderLayout.EAST);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   309
            captionPanel.setBackground(BALLOON_CAPTION_BACKGROUND_COLOR);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   310
            captionPanel.addMouseListener(ap);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   311
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   312
            closeButton.addActionListener(new ActionListener() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   313
                    public void actionPerformed(ActionEvent e) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   314
                        hide();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   315
                    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   316
                });
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   317
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   318
            mainPanel.setLayout(new BorderLayout());
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   319
            mainPanel.setBackground(Color.white);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   320
            mainPanel.add(captionPanel, BorderLayout.NORTH);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   321
            mainPanel.add(iconCanvas, BorderLayout.WEST);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   322
            mainPanel.add(textPanel, BorderLayout.CENTER);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   323
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   324
            iconCanvas.addMouseListener(ap);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   325
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   326
            for (int i = 0; i < BALLOON_WORD_LINE_MAX_COUNT; i++) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   327
                lineLabels[i] = new Label();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   328
                lineLabels[i].addMouseListener(ap);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   329
                lineLabels[i].setBackground(Color.white);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   330
            }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   331
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   332
            displayer.start();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   333
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   334
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   335
        public void display(String caption, String text, String messageType) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   336
            if (!gtkImagesLoaded) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   337
                loadGtkImages();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   338
            }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   339
            displayer.display(caption, text, messageType);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   340
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   341
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   342
        private void _display(String caption, String text, String messageType) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   343
            captionLabel.setText(caption);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   344
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   345
            BreakIterator iter = BreakIterator.getWordInstance();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   346
            if (text != null) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   347
                iter.setText(text);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   348
                int start = iter.first(), end;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   349
                int nLines = 0;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   350
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   351
                do {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   352
                    end = iter.next();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   353
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   354
                    if (end == BreakIterator.DONE ||
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   355
                        text.substring(start, end).length() >= 50)
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   356
                    {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   357
                        lineLabels[nLines].setText(text.substring(start, end == BreakIterator.DONE ?
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   358
                                                                  iter.last() : end));
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   359
                        textPanel.add(lineLabels[nLines++]);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   360
                        start = end;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   361
                    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   362
                    if (nLines == BALLOON_WORD_LINE_MAX_COUNT) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   363
                        if (end != BreakIterator.DONE) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   364
                            lineLabels[nLines - 1].setText(
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   365
                                new String(lineLabels[nLines - 1].getText() + " ..."));
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   366
                        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   367
                        break;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   368
                    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   369
                } while (end != BreakIterator.DONE);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   370
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   371
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   372
                textPanel.setLayout(new GridLayout(nLines, 1));
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   373
            }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   374
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   375
            if ("ERROR".equals(messageType)) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   376
                iconImage = errorImage;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   377
            } else if ("WARNING".equals(messageType)) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   378
                iconImage = warnImage;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   379
            } else if ("INFO".equals(messageType)) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   380
                iconImage = infoImage;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   381
            } else {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   382
                iconImage = null;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   383
            }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   384
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   385
            if (iconImage != null) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   386
                Dimension tpSize = textPanel.getSize();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   387
                iconCanvas.setSize(BALLOON_ICON_WIDTH, (BALLOON_ICON_HEIGHT > tpSize.height ?
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   388
                                                        BALLOON_ICON_HEIGHT : tpSize.height));
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   389
                iconCanvas.validate();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   390
            }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   391
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   392
            SunToolkit.executeOnEventHandlerThread(target, new Runnable() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   393
                    public void run() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   394
                        if (liveArguments.isDisposed()) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   395
                            return;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   396
                        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   397
                        Point parLoc = getParent().getLocationOnScreen();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   398
                        Dimension parSize = getParent().getSize();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   399
                        show(new Point(parLoc.x + parSize.width/2, parLoc.y + parSize.height/2),
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   400
                             BALLOON_TRAY_ICON_INDENT);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   401
                        if (iconImage != null) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   402
                            iconCanvas.updateImage(iconImage); // call it after the show(..) above
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   403
                        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   404
                    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   405
                });
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   406
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   407
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   408
        public void dispose() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   409
            displayer.interrupt();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   410
            super.dispose();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   411
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   412
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   413
        private void loadGtkImages() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   414
            if (!gtkImagesLoaded) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   415
                errorImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty(
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   416
                    "gtk.icon.gtk-dialog-error.6.rtl");
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   417
                warnImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty(
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   418
                    "gtk.icon.gtk-dialog-warning.6.rtl");
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   419
                infoImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty(
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   420
                    "gtk.icon.gtk-dialog-info.6.rtl");
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   421
                gtkImagesLoaded = true;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   422
            }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   423
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   424
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   425
        private class ActionPerformer extends MouseAdapter {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   426
            public void mouseClicked(MouseEvent e) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   427
                // hide the balloon by any click
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   428
                hide();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   429
                if (e.getButton() == MouseEvent.BUTTON1) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   430
                    ActionEvent aev = new ActionEvent(target, ActionEvent.ACTION_PERFORMED,
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   431
                                                      liveArguments.getActionCommand(),
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   432
                                                      e.getWhen(), e.getModifiers());
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   433
                    Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(aev);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   434
                }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   435
            }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   436
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   437
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   438
        private class Displayer extends Thread {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   439
            final int MAX_CONCURRENT_MSGS = 10;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   440
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   441
            ArrayBlockingQueue<Message> messageQueue = new ArrayBlockingQueue<Message>(MAX_CONCURRENT_MSGS);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   442
            boolean isDisplayed;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   443
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   444
            Displayer() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   445
                setDaemon(true);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   446
            }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   447
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   448
            public void run() {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   449
                while (true) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   450
                    Message msg = null;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   451
                    try {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   452
                        msg = (Message)messageQueue.take();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   453
                    } catch (InterruptedException e) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   454
                        return;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   455
                    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   456
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   457
                    /*
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   458
                     * Wait till the previous message is displayed if any
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   459
                     */
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   460
                    XToolkit.awtLock();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   461
                    try {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   462
                        while (isDisplayed) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   463
                            try {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   464
                                XToolkit.awtLockWait();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   465
                            } catch (InterruptedException e) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   466
                                return;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   467
                            }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   468
                        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   469
                        isDisplayed = true;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   470
                    } finally {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   471
                        XToolkit.awtUnlock();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   472
                    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   473
                    _display(msg.caption, msg.text, msg.messageType);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   474
                }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   475
            }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   476
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   477
            void display(String caption, String text, String messageType) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   478
                messageQueue.offer(new Message(caption, text, messageType));
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   479
            }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   480
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   481
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   482
        private static class Message {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   483
            String caption, text, messageType;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   484
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   485
            Message(String caption, String text, String messageType) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   486
                this.caption = caption;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   487
                this.text = text;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   488
                this.messageType = messageType;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   489
            }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   490
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   491
    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   492
}
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents:
diff changeset
   493