Statistics
| Revision:

root / org.gvsig.chart / trunk / org.gvsig.chart / org.gvsig.chart.app / org.gvsig.chart.app.legendplugin / src / main / java / org / gvsig / project / documents / view / legend / LinkedChartLegend.java @ 571

History | View | Annotate | Download (21.5 KB)

1
package org.gvsig.project.documents.view.legend;
2

    
3
import java.awt.Color;
4
import java.awt.Graphics2D;
5
import java.awt.image.BufferedImage;
6
import java.util.ArrayList;
7
import java.util.Arrays;
8
import java.util.HashMap;
9
import java.util.Iterator;
10
import java.util.List;
11
import java.util.Map;
12
import java.util.Set;
13
import org.apache.commons.lang3.StringUtils;
14

    
15
import org.cresques.cts.ICoordTrans;
16

    
17
import org.gvsig.app.ApplicationLocator;
18
import org.gvsig.app.ApplicationManager;
19
import org.gvsig.app.project.Project;
20
import org.gvsig.app.project.documents.table.TableDocument;
21
import org.gvsig.app.project.documents.table.TableManager;
22
import org.gvsig.chart.ChartLocator;
23
import org.gvsig.chart.ChartService;
24
import org.gvsig.chart.legend.IChartLegend;
25
import org.gvsig.chart.legend.ILinkedChartLegend;
26
import org.gvsig.chart.legend.symbols.IChartSymbol;
27
import org.gvsig.chart.model.ChartDataSet;
28
import org.gvsig.chart.renderer.ChartSerieEntity;
29
import org.gvsig.fmap.dal.exception.DataException;
30
import org.gvsig.fmap.dal.feature.Feature;
31
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
32
import org.gvsig.fmap.dal.feature.FeatureQuery;
33
import org.gvsig.fmap.dal.feature.FeatureSelection;
34
import org.gvsig.fmap.dal.feature.FeatureSet;
35
import org.gvsig.fmap.dal.feature.FeatureStore;
36
import org.gvsig.fmap.dal.feature.FeatureType;
37
import org.gvsig.fmap.mapcontext.MapContextException;
38
import org.gvsig.fmap.mapcontext.MapContextLocator;
39
import org.gvsig.fmap.mapcontext.MapContextManager;
40
import org.gvsig.fmap.mapcontext.ViewPort;
41
import org.gvsig.fmap.mapcontext.rendering.legend.LegendException;
42
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
43
import static org.gvsig.symbology.fmap.mapcontext.rendering.legend.impl.VectorialUniqueValueLegend.VECTORIAL_UNIQUE_VALUE_LEGEND_PERSISTENCE_DEFINITION_NAME;
44
import org.gvsig.tools.ToolsLocator;
45
import org.gvsig.tools.dispose.DisposableIterator;
46
import org.gvsig.tools.dynobject.DynStruct;
47
import org.gvsig.tools.persistence.PersistenceManager;
48
import org.gvsig.tools.persistence.PersistentState;
49
import org.gvsig.tools.persistence.exception.PersistenceException;
50
import org.gvsig.tools.persistence.impl.DelegatedList;
51
import org.gvsig.tools.task.Cancellable;
52
import org.gvsig.tools.util.Callable;
53

    
54
import org.jfree.chart.LegendItem;
55

    
56
@Deprecated
57
public final class LinkedChartLegend extends BasePieChartLegend implements ILinkedChartLegend {
58

    
59
    public static class RegisterLegend implements Callable {
60

    
61
        public Object call() throws Exception {
62
            MapContextManager manager = MapContextLocator.getMapContextManager();
63

    
64
            manager.registerLegend(IChartLegend.LINKED_LEGEND_NAME,
65
                    LinkedChartLegend.class);
66

    
67
            return Boolean.TRUE;
68
        }
69

    
70
    }
71

    
72
    public static final String LINKED_CHART_LEGEND_PERSISTENCE_DEFINITION_NAME = "LinkedChartLegend";
73

    
74
    private static final String FIELD_NAMES = "FieldLegendNames";
75
    private static final String FIELD_LABEL_NAMES = "FieldLabelNames";
76
    private static final String FIELD_LABEL_COLOR = "FieldLabelColor";
77

    
78
    protected Map<String, List> indexHash;
79
    private String linkedField;
80
    private String groupedByField = "";
81
    private List<String> linkedFieldValues;
82
    private String[] linkedFieldTableNames;
83
    private String[] linkedFieldName;
84
    private String linkedTable;
85
    private boolean originSelected;
86
    private boolean destinationSelected;
87
    private String[] linkedFields;
88

    
89
    private String timeField;
90

    
91
    private String legendType;
92

    
93
    public LinkedChartLegend() {
94
        this.indexHash = new HashMap<>();
95
    }
96

    
97
    @Override
98
    public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
99
            Cancellable cancel, double scale, Map queryParameters,
100
            ICoordTrans coordTrans, FeatureStore featureStore,
101
            FeatureQuery featureQuery) throws LegendException {
102
        FeatureSelection fsel;
103
        try {
104
            this.featSelection = featureStore.getFeatureSelection();
105
            System.out.println("LINKEDCHARTLEGEND: " + featSelection.getSelectedCount() + " seleccionados.");
106
        } catch (DataException e) {
107
            e.printStackTrace();
108
        }
109

    
110
        super.draw(image, g, viewPort, cancel, scale, queryParameters, coordTrans,
111
                featureStore, featureQuery);
112
    }
113

    
114
    /**
115
     * Devuelve un array con los campos seleccionados a pintar de la capa
116
     * enlazada
117
     *
118
     * @return
119
     */
120
    public String[] getLinkedClassifyingFieldNames() {
121
        return getClassifyingFieldNames();
122
    }
123

    
124
    @Override
125
    public String[] getClassifyingFieldNames() {
126
        return this.linkedFieldName;
127
    }
128

    
129
    @Override
130
    public void setLinkedFieldName(String[] fieldName) {
131
        this.linkedFieldName = fieldName;
132
        updateSymbols();
133
    }
134

    
135
    @Override
136
    public void setDataHash(Map<String, List> hash) {
137
        this.indexHash = hash;
138
    }
139

    
140
    @Override
141
    public Set<String> getLinkedFieldValues() {
142
        return this.indexHash.keySet();
143
    }
144

    
145
    public void setLinkedFieldValues(List<String> values) {
146
        this.linkedFieldValues = values;
147
        updateSymbols();
148
    }
149

    
150
    @Override
151
    public Map<String, List> getLinkedData() {
152

    
153
        indexHash = new HashMap<>();
154

    
155
        ApplicationManager appManager = ApplicationLocator.getManager();
156
        final Project project = appManager.getCurrentProject();
157

    
158
        TableDocument selDoc = (TableDocument) project.getDocument(this.linkedTable,
159
                TableManager.TYPENAME);
160

    
161
        if (selDoc != null) {
162
            try {
163
                FeatureType featType = selDoc.getStore().getDefaultFeatureType();
164
                FeatureAttributeDescriptor[] atts = featType.getAttributeDescriptors();
165

    
166
                FeatureSelection fsel = selDoc.getStore().getFeatureSelection();
167
                FeatureSet fs = selDoc.getStore().getFeatureSet();
168

    
169
                DisposableIterator it = null;
170
                if (this.destinationSelected) {
171
                    it = fsel.fastIterator();
172
                } else {
173
                    it = fs.fastIterator();
174
                }
175

    
176
                while (it.hasNext()) {
177
                    Feature f = (Feature) it.next();
178

    
179
                    String key = f.getString(this.linkedField);
180
                    if (key != null) {
181
                        List<Map<String, Double>> array = indexHash.get(key);
182
                        if (array == null) {
183
                            array = new ArrayList<>();
184
                            indexHash.put(key, array);
185
                        }
186
                        if (array instanceof DelegatedList) {
187
                            List<Map<String, Double>> auxarray = new ArrayList<>();
188
                            for (int i = 0; i < array.size(); i++) {
189
                                auxarray.add(array.get(i));
190
                            }
191
                            array = auxarray;
192
                        }
193

    
194
                        Map<String, Double> elem = new HashMap<>();
195
                        for (String field : getLinkedFields()) {
196
                            if (!field.equalsIgnoreCase(key)) {
197
                                Double value = f.getDouble(field);
198
                                elem.put(field, value);
199
                            }
200
                        }
201
                        String xAxis = this.timeField;
202
                        if (StringUtils.isNotEmpty(xAxis)) {
203
                            Double value = f.getDouble(xAxis);
204
                            elem.put(xAxis, value);
205
                        }
206
                        array.add(elem);
207
                    }
208
                }
209

    
210
                it.dispose();
211
            } catch (DataException e) {
212
                // TODO Auto-generated catch block
213
                e.printStackTrace();
214
            }
215

    
216
        } else {
217
            throw new RuntimeException("No se encuentra la tabla "
218
                    + this.linkedTable);
219
        }
220

    
221
        return indexHash;
222
    }
223

    
224
    @Override
225
    public ISymbol getSymbolByFeature(Feature feat) throws MapContextException {
226

    
227
        if (this.onlySelection) {
228
            if (!featSelection.isSelected(feat)) {
229
                return null;
230
            }
231
        }
232
        String name = "";
233
        if (getClassifyingFieldNames() != null && getClassifyingFieldNames().length > 0) {
234
            name = feat.getString(getClassifyingFieldNames()[0]);
235
        } else {
236
            return null;
237
        }
238
        Set<String> indexes = getLinkedFieldValues();
239
        if (!indexes.contains(name)) {
240
            return null;
241
        }
242

    
243
        // TODO: AQU? PRODR?AMOS RECUPERAR VARIOS SIMBOLOS. POR AHORA, SUPONEMOS QUE EL DEFAULTSYMBOL ES EL QUE TIENE EL CHARTSYMBOL
244
        symbol = (IChartSymbol) getDefaultSymbol();
245
        if (symbol == null) {
246
            symbol = (IChartSymbol) MapContextLocator
247
                    .getSymbolManager().createSymbol(IChartSymbol.SYMBOL_NAME);
248

    
249
        }
250
        symbol.setOnlySelection(onlySelection);
251
        double size = 0;
252

    
253
        ChartDataSet dataSet = ChartLocator.getServiceManager()
254
                .getChartManager().createChartDataSet();
255

    
256
        ChartService cs = symbol.getChart();
257
        if (StringUtils.equals(cs.getChartType(), "BarsChart")) {
258
            addBarsDataSetInfo(dataSet, name);
259
        } else {
260
            addPieDataSetInfo(dataSet, name);
261
        }
262
        cs.getChartProperties().setChartDimension(this.is3D);
263

    
264
        String[] names = getFieldNames();
265
        if (names != null) {
266
            cs.setChartDataSet(dataSet);
267
            List<ChartSerieEntity> lst = cs.getChartLegendItems();
268

    
269
            for (int j = 0; j < names.length; j++) {
270
                colors[j] = getSymbolByValue(names[j]).getColor();
271
                LegendItem item = new LegendItem(names[j], colors[j]);
272
                item.setSeriesKey(names[j]);
273
                ChartSerieEntity e = cs.createNewChartSerieEntity(item);
274
                if (e != null) {
275
                    lst.add(e);
276
                }
277
            }
278
            cs.setCategoriesPaint(Arrays.asList(colors));
279
        }
280
        double separation = sizeTo - sizeFrom;
281

    
282
        switch (sizeOption) {
283
            case IChartSymbol.SIZESUM:
284
                if (isActiveLimits()) {
285
                    double difFeat = maxFeature - minFeature;
286
                    double step = difFeat / separation;
287
                    size = sizeFrom + ((size - minFeature) / step);
288
                }
289
                symbol.setSize(size);
290
                break;
291
            case IChartSymbol.SIZEFIELD:
292
                if (separation == 0) {
293
                    separation = 1;
294
                }
295
                double value = feat.getDouble(getFieldSize());
296
                if (!getFieldNormalize().equals("---")) {
297
                    double normalize = feat.getDouble(getFieldNormalize());
298
                    if (normalize != 0) {
299
                        value = value / normalize;
300
                    }
301
                    if (isActiveLimits()) {
302
                        size = sizeFrom + (value * separation);
303
                    } else {
304
                        size = value;
305
                    }
306
                } else {
307
                    if (isActiveLimits()) {
308
                        double difFeat = maxFeature - minFeature;
309
                        double step = difFeat / separation;
310
                        size = sizeFrom + ((value - minFeature) / step);
311
                    } else {
312
                        size = value;
313
                    }
314
                }
315
                symbol.setSize(size);
316
                break;
317
            default:
318
                symbol.setSize(getSize());
319
                break;
320
        }
321
        return symbol;
322
    }
323

    
324
    private void addPieDataSetInfo(ChartDataSet dataSet, String name) {
325

    
326
        String[] names = getFieldNames();
327
        String[] _labels = getFieldLabels();
328
        if (names != null && _labels != null && _labels.length == names.length) {
329
            ArrayList serie = new ArrayList();
330
            ArrayList category = new ArrayList();
331
            ArrayList groupedBy = new ArrayList();
332

    
333
            Iterator it = indexHash.get(name).iterator();
334
            int ji = 1;
335
            while (it.hasNext()) {
336
                Map<String, Object> it_next = (Map<String, Object>) it.next();
337

    
338
                for (int i = 0; i < names.length; i++) {
339
                    if (getGroupedField() != null && getGroupedField() != "") {
340
                        groupedBy.add("" + it_next.get(getGroupedField()));
341
                    } else {
342
                        if (ji != 1 || (ji == 1 && it.hasNext())) {
343
                            groupedBy.add("" + ji);
344
                        } else {
345
                            groupedBy.add(" ");
346
                        }
347
                    }
348
                    double val = (Double) it_next.get(names[i]);
349
                    if (sizeOption == IChartSymbol.SIZESUM) {
350
                        size += val;
351
                    }
352
                    serie.add(_labels[i]);
353
                    category.add(val);
354
                }
355
                ji++;
356
            }
357

    
358
            dataSet.addData("groupby", groupedBy);
359
            dataSet.addData("series", serie);
360
            dataSet.addData("categories", category);
361

    
362
        }
363
    }
364

    
365
    private void addBarsDataSetInfo(ChartDataSet dataSet, String name) {
366
        String[] names = getFieldNames();
367
        if (names != null) {
368
            ArrayList serie = new ArrayList();
369
            ArrayList category = new ArrayList();
370
            ArrayList groupedBy = new ArrayList();
371

    
372
            Iterator it = indexHash.get(name).iterator();
373
            int ji = 1;
374
            while (it.hasNext()) {
375
                Map<String, Object> it_next = (Map<String, Object>) it.next();
376

    
377
                for (int i = 0; i < names.length; i++) {
378
                    if (getGroupedField() != null && getGroupedField() != "") {
379
                        serie.add("" + it_next.get(getGroupedField()));
380
                    } else {
381
                        serie.add("" + ji);
382
                    }
383
                    double val = (Double) it_next.get(names[i]);
384
                    if (sizeOption == IChartSymbol.SIZESUM) {
385
                        size += val;
386
                    }
387
                    groupedBy.add(names[i]);
388
                    category.add(val);
389
                }
390
                ji++;
391
            }
392

    
393
            dataSet.addData("groupby", groupedBy);
394
            dataSet.addData("series", serie);
395
            dataSet.addData("categories", category);
396
        }
397
    }
398

    
399
    @Override
400
    public String getLinkedField() {
401
        return this.linkedField;
402
    }
403

    
404
    @Override
405
    public void setLinkedField(String field) {
406
        this.linkedField = field;
407
    }
408

    
409
    @Override
410
    public String getTimeField() {
411
        return this.timeField;
412
    }
413

    
414
    @Override
415
    public void setTimeField(String field) {
416
        this.timeField = field;
417
    }
418

    
419
    @Override
420
    public String getLegendType() {
421
        return this.legendType;
422
    }
423

    
424
    @Override
425
    public void setLegendType(String field) {
426
        this.legendType = field;
427
    }
428

    
429
    @Override
430
    public void setGroupedField(String string) {
431
        this.groupedByField = string;
432
    }
433

    
434
    @Override
435
    public String getGroupedField() {
436
        return this.groupedByField;
437
    }
438

    
439
    @Override
440
    public String getLinkedTable() {
441
        return this.linkedTable;
442
    }
443

    
444
    @Override
445
    public boolean getLinkedSelected() {
446
        return this.destinationSelected;
447
    }
448

    
449
    @Override
450
    public String[] getOriginFieldName() {
451
        return linkedFieldName;
452
    }
453

    
454
    @Override
455
    public boolean getOriginSelected() {
456
        return this.originSelected;
457
    }
458

    
459
    @Override
460
    public void setLinkedTable(String selectedItem) {
461
        this.linkedTable = selectedItem;
462
        updateSymbols();
463
    }
464

    
465
    @Override
466
    public void setOriginSelected(boolean selected) {
467
        this.originSelected = selected;
468
    }
469

    
470
    @Override
471
    public void setLinkedSelected(boolean selected) {
472
        this.destinationSelected = selected;
473
    }
474

    
475
    @Override
476
    public void setLinkedFields(String[] fields) {
477
        this.linkedFields = fields;
478
        updateSymbols();
479
    }
480

    
481
    @Override
482
    public String[] getLinkedFields() {
483
        return linkedFields;
484
    }
485

    
486
    @Override
487
    public void loadFromState(PersistentState state)
488
            throws PersistenceException {
489
        // Set parent properties
490
        super.loadFromState(state);
491

    
492
        this.linkedFields = state.getStringArray("linkedFields");
493
        this.linkedFieldName = state.getStringArray("linkedFieldName");
494
        this.linkedFieldTableNames = state.getStringArray("linkedFieldTableNames");
495

    
496
        // Set own properties
497
        this.linkedFieldValues = (List<String>) state.getList("linkedFieldValues");
498

    
499
        this.originSelected = state.getBoolean("originSelected");
500
        this.destinationSelected = state.getBoolean("destinationSelected");
501

    
502
        this.linkedTable = state.getString("linkedTable");
503
        this.linkedField = state.getString("linkedField");
504
        this.groupedByField = state.getString("groupedByField");
505
        this.timeField = state.getString("timeField");
506
        this.legendType = state.getString("legendType");
507

    
508
        this.indexHash = state.getMap("indexHash");
509

    
510
        //getLinkedData();
511
    }
512

    
513
    @Override
514
    public void saveToState(PersistentState state) throws PersistenceException {
515
        // Save parent properties
516
        super.saveToState(state);
517
        // Save own properties
518
        state.set("linkedFields", this.linkedFields);
519
        state.set("linkedFieldName", this.linkedFieldName);
520
        state.set("linkedFieldTableNames", this.linkedFieldTableNames);
521

    
522
        state.set("linkedFieldValues", this.linkedFieldValues);
523

    
524
        state.set("originSelected", this.originSelected);
525
        state.set("destinationSelected", this.destinationSelected);
526

    
527
        state.set("linkedTable", this.linkedTable);
528
        state.set("linkedField", this.linkedField);
529
        state.set("groupedByField", this.groupedByField);
530
        state.set("timeField", this.timeField);
531

    
532
        state.set("legendType", this.legendType);
533

    
534
        state.set("indexHash", this.indexHash);
535
    }
536

    
537
    public static class RegisterPersistence implements Callable {
538

    
539
        @Override
540
        public Object call() throws Exception {
541
            PersistenceManager manager = ToolsLocator.getPersistenceManager();
542
            if (manager.getDefinition(LINKED_CHART_LEGEND_PERSISTENCE_DEFINITION_NAME) == null) {
543
                DynStruct definition = manager.addDefinition(
544
                        LinkedChartLegend.class,
545
                        LINKED_CHART_LEGEND_PERSISTENCE_DEFINITION_NAME,
546
                        LINKED_CHART_LEGEND_PERSISTENCE_DEFINITION_NAME + " Persistence definition",
547
                        null,
548
                        null
549
                );
550
                // Extend the Classified Vector Legend base definition
551
                definition.extend(manager.getDefinition(VECTORIAL_UNIQUE_VALUE_LEGEND_PERSISTENCE_DEFINITION_NAME));
552

    
553
                // Field names
554
                definition.addDynFieldArray(FIELD_NAMES)
555
                        .setClassOfItems(String.class);
556
                definition.addDynFieldArray(FIELD_LABEL_NAMES)
557
                        .setClassOfItems(String.class);
558
                definition.addDynFieldArray(FIELD_LABEL_COLOR)
559
                        .setClassOfItems(Color.class);
560

    
561
                definition.addDynField("backgroundSymbol").setClassOfValue(ISymbol.class);
562
                definition.addDynFieldInt("size");
563
                definition.addDynFieldBoolean("is3D");
564

    
565
                definition.addDynFieldBoolean("isOutlineShow");
566
                definition.addDynFieldBoolean("onlySelection");
567
                definition.addDynFieldBoolean("isActiveLimits");
568

    
569
                definition.addDynFieldInt("outlineWidth");
570
                definition.addDynFieldInt("referenceSystem");
571
                definition.addDynFieldInt("sizeFrom");
572
                definition.addDynFieldInt("sizeTo");
573
                definition.addDynFieldInt("unit");
574
                definition.addDynFieldInt("sizeOption");
575

    
576
                definition.addDynFieldObject("outlineColor").setClassOfValue(Color.class);
577
                definition.addDynFieldObject("symbol").setClassOfValue(IChartSymbol.class);
578
                definition.addDynFieldObject("featSelection").setClassOfValue(FeatureSelection.class);
579

    
580
                definition.addDynFieldString("fieldSize");
581
                definition.addDynFieldString("fieldNormalize");
582

    
583
                definition.addDynFieldDouble("minFeature");
584
                definition.addDynFieldDouble("maxFeature");
585
                definition.addDynFieldDouble("maxField");
586

    
587
                // Field names
588
                definition.addDynFieldArray("linkedFields")
589
                        .setClassOfItems(String.class);
590
                definition.addDynFieldArray("linkedFieldName")
591
                        .setClassOfItems(String.class);
592
                definition.addDynFieldArray("linkedFieldTableNames")
593
                        .setClassOfItems(String.class);
594
                definition.addDynFieldList("linkedFieldValues")
595
                        .setClassOfItems(String.class);
596

    
597
                definition.addDynFieldBoolean("originSelected");
598
                definition.addDynFieldBoolean("destinationSelected");
599

    
600
                definition.addDynFieldString("linkedTable");
601
                definition.addDynFieldString("linkedField");
602
                definition.addDynFieldString("groupedByField");
603
                definition.addDynFieldString("timeField");
604

    
605
                definition.addDynFieldMap("indexHash").setClassOfItems(List.class);
606
                definition.addDynFieldString("legendType");
607

    
608
            }
609
            return Boolean.TRUE;
610
        }
611

    
612
    }
613
}