1 26 package org.nightlabs.editor2d.viewer.preview; 27 28 import java.awt.Rectangle ; 29 import java.beans.PropertyChangeEvent ; 30 import java.beans.PropertyChangeListener ; 31 32 import org.eclipse.swt.events.ControlAdapter; 33 import org.eclipse.swt.events.ControlEvent; 34 import org.eclipse.swt.events.ControlListener; 35 import org.eclipse.swt.events.DisposeEvent; 36 import org.eclipse.swt.events.DisposeListener; 37 import org.eclipse.swt.events.PaintEvent; 38 import org.eclipse.swt.events.PaintListener; 39 import org.eclipse.swt.graphics.GC; 40 import org.eclipse.swt.graphics.Transform; 41 import org.eclipse.swt.widgets.Composite; 42 import org.eclipse.swt.widgets.Control; 43 import org.nightlabs.base.composite.XComposite; 44 import org.nightlabs.editor2d.DrawComponent; 45 import org.nightlabs.editor2d.viewer.DrawComponentPaintable; 46 import org.nightlabs.editor2d.viewer.IBufferedViewport; 47 import org.nightlabs.editor2d.viewer.IViewport; 48 import org.nightlabs.editor2d.viewer.awt.DisplayPanel; 49 import org.nightlabs.editor2d.viewer.j2dswt.SWTGraphics2D; 50 import org.nightlabs.editor2d.viewer.util.AWTSWTUtil; 51 52 57 public class PreviewComposite 58 extends XComposite 59 { 60 64 public PreviewComposite(Composite parent, int style) { 65 super(parent, style); 66 init(); 67 } 68 69 74 public PreviewComposite(Composite parent, int style, int layoutMode) { 75 super(parent, style, layoutMode); 76 init(); 77 } 78 79 85 public PreviewComposite(Composite parent, int style, int layoutMode, 86 int layoutDataMode) { 87 super(parent, style, layoutMode, layoutDataMode); 88 init(); 89 } 90 91 protected void init() 92 { 93 addPaintListener(paintListener); 94 addControlListener(resizeListener); 95 addDisposeListener(disposeListener); 96 } 97 98 protected DisposeListener disposeListener = new DisposeListener() 99 { 100 public void widgetDisposed(DisposeEvent e) { 101 removePaintListener(paintListener); 102 removeControlListener(resizeListener); 103 } 104 }; 105 106 protected DrawComponentPaintable dcPaintable = null; 107 protected DrawComponent dc = null; 108 public void setDrawComponent(DrawComponent dc) { 109 this.dc = dc; 110 dcPaintable = new DrawComponentPaintable(dc); 111 } 112 public DrawComponent getDrawComponent() { 113 return dc; 114 } 115 116 protected IViewport viewport = null; 117 public IViewport getViewport() { 118 return viewport; 119 } 120 public void setViewport(IViewport viewport) 121 { 122 if (viewport != null) { 123 viewport.removePropertyChangeListener(viewChangeListener); 124 viewport.removePropertyChangeListener(realChangeListener); 125 } 126 this.viewport = viewport; 127 realBounds = viewport.getRealBounds(); 128 viewBounds = viewport.getViewBounds(); 129 viewport.addPropertyChangeListener(viewChangeListener); 130 viewport.addPropertyChangeListener(realChangeListener); 131 } 132 133 protected Rectangle viewBounds = null; 134 135 139 protected PropertyChangeListener viewChangeListener = new PropertyChangeListener () 140 { 141 public void propertyChange(PropertyChangeEvent evt) 142 { 143 if (evt.getPropertyName().equals(DisplayPanel.VIEW_CHANGE)) { 144 viewBounds = (Rectangle ) evt.getNewValue(); 145 } 146 } 147 }; 148 149 protected Rectangle realBounds = null; 150 151 155 protected PropertyChangeListener realChangeListener = new PropertyChangeListener () 156 { 157 public void propertyChange(PropertyChangeEvent evt) 158 { 159 if (evt.getPropertyName().equals(DisplayPanel.REAL_CHANGE)) { 160 realBounds = (Rectangle ) evt.getNewValue(); 161 } 162 } 163 }; 164 165 protected PaintListener paintListener = new PaintListener() 166 { 167 public void paintControl(PaintEvent e) 168 { 169 GC gc = e.gc; 170 Transform transform = new Transform(e.display); 171 transform.scale(scale, scale); 172 gc.setTransform(transform); 173 dcPaintable.redraw(null, gc); 174 } 175 }; 176 177 protected ControlListener resizeListener = new ControlAdapter() 178 { 179 public void controlResized(ControlEvent e) 180 { 181 Control c = (Control) e.getSource(); 182 Rectangle bounds = AWTSWTUtil.toAWTRectangle(c.getBounds()); 183 if (realBounds != null) 184 PreviewComposite.this.scale = calcScale(bounds, realBounds); 185 186 PreviewComposite.this.redraw(); 187 } 188 }; 189 190 protected float scale = 1.0f; 191 protected float calcScale(Rectangle r1, Rectangle r2) 192 { 193 float scaleX = (float) (r1.getWidth()/ r2.getWidth()); 194 float scaleY = (float) (r1.getHeight()/ r2.getHeight()); 195 float scale = Math.max(scaleX, scaleY); 196 return scale; 197 } 198 } 199 | Popular Tags |