Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / org.gvsig.chartlegend / src / main / java / org / gvsig / symbology / fmap / mapcontext / rendering / symbol / chart / impl / MultiChartSymbol.java @ 32692

History | View | Annotate | Download (13.8 KB)

1
package org.gvsig.symbology.fmap.mapcontext.rendering.symbol.chart.impl;
2

    
3
import java.awt.Color;
4
import java.awt.Graphics2D;
5
import java.awt.Rectangle;
6
import java.awt.geom.AffineTransform;
7
import java.util.ArrayList;
8

    
9
import javax.print.attribute.PrintRequestAttributeSet;
10

    
11
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.chart.IMultiChartSymbol;
12

    
13
import com.iver.cit.gvsig.fmap.ViewPort;
14
import com.iver.cit.gvsig.fmap.core.CartographicSupport;
15
import com.iver.cit.gvsig.fmap.core.FShape;
16
import com.iver.cit.gvsig.fmap.core.IGeometry;
17
import com.iver.cit.gvsig.fmap.core.SymbologyFactory;
18
import com.iver.cit.gvsig.fmap.core.symbols.AbstractSymbol;
19
import com.iver.cit.gvsig.fmap.core.symbols.IFillSymbol;
20
import com.iver.cit.gvsig.fmap.core.symbols.ILineSymbol;
21
import com.iver.cit.gvsig.fmap.core.symbols.ISymbol;
22
import com.iver.cit.gvsig.fmap.core.symbols.SymbolDrawingException;
23
import com.iver.utiles.XMLEntity;
24
import com.iver.utiles.swing.threads.Cancellable;
25

    
26
/**
27
 * Multi symbol composed with the background symbol and chart symbol.
28
 *
29
 * @author Vicente Caballero Navarro
30
 */
31
public class MultiChartSymbol extends AbstractSymbol implements IMultiChartSymbol{
32
        public void draw(Graphics2D g, AffineTransform affineTransform, FShape shp,
33
                        Cancellable cancel) {
34
                for (int i = 0; (cancel==null || !cancel.isCanceled()) && i < layers.length; i++) {
35
                        layers[i].draw(g, affineTransform, shp, cancel);
36
                }
37
        }
38

    
39
        public void drawInsideRectangle(Graphics2D g,
40
                        AffineTransform scaleInstance, Rectangle r,
41
                        PrintRequestAttributeSet properties) throws SymbolDrawingException {
42
                for (int i = 0; i < layers.length; i++) {
43
                        layers[i].drawInsideRectangle(g, scaleInstance, r, properties);
44
                }
45
        }
46

    
47
        public void getPixExtentPlus(FShape shp, float[] distances,
48
                        ViewPort viewPort, int dpi) {
49
                float[] myDistances = new float[] {0,0};
50
                distances[0] = 0;
51
                distances[1] = 0;
52
                for (int i = 0; i < layers.length; i++) {
53
                        layers[i].getPixExtentPlus(shp, myDistances, viewPort, dpi);
54
                        distances[0] = Math.max(myDistances[0], distances[0]);
55
                        distances[1] = Math.max(myDistances[1], distances[1]);
56
                }
57
        }
58

    
59
        public XMLEntity getXMLEntity() {
60
                XMLEntity xml = new XMLEntity();
61
                xml.putProperty("className", getClassName());
62
                for (int i = 0; i < layers.length; i++) {
63
                        xml.addChild(layers[i].getXMLEntity());
64
                }
65
                return xml;
66
        }
67

    
68
        public boolean isSuitableFor(IGeometry geom) {
69
                return layers[layers.length-1].isSuitableFor(geom);
70
        }
71

    
72
        public void setXMLEntity(XMLEntity xml) {
73
                for (int i = 0; i < xml.getChildrenCount(); i++) {
74
                        addLayer(SymbologyFactory.createSymbolFromXML(xml.getChild(i), "layer" + i));
75
                }
76
        }
77

    
78
        public void print(Graphics2D g, AffineTransform at, FShape shape,
79
                        PrintRequestAttributeSet properties) {
80
                for (int i = 0; i < layers.length; i++) {
81
                        layers[i].print(g, at, shape, properties);
82
                }
83
        }
84

    
85
        private static final double OPACITY_SELECTION_FACTOR = .8;
86
        private ISymbol[] layers = new ISymbol[0];
87
        private MultiChartSymbol selectionSymbol;
88
        public void addLayer(ISymbol newLayer) {
89
                addLayer(newLayer, layers.length);
90
        }
91

    
92
        /* (non-Javadoc)
93
         * @see org.gvsig.fmap.mapcontext.rendering.symbols.IMultiLayerSymbol#addLayer(org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol, int)
94
         */
95
        public void addLayer(ISymbol newLayer, int layerIndex) throws IndexOutOfBoundsException {
96
                if (newLayer == null ) {
97
                        /*|| newLayer instanceof ILabelStyle)*/ return; // null or symbols that are styles are not allowed
98
                }
99

    
100
                selectionSymbol = null; /* forces the selection symbol to be re-created
101
                                                                  * next time it is required
102
                                                                  */
103
                if (layerIndex < 0 || layers.length < layerIndex) {
104
                        throw new IndexOutOfBoundsException(layerIndex+" < 0 or "+layerIndex+" > "+layers.length);
105
                }
106
                ArrayList newLayers = new ArrayList(); //<ISymbol>
107
                for (int i = 0; i < layers.length; i++) {
108
                        newLayers.add(layers[i]);
109
                }
110
                try {
111
                        newLayers.add(layerIndex, newLayer);
112
                        layers = (ISymbol[]) newLayers.toArray(new ISymbol[0]);
113
                } catch (ArrayStoreException asEx) {
114
                        throw new ClassCastException(newLayer.getClass().getName() + " is not an IFillSymbol");
115
                }
116
        }
117

    
118
        /* (non-Javadoc)
119
         * @see org.gvsig.fmap.mapcontext.rendering.symbols.IMultiLayerSymbol#getLayer(int)
120
         */
121
        public ISymbol getLayer(int layerIndex) {
122
                return layers[layerIndex];
123
        }
124

    
125
        /* (non-Javadoc)
126
         * @see org.gvsig.fmap.mapcontext.rendering.symbols.IMultiLayerSymbol#getLayerCount()
127
         */
128
        public int getLayerCount() {
129
                return layers.length;
130
        }
131

    
132
        /* (non-Javadoc)
133
         * @see org.gvsig.fmap.mapcontext.rendering.symbols.IMultiLayerSymbol#removeLayer(org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol)
134
         */
135
        public boolean removeLayer(ISymbol layer) {
136
                int capacity = 0;
137
                capacity = layers.length;
138
                ArrayList lst = new ArrayList(capacity); //<IFillSymbol>
139
                for (int i = 0; i < capacity; i++) {
140
                        lst.add(layers[i]);
141
                }
142
                boolean contains = lst.remove(layer);
143
                layers = (ISymbol[])lst.toArray(new ISymbol[0]);
144
                return contains;
145
        }
146

    
147
        /* (non-Javadoc)
148
         * @see org.gvsig.fmap.mapcontext.rendering.symbols.IMultiLayerSymbol#setLayer(int, org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol)
149
         */
150
        public void setLayer(int index, ISymbol layer)
151
                        throws IndexOutOfBoundsException {
152
                layers[index] = (ISymbol) layer;
153

    
154
        }
155

    
156
        /* (non-Javadoc)
157
         * @see org.gvsig.fmap.mapcontext.rendering.symbols.IMultiLayerSymbol#swapLayers(int, int)
158
         */
159
        public void swapLayers(int index1, int index2) {
160
                ISymbol aux1 = getLayer(index1), aux2 = getLayer(index2);
161
                layers[index2] = (ISymbol) aux1;
162
                layers[index1] = (ISymbol) aux2;
163
        }
164

    
165
        /* (non-Javadoc)
166
         * @see org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol#draw(java.awt.Graphics2D, java.awt.geom.AffineTransform, org.gvsig.fmap.geom.Geometry, org.gvsig.fmap.dal.feature.Feature, org.gvsig.tools.task.Cancellable)
167
         */
168
//        public void draw(Graphics2D g, AffineTransform affineTransform,
169
//                        Geometry geom, Feature feature, Cancellable cancel) {
170
//                for (int i = 0; (cancel==null || !cancel.isCanceled()) && i < layers.length; i++) {
171
//                        layers[i].draw(g, affineTransform, geom, feature, cancel);
172
//                }
173
//        }
174

    
175
        /* (non-Javadoc)
176
         * @see org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol#drawInsideRectangle(java.awt.Graphics2D, java.awt.geom.AffineTransform, java.awt.Rectangle, org.gvsig.compat.print.PrintAttributes)
177
         */
178
//        public void drawInsideRectangle(Graphics2D g,
179
//                        AffineTransform scaleInstance, Rectangle r, PrintAttributes properties) throws SymbolDrawingException {
180
//                for (int i = 0; i < layers.length; i++) {
181
//                        layers[i].drawInsideRectangle(g, scaleInstance, r, properties);
182
//                }
183
//        }
184

    
185
        /* (non-Javadoc)
186
         * @see org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol#getColor()
187
         */
188
//        public Color getColor() {
189
//                // will paint only the last layer color
190
//                return layers[layers.length-1].getColor();
191
//        }
192

    
193
        /* (non-Javadoc)
194
         * @see org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol#getOnePointRgb()
195
         */
196
        public int getOnePointRgb() {
197
                // will paint only the last layer pixel
198
                return layers[layers.length-1].getOnePointRgb();
199
        }
200

    
201
        /* (non-Javadoc)
202
         * @see org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol#getPixExtentPlus(org.gvsig.fmap.geom.Geometry, float[], org.gvsig.fmap.mapcontext.ViewPort, int)
203
         */
204
//        public void getPixExtentPlus(Geometry geom, float[] distances,
205
//                        ViewPort viewPort, int dpi) {
206
//                float[] myDistances = new float[] {0,0};
207
//                distances[0] = 0;
208
//                distances[1] = 0;
209
//                for (int i = 0; i < layers.length; i++) {
210
//                        layers[i].getPixExtentPlus(geom, myDistances, viewPort, dpi);
211
//                        distances[0] = Math.max(myDistances[0], distances[0]);
212
//                        distances[1] = Math.max(myDistances[1], distances[1]);
213
//                }
214
//        }
215

    
216
        /* (non-Javadoc)
217
         * @see org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol#getSymbolForSelection()
218
         */
219
        public ISymbol getSymbolForSelection() {
220
                if (selectionSymbol == null) {
221
                        selectionSymbol = new MultiChartSymbol();
222
                        selectionSymbol.setDescription(getDescription());
223
//                        selectionSymbol.symbolType = symbolType;
224
                        for (int i = 0; i < layers.length; i++) {
225
                                selectionSymbol.addLayer(layers[i].getSymbolForSelection());
226
                        }
227
//                        SimpleFillSymbol selLayer = new SimpleFillSymbol();
228
//                        Color c = MapContext.getSelectionColor();
229
//                        c = new Color(
230
//                                        c.getRed(),
231
//                                        c.getGreen(),
232
//                                        c.getBlue(),
233
//                                        (int) (255*OPACITY_SELECTION_FACTOR));
234
//                        selLayer.setFillColor(c);
235
////                        selLayer.setOutline(getOutline());
236
//                        selectionSymbol.addLayer(selLayer);
237
                }
238
                return selectionSymbol;
239

    
240
        }
241

    
242

    
243
        /* (non-Javadoc)
244
         * @see org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol#getSymbolType()
245
         */
246
        public int getSymbolType() {
247
                // will paint only the last layer type
248
                return layers[layers.length-1].getSymbolType();
249
        }
250

    
251
        /* (non-Javadoc)
252
         * @see org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol#isSuitableFor(org.gvsig.fmap.geom.Geometry)
253
         */
254
//        public boolean isSuitableFor(Geometry geom) {
255
//                // will paint only the last layer suitable
256
//                return layers[layers.length-1].isSuitableFor(geom);
257
//        }
258

    
259
        /* (non-Javadoc)
260
         * @see org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol#setColor(java.awt.Color)
261
         */
262
//        public void setColor(Color color) {
263
//                layers[layers.length-1].setColor(color);
264
//        }
265

    
266
        /* (non-Javadoc)
267
         * @see org.gvsig.fmap.mapcontext.rendering.symbols.IPrintable#print(java.awt.Graphics2D, java.awt.geom.AffineTransform, org.gvsig.fmap.geom.Geometry, org.gvsig.compat.print.PrintAttributes)
268
         */
269
//        public void print(Graphics2D g, AffineTransform at, Geometry geom,
270
//                        PrintAttributes properties) {
271
//                for (int i = 0; i < layers.length; i++) {
272
//                        layers[i].print(g, at, geom, properties);
273
//                }
274
//
275
//        }
276
        /* (non-Javadoc)
277
         * @see org.gvsig.symbology.fmap.mapcontext.rendering.symbol.impl.AbstractSymbol#clone()
278
         */
279
//        public Object clone() throws CloneNotSupportedException {
280
//                MultiChartSymbol copy = (MultiChartSymbol) super.clone();
281
//
282
//                // Clone layers
283
//                if (layers != null) {
284
//                        ISymbol[] layersCopy = new ISymbol[layers.length];
285
//                        for (int i = 0; i < layers.length; i++) {
286
//                                layersCopy[i] = (ISymbol) layers[i].clone();
287
//                        }
288
//                        copy.layers = layersCopy;
289
//                }
290
//
291
//                // Clone selection
292
//                if (selectionSymbol != null) {
293
//                        copy.selectionSymbol = (MultiChartSymbol) selectionSymbol
294
//                                        .clone();
295
//                }
296
//
297
//                return copy;
298
//        }
299

    
300
        /* (non-Javadoc)
301
         * @see org.gvsig.fmap.mapcontext.rendering.symbols.CartographicSupport#getCartographicSize(org.gvsig.fmap.mapcontext.ViewPort, double, org.gvsig.fmap.geom.Geometry)
302
         */
303
        public double getCartographicSize(ViewPort viewPort, double dpi,
304
                        FShape geom) {
305
                return ((CartographicSupport)layers[layers.length-1]).getCartographicSize(viewPort, dpi, geom);
306
        }
307

    
308
        /* (non-Javadoc)
309
         * @see org.gvsig.fmap.mapcontext.rendering.symbols.CartographicSupport#setCartographicSize(double, org.gvsig.fmap.geom.Geometry)
310
         */
311
        public void setCartographicSize(double cartographicSize, FShape geom) {
312
                ((CartographicSupport)layers[layers.length-1]).setCartographicSize(cartographicSize, geom);
313
        }
314

    
315
        /* (non-Javadoc)
316
         * @see org.gvsig.fmap.mapcontext.rendering.symbols.CartographicSupport#toCartographicSize(org.gvsig.fmap.mapcontext.ViewPort, double, org.gvsig.fmap.geom.Geometry)
317
         */
318
        public double toCartographicSize(ViewPort viewPort, double dpi,
319
                        FShape geom) {
320
                return ((CartographicSupport)layers[layers.length-1]).toCartographicSize(viewPort, dpi, geom);
321
        }
322

    
323
        /* (non-Javadoc)
324
         * @see org.gvsig.symbology.fmap.mapcontext.rendering.symbol.impl.AbstractSymbol#getUnit()
325
         */
326
        public int getUnit() {
327
                return ((CartographicSupport)layers[layers.length-1]).getUnit();
328
        }
329

    
330
        /* (non-Javadoc)
331
         * @see org.gvsig.symbology.fmap.mapcontext.rendering.symbol.impl.AbstractSymbol#setUnit(int)
332
         */
333
        public void setUnit(int unitIndex) {
334
                ((CartographicSupport)layers[layers.length-1]).setUnit(unitIndex);
335
        }
336

    
337
        public String getClassName() {
338
                return this.getClass().getName();
339
        }
340

    
341
        public int getFillAlpha() {
342
                if (layers[0] instanceof IFillSymbol){
343
                        return ((IFillSymbol)layers[0]).getFillAlpha();
344
                }
345
                return 0;
346
        }
347

    
348
        public Color getFillColor() {
349
                if (layers[0] instanceof IFillSymbol){
350
                        return ((IFillSymbol)layers[0]).getFillColor();
351
                }
352
                return null;
353
        }
354

    
355
        public ILineSymbol getOutline() {
356
                if (layers[0] instanceof IFillSymbol){
357
                        return ((IFillSymbol)layers[0]).getOutline();
358
                }
359
                return null;
360
        }
361

    
362
        public boolean hasFill() {
363
                if (layers[0] instanceof IFillSymbol){
364
                        return ((IFillSymbol)layers[0]).hasFill();
365
                }
366
                return false;
367
        }
368

    
369
        public boolean hasOutline() {
370
                if (layers[0] instanceof IFillSymbol){
371
                        return ((IFillSymbol)layers[0]).hasOutline();
372
                }
373
                return false;
374
        }
375

    
376
        public void setFillColor(Color color) {
377
                if (layers[0] instanceof IFillSymbol){
378
                        ((IFillSymbol)layers[0]).setFillColor(color);
379
                }
380
        }
381

    
382
        public void setHasFill(boolean hasFill) {
383
                if (layers[0] instanceof IFillSymbol){
384
                        ((IFillSymbol)layers[0]).setHasFill(hasFill);
385
                }
386
        }
387

    
388
        public void setHasOutline(boolean hasOutline) {
389
                if (layers[0] instanceof IFillSymbol){
390
                        ((IFillSymbol)layers[0]).setHasOutline(hasOutline);
391
                }
392
        }
393

    
394
        public void setOutline(ILineSymbol outline) {
395
                if (layers[0] instanceof IFillSymbol){
396
                        ((IFillSymbol)layers[0]).setOutline(outline);
397
                }
398
        }
399
        public boolean equals(Object obj){
400
                if (!obj.getClass().equals(getClass())){
401
                        return false;
402
                }
403
                if (((MultiChartSymbol)obj).getLayerCount()!=getLayerCount()){
404
                        return false;
405
                }
406
                for (int i = 0; i < getLayerCount(); i++) {
407
                        if (!((MultiChartSymbol)obj).getLayer(i).equals(getLayer(i))){
408
                                return false;
409
                        }
410
                }
411
                if (((ISymbol)obj).getOnePointRgb()!=getOnePointRgb()){
412
                        return false;
413
                }
414
                if (getDescription()!=null && ((ISymbol)obj).getDescription()!=null){
415
                        if (!((ISymbol)obj).getDescription().equals(getDescription())){
416
                                return false;
417
                        }
418
                }
419
                return true;
420
        }
421

    
422
}