Statistics
| Revision:

svn-gvsig-desktop / tags / v2_0_0_Build_2021 / extensions / org.gvsig.symbology / src / main / java / org / gvsig / symbology / fmap / mapcontext / rendering / symbol / marker / impl / SimpleMarkerSymbol.java @ 34111

History | View | Annotate | Download (11 KB)

1 30838 cordinyana
/* gvSIG. Geographic Information System of the Valencian Government
2 30010 cordinyana
 *
3 30838 cordinyana
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4 31544 cordinyana
 * of the Valencian Government (CIT)
5 30838 cordinyana
 *
6 30010 cordinyana
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10 30838 cordinyana
 *
11 30010 cordinyana
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15 30838 cordinyana
 *
16 30010 cordinyana
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18 30838 cordinyana
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21 30010 cordinyana
 */
22
package org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker.impl;
23
24
import java.awt.BasicStroke;
25
import java.awt.Color;
26
import java.awt.Graphics2D;
27
import java.awt.geom.AffineTransform;
28
29 30116 cordinyana
import org.gvsig.fmap.dal.feature.Feature;
30 30010 cordinyana
import org.gvsig.fmap.geom.Geometry;
31
import org.gvsig.fmap.geom.primitive.GeneralPathX;
32 33619 jjdelcerro
import org.gvsig.fmap.mapcontext.MapContextLocator;
33 30010 cordinyana
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
34 33619 jjdelcerro
import org.gvsig.fmap.mapcontext.rendering.symbols.SymbolManager;
35
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker.IMarkerSymbol;
36 30838 cordinyana
import org.gvsig.tools.ToolsLocator;
37 32880 jjdelcerro
import org.gvsig.tools.dynobject.DynStruct;
38
import org.gvsig.tools.persistence.PersistenceManager;
39 30838 cordinyana
import org.gvsig.tools.persistence.PersistentState;
40 32880 jjdelcerro
import org.gvsig.tools.persistence.exception.PersistenceException;
41 30010 cordinyana
import org.gvsig.tools.task.Cancellable;
42 33619 jjdelcerro
import org.gvsig.tools.util.Callable;
43 30010 cordinyana
44
/**
45
 * SimpleMarkerSymbol is the most basic symbol for the representation of point objects
46
 * which can define its size and color apart from the rotation and the offset from a point
47
 * in the map.
48 30838 cordinyana
 * @author 2005-2008 jaume dominguez faus - jaume.dominguez@iver.es
49
 * @author 2009-     <a href="cordinyana@gvsig.org">C?sar Ordi?ana</a> - gvSIG team
50 30010 cordinyana
 */
51
public class SimpleMarkerSymbol extends AbstractMarkerSymbol {
52
53 33619 jjdelcerro
        public static final String SIMPLE_MARKER_SYMBOL_PERSISTENCE_DEFINITION_NAME = "SimpleMarkerSymbol";
54 30838 cordinyana
55
        private static final String FIELD_OUTLINED = "outlined";
56
        private static final String FIELD_OUTLINECOLOR = "outlineColor";
57
        private static final String FIELD_OUTLINESIZE = "outlineSize";
58
        private static final String FIELD_MARKERSTYLE = "markerStyle";
59
60 30010 cordinyana
        private boolean outlined;
61
        private Color outlineColor;
62
        private double outlineSize;
63
        private ISymbol selectionSymbol;
64
        private int markerStyle;
65
66 33619 jjdelcerro
        public SimpleMarkerSymbol() {
67
                super();
68
        }
69
70 30010 cordinyana
        public ISymbol getSymbolForSelection() {
71
                if (selectionSymbol == null) {
72
                        selectionSymbol = (SimpleMarkerSymbol) cloneForSelection();
73
                }
74
                return selectionSymbol;
75
        }
76
77 30116 cordinyana
        public void draw(Graphics2D g, AffineTransform affineTransform,
78
                        Geometry geom, Feature feature, Cancellable cancel) {
79 30010 cordinyana
                int x, y;
80
//                Point2D p = new Point2D.Double(((FPoint2D) shp).getX(), ((FPoint2D) shp)
81
//                                .getY());
82
                org.gvsig.fmap.geom.primitive.Point p = (org.gvsig.fmap.geom.primitive.Point) geom;
83
84
                int size = (int) getSize();
85
86
                int halfSize = size/2;
87
                x = ((int) (p.getX() + getOffset().getX()) - halfSize);
88
                y = ((int) (p.getY() + getOffset().getY()) - halfSize);
89
90 31513 cordinyana
                // IMask mask = getMask();
91
                // if (mask != null) {
92
                // IFillSymbol maskShape = mask.getFillSymbol();
93
                // // maskShape.draw(g, null, mask.getHaloShape(shp));
94
                // }
95 30010 cordinyana
96
                g.setColor(getColor());
97
                GeneralPathX genPath = null;
98
                g.setStroke(new BasicStroke(1));
99
100
                switch (markerStyle) {
101
                case CIRCLE_STYLE:
102
                        g.fillOval(x, y, size, size);
103
                        break;
104
                case SQUARE_STYLE:
105
                        g.fillRect(x, y, size, size);
106
                        break;
107
                case CROSS_STYLE:
108
                        x = x + halfSize;
109
                        y = y + halfSize;
110
                        genPath = new GeneralPathX();
111
                        genPath.moveTo(x, y - halfSize);
112
                        genPath.lineTo(x, y + halfSize);
113
                        genPath.moveTo(x - halfSize, y);
114
                        genPath.lineTo(x + halfSize, y);
115
                        g.draw(genPath);
116
                        break;
117
                case DIAMOND_STYLE:
118
                        x = x + halfSize;
119
                        y = y + halfSize;
120
                        genPath = new GeneralPathX();
121
                        genPath.moveTo(x-halfSize, y);
122
                        genPath.lineTo(x, y+halfSize);
123
                        genPath.lineTo(x+halfSize, y);
124
                        genPath.lineTo(x, y-halfSize);
125
                        genPath.lineTo(x-halfSize, y);
126
                        genPath.closePath();
127
                        g.fill(genPath);
128
                        break;
129
                case X_STYLE:
130
                        x = x + halfSize;
131
                        y = y + halfSize;
132
                        genPath = new GeneralPathX();
133
                        genPath.moveTo(x-halfSize, y - halfSize);
134
                        genPath.lineTo(x+halfSize, y + halfSize);
135
                        genPath.moveTo(x - halfSize, y + halfSize);
136
                        genPath.lineTo(x + halfSize, y - halfSize);
137
                        g.draw(genPath);
138
                        break;
139
                case TRIANGLE_STYLE:
140
                        x = x + halfSize;
141
                        y = y + halfSize;
142
                        int otherSize = (int) (size * 0.55);
143
                        genPath = new GeneralPathX();
144
                        genPath.moveTo(x - halfSize,
145
                                y + halfSize);
146
                        genPath.lineTo(x + halfSize,
147
                                y + halfSize);
148
                        genPath.lineTo(x, y - otherSize);
149
                        genPath.closePath();
150
151
                        g.fill(genPath);
152
                        break;
153
                case STAR_STYLE:
154
                        x = x + halfSize;
155
                        y = y + halfSize;
156
                        genPath = new GeneralPathX();
157
                        genPath.moveTo(x-halfSize, y);
158
159
                        genPath.lineTo(x-2*(halfSize/3), y+(halfSize/3));
160
                        genPath.lineTo(x-2*(halfSize/3), y+2*(halfSize/3));
161
                        genPath.lineTo(x-(halfSize/3), y+2*(halfSize/3));
162
163
                        genPath.lineTo(x, y+halfSize);
164
165
                        genPath.lineTo(x+(halfSize/3), y+2*(halfSize/3));
166
                        genPath.lineTo(x+2*(halfSize/3), y+2*(halfSize/3));
167
                        genPath.lineTo(x+2*(halfSize/3), y+(halfSize/3));
168
169
                        genPath.lineTo(x+(halfSize), y);
170
171
                        genPath.lineTo(x+2*(halfSize/3), y-(halfSize/3));
172
                        genPath.lineTo(x+2*(halfSize/3), y-2*(halfSize/3));
173
                        genPath.lineTo(x+(halfSize/3), y-2*(halfSize/3));
174
175
                        genPath.lineTo(x, y-halfSize);
176
177
                        genPath.lineTo(x-(halfSize/3), y-2*(halfSize/3));
178
                        genPath.lineTo(x-2*(halfSize/3), y-2*(halfSize/3));
179
                        genPath.lineTo(x-2*(halfSize/3), y-(halfSize/3));
180
181
                        genPath.lineTo(x-halfSize, y);
182
183
                        genPath.closePath();
184
185
186
                        g.fill(genPath);
187
188
                        break;
189
                }
190
191
192
                if (outlined) {
193
                        g.setColor(outlineColor);
194
                        switch (markerStyle) {
195
                        case CIRCLE_STYLE:
196
                                g.drawOval(x, y, size, size);
197
                                break;
198
                        case SQUARE_STYLE:
199
                                g.drawRect(x, y, size, size);
200
                                break;
201
                        case CROSS_STYLE:
202
                        case DIAMOND_STYLE:
203
                        case STAR_STYLE:
204
                        case X_STYLE:
205
                        case TRIANGLE_STYLE:
206
                                g.draw(genPath);
207
                                break;
208
                        }
209
                }
210
        }
211
212 33619 jjdelcerro
//        public String getClassName() {
213
//                return getClass().getName();
214
//        }
215 30010 cordinyana
216
        /**
217
         * Returns true or false depending if the simple marker symbol has an outline or not.
218
         * @return Returns the outline.
219
         */
220
        public boolean hasOutline() {
221
                return outlined;
222
        }
223
224
        /**
225
         * Establishes the outline for the simple marker symbol.
226
         * @param outline  The outline to set.
227
         */
228
        public void setOutlined(boolean outlined) {
229
                this.outlined = outlined;
230
        }
231
232
        /**
233
         * Returns the outline color for the symple marker symbol
234
         *
235
         * @return Color,outlineColor.
236
         */
237
        public Color getOutlineColor() {
238
                return outlineColor;
239
        }
240
241
        /**
242
         * Sets the outline color for the simple marker symbol
243
         * @param outlineColor, Color
244
         */
245
        public void setOutlineColor(Color outlineColor) {
246
                this.outlineColor = outlineColor;
247
        }
248
249
        /**
250
         * Gets the size of the outline for the simple marker symbol
251
         * @return  Returns the outlineSize.
252
         */
253
        public double getOutlineSize() {
254
                return outlineSize;
255
        }
256
257
        /**
258
         * Establishes the size for the outline of the simple marker symbol
259
         * @param outlineSize  The outlineSize to set.
260
         */
261
        public void setOutlineSize(double outlineSize) {
262
                this.outlineSize = outlineSize;
263
        }
264
265
        /**
266
         * @return  Returns the selectionSymbol.
267
         */
268
        public ISymbol getSelectionSymbol() {
269
                return selectionSymbol;
270
        }
271
272
        /**
273
         * @param selectionSymbol  The selectionSymbol to set.
274
         */
275
        public void setSelectionSymbol(ISymbol selectionSymbol) {
276
                this.selectionSymbol = selectionSymbol;
277
        }
278
        /**
279
         * Sets the style for the simple marker symbol
280
         * @param style
281
         */
282
        public void setStyle(int style) {
283
                this.markerStyle = style;
284
        }
285
286
        /**
287
         * Obtains the style for the simple marker symbol
288
         * @return markerStyle,int
289
         */
290
        public int getStyle() {
291
                return markerStyle;
292
        }
293
294
        public Object clone() throws CloneNotSupportedException {
295
                SimpleMarkerSymbol copy = (SimpleMarkerSymbol) super.clone();
296
297
                // clone selection
298
                if (selectionSymbol != null) {
299
                        copy.selectionSymbol = (ISymbol) selectionSymbol.clone();
300
                }
301
302
                return copy;
303
        }
304 30838 cordinyana
305
        /**
306
         * Returns if the marker symbol should be drawn outlined.
307
         * @return if it is outlined
308
         */
309
        public boolean isOutlined() {
310
                return outlined;
311
        }
312
313
        public void loadFromState(PersistentState state)
314
                        throws PersistenceException {
315
                // Set parent fill symbol properties
316
                super.loadFromState(state);
317
318
                // Set own properties
319
                setStyle(state.getInt(FIELD_MARKERSTYLE));
320
                setOutlined(state.getBoolean(FIELD_OUTLINED));
321
                if (isOutlined()) {
322
                        setOutlineColor((Color) state.get(FIELD_OUTLINECOLOR));
323
                        setOutlineSize(state.getDouble(FIELD_OUTLINESIZE));
324
                }
325
        }
326
327
        public void saveToState(PersistentState state) throws PersistenceException {
328
                // Save parent fill symbol properties
329
                super.saveToState(state);
330
331
                // Save own properties
332
                state.set(FIELD_MARKERSTYLE, getStyle());
333
                state.set(FIELD_OUTLINED, isOutlined());
334
                if (isOutlined()) {
335
                        state.set(FIELD_OUTLINECOLOR, getOutlineColor());
336
                        state.set(FIELD_OUTLINESIZE, getOutlineSize());
337
                }
338
        }
339
340 33619 jjdelcerro
341
        public static class RegisterPersistence implements Callable {
342 30838 cordinyana
343 33619 jjdelcerro
                public Object call() throws Exception {
344
                        PersistenceManager manager = ToolsLocator.getPersistenceManager();
345
                        if( manager.getDefinition(SIMPLE_MARKER_SYMBOL_PERSISTENCE_DEFINITION_NAME)==null ) {
346
                                DynStruct definition = manager.addDefinition(
347
                                                SimpleMarkerSymbol.class,
348
                                                SIMPLE_MARKER_SYMBOL_PERSISTENCE_DEFINITION_NAME,
349
                                                SIMPLE_MARKER_SYMBOL_PERSISTENCE_DEFINITION_NAME+" Persistence definition",
350
                                                null,
351
                                                null
352
                                );
353
                                // Extend the FillSymbol base definition
354 33652 jjdelcerro
                                definition.extend(manager.getDefinition(MARKER_SYMBOL_PERSISTENCE_DEFINITION_NAME));
355 33619 jjdelcerro
356
                                // Marker style
357
                                definition.addDynFieldInt(FIELD_MARKERSTYLE).setMandatory(true);
358
                                // Outlined?
359
                                definition.addDynFieldBoolean(FIELD_OUTLINED).setMandatory(true);
360
                                // Outline color
361 33681 fdiaz
                                definition.addDynFieldObject(FIELD_OUTLINECOLOR).setClassOfValue(Color.class);
362 33619 jjdelcerro
                                // Outline size
363
                                definition.addDynFieldDouble(FIELD_OUTLINESIZE);
364
                        }
365
                        return Boolean.TRUE;
366
                }
367
368 30838 cordinyana
        }
369
370 33619 jjdelcerro
        public static class RegisterSymbol implements Callable {
371
372
                public Object call() throws Exception {
373
                        int[] shapeTypes;
374
                        SymbolManager manager = MapContextLocator.getSymbolManager();
375
376
                shapeTypes =
377
                    new int[] { Geometry.TYPES.POINT, Geometry.TYPES.MULTIPOINT };
378
                manager.registerSymbol(IMarkerSymbol.SYMBOL_NAME,
379
                    shapeTypes,
380
                    SimpleMarkerSymbol.class);
381
382
                        return Boolean.TRUE;
383
                }
384
385
        }
386
387 30010 cordinyana
}