1 /*
2 * Copyright (c) 2008, 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
26 package sun.awt;
27
28 import java.awt.*;
29 import java.awt.KeyboardFocusManager;
30 import java.awt.event.InputEvent;
31 import java.awt.geom.Point2D;
32 import java.awt.image.BufferedImage;
33
34 import sun.misc.Unsafe;
35 import java.awt.peer.ComponentPeer;
36
37 import java.security.AccessController;
38 import java.security.AccessControlContext;
39
40 import java.io.File;
41
42 /**
43 * The AWTAccessor utility class.
44 * The main purpose of this class is to enable accessing
45 * private and package-private fields of classes from
46 * different classes/packages. See sun.misc.SharedSecretes
47 * for another example.
48 */
49 public final class AWTAccessor {
50
51 private static final Unsafe unsafe = Unsafe.getUnsafe();
52
53 /*
54 * We don't need any objects of this class.
55 * It's rather a collection of static methods
56 * and interfaces.
57 */
58 private AWTAccessor() {
59 }
60
61 /*
62 * An interface of accessor for the java.awt.Component class.
63 */
64 public interface ComponentAccessor {
65 /*
66 * Sets whether the native background erase for a component
67 * has been disabled via SunToolkit.disableBackgroundErase().
68 */
69 void setBackgroundEraseDisabled(Component comp, boolean disabled);
70 /*
71 * Indicates whether the native background erase for a
72 * component has been disabled via
73 * SunToolkit.disableBackgroundErase().
74 */
75 boolean getBackgroundEraseDisabled(Component comp);
76 /*
77 *
78 * Gets the bounds of this component in the form of a
79 * <code>Rectangle</code> object. The bounds specify this
80 * component's width, height, and location relative to
81 * its parent.
82 */
83 Rectangle getBounds(Component comp);
84 /*
85 * Sets the shape of a lw component to cut out from hw components.
86 *
87 * See 6797587, 6776743, 6768307, and 6768332 for details
88 */
89 void setMixingCutoutShape(Component comp, Shape shape);
90
91 /**
92 * Sets GraphicsConfiguration value for the component.
93 */
94 void setGraphicsConfiguration(Component comp, GraphicsConfiguration gc);
95 /*
96 * Requests focus to the component.
97 */
98 boolean requestFocus(Component comp, CausedFocusEvent.Cause cause);
99 /*
100 * Determines if the component can gain focus.
101 */
102 boolean canBeFocusOwner(Component comp);
103
104 /**
105 * Returns whether the component is visible without invoking
106 * any client code.
107 */
108 boolean isVisible(Component comp);
109
110 /**
111 * Sets the RequestFocusController.
112 */
113 void setRequestFocusController(RequestFocusController requestController);
114
115 /**
116 * Returns the appContext of the component.
117 */
118 AppContext getAppContext(Component comp);
119
120 /**
121 * Sets the appContext of the component.
122 */
123 void setAppContext(Component comp, AppContext appContext);
124
125 /**
126 * Returns the parent of the component.
127 */
128 Container getParent(Component comp);
129
130 /**
131 * Sets the parent of the component to the specified parent.
132 */
133 void setParent(Component comp, Container parent);
134
135 /**
136 * Resizes the component to the specified width and height.
137 */
138 void setSize(Component comp, int width, int height);
139
140 /**
141 * Returns the location of the component.
142 */
143 Point getLocation(Component comp);
144
145 /**
146 * Moves the component to the new location.
147 */
148 void setLocation(Component comp, int x, int y);
149
150 /**
151 * Determines whether this component is enabled.
152 */
153 boolean isEnabled(Component comp);
154
155 /**
156 * Determines whether this component is displayable.
157 */
158 boolean isDisplayable(Component comp);
159
160 /**
161 * Gets the cursor set in the component.
162 */
163 Cursor getCursor(Component comp);
164
165 /**
166 * Returns the peer of the component.
167 */
168 ComponentPeer getPeer(Component comp);
169
170 /**
171 * Sets the peer of the component to the specified peer.
172 */
173 void setPeer(Component comp, ComponentPeer peer);
174
175 /**
176 * Determines whether this component is lightweight.
177 */
178 boolean isLightweight(Component comp);
179
180 /**
181 * Returns whether or not paint messages received from
182 * the operating system should be ignored.
183 */
184 boolean getIgnoreRepaint(Component comp);
185
186 /**
187 * Returns the width of the component.
188 */
189 int getWidth(Component comp);
190
191 /**
192 * Returns the height of the component.
193 */
194 int getHeight(Component comp);
195
196 /**
197 * Returns the x coordinate of the component.
198 */
199 int getX(Component comp);
200
201 /**
202 * Returns the y coordinate of the component.
203 */
204 int getY(Component comp);
205
206 /**
207 * Gets the foreground color of this component.
208 */
209 Color getForeground(Component comp);
210
211 /**
212 * Gets the background color of this component.
213 */
214 Color getBackground(Component comp);
215
216 /**
217 * Sets the background of this component to the specified color.
218 */
219 void setBackground(Component comp, Color background);
220
221 /**
222 * Gets the font of the component.
223 */
224 Font getFont(Component comp);
225
226 /**
227 * Processes events occurring on this component.
228 */
229 void processEvent(Component comp, AWTEvent e);
230
231
232 /*
233 * Returns the acc this component was constructed with.
234 */
235 AccessControlContext getAccessControlContext(Component comp);
236
237 }
238
239 /*
240 * An interface of accessor for the java.awt.Container class.
241 */
242 public interface ContainerAccessor {
243 /**
244 * Validates the container unconditionally.
245 */
246 void validateUnconditionally(Container cont);
247 }
248
249 /*
250 * An interface of accessor for java.awt.Window class.
251 */
252 public interface WindowAccessor {
253 /*
254 * Get opacity level of the given window.
255 */
256 float getOpacity(Window window);
257 /*
258 * Set opacity level to the given window.
259 */
260 void setOpacity(Window window, float opacity);
261 /*
262 * Get a shape assigned to the given window.
263 */
264 Shape getShape(Window window);
265 /*
266 * Set a shape to the given window.
267 */
268 void setShape(Window window, Shape shape);
269 /*
270 * Set the opaque preoperty to the given window.
271 */
272 void setOpaque(Window window, boolean isOpaque);
273 /*
274 * Update the image of a non-opaque (translucent) window.
275 */
276 void updateWindow(Window window);
277
278 /** Get the size of the security warning.
279 */
280 Dimension getSecurityWarningSize(Window w);
281
282 /**
283 * Set the size of the security warning.
284 */
285 void setSecurityWarningSize(Window w, int width, int height);
286
287 /** Set the position of the security warning.
288 */
289 void setSecurityWarningPosition(Window w, Point2D point,
290 float alignmentX, float alignmentY);
291
292 /** Request to recalculate the new position of the security warning for
293 * the given window size/location as reported by the native system.
294 */
295 Point2D calculateSecurityWarningPosition(Window window,
296 double x, double y, double w, double h);
297
298 /** Sets the synchronous status of focus requests on lightweight
299 * components in the specified window to the specified value.
300 */
301 void setLWRequestStatus(Window changed, boolean status);
302
303 /**
304 * Indicates whether this window should receive focus on subsequently
305 * being shown, or being moved to the front.
306 */
307 boolean isAutoRequestFocus(Window w);
308
309 /**
310 * Indicates whether the specified window is an utility window for TrayIcon.
311 */
312 boolean isTrayIconWindow(Window w);
313
314 /**
315 * Marks the specified window as an utility window for TrayIcon.
316 */
317 void setTrayIconWindow(Window w, boolean isTrayIconWindow);
318 }
319
320 /*
321 * An accessor for the AWTEvent class.
322 */
323 public interface AWTEventAccessor {
324 /**
325 * Marks the event as posted.
326 */
327 void setPosted(AWTEvent ev);
328
329 /**
330 * Sets the flag on this AWTEvent indicating that it was
331 * generated by the system.
332 */
333 void setSystemGenerated(AWTEvent ev);
334
335 /**
336 * Indicates whether this AWTEvent was generated by the system.
337 */
338 boolean isSystemGenerated(AWTEvent ev);
339
340
341 /*
342 * Returns the acc this event was constructed with.
343 */
344 AccessControlContext getAccessControlContext(AWTEvent ev);
345
346 }
347
348 public interface InputEventAccessor {
349 /*
350 * Accessor for InputEvent.getButtonDownMasks()
351 */
352 int[] getButtonDownMasks();
353 }
354
355 /*
356 * An accessor for the java.awt.Frame class.
357 */
358 public interface FrameAccessor {
359 /*
360 * Sets the state of this frame.
361 */
362 void setExtendedState(Frame frame, int state);
363 /*
364 * Gets the state of this frame.
365 */
366 int getExtendedState(Frame frame);
367 /*
368 * Gets the maximized bounds of this frame.
369 */
370 Rectangle getMaximizedBounds(Frame frame);
371 }
372
373 /*
374 * An interface of accessor for the java.awt.KeyboardFocusManager class.
375 */
376 public interface KeyboardFocusManagerAccessor {
377 /*
378 * Indicates whether the native implementation should
379 * proceed with a pending focus request for the heavyweight.
380 */
381 int shouldNativelyFocusHeavyweight(Component heavyweight,
382 Component descendant,
383 boolean temporary,
384 boolean focusedWindowChangeAllowed,
385 long time,
386 CausedFocusEvent.Cause cause);
387 /*
388 * Delivers focus for the lightweight descendant of the heavyweight
389 * synchronously.
390 */
391 boolean processSynchronousLightweightTransfer(Component heavyweight,
392 Component descendant,
393 boolean temporary,
394 boolean focusedWindowChangeAllowed,
395 long time);
396 /*
397 * Removes the last focus request for the heavyweight from the queue.
398 */
399 void removeLastFocusRequest(Component heavyweight);
400
401 /*
402 * Sets the most recent focus owner in the window.
403 */
404 void setMostRecentFocusOwner(Window window, Component component);
405
406 /*
407 * Returns current KFM of the specified AppContext.
408 */
409 KeyboardFocusManager getCurrentKeyboardFocusManager(AppContext ctx);
410 }
411
412 /*
413 * An accessor for the MenuComponent class.
414 */
415 public interface MenuComponentAccessor {
416 /**
417 * Returns the appContext of the menu component.
418 */
419 AppContext getAppContext(MenuComponent menuComp);
420
421 /**
422 * Sets the appContext of the menu component.
423 */
424 void setAppContext(MenuComponent menuComp, AppContext appContext);
425
426 /**
427 * Returns the menu container of the menu component
428 */
429 MenuContainer getParent(MenuComponent menuComp);
430 }
431
432 /*
433 * An accessor for the EventQueue class
434 */
435 public interface EventQueueAccessor {
436 /*
437 * Gets the event dispatch thread.
438 */
439 Thread getDispatchThread(EventQueue eventQueue);
440 /*
441 * Checks if the current thread is EDT for the given EQ.
442 */
443 public boolean isDispatchThreadImpl(EventQueue eventQueue);
444 }
445
446 /*
447 * An accessor for the PopupMenu class
448 */
449 public interface PopupMenuAccessor {
450 /*
451 * Returns whether the popup menu is attached to a tray
452 */
453 boolean isTrayIconPopup(PopupMenu popupMenu);
454 }
455
456 /*
457 * An accessor for the FileDialog class
458 */
459 public interface FileDialogAccessor {
460 /*
461 * Sets the files the user selects
462 */
463 void setFiles(FileDialog fileDialog, File files[]);
464
465 /*
466 * Sets the file the user selects
467 */
468 void setFile(FileDialog fileDialog, String file);
469
470 /*
471 * Sets the directory the user selects
472 */
473 void setDirectory(FileDialog fileDialog, String directory);
474
475 /*
476 * Returns whether the file dialog allows the multiple file selection.
477 */
478 boolean isMultipleMode(FileDialog fileDialog);
479 }
480
481 /*
482 * Accessor instances are initialized in the static initializers of
483 * corresponding AWT classes by using setters defined below.
484 */
485 private static ComponentAccessor componentAccessor;
486 private static ContainerAccessor containerAccessor;
487 private static WindowAccessor windowAccessor;
488 private static AWTEventAccessor awtEventAccessor;
489 private static InputEventAccessor inputEventAccessor;
490 private static FrameAccessor frameAccessor;
491 private static KeyboardFocusManagerAccessor kfmAccessor;
492 private static MenuComponentAccessor menuComponentAccessor;
493 private static EventQueueAccessor eventQueueAccessor;
494 private static PopupMenuAccessor popupMenuAccessor;
495 private static FileDialogAccessor fileDialogAccessor;
496
497 /*
498 * Set an accessor object for the java.awt.Component class.
499 */
500 public static void setComponentAccessor(ComponentAccessor ca) {
501 componentAccessor = ca;
502 }
503
504 /*
505 * Retrieve the accessor object for the java.awt.Component class.
506 */
507 public static ComponentAccessor getComponentAccessor() {
508 if (componentAccessor == null) {
509 unsafe.ensureClassInitialized(Component.class);
510 }
511
512 return componentAccessor;
513 }
514
515 /*
516 * Set an accessor object for the java.awt.Container class.
517 */
518 public static void setContainerAccessor(ContainerAccessor ca) {
519 containerAccessor = ca;
520 }
521
522 /*
523 * Retrieve the accessor object for the java.awt.Container class.
524 */
525 public static ContainerAccessor getContainerAccessor() {
526 if (containerAccessor == null) {
527 unsafe.ensureClassInitialized(Container.class);
528 }
529
530 return containerAccessor;
531 }
532
533 /*
534 * Set an accessor object for the java.awt.Window class.
535 */
536 public static void setWindowAccessor(WindowAccessor wa) {
537 windowAccessor = wa;
538 }
539
540 /*
541 * Retrieve the accessor object for the java.awt.Window class.
542 */
543 public static WindowAccessor getWindowAccessor() {
544 if (windowAccessor == null) {
545 unsafe.ensureClassInitialized(Window.class);
546 }
547 return windowAccessor;
548 }
549
550 /*
551 * Set an accessor object for the java.awt.AWTEvent class.
552 */
553 public static void setAWTEventAccessor(AWTEventAccessor aea) {
554 awtEventAccessor = aea;
555 }
556
557 /*
558 * Retrieve the accessor object for the java.awt.AWTEvent class.
559 */
560 public static AWTEventAccessor getAWTEventAccessor() {
561 if (awtEventAccessor == null) {
562 unsafe.ensureClassInitialized(AWTEvent.class);
563 }
564 return awtEventAccessor;
565 }
566
567 /*
568 * Set an accessor object for the java.awt.event.InputEvent class.
569 */
570 public static void setInputEventAccessor(InputEventAccessor iea) {
571 inputEventAccessor = iea;
572 }
573
574 /*
575 * Retrieve the accessor object for the java.awt.event.InputEvent class.
576 */
577 public static InputEventAccessor getInputEventAccessor() {
578 if (inputEventAccessor == null) {
579 unsafe.ensureClassInitialized(InputEvent.class);
580 }
581 return inputEventAccessor;
582 }
583
584 /*
585 * Set an accessor object for the java.awt.Frame class.
586 */
587 public static void setFrameAccessor(FrameAccessor fa) {
588 frameAccessor = fa;
589 }
590
591 /*
592 * Retrieve the accessor object for the java.awt.Frame class.
593 */
594 public static FrameAccessor getFrameAccessor() {
595 if (frameAccessor == null) {
596 unsafe.ensureClassInitialized(Frame.class);
597 }
598 return frameAccessor;
599 }
600
601 /*
602 * Set an accessor object for the java.awt.KeyboardFocusManager class.
603 */
604 public static void setKeyboardFocusManagerAccessor(KeyboardFocusManagerAccessor kfma) {
605 kfmAccessor = kfma;
606 }
607
608 /*
609 * Retrieve the accessor object for the java.awt.KeyboardFocusManager class.
610 */
611 public static KeyboardFocusManagerAccessor getKeyboardFocusManagerAccessor() {
612 if (kfmAccessor == null) {
613 unsafe.ensureClassInitialized(KeyboardFocusManager.class);
614 }
615 return kfmAccessor;
616 }
617
618 /*
619 * Set an accessor object for the java.awt.MenuComponent class.
620 */
621 public static void setMenuComponentAccessor(MenuComponentAccessor mca) {
622 menuComponentAccessor = mca;
623 }
624
625 /*
626 * Retrieve the accessor object for the java.awt.MenuComponent class.
627 */
628 public static MenuComponentAccessor getMenuComponentAccessor() {
629 if (menuComponentAccessor == null) {
630 unsafe.ensureClassInitialized(MenuComponent.class);
631 }
632 return menuComponentAccessor;
633 }
634
635 /*
636 * Set an accessor object for the java.awt.EventQueue class.
637 */
638 public static void setEventQueueAccessor(EventQueueAccessor eqa) {
639 eventQueueAccessor = eqa;
640 }
641
642 /*
643 * Retrieve the accessor object for the java.awt.EventQueue class.
644 */
645 public static EventQueueAccessor getEventQueueAccessor() {
646 if (eventQueueAccessor == null) {
647 unsafe.ensureClassInitialized(EventQueue.class);
648 }
649 return eventQueueAccessor;
650 }
651
652 /*
653 * Set an accessor object for the java.awt.PopupMenu class.
654 */
655 public static void setPopupMenuAccessor(PopupMenuAccessor pma) {
656 popupMenuAccessor = pma;
657 }
658
659 /*
660 * Retrieve the accessor object for the java.awt.PopupMenu class.
661 */
662 public static PopupMenuAccessor getPopupMenuAccessor() {
663 if (popupMenuAccessor == null) {
664 unsafe.ensureClassInitialized(PopupMenu.class);
665 }
666 return popupMenuAccessor;
667 }
668
669 /*
670 * Set an accessor object for the java.awt.FileDialog class.
671 */
672 public static void setFileDialogAccessor(FileDialogAccessor fda) {
673 fileDialogAccessor = fda;
674 }
675
676 /*
677 * Retrieve the accessor object for the java.awt.FileDialog class.
678 */
679 public static FileDialogAccessor getFileDialogAccessor() {
680 if (fileDialogAccessor == null) {
681 unsafe.ensureClassInitialized(FileDialog.class);
682 }
683 return fileDialogAccessor;
684 }
685
686 }
--- EOF ---