KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > nightlabs > editor2d > figures > SmartUpdateFreeformLayer


1 /*
2  * Created on 05.06.2005
3  *
4  */

5 package com.nightlabs.editor2d.figures;
6
7 import java.util.Iterator JavaDoc;
8 import java.util.Map JavaDoc;
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 /**
26  * @author Alexander Bieber <alex[AT]nightalbs[DOT]de>
27  *
28  */

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 JavaDoc 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     /**
53      */

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     /**
74      * Registers this Figures updateListener to the given
75      * updateManager.
76      *
77      * @param updateManager The updateManager to register to.
78      */

79     protected void registerOnDeferredUpdateManager(UpdateManager updateManager) {
80         if (updateManager == null)
81             return;
82         updateManager.removeUpdateListener(updateListener);
83         updateManager.addUpdateListener(updateListener);
84     }
85     
86     /**
87      * Overrides Figure's paint as this will always
88      * paint all its children even if not neccessary.
89      * This implementation takes the last region notified
90      * by the UpdateManager (wich will be notified synchronously
91      * right before this paint method will be invoked
92      * whithin UpdateManager.repairDamage) and first asks all
93      * its children wether they do intersect this region.
94      * If true and the child is an instance of
95      * {@link ISmartUpdateFigure} its {@link ISmartUpdateFigure#paintRegion(Rectangle)}
96      * method will be invoked instead of the default
97      * {@link Figure#paint(Graphics)} method.
98      */

99     public void paint(Graphics graphics) {
100         
101         if (notifiedDamage == null) {
102             // no update notification was done
103
// before this call
104
// do default painting (all children)
105
super.paint(graphics);
106             return;
107         }
108         
109         // synchronous notification was done right before paint
110
try
111         // make sure the temporary Damage is reset in finally
112
{
113             for (Iterator JavaDoc 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 // System.out.println("MLDC paint child: "+child+" child.getBounds() "+child.getBounds());
120
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     /**
139      * @see com.nightlabs.editor2d.figures.BufferedFreeformLayer#refresh()
140      */

141     public void refresh() {
142         for (Iterator JavaDoc 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     /**
151      * @see com.nightlabs.editor2d.figures.BufferedFreeformLayer#refresh(org.eclipse.draw2d.Figure)
152      */

153     public void refresh(Figure figure) {
154         for (Iterator JavaDoc 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