jdk/src/share/classes/javax/swing/RepaintManager.java
Print this page
rev 5725 : Merge
*** 25,46 ****
package javax.swing;
import java.awt.*;
import java.awt.event.*;
- import java.awt.peer.ComponentPeer;
- import java.awt.peer.ContainerPeer;
import java.awt.image.VolatileImage;
import java.security.AccessController;
import java.util.*;
import java.applet.*;
import sun.awt.AWTAccessor;
import sun.awt.AppContext;
import sun.awt.DisplayChangedListener;
import sun.awt.SunToolkit;
import sun.java2d.SunGraphicsEnvironment;
import sun.security.action.GetPropertyAction;
import com.sun.java.swing.SwingUtilities3;
/**
--- 25,49 ----
package javax.swing;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.VolatileImage;
+ import java.security.AccessControlContext;
import java.security.AccessController;
+ import java.security.PrivilegedAction;
import java.util.*;
+ import java.util.concurrent.atomic.AtomicInteger;
import java.applet.*;
import sun.awt.AWTAccessor;
import sun.awt.AppContext;
import sun.awt.DisplayChangedListener;
import sun.awt.SunToolkit;
import sun.java2d.SunGraphicsEnvironment;
+ import sun.misc.JavaSecurityAccess;
+ import sun.misc.SharedSecrets;
import sun.security.action.GetPropertyAction;
import com.sun.java.swing.SwingUtilities3;
/**
*** 174,183 ****
--- 177,189 ----
/**
* Runnable used to process all repaint/revalidate requests.
*/
private final ProcessingRunnable processingRunnable;
+ private final static JavaSecurityAccess javaSecurityAccess =
+ SharedSecrets.getJavaSecurityAccess();
+
static {
volatileImageBufferEnabled = "true".equals(AccessController.
doPrivileged(new GetPropertyAction(
"swing.volatileImageBufferEnabled", "true")));
*** 546,562 ****
//
// This is called from the toolkit thread when awt needs to run a
// Runnable before we paint.
//
! void nativeQueueSurfaceDataRunnable(AppContext appContext, Component c,
! Runnable r) {
synchronized(this) {
if (runnableList == null) {
runnableList = new LinkedList<Runnable>();
}
! runnableList.add(r);
}
scheduleProcessingRunnable(appContext);
}
/**
--- 552,581 ----
//
// This is called from the toolkit thread when awt needs to run a
// Runnable before we paint.
//
! void nativeQueueSurfaceDataRunnable(AppContext appContext,
! final Component c, final Runnable r)
! {
synchronized(this) {
if (runnableList == null) {
runnableList = new LinkedList<Runnable>();
}
! runnableList.add(new Runnable() {
! public void run() {
! AccessControlContext stack = AccessController.getContext();
! AccessControlContext acc =
! AWTAccessor.getComponentAccessor().getAccessControlContext(c);
! javaSecurityAccess.doIntersectionPrivilege(new PrivilegedAction<Void>() {
! public Void run() {
! r.run();
! return null;
! }
! }, stack, acc);
! }
! });
}
scheduleProcessingRunnable(appContext);
}
/**
*** 650,670 ****
/**
* Validate all of the components that have been marked invalid.
* @see #addInvalidComponent
*/
public void validateInvalidComponents() {
! java.util.List<Component> ic;
synchronized(this) {
! if(invalidComponents == null) {
return;
}
ic = invalidComponents;
invalidComponents = null;
}
int n = ic.size();
for(int i = 0; i < n; i++) {
! ic.get(i).validate();
}
}
/**
--- 669,699 ----
/**
* Validate all of the components that have been marked invalid.
* @see #addInvalidComponent
*/
public void validateInvalidComponents() {
! final java.util.List<Component> ic;
synchronized(this) {
! if (invalidComponents == null) {
return;
}
ic = invalidComponents;
invalidComponents = null;
}
int n = ic.size();
for(int i = 0; i < n; i++) {
! final Component c = ic.get(i);
! AccessControlContext stack = AccessController.getContext();
! AccessControlContext acc =
! AWTAccessor.getComponentAccessor().getAccessControlContext(c);
! javaSecurityAccess.doIntersectionPrivilege(
! new PrivilegedAction<Void>() {
! public Void run() {
! c.validate();
! return null;
! }
! }, stack, acc);
}
}
/**
*** 738,782 ****
dirtyComponents.clear();
}
paintDirtyRegions(tmpDirtyComponents);
}
! private void paintDirtyRegions(Map<Component,Rectangle>
! tmpDirtyComponents){
! int i, count;
! java.util.List<Component> roots;
! Component dirtyComponent;
!
! count = tmpDirtyComponents.size();
! if (count == 0) {
return;
}
! Rectangle rect;
! int localBoundsX = 0;
! int localBoundsY = 0;
! int localBoundsH;
! int localBoundsW;
! Enumeration keys;
!
! roots = new ArrayList<Component>(count);
for (Component dirty : tmpDirtyComponents.keySet()) {
collectDirtyComponents(tmpDirtyComponents, dirty, roots);
}
! count = roots.size();
painting = true;
try {
! for(i=0 ; i < count ; i++) {
! dirtyComponent = roots.get(i);
! rect = tmpDirtyComponents.get(dirtyComponent);
! localBoundsH = dirtyComponent.getHeight();
! localBoundsW = dirtyComponent.getWidth();
!
! SwingUtilities.computeIntersection(localBoundsX,
! localBoundsY,
localBoundsW,
localBoundsH,
rect);
if (dirtyComponent instanceof JComponent) {
((JComponent)dirtyComponent).paintImmediately(
--- 767,808 ----
dirtyComponents.clear();
}
paintDirtyRegions(tmpDirtyComponents);
}
! private void paintDirtyRegions(
! final Map<Component,Rectangle> tmpDirtyComponents)
! {
! if (tmpDirtyComponents.isEmpty()) {
return;
}
! final java.util.List<Component> roots =
! new ArrayList<Component>(tmpDirtyComponents.size());
for (Component dirty : tmpDirtyComponents.keySet()) {
collectDirtyComponents(tmpDirtyComponents, dirty, roots);
}
! final AtomicInteger count = new AtomicInteger(roots.size());
painting = true;
try {
! for(int j = 0; j < count.get(); j++) {
! final int i = j;
! final Component dirtyComponent = roots.get(j);
!
! AccessControlContext stack = AccessController.getContext();
! AccessControlContext acc =
! AWTAccessor.getComponentAccessor().getAccessControlContext(dirtyComponent);
! javaSecurityAccess.doIntersectionPrivilege(new PrivilegedAction<Void>() {
! public Void run() {
! Rectangle rect = tmpDirtyComponents.get(dirtyComponent);
!
! int localBoundsH = dirtyComponent.getHeight();
! int localBoundsW = dirtyComponent.getWidth();
! SwingUtilities.computeIntersection(0,
! 0,
localBoundsW,
localBoundsH,
rect);
if (dirtyComponent instanceof JComponent) {
((JComponent)dirtyComponent).paintImmediately(
*** 798,815 ****
}
// If the repaintRoot has been set, service it now and
// remove any components that are children of repaintRoot.
if (repaintRoot != null) {
adjustRoots(repaintRoot, roots, i + 1);
! count = roots.size();
paintManager.isRepaintingRoot = true;
repaintRoot.paintImmediately(0, 0, repaintRoot.getWidth(),
repaintRoot.getHeight());
paintManager.isRepaintingRoot = false;
// Only service repaintRoot once.
repaintRoot = null;
}
}
} finally {
painting = false;
}
--- 824,845 ----
}
// If the repaintRoot has been set, service it now and
// remove any components that are children of repaintRoot.
if (repaintRoot != null) {
adjustRoots(repaintRoot, roots, i + 1);
! count.set(roots.size());
paintManager.isRepaintingRoot = true;
repaintRoot.paintImmediately(0, 0, repaintRoot.getWidth(),
repaintRoot.getHeight());
paintManager.isRepaintingRoot = false;
// Only service repaintRoot once.
repaintRoot = null;
}
+
+ return null;
+ }
+ }, stack, acc);
}
} finally {
painting = false;
}