Statistics
| Revision:

svn-gvsig-desktop / trunk / applications / appgvSIG / src / com / iver / cit / gvsig / gui / thememanager / legendmanager / panels / FPanelLegendBreaks.java @ 2363

History | View | Annotate | Download (24.8 KB)

1
/*
2
 * Created on 30-abr-2004
3
 *
4
 * To change the template for this generated file go to
5
 * Window>Preferences>Java>Code Generation>Code and Comments
6
 */
7
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
8
 *
9
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
10
 *
11
 * This program is free software; you can redistribute it and/or
12
 * modify it under the terms of the GNU General Public License
13
 * as published by the Free Software Foundation; either version 2
14
 * of the License, or (at your option) any later version.
15
 *
16
 * This program is distributed in the hope that it will be useful,
17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
 * GNU General Public License for more details.
20
 *
21
 * You should have received a copy of the GNU General Public License
22
 * along with this program; if not, write to the Free Software
23
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
24
 *
25
 * For more information, contact:
26
 *
27
 *  Generalitat Valenciana
28
 *   Conselleria d'Infraestructures i Transport
29
 *   Av. Blasco Ib??ez, 50
30
 *   46010 VALENCIA
31
 *   SPAIN
32
 *
33
 *      +34 963862235
34
 *   gvsig@gva.es
35
 *      www.gvsig.gva.es
36
 *
37
 *    or
38
 *
39
 *   IVER T.I. S.A
40
 *   Salamanca 50
41
 *   46005 Valencia
42
 *   Spain
43
 *
44
 *   +34 963163400
45
 *   dac@iver.es
46
 */
47
package com.iver.cit.gvsig.gui.thememanager.legendmanager.panels;
48

    
49
import java.awt.BorderLayout;
50
import java.awt.Color;
51
import java.awt.GridBagConstraints;
52
import java.awt.GridBagLayout;
53
import java.awt.Insets;
54
import java.awt.event.ActionEvent;
55
import java.awt.event.ActionListener;
56
import java.text.NumberFormat;
57
import java.util.ArrayList;
58
import java.util.Date;
59

    
60
import javax.swing.DefaultComboBoxModel;
61
import javax.swing.JButton;
62
import javax.swing.JComboBox;
63
import javax.swing.JLabel;
64
import javax.swing.JOptionPane;
65
import javax.swing.JPanel;
66
import javax.swing.JTextField;
67

    
68
import org.apache.log4j.Logger;
69

    
70
import com.hardcode.gdbms.engine.data.DataSource;
71
import com.hardcode.gdbms.engine.values.DateValue;
72
import com.hardcode.gdbms.engine.values.DoubleValue;
73
import com.hardcode.gdbms.engine.values.FloatValue;
74
import com.hardcode.gdbms.engine.values.IntValue;
75
import com.hardcode.gdbms.engine.values.LongValue;
76
import com.hardcode.gdbms.engine.values.NullValue;
77
import com.hardcode.gdbms.engine.values.Value;
78
import com.iver.andami.PluginServices;
79
import com.iver.cit.gvsig.fmap.DriverException;
80
import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
81
import com.iver.cit.gvsig.fmap.layers.FLayer;
82
import com.iver.cit.gvsig.fmap.layers.layerOperations.AlphanumericData;
83
import com.iver.cit.gvsig.fmap.layers.layerOperations.ClassifiableVectorial;
84
import com.iver.cit.gvsig.fmap.rendering.FInterval;
85
import com.iver.cit.gvsig.fmap.rendering.Legend;
86
import com.iver.cit.gvsig.fmap.rendering.LegendFactory;
87
import com.iver.cit.gvsig.fmap.rendering.VectorialIntervalLegend;
88
import com.iver.cit.gvsig.gui.Panels.ColorChooserPanel;
89

    
90

    
91
/**
92
 * DOCUMENT ME!
93
 *
94
 * @author fjp To change the template for this generated type comment go to
95
 *                    Window>Preferences>Java>Code Generation>Code and
96
 *                    Comments
97
 */
98
public class FPanelLegendBreaks extends JPanel implements ILegendPanel {
99
        private static Logger logger = Logger.getLogger(FPanelLegendBreaks.class.getName());
100
        private MyListener listener = new MyListener();
101

    
102
        // private TOC m_TOC;
103
        private VectorialIntervalLegend m_Renderer;
104
        private ClassifiableVectorial m_lyr;
105
        private FSymbolTable m_symbolTable = new FSymbolTable("intervals");
106
        private JComboBox m_cboFields;
107
        private JComboBox m_cboIntervalType;
108
        private JTextField m_txtNumIntervals;
109
        private ColorChooserPanel m_colorChooser1;
110
        private ColorChooserPanel m_colorChooser2;
111
        private JButton m_btnDeleteAll;
112
        private JButton m_btnDelete;
113
        private FInterval[] intervals;
114
        ///private int tipoClasificacion = VectorialIntervalLegend.NATURAL_INTERVALS;
115
        private int count = 0;
116

    
117
        /**
118
         *
119
         */
120
        public FPanelLegendBreaks() {
121
                super();
122
                initComponents();
123
        }
124
        
125
        /**
126
         * EQUAL INTERVAL Devuelve un Array con el n?mero de intervalos que se
127
         * quieren crear. Los intervalos se crean con un tama?o igual entre ellos.
128
         *
129
         * @param numIntervals n?mero de intervalos
130
         * @param minValue Valor m?nimo.
131
         * @param maxValue Valor m?ximo.
132
         *
133
         * @return Array con los intervalos.
134
         */
135
        FInterval[] calculateEqualIntervals(int numIntervals,
136
                double minValue, double maxValue,String fieldName) {
137
                FInterval[] theIntervalArray = new FInterval[numIntervals];
138
                double step = (maxValue - minValue) / numIntervals;
139

    
140
                if (numIntervals>1){
141
                        theIntervalArray[0] = new FInterval(minValue,minValue+step);
142
                for (int i = 1; i < numIntervals-1; i++) {
143
                        theIntervalArray[i] = new FInterval(minValue + (i * step)+0.01,
144
                                        minValue + ((i + 1) * step));
145
                }
146
                        theIntervalArray[numIntervals-1] = new FInterval(minValue + ((numIntervals-1) * step)+0.01,maxValue);
147
                }else{
148
                        theIntervalArray[0] = new FInterval(minValue, maxValue);
149
                }
150
                return theIntervalArray;
151
                        
152
        }
153

    
154
        /**
155
         * NATURAL INTERVAL Devuelve un Array con el n?mero de intervalos que se
156
         * quieren crear. Los intervalos se distribuyen de forma natural.
157
         *
158
         * @param numIntervals n?mero de intervalos
159
         * @param minValue Valor m?nimo.
160
         * @param maxValue Valor m?ximo.
161
         *
162
         * @return Array con los intervalos.
163
         */
164
        FInterval[] calculateNaturalIntervals(int numIntervals, double minValue,
165
                double maxValue,String fieldName) {
166
                
167
                NaturalIntervalGenerator intervalGenerator = new NaturalIntervalGenerator(((AlphanumericData) m_lyr),fieldName,numIntervals);
168

    
169
                try {
170
                        intervalGenerator.generarIntervalos();
171
                } catch (DriverException e) {
172
                        e.printStackTrace();
173
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
174
                        e.printStackTrace();
175
                }
176
                int numIntervalsGen=intervalGenerator.getNumIntervals()-1;
177
                if (numIntervalsGen==-1){
178
                        //TODO cuando no puede calcular los intervalos.
179
                        numIntervalsGen=1;
180
                }
181
                FInterval[] theIntervalArray = new FInterval[numIntervalsGen];
182
                if (numIntervalsGen>1){
183
                
184
                theIntervalArray[0] = new FInterval(minValue, intervalGenerator.getValorRuptura(0));
185
                for (int i = 1; i < numIntervalsGen-1; i++) {
186
                        theIntervalArray[i] = new FInterval(intervalGenerator.getValInit(
187
                                                i-1), intervalGenerator.getValorRuptura(i));
188
                }
189
                
190
                theIntervalArray[numIntervalsGen-1] = new FInterval(intervalGenerator.getValInit(
191
                                numIntervalsGen-2), maxValue);
192
                }else{
193
                        theIntervalArray[numIntervalsGen-1] = new FInterval(minValue, maxValue);
194
                }
195
                return theIntervalArray;
196
        }
197

    
198
        /**
199
         * QUANTILE INTERVAL Devuelve un Array con el n?mero de intervalos que se
200
         * quieren crear. Los intervalos se distribuyen de forma quantile.
201
         *
202
         * @param numIntervals n?mero de intervalos
203
         * @param minValue Valor m?nimo.
204
         * @param maxValue Valor m?ximo.
205
         *
206
         * @return Array con los intervalos.
207
         */
208
        FInterval[] calculateQuantileIntervals(int numIntervals, double minValue,
209
                double maxValue,String fieldName) {
210
                QuantileIntervalGenerator intervalGenerator = new QuantileIntervalGenerator(((AlphanumericData) m_lyr),fieldName,numIntervals);
211

    
212
                try {
213
                        intervalGenerator.generarIntervalos();
214
                } catch (DriverException e) {
215
                        e.printStackTrace();
216
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
217
                        e.printStackTrace();
218
                }
219
                int numIntervalsGen=intervalGenerator.getNumIntervalGen();
220
                FInterval[] theIntervalArray = new FInterval[numIntervalsGen];
221
                if (intervalGenerator.getNumIntervalGen()>1){
222
                theIntervalArray[0] = new FInterval(minValue, intervalGenerator.getValRuptura(0));
223
                for (int i = 1; i < numIntervalsGen-1; i++) {
224
                        theIntervalArray[i] = new FInterval(intervalGenerator.getValInit(
225
                                                i-1), intervalGenerator.getValRuptura(i));
226
                }
227
                
228
                theIntervalArray[numIntervalsGen-1] = new FInterval(intervalGenerator.getValInit(
229
                                numIntervalsGen-2), maxValue);
230
                }else{
231
                        theIntervalArray[numIntervalsGen-1] = new FInterval(minValue, maxValue);
232
                }
233
                return theIntervalArray;
234
                
235
                
236
        /*        double numQ = count / numIntervals;
237

238
                for (int i = 0; i < count; i++) {
239
                }
240

241
                return theIntervalArray;
242
*/
243
        }
244

    
245
        /**
246
         * DOCUMENT ME!
247
         */
248
        protected void initComponents() {
249
                /* JLabel label = new JLabel();
250
                   label.setIcon(new javax.swing.ImageIcon(Abrir.class.getClassLoader()
251
                                                                                                                      .getResource("images/ValoresUnicos.png")));
252
                   limagen[1] = new JLabel();
253
                   limagen[1] = label; */
254
                JPanel botonestabla = new JPanel();
255

    
256
                JButton btnAddAll = new JButton(PluginServices.getText(this,
257
                                        "Calcular_intervalos"));
258
                btnAddAll.setActionCommand("ADD_ALL_VALUES");
259
                botonestabla.add(btnAddAll);
260

    
261
                JButton btnAdd = new JButton(PluginServices.getText(this, "Anadir"));
262
                btnAdd.setActionCommand("ADD_VALUE");
263
                btnAdd.addActionListener(listener);
264
                botonestabla.add(btnAdd);
265

    
266
                m_btnDeleteAll = new JButton(PluginServices.getText(this, "Quitar_todos"));
267
                m_btnDeleteAll.setActionCommand("REMOVE_ALL");
268
                m_btnDeleteAll.addActionListener(listener);
269
                botonestabla.add(m_btnDeleteAll);
270

    
271
                m_btnDelete = new JButton(PluginServices.getText(this, "Quitar"));
272
                m_btnDelete.setActionCommand("REMOVE");
273
                m_btnDelete.addActionListener(listener);
274
                botonestabla.add(m_btnDelete);
275

    
276
                m_btnDeleteAll.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
277
                                public void propertyChange(java.beans.PropertyChangeEvent e) {
278
                                        if ((e.getPropertyName().equals("enabled"))) {
279
                                                System.out.println("propertyChange(enabled)"); // TODO Auto-generated property Event stub "enabled" 
280
                                        }
281
                                }
282
                        });
283
                m_btnDelete.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
284
                                public void propertyChange(java.beans.PropertyChangeEvent e) {
285
                                        if ((e.getPropertyName().equals("enabled"))) {
286
                                                System.out.println("propertyChange(enabled)"); // TODO Auto-generated property Event stub "enabled" 
287
                                        }
288
                                }
289
                        });
290
                btnAddAll.addActionListener(listener);
291

    
292
                JPanel ptabla = new JPanel();
293
                ptabla.setLayout(new BorderLayout());
294

    
295
                m_cboFields = new JComboBox();
296
                m_cboFields.setActionCommand("FIELD_SELECTED");
297
                m_cboFields.addActionListener(listener);
298
                m_cboFields.setVisible(true);
299

    
300
                JPanel pAux1 = new JPanel();
301

    
302
                /* pAux1.setBorder(javax.swing.BorderFactory.createTitledBorder(null,
303
                   "Campo de clasificaci?n",
304
                   javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
305
                   javax.swing.border.TitledBorder.DEFAULT_POSITION, null, null)); */
306

    
307
                // pAux1.setPreferredSize(new Dimension(300,50));
308
                GridBagLayout gridBag = new GridBagLayout();
309
                pAux1.setLayout(gridBag);
310

    
311
                GridBagConstraints c = new GridBagConstraints();
312

    
313
                c.anchor = GridBagConstraints.WEST;
314

    
315
                JLabel lblFieldClassification = new JLabel(PluginServices.getText(
316
                                        this, "Campo_de_clasificacion"));
317
                c.gridx = 0;
318
                c.gridy = 0;
319
                c.insets = new Insets(5, 5, 2, 2);
320
                c.gridwidth = 1;
321
                gridBag.setConstraints(lblFieldClassification, c);
322
                pAux1.add(lblFieldClassification);
323

    
324
                c.gridx = 1;
325
                c.gridy = 0;
326
                gridBag.setConstraints(m_cboFields, c);
327
                pAux1.add(m_cboFields);
328

    
329
                JLabel lblNumIntervals = new JLabel(PluginServices.getText(this,
330
                                        "No_de_intervalos") + ":");
331
                c.gridx = 3;
332
                c.gridy = 0;
333
                gridBag.setConstraints(lblNumIntervals, c);
334
                pAux1.add(lblNumIntervals);
335

    
336
                m_txtNumIntervals = new JTextField(4);
337
                c.gridx = 4;
338
                c.gridy = 0;
339
                gridBag.setConstraints(m_txtNumIntervals, c);
340
                m_txtNumIntervals.setText("5");
341
                pAux1.add(m_txtNumIntervals);
342

    
343
                JLabel lblIntervalType = new JLabel(PluginServices.getText(this,
344
                                        "tipo_de_intervalo"));
345
                c.gridx = 0;
346
                c.gridy = 1;
347
                c.insets = new Insets(5, 5, 2, 2);
348
                c.gridwidth = 1;
349
                gridBag.setConstraints(lblIntervalType, c);
350
                pAux1.add(lblIntervalType);
351

    
352
                m_cboIntervalType = new JComboBox();
353
                m_cboIntervalType.setActionCommand("INTERVAL_TYPE");
354
                m_cboIntervalType.addActionListener(listener);
355
                m_cboIntervalType.addItem("EQUAL_INTERVALS");
356
                m_cboIntervalType.addItem("NATURAL_INTERVALS");
357
                m_cboIntervalType.addItem("QUANTILE_INTERVALS");
358
                m_cboIntervalType.setVisible(true);
359

    
360
                c.gridx = 1;
361
                c.gridy = 1;
362
                gridBag.setConstraints(m_cboIntervalType, c);
363
                pAux1.add(m_cboIntervalType);
364

    
365
                c.insets = new Insets(2, 2, 2, 2);
366

    
367
                JLabel lblColor1 = new JLabel(PluginServices.getText(this,
368
                                        "Color_inicio") + ":");
369
                c.gridx = 0;
370
                c.gridy = 2;
371
                gridBag.setConstraints(lblColor1, c);
372
                pAux1.add(lblColor1);
373

    
374
                m_colorChooser1 = new ColorChooserPanel();
375
                m_colorChooser1.setColor(Color.red);
376
                m_colorChooser1.setAlpha(255);
377
                c.gridx = 1;
378
                c.gridy = 2;
379
                gridBag.setConstraints(m_colorChooser1, c);
380
                pAux1.add(m_colorChooser1);
381

    
382
                JLabel lblColor2 = new JLabel(PluginServices.getText(this, "Color_final") +
383
                                ":");
384
                c.gridx = 3;
385
                c.gridy = 2;
386
                gridBag.setConstraints(lblColor2, c);
387
                pAux1.add(lblColor2);
388

    
389
                m_colorChooser2 = new ColorChooserPanel();
390
                m_colorChooser2.setColor(Color.blue);
391
                m_colorChooser2.setAlpha(255);
392
                c.gridx = 4;
393
                c.gridy = 2;
394
                gridBag.setConstraints(m_colorChooser2, c);
395
                pAux1.add(m_colorChooser2);
396

    
397
                ptabla.add(m_symbolTable, BorderLayout.CENTER);
398
                this.setLayout(new BorderLayout());
399
                this.add(pAux1, BorderLayout.NORTH);
400
                this.add(ptabla, BorderLayout.CENTER);
401
                this.add(botonestabla, BorderLayout.SOUTH);
402
        }
403

    
404
        /**
405
         * Damos una primera pasada para saber los l?mites inferior y superior y
406
         * rellenar un array con los valores. Luego dividimos ese array en
407
         * intervalos.
408
         */
409
        private void fillTableValues() {
410
                FInterval[] arrayIntervalos = null;
411
                DataSource elRs;
412
                m_symbolTable.removeAllItems();
413

    
414
                try {
415
                        elRs = ((AlphanumericData) m_lyr).getRecordset();
416
                        logger.debug("elRs.start()");
417
                        elRs.start();
418

    
419
                        int idField = -1;
420
                        int numIntervalos=1;
421
                        try{
422
                         numIntervalos= Integer.parseInt(m_txtNumIntervals.getText());
423
                        }catch (NumberFormatException e) {
424
                                System.out.println("Foramto de n?mero erroneo");
425
                        }
426
                        String fieldName = (String) m_cboFields.getSelectedItem();
427
                        System.out.println("Nombre del campo de clasificaci?n: " +
428
                                fieldName);
429
                        m_Renderer.setFieldName(fieldName);
430

    
431
                        String nomField = m_Renderer.getFieldName();
432

    
433
                        // Cogemos el tipo de gradaci?n de colores que quiere el usuario y 
434
                        // Creamos el primer y ?ltimo color.
435
                        Color startColor = m_colorChooser1.getColor();
436
                        m_Renderer.setStartColor(startColor);
437

    
438
                        Color endColor = m_colorChooser2.getColor();
439
                        m_Renderer.setEndColor(endColor);
440

    
441
                        
442

    
443
                        for (int i = 0; i < elRs.getFieldCount(); i++) {
444
                                String nomAux = elRs.getFieldName(i).trim();
445

    
446
                                if (nomField.compareToIgnoreCase(nomAux) == 0) {
447
                                        idField = i;
448

    
449
                                        break;
450
                                }
451
                        }
452

    
453
                        if (idField == -1) {
454
                                System.err.println("Campo no reconocido " + nomField);
455

    
456
                                return;
457
                        }
458

    
459
                        ///m_symbolTable.removeAllItems();
460
                        ///m_valuesCache = new Object[m_lyr.getSource().getShapeCount()];
461
                        int numSymbols = 0;
462
                        FSymbol theSymbol;
463
                        Date valorDate;
464
                        double minValue = Double.MAX_VALUE;
465
                        double maxValue = Double.MIN_VALUE;
466
                        Date minValueDate = null;
467
                        Date maxValueDate = null;
468

    
469
                        VectorialIntervalLegend auxLegend;
470
                        auxLegend = LegendFactory.createVectorialIntervalLegend(m_lyr.getShapeType());
471

    
472
                        Value clave;
473
                        Object resul;
474
                        int symbolType = 0;
475
                        count = 0;
476

    
477
                        for (int j = 0; j < elRs.getRowCount(); j++) {
478
                                clave = elRs.getFieldValue(j, idField);
479

    
480
                                FInterval interval = auxLegend.getInterval(clave);
481

    
482
                                ////Comprobar que no esta repetido y no hace falta introducir en el hashtable el campo junto con el simbolo.
483
                                if (auxLegend.getSymbolByInterval(interval) == null) {
484
                                        //si no esta creado el simbolo se crea
485
                                        double valor = 0;
486
                                        symbolType = m_lyr.getShapeType();
487

    
488
                                        if (clave instanceof IntValue) {
489
                                                valor = ((IntValue) clave).getValue();
490
                                        } else if (clave instanceof DoubleValue) {
491
                                                valor = ((DoubleValue) clave).getValue();
492
                                        } else if (clave instanceof FloatValue) {
493
                                                valor = ((FloatValue) clave).getValue();
494
                                        } else if (clave instanceof LongValue) {
495
                                                valor = ((LongValue) clave).getValue();
496
                                        } else if (clave instanceof DateValue) {
497
                                                //TODO POR IMPLEMENTAR
498
                                                ///valorDate = elRs.getFieldValueAsDate(idField);
499
                                                ///if (valorDate.before(minValueDate)) minValueDate = valorDate;
500
                                                ///if (valorDate.after(maxValueDate)) maxValueDate = valorDate;
501
                                        } else if (clave instanceof NullValue){
502
                                                continue;
503
                                        }
504

    
505
                                        if (valor < minValue) {
506
                                                minValue = (double) valor;
507
                                        }
508

    
509
                                        if (valor > maxValue) {
510
                                                maxValue = (double) valor;
511
                                        }
512
                                }
513

    
514
                                count++;
515
                        }
516

    
517
                        switch (m_Renderer.getIntervalType()) {
518
                                case VectorialIntervalLegend.EQUAL_INTERVALS:
519
                                        arrayIntervalos = calculateEqualIntervals(numIntervalos,
520
                                                        minValue, maxValue,fieldName);
521

    
522
                                        break;
523

    
524
                                case VectorialIntervalLegend.NATURAL_INTERVALS:
525
                                        arrayIntervalos = calculateNaturalIntervals(numIntervalos,
526
                                                        minValue, maxValue,fieldName);
527

    
528
                                        break;
529

    
530
                                case VectorialIntervalLegend.QUANTILE_INTERVALS:
531
                                        arrayIntervalos = calculateQuantileIntervals(numIntervalos,
532
                                                        minValue, maxValue,fieldName);
533

    
534
                                        break;
535
                        }
536

    
537
                        intervals = arrayIntervalos;
538

    
539
                        FInterval elIntervalo;
540
                        NumberFormat.getInstance().setMaximumFractionDigits(2);
541
                        m_Renderer.clear();
542

    
543
                        int r;
544
                        int g;
545
                        int b;
546
                        int stepR;
547
                        int stepG;
548
                        int stepB;
549
                        r = startColor.getRed();
550
                        g = startColor.getGreen();
551
                        b = startColor.getBlue();
552
                        stepR = (endColor.getRed() - r) / arrayIntervalos.length;
553
                        stepG = (endColor.getGreen() - g) / arrayIntervalos.length;
554
                        stepB = (endColor.getBlue() - b) / arrayIntervalos.length;
555
                        for (int k = 0; k < arrayIntervalos.length; k++) {
556
                                elIntervalo = arrayIntervalos[k];
557

    
558
                                // clave = elIntervalo; // elIntervalo.getMin() + " - " + elIntervalo.getMax();
559
                                // System.out.println("k = " + k + " clave = " + clave);
560
                                ////Comprobar que no esta repetido y no hace falta introducir en el hashtable el campo junto con el simbolo.
561
                                // if (!m_Renderer.m_symbolList.containsKey(elIntervalo)) {
562
                                //si no esta creado el simbolo se crea
563
                                theSymbol = new FSymbol(symbolType, new Color(r, g, b));
564
                                theSymbol.setDescription(NumberFormat.getInstance().format(elIntervalo.getMin()) +
565
                                        " - " +
566
                                        NumberFormat.getInstance().format(elIntervalo.getMax()));
567

    
568
                                //////////////////////////////////////
569
                                // CALCULAMOS UN COLOR APROPIADO
570
                                r = r + stepR;
571
                                g = g + stepG;
572
                                b = b + stepB;
573

    
574
                                /////////////////////////////////
575
                                m_Renderer.addSymbol(elIntervalo, theSymbol);
576
                                System.out.println("addSymbol = " + elIntervalo +
577
                                        " theSymbol = " + theSymbol.getDescription());
578
                                numSymbols++;
579

    
580
                                if (numSymbols > 100) {
581
                                        JOptionPane.showMessageDialog(this,
582
                                                "M?s 100 de s?mbolos no aportan informaci?n en un plano. Por favor, revise el campo seleccionado.");
583

    
584
                                        break;
585
                                }
586

    
587
                                // }
588
                        } // for
589

    
590
                        System.out.println("Num. Simbolos = " +
591
                                m_Renderer.getValues().length);
592
                        m_symbolTable.fillTableFromSymbolList(m_Renderer.getSymbols(),
593
                                m_Renderer.getValues(), m_Renderer.getDescriptions());
594
                        elRs.stop();
595
                } catch (DriverException e) {
596
                        // TODO Auto-generated catch block
597
                        e.printStackTrace();
598
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
599
                        e.printStackTrace();
600
                }
601

    
602
                m_btnDeleteAll.setEnabled(true);
603
                m_btnDelete.setEnabled(true);
604
        }
605

    
606
        /**
607
         * A partir de los registros de la tabla, regenera el FRenderer. (No solo
608
         * el symbolList, si no tambi?n el arrayKeys y el defaultRenderer
609
         */
610
        private void fillSymbolListFromTable() {
611
                String clave;
612
                FSymbol theSymbol;
613
                FInterval theInterval = null;
614

    
615
                // Borramos las anteriores listas:
616
                m_Renderer.clear();
617

    
618
                boolean bRestoValores = false; // PONERLO EN UN CHECKBOX
619
                double from = 0;
620
                double to = 0;
621
                String[] arraySplit = new String[2];
622
                int hasta;
623
                String fieldName = (String) m_cboFields.getSelectedItem();
624
                m_Renderer.setFieldName(fieldName);
625

    
626
                if (bRestoValores) {
627
                        hasta = m_symbolTable.getRowCount() - 1;
628
                } else {
629
                        hasta = m_symbolTable.getRowCount();
630
                }
631

    
632
                for (int row = 0; row < m_symbolTable.getRowCount(); row++) {
633
                        // clave = m_symbolTable.getFieldValue(row,1);
634
                        theInterval = (FInterval) m_symbolTable.getFieldValue(row, 1);
635
                        theSymbol = (FSymbol) m_symbolTable.getFieldValue(row, 0);
636
                        theSymbol.setDescription((String) m_symbolTable.getFieldValue(row, 2));
637
                        m_Renderer.addSymbol(theInterval, theSymbol);
638

    
639
                        ///m_Renderer.m_legendIntervals.add(theInterval);
640
                }
641

    
642
                if (bRestoValores) {
643
                        //m_Renderer.m_bUseDefaultSymbol = true;
644
                        theSymbol = (FSymbol) m_symbolTable.getFieldValue(hasta, 0);
645
                        m_Renderer.setDefaultSymbol(theSymbol);
646
                }
647
        }
648

    
649
        /**
650
         * DOCUMENT ME!
651
         */
652
        private void fillFieldNames() {
653
                DataSource rs = null;
654
                ArrayList nomFields = null;
655

    
656
                try {
657
                        rs = ((AlphanumericData) m_lyr).getRecordset();
658
                        logger.debug("rs.start()");
659
                        rs.start();
660

    
661
                        nomFields = new ArrayList();
662

    
663
                        Value val;
664

    
665
                        for (int i = 0; i < rs.getFieldCount(); i++) {
666
                                //TODO deber?a de existir un getFieldType
667
                                val = rs.getFieldValue(0, i);
668

    
669
                                if (val.getClass() == NullValue.class) {
670
                                        continue;
671
                                }
672

    
673
                                if ((val.getClass() == IntValue.class) ||
674
                                                (val.getClass() == DoubleValue.class) ||
675
                                                (val.getClass() == FloatValue.class) ||
676
                                                (val.getClass() == LongValue.class)) {
677
                                        nomFields.add(rs.getFieldName(i).trim());
678
                                }
679
                        }
680

    
681
                        rs.stop();
682
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e1) {
683
                        e1.printStackTrace();
684
                } catch (DriverException e) {
685
                        e.printStackTrace();
686
                }
687

    
688
                /*        ArrayList nomFields = new ArrayList();
689
                   for (int i = 0; i < rs.getFieldsCount(); i++) {
690
                           if ((rs.getFieldType(i) == FRecordset.INTEGER) ||
691
                                   (rs.getFieldType(i) == FRecordset.DECIMAL) ||
692
                                   (rs.getFieldType(i) == FRecordset.DATE))
693
                           {
694
                                   nomFields.add(rs.getFieldName(i).trim());
695
                           }
696
                
697
                   }
698
                 */
699
                DefaultComboBoxModel cM = new DefaultComboBoxModel(nomFields.toArray());
700
                m_cboFields.setModel(cM);
701

    
702
                // fieldsListValor.setSelectedIndex(0);
703
                m_symbolTable.removeAllItems();
704
        }
705

    
706
        /**
707
         * @see com.iver.cit.gvsig.gui.legendmanager.panels.ILegendPanel#setLayer(com.iver.cit.gvsig.fmap.layers.FLayer,
708
         *                 com.iver.cit.gvsig.fmap.rendering.Legend)
709
         */
710
        public void setLayer(FLayer lyr, Legend r) {
711
                //                 m_TOC = t;
712
                // OJO, COMPROBAR ANTES SI ES DE TIPO VECTORIAL
713
                // m_lyr = (FLyrVect) t.getFirstLyrVectSelected();
714
                m_lyr = (ClassifiableVectorial) lyr;
715
                fillFieldNames();
716

    
717
                if (r instanceof VectorialIntervalLegend) {
718
                        m_Renderer = (VectorialIntervalLegend) r;
719
                        m_cboFields.getModel().setSelectedItem(m_Renderer.getFieldName());
720
                        m_symbolTable.fillTableFromSymbolList(m_Renderer.getSymbols(),
721
                                m_Renderer.getValues(), m_Renderer.getDescriptions());
722
                        m_colorChooser1.setColor(m_Renderer.getStartColor());
723
                        m_colorChooser2.setColor(m_Renderer.getEndColor());
724
                        m_colorChooser1.repaint();
725
                        m_colorChooser2.repaint();
726
                } else {
727
                        try {
728
                                // Si la capa viene con otro tipo de leyenda, creamos
729
                                // una nueva del tipo que maneja este panel
730
                                m_Renderer = new VectorialIntervalLegend(m_lyr.getShapeType());
731
                        } catch (DriverException e) {
732
                                // TODO Auto-generated catch block
733
                                e.printStackTrace();
734
                        }
735
                }
736
                m_cboIntervalType.setSelectedIndex(m_Renderer.getIntervalType());
737
        }
738

    
739
        /**
740
         * @see com.iver.cit.gvsig.gui.legendmanager.panels.ILegendPanel#getLegend()
741
         */
742
        public Legend getLegend() {
743
                fillSymbolListFromTable();
744

    
745
                return m_Renderer;
746
        }
747

    
748
        /**
749
         * DOCUMENT ME!
750
         *
751
         * @author Vicente Caballero Navarro
752
         */
753
        class MyListener implements ActionListener {
754
                //private FLyrShp m_layer;
755
                // private FPanelLegendValues m_Parent;
756
                public MyListener() { // FPanelLegendValues p) {
757

    
758
                        // m_Parent = p;
759
                }
760

    
761
                /**
762
                 * DOCUMENT ME!
763
                 *
764
                 * @param e DOCUMENT ME!
765
                 */
766
                public void actionPerformed(ActionEvent e) {
767
                        // rellenarValue();
768
                        System.out.println("ActionEvent con " + e.getActionCommand());
769

    
770
                        //modificar el combobox de valor
771
                        if (e.getActionCommand() == "FIELD_SELECTED") {
772
                                JComboBox cb = (JComboBox) e.getSource();
773
                                String fieldName = (String) cb.getSelectedItem();
774
                                System.out.println("Nombre del campo: " + fieldName);
775
                                m_symbolTable.removeAllItems();
776

    
777
                                m_Renderer.setFieldName(fieldName);
778
                        } else if (e.getActionCommand() == "INTERVAL_TYPE") {
779
                                JComboBox cb = (JComboBox) e.getSource();
780
                                
781
                                if (m_Renderer!=null && cb.getSelectedIndex() != m_Renderer.getIntervalType()) {
782
                                        m_Renderer.setIntervalType(cb.getSelectedIndex());
783
                                        m_symbolTable.removeAllItems();
784
                                }
785
                                
786
                        }
787

    
788
                        //A?adir todos los elementos por valor
789
                        if (e.getActionCommand() == "ADD_ALL_VALUES") {
790
                                fillTableValues();
791
                        }
792

    
793
                        //A?adir un ?nico elemento
794
                        if (e.getActionCommand() == "ADD_VALUE") {
795
                                try {
796
                                        m_symbolTable.addTableRecord(new FSymbol(m_lyr.getShapeType()),new FInterval(0,0),"0 - 0");
797
                                } catch (DriverException e1) {
798
                                        e1.printStackTrace();
799
                                }
800
                        
801
                                /*        a?adir("Nuevo_Valor");
802
                                   aceptar.setEnabled(true);
803
                                   quitartodo.setEnabled(true);
804
                                   quitar.setEnabled(true); */
805
                        }
806

    
807
                        //Vacia la tabla
808
                        if (e.getActionCommand() == "REMOVE_ALL") {
809
                                m_symbolTable.removeAllItems();
810

    
811
                                // aceptar.setEnabled(false);
812
                        }
813

    
814
                        //Quitar solo el elemento seleccionado
815
                        if (e.getActionCommand() == "REMOVE") {
816
                                m_symbolTable.removeSelectedRows();
817
                        }
818
                }
819
        }
820
}