001: /*
002:
003: Licensed to the Apache Software Foundation (ASF) under one or more
004: contributor license agreements. See the NOTICE file distributed with
005: this work for additional information regarding copyright ownership.
006: The ASF licenses this file to You under the Apache License, Version 2.0
007: (the "License"); you may not use this file except in compliance with
008: the License. You may obtain a copy of the License at
009:
010: http://www.apache.org/licenses/LICENSE-2.0
011:
012: Unless required by applicable law or agreed to in writing, software
013: distributed under the License is distributed on an "AS IS" BASIS,
014: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: See the License for the specific language governing permissions and
016: limitations under the License.
017:
018: */
019: package org.apache.batik.swing.gvt;
020:
021: import java.awt.Shape;
022: import java.awt.geom.AffineTransform;
023: import java.util.Collections;
024: import java.util.LinkedList;
025: import java.util.List;
026:
027: import org.apache.batik.bridge.InterruptedBridgeException;
028: import org.apache.batik.gvt.renderer.ImageRenderer;
029: import org.apache.batik.util.EventDispatcher;
030: import org.apache.batik.util.EventDispatcher.Dispatcher;
031: import org.apache.batik.util.HaltingThread;
032:
033: /**
034: * This class represents an object which renders asynchroneaously
035: * a GVT tree.
036: *
037: * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
038: * @version $Id: GVTTreeRenderer.java 475477 2006-11-15 22:44:28Z cam $
039: */
040: public class GVTTreeRenderer extends HaltingThread {
041:
042: /**
043: * The renderer used to paint.
044: */
045: protected ImageRenderer renderer;
046:
047: /**
048: * The area of interest.
049: */
050: protected Shape areaOfInterest;
051:
052: /**
053: * The buffer width.
054: */
055: protected int width;
056:
057: /**
058: * The buffer height.
059: */
060: protected int height;
061:
062: /**
063: * The user to device transform.
064: */
065: protected AffineTransform user2DeviceTransform;
066:
067: /**
068: * Whether to enable the double buffering.
069: */
070: protected boolean doubleBuffering;
071:
072: /**
073: * The listeners.
074: */
075: protected List listeners = Collections
076: .synchronizedList(new LinkedList());
077:
078: /**
079: * Creates a new GVTTreeRenderer.
080: * @param r The renderer to use to paint.
081: * @param usr2dev The user to device transform.
082: * @param dbuffer Whether the double buffering should be enabled.
083: * @param aoi The area of interest in the renderer space units.
084: * @param width The offscreen buffer width.
085: * @param height The offscreen buffer height.
086: */
087: public GVTTreeRenderer(ImageRenderer r, AffineTransform usr2dev,
088: boolean dbuffer, Shape aoi, int width, int height) {
089: renderer = r;
090: areaOfInterest = aoi;
091: user2DeviceTransform = usr2dev;
092: doubleBuffering = dbuffer;
093: this .width = width;
094: this .height = height;
095: }
096:
097: /**
098: * Runs this renderer.
099: */
100: public void run() {
101: GVTTreeRendererEvent ev = new GVTTreeRendererEvent(this , null);
102: try {
103: fireEvent(prepareDispatcher, ev);
104:
105: renderer.setTransform(user2DeviceTransform);
106: renderer.setDoubleBuffered(doubleBuffering);
107: renderer.updateOffScreen(width, height);
108: renderer.clearOffScreen();
109:
110: if (isHalted()) {
111: fireEvent(cancelledDispatcher, ev);
112: return;
113: }
114:
115: ev = new GVTTreeRendererEvent(this , renderer.getOffScreen());
116: fireEvent(startedDispatcher, ev);
117:
118: if (isHalted()) {
119: fireEvent(cancelledDispatcher, ev);
120: return;
121: }
122:
123: renderer.repaint(areaOfInterest);
124:
125: if (isHalted()) {
126: fireEvent(cancelledDispatcher, ev);
127: return;
128: }
129:
130: ev = new GVTTreeRendererEvent(this , renderer.getOffScreen());
131: fireEvent(completedDispatcher, ev);
132: } catch (NoClassDefFoundError e) {
133: // This error was reported to happen when the rendering
134: // is interrupted with JDK1.3.0rc1 Solaris.
135: } catch (InterruptedBridgeException e) {
136: // this sometimes happens with SVG Fonts since the glyphs are
137: // not built till the rendering stage
138: fireEvent(cancelledDispatcher, ev);
139: } catch (ThreadDeath td) {
140: fireEvent(failedDispatcher, ev);
141: throw td;
142: } catch (Throwable t) {
143: t.printStackTrace();
144: fireEvent(failedDispatcher, ev);
145: }
146: }
147:
148: public void fireEvent(Dispatcher dispatcher, Object event) {
149: EventDispatcher.fireEvent(dispatcher, listeners, event, true);
150: }
151:
152: /**
153: * Adds a GVTTreeRendererListener to this GVTTreeRenderer.
154: */
155: public void addGVTTreeRendererListener(GVTTreeRendererListener l) {
156: listeners.add(l);
157: }
158:
159: /**
160: * Removes a GVTTreeRendererListener from this GVTTreeRenderer.
161: */
162: public void removeGVTTreeRendererListener(GVTTreeRendererListener l) {
163: listeners.remove(l);
164: }
165:
166: static Dispatcher prepareDispatcher = new Dispatcher() {
167: public void dispatch(Object listener, Object event) {
168: ((GVTTreeRendererListener) listener)
169: .gvtRenderingPrepare((GVTTreeRendererEvent) event);
170: }
171: };
172:
173: static Dispatcher startedDispatcher = new Dispatcher() {
174: public void dispatch(Object listener, Object event) {
175: ((GVTTreeRendererListener) listener)
176: .gvtRenderingStarted((GVTTreeRendererEvent) event);
177: }
178: };
179:
180: static Dispatcher cancelledDispatcher = new Dispatcher() {
181: public void dispatch(Object listener, Object event) {
182: ((GVTTreeRendererListener) listener)
183: .gvtRenderingCancelled((GVTTreeRendererEvent) event);
184: }
185: };
186:
187: static Dispatcher completedDispatcher = new Dispatcher() {
188: public void dispatch(Object listener, Object event) {
189: ((GVTTreeRendererListener) listener)
190: .gvtRenderingCompleted((GVTTreeRendererEvent) event);
191: }
192: };
193:
194: static Dispatcher failedDispatcher = new Dispatcher() {
195: public void dispatch(Object listener, Object event) {
196: ((GVTTreeRendererListener) listener)
197: .gvtRenderingFailed((GVTTreeRendererEvent) event);
198: }
199: };
200:
201: }
|