1 27 28 package org.nightlabs.editor2d.figures; 29 30 import java.util.Iterator ; 31 import java.util.Map ; 32 33 import org.eclipse.draw2d.Figure; 34 import org.eclipse.draw2d.FigureCanvas; 35 import org.eclipse.draw2d.FreeformLayer; 36 import org.eclipse.draw2d.Graphics; 37 import org.eclipse.draw2d.IFigure; 38 import org.eclipse.draw2d.UpdateListener; 39 import org.eclipse.draw2d.UpdateManager; 40 import org.eclipse.draw2d.geometry.Rectangle; 41 import org.eclipse.gef.EditPart; 42 import org.eclipse.gef.EditPartViewer; 43 import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer; 44 import org.eclipse.swt.widgets.Control; 45 46 import org.nightlabs.editor2d.util.EditorUtil; 47 48 52 public class SmartUpdateFreeformLayer 53 extends FreeformLayer 54 implements BufferedFreeformLayer 55 { 56 public static final int TYPE_SMART_UPDATE_ONLY = 1; 57 public static final int TYPE_USE_OFFSCREEN_BUFFER = 2; 58 59 private Rectangle notifiedDamage; 60 private EditPart editPart; 61 private UpdateManager updateManager; 62 63 private UpdateListener updateListener = new UpdateListener() { 64 public void notifyPainting(Rectangle damage, Map dirtyRegions) { 65 if (editPart == null) 66 return; 67 notifiedDamage = damage; 68 notifiedDamage = EditorUtil.toAbsolute(editPart, damage); 69 } 70 public void notifyValidating() { 71 } 72 }; 73 74 75 77 public SmartUpdateFreeformLayer() { 78 super(); 79 } 80 81 public void init(EditPart editPart) { 82 this.editPart = editPart; 83 EditPartViewer viewer = editPart.getRoot().getViewer(); 84 if (viewer instanceof ScrollingGraphicalViewer) { 85 ScrollingGraphicalViewer graphicalViewer = (ScrollingGraphicalViewer) viewer; 86 Control control = graphicalViewer.getControl(); 87 if (control instanceof FigureCanvas) { 88 FigureCanvas figureCanvas = (FigureCanvas)graphicalViewer.getControl(); 89 updateManager = figureCanvas.getLightweightSystem().getUpdateManager(); 90 if (updateManager != null) 91 registerOnDeferredUpdateManager(updateManager); 92 } 93 } 94 } 95 96 102 protected void registerOnDeferredUpdateManager(UpdateManager updateManager) { 103 if (updateManager == null) 104 return; 105 updateManager.removeUpdateListener(updateListener); 106 updateManager.addUpdateListener(updateListener); 107 } 108 109 122 public void paint(Graphics graphics) { 123 124 if (notifiedDamage == null) { 125 super.paint(graphics); 129 return; 130 } 131 132 try 134 { 136 for (Iterator iter = getChildren().iterator(); iter.hasNext();) { 137 IFigure child = (IFigure) iter.next(); 138 if (child.intersects(notifiedDamage)) { 139 graphics.pushState(); 140 try { 141 graphics.setClip(child.getBounds()); 142 if (child instanceof ISmartUpdateFigure) 144 ((ISmartUpdateFigure)child).paintRegion(graphics, notifiedDamage); 145 else 146 child.paint(graphics); 147 graphics.restoreState(); 148 } finally 149 { 150 graphics.popState(); 151 } 152 } 153 } 154 } 155 finally 156 { 157 notifiedDamage = null; 158 } 159 } 160 161 164 public void refresh() { 165 for (Iterator iter = getChildren().iterator(); iter.hasNext();) { 166 Figure child = (Figure) iter.next(); 167 if (child instanceof ISmartUpdateFigure) { 168 ((ISmartUpdateFigure)child).refresh(); 169 } 170 } 171 } 172 173 176 public void refresh(IFigure figure) { 177 for (Iterator iter = getChildren().iterator(); iter.hasNext();) { 178 Figure child = (Figure) iter.next(); 179 if (child instanceof ISmartUpdateFigure) { 180 ((ISmartUpdateFigure)child).refresh(figure); 181 } 182 } 183 } 184 185 } 186 | Popular Tags |