1 5 package com.nightlabs.editor2d.figures; 6 7 import java.util.Iterator ; 8 import java.util.Map ; 9 10 import org.eclipse.draw2d.Figure; 11 import org.eclipse.draw2d.FigureCanvas; 12 import org.eclipse.draw2d.FreeformLayer; 13 import org.eclipse.draw2d.Graphics; 14 import org.eclipse.draw2d.IFigure; 15 import org.eclipse.draw2d.UpdateListener; 16 import org.eclipse.draw2d.UpdateManager; 17 import org.eclipse.draw2d.geometry.Rectangle; 18 import org.eclipse.gef.EditPart; 19 import org.eclipse.gef.EditPartViewer; 20 import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer; 21 import org.eclipse.swt.widgets.Control; 22 23 import com.nightlabs.editor2d.util.EditorUtil; 24 25 29 public class SmartUpdateFreeformLayer 30 extends FreeformLayer 31 implements BufferedFreeformLayer 32 { 33 public static final int TYPE_SMART_UPDATE_ONLY = 1; 34 public static final int TYPE_USE_OFFSCREEN_BUFFER = 2; 35 36 private Rectangle notifiedDamage; 37 private EditPart editPart; 38 private UpdateManager updateManager; 39 40 private UpdateListener updateListener = new UpdateListener() { 41 public void notifyPainting(Rectangle damage, Map dirtyRegions) { 42 if (editPart == null) 43 return; 44 notifiedDamage = damage; 45 notifiedDamage = EditorUtil.toAbsolute(editPart, damage); 46 } 47 public void notifyValidating() { 48 } 49 }; 50 51 52 54 public SmartUpdateFreeformLayer() { 55 super(); 56 } 57 58 public void init(EditPart editPart) { 59 this.editPart = editPart; 60 EditPartViewer viewer = editPart.getRoot().getViewer(); 61 if (viewer instanceof ScrollingGraphicalViewer) { 62 ScrollingGraphicalViewer graphicalViewer = (ScrollingGraphicalViewer) viewer; 63 Control control = graphicalViewer.getControl(); 64 if (control instanceof FigureCanvas) { 65 FigureCanvas figureCanvas = (FigureCanvas)graphicalViewer.getControl(); 66 updateManager = figureCanvas.getLightweightSystem().getUpdateManager(); 67 if (updateManager != null) 68 registerOnDeferredUpdateManager(updateManager); 69 } 70 } 71 } 72 73 79 protected void registerOnDeferredUpdateManager(UpdateManager updateManager) { 80 if (updateManager == null) 81 return; 82 updateManager.removeUpdateListener(updateListener); 83 updateManager.addUpdateListener(updateListener); 84 } 85 86 99 public void paint(Graphics graphics) { 100 101 if (notifiedDamage == null) { 102 super.paint(graphics); 106 return; 107 } 108 109 try 111 { 113 for (Iterator iter = getChildren().iterator(); iter.hasNext();) { 114 IFigure child = (IFigure) iter.next(); 115 if (child.intersects(notifiedDamage)) { 116 graphics.pushState(); 117 try { 118 graphics.setClip(child.getBounds()); 119 if (child instanceof ISmartUpdateFigure) 121 ((ISmartUpdateFigure)child).paintRegion(graphics, notifiedDamage); 122 else 123 child.paint(graphics); 124 graphics.restoreState(); 125 } finally 126 { 127 graphics.popState(); 128 } 129 } 130 } 131 } 132 finally 133 { 134 notifiedDamage = null; 135 } 136 } 137 138 141 public void refresh() { 142 for (Iterator iter = getChildren().iterator(); iter.hasNext();) { 143 Figure child = (Figure) iter.next(); 144 if (child instanceof ISmartUpdateFigure) { 145 ((ISmartUpdateFigure)child).refresh(); 146 } 147 } 148 } 149 150 153 public void refresh(Figure figure) { 154 for (Iterator iter = getChildren().iterator(); iter.hasNext();) { 155 Figure child = (Figure) iter.next(); 156 if (child instanceof ISmartUpdateFigure) { 157 ((ISmartUpdateFigure)child).refresh(figure); 158 } 159 } 160 } 161 162 } 163 | Popular Tags |