### Eclipse Workspace Patch 1.0 #P org.eclipse.draw2d Index: src/org/eclipse/draw2d/DeferredUpdateManager.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.draw2d/src/org/eclipse/draw2d/DeferredUpdateManager.java,v retrieving revision 1.22 diff -u -r1.22 DeferredUpdateManager.java --- src/org/eclipse/draw2d/DeferredUpdateManager.java 5 Apr 2006 14:21:13 -0000 1.22 +++ src/org/eclipse/draw2d/DeferredUpdateManager.java 18 Dec 2006 20:50:27 -0000 @@ -52,9 +52,10 @@ private GraphicsSource graphicsSource; private List invalidFigures = new ArrayList(); private IFigure root; -private boolean updateQueued = false; +private boolean updateQueued; private boolean updating; +private boolean validating; private RunnableChain afterUpdate; private static class RunnableChain { @@ -136,19 +137,30 @@ } void paint(GC gc) { - SWTGraphics graphics = new SWTGraphics(gc); - if (!updating) { - /** - * If a paint occurs not as part of an update, we should notify that the region - * is being painted. Otherwise, notification already occurs in repairDamage(). + if (!validating) { + SWTGraphics graphics = new SWTGraphics(gc); + if (!updating) { + /** + * If a paint occurs not as part of an update, we should notify that the region + * is being painted. Otherwise, notification already occurs in repairDamage(). + */ + Rectangle rect = graphics.getClip(new Rectangle()); + HashMap map = new HashMap(); + map.put(root, rect); + firePainting(rect, map); + } + performValidation(); + root.paint(graphics); + graphics.dispose(); + } else { + /* + * If figures are being validated then we can simply + * add a dirty region here and update will repaint this region with other + * dirty regions when it gets to painting. We can't paint if we're not sure + * that all figures are valid. */ - HashMap map = new HashMap(); - Rectangle rect = graphics.getClip(new Rectangle()); - map.put(root, rect); - firePainting(rect, map); + addDirtyRegion(root, new Rectangle(gc.getClipping())); } - root.paint(graphics); - graphics.dispose(); } /** @@ -181,10 +193,11 @@ * @see UpdateManager#performValidation() */ public void performValidation() { - if (invalidFigures.isEmpty()) + if (invalidFigures.isEmpty() || validating) return; try { IFigure fig; + validating = true; fireValidating(); for (int i = 0; i < invalidFigures.size(); i++) { fig = (IFigure) invalidFigures.get(i); @@ -193,6 +206,7 @@ } } finally { invalidFigures.clear(); + validating = false; } }