History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/java/awt/TrayIcon.java (1 of 18352 files). Show all

Unified · Split

java/pkg/java/awt/TrayIcon.java+780−0
@@ -0,0 +1,780 @@
1/*
2 * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.awt;
27
28import java.awt.Point;
29import java.awt.Toolkit;
30import java.awt.GraphicsEnvironment;
31import java.awt.event.*;
32import java.awt.AWTEvent;
33import java.awt.AWTEventMulticaster;
34import java.awt.EventQueue;
35import java.awt.PopupMenu;
36import java.awt.Image;
37import java.util.EventListener;
38import java.awt.peer.TrayIconPeer;
39import sun.awt.AppContext;
40import sun.awt.SunToolkit;
41import sun.awt.HeadlessToolkit;
42import java.util.EventObject;
43import java.security.AccessControlContext;
44import java.security.AccessController;
45
46/**
47 * A <code>TrayIcon</code> object represents a tray icon that can be
48 * added to the {@link SystemTray system tray}. A
49 * <code>TrayIcon</code> can have a tooltip (text), an image, a popup
50 * menu, and a set of listeners associated with it.
51 *
52 * <p>A <code>TrayIcon</code> can generate various {@link MouseEvent
53 * MouseEvents} and supports adding corresponding listeners to receive
54 * notification of these events. <code>TrayIcon</code> processes some
55 * of the events by itself. For example, by default, when the
56 * right-mouse click is performed on the <code>TrayIcon</code> it
57 * displays the specified popup menu. When the mouse hovers
58 * over the <code>TrayIcon</code> the tooltip is displayed.
59 *
60 * <p><strong>Note:</strong> When the <code>MouseEvent</code> is
61 * dispatched to its registered listeners its <code>component</code>
62 * property will be set to <code>null</code>. (See {@link
63 * java.awt.event.ComponentEvent#getComponent}) The
64 * <code>source</code> property will be set to this
65 * <code>TrayIcon</code>. (See {@link
66 * java.util.EventObject#getSource})
67 *
68 * <p><b>Note:</b> A well-behaved {@link TrayIcon} implementation
69 * will assign different gestures to showing a popup menu and
70 * selecting a tray icon.
71 *
72 * <p>A <code>TrayIcon</code> can generate an {@link ActionEvent
73 * ActionEvent}. On some platforms, this occurs when the user selects
74 * the tray icon using either the mouse or keyboard.
75 *
76 * <p>If a SecurityManager is installed, the AWTPermission
77 * {@code accessSystemTray} must be granted in order to create
78 * a {@code TrayIcon}. Otherwise the constructor will throw a
79 * SecurityException.
80 *
81 * <p> See the {@link SystemTray} class overview for an example on how
82 * to use the <code>TrayIcon</code> API.
83 *
84 * @since 1.6
85 * @see SystemTray#add
86 * @see java.awt.event.ComponentEvent#getComponent
87 * @see java.util.EventObject#getSource
88 *
89 * @author Bino George
90 * @author Denis Mikhalkin
91 * @author Sharon Zakhour
92 * @author Anton Tarasov
93 */
94public class TrayIcon {
95
96 private Image image;
97 private String tooltip;
98 private PopupMenu popup;
99 private boolean autosize;
100 private int id;
101 private String actionCommand;
102
103 transient private TrayIconPeer peer;
104
105 transient MouseListener mouseListener;
106 transient MouseMotionListener mouseMotionListener;
107 transient ActionListener actionListener;
108
109 /*
110 * The tray icon's AccessControlContext.
111 *
112 * Unlike the acc in Component, this field is made final
113 * because TrayIcon is not serializable.
114 */
115 private final AccessControlContext acc = AccessController.getContext();
116
117 /*
118 * Returns the acc this tray icon was constructed with.
119 */
120 final AccessControlContext getAccessControlContext() {
121 if (acc == null) {
122 throw new SecurityException("TrayIcon is missing AccessControlContext");
123 }
124 return acc;
125 }
126
127 static {
128 Toolkit.loadLibraries();
129 if (!GraphicsEnvironment.isHeadless()) {
130 initIDs();
131 }
132 }
133
134 private TrayIcon()
135 throws UnsupportedOperationException, HeadlessException, SecurityException
136 {
137 SystemTray.checkSystemTrayAllowed();
138 if (GraphicsEnvironment.isHeadless()) {
139 throw new HeadlessException();
140 }
141 if (!SystemTray.isSupported()) {
142 throw new UnsupportedOperationException();
143 }
144 SunToolkit.insertTargetMapping(this, AppContext.getAppContext());
145 }
146
147 /**
148 * Creates a <code>TrayIcon</code> with the specified image.
149 *
150 * @param image the <code>Image</code> to be used
151 * @throws IllegalArgumentException if <code>image</code> is
152 * <code>null</code>
153 * @throws UnsupportedOperationException if the system tray isn't
154 * supported by the current platform
155 * @throws HeadlessException if
156 * {@code GraphicsEnvironment.isHeadless()} returns {@code true}
157 * @throws SecurityException if {@code accessSystemTray} permission
158 * is not granted
159 * @see SystemTray#add(TrayIcon)
160 * @see TrayIcon#TrayIcon(Image, String, PopupMenu)
161 * @see TrayIcon#TrayIcon(Image, String)
162 * @see SecurityManager#checkPermission
163 * @see AWTPermission
164 */
165 public TrayIcon(Image image) {
166 this();
167 if (image == null) {
168 throw new IllegalArgumentException("creating TrayIcon with null Image");
169 }
170 setImage(image);
171 }
172
173 /**
174 * Creates a <code>TrayIcon</code> with the specified image and
175 * tooltip text.
176 *
177 * @param image the <code>Image</code> to be used
178 * @param tooltip the string to be used as tooltip text; if the
179 * value is <code>null</code> no tooltip is shown
180 * @throws IllegalArgumentException if <code>image</code> is
181 * <code>null</code>
182 * @throws UnsupportedOperationException if the system tray isn't
183 * supported by the current platform
184 * @throws HeadlessException if
185 * {@code GraphicsEnvironment.isHeadless()} returns {@code true}
186 * @throws SecurityException if {@code accessSystemTray} permission
187 * is not granted
188 * @see SystemTray#add(TrayIcon)
189 * @see TrayIcon#TrayIcon(Image)
190 * @see TrayIcon#TrayIcon(Image, String, PopupMenu)
191 * @see SecurityManager#checkPermission
192 * @see AWTPermission
193 */
194 public TrayIcon(Image image, String tooltip) {
195 this(image);
196 setToolTip(tooltip);
197 }
198
199 /**
200 * Creates a <code>TrayIcon</code> with the specified image,
201 * tooltip and popup menu.
202 *
203 * @param image the <code>Image</code> to be used
204 * @param tooltip the string to be used as tooltip text; if the
205 * value is <code>null</code> no tooltip is shown
206 * @param popup the menu to be used for the tray icon's popup
207 * menu; if the value is <code>null</code> no popup menu is shown
208 * @throws IllegalArgumentException if <code>image</code> is <code>null</code>
209 * @throws UnsupportedOperationException if the system tray isn't
210 * supported by the current platform
211 * @throws HeadlessException if
212 * {@code GraphicsEnvironment.isHeadless()} returns {@code true}
213 * @throws SecurityException if {@code accessSystemTray} permission
214 * is not granted
215 * @see SystemTray#add(TrayIcon)
216 * @see TrayIcon#TrayIcon(Image, String)
217 * @see TrayIcon#TrayIcon(Image)
218 * @see PopupMenu
219 * @see MouseListener
220 * @see #addMouseListener(MouseListener)
221 * @see SecurityManager#checkPermission
222 * @see AWTPermission
223 */
224 public TrayIcon(Image image, String tooltip, PopupMenu popup) {
225 this(image, tooltip);
226 setPopupMenu(popup);
227 }
228
229 /**
230 * Sets the image for this <code>TrayIcon</code>. The previous
231 * tray icon image is discarded without calling the {@link
232 * java.awt.Image#flush} method &#151; you will need to call it
233 * manually.
234 *
235 * <p> If the image represents an animated image, it will be
236 * animated automatically.
237 *
238 * <p> See the {@link #setImageAutoSize(boolean)} property for
239 * details on the size of the displayed image.
240 *
241 * <p> Calling this method with the same image that is currently
242 * being used has no effect.
243 *
244 * @throws NullPointerException if <code>image</code> is <code>null</code>
245 * @param image the non-null <code>Image</code> to be used
246 * @see #getImage
247 * @see Image
248 * @see SystemTray#add(TrayIcon)
249 * @see TrayIcon#TrayIcon(Image, String)
250 */
251 public void setImage(Image image) {
252 if (image == null) {
253 throw new NullPointerException("setting null Image");
254 }
255 this.image = image;
256
257 TrayIconPeer peer = this.peer;
258 if (peer != null) {
259 peer.updateImage();
260 }
261 }
262
263 /**
264 * Returns the current image used for this <code>TrayIcon</code>.
265 *
266 * @return the image
267 * @see #setImage(Image)
268 * @see Image
269 */
270 public Image getImage() {
271 return image;
272 }
273
274 /**
275 * Sets the popup menu for this <code>TrayIcon</code>. If
276 * <code>popup</code> is <code>null</code>, no popup menu will be
277 * associated with this <code>TrayIcon</code>.
278 *
279 * <p>Note that this <code>popup</code> must not be added to any
280 * parent before or after it is set on the tray icon. If you add
281 * it to some parent, the <code>popup</code> may be removed from
282 * that parent.
283 *
284 * <p>The {@code popup} can be set on one {@code TrayIcon} only.
285 * Setting the same popup on multiple {@code TrayIcon}s will cause
286 * an {@code IllegalArgumentException}.
287 *
288 * <p><strong>Note:</strong> Some platforms may not support
289 * showing the user-specified popup menu component when the user
290 * right-clicks the tray icon. In this situation, either no menu
291 * will be displayed or, on some systems, a native version of the
292 * menu may be displayed.
293 *
294 * @throws IllegalArgumentException if the {@code popup} is already
295 * set for another {@code TrayIcon}
296 * @param popup a <code>PopupMenu</code> or <code>null</code> to
297 * remove any popup menu
298 * @see #getPopupMenu
299 */
300 public void setPopupMenu(PopupMenu popup) {
301 if (popup == this.popup) {
302 return;
303 }
304 synchronized (TrayIcon.class) {
305 if (popup != null) {
306 if (popup.isTrayIconPopup) {
307 throw new IllegalArgumentException("the PopupMenu is already set for another TrayIcon");
308 }
309 popup.isTrayIconPopup = true;
310 }
311 if (this.popup != null) {
312 this.popup.isTrayIconPopup = false;
313 }
314 this.popup = popup;
315 }
316 }
317
318 /**
319 * Returns the popup menu associated with this <code>TrayIcon</code>.
320 *
321 * @return the popup menu or <code>null</code> if none exists
322 * @see #setPopupMenu(PopupMenu)
323 */
324 public PopupMenu getPopupMenu() {
325 return popup;
326 }
327
328 /**
329 * Sets the tooltip string for this <code>TrayIcon</code>. The
330 * tooltip is displayed automatically when the mouse hovers over
331 * the icon. Setting the tooltip to <code>null</code> removes any
332 * tooltip text.
333 *
334 * When displayed, the tooltip string may be truncated on some platforms;
335 * the number of characters that may be displayed is platform-dependent.
336 *
337 * @param tooltip the string for the tooltip; if the value is
338 * <code>null</code> no tooltip is shown
339 * @see #getToolTip
340 */
341 public void setToolTip(String tooltip) {
342 this.tooltip = tooltip;
343
344 TrayIconPeer peer = this.peer;
345 if (peer != null) {
346 peer.setToolTip(tooltip);
347 }
348 }
349
350 /**
351 * Returns the tooltip string associated with this
352 * <code>TrayIcon</code>.
353 *
354 * @return the tooltip string or <code>null</code> if none exists
355 * @see #setToolTip(String)
356 */
357 public String getToolTip() {
358 return tooltip;
359 }
360
361 /**
362 * Sets the auto-size property. Auto-size determines whether the
363 * tray image is automatically sized to fit the space allocated
364 * for the image on the tray. By default, the auto-size property
365 * is set to <code>false</code>.
366 *
367 * <p> If auto-size is <code>false</code>, and the image size
368 * doesn't match the tray icon space, the image is painted as-is
369 * inside that space &#151; if larger than the allocated space, it will
370 * be cropped.
371 *
372 * <p> If auto-size is <code>true</code>, the image is stretched or shrunk to
373 * fit the tray icon space.
374 *
375 * @param autosize <code>true</code> to auto-size the image,
376 * <code>false</code> otherwise
377 * @see #isImageAutoSize
378 */
379 public void setImageAutoSize(boolean autosize) {
380 this.autosize = autosize;
381
382 TrayIconPeer peer = this.peer;
383 if (peer != null) {
384 peer.updateImage();
385 }
386 }
387
388 /**
389 * Returns the value of the auto-size property.
390 *
391 * @return <code>true</code> if the image will be auto-sized,
392 * <code>false</code> otherwise
393 * @see #setImageAutoSize(boolean)
394 */
395 public boolean isImageAutoSize() {
396 return autosize;
397 }
398
399 /**
400 * Adds the specified mouse listener to receive mouse events from
401 * this <code>TrayIcon</code>. Calling this method with a
402 * <code>null</code> value has no effect.
403 *
404 * <p><b>Note</b>: The {@code MouseEvent}'s coordinates (received
405 * from the {@code TrayIcon}) are relative to the screen, not the
406 * {@code TrayIcon}.
407 *
408 * <p> <b>Note: </b>The <code>MOUSE_ENTERED</code> and
409 * <code>MOUSE_EXITED</code> mouse events are not supported.
410 * <p>Refer to <a href="doc-files/AWTThreadIssues.html#ListenersThreads"
411 * >AWT Threading Issues</a> for details on AWT's threading model.
412 *
413 * @param listener the mouse listener
414 * @see java.awt.event.MouseEvent
415 * @see java.awt.event.MouseListener
416 * @see #removeMouseListener(MouseListener)
417 * @see #getMouseListeners
418 */
419 public synchronized void addMouseListener(MouseListener listener) {
420 if (listener == null) {
421 return;
422 }
423 mouseListener = AWTEventMulticaster.add(mouseListener, listener);
424 }
425
426 /**
427 * Removes the specified mouse listener. Calling this method with
428 * <code>null</code> or an invalid value has no effect.
429 * <p>Refer to <a href="doc-files/AWTThreadIssues.html#ListenersThreads"
430 * >AWT Threading Issues</a> for details on AWT's threading model.
431 *
432 * @param listener the mouse listener
433 * @see java.awt.event.MouseEvent
434 * @see java.awt.event.MouseListener
435 * @see #addMouseListener(MouseListener)
436 * @see #getMouseListeners
437 */
438 public synchronized void removeMouseListener(MouseListener listener) {
439 if (listener == null) {
440 return;
441 }
442 mouseListener = AWTEventMulticaster.remove(mouseListener, listener);
443 }
444
445 /**
446 * Returns an array of all the mouse listeners
447 * registered on this <code>TrayIcon</code>.
448 *
449 * @return all of the <code>MouseListeners</code> registered on
450 * this <code>TrayIcon</code> or an empty array if no mouse
451 * listeners are currently registered
452 *
453 * @see #addMouseListener(MouseListener)
454 * @see #removeMouseListener(MouseListener)
455 * @see java.awt.event.MouseListener
456 */
457 public synchronized MouseListener[] getMouseListeners() {
458 return AWTEventMulticaster.getListeners(mouseListener, MouseListener.class);
459 }
460
461 /**
462 * Adds the specified mouse listener to receive mouse-motion
463 * events from this <code>TrayIcon</code>. Calling this method
464 * with a <code>null</code> value has no effect.
465 *
466 * <p><b>Note</b>: The {@code MouseEvent}'s coordinates (received
467 * from the {@code TrayIcon}) are relative to the screen, not the
468 * {@code TrayIcon}.
469 *
470 * <p> <b>Note: </b>The <code>MOUSE_DRAGGED</code> mouse event is not supported.
471 * <p>Refer to <a href="doc-files/AWTThreadIssues.html#ListenersThreads"
472 * >AWT Threading Issues</a> for details on AWT's threading model.
473 *
474 * @param listener the mouse listener
475 * @see java.awt.event.MouseEvent
476 * @see java.awt.event.MouseMotionListener
477 * @see #removeMouseMotionListener(MouseMotionListener)
478 * @see #getMouseMotionListeners
479 */
480 public synchronized void addMouseMotionListener(MouseMotionListener listener) {
481 if (listener == null) {
482 return;
483 }
484 mouseMotionListener = AWTEventMulticaster.add(mouseMotionListener, listener);
485 }
486
487 /**
488 * Removes the specified mouse-motion listener. Calling this method with
489 * <code>null</code> or an invalid value has no effect.
490 * <p>Refer to <a href="doc-files/AWTThreadIssues.html#ListenersThreads"
491 * >AWT Threading Issues</a> for details on AWT's threading model.
492 *
493 * @param listener the mouse listener
494 * @see java.awt.event.MouseEvent
495 * @see java.awt.event.MouseMotionListener
496 * @see #addMouseMotionListener(MouseMotionListener)
497 * @see #getMouseMotionListeners
498 */
499 public synchronized void removeMouseMotionListener(MouseMotionListener listener) {
500 if (listener == null) {
501 return;
502 }
503 mouseMotionListener = AWTEventMulticaster.remove(mouseMotionListener, listener);
504 }
505
506 /**
507 * Returns an array of all the mouse-motion listeners
508 * registered on this <code>TrayIcon</code>.
509 *
510 * @return all of the <code>MouseInputListeners</code> registered on
511 * this <code>TrayIcon</code> or an empty array if no mouse
512 * listeners are currently registered
513 *
514 * @see #addMouseMotionListener(MouseMotionListener)
515 * @see #removeMouseMotionListener(MouseMotionListener)
516 * @see java.awt.event.MouseMotionListener
517 */
518 public synchronized MouseMotionListener[] getMouseMotionListeners() {
519 return AWTEventMulticaster.getListeners(mouseMotionListener, MouseMotionListener.class);
520 }
521
522 /**
523 * Returns the command name of the action event fired by this tray icon.
524 *
525 * @return the action command name, or <code>null</code> if none exists
526 * @see #addActionListener(ActionListener)
527 * @see #setActionCommand(String)
528 */
529 public String getActionCommand() {
530 return actionCommand;
531 }
532
533 /**
534 * Sets the command name for the action event fired by this tray
535 * icon. By default, this action command is set to
536 * <code>null</code>.
537 *
538 * @param command a string used to set the tray icon's
539 * action command.
540 * @see java.awt.event.ActionEvent
541 * @see #addActionListener(ActionListener)
542 * @see #getActionCommand
543 */
544 public void setActionCommand(String command) {
545 actionCommand = command;
546 }
547
548 /**
549 * Adds the specified action listener to receive
550 * <code>ActionEvent</code>s from this <code>TrayIcon</code>.
551 * Action events usually occur when a user selects the tray icon,
552 * using either the mouse or keyboard. The conditions in which
553 * action events are generated are platform-dependent.
554 *
555 * <p>Calling this method with a <code>null</code> value has no
556 * effect.
557 * <p>Refer to <a href="doc-files/AWTThreadIssues.html#ListenersThreads"
558 * >AWT Threading Issues</a> for details on AWT's threading model.
559 *
560 * @param listener the action listener
561 * @see #removeActionListener
562 * @see #getActionListeners
563 * @see java.awt.event.ActionListener
564 * @see #setActionCommand(String)
565 */
566 public synchronized void addActionListener(ActionListener listener) {
567 if (listener == null) {
568 return;
569 }
570 actionListener = AWTEventMulticaster.add(actionListener, listener);
571 }
572
573 /**
574 * Removes the specified action listener. Calling this method with
575 * <code>null</code> or an invalid value has no effect.
576 * <p>Refer to <a href="doc-files/AWTThreadIssues.html#ListenersThreads"
577 * >AWT Threading Issues</a> for details on AWT's threading model.
578 *
579 * @param listener the action listener
580 * @see java.awt.event.ActionEvent
581 * @see java.awt.event.ActionListener
582 * @see #addActionListener(ActionListener)
583 * @see #getActionListeners
584 * @see #setActionCommand(String)
585 */
586 public synchronized void removeActionListener(ActionListener listener) {
587 if (listener == null) {
588 return;
589 }
590 actionListener = AWTEventMulticaster.remove(actionListener, listener);
591 }
592
593 /**
594 * Returns an array of all the action listeners
595 * registered on this <code>TrayIcon</code>.
596 *
597 * @return all of the <code>ActionListeners</code> registered on
598 * this <code>TrayIcon</code> or an empty array if no action
599 * listeners are currently registered
600 *
601 * @see #addActionListener(ActionListener)
602 * @see #removeActionListener(ActionListener)
603 * @see java.awt.event.ActionListener
604 */
605 public synchronized ActionListener[] getActionListeners() {
606 return AWTEventMulticaster.getListeners(actionListener, ActionListener.class);
607 }
608
609 /**
610 * The message type determines which icon will be displayed in the
611 * caption of the message, and a possible system sound a message
612 * may generate upon showing.
613 *
614 * @see TrayIcon
615 * @see TrayIcon#displayMessage(String, String, MessageType)
616 * @since 1.6
617 */
618 public enum MessageType {
619 /** An error message */
620 ERROR,
621 /** A warning message */
622 WARNING,
623 /** An information message */
624 INFO,
625 /** Simple message */
626 NONE
627 };
628
629 /**
630 * Displays a popup message near the tray icon. The message will
631 * disappear after a time or if the user clicks on it. Clicking
632 * on the message may trigger an {@code ActionEvent}.
633 *
634 * <p>Either the caption or the text may be <code>null</code>, but an
635 * <code>NullPointerException</code> is thrown if both are
636 * <code>null</code>.
637 *
638 * When displayed, the caption or text strings may be truncated on
639 * some platforms; the number of characters that may be displayed is
640 * platform-dependent.
641 *
642 * <p><strong>Note:</strong> Some platforms may not support
643 * showing a message.
644 *
645 * @param caption the caption displayed above the text, usually in
646 * bold; may be <code>null</code>
647 * @param text the text displayed for the particular message; may be
648 * <code>null</code>
649 * @param messageType an enum indicating the message type
650 * @throws NullPointerException if both <code>caption</code>
651 * and <code>text</code> are <code>null</code>
652 */
653 public void displayMessage(String caption, String text, MessageType messageType) {
654 if (caption == null && text == null) {
655 throw new NullPointerException("displaying the message with both caption and text being null");
656 }
657
658 TrayIconPeer peer = this.peer;
659 if (peer != null) {
660 peer.displayMessage(caption, text, messageType.name());
661 }
662 }
663
664 /**
665 * Returns the size, in pixels, of the space that the tray icon
666 * occupies in the system tray. For the tray icon that is not yet
667 * added to the system tray, the returned size is equal to the
668 * result of the {@link SystemTray#getTrayIconSize}.
669 *
670 * @return the size of the tray icon, in pixels
671 * @see TrayIcon#setImageAutoSize(boolean)
672 * @see java.awt.Image
673 * @see TrayIcon#getSize()
674 */
675 public Dimension getSize() {
676 return SystemTray.getSystemTray().getTrayIconSize();
677 }
678
679 // ****************************************************************
680 // ****************************************************************
681
682 void addNotify()
683 throws AWTException
684 {
685 synchronized (this) {
686 if (peer == null) {
687 Toolkit toolkit = Toolkit.getDefaultToolkit();
688 if (toolkit instanceof SunToolkit) {
689 peer = ((SunToolkit)Toolkit.getDefaultToolkit()).createTrayIcon(this);
690 } else if (toolkit instanceof HeadlessToolkit) {
691 peer = ((HeadlessToolkit)Toolkit.getDefaultToolkit()).createTrayIcon(this);
692 }
693 }
694 }
695 peer.setToolTip(tooltip);
696 }
697
698 void removeNotify() {
699 TrayIconPeer p = null;
700 synchronized (this) {
701 p = peer;
702 peer = null;
703 }
704 if (p != null) {
705 p.dispose();
706 }
707 }
708
709 void setID(int id) {
710 this.id = id;
711 }
712
713 int getID(){
714 return id;
715 }
716
717 void dispatchEvent(AWTEvent e) {
718 EventQueue.setCurrentEventAndMostRecentTime(e);
719 Toolkit.getDefaultToolkit().notifyAWTEventListeners(e);
720 processEvent(e);
721 }
722
723 void processEvent(AWTEvent e) {
724 if (e instanceof MouseEvent) {
725 switch(e.getID()) {
726 case MouseEvent.MOUSE_PRESSED:
727 case MouseEvent.MOUSE_RELEASED:
728 case MouseEvent.MOUSE_CLICKED:
729 processMouseEvent((MouseEvent)e);
730 break;
731 case MouseEvent.MOUSE_MOVED:
732 processMouseMotionEvent((MouseEvent)e);
733 break;
734 default:
735 return;
736 }
737 } else if (e instanceof ActionEvent) {
738 processActionEvent((ActionEvent)e);
739 }
740 }
741
742 void processMouseEvent(MouseEvent e) {
743 MouseListener listener = mouseListener;
744
745 if (listener != null) {
746 int id = e.getID();
747 switch(id) {
748 case MouseEvent.MOUSE_PRESSED:
749 listener.mousePressed(e);
750 break;
751 case MouseEvent.MOUSE_RELEASED:
752 listener.mouseReleased(e);
753 break;
754 case MouseEvent.MOUSE_CLICKED:
755 listener.mouseClicked(e);
756 break;
757 default:
758 return;
759 }
760 }
761 }
762
763 void processMouseMotionEvent(MouseEvent e) {
764 MouseMotionListener listener = mouseMotionListener;
765 if (listener != null &&
766 e.getID() == MouseEvent.MOUSE_MOVED)
767 {
768 listener.mouseMoved(e);
769 }
770 }
771
772 void processActionEvent(ActionEvent e) {
773 ActionListener listener = actionListener;
774 if (listener != null) {
775 listener.actionPerformed(e);
776 }
777 }
778
779 private static native void initIDs();
780}