1 27 28 package org.nightlabs.editor2d.figures; 29 30 import java.awt.Color ; 31 import java.awt.Graphics2D ; 32 import java.awt.image.BufferedImage ; 33 import java.util.Iterator ; 34 35 import org.eclipse.draw2d.Figure; 36 import org.eclipse.draw2d.FreeformLayer; 37 import org.eclipse.draw2d.Graphics; 38 import org.eclipse.draw2d.IFigure; 39 import org.eclipse.draw2d.J2DGraphics; 40 import org.eclipse.draw2d.UpdateManager; 41 import org.eclipse.draw2d.geometry.Point; 42 import org.eclipse.draw2d.geometry.Rectangle; 43 import org.eclipse.gef.EditPart; 44 import org.eclipse.gef.EditPartViewer; 45 import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer; 46 import org.eclipse.swt.widgets.Control; 47 48 import org.nightlabs.editor2d.util.EditorUtil; 49 50 54 public class MinimalBufferFreeformLayer 55 extends FreeformLayer 56 implements BufferedFreeformLayer 57 { 58 public static final int TYPE_SMART_UPDATE_ONLY = 1; 59 public static final int TYPE_USE_OFFSCREEN_BUFFER = 2; 60 61 private Rectangle notifiedDamage; 62 63 private EditPart editPart; 64 private UpdateManager updateManager; 65 68 private Control viewerControl; 69 75 private Rectangle viewerRegion = new Rectangle(0,0,0,0); 76 80 private Rectangle bufferRegion; 81 82 85 private BufferedImage bufferedImage; 86 89 private Graphics2D bufferedGraphics; 90 91 93 public MinimalBufferFreeformLayer() { 94 super(); 95 } 96 97 public void init(EditPart editPart) { 98 this.editPart = editPart; 99 EditPartViewer viewer = editPart.getRoot().getViewer(); 100 if (viewer instanceof ScrollingGraphicalViewer) { 101 ScrollingGraphicalViewer graphicalViewer = (ScrollingGraphicalViewer) viewer; 102 Control control = graphicalViewer.getControl(); 103 this.viewerControl = control; 104 } 106 } 107 108 112 protected void createBuffer() { 113 if (bufferedImage != null){ 114 bufferedGraphics.dispose(); 115 bufferedImage.flush(); 116 bufferedImage = null; 117 bufferedGraphics = null; 118 } 119 viewerRegion.setLocation(0,0); 120 viewerRegion.setSize(viewerControl.getSize().x, viewerControl.getSize().y); 121 bufferedImage = new BufferedImage (viewerRegion.width, viewerRegion.height, BufferedImage.TYPE_INT_ARGB); 122 bufferedGraphics = (Graphics2D )bufferedImage.getGraphics(); 123 } 124 125 protected void drawChildrenRegionOnBuffer(Rectangle region) { 126 } 128 129 136 protected void mergeBuffer(Rectangle regionToPaint) { 137 int absDX = bufferRegion.x - regionToPaint.x; 138 int absDY = bufferRegion.x - regionToPaint.x; 139 int relDX = EditorUtil.toRelative(editPart, absDX); 140 int relDY = EditorUtil.toRelative(editPart, absDY); 141 if (absDX == 0 && absDY == 0) 142 return; 143 144 145 if (Math.abs(relDX)>bufferRegion.width || Math.abs(relDY)>bufferRegion.height) { 146 drawChildrenRegionOnBuffer(regionToPaint); 148 bufferRegion.setBounds(regionToPaint); 150 return; 151 } 152 bufferedGraphics.copyArea( 154 0 , 0, 155 viewerRegion.width, viewerRegion.height, 156 relDX, relDY 157 ); 158 Rectangle region1; 160 Rectangle region2; 161 if (absDX >= 0) { 162 region1 = new Rectangle(0, 0, absDX, bufferRegion.height); 164 if (absDY >= 0) 165 region2 = new Rectangle(absDX, 0, bufferRegion.width-absDX, absDY); 167 else 168 region2 = new Rectangle(absDX, bufferRegion.height+absDY, bufferRegion.width-absDX, -absDY); 170 } 171 else { 172 region1 = new Rectangle(bufferRegion.width + absDX, 0, -absDX, bufferRegion.height); 174 if (absDY >= 0) 175 region2 = new Rectangle(0, 0, bufferRegion.width+absDX, absDY); 177 else 178 region2 = new Rectangle(0, bufferRegion.height+absDY, bufferRegion.width+absDX, -absDY); 180 } 181 drawChildrenRegionOnBuffer(region1); 182 drawChildrenRegionOnBuffer(region2); 183 bufferRegion.setBounds(regionToPaint); 185 } 186 187 189 public void paint(Graphics graphics) { 190 if (!(graphics instanceof J2DGraphics)) { 191 super.paint(graphics); 192 return; 193 } 194 J2DGraphics j2dGraphics = (J2DGraphics)graphics; 195 Graphics2D g2d = j2dGraphics.createGraphics2D(); 197 try { 198 Rectangle regionToPaint = EditorUtil.toAbsolute(editPart, viewerRegion); 201 if (!bufferRegion.equals(regionToPaint)) { 202 } 204 205 double currentZoom = EditorUtil.getZoom(editPart); 207 g2d.scale(1/currentZoom, 1/currentZoom); 209 Point scrollOffset = EditorUtil.getScrollOffset(editPart); 212 g2d.translate(scrollOffset.x, scrollOffset.y); 213 g2d.setPaint(Color.WHITE); 215 g2d.fillRect(-2, -2, viewerRegion.width+2, viewerRegion.height+2); 216 g2d.drawImage( 217 bufferedImage, 218 0, 0, viewerRegion.width, viewerRegion.height, 219 0, 0, viewerRegion.width, viewerRegion.height, 220 null 221 ); 222 } finally { 223 g2d.dispose(); 224 } 225 226 } 227 228 231 public void refresh() { 232 for (Iterator iter = getChildren().iterator(); iter.hasNext();) { 233 Figure child = (Figure) iter.next(); 234 if (child instanceof ISmartUpdateFigure) { 235 ((ISmartUpdateFigure)child).refresh(); 236 } 237 } 238 } 239 240 243 public void refresh(IFigure figure) { 244 for (Iterator iter = getChildren().iterator(); iter.hasNext();) { 245 Figure child = (Figure) iter.next(); 246 if (child instanceof ISmartUpdateFigure) { 247 ((ISmartUpdateFigure)child).refresh(figure); 248 } 249 } 250 } 251 252 } 253 | Popular Tags |