| 1 7 package javax.swing; 8 9 10 import java.util.Hashtable ; 11 import java.util.Dictionary ; 12 import java.util.Enumeration ; 13 import java.util.Locale ; 14 import java.util.Vector ; 15 import java.util.EventListener ; 16 import java.util.Set ; 17 import java.util.TreeSet ; 18 import java.util.Map ; 19 import java.util.HashMap ; 20 21 import java.awt.*; 22 import java.awt.event.*; 23 import java.awt.image.VolatileImage ; 24 import java.awt.Graphics2D ; 25 import java.awt.peer.LightweightPeer; 26 import java.awt.dnd.DropTarget ; 27 import java.awt.font.FontRenderContext ; 28 import java.beans.*; 29 30 import java.applet.Applet ; 31 32 import java.io.Serializable ; 33 import java.io.ObjectOutputStream ; 34 import java.io.ObjectInputStream ; 35 import java.io.IOException ; 36 import java.io.ObjectInputValidation ; 37 import java.io.InvalidObjectException ; 38 39 import java.lang.reflect.Method ; 40 41 import javax.swing.border.*; 42 import javax.swing.event.*; 43 import javax.swing.plaf.*; 44 import javax.accessibility.*; 45 46 import com.sun.java.swing.SwingUtilities2; 47 import sun.font.FontDesignMetrics; 48 import sun.swing.AccessibleMethod; 49 50 160 public abstract class JComponent extends Container implements Serializable  161 { 162 166 private static final String uiClassID = "ComponentUI"; 167 168 171 private static final StringBuffer ANCESTOR_NOTIFIER_KEY = new StringBuffer ( 172 "AncestorNotifier"); 173 174 177 private static final StringBuffer TRANSFER_HANDLER_KEY = new StringBuffer ( 178 "TransferHandler"); 179 180 183 private static final StringBuffer INPUT_VERIFIER_KEY = new StringBuffer ( 184 "InputVerifier"); 185 186 189 private static final Hashtable readObjectCallbacks = new Hashtable (1); 190 191 195 private static Set managingFocusForwardTraversalKeys; 196 197 201 private static Set managingFocusBackwardTraversalKeys; 202 203 208 private static boolean suppressDropSupport; 209 210 214 private static boolean checkedSuppressDropSupport; 215 216 private static final int NOT_OBSCURED = 0; 218 private static final int PARTIALLY_OBSCURED = 1; 219 private static final int COMPLETELY_OBSCURED = 2; 220 221 224 static boolean DEBUG_GRAPHICS_LOADED; 225 226 229 private static final Map <Font,FontMetrics> aaFontMap; 230 231 234 private boolean isAlignmentXSet; 235 private float alignmentX; 236 private boolean isAlignmentYSet; 237 private float alignmentY; 238 239 242 243 244 protected transient ComponentUI ui; 245 246 protected EventListenerList listenerList = new EventListenerList(); 247 248 private transient ArrayTable clientProperties; 249 private VetoableChangeSupport vetoableChangeSupport; 250 253 private boolean autoscrolls; 254 private Border border; 255 private int flags; 256 257 258 private InputVerifier inputVerifier = null; 259 260 private boolean verifyInputWhenFocusTarget = true; 261 262 269 transient Component paintingChild; 270 271 276 public static final int WHEN_FOCUSED = 0; 277 278 284 public static final int WHEN_ANCESTOR_OF_FOCUSED_COMPONENT = 1; 285 286 292 public static final int WHEN_IN_FOCUSED_WINDOW = 2; 293 294 297 public static final int UNDEFINED_CONDITION = -1; 298 299 302 private static final String KEYBOARD_BINDINGS_KEY = "_KeyboardBindings"; 303 304 309 private static final String WHEN_IN_FOCUSED_WINDOW_BINDINGS = "_WhenInFocusedWindow"; 310 311 315 public static final String TOOL_TIP_TEXT_KEY = "ToolTipText"; 316 317 private static final String NEXT_FOCUS = "nextFocus"; 318 319 323 private JPopupMenu popupMenu; 324 325 326 private static final int IS_DOUBLE_BUFFERED = 0; 327 private static final int ANCESTOR_USING_BUFFER = 1; 328 private static final int IS_PAINTING_TILE = 2; 329 private static final int IS_OPAQUE = 3; 330 private static final int KEY_EVENTS_ENABLED = 4; 331 private static final int FOCUS_INPUTMAP_CREATED = 5; 332 private static final int ANCESTOR_INPUTMAP_CREATED = 6; 333 private static final int WIF_INPUTMAP_CREATED = 7; 334 private static final int ACTIONMAP_CREATED = 8; 335 private static final int CREATED_DOUBLE_BUFFER = 9; 336 private static final int IS_PRINTING = 11; 338 private static final int IS_PRINTING_ALL = 12; 339 private static final int IS_REPAINTING = 13; 340 341 private static final int WRITE_OBJ_COUNTER_FIRST = 14; 342 private static final int RESERVED_1 = 15; 343 private static final int RESERVED_2 = 16; 344 private static final int RESERVED_3 = 17; 345 private static final int RESERVED_4 = 18; 346 private static final int RESERVED_5 = 19; 347 private static final int RESERVED_6 = 20; 348 private static final int WRITE_OBJ_COUNTER_LAST = 21; 349 350 private static final int REQUEST_FOCUS_DISABLED = 22; 351 private static final int INHERITS_POPUP_MENU = 23; 352 private static final int OPAQUE_SET = 24; 353 private static final int AUTOSCROLLS_SET = 25; 354 private static final int FOCUS_TRAVERSAL_KEYS_FORWARD_SET = 26; 355 private static final int FOCUS_TRAVERSAL_KEYS_BACKWARD_SET = 27; 356 357 360 private static boolean inInputVerifier; 361 362 365 private static java.util.List tempRectangles = new java.util.ArrayList (11); 366 367 368 private InputMap focusInputMap; 369 370 private InputMap ancestorInputMap; 371 372 private ComponentInputMap windowInputMap; 373 374 375 private ActionMap actionMap; 376 377 378 private static final String defaultLocale = "JComponent.defaultLocale"; 379 380 384 private boolean aaText; 385 386 static { 387 aaFontMap = new HashMap <Font,FontMetrics>(); 388 } 389 390 394 static Set <KeyStroke > getManagingFocusForwardTraversalKeys() { 395 if (managingFocusForwardTraversalKeys == null) { 396 managingFocusForwardTraversalKeys = new TreeSet (); 397 managingFocusForwardTraversalKeys.add( 398 KeyStroke.getKeyStroke(KeyEvent.VK_TAB, InputEvent.CTRL_MASK)); 399 } 400 return managingFocusForwardTraversalKeys; 401 } 402 403 407 static Set <KeyStroke > getManagingFocusBackwardTraversalKeys() { 408 if (managingFocusBackwardTraversalKeys == null) { 409 managingFocusBackwardTraversalKeys = new TreeSet (); 410 managingFocusBackwardTraversalKeys.add( 411 KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 412 InputEvent.SHIFT_MASK | 413 InputEvent.CTRL_MASK)); 414 } 415 return managingFocusBackwardTraversalKeys; 416 } 417 418 419 423 private static boolean getSuppressDropTarget() { 424 if (!checkedSuppressDropSupport) { 425 Boolean b = (Boolean )java.security.AccessController.doPrivileged( 426 new java.security.PrivilegedAction () { 427 public Object run() { 428 String value = System.getProperty( 429 "suppressSwingDropSupport"); 430 431 if (value != null) { 432 return Boolean.valueOf(value); 433 } 434 return Boolean.FALSE; 435 } 436 } 437 ); 438 suppressDropSupport = b.booleanValue(); 439 checkedSuppressDropSupport = true; 440 } 441 return suppressDropSupport; 442 } 443 444 private static Rectangle fetchRectangle() { 445 synchronized(tempRectangles) { 446 Rectangle rect; 447 int size = tempRectangles.size(); 448 if (size > 0) { 449 rect = (Rectangle)tempRectangles.remove(size - 1); 450 } 451 else { 452 rect = new Rectangle(0, 0, 0, 0); 453 } 454 return rect; 455 } 456 } 457 458 private static void recycleRectangle(Rectangle rect) { 459 synchronized(tempRectangles) { 460 tempRectangles.add(rect); 461 } 462 } 463 464 482 public void setInheritsPopupMenu(boolean value) { 483 setFlag(INHERITS_POPUP_MENU, value); 484 } 485 486 492 public boolean getInheritsPopupMenu() { 493 return getFlag(INHERITS_POPUP_MENU); 494 } 495 496 520 public void setComponentPopupMenu(JPopupMenu popup) { 521 if(popup != null && isLightweight()) { 522 enableEvents(AWTEvent.MOUSE_EVENT_MASK); 523 } 524 this.popupMenu = popup; 525 } 526 527 539 public JPopupMenu getComponentPopupMenu() { 540 541 if(!getInheritsPopupMenu()) { 542 return popupMenu; 543 } 544 545 if(popupMenu == null) { 546 Container parent = getParent(); 548 while (parent != null) { 549 if(parent instanceof JComponent ) { 550 return ((JComponent )parent).getComponentPopupMenu(); 551 } 552 if(parent instanceof Window || 553 parent instanceof Applet ) { 554 break; 556 } 557 parent = parent.getParent(); 558 } 559 return null; 560 } 561 562 return popupMenu; 563 } 564 565 575 public JComponent() { 576 super(); 577 enableEvents(AWTEvent.KEY_EVENT_MASK); 581 if (isManagingFocus()) { 582 LookAndFeel.installProperty(this, 583 "focusTraversalKeysForward", 584 getManagingFocusForwardTraversalKeys()); 585 LookAndFeel.installProperty(this, 586 "focusTraversalKeysBackward", 587 getManagingFocusBackwardTraversalKeys()); 588 } 589 590 super.setLocale( JComponent.getDefaultLocale() ); 591 } 592 593 594 608 public void updateUI() {} 609 610 611 639 protected void setUI(ComponentUI newUI) { 640 645 if (ui != null) { 646 ui.uninstallUI(this); 647 } 648 aaText = false; 650 ComponentUI oldUI = ui; 651 ui = newUI; 652 if (ui != null) { 653 ui.installUI(this); 654 } 655 656 firePropertyChange("UI", oldUI, newUI); 657 revalidate(); 658 repaint(); 659 } 660 661 662 679 public String getUIClassID() { 680 return uiClassID; 681 } 682 683 684 694 protected Graphics getComponentGraphics(Graphics g) { 695 Graphics componentGraphics = g; 696 if (ui != null && DEBUG_GRAPHICS_LOADED) { 697 if ((DebugGraphics.debugComponentCount() != 0) && 698 (shouldDebugGraphics() != 0) && 699 !(g instanceof DebugGraphics )) { 700 componentGraphics = new DebugGraphics (g,this); 701 } 702 } 703 componentGraphics.setColor(getForeground()); 704 componentGraphics.setFont(getFont()); 705 706 return componentGraphics; 707 } 708 709 710 739 protected void paintComponent(Graphics g) { 740 if (ui != null) { 741 Graphics scratchGraphics = (g == null) ? null : g.create(); 742 try { 743 ui.update(scratchGraphics, this); 744 } 745 finally { 746 scratchGraphics.dispose(); 747 } 748 } 749 } 750 751 762 protected void paintChildren(Graphics g) { 763 boolean isJComponent; 764 Graphics sg = null; 765 766 try { 767 synchronized(getTreeLock()) { 768 int i = getComponentCount() - 1; 769 if (i < 0) { 770 return; 771 } 772 sg = (g == null) ? null : g.create(); 773 if (paintingChild != null && 776 (paintingChild instanceof JComponent ) && 777 ((JComponent )paintingChild).isOpaque()) { 778 for (; i >= 0; i--) { 779 if (getComponent(i) == paintingChild){ 780 break; 781 } 782 } 783 } 784 Rectangle tmpRect = fetchRectangle(); 785 boolean checkSiblings = (!isOptimizedDrawingEnabled() && 786 checkIfChildObscuredBySibling()); 787 Rectangle clipBounds = null; 788 if (checkSiblings) { 789 clipBounds = sg.getClipBounds(); 790 if (clipBounds == null) { 791 clipBounds = new Rectangle(0, 0, getWidth(), 792 getHeight()); 793 } 794 } 795 boolean printing = getFlag(IS_PRINTING); 796 for (; i >= 0 ; i--) { 797 Component comp = getComponent(i); 798 if (comp != null && 799 (printing || isLightweightComponent(comp)) && 800 (comp.isVisible() == true)) { 801 Rectangle cr; 802 isJComponent = (comp instanceof JComponent ); 803 804 cr = comp.getBounds(tmpRect); 805 806 boolean hitClip = g.hitClip(cr.x, cr.y, cr.width, cr.height); 807 808 if (hitClip) { 809 if (checkSiblings && i > 0) { 810 int x = cr.x; 811 int y = cr.y; 812 int width = cr.width; 813 int height = cr.height; 814 SwingUtilities.computeIntersection 815 (clipBounds.x, clipBounds.y, 816 clipBounds.width, clipBounds.height, cr); 817 818 if(getObscuredState(i, cr.x, cr.y, cr.width, 819 cr.height) == COMPLETELY_OBSCURED) { 820 continue; 821 } 822 cr.x = x; 823 cr.y = y; 824 cr.width = width; 825 cr.height = height; 826 } 827 Graphics cg = sg.create(cr.x, cr.y, cr.width, 828 cr.height); 829 cg.setColor(comp.getForeground()); 830 cg.setFont(comp.getFont()); 831 boolean shouldSetFlagBack = false; 832 try { 833 if(isJComponent) { 834 if(getFlag(ANCESTOR_USING_BUFFER)) { 835 ((JComponent )comp).setFlag(ANCESTOR_USING_BUFFER,true); 836 shouldSetFlagBack = true; 837 } 838 if(getFlag(IS_PAINTING_TILE)) { 839 ((JComponent )comp).setFlag(IS_PAINTING_TILE,true); 840 shouldSetFlagBack = true; 841 } 842 if(!printing) { 843 ((JComponent )comp).paint(cg); 844 } 845 else { 846 if (!getFlag(IS_PRINTING_ALL)) { 847 comp.print(cg); 848 } 849 else { 850 comp.printAll(cg); 851 } 852 } 853 } else { 854 if (!printing) { 855 comp.paint(cg); 856 } 857 else { 858 if (!getFlag(IS_PRINTING_ALL)) { 859 comp.print(cg); 860 } 861 else { 862 comp.printAll(cg); 863 } 864 } 865 } 866 } finally { 867 cg.dispose();<
|