1 7 package javax.swing; 8 9 import java.awt.*; 10 import java.awt.event.*; 11 import java.awt.image.*; 12 13 import java.util.*; 14 15 import java.lang.reflect.InvocationTargetException ; 16 17 import sun.awt.AppContext; 18 19 33 class SystemEventQueueUtilities 34 { 35 private static final Object classLock = new Object (); 36 37 38 private static final Object rootTableKey = 39 new StringBuffer ("SystemEventQueueUtilties.rootTableKey"); 40 41 private static Map getRootTable() { 42 Map rt = (Map)AppContext.getAppContext().get(rootTableKey); 43 if (rt == null) { 44 synchronized (rootTableKey) { 45 rt = (Map)AppContext.getAppContext().get(rootTableKey); 46 if (rt == null) { 47 rt = Collections.synchronizedMap(new WeakHashMap(4)); 48 AppContext.getAppContext().put(rootTableKey, rt); 49 } 50 } 51 } 52 return rt; 53 } 54 55 56 62 63 private static class SystemEventQueue 64 { 65 68 static EventQueue get() { 69 EventQueue retValue; 70 try { 71 retValue = Toolkit.getDefaultToolkit().getSystemEventQueue(); 72 } 73 catch (SecurityException se) { 74 retValue = null; 76 } 77 return retValue; 78 } 79 80 static EventQueue get(JRootPane rootPane) { 83 return get(); 84 } 85 } 86 87 95 private static class ComponentWorkRequest implements Runnable  96 { 97 boolean isPending; 98 Component component; 99 100 ComponentWorkRequest(Component c) { 101 105 } 107 public void run() { 108 RepaintManager rm; 109 synchronized (this) { 110 rm = RepaintManager.currentManager(component ); 111 isPending = false; 112 } 113 rm.validateInvalidComponents(); 114 rm.paintDirtyRegions(); 115 } 116 } 117 118 119 127 static void queueComponentWorkRequest(Component root) 128 { 129 ComponentWorkRequest req = (ComponentWorkRequest)(getRootTable().get(root)); 130 boolean newWorkRequest = (req == null); 131 if (newWorkRequest) { 132 req = new ComponentWorkRequest(root); 133 } 134 135 139 synchronized(req) { 140 if (newWorkRequest) { 141 getRootTable().put(root, req); 142 } 143 if (!req.isPending) { 144 SwingUtilities.invokeLater(req); 145 req.isPending = true; 146 } 147 } 148 } 149 150 151 161 static void addRunnableCanvas(JRootPane rootPane) 162 { 163 synchronized (classLock) { 164 167 if (SystemEventQueue.get(rootPane) != null) { 168 return; 169 } 170 171 JLayeredPane layeredPane = rootPane.getLayeredPane(); 172 if (layeredPane != null) { 173 RunnableCanvas rc = new RunnableCanvas(rootPane); 174 layeredPane.add(rc); 175 } 176 } 177 } 178 179 180 188 static void removeRunnableCanvas(JRootPane rootPane) { 189 synchronized (classLock) { 190 Component root = null; 193 for (Component c = rootPane; c != null; c = c.getParent()) { 194 if ((c instanceof Window) || 195 (c instanceof java.applet.Applet )) { 196 root = c; 197 break; 198 } 199 } 200 if (root != null) { 201 getRootTable().remove(root); 202 } 203 RunnableCanvas.remove(rootPane); 204 } 205 } 206 207 208 219 static Exception postRunnable(Runnable doRun, Object lock) 220 { 221 EventQueue systemEventQueue = SystemEventQueue.get(); 222 223 RunnableEvent event = new RunnableEvent(doRun, lock); 224 if (systemEventQueue != null) { 225 systemEventQueue.postEvent(event); 226 } 227 else { 228 postRunnableCanvasEvent(event); 229 } 230 return event.exception; 231 } 232 233 234 240 static void restartTimerQueueThread() { 241 synchronized (classLock) { 242 if (SystemEventQueue.get() == null) { 243 Runnable restarter = new TimerQueueRestart(); 244 RunnableEvent event = new RunnableEvent(restarter, null); 245 RunnableCanvas.postRunnableEventToAll(event); 246 } 247 } 248 } 249 250 251 257 private static class TimerQueueRestart implements Runnable { 258 boolean attemptedStart; 259 260 public synchronized void run() { 261 if(!attemptedStart) { 263 TimerQueue q = TimerQueue.sharedInstance(); 264 265 synchronized(q) { 266 if(!q.running) 267 q.start(); 268 } 269 attemptedStart = true; 270 } 271 } 272 } 273 274 280 private static class RunnableEvent extends AWTEvent { 281 static final int EVENT_ID = AWTEvent.RESERVED_ID_MAX + 1000; 282 static final Component target = new RunnableTarget(); 283 final Runnable doRun; 284 final Object lock; 285 Exception exception; 286 287 RunnableEvent(Runnable doRun, Object lock) { 288 super(target, EVENT_ID); 289 this.doRun = doRun; 290 this.lock = lock; 291 } 292 } 293 294 295 300 private static void processRunnableEvent(RunnableEvent runnableEvent) 301 { 302 Object lock = runnableEvent.lock; 303 if (lock == null) { 304 runnableEvent.doRun.run(); 305 } 306 else { 307 synchronized(lock) { 308 try { 309 runnableEvent.doRun.run(); 310 } 311 catch (Exception e) { 312 runnableEvent.exception = e; 313 } 314 finally { 315 if (runnableEvent.lock != null) { 316 runnableEvent.lock.notify(); 317 } 318 } 319 } 320 } 321 } 322 323 324 332 private static class RunnableTarget extends Component 333 { 334 RunnableTarget() { 335 super(); 336 enableEvents(RunnableEvent.EVENT_ID); 337 } 338 339 protected void processEvent(AWTEvent event) { 340 if (event instanceof RunnableEvent) { 341 processRunnableEvent((RunnableEvent)event); 342 } 343 } 344 } 345 346 347 358 private static void postRunnableCanvasEvent(RunnableEvent e) { 359 synchronized (classLock) { 360 RunnableCanvas runnableCanvas = RunnableCanvas.lookup(e); 361 362 if (runnableCanvas == null) { 363 364 367 if (e.doRun instanceof ComponentWorkRequest) { 368 ComponentWorkRequest req = (ComponentWorkRequest)e.doRun; 369 synchronized(req) { 370 req.isPending = false; 371 } 372 } 373 374 376 if(e.doRun instanceof Timer.DoPostEvent ) { 377 ((Timer.DoPostEvent )e.doRun).getTimer().cancelEvent(); 378 } 379 380 384 if (e.lock != null) { 385 e.lock.notify(); 386 } 387 return; 388 } 389 390 runnableCanvas.addRunnableEvent(e); 391 runnableCanvas.repaint(); 392 } 393 } 394 395 396 402 private static ThreadGroup getThreadGroupSafely() { 403 return new Thread ().getThreadGroup(); 404 } 405 406 407 417 private static class RunnableCanvas extends Canvas 418 { 419 private static final Graphics nullGraphics = new RunnableCanvasGraphics(); 420 private static Hashtable runnableCanvasTable = new Hashtable(1); 421 private Vector runnableEvents = new Vector(2); 422 private boolean isRegistered = false; 423 424 RunnableCanvas(JRootPane rootPane) { 425 super(); 426 setBounds(0, 0, 1, 1); 427 428 435 if (runnableCanvasTable.get(Thread.currentThread()) == null) { 436 try { 437 runnableCanvasTable.put(Thread.currentThread(), this); 438 runnableCanvasTable.put(getThreadGroupSafely(), this); 439 if (SwingUtilities.isEventDispatchThread()) { 440 isRegistered = true; 441 } 442 } 443 catch(Exception e) { 444 System.err.println("Can't register RunnableCanvas"); 445 e.printStackTrace(); 446 } 447 } 448 runnableCanvasTable.put(rootPane, this); 449 maybeRegisterEventDispatchThread(); 450 } 451 452 453 462 private void maybeRegisterEventDispatchThread() { 463 466 if (!isRegistered) { 467 synchronized(this) { 468 if (!isRegistered && SwingUtilities.isEventDispatchThread()) { 469 Thread currentThread = Thread.currentThread(); 470 471 475 if (runnableCanvasTable.get(currentThread) != null) { 476 isRegistered = true; 477 } 478 else { 479 runnableCanvasTable.put(currentThread, this); 480 runnableCanvasTable.put(getThreadGroupSafely(), this); 481 isRegistered = true; 482 } 483 } 484 } 485 } 486 } 487 488 489 495 static RunnableCanvas lookup(RunnableEvent e) 496 { 497 502 if (e.doRun instanceof ComponentWorkRequest) { 503 ComponentWorkRequest req = (ComponentWorkRequest)e.doRun; 504 synchronized(req) { 505 JRootPane rootPane = SwingUtilities.getRootPane(req.component); 506 if(rootPane != null) { 507 return (RunnableCanvas)(runnableCanvasTable.get(rootPane)); 508 } 509 513 req.isPending = false; 514 return null; 515 } 516 } 517 518 521 Object rv = runnableCanvasTable.get(Thread.currentThread()); 522 if (rv != null) { 523 return (RunnableCanvas)rv; 524 } 525 526 530 Object threadGroup; 531 try { 532 threadGroup = Thread.currentThread().getThreadGroup(); 533 } 534 catch (SecurityException exc) { 535 return null; 536 } 537 RunnableCanvas rc = (RunnableCanvas)runnableCanvasTable.get(threadGroup); 538 539 542 if(rc == null) { 543 Enumeration keys = runnableCanvasTable.keys(); 544 if(keys == null) { 545 return null; 546 } 547 while(keys.hasMoreElements()) { 548 Object key = keys.nextElement(); 549 if ((key instanceof JRootPane ) && ((JRootPane )key).isShowing()) { 550 return (RunnableCanvas)runnableCanvasTable.get(key); 551 } 552 } 553 } 554 555 return rc; 556 } 557 558 559 564 static void postRunnableEventToAll(RunnableEvent e) { 565 RunnableCanvas currentThreadCanvas; 568 ThreadGroup tg; 569 try { 570 tg = new Thread ().getThreadGroup(); 571 } 572 catch (SecurityException se) { 573 tg = null; 574 } 575 if(tg != null) { 576 currentThreadCanvas = (RunnableCanvas)runnableCanvasTable. 577 get(tg); 578 } 579 else 580 currentThreadCanvas = null; 581 582 Enumeration keys = runnableCanvasTable.keys(); 586 while(keys.hasMoreElements()) { 587 Object key = keys.nextElement(); 588 if(key instanceof JRootPane ) { 589 Object canvas = runnableCanvasTable.get(key); 590 if(canvas != currentThreadCanvas) { 591 RunnableCanvas rc = (RunnableCanvas)canvas; 592 rc.addRunnableEvent(e); 593 rc.repaint(); 594 } 595 } 596 } 597 } 598 599 600 605 static void remove(JRootPane rootPane) { 606 RunnableCanvas rc = (RunnableCanvas)(runnableCanvasTable.get(rootPane)); 607 if (rc != null) { 608 RunnableCanvas nextCanvas = null; 609 JLayeredPane layeredPane = rootPane.getLayeredPane(); 610 layeredPane.remove((Component)rc); 611 612 Enumeration keys = runnableCanvasTable.keys(); 613 while(keys.hasMoreElements()) { 614 Object key = keys.nextElement(); 615 Object next = runnableCanvasTable.get(key); 616 if (rc == next) { 617 runnableCanvasTable.remove(key); 618 } 619 else if(nextCanvas == null) { 620 nextCanvas = (RunnableCanvas)next; 621 } 622 } 623 624 RunnableEvent[] events = rc.getRunnableCanvasEvents(); 628 int numEvents = (events == null) ? 0 : events.length; 629 if(numEvents > 0) { 630 if(nextCanvas != null) { 631 for(int counter = 0; counter < numEvents; counter++) { 632 RunnableEvent e = events[counter]; 633 if(e.doRun instanceof Timer.DoPostEvent ) 634 nextCanvas.addRunnableEvent(e); 635 } 636 nextCanvas.repaint(); 637 } 638 else { 639 for(int counter = 0; counter < numEvents; counter++) { 641 RunnableEvent event = events[counter]; 642 if(event.doRun instanceof Timer.DoPostEvent ) { 643 ((Timer.DoPostEvent )event.doRun).getTimer(). 644 cancelEvent(); 645 } 646 } 647 } 648 } 649 } 650 } 651 652 653 658 public boolean isShowing() { 659 return runnableEvents.size() > 0; 660 } 661 662 663 667 public Graphics getGraphics() { 668 return nullGraphics; 669 } 670 671 672 677 public Dimension getPreferredSize() { 678 return new Dimension(1, 1); 679 } 680 681 682 687 synchronized void addRunnableEvent(RunnableEvent e) { 688 runnableEvents.addElement(e); 689 } 690 691 692 699 private synchronized RunnableEvent[] getRunnableCanvasEvents() { 700 int n = runnableEvents.size(); 701 if (n == 0) { 702 return null; 703 } 704 else { 705 RunnableEvent[] rv = new RunnableEvent[n]; 706 for(int i = 0; i < n; i++) { 707 rv[i] = (RunnableEvent)(runnableEvents.elementAt(i)); 708 } 709 runnableEvents.removeAllElements(); 710 return rv; 711 } 712 } 713 714 715 public void paint(Graphics g) { 716 maybeRegisterEventDispatchThread(); 717 } 718 719 720 724 public void update(Graphics g) { 725 RunnableEvent[] events = getRunnableCanvasEvents(); 726 if (events != null) { 727 for(int i = 0; i < events.length; i++) { 728 processRunnableEvent(events[i]); 729 } 730 } 731 } 732 } 733 734 735 751 private static class RunnableCanvasGraphics extends Graphics 752 { 753 public Graphics create() { 754 return this; 755 } 756 757 761 762 public Rectangle getClipBounds() { 763 return new Rectangle(0, 0, Short.MAX_VALUE, Short.MAX_VALUE); 764 } 765 766 public Shape getClip() { 767 return (Shape)(getClipBounds()); 768 } 769 770 public void dispose() {} 771 public void translate(int x, int y) {} 772 public Color getColor() { return Color.black; } 773 public void setColor(Color c) {} 774 public void setPaintMode() {} 775 public void setXORMode(Color c) {} 776 public Font getFont() { return null; } 777 public void setFont(Font font) {} 778 public FontMetrics getFontMetrics(Font f) { return null; } 779 public void clipRect(int x, int y, int width, int height) {} 780 public void setClip(int x, int y, int width, int height) {} 781 public void setClip(Shape clip) {} 782 public void copyArea(int x, int y, int w, int h, int dx, int dy) {} 783 public void drawLine(int x1, int y1, int x2, int y2) {} 784 public void fillRect(int x, int y, int width, int height) {} 785 public void clearRect(int x, int y, int width, int height) {} 786 public void drawRoundRect(int x, int y, int w, int h, int aw, int ah) {} 787 public void fillRoundRect(int x, int y, int w, int h, int aw, int ah) {} 788 public void drawOval(int x, int y, int w, int h) {} 789 public void fillOval(int x, int y, int w, int h) {} 790 public void drawArc(int x, int y, int w, int h, int sa, int aa) {} 791 public void fillArc(int x, int y, int w, int h, int sa, int aa) {} 792 public void drawPolyline(int xPoints[], int yPoints[], int nPoints) {} 793 public void drawPolygon(int xPoints[], int yPoints[], int nPoints) {} 794 public void fillPolygon(int xPoints[], int yPoints[], int nPoints) {} 795 public void drawString(String str, int x, int y) {} 796 public void drawString(java.text.AttributedCharacterIterator iterator, int x, int y) {} 797 public boolean drawImage(Image i, int x, int y, ImageObserver o) { return false; } 798 public boolean drawImage(Image i, int x, int y, int w, int h, ImageObserver o) { return false; } 799 public boolean drawImage(Image i, int x, int y, Color bgcolor, ImageObserver o) { return false; } 800 public boolean drawImage(Image i, int x, int y, int w, int h, Color c, ImageObserver o) { return false; } 801 public boolean drawImage(Image i, 802 int dx1, int dy1, int dx2, int dy2, 803 int sx1, int sy1, int sx2, int sy2, ImageObserver o) 804 { return false; } 805 public boolean drawImage(Image i, 806 int dx1, int dy1, int dx2, int dy2, 807 int sx1, int sy1, int sx2, int sy2, Color c, ImageObserver o) 808 { return false; } 809 } 810 } 811
| Popular Tags
|