Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.symbology / org.gvsig.symbology.lib / org.gvsig.symbology.lib.impl / src / main / java / org / gvsig / symbology / fmap / mapcontext / rendering / dynamiclegend / DefaultDynamicSymbol.java @ 44249

History | View | Annotate | Download (14.7 KB)

1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6
package org.gvsig.symbology.fmap.mapcontext.rendering.dynamiclegend;
7

    
8
import java.awt.BasicStroke;
9
import java.awt.Color;
10
import java.awt.Graphics2D;
11
import java.awt.Rectangle;
12
import java.awt.geom.AffineTransform;
13
import java.util.ArrayList;
14
import java.util.List;
15
import java.util.logging.Level;
16
import java.util.logging.Logger;
17
import org.gvsig.compat.print.PrintAttributes;
18
import org.gvsig.expressionevaluator.Expression;
19
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
20
import org.gvsig.expressionevaluator.MutableSymbolTable;
21
import org.gvsig.expressionevaluator.SymbolTable;
22
import org.gvsig.fmap.dal.DALLocator;
23
import org.gvsig.fmap.dal.exception.DataException;
24
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable;
25
import org.gvsig.fmap.dal.feature.Feature;
26
import org.gvsig.fmap.dal.feature.FeatureStore;
27
import org.gvsig.fmap.geom.Geometry;
28
import org.gvsig.fmap.geom.GeometryLocator;
29
import org.gvsig.fmap.geom.GeometryManager;
30
import org.gvsig.fmap.geom.exception.CreateGeometryException;
31
import org.gvsig.fmap.geom.primitive.Envelope;
32
import org.gvsig.fmap.geom.primitive.Point;
33
import org.gvsig.fmap.mapcontext.MapContext;
34
import org.gvsig.fmap.mapcontext.ViewPort;
35
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
36
import org.gvsig.fmap.mapcontext.rendering.symbols.SymbolDrawingException;
37
import org.gvsig.symbology.SymbologyLocator;
38
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.fill.ISimpleFillSymbol;
39
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.fill.impl.SimpleFillSymbol;
40
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.line.ISimpleLineSymbol;
41
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker.IMarkerSymbol;
42
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker.ISimpleMarkerSymbol;
43
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.style.ISimpleLineStyle;
44
import org.gvsig.tools.persistence.PersistentState;
45
import org.gvsig.tools.persistence.exception.PersistenceException;
46
import org.gvsig.tools.task.Cancellable;
47
import org.slf4j.LoggerFactory;
48

    
49
public class DefaultDynamicSymbol implements DynamicSymbol {
50

    
51
    private Feature feature = null;
52
    private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(SimpleFillSymbol.class);
53
    private static final GeometryManager geomManager = GeometryLocator.getGeometryManager();
54

    
55
    public static Expression eOutlineColor = null;
56
    public static Expression eFillColor = null;
57
    public static Expression eSize = null;
58
    public static Expression eRotation = null;
59

    
60
    private final boolean isShapeVisible = true;
61
    private ISimpleMarkerSymbol pointSymbol = null;
62
    private ISimpleLineSymbol lineSymbol = null;
63
    private ISimpleFillSymbol polygonSymbol = null;
64
    public FeatureSymbolTable featureSymbolTable = null;
65
    public SymbolTable symbolTable = null;
66
    private Expression eOffset;
67
    private List<String> listRequiredAttributeNames;
68

    
69
    public DefaultDynamicSymbol() {
70
        symbolTable = ExpressionEvaluatorLocator.getManager().createSymbolTable();
71
        featureSymbolTable = DALLocator.getDataManager().createFeatureSymbolTable();
72
        symbolTable.addSymbolTable(featureSymbolTable);
73

    
74
    }
75

    
76
    @Override
77
    public void setFeature(Feature feat) {
78
        feature = feat;
79
        featureSymbolTable.setFeature(feat);
80
    }
81

    
82
    @Override
83
    public DynamicSymbol clone() throws CloneNotSupportedException {
84
        return null;
85
    }
86

    
87
    @Override
88
    public ISymbol getSymbolForSelection() {
89
        int typeGeom = feature.getDefaultGeometry().getGeometryType().getType();
90
        switch (typeGeom) {
91
            case Geometry.TYPES.POINT:
92
            case Geometry.TYPES.MULTIPOINT:
93
                setPointSymbolValues();
94
                pointSymbol.setColor(MapContext.getSelectionColor());
95
                pointSymbol.setOutlineColor(MapContext.getSelectionColor());
96
                return pointSymbol;
97
            case Geometry.TYPES.LINE:
98
            case Geometry.TYPES.MULTILINE:
99
                setLineSymbolValues();
100
                lineSymbol.setColor(MapContext.getSelectionColor());
101
                return lineSymbol;
102
            case Geometry.TYPES.POLYGON:
103
            case Geometry.TYPES.ELLIPSE:
104
            case Geometry.TYPES.CIRCLE:
105
            case Geometry.TYPES.MULTIPOLYGON:
106
                setPolygonSymbolValues();
107
                polygonSymbol.setFillColor(MapContext.getSelectionColor());
108
                return polygonSymbol;
109
            default:
110
                break;
111
        }
112
        return null;
113
    }
114

    
115
    @Override
116
    public void draw(Graphics2D g, AffineTransform affineTransform, Geometry geom, Feature f, Cancellable cancel) {
117
        Color c = getColor(); //TODO
118
        int typeGeom = geom.getGeometryType().getType();
119
        switch (typeGeom) {
120
            case Geometry.TYPES.POINT:
121
            case Geometry.TYPES.MULTIPOINT:
122
                drawPoint(g, affineTransform, geom, f, cancel);
123
                break;
124
            case Geometry.TYPES.LINE:
125
            case Geometry.TYPES.MULTILINE:
126
                drawLine(g, affineTransform, geom, f, cancel);
127
                break;
128
            case Geometry.TYPES.POLYGON:
129
            case Geometry.TYPES.ELLIPSE:
130
            case Geometry.TYPES.CIRCLE:
131
            case Geometry.TYPES.MULTIPOLYGON:
132
                drawPolygon(g, affineTransform, geom, f, cancel);
133
                break;
134
            default:
135
                // Optimiza el pintado de geometrias grandes.
136
                try {
137
                    Geometry env = geom.getEnvelope().getGeometry();
138
                    env.transform(affineTransform);
139
                    Envelope env2 = env.getEnvelope();
140
                    if (env2.getLength(0) < 1.5 && env2.getLength(1) < 1.5) {
141
                        geom = env2.getUpperCorner();
142
                    }
143
                } catch (Exception ex) {
144
                    LOG.warn("Error optimizing the drawing of the geometry. Continues with normal drawing.", ex);
145
                    // Do nothing, continue with the draw of the original geometry
146
                }
147
                g.setColor(c);
148
                g.fill(geom.getShape(affineTransform));
149
                g.draw(geom.getShape(affineTransform));
150
                break;
151
        }
152
    }
153

    
154
    protected void drawPolygon(Graphics2D g, AffineTransform affineTransform, Geometry geom, Feature f, Cancellable cancel) {
155
        setPolygonSymbolValues();
156
        polygonSymbol.draw(g, affineTransform, geom, f, cancel);
157
    }
158

    
159
    protected void setPolygonSymbolValues() {
160
        if (polygonSymbol == null) {
161
            polygonSymbol = SymbologyLocator.getSymbologyManager().createSimpleFillSymbol();
162
        }
163
        setLineSymbolValues();
164
        lineSymbol.setColor(getComputedOutlineColor());
165
        polygonSymbol.setOutline(lineSymbol);
166

    
167
        polygonSymbol.setFillColor(getComputedFillColor());
168
        polygonSymbol.setHasOutline(true);
169
        polygonSymbol.setHasFill(true);
170
    }
171

    
172
    protected void setLineSymbolValues() {
173
        if (lineSymbol == null) {
174
            lineSymbol = SymbologyLocator.getSymbologyManager().createSimpleLineSymbol();
175
        }
176
        lineSymbol.setLineColor(getComputedFillColor());
177
        lineSymbol.setLineWidth(getComputedSize());
178
        ISimpleLineStyle lineStyle = SymbologyLocator.getSymbologyManager().createSimpleLineStyle();
179
        lineStyle.setOffset(0);
180
//        Stroke stroke = lineStyle.getStroke();
181
        BasicStroke stroke = new BasicStroke(getComputedSize(),
182
                BasicStroke.CAP_BUTT,
183
                BasicStroke.JOIN_MITER);
184
        lineStyle.setStroke(stroke);
185
        lineSymbol.setLineStyle(lineStyle);
186
    }
187

    
188
    protected void drawLine(Graphics2D g, AffineTransform affineTransform, Geometry geom, Feature f, Cancellable cancel) {
189
        setLineSymbolValues();
190
        lineSymbol.draw(g, affineTransform, geom, f, cancel);
191
    }
192

    
193
    protected void setPointSymbolValues() {
194
        if (pointSymbol == null) {
195
            pointSymbol = SymbologyLocator.getSymbologyManager().createSimpleMarkerSymbol();
196
        }
197
        pointSymbol.setColor(getColor());
198
        pointSymbol.setSize(getComputedSize());
199
        pointSymbol.setRotation(0);
200
        pointSymbol.setStyle(IMarkerSymbol.CIRCLE_STYLE);
201
        pointSymbol.setOutlined(true);
202
        pointSymbol.setOutlineSize(2);
203
        pointSymbol.setOutlineColor(getComputedOutlineColor());
204
    }
205

    
206
    protected void drawPoint(Graphics2D g, AffineTransform affineTransform, Geometry geom, Feature f, Cancellable cancel) {
207
        setPointSymbolValues();
208
        pointSymbol.draw(g, affineTransform, geom, f, cancel);
209
    }
210

    
211
    @Override
212
    public void getPixExtentPlus(Geometry geom, float[] distances, ViewPort viewPort, int dpi) {
213
        throw new UnsupportedOperationException("Not supported yet.");
214
    }
215

    
216
    @Override
217
    public boolean isOneDotOrPixel(Geometry geom, double[] positionOfDotOrPixel, ViewPort viewPort, int dpi) {
218
        throw new UnsupportedOperationException("Not supported yet.");
219
    }
220

    
221
    @Override
222
    public int getOnePointRgb() {
223
        return Color.ORANGE.getRGB();
224
    }
225

    
226
    @Override
227
    public String getDescription() {
228
        return "";
229
    }
230

    
231
    @Override
232
    public boolean isShapeVisible() {
233
        return isShapeVisible;
234
    }
235

    
236
    @Override
237
    public void setDescription(String desc) {
238
        throw new UnsupportedOperationException("Not supported yet.");
239
    }
240

    
241
    @Override
242
    public int getSymbolType() {
243
        int type = feature.getDefaultGeometry().getGeometryType().getType();
244
        return type;
245
    }
246

    
247
    @Override
248
    public boolean isSuitableFor(Geometry geom) {
249
        return true;
250
    }
251

    
252
    @Override
253
    public void drawInsideRectangle(Graphics2D g, AffineTransform scaleInstance, Rectangle r, PrintAttributes properties) throws SymbolDrawingException {
254
        throw new UnsupportedOperationException("Not supported yet.");
255
    }
256

    
257
    public SymbolTable getFeatureSymbolTable() {
258
        if (symbolTable == null) {
259
            MutableSymbolTable s = ExpressionEvaluatorLocator.getManager().createSymbolTable();
260
            FeatureSymbolTable fst = DALLocator.getDataManager().createFeatureSymbolTable();
261
            s.addSymbolTable(fst);
262
            fst.setFeature(feature);
263
            symbolTable = s;
264

    
265
        }
266
        return symbolTable;
267

    
268
    }
269

    
270
    @Override
271
    public Color getColor() {
272
        Expression value = this.getComputedColor();
273
        return getColorFromExpression(value);
274

    
275
    }
276

    
277
    public Expression getComputedColor() {
278
        return eFillColor;
279
    }
280

    
281
    public Expression getOutlineColor() {
282
        return eOutlineColor;
283
    }
284

    
285
    public Color getComputedOutlineColor() {
286
        return getColorFromExpression(getOutlineColor());
287
    }
288

    
289
    public void setOutlineColor(Expression exp) {
290
        eOutlineColor = exp;
291
    }
292

    
293
    public Expression getFillColor() {
294
        return eFillColor;
295
    }
296

    
297
    public Color getComputedFillColor() {
298
        return getColorFromExpression(getFillColor());
299
    }
300

    
301
    public void setFillColor(Expression exp) {
302
        eFillColor = exp;
303
    }
304

    
305
    public Expression getSize() {
306
        return eSize;
307
    }
308

    
309
    public int getComputedSize() {
310
        Expression exp = getSize();
311
        Integer size = (Integer) exp.execute(getFeatureSymbolTable());
312
        return size;
313
    }
314

    
315
    public void setSize(Expression exp) {
316
        eSize = exp;
317
    }
318

    
319
    public Expression getOffset() {
320
        return eOffset;
321
    }
322
    
323
    public void setOffset(Expression offset) {
324
        eOffset = offset;
325
    }
326

    
327
    public Point getComputedOffset() {
328
//        Expression exp = getSize();
329
//        Integer size = (Integer) exp.execute(getFeatureSymbolTable());
330
        Point pointOffset = null;
331
        try {
332
            pointOffset = GeometryLocator.getGeometryManager().createPoint(0, 0, Geometry.SUBTYPES.GEOM2D);
333
        } catch (CreateGeometryException ex) {
334
            Logger.getLogger(DefaultDynamicSymbol.class.getName()).log(Level.SEVERE, null, ex);
335
        }
336
        return pointOffset;
337
    }
338

    
339

    
340
    public Expression getRotation() {
341
        return eRotation;
342
    }
343

    
344
    public int getComputedRotation() {
345
        Expression exp = getRotation();
346
        Integer size = (Integer) exp.execute(getFeatureSymbolTable());
347
        return size;
348
    }
349

    
350
    public void setRotation(Expression exp) {
351
        eRotation = exp;
352
    }
353

    
354

    
355

    
356
    private Color getColorFromExpression(Expression exp) {
357
        Integer rgbcolor = (Integer) exp.execute(getFeatureSymbolTable());
358
        Color color = new Color(rgbcolor, true);
359
        return color;
360
    }
361

    
362
//    public Object getComputedValue(String field) {
363
//        Object value;
364
//        value = feature.get(field);
365
//
366
//        return value;
367
//    }
368
    @Override
369
    public void setColor(Color color) {
370

    
371
    }
372

    
373
    @Override
374
    public void setColor(Expression color) {
375
        eOutlineColor = color;
376

    
377
    }
378

    
379
    @Override
380
    public void saveToState(PersistentState state) throws PersistenceException {
381

    
382
    }
383

    
384
    @Override
385
    public void loadFromState(PersistentState state) throws PersistenceException {
386

    
387
    }
388

    
389
    @Override
390
    public void print(Graphics2D g, AffineTransform at, Geometry shape, PrintAttributes properties) {
391
        if (shape.getGeometryType().getType() == Geometry.TYPES.POLYGON) {
392
            Color c = getColor();
393
            if (c != null) {
394
                g.setColor(c);
395
                g.fill(shape.getShape(at));
396
            }
397
            if (getComputedOutlineColor() != null) {
398
//                getOutline().print(g, at, geom, properties);
399
            }
400
        } else if (shape.getGeometryType().getType() == Geometry.TYPES.POINT) {
401
            double originalSize = getComputedSize();
402
//            double size = originalSize;
403
//            // scale it to size
404
//            int pq = properties.getPrintQuality();
405
//            switch (pq) {
406
//                case PrintAttributes.PRINT_QUALITY_NORMAL:
407
//                    size *= (double) 300 / 72;
408
//                    break;
409
//                case PrintAttributes.PRINT_QUALITY_HIGH:
410
//                    size *= (double) 600 / 72;
411
//                    break;
412
//            // size *= 72/72; // (which is the same than doing nothing)
413
//                case PrintAttributes.PRINT_QUALITY_DRAFT:
414
//                    break;
415
//                default:
416
//                    break;
417
//            }
418
//                setSize(size);
419
            draw(g, at, shape, null, null);
420
//                setSize(originalSize);
421
        }
422

    
423
    }
424

    
425
    @Override
426
    public List<String> getRequiredFeatureAttributeNames(FeatureStore featureStore) throws DataException {
427
        return this.listRequiredAttributeNames;
428

    
429
    }
430
    
431
    public void setRequiredFeatureAttributesNames(List<String> listRequiredAttributeNames) {
432
        this.listRequiredAttributeNames = listRequiredAttributeNames;
433
    
434
    }
435
    
436

    
437
}