34package com.jogamp.opengl.util;
36import java.awt.Component;
37import java.awt.EventQueue;
38import java.awt.Rectangle;
39import java.util.ArrayList;
40import java.util.IdentityHashMap;
41import java.util.Iterator;
45import javax.swing.JComponent;
46import javax.swing.RepaintManager;
47import javax.swing.SwingUtilities;
48import com.jogamp.opengl.GLAutoDrawable;
50import com.jogamp.opengl.util.AnimatorBase.UncaughtAnimatorException;
56class AWTAnimatorImpl
implements AnimatorBase.AnimatorImpl {
59 private final List<JComponent> lightweights =
new ArrayList<JComponent>();
60 private final Map<RepaintManager,RepaintManager> repaintManagers =
new IdentityHashMap<RepaintManager,RepaintManager>();
61 private final Map<JComponent,Rectangle> dirtyRegions =
new IdentityHashMap<JComponent,Rectangle>();
64 public void display(
final ArrayList<GLAutoDrawable> drawables,
65 final boolean ignoreExceptions,
66 final boolean printExceptions)
throws UncaughtAnimatorException {
67 boolean hasException =
false;
68 for (
int i=0; !hasException && i<drawables.size(); i++) {
69 GLAutoDrawable drawable =
null;
70 boolean catch1 =
true;
72 drawable = drawables.get(i);
74 if (drawable instanceof JComponent) {
79 lightweights.add((JComponent)drawable);
83 }
catch (
final Throwable t) {
84 if( catch1 && t instanceof IndexOutOfBoundsException ) {
87 }
else if ( ignoreExceptions ) {
88 if ( printExceptions ) {
92 throw new UncaughtAnimatorException(drawable, t);
96 if (lightweights.size() > 0) {
98 SwingUtilities.invokeAndWait(drawWithRepaintManagerRunnable);
99 }
catch (
final Throwable t) {
102 lightweights.clear();
108 private final Runnable drawWithRepaintManagerRunnable =
new Runnable() {
111 for (
final Iterator<JComponent> iter = lightweights.iterator(); iter.hasNext(); ) {
112 JComponent comp = iter.next();
113 RepaintManager rm = RepaintManager.currentManager(comp);
114 rm.markCompletelyDirty(comp);
115 repaintManagers.put(rm, rm);
128 final Rectangle visible = comp.getVisibleRect();
131 while (comp !=
null) {
134 final Component c = comp.getParent();
135 if ((c ==
null) || (!(c instanceof JComponent))) {
138 comp = (JComponent) c;
139 if (!comp.isOptimizedDrawingEnabled()) {
140 rm = RepaintManager.currentManager(comp);
141 repaintManagers.put(rm, rm);
143 Rectangle dirty = dirtyRegions.get(comp);
145 dirty =
new Rectangle(x, y, visible.width, visible.height);
146 dirtyRegions.put(comp, dirty);
153 dirty.add(
new Rectangle(x, y, visible.width, visible.height));
161 for (
final Iterator<JComponent> iter = dirtyRegions.keySet().iterator(); iter.hasNext(); ) {
162 final JComponent comp = iter.next();
163 final Rectangle rect = dirtyRegions.get(comp);
164 final RepaintManager rm = RepaintManager.currentManager(comp);
165 rm.addDirtyRegion(comp, rect.x, rect.y, rect.width, rect.height);
169 for (
final Iterator<RepaintManager> iter = repaintManagers.keySet().iterator(); iter.hasNext(); ) {
170 iter.next().paintDirtyRegions();
172 dirtyRegions.clear();
173 repaintManagers.clear();
178 public boolean blockUntilDone(
final Thread thread) {
179 return Thread.currentThread() != thread && !EventQueue.isDispatchThread();