Statistics
| Revision:

svn-gvsig-desktop / tags / v1_0_2_Build_912 / libraries / libFMap / src / com / iver / cit / gvsig / fmap / rendering / VectorialUniqueValueLegend.java @ 11422

History | View | Annotate | Download (26.5 KB)

1 1100 fjp
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41 322 fernando
package com.iver.cit.gvsig.fmap.rendering;
42
43 8765 jjdelcerro
import java.sql.Types;
44
import java.text.ParseException;
45
import java.util.ArrayList;
46
import java.util.Comparator;
47
import java.util.TreeMap;
48
49
import org.geotools.filter.ExpressionBuilder;
50
import org.geotools.filter.Filter;
51
import org.geotools.styling.FeatureTypeStyle;
52
import org.geotools.styling.NamedLayer;
53
import org.geotools.styling.Rule;
54
import org.geotools.styling.SLDTransformer;
55
import org.geotools.styling.Style;
56
import org.geotools.styling.StyleBuilder;
57
import org.geotools.styling.StyleFactory;
58
import org.geotools.styling.StyledLayerDescriptor;
59
import org.geotools.styling.Symbolizer;
60
61 470 fjp
import com.hardcode.gdbms.engine.data.DataSource;
62
import com.hardcode.gdbms.engine.instruction.FieldNotFoundException;
63
import com.hardcode.gdbms.engine.instruction.IncompatibleTypesException;
64 479 fjp
import com.hardcode.gdbms.engine.instruction.SemanticException;
65 470 fjp
import com.hardcode.gdbms.engine.values.BooleanValue;
66 2361 vcaballero
import com.hardcode.gdbms.engine.values.NullValue;
67 2415 caballero
import com.hardcode.gdbms.engine.values.StringValue;
68 470 fjp
import com.hardcode.gdbms.engine.values.Value;
69 479 fjp
import com.hardcode.gdbms.engine.values.ValueFactory;
70 651 fernando
import com.iver.cit.gvsig.fmap.DriverException;
71 470 fjp
import com.iver.cit.gvsig.fmap.core.FShape;
72 2183 fernando
import com.iver.cit.gvsig.fmap.core.IFeature;
73 8765 jjdelcerro
import com.iver.cit.gvsig.fmap.core.ISLDCompatible;
74
import com.iver.cit.gvsig.fmap.core.ISymbol;
75 4111 ldiaz
import com.iver.cit.gvsig.fmap.core.SLDTags;
76
import com.iver.cit.gvsig.fmap.core.SLDUtils;
77 470 fjp
import com.iver.cit.gvsig.fmap.core.v02.FConstant;
78 458 fjp
import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
79 490 fernando
import com.iver.cit.gvsig.fmap.layers.XMLException;
80 435 vcaballero
import com.iver.utiles.XMLEntity;
81
82 322 fernando
/**
83 1034 vcaballero
 * Leyenda vectorial por valores ?nicos.
84 322 fernando
 *
85
 * @author Vicente Caballero Navarro
86
 */
87 435 vcaballero
public class VectorialUniqueValueLegend implements UniqueValueLegend,
88 2796 caballero
    VectorialLegend {
89 10465 caballero
        private boolean sorter=true;
90 10499 caballero
        private TreeMap symbols = new TreeMap(new Comparator() {
91
                public int compare(Object o1, Object o2) {
92
                        if ((o1 != null) && (o2 != null)) {
93
                                Value v2 = (Value) o2;
94
                                Value v1 = (Value) o1;
95
                                // TODO estas dos comprobaciones son por evitar un bug en el
96
                                // gdbms, cuando se solucione se puede eliminar.
97
                                if (v1 instanceof NullValue && v2 instanceof NullValue) {
98
                                        return 0;
99
                                }
100 1034 vcaballero
101 10499 caballero
                                if (v1 instanceof NullValue) {
102
                                        return -1;
103
                                }
104 1034 vcaballero
105 10499 caballero
                                if (v2 instanceof NullValue) {
106
                                        return 1;
107
                                }
108
                                if (sorter) {
109 1034 vcaballero
110 10499 caballero
                                        BooleanValue boolVal;
111 1034 vcaballero
112 10499 caballero
                                        try {
113
                                                boolVal = (BooleanValue) (v1.greater(v2));
114 2415 caballero
115 10499 caballero
                                                if (boolVal.getValue()) {
116
                                                        return 1;
117
                                                }
118 1034 vcaballero
119 10499 caballero
                                                boolVal = (BooleanValue) (v1.less(v2));
120 1034 vcaballero
121 10499 caballero
                                                if (boolVal.getValue()) {
122
                                                        return -1;
123
                                                }
124
                                        } catch (IncompatibleTypesException e) {
125
                                        }
126 1034 vcaballero
127 10499 caballero
                                        try {
128
                                                if (((BooleanValue) v1.equals(v2)).getValue()) {
129
                                                        return 0;
130
                                                }
131
                                        } catch (IncompatibleTypesException e) {
132
                                        }
133 1034 vcaballero
134 10499 caballero
                                        if (v1 instanceof StringValue) {
135
                                                return -1;
136
                                        }
137 1034 vcaballero
138 10499 caballero
                                        if (v2 instanceof StringValue) {
139
                                                return 1;
140
                                        }
141
142
                                } else {
143
                                        int indexV1 = keys.indexOf(v1);
144
                                        int indexV2 = keys.indexOf(v2);
145
                                        if (indexV1 > indexV2) {
146
                                                return -1;
147
                                        } else if (indexV1 < indexV2) {
148
                                                return 1;
149
                                        }
150
                                        return 0;
151
                                }
152
                        }
153
                        return 0;
154
                }
155
        }); // Para poder ordenar
156
    private ArrayList keys = new ArrayList(); // En lugar de un HashSet, para
157
                                                                                                // tener acceso por ?ndice
158 2796 caballero
    private String fieldName;
159 8765 jjdelcerro
    protected int fieldId = -1;
160 2796 caballero
    private String labelFieldName;
161
    private String labelFieldHeight;
162
    private String labelFieldRotation;
163 8765 jjdelcerro
    private ISymbol defaultSymbol;
164 2796 caballero
    private DataSource dataSource;
165
    private int shapeType;
166
    private String valueType = NullValue.class.getName();
167
    private boolean useDefaultSymbol = false;
168 3035 fjp
    // private boolean bWithHeightText = false;
169 322 fernando
170 2796 caballero
    /**
171 10499 caballero
         * Crea un nuevo VectorialUniqueValueLegend.
172
         */
173 2796 caballero
    public VectorialUniqueValueLegend() {
174 10499 caballero
        // defaultSymbol = LegendFactory.DEFAULT_POLYGON_SYMBOL;
175 2796 caballero
    }
176 1034 vcaballero
177 2796 caballero
    /**
178 10499 caballero
         * Crea un nuevo VectorialUniqueValueLegend.
179
         *
180
         * @param shapeType
181
         *            Tipo de shape.
182
         */
183 2796 caballero
    public VectorialUniqueValueLegend(int shapeType) {
184
        setShapeType(shapeType);
185
    }
186 1034 vcaballero
187 2796 caballero
    /**
188
     * Inserta el tipo de shape.
189
     *
190
     * @param shapeType Tipo de shape.
191
     */
192
    public void setShapeType(int shapeType) {
193
        if (this.shapeType != shapeType) {
194
            switch (shapeType) {
195
                case FShape.POINT:
196
                    defaultSymbol = new FSymbol(FConstant.SYMBOL_TYPE_POINT);
197 1034 vcaballero
198 2796 caballero
                    break;
199 1034 vcaballero
200 2796 caballero
                case FShape.LINE:
201
                    defaultSymbol = new FSymbol(FConstant.SYMBOL_TYPE_LINE);
202 470 fjp
203 2796 caballero
                    break;
204 322 fernando
205 2796 caballero
                case FShape.POLYGON:
206
                    defaultSymbol = new FSymbol(FConstant.SYMBOL_TYPE_FILL);
207 470 fjp
208 2796 caballero
                    break;
209 435 vcaballero
210 2796 caballero
                default:
211
                    defaultSymbol = new FSymbol(shapeType);
212
            }
213 435 vcaballero
214 2796 caballero
            this.shapeType = shapeType;
215
        }
216
    }
217 322 fernando
218 2796 caballero
    /**
219
     * @see com.iver.cit.gvsig.fmap.rendering.UniqueValueLegend#setValueSymbolByID(int,
220 8765 jjdelcerro
     *      ISymbol)
221 2796 caballero
     */
222 8765 jjdelcerro
    public void setValueSymbolByID(int id, ISymbol symbol) {
223 2796 caballero
        symbols.put(keys.get(id), symbol);
224
    }
225 322 fernando
226 2796 caballero
    /**
227
     * Devuelve un s?mbolo a partir del ID. Mira en el m_ArrayKeys  el elemento
228
     * ID, y con esa clave recupera el FSymbol por valor
229
     *
230
     * @param id ID.
231
     * @param symbol DOCUMENT ME!
232
     */
233 322 fernando
234 2796 caballero
    /*
235
       public FSymbol getSymbolByID(int ID) {
236
           return (FSymbol) symbols.get(keys.get(ID));
237
       }
238
     */
239 322 fernando
240 2796 caballero
    /**
241
     * Se usa en la tabla que muestra una leyenda.
242 8765 jjdelcerro
     *        @deprecated use setValueSymbolByID(int id, ISymbol symbol);
243 2796 caballero
     * @param id
244
     * @param symbol
245
     */
246 8765 jjdelcerro
    public void setValueSymbol(int id, ISymbol symbol) {
247 2796 caballero
        symbols.put(keys.get(id), symbol);
248
    }
249 322 fernando
250 2796 caballero
    /**
251
     * @see com.iver.cit.gvsig.fmap.rendering.UniqueValueLegend#getValues()
252
     */
253
    public Object[] getValues() {
254
        return symbols.keySet().toArray(new Object[0]);
255
    }
256 322 fernando
257 2796 caballero
    /**
258
     * @see com.iver.cit.gvsig.fmap.rendering.UniqueValueLegend#addSymbol(java.lang.Object,
259 8765 jjdelcerro
     *      ISymbol)
260 2796 caballero
     */
261 8765 jjdelcerro
    public void addSymbol(Object key, ISymbol symbol) {
262 2796 caballero
        Object resul;
263
        resul = symbols.put(key, symbol);
264 322 fernando
265 2796 caballero
        if (resul != null) {
266
            System.err.println("Error: la clave " + key +
267
                " ya exist?a. Resul = " + resul);
268
            System.err.println("symbol nuevo:" + symbol.getDescription() +
269 8765 jjdelcerro
                " Sviejo= " + ((ISymbol) resul).getDescription());
270 2796 caballero
        } else {
271
            keys.add(key);
272 10499 caballero
              if (!key.getClass().equals(NullValue.class)) {
273 2796 caballero
                valueType = key.getClass().getName();
274
            }
275
        }
276
    }
277
278
    /**
279
     * @see com.iver.cit.gvsig.fmap.rendering.ClassifiedLegend#clear()
280
     */
281
    public void clear() {
282
        keys.clear();
283
        symbols.clear();
284
    }
285
286
    /**
287
     * @see com.iver.cit.gvsig.fmap.rendering.ClassifiedLegend#getDescriptions()
288
     */
289
    public String[] getDescriptions() {
290
        String[] descriptions = new String[symbols.size()];
291 8765 jjdelcerro
        ISymbol[] auxSym = getSymbols();
292 2796 caballero
293
        for (int i = 0; i < descriptions.length; i++)
294
            descriptions[i] = auxSym[i].getDescription();
295
296
        return descriptions;
297
    }
298
299
    /**
300
     * @see com.iver.cit.gvsig.fmap.rendering.ClassifiedLegend#getSymbols()
301
     */
302 8765 jjdelcerro
    public ISymbol[] getSymbols() {
303 10499 caballero
            return (ISymbol[]) symbols.values().toArray(new ISymbol[0]);
304 2796 caballero
    }
305
306
    /**
307
     * @see com.iver.cit.gvsig.fmap.rendering.ClassifiedLegend#getFieldName()
308
     */
309
    public String getFieldName() {
310
        return fieldName;
311
    }
312
313
    /**
314 8765 jjdelcerro
     * @see com.iver.cit.gvsig.fmap.rendering.VectorialLegend#setDefaultSymbol(ISymbol)
315 2796 caballero
     */
316 8765 jjdelcerro
    public void setDefaultSymbol(ISymbol s) {
317 2796 caballero
        defaultSymbol = s;
318
    }
319
320
    /* (non-Javadoc)
321
     * @see com.iver.cit.gvsig.fmap.rendering.VectorialLegend#getLabelField()
322
     */
323
    public String getLabelField() {
324
        return labelFieldName;
325
    }
326
327
    /**
328
     * @see com.iver.cit.gvsig.fmap.rendering.Legend#setLabelField(int)
329
     */
330
    public void setLabelField(String fieldName) {
331
        labelFieldName = fieldName;
332
    }
333
334
    /**
335
     * @see com.iver.cit.gvsig.fmap.rendering.ClassifiedLegend#setField()
336
     */
337
    public void setFieldName(String str) {
338
        fieldName = str;
339
    }
340
341
    /**
342
     * @see com.iver.cit.gvsig.fmap.rendering.VectorialLegend#getSymbol(int)
343
     */
344 8765 jjdelcerro
    public ISymbol getSymbol(int recordIndex) throws DriverException {
345 2796 caballero
        try {
346 8765 jjdelcerro
                 Value val = dataSource.getFieldValue(recordIndex, fieldId);
347
            ISymbol theSymbol = getSymbolByValue(val);
348 2796 caballero
349
            //if (theSymbol != null) {
350
            return theSymbol;
351
352
            //} else {
353
            //        return getDefaultSymbol();
354
            //}
355
        } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
356
            throw new DriverException(e);
357
        }
358
    }
359
360
    /**
361
     * Devuelve un s?mbolo a partir de una IFeature.
362 3347 fjp
     * OJO!! Cuando usamos un feature iterator de base de datos
363
     * el ?nico campo que vendr? rellenado es el de fieldID.
364
     * Los dem?s vendr?n a nulos para ahorra tiempo de creaci?n.
365 2796 caballero
     * @param feat IFeature
366
     *
367
     * @return S?mbolo.
368
     */
369 8765 jjdelcerro
    public ISymbol getSymbolByFeature(IFeature feat) {
370 3347 fjp
        Value val = feat.getAttribute(fieldId);
371
        // Value val = feat.getAttribute(0);
372 8765 jjdelcerro
        ISymbol theSymbol = getSymbolByValue(val);
373 2183 fernando
374 2415 caballero
        //if (theSymbol != null) {
375 2796 caballero
        return theSymbol;
376
377 2415 caballero
        //} else {
378
        //    return getDefaultSymbol();
379
        //}
380 2183 fernando
    }
381 322 fernando
382 2796 caballero
    /**
383
     * @see com.iver.cit.gvsig.fmap.rendering.Legend#getDefaultSymbol()
384
     */
385 8765 jjdelcerro
    public ISymbol getDefaultSymbol() {
386 9886 caballero
            NullUniqueValue nuv=new NullUniqueValue();
387
            if (symbols.containsKey(nuv))
388
                    return (ISymbol)symbols.get(nuv);
389 2796 caballero
        return defaultSymbol;
390
    }
391 1034 vcaballero
392 3771 ldiaz
        /**
393 4575 ldiaz
         * @deprecated
394 4111 ldiaz
         * Writes and SLD using GEOTOOLS objetcs.
395 3771 ldiaz
         * @see com.iver.cit.gvsig.fmap.rendering.Legend#getSLDString()
396
         */
397 4111 ldiaz
        public String getSLDString_()
398 6368 caballero
        {
399 3771 ldiaz
            try{
400 4111 ldiaz
                        StyledLayerDescriptor sld = new StyledLayerDescriptor();
401 6368 caballero
                        StyleFactory styleFactory = StyleFactory.createStyleFactory();
402 4111 ldiaz
                        StyleBuilder sb = new StyleBuilder();
403
                Style style = sb.createStyle();
404
                style.setName("default");
405
                Filter filter = null;
406 6368 caballero
                Rule rule = null;
407
408 3771 ldiaz
                        FeatureTypeStyle featStyle = styleFactory.createFeatureTypeStyle();
409
                        featStyle.setFeatureTypeName(fieldName);
410 6368 caballero
411 8765 jjdelcerro
                        ISymbol[] symbols = this.getSymbols();
412 3771 ldiaz
                        Symbolizer[] theSymbolizers = new Symbolizer[symbols.length];
413 6368 caballero
                        Object[] values = this.getValues();
414 4111 ldiaz
                        String valueStr = null;
415
                        String condition = null;
416 6368 caballero
417 3771 ldiaz
                        for(int i = 0; i < symbols.length; i++ )
418
                        {
419 4111 ldiaz
                                valueStr = values[i].toString();
420
                                //if(this.valueType == "")
421
                                        condition = fieldName +"='"+valueStr+"'";
422
                                //else
423
                                //        condition = fieldName +"="+values[i];
424
                                filter = (Filter)ExpressionBuilder.parse(condition);
425
                                theSymbolizers[0] = SLDUtils.toGeotoolsSymbol(symbols[i]);
426
                                rule = styleFactory.createRule();
427
                                rule.setName(valueStr);
428
                                rule.setTitle(valueStr);
429
                                rule.setFilter(filter);
430
                                rule.setSymbolizers((Symbolizer[])theSymbolizers.clone());
431
                                featStyle.addRule(rule);
432 3771 ldiaz
                        }
433 4111 ldiaz
                        style.addFeatureTypeStyle(featStyle);
434
                        SLDTransformer st = new SLDTransformer();
435
                        NamedLayer namedLayer = new NamedLayer();
436
                        namedLayer.setName("comunidades");
437
                        namedLayer.addStyle(style);
438
                        sld.addStyledLayer(namedLayer);
439 6368 caballero
                        return st.transform(style);
440
441 4111 ldiaz
            }catch(Exception e)
442
            {
443 6368 caballero
                    e.printStackTrace();
444 4111 ldiaz
                    return null;
445
            }
446
        }
447 8765 jjdelcerro
        /**
448
         * creates the SLD String that defines this legend type.
449
         */
450 4567 ldiaz
        public String getSLDString(String name)
451 6368 caballero
        {
452 4111 ldiaz
            try{
453 6368 caballero
454 4111 ldiaz
                        XmlBuilder xmlBuilder = new XmlBuilder();
455
                        xmlBuilder.writeHeader();
456
                        xmlBuilder.openTag(SLDTags.SLD_ROOT, SLDTags.VERSION_ATTR, SLDTags.VERSION_1_0_0);
457
                        xmlBuilder.openTag(SLDTags.NAMEDLAYER);
458 4567 ldiaz
                        xmlBuilder.writeTag(SLDTags.NAME,name);
459 4111 ldiaz
                        xmlBuilder.openTag(SLDTags.USERSTYLE);
460
                        xmlBuilder.openTag(SLDTags.FEATURETYPESTYLE);
461 4697 ldiaz
                        //xmlBuilder.writeTag(SLDTags.FEATURETYPENAME,"fieldName");
462 6368 caballero
463 8765 jjdelcerro
                        ISymbol[] symbols = this.getSymbols();
464 6368 caballero
                        Object[] values = this.getValues();
465 4111 ldiaz
                        String valueStr = null;
466 6368 caballero
467 4111 ldiaz
                        for(int i = 0; i < symbols.length; i++ )
468
                        {
469
                                valueStr = values[i].toString();
470
                                xmlBuilder.openTag(SLDTags.RULE);
471 8765 jjdelcerro
                                xmlBuilder.writeTag(SLDTags.NAME, valueStr);
472 4111 ldiaz
                                xmlBuilder.openTag(SLDTags.FILTER);
473
                                xmlBuilder.openTag(SLDTags.PROPERTYISEQUALTO);
474
                                xmlBuilder.writeTag(SLDTags.PROPERTYNAME,fieldName);
475
                                xmlBuilder.writeTag(SLDTags.LITERAL, valueStr);
476
                                xmlBuilder.closeTag();
477 6368 caballero
                                xmlBuilder.closeTag();
478 8765 jjdelcerro
                                if (symbols[i] instanceof ISLDCompatible)
479
                                {
480
                                        ISLDCompatible symSLD = (ISLDCompatible) symbols[i];
481
                                        xmlBuilder.writeRaw(symSLD.toSLD());
482
                                }
483
                                else
484
                                        throw new RuntimeException("Cannot convert Symbol " + i + " " + symbols[i].getDescription() + " to SLD");
485 6368 caballero
486 4111 ldiaz
                                xmlBuilder.closeTag();
487
                        }
488 6368 caballero
489 4111 ldiaz
                        xmlBuilder.closeTag();
490
                        xmlBuilder.closeTag();
491
                        xmlBuilder.closeTag();
492 6368 caballero
                        xmlBuilder.closeTag();
493
                        return xmlBuilder.getXML();
494
495 3771 ldiaz
            }catch(Exception e)
496
            {
497 6368 caballero
                    e.printStackTrace();
498 3771 ldiaz
                    return null;
499
            }
500
        }
501 3632 ldiaz
    /**
502 2796 caballero
     * @see com.iver.cit.gvsig.fmap.rendering.Legend#getXMLEntity()
503
     */
504
    public XMLEntity getXMLEntity() {
505
        XMLEntity xml = new XMLEntity();
506
        xml.putProperty("className", this.getClass().getName());
507
        xml.putProperty("fieldName", fieldName);
508
        xml.putProperty("labelfield", labelFieldName);
509
        xml.putProperty("labelFieldHeight", labelFieldHeight);
510
        xml.putProperty("labelFieldRotation", labelFieldRotation);
511 1034 vcaballero
512 2796 caballero
        xml.putProperty("useDefaultSymbol", useDefaultSymbol);
513 10465 caballero
        xml.putProperty("sorter",sorter);
514 2796 caballero
        xml.addChild(getDefaultSymbol().getXMLEntity());
515 3035 fjp
        // xml.putProperty("isBWithHeightText", isBWithHeightText());
516 2796 caballero
        xml.putProperty("numKeys", keys.size());
517 435 vcaballero
518 2796 caballero
        if (keys.size() > 0) {
519
            xml.putProperty("tipoValueKeys", valueType);
520 1034 vcaballero
521 2796 caballero
            String[] sk = new String[keys.size()];
522
            String[] sv = new String[keys.size()];
523 6631 caballero
            int[] stk = new int[keys.size()];
524
            int[] stv = new int[keys.size()];
525 8765 jjdelcerro
            ISymbol[] fsymbols = getSymbols();
526 6631 caballero
            Object[] values = getValues();
527 1034 vcaballero
528 2796 caballero
            for (int i = 0; i < keys.size(); i++) {
529 6368 caballero
                    if (((Value) keys.get(i)).toString().equals("")) {
530
                            sk[i] =" ";
531
                    }else {
532
                            sk[i] = ((Value) keys.get(i)).toString();
533
                    }
534
                    if (((Value) values[i]).toString().equals("")) {
535
                            sv[i] =" ";
536
                    }else {
537
                            sv[i] = ((Value) values[i]).toString();
538
                    }
539 6631 caballero
                    stk[i]= ((Value)keys.get(i)).getSQLType();
540
                    stv[i]= ((Value)values[i]).getSQLType();
541 2796 caballero
                xml.addChild(fsymbols[i].getXMLEntity());
542 1034 vcaballero
543 2796 caballero
                ///System.out.println("get-----------"+sk[i]+"--"+fsymbols[i].getDescription()+"---"+fsymbols[i].getColor());
544
            }
545 1034 vcaballero
546 2796 caballero
            xml.putProperty("keys", sk);
547
            xml.putProperty("values", sv);
548 6631 caballero
            xml.putProperty("typeKeys",stk);
549
            xml.putProperty("typeValues",stv);
550 2796 caballero
        }
551 1034 vcaballero
552 2796 caballero
        return xml;
553
    }
554 2183 fernando
555 2796 caballero
    /**
556
     * Inserta el XMLEntity.
557
     *
558
     * @param xml XMLEntity.
559
     */
560
    public void setXMLEntity03(XMLEntity xml) {
561
        clear();
562
        setFieldName(xml.getStringProperty("fieldName"));
563
        setLabelField(xml.getStringProperty("labelfield"));
564 2183 fernando
565 2796 caballero
        int useDefaultSymbol = xml.getIntProperty("useDefaultSymbol");
566 2183 fernando
567 2796 caballero
        if (useDefaultSymbol == 1) {
568
            setDefaultSymbol(FSymbol.createFromXML03(xml.getChild(0)));
569
        } else {
570
            setDefaultSymbol(null);
571
        }
572 2183 fernando
573 2796 caballero
        int numKeys = xml.getIntProperty("numKeys");
574 2183 fernando
575 2796 caballero
        if (numKeys > 0) {
576
            String className = xml.getStringProperty("tipoValueKeys");
577
            String[] sk = xml.getStringArrayProperty("keys");
578
            String[] sv = xml.getStringArrayProperty("values");
579
            Value auxValue;
580
            Value auxValue2;
581 2183 fernando
582 2796 caballero
            for (int i = 0; i < numKeys; i++) {
583
                try {
584
                    auxValue = ValueFactory.createValue(sk[i], className);
585
                    auxValue2 = ValueFactory.createValue(sv[i], className);
586 2183 fernando
587 8765 jjdelcerro
                    ISymbol sym = FSymbol.createFromXML03(xml.getChild(i +
588 2796 caballero
                                useDefaultSymbol));
589 2183 fernando
590 2796 caballero
                    ///addSymbol(auxValue, sym);
591
                    symbols.put(auxValue2, sym);
592
                    keys.add(auxValue);
593 2183 fernando
594 2796 caballero
                    ///System.out.println("---set------"+auxValue.toString());
595
                    /// System.out.println("set-----------"+sk[i]+"--"+sym.getDescription()+"---"+sym.getColor());
596
                } catch (SemanticException e) {
597
                    // TODO Auto-generated catch block
598
                    e.printStackTrace();
599
                }
600
            }
601
        }
602
    }
603 2183 fernando
604 2796 caballero
    /**
605
     * Inserta el XMLEntity.
606
     *
607
     * @param xml XMLEntity.
608
     */
609
    public void setXMLEntity(XMLEntity xml) {
610
        clear();
611
        setFieldName(xml.getStringProperty("fieldName"));
612
        setLabelField(xml.getStringProperty("labelfield"));
613
614
        if (xml.contains("labelFieldHeight")) {
615 2673 fjp
            setLabelHeightField(xml.getStringProperty("labelFieldHeight"));
616 2796 caballero
        }
617
618
        if (xml.contains("labelFieldRotation")) {
619 2673 fjp
            setLabelRotationField(xml.getStringProperty("labelFieldRotation"));
620 2796 caballero
        }
621
622
        useDefaultSymbol = xml.getBooleanProperty("useDefaultSymbol");
623 10465 caballero
        if (xml.contains("sorter"))
624
                sorter = xml.getBooleanProperty("sorter");
625 2796 caballero
        setDefaultSymbol(FSymbol.createFromXML(xml.getChild(0)));
626
627 3035 fjp
        // FJP: Esto no es necesario ya. Para comprobar si tenemos un campo de altura, miramos
628
        // si getLabelHeightField devuelve null o no.
629
        /* if (xml.contains("isBWithHeightText")) {
630 2673 fjp
            setBWithHeightText(xml.getBooleanProperty("isBWithHeightText"));
631 3035 fjp
        } */
632 1034 vcaballero
633 2796 caballero
        //addSymbol(new NullUniqueValue(),getDefaultSymbol());
634
        int numKeys = xml.getIntProperty("numKeys");
635 1034 vcaballero
636 2796 caballero
        if (numKeys > 0) {
637
            String className = xml.getStringProperty("tipoValueKeys");
638
            String[] sk = xml.getStringArrayProperty("keys");
639
            String[] sv = xml.getStringArrayProperty("values");
640
            Value auxValue = null;
641
            Value auxValue2 = null;
642 6631 caballero
            int[] stk=null;
643
            if (xml.contains("typeKeys")) {
644
                                stk = xml.getIntArrayProperty("typeKeys");
645
                                int[] stv = xml.getIntArrayProperty("typeValues");
646
                                for (int i = 0; i < numKeys; i++) {
647
                                        boolean isDefault = false;
648
                                        if (getValue(sk[i], stk[i]) == null) {
649
                                                isDefault = true;
650
                                        }
651 1034 vcaballero
652 6631 caballero
                                        if (className
653
                                                        .equals("com.hardcode.gdbms.engine.values.NullUniqueValue")
654
                                                        || isDefault) {
655
                                                auxValue = new NullUniqueValue();
656
                                                auxValue2 = ValueFactory.createNullValue();
657
                                        } else {
658
                                                auxValue = getValue(sk[i], stk[i]); // ValueFactory.createValue(sk[i],
659
                                                                                                                        // className);
660
                                                auxValue2 = getValue(sv[i], stv[i]); // ValueFactory.createValue(sv[i],
661
                                                                                                                                // className);
662
                                        }
663 8765 jjdelcerro
                                        ISymbol sym = FSymbol.createFromXML(xml.getChild(i + 1));
664 6631 caballero
                                        symbols.put(auxValue2, sym);
665
                                        keys.add(auxValue);
666
                                }
667
                        } else {
668
                                for (int i = 0; i < numKeys; i++) {
669
                                        boolean isDefault = false;
670
                                        if (getValue(sk[i]) == null) {
671
                                                isDefault = true;
672
                                        }
673
                                        if (className
674
                                                        .equals("com.hardcode.gdbms.engine.values.NullUniqueValue")
675
                                                        || isDefault) {
676
                                                auxValue = new NullUniqueValue();
677
                                                auxValue2 = ValueFactory.createNullValue();
678
                                        } else {
679
                                                auxValue = getValue(sk[i]); // ValueFactory.createValue(sk[i],
680
                                                                                                        // className);
681
                                                auxValue2 = getValue(sv[i]); // ValueFactory.createValue(sv[i],
682
                                                                                                                // className);
683
                                        }
684 8765 jjdelcerro
                                        ISymbol sym = FSymbol.createFromXML(xml.getChild(i + 1));
685 6631 caballero
                                        symbols.put(auxValue2, sym);
686
                                        keys.add(auxValue);
687
                                }
688
                        }
689 2796 caballero
        }
690
    }
691 2415 caballero
692 2796 caballero
    /**
693 6631 caballero
         * Devuelve el valor a partir de su valor en un string.
694
         *
695
         * @param s
696
         *            String con el valor.
697
         * @deprecated M?todo utilizado hasta la 1.0 alpha 855 Debes utilizar a partir de ahora getValue(String s,int type);
698
         * @return Value.
699
         */
700 2796 caballero
    private Value getValue(String s) {
701
        Value val = new NullUniqueValue();
702
        if (s.equals("Resto de Valores"))return val;
703
        try {
704
            try {
705
                val = ValueFactory.createValueByType(s, Types.INTEGER);
706 2415 caballero
707 2796 caballero
                return val;
708
            } catch (NumberFormatException e) {
709
            }
710 2415 caballero
711 2796 caballero
            try {
712
                val = ValueFactory.createValueByType(s, Types.BIGINT);
713 2415 caballero
714 2796 caballero
                return val;
715
            } catch (NumberFormatException e) {
716
            }
717 2415 caballero
718 2796 caballero
            try {
719
                val = ValueFactory.createValueByType(s, Types.FLOAT);
720 1034 vcaballero
721 2796 caballero
                return val;
722
            } catch (NumberFormatException e) {
723
            }
724 470 fjp
725 2796 caballero
            try {
726
                val = ValueFactory.createValueByType(s, Types.DOUBLE);
727 1034 vcaballero
728 2796 caballero
                return val;
729
            } catch (NumberFormatException e) {
730
            }
731 6368 caballero
732 2796 caballero
            val = ValueFactory.createValueByType(s, Types.LONGVARCHAR);
733 6368 caballero
734 2796 caballero
        } catch (ParseException e) {
735
            e.printStackTrace();
736
        }
737 1034 vcaballero
738 2796 caballero
        return val;
739
    }
740 6631 caballero
    /**
741
     * Devuelve el valor a partir de su valor en un string.
742
     *
743
     * @param s String con el valor.
744
     *
745
     * @return Value.
746
     */
747
    private Value getValue(String s,int type) {
748
        Value val = new NullUniqueValue();
749
        if (type==Types.OTHER)
750
                return val;
751
        try {
752
                val = ValueFactory.createValueByType(s, type);
753
        } catch (ParseException e) {
754
            e.printStackTrace();
755
        }
756
        return val;
757
    }
758 1034 vcaballero
759 2796 caballero
    /**
760
     * @see com.iver.cit.gvsig.fmap.rendering.Legend#cloneLegend()
761
     */
762
    public Legend cloneLegend() throws XMLException {
763 6631 caballero
        return LegendFactory.createFromXML(getXMLEntity());
764 2796 caballero
    }
765 1034 vcaballero
766 2796 caballero
    /* (non-Javadoc)
767
     * @see com.iver.cit.gvsig.fmap.rendering.VectorialLegend#setDataSource(com.hardcode.gdbms.engine.data.DataSource)
768
     */
769
    public void setDataSource(DataSource ds)
770
        throws FieldNotFoundException, DriverException {
771
        try {
772
            dataSource = ds;
773
            ds.start();
774
            fieldId = ds.getFieldIndexByName(fieldName);
775
            ds.stop();
776
        } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
777
            throw new DriverException(e);
778
        }
779
    }
780 801 fjp
781 2796 caballero
    /* (non-Javadoc)
782
     * @see com.iver.cit.gvsig.fmap.rendering.UniqueValueLegend#getSymbolByValue(com.hardcode.gdbms.engine.values.Value)
783
     */
784 8765 jjdelcerro
    public ISymbol getSymbolByValue(Value key) {
785 10499 caballero
            boolean auxSorted=sorter;
786
            sorter=true;
787
        ISymbol symbol=(ISymbol) symbols.get(key);
788
        sorter=auxSorted;
789
        if (symbol!=null) {
790
                return symbol;
791 2796 caballero
        } else if (useDefaultSymbol) {
792
            return getDefaultSymbol();
793
        }
794 10499 caballero
        return null;
795 2415 caballero
796 2796 caballero
    }
797 2600 caballero
798 2796 caballero
    /* (non-Javadoc)
799
     * @see com.iver.cit.gvsig.fmap.rendering.VectorialLegend#getShapeType()
800
     */
801
    public int getShapeType() {
802
        return shapeType;
803
    }
804 2600 caballero
805 2796 caballero
    /* (non-Javadoc)
806
     * @see com.iver.cit.gvsig.fmap.rendering.VectorialLegend#getLabelHeightField()
807
     */
808
    public String getLabelHeightField() {
809
        return labelFieldHeight;
810
    }
811
812
    /**
813
     * Inserta el alto de campo.
814
     *
815
     * @param str alto.
816
     */
817
    public void setLabelHeightField(String str) {
818
        labelFieldHeight = str;
819
    }
820
821
    /* (non-Javadoc)
822
     * @see com.iver.cit.gvsig.fmap.rendering.VectorialLegend#getLabelRotationField()
823
     */
824
    public String getLabelRotationField() {
825
        return labelFieldRotation;
826
    }
827
828
    /**
829
     * Inserta rotaci?n.
830
     *
831
     * @param str Rotaci?n.
832
     */
833
    public void setLabelRotationField(String str) {
834
        labelFieldRotation = str;
835
    }
836
837
    /**
838
     * Introduce si se tiene que representar el resto de valores o no.
839
     *
840
     * @param b True si se utiliza el resto de valores.
841
     */
842
    public void useDefaultSymbol(boolean b) {
843
        useDefaultSymbol = b;
844
    }
845
    /**
846
     * Devuelve si se utiliza o no el resto de valores para representarse.
847
     *
848
     * @return True si se utiliza el resto de valores.
849
     */
850
    public boolean isUseDefaultSymbol() {
851
        return useDefaultSymbol;
852
    }
853
    /**
854
     * Devuelve true si el etiquetado de la capa se ha modificado.
855
     *
856
     * @return True si se ha modificado el etiquetado de la capa.
857
     */
858 3035 fjp
    /* public boolean isBWithHeightText() {
859 2796 caballero
        return bWithHeightText;
860 3035 fjp
    } */
861 2796 caballero
862
    /**
863
     * Introduce si se ha modificado el etiquetado de la capa.
864
     *
865
     * @param withHeightText True si se ha modificado el etiquetado de la capa.
866
     */
867 3035 fjp
    /* public void setBWithHeightText(boolean withHeightText) {
868 2796 caballero
        bWithHeightText = withHeightText;
869 3035 fjp
    } */
870 2796 caballero
871
    /**
872
     * Elimina el s?mbolo que tiene como clave el valor que se pasa como par?metro.
873
     *
874
     * @param key clave.
875
     */
876
    public void delSymbol(Object key) {
877
        keys.remove(key);
878
        symbols.remove(key);
879
    }
880 3268 fjp
881
    /* (non-Javadoc)
882
     * @see com.iver.cit.gvsig.fmap.rendering.VectorialLegend#getUsedFields()
883
     */
884
    public String[] getUsedFields() {
885
        ArrayList usedFields = new ArrayList();
886
        if (getFieldName() != null)
887 6368 caballero
            usedFields.add(getFieldName());
888 3268 fjp
        if (getLabelField() != null)
889
            usedFields.add(getLabelField());
890
        if (getLabelHeightField() != null)
891
            usedFields.add(getLabelHeightField());
892
        if (getLabelRotationField() != null)
893
            usedFields.add(getLabelRotationField());
894 6368 caballero
895 3268 fjp
        return (String[]) usedFields.toArray(new String[0]);
896
897
    }
898 10465 caballero
899
        public void setSorter(boolean b) {
900
                sorter=b;
901
        }
902
903
        public boolean isSorter() {
904
                return sorter;
905
        }
906 322 fernando
}