Revision 9324

View differences:

org.gvsig.legend.vectorfilterexpression.app.mainplugin/tags/org.gvsig.legend.vectorfilterexpression.app.mainplugin-1.0.224/buildNumber.properties
1
#Sun Jul 09 18:14:06 CEST 2023
2
buildNumber=229
org.gvsig.legend.vectorfilterexpression.app.mainplugin/tags/org.gvsig.legend.vectorfilterexpression.app.mainplugin-1.0.224/src/main/resources/META-INF/services/org.gvsig.tools.library.Library
1
org.gvsig.symbology.library.VectorFilterExpressionLibrary
org.gvsig.legend.vectorfilterexpression.app.mainplugin/tags/org.gvsig.legend.vectorfilterexpression.app.mainplugin-1.0.224/src/main/assembly/gvsig-plugin-package.xml
1
<!--
2

  
3
    gvSIG. Desktop Geographic Information System.
4

  
5
    Copyright (C) 2007-2013 gvSIG Association.
6

  
7
    This program is free software; you can redistribute it and/or
8
    modify it under the terms of the GNU General Public License
9
    as published by the Free Software Foundation; either version 3
10
    of the License, or (at your option) any later version.
11

  
12
    This program is distributed in the hope that it will be useful,
13
    but WITHOUT ANY WARRANTY; without even the implied warranty of
14
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
    GNU General Public License for more details.
16

  
17
    You should have received a copy of the GNU General Public License
18
    along with this program; if not, write to the Free Software
19
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
20
    MA  02110-1301, USA.
21

  
22
    For any additional information, do not hesitate to contact us
23
    at info AT gvsig.com, or visit our website www.gvsig.com.
24

  
25
-->
26
<assembly>
27
  <id>gvsig-plugin-package</id>
28
  <formats>
29
    <format>zip</format>
30
  </formats>
31
  <baseDirectory>${project.artifactId}</baseDirectory>
32
  <includeBaseDirectory>true</includeBaseDirectory>
33
  <files>
34
    <file>
35
      <source>target/${project.artifactId}-${project.version}.jar</source>
36
      <outputDirectory>lib</outputDirectory>
37
    </file>
38
    <file>
39
      <source>target/package.info</source>
40
    </file>
41
  </files>
42

  
43
  <fileSets>
44
    <fileSet>
45
      <directory>src/main/resources-plugin</directory>
46
      <outputDirectory>.</outputDirectory>
47
    </fileSet>
48
  </fileSets>
49

  
50
<!-- No dependencies
51
  <dependencySets>
52
    <dependencySet>
53
      <useProjectArtifact>false</useProjectArtifact>
54
      <useTransitiveDependencies>false</useTransitiveDependencies>
55
      <outputDirectory>lib</outputDirectory>
56
      <includes>
57
		<include>...</include>
58
      </includes>
59
    </dependencySet>
60
  </dependencySets>
61
-->
62

  
63
</assembly>
64

  
org.gvsig.legend.vectorfilterexpression.app.mainplugin/tags/org.gvsig.legend.vectorfilterexpression.app.mainplugin-1.0.224/src/main/java/org/gvsig/symbology/fmap/rendering/VectorFilterExpressionLegend.java
1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2020 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.symbology.fmap.rendering;
25

  
26
import java.awt.Graphics2D;
27
import java.awt.image.BufferedImage;
28
import java.util.ArrayList;
29
import javax.swing.JOptionPane;
30
import org.cresques.cts.ICoordTrans;
31
import org.gvsig.app.ApplicationLocator;
32
import org.gvsig.fmap.dal.DALLocator;
33
import org.gvsig.fmap.dal.DataManager;
34
import org.gvsig.fmap.dal.exception.InitializeException;
35

  
36
import org.slf4j.Logger;
37
import org.slf4j.LoggerFactory;
38

  
39
import org.gvsig.fmap.dal.feature.Feature;
40
import org.gvsig.fmap.dal.feature.FeatureSelection;
41
import org.gvsig.fmap.dal.feature.FeatureSet;
42
import org.gvsig.fmap.geom.Geometry;
43
import org.gvsig.fmap.geom.GeometryLocator;
44
import org.gvsig.fmap.geom.GeometryManager;
45
import org.gvsig.fmap.mapcontext.MapContextLocator;
46
import org.gvsig.fmap.mapcontext.MapContextManager;
47
import org.gvsig.fmap.mapcontext.ViewPort;
48
import org.gvsig.fmap.mapcontext.rendering.legend.events.SymbolLegendEvent;
49
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
50
import org.gvsig.fmap.mapcontext.rendering.symbols.SymbolManager;
51
import org.gvsig.i18n.Messages;
52
import org.gvsig.symbology.fmap.mapcontext.rendering.legend.driver.impl.PersistenceBasedLegendWriter;
53
import org.gvsig.symbology.fmap.mapcontext.rendering.legend.impl.AbstractClassifiedVectorLegend;
54
import org.gvsig.symbology.fmap.mapcontext.rendering.legend.impl.DefaultFeatureDrawnNotification;
55
import org.gvsig.tools.ToolsLocator;
56
import org.gvsig.tools.dynobject.DynStruct;
57
import org.gvsig.tools.evaluator.Evaluator;
58
import org.gvsig.tools.evaluator.EvaluatorData;
59
import org.gvsig.tools.exception.BaseException;
60
import org.gvsig.tools.i18n.I18nManager;
61
import org.gvsig.tools.persistence.PersistenceManager;
62
import org.gvsig.tools.persistence.PersistentState;
63
import org.gvsig.tools.persistence.exception.PersistenceException;
64
import org.gvsig.tools.task.Cancellable;
65
import org.gvsig.tools.util.Callable;
66
import org.gvsig.tools.util.Caller;
67
import org.gvsig.tools.util.impl.DefaultCaller;
68

  
69
/**
70
 *
71
 * Implements a vector legend which represents the elements of a layer depending
72
 * on the value of an expression. That is, if the expression is evaluated to
73
 * true, then the symbol associated to the expression is painted. In other case
74
 * it is not showed.
75
 *
76
 * If the expression result is a string, it is considered false if it is the
77
 * empty string "", true otherwise.
78
 *
79
 * If the expression result is numeric, it is considered false if it is zero,
80
 * and true otherwise.
81
 *
82
 * In other cases, it is considered false if the result is null and true
83
 * otherwise.
84
 *
85
 * @author gvSIG Team
86
 */
87
public class VectorFilterExpressionLegend
88
        extends AbstractClassifiedVectorLegend {
89

  
90
    private static final Logger logger = LoggerFactory.getLogger(
91
            VectorFilterExpressionLegend.class);
92

  
93
    public static final String FILTER_EXPRESSION_LEGEND_PERSISTENCE_DEFINITION_NAME
94
            = "FILTER_EXPRESSION_LEGEND_PERSISTENCE_DEFINITION_NAME";
95

  
96
    public static final String FILTER_EXPRESSION_LEGEND_NAME = "FILTER_EXPRESSION_LEGEND_NAME";
97

  
98
    public static final String I18N_DEFAULT = Messages.getText("default_value");
99
    public static final String NON_I18N_DEFAULT = Messages.getText("Default");
100

  
101
    private int shapeType;
102
    private ISymbol defaultSymbol;
103

  
104
    private boolean useDefaultSymbol = false;
105

  
106
    private long error_msg_count = 0;
107

  
108
    private ArrayList<Item> newSymbols = new ArrayList<Item>() {
109
        private static final long serialVersionUID = 1L;
110

  
111
        public int indexOf(String expr) {
112
            return super.indexOf(new Item(expr, null));
113
        }
114
    };
115

  
116
    private class Item implements Cloneable {
117

  
118
        private ISymbol sym;
119
        private Evaluator evaluator;
120

  
121
        public Item(String expression, ISymbol sym) {
122
            this.sym = sym;
123
            DataManager dataManager = DALLocator.getDataManager();
124
            try {
125
                evaluator = dataManager.createFilter(expression);
126
            } catch (InitializeException ex) {
127
                evaluator = null;
128
            }
129
        }
130

  
131
        public boolean equals(Object obj) {
132
            if (obj == null) {
133
                return false;
134
            }
135
            if (!obj.getClass().equals(Item.class)) {
136
                return false;
137
            }
138
            return this.evaluator.getSQL().equals(
139
                    ((Item) obj).evaluator.getSQL()
140
            );
141
        }
142

  
143
        public String getStringExpression() {
144
            return evaluator.getSQL();
145
        }
146

  
147
        public Evaluator getEvaluator() {
148
            return evaluator;
149
        }
150

  
151
        public Object clone() {
152

  
153
            ISymbol clonesym = null;
154
            try {
155
                clonesym = (ISymbol) this.sym.clone();
156
            } catch (CloneNotSupportedException e) {
157
                logger.info("Error: unable to clone symbol.", e);
158
                clonesym = this.sym;
159
            }
160
            return new Item(getStringExpression(), clonesym);
161
        }
162
    }
163

  
164
    public VectorFilterExpressionLegend() {
165
        this.setClassifyingFieldNames(new String[0]);
166
        this.setClassifyingFieldTypes(new int[0]);
167
    }
168

  
169
    public ISymbol getSymbolByFeature(Feature featu) {
170

  
171
        EvaluatorData evda = featu.getEvaluatorData();
172

  
173
        ISymbol returnSymbol = null;
174
        Object result = null;
175
        String expr = null;
176

  
177
        try {
178

  
179
            for (int i = 0; i < newSymbols.size(); i++) {
180

  
181
                Evaluator eval = newSymbols.get(i).getEvaluator();
182
                expr = eval.getSQL();
183

  
184
                if (expr.equalsIgnoreCase(VectorFilterExpressionLegend.I18N_DEFAULT)) {
185
                    /*
186
                     * Skip default item
187
                     */
188
                    continue;
189
                }
190

  
191
                result = eval.evaluate(evda);
192
                if (isConsideredTrue(result)) {
193
                    returnSymbol = newSymbols.get(i).sym;
194
                    if (returnSymbol != null) {
195
                        return returnSymbol;
196
                    }
197
                }
198
            }
199
        } catch (Exception e) {
200

  
201
            if (error_msg_count % 1000 == 0) {
202
                I18nManager i18n = ToolsLocator.getI18nManager();
203
                String s;
204
                try{
205
                    s = featu.toJson().toString().replace("\n", " ");
206
                } catch (Throwable t) {
207
                    s=featu.toString();
208
                }
209
                logger.info("Error (msg every 1000 occurrences) while getting symbol in VectorFilterExpressionLegend Expression = ["+expr+"], Feature = ["+s+"]", e);
210
                error_msg_count = 0;
211
                ApplicationLocator.getManager().message(
212
                        i18n.getTranslation("_Error_in_expressions_legend")+
213
                                ". "+
214
                        i18n.getTranslation("_see_error_log_for_more_information")
215
                        , JOptionPane.WARNING_MESSAGE);
216
            }
217
            error_msg_count++;
218
            
219
            return getDefaultSymbol();
220
        }
221

  
222
        if (useDefaultSymbol) {
223
            return getDefaultSymbol();
224
        }
225

  
226
        return null;
227
    }
228

  
229
    /**
230
     * Tells whether the input object is considered true. Basically, it is false
231
     * if it has an empty value (FALSE, null, 0, "")
232
     *
233
     * @param result
234
     * @return
235
     */
236
    private boolean isConsideredTrue(Object res) {
237

  
238
        if (res == null) {
239
            return false;
240
        }
241

  
242
        if (res instanceof Boolean) {
243
            return ((Boolean) res).booleanValue();
244
        }
245

  
246
        if (res instanceof Number) {
247
            return ((Number) res).doubleValue() != 0d;
248
        }
249

  
250
        if (res instanceof String) {
251
            return ((String) res).length() > 0;
252
        }
253

  
254
        // Because it is not null
255
        return true;
256
    }
257

  
258
    public void addSymbol(Object key, ISymbol symbol) {
259
        newSymbols.add(new Item((String) key.toString(),
260
                symbol));
261
    }
262

  
263
    public void clear() {
264
        newSymbols.clear();
265
    }
266

  
267
    public void resetItems() {
268
        newSymbols = new ArrayList<Item>() {
269
            private static final long serialVersionUID = 1L;
270

  
271
            public int indexOf(String expr) {
272
                return super.indexOf(new Item(expr, null));
273
            }
274
        };
275
    }
276

  
277
    public void delSymbol(Object key) {
278
        ISymbol mySymbol = null;
279
        for (int i = 0; i < newSymbols.size(); i++) {
280
            if (newSymbols.get(i).evaluator.getSQL().equals(key)) {
281
                newSymbols.remove(i);
282
            }
283
        }
284
        fireClassifiedSymbolChangeEvent(new SymbolLegendEvent(mySymbol, null));
285
    }
286

  
287
    public void replace(ISymbol oldSymbol, ISymbol newSymbol) {
288

  
289
        for (int i = 0; i < newSymbols.size(); i++) {
290
            if (newSymbols.get(i).sym.equals(oldSymbol)) {
291
                newSymbols.get(i).sym = newSymbol;
292
            }
293
        }
294

  
295
        fireClassifiedSymbolChangeEvent(new SymbolLegendEvent(oldSymbol, newSymbol));
296
    }
297

  
298
    public String[] getDescriptions() {
299
        String[] descriptions = new String[newSymbols.size()];
300
        ISymbol[] auxSym = getSymbols();
301

  
302
        for (int i = 0; i < descriptions.length; i++) {
303
            descriptions[i] = auxSym[i].getDescription();
304
        }
305

  
306
        return descriptions;
307
    }
308

  
309
    public ISymbol[] getSymbols() {
310

  
311
        if (newSymbols != null) {
312
            ISymbol[] mySymbols = new ISymbol[newSymbols.size()];
313
            for (int i = 0; i < newSymbols.size(); i++) {
314
                mySymbols[i] = newSymbols.get(i).sym;
315
            }
316
            return mySymbols;
317
        }
318
        return null;
319
    }
320

  
321
    public ISymbol getDefaultSymbol() {
322
        if (defaultSymbol == null) {
323

  
324
            defaultSymbol = MapContextLocator.getSymbolManager().createSymbol(shapeType);
325
            fireDefaultSymbolChangedEvent(new SymbolLegendEvent(null, defaultSymbol));
326
        }
327
        return defaultSymbol;
328
    }
329

  
330
    public String getClassName() {
331
        return getClass().getName();
332
    }
333

  
334
    public int getShapeType() {
335
        return shapeType;
336
    }
337

  
338
    public boolean isUseDefaultSymbol() {
339
        return useDefaultSymbol;
340
    }
341

  
342
    public void setDefaultSymbol(ISymbol s) throws IllegalArgumentException {
343
        if (s == null) {
344
            throw new NullPointerException("Default symbol cannot be null");
345
        }
346
        ISymbol old = defaultSymbol;
347
        defaultSymbol = s;
348
        fireDefaultSymbolChangedEvent(new SymbolLegendEvent(old, defaultSymbol));
349
    }
350

  
351
    public void setShapeType(int shapeType) {
352
        if (this.shapeType != shapeType) {
353

  
354
            ISymbol sym = MapContextLocator.getSymbolManager().createSymbol(shapeType);
355
            setDefaultSymbol(sym);
356
            this.shapeType = shapeType;
357
        }
358
    }
359

  
360
    public void useDefaultSymbol(boolean b) {
361
        useDefaultSymbol = b;
362
    }
363

  
364
    public Object[] getValues() {
365
        if (newSymbols != null) {
366
            Object[] myObjects = new Object[newSymbols.size()];
367
            for (int i = 0; i < newSymbols.size(); i++) {
368
                myObjects[i] = newSymbols.get(i).getStringExpression();
369
            }
370
            return myObjects;
371
        }
372
        return null;
373
    }
374

  
375
    public static boolean isPolygonal(int ty) {
376
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
377
        return geomManager.isSubtype(Geometry.TYPES.MULTISURFACE, ty)
378
                || geomManager.isSubtype(Geometry.TYPES.SURFACE, ty);
379
    }
380

  
381
    public static boolean isLinear(int ty) {
382
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
383
        return geomManager.isSubtype(Geometry.TYPES.MULTICURVE, ty)
384
                || geomManager.isSubtype(Geometry.TYPES.CURVE, ty);
385
    }
386

  
387
    public static boolean isPoint(int ty) {
388
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
389
        return geomManager.isSubtype(Geometry.TYPES.MULTIPOINT, ty)
390
                || geomManager.isSubtype(Geometry.TYPES.POINT, ty);
391
    }
392

  
393
    public void removeDefaultSymbol() {
394

  
395
    }
396

  
397
    // =============================
398
    public static class RegisterPersistence implements Callable {
399

  
400
        public Object call() throws Exception {
401

  
402
            PersistenceManager manager = ToolsLocator.getPersistenceManager();
403
            if (manager.getDefinition(
404
                    FILTER_EXPRESSION_LEGEND_PERSISTENCE_DEFINITION_NAME) == null) {
405
                DynStruct definition = manager
406
                        .addDefinition(VectorFilterExpressionLegend.class,
407
                                FILTER_EXPRESSION_LEGEND_PERSISTENCE_DEFINITION_NAME,
408
                                FILTER_EXPRESSION_LEGEND_PERSISTENCE_DEFINITION_NAME
409
                                + " Persistence definition", null, null);
410

  
411
                definition.extend(manager.getDefinition(
412
                        AbstractClassifiedVectorLegend.CLASSIFIED_VECTOR_LEGEND_PERSISTENCE_DEFINITION_NAME));
413

  
414
                definition.addDynFieldBoolean("useDefaultSymbol")
415
                        .setMandatory(true);
416
                definition.addDynFieldObject("defaultSymbol")
417
                        .setClassOfValue(ISymbol.class).setMandatory(true);
418
                definition.addDynFieldInt("shapeType")
419
                        .setMandatory(true);
420

  
421
                definition.addDynFieldArray("itemSymbolArray")
422
                        .setClassOfItems(ISymbol.class);
423
                definition.addDynFieldArray("itemStringArray")
424
                        .setClassOfItems(String.class);
425

  
426
            }
427
            return Boolean.TRUE;
428
        }
429

  
430
    }
431

  
432
    public static class RegisterLegend implements Callable {
433

  
434
        public Object call() throws Exception {
435
            MapContextManager manager
436
                    = MapContextLocator.getMapContextManager();
437

  
438
            manager.registerLegend(
439
                    FILTER_EXPRESSION_LEGEND_NAME,
440
                    VectorFilterExpressionLegend.class);
441

  
442
            return Boolean.TRUE;
443
        }
444

  
445
    }
446

  
447
    public void saveToState(PersistentState state) throws PersistenceException {
448

  
449
        super.saveToState(state);
450
        state.set("useDefaultSymbol", this.isUseDefaultSymbol());
451
        state.set("defaultSymbol", this.getDefaultSymbol());
452
        state.set("shapeType", this.getShapeType());
453

  
454
        ISymbol[] syms = this.getSymbols();
455
        if (syms == null) {
456
            syms = new ISymbol[0];
457
        }
458
        Object[] vals = this.getValues();
459
        String[] vals_str = null;
460
        if (vals == null) {
461
            vals_str = new String[0];
462
        } else {
463
            vals_str = new String[vals.length];
464
            for (int i = 0; i < vals.length; i++) {
465
                String aux = ((vals[i] == null) ? null : vals[i].toString());
466
                // Prevents saving localized version of 'Default'
467
                aux = translateDefault(aux, false);
468
                vals_str[i] = aux;
469
            }
470
        }
471

  
472
        state.set("itemSymbolArray", syms);
473
        state.set("itemStringArray", vals_str);
474

  
475
    }
476

  
477
    public void loadFromState(PersistentState state)
478
            throws PersistenceException {
479

  
480
        super.loadFromState(state);
481

  
482
        this.setShapeType(state.getInt("shapeType"));
483
        Boolean b = state.getBoolean("useDefaultSymbol");
484
        this.useDefaultSymbol(b);
485
        ISymbol defsym = (ISymbol) state.get("defaultSymbol");
486
        this.setDefaultSymbol(defsym);
487

  
488
        String[] strs = state.getStringArray("itemStringArray");
489
        ISymbol[] syms = (ISymbol[]) state.getArray("itemSymbolArray",
490
                ISymbol.class);
491

  
492
        if (strs.length != syms.length) {
493
            logger.info("VectorFilterExpressionLegend - load state - Different size in arrays: " + strs.length + ", " + syms.length);
494
        }
495
        int nmin = Math.min(strs.length, syms.length);
496
        for (int i = 0; i < nmin; i++) {
497
            String aux = strs[i];
498
            aux = translateDefault(aux, true);
499
            this.addSymbol(aux, syms[i]);
500
        }
501
    }
502

  
503
    /**
504
     * Utility method to (un)translate the word 'Default'
505
     *
506
     * @param aux
507
     * @param forward If TRUE, then translate (Default -> Por defecto) If FALSE
508
     * then untranslate (Por defecto -> Default)
509
     * @return
510
     */
511
    private String translateDefault(String aux, boolean forward) {
512

  
513
        if (aux == null) {
514
            return null;
515
        }
516
        if (forward && aux.compareTo(NON_I18N_DEFAULT) == 0) {
517
            return I18N_DEFAULT;
518
        }
519
        if (!forward && aux.compareTo(I18N_DEFAULT) == 0) {
520
            return NON_I18N_DEFAULT;
521
        }
522
        return aux;
523
    }
524

  
525
    public Object clone() throws CloneNotSupportedException {
526

  
527
        VectorFilterExpressionLegend resp
528
                = (VectorFilterExpressionLegend) super.clone();
529

  
530
        Object[] vals = this.getValues();
531
        ISymbol[] syms = this.getSymbols();
532
        if (vals != null && syms != null) {
533

  
534
            resp.resetItems();
535

  
536
            int n = Math.min(vals.length, syms.length);
537
            for (int i = 0; i < n; i++) {
538
                resp.addSymbol(
539
                        vals[i],
540
                        (ISymbol) syms[i].clone());
541
            }
542
        }
543
        ISymbol sym = this.getDefaultSymbol();
544
        sym = (ISymbol) sym.clone();
545
        resp.setDefaultSymbol(sym);
546
        return resp;
547
    }
548

  
549
    public static void selfRegister() {
550
        Caller caller = new DefaultCaller();
551

  
552
        caller.add(new VectorFilterExpressionLegend.RegisterLegend());
553
        caller.add(new VectorFilterExpressionLegend.RegisterPersistence());
554

  
555
        if (!caller.call()) {
556
            throw new RuntimeException(
557
                    "Can't register VectorFilterExpressionLegend",
558
                    caller.getException()
559
            );
560
        }
561
        MapContextManager mcoman = MapContextLocator.getMapContextManager();
562
        mcoman.registerLegendWriter(
563
                VectorFilterExpressionLegend.class,
564
                SymbolManager.LEGEND_FILE_EXTENSION.substring(1),
565
                PersistenceBasedLegendWriter.class);
566

  
567
    }
568

  
569
    @Override
570
    protected void drawFeatures(BufferedImage image, Graphics2D g, ViewPort viewPort, Cancellable cancel, ICoordTrans coordTrans, double dpi, DefaultFeatureDrawnNotification drawnNotification, FeatureSet featureSet, FeatureSelection selection) throws BaseException {
571
        error_msg_count = 0;
572
        super.drawFeatures(image, g, viewPort, cancel, coordTrans, dpi, drawnNotification, featureSet, selection); //To change body of generated methods, choose Tools | Templates.
573
    }
574
    
575
    
576

  
577
}
org.gvsig.legend.vectorfilterexpression.app.mainplugin/tags/org.gvsig.legend.vectorfilterexpression.app.mainplugin-1.0.224/src/main/java/org/gvsig/symbology/gui/layerproperties/VectorFilterExpressionPanel.java
1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2020 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.symbology.gui.layerproperties;
25

  
26
import java.awt.BorderLayout;
27
import java.awt.Dimension;
28
import java.awt.event.ActionEvent;
29
import java.awt.event.ActionListener;
30
import java.io.File;
31
import java.io.IOException;
32
import java.util.ArrayList;
33
import java.util.List;
34

  
35
import javax.swing.BoxLayout;
36
import javax.swing.ImageIcon;
37
import javax.swing.JButton;
38
import javax.swing.JCheckBox;
39
import javax.swing.JOptionPane;
40
import javax.swing.JPanel;
41
import org.apache.commons.lang3.StringUtils;
42

  
43
import org.slf4j.Logger;
44
import org.slf4j.LoggerFactory;
45

  
46
import org.gvsig.andami.IconThemeHelper;
47
import org.gvsig.app.ApplicationLocator;
48
import org.gvsig.app.project.documents.view.legend.gui.Categories;
49
import org.gvsig.app.project.documents.view.legend.gui.ILegendPanel;
50
import org.gvsig.app.project.documents.view.legend.gui.JSymbolPreviewButton;
51
import org.gvsig.app.project.documents.view.legend.gui.SymbolTable;
52
import org.gvsig.fmap.dal.exception.ReadException;
53
import org.gvsig.fmap.dal.feature.Feature;
54
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
55
import org.gvsig.fmap.dal.feature.FeatureStore;
56
import org.gvsig.fmap.dal.feature.FeatureType;
57
import org.gvsig.fmap.mapcontext.layers.FLayer;
58
import org.gvsig.fmap.mapcontext.layers.operations.ClassifiableVectorial;
59
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
60
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
61
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
62
import org.gvsig.gui.beans.swing.GridBagLayoutPanel;
63
import org.gvsig.gui.beans.swing.JBlank;
64
import org.gvsig.i18n.Messages;
65
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.fill.impl.PictureFillSymbol;
66
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.style.IMarkerFillPropertiesStyle;
67
import org.gvsig.symbology.fmap.rendering.VectorFilterExpressionLegend;
68
import org.gvsig.symbology.swing.SymbologySwingLocator;
69
import org.gvsig.tools.ToolsLocator;
70
import org.gvsig.tools.i18n.I18nManager;
71
import org.gvsig.tools.swing.api.ToolsSwingLocator;
72
import org.gvsig.tools.swing.api.usability.UsabilitySwingManager;
73
import org.gvsig.tools.swing.api.windowmanager.Dialog;
74
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
75
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
76

  
77
/**
78
 * Implements the JPanel that shows the properties of a
79
 * VectorialFilterExpressionLegend
80
 * in order to allows the user to modify its characteristics
81
 *
82
 * @author gvSIG Team
83
 *
84
 */
85
public class VectorFilterExpressionPanel extends JPanel
86
implements ILegendPanel, ActionListener {
87

  
88
    private static final Logger logger = LoggerFactory.getLogger(
89
        VectorFilterExpressionPanel.class);
90

  
91
	private static final long serialVersionUID = -7187473609965942511L;
92
	private VectorFilterExpressionLegend theLegend;
93
	private VectorFilterExpressionLegend auxLegend;
94
	private ClassifiableVectorial layer;
95
	private PictureFillSymbol previewSymbol;
96
	private JPanel pnlCenter;
97
	private JPanel pnlMovBut;
98
	private SymbolTable symbolTable;
99
	private JButton btnAddExpression;
100
//	private JButton btnModExpression;
101
	private JButton btnRemoveExpression;
102
	private JButton moveUp;
103
	private JButton moveDown;
104
	private int shapeType;
105
	protected JCheckBox chkdefaultvalues = null;
106
	protected JSymbolPreviewButton defaultSymbolPrev;
107
	private GridBagLayoutPanel defaultSymbolPanel = new GridBagLayoutPanel();
108
	private UsabilitySwingManager usabilitySwingManager = ToolsSwingLocator.getUsabilitySwingManager();
109

  
110
	/**
111
	 * This is the default constructor
112
	 */
113
	public VectorFilterExpressionPanel() {
114
		super();
115
		initialize();
116
	}
117

  
118

  
119
	/**
120
	 * This method initializes this
121
	 */
122
	private void initialize() {
123

  
124
		pnlCenter = new JPanel();
125
		pnlCenter.setLayout(new BorderLayout());
126

  
127
		JPanel pnlButtons = new JPanel();
128
		btnAddExpression = usabilitySwingManager.createJButton(
129
		    Messages.getText("Anadir"));
130
		btnAddExpression.setActionCommand("NEW_EXPRESSION");
131
		btnAddExpression.addActionListener(this);
132
		pnlButtons.add(btnAddExpression);
133

  
134
//		btnModExpression = usabilitySwingManager.createJButton(
135
//		    Messages.getText("modify_filter_expression"));
136
//		btnModExpression.setActionCommand("MODIFY_EXPRESSION");
137
//		btnModExpression.addActionListener(this);
138
//		pnlButtons.add(btnModExpression);
139

  
140
		btnRemoveExpression = usabilitySwingManager.createJButton(
141
		    Messages.getText("Quitar"));
142
		btnRemoveExpression.setActionCommand("REMOVE");
143
		btnRemoveExpression.addActionListener(this);
144
		pnlButtons.add(btnRemoveExpression);
145
		defaultSymbolPanel.add(getChkDefaultvalues());
146
		pnlCenter.add(defaultSymbolPanel,BorderLayout.NORTH);
147

  
148
		this.setLayout(new BorderLayout());
149
		this.add(pnlCenter, BorderLayout.CENTER);
150
		this.add(pnlButtons, BorderLayout.SOUTH);
151

  
152

  
153
	}
154
	public void getDefaultSymbolPrev(int shapeType) {
155
		if(defaultSymbolPrev == null){
156
			defaultSymbolPrev = new JSymbolPreviewButton(shapeType);
157
			defaultSymbolPrev.setPreferredSize(new Dimension(110,20));
158
			defaultSymbolPanel.add(defaultSymbolPrev,null);
159
		}
160
	}
161

  
162
	public String getDescription() {
163
		return Messages.getText(
164
		    "shows_the_elements_of_the_layer_depending_on_the_value_of_a_filter_expression") + ".";
165
	}
166

  
167
	public ISymbol getIconSymbol() {
168
		if (previewSymbol == null) {
169
			try {
170
				previewSymbol = new PictureFillSymbol();
171
				previewSymbol.setImage( new File(
172
						this.getClass().getClassLoader().
173
						getResource("images" + File.separator
174
						    + "legend" + File.separator
175
						    + "legend-overview-vectorial-unique-value.png").
176
						getFile()).toURI().toURL());
177
				previewSymbol.getMarkerFillProperties().
178
				setFillStyle(
179
						IMarkerFillPropertiesStyle.SINGLE_CENTERED_SYMBOL);
180
			} catch (IOException e) {
181
				return null;
182
			}
183
		}
184
		return previewSymbol;
185
	}
186

  
187
	public ILegend getLegend() {
188
		auxLegend.clear();
189
		fillSymbolListFromTable();
190

  
191
		theLegend = (VectorFilterExpressionLegend) auxLegend.cloneLegend();
192
		if(defaultSymbolPrev.getSymbol() != null)
193
			theLegend.setDefaultSymbol(defaultSymbolPrev.getSymbol());
194

  
195
		theLegend.useDefaultSymbol(chkdefaultvalues.isSelected());
196
		return theLegend;
197
	}
198
	/**
199
	 * Fills the list of symbols of the legend
200
	 *
201
	 */
202
	private void fillSymbolListFromTable() {
203
		Object clave;
204
		ISymbol theSymbol;
205

  
206
		FLyrVect m = (FLyrVect) layer;
207
		try {
208

  
209
			if(auxLegend.getClassifyingFieldNames() != null) {
210
				String[] fNames= auxLegend.getClassifyingFieldNames();
211
				int[] fieldTypes  = new int[auxLegend.getClassifyingFieldNames().length];
212

  
213
				FeatureStore fsto = (FeatureStore) m.getDataStore();
214
				FeatureType fty = fsto.getDefaultFeatureType();
215

  
216
				for (int i = 0; i < fNames.length; i++) {
217
					fieldTypes[i] = fty.getAttributeDescriptor(fNames[i]).getType();
218
				}
219

  
220
				auxLegend.setClassifyingFieldTypes(fieldTypes);
221
			}
222
		} catch (Exception e) {
223

  
224
		}
225

  
226
		auxLegend.useDefaultSymbol(chkdefaultvalues.isSelected());
227

  
228
		for (int row = 0; row < symbolTable.getRowCount(); row++) {
229
			clave =  symbolTable.getFieldValue(row, 1);
230
			theSymbol = (ISymbol) symbolTable.getFieldValue(row, 0);
231
			theSymbol.setDescription((String) symbolTable.getFieldValue(row, 2));
232
			auxLegend.addSymbol(clave, theSymbol);
233
		}
234
		if(chkdefaultvalues.isSelected()){
235
			if(defaultSymbolPrev.getSymbol() != null){
236
				String description = VectorFilterExpressionLegend.I18N_DEFAULT;
237
				defaultSymbolPrev.getSymbol().setDescription(description);
238
				auxLegend.addSymbol(
239
				    description, defaultSymbolPrev.getSymbol());
240
			}
241
		}
242

  
243
	}
244

  
245
	public Class<VectorFilterExpressionLegend> getLegendClass() {
246
		return VectorFilterExpressionLegend.class;
247
	}
248

  
249
	public JPanel getPanel() {
250
		return this;
251
	}
252

  
253
	public Class<Categories> getParentClass() {
254
		return Categories.class;
255
	}
256

  
257
	public String getTitle() {
258
		return Messages.getText("expressions");
259
	}
260

  
261
	public boolean isSuitableFor(FLayer layer) {
262
		FLyrVect lVect = (FLyrVect) layer;
263
		try {
264
			return
265
			    VectorFilterExpressionLegend.isPoint(lVect.getShapeType())
266
			    ||
267
                VectorFilterExpressionLegend.isLinear(lVect.getShapeType())
268
                ||
269
                VectorFilterExpressionLegend.isPolygonal(lVect.getShapeType());
270
		} catch (Exception e) {
271
			return false;
272
		}
273

  
274
	}
275

  
276
	public void setData(FLayer lyr, ILegend legend) {
277
		this.layer = (ClassifiableVectorial) lyr;
278
		shapeType = 0;
279

  
280
		try {
281
			shapeType = this.layer.getGeometryType().getType();
282
		} catch (ReadException e) {
283
		    logger.info("Error while getting layer shp type", e);
284
		    ApplicationLocator.getManager().message(
285
		        Messages.getText("generating_intervals"),
286
		        JOptionPane.ERROR_MESSAGE);
287
		}
288

  
289
		if (symbolTable != null)
290
			pnlCenter.remove(symbolTable);
291
		if (pnlMovBut != null)
292
			pnlCenter.remove(pnlMovBut);
293

  
294
		getDefaultSymbolPrev(shapeType);
295

  
296
		symbolTable = new SymbolTable(this, "expressions", shapeType);
297
    try {
298
      ExpressionFieldCellEditor cellEditor = new ExpressionFieldCellEditor(
299
              ((FLyrVect)layer).getFeatureStore()
300
      );
301
      symbolTable.setCellEditor(cellEditor);
302
    } catch(Exception ex) {
303
      
304
    }
305
		pnlCenter.add(symbolTable, BorderLayout.CENTER);
306
		pnlCenter.add(getPnlMovBut(),BorderLayout.EAST);
307

  
308

  
309
		if (legend instanceof VectorFilterExpressionLegend) {
310

  
311
            auxLegend = (VectorFilterExpressionLegend) legend.cloneLegend();
312
            if (auxLegend.isUseDefaultSymbol()) {
313
                // Default must not be in table
314
                fillTableSkipDefault(auxLegend);
315
            } else {
316
                symbolTable.fillTableFromSymbolList(
317
                    auxLegend.getSymbols(),
318
                    auxLegend.getValues(),
319
                    auxLegend.getDescriptions());
320
            }
321

  
322

  
323
		} else {
324
			auxLegend = new VectorFilterExpressionLegend();
325
			auxLegend.setShapeType(shapeType);
326
		}
327
		defaultSymbolPrev.setSymbol(auxLegend.getDefaultSymbol());
328
		getChkDefaultvalues().setSelected(auxLegend.isUseDefaultSymbol());
329
	}
330

  
331
	private JPanel getPnlMovBut() {
332
		if(pnlMovBut == null){
333
			pnlMovBut = new JPanel();
334
			pnlMovBut.setLayout(new BoxLayout(pnlMovBut, BoxLayout.Y_AXIS));
335
			pnlMovBut.add(new JBlank(1, 70));
336
			ImageIcon ico = IconThemeHelper.getImageIcon(
337
			    "symbol-layer-move-up");
338
			moveUp = usabilitySwingManager.createJButton(ico);
339
			pnlMovBut.add(moveUp);
340
			moveUp.setSize(new Dimension(15,15));
341
			pnlMovBut.add(new JBlank(1,10));
342
			ico = IconThemeHelper.getImageIcon(
343
                "symbol-layer-move-down");
344
			moveDown = usabilitySwingManager.createJButton(ico);
345
			pnlMovBut.add(moveDown);
346
			pnlMovBut.add(new JBlank(1, 70));
347
			moveDown.setActionCommand("MOVE-DOWN");
348
			moveUp.setActionCommand("MOVE-UP");
349
			moveDown.addActionListener(this);
350
			moveUp.addActionListener(this);
351
		}
352
		return pnlMovBut;
353
	}
354

  
355
	public void actionPerformed(ActionEvent e) {
356

  
357
		int[] indices = null;
358
		Feature dummyFeat = null;
359

  
360
		if(e.getActionCommand() == "MOVE-UP" || e.getActionCommand() == "MOVE-DOWN"){
361
			indices = symbolTable.getSelectedRows();
362
		}
363

  
364
		if(e.getActionCommand() == "MOVE-UP"){
365
			if (indices.length>0) {
366
				int classIndex = indices[0];
367
				int targetPos = Math.max(0, classIndex-1);
368
				symbolTable.moveUpRows(classIndex, targetPos,indices.length);
369
			}
370
		}
371

  
372
		if(e.getActionCommand() == "MOVE-DOWN"){
373
			if (indices.length>0) {
374
				int classIndex = indices[indices.length-1];
375
				int targetPos = Math.min(symbolTable.getRowCount()-1, classIndex+1);
376
				symbolTable.moveDownRows(classIndex, targetPos,indices.length);
377
			}
378
		}
379

  
380
		if(e.getActionCommand() == "MOVE-UP" || e.getActionCommand() == "MOVE-DOWN"){
381
			ArrayList<String> orders = new ArrayList<String>();
382

  
383
			for (int i = 0; i < symbolTable.getRowCount(); i++) {
384
				orders.add(symbolTable.getFieldValue(i,1).toString());
385
			}
386
      
387
		} if (e.getActionCommand() == "NEW_EXPRESSION") {
388

  
389
		    FLyrVect vect = (FLyrVect) layer;
390
		    final FeatureStore fsto = vect.getFeatureStore();
391
		    final FeatureType fty = fsto.getDefaultFeatureTypeQuietly();
392
		    final int shptype = fty.getDefaultGeometryAttribute().getGeomType().getType();
393
        final I18nManager i18n = ToolsLocator.getI18nManager();
394
        final ExpressionSymbolPanel esp = new ExpressionSymbolPanel(fsto, shptype, previewSymbol);
395
        final WindowManager_v2 windowManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
396
        final Dialog dialog = windowManager.createDialog(
397
              esp,
398
              i18n.getTranslation("expression_creator"),
399
              "",
400
              WindowManager_v2.BUTTONS_OK_CANCEL
401
        );
402
        dialog.addActionListener((ActionEvent e1) -> {
403
          if( dialog.getAction()!=WindowManager_v2.BUTTON_OK ) {
404
            return;
405
          }
406
          String expr = esp.getExpression();
407
          if ( StringUtils.isBlank(expr) ) {
408
              ApplicationLocator.getManager().messageDialog(
409
                  Messages.getText("error_validating_filter_query"),
410
                  Messages.getText("error"),
411
                  JOptionPane.ERROR_MESSAGE);
412
              return;
413
          }
414
          ISymbol sym = esp.getSymbol();
415
          this.addClassFieldNames(fty);
416

  
417
          auxLegend.addSymbol(expr, sym);
418
          symbolTable.removeAllItems();
419
          fillTableSkipDefault(auxLegend);
420

  
421
          repaint();
422
        });
423
        dialog.show(WindowManager.MODE.DIALOG);
424
//
425
//    }
426
//		else if (e.getActionCommand() == "MODIFY_EXPRESSION") {
427
//
428
//			if(symbolTable.getSelectedRowElements() == null) {
429
//				JOptionPane.showMessageDialog(this,
430
//				    Messages.getText("select_one_row")+".\n");
431
//			} else {
432
//
433
//		         FLyrVect vect = (FLyrVect) layer;
434
//		         FeatureStore fsto = (FeatureStore) vect.getDataStore();
435
//		         FeatureType fty = null;
436
//		         int shptype = 0;
437
//		         try {
438
//		             fty = fsto.getDefaultFeatureType();
439
//		             shptype = vect.getGeometryType().getType();
440
//		             dummyFeat = fsto.createNewFeature(true);
441
//		         } catch (Exception exc) {
442
//		             logger.error(Messages.getText(
443
//		                 "error_trying_to_access_to_the_layer"), exc);
444
//		             return;
445
//		         }
446
//
447
//		        ISymbol mySymbol = (ISymbol) symbolTable.getSelectedRowElements()[0];
448
//                String expression = (String) symbolTable.getSelectedRowElements()[1];
449
//
450
//                EvaluatorWithDescriptions evalu =
451
//                    EvaluatorCreator.getEvaluator(expression);
452
//
453
//                MDIManager mm = ApplicationLocator.getManager().getUIManager();
454
//                ExpressionSymbolPanel esp = new ExpressionSymbolPanel(
455
//                    dummyFeat, evalu, shptype, mySymbol);
456
//                mm.addCentredWindow(esp);
457
//	            /*
458
//	             * esp is modal
459
//	             */
460
//	            if (!esp.isOkPressed()) {
461
//	                return;
462
//	            }
463
//
464
//	            String expr = esp.getExpression();
465
//	            if (expr == null || expr.length() == 0) {
466
//	                ApplicationLocator.getManager().messageDialog(
467
//	                    Messages.getText("error_validating_filter_query"),
468
//	                    Messages.getText("error"),
469
//	                    JOptionPane.ERROR_MESSAGE);
470
//	                return;
471
//	            }
472
//
473
//	            ISymbol sym = esp.getSymbol();
474
////	            evalu = EvaluatorCreator.getEvaluator(expr);
475
//	            // Add all fields in the feature type
476
//	            this.addClassFieldNames(fty);
477
//
478
//	            // Remove old
479
//				auxLegend.delSymbol(expression);
480
//				auxLegend.addSymbol(expr, sym);
481
//				symbolTable.removeAllItems();
482
//				this.fillTableSkipDefault(auxLegend);
483
//
484
//				repaint();
485
//			}
486

  
487
    } else if (e.getActionCommand() == "REMOVE") {
488

  
489
			if(symbolTable.getSelectedRowElements() == null) {
490
				JOptionPane.showMessageDialog(this,
491
				    Messages.getText("select_one_row"));
492
			} else{
493
				String my_expr = (String) symbolTable.getSelectedRowElements()[1];
494
				auxLegend.delSymbol(my_expr);
495
				symbolTable.removeAllItems();
496
				fillTableSkipDefault(auxLegend);
497

  
498
				repaint();
499
			}
500
		}
501
	}
502

  
503

  
504
	private void addClassFieldNames(FeatureType ft) {
505

  
506
	    FeatureAttributeDescriptor[] atts = ft.getAttributeDescriptors();
507
	    String[] nn = new String[atts.length];
508
	    for (int i=0; i<atts.length; i++) {
509
	        nn[i] = atts[i].getName();
510
	    }
511
	    addClassFieldNames(nn);
512
	}
513
	/**
514
	 * Adds new classifying field names to the legend when a new expression is
515
	 * created or an existing one is modified
516
	 * @param fieldNamesExpression
517
	 */
518
	private void addClassFieldNames(String[] fieldNamesExpression) {
519
		boolean appears = false;
520
		ArrayList<String> myFieldNames = new ArrayList<String>();
521

  
522
		if (auxLegend.getClassifyingFieldNames() != null) {
523

  
524
			for (int i = 0; i < auxLegend.getClassifyingFieldNames().length; i++) {
525
				myFieldNames.add(auxLegend.getClassifyingFieldNames()[i]);
526
			}
527
			for (int i = 0; i < fieldNamesExpression.length; i++) {
528
				appears = false;
529
				for (int j = 0; j < auxLegend.getClassifyingFieldNames().length; j++) {
530
					if (auxLegend.getClassifyingFieldNames()[j].compareTo((String) fieldNamesExpression[i]) == 0)
531
						appears = true;
532
				}
533
				if(!appears) {
534
					myFieldNames.add((String) fieldNamesExpression[i]);
535
				}
536
			}
537

  
538
			auxLegend.setClassifyingFieldNames((String[])myFieldNames.toArray(new
539
					String[myFieldNames.size()]));
540
		}
541

  
542
		else {
543
			for (int i = 0; i < fieldNamesExpression.length; i++) {
544
				myFieldNames.add((String) fieldNamesExpression[i]);
545
			}
546
			auxLegend.setClassifyingFieldNames((String[])myFieldNames.toArray(new
547
					String[myFieldNames.size()]));
548
		}
549
	}
550

  
551

  
552
	public ImageIcon getIcon() {
553
	    ImageIcon ii = IconThemeHelper.getImageIcon(
554
	        "legend-overview-vector-filter-expression");
555
	    return ii;
556
	}
557

  
558
	/**
559
	 * This method initializes chkdefaultvalues
560
	 *
561
	 * @return javax.swing.JCheckBox
562
	 */
563
	protected JCheckBox getChkDefaultvalues() {
564
		if (chkdefaultvalues == null) {
565
			chkdefaultvalues = new JCheckBox();
566
			chkdefaultvalues.setText(Messages.getText("resto_valores")+": ");
567
			chkdefaultvalues.setBounds(new java.awt.Rectangle(342, 26, 141, 20));
568
			chkdefaultvalues.setSelected(false);
569
			chkdefaultvalues.addActionListener(new java.awt.event.ActionListener() {
570
				public void actionPerformed(java.awt.event.ActionEvent e) {
571
					if (chkdefaultvalues.isSelected()) {
572
						auxLegend.useDefaultSymbol(true);
573
					} else {
574
						auxLegend.useDefaultSymbol(false);
575
					}
576
				}
577
			});
578
		}
579

  
580
		return chkdefaultvalues;
581
	}
582

  
583
	private void fillTableSkipDefault(VectorFilterExpressionLegend leg) {
584

  
585
	    Object[] src_expr = leg.getValues();
586
	    List<Integer> rem_ind = new ArrayList<Integer>();
587
	    for (int i=0; i<src_expr.length; i++) {
588
	        if (VectorFilterExpressionLegend.I18N_DEFAULT.
589
	            compareToIgnoreCase((String) src_expr[i]) == 0) {
590
	            rem_ind.add(new Integer(i));
591
	        }
592
	    }
593
        ISymbol[] src_syms = leg.getSymbols();
594
        String[] src_descs = leg.getDescriptions();
595
        // Object[] src_expr
596

  
597
        List<ISymbol> syms = new ArrayList<ISymbol>();
598
        List<Object> vals = new ArrayList<Object>();
599
        List<String> descs = new ArrayList<String>();
600
        for (int i=0; i<src_expr.length; i++) {
601
            if (!isIn(i, rem_ind)) {
602
                syms.add(src_syms[i]);
603
                vals.add(src_expr[i]);
604
                descs.add(src_descs[i]);
605
            }
606
        }
607
	    symbolTable.fillTableFromSymbolList(
608
	        (ISymbol[]) syms.toArray(new ISymbol[0]),
609
            (Object[]) vals.toArray(new Object[0]),
610
            (String[]) descs.toArray(new String[0]));
611
      doUpdateCellEditor();
612
	}
613

  
614
  private void doUpdateCellEditor() {
615
      try {
616
        ExpressionFieldCellEditor cellEditor = new ExpressionFieldCellEditor(
617
                ((FLyrVect)layer).getFeatureStore()
618
        );
619
        symbolTable.setCellEditor(cellEditor);
620
      } catch(Exception ex) {
621
        logger.debug("Can't update cell editors",ex);
622
      }    
623
  }
624

  
625
    /**
626
     * @param i
627
     * @param rem_ind
628
     * @return
629
     */
630
    private boolean isIn(int n, List<Integer> int_list) {
631

  
632
        if (int_list == null || int_list.size() == 0) {
633
            return false;
634
        }
635

  
636
        for (int i=0; i<int_list.size(); i++) {
637
            if (int_list.get(i) instanceof Integer) {
638
                Integer item = (Integer) int_list.get(i);
639
                if (item.intValue() == n) {
640
                    return true;
641
                }
642
            }
643
        }
644
        return false;
645
    }
646

  
647
    public static void selfRegister() {
648
        IconThemeHelper.registerIcon("legend","legend-overview-vector-filter-expression", VectorFilterExpressionPanel.class);
649
        IconThemeHelper.registerIcon("legend","legend-overview-vectorial-unique-value", VectorFilterExpressionPanel.class);
650
        IconThemeHelper.registerIcon("symbol","symbol-layer-move-down", VectorFilterExpressionPanel.class);
651
        IconThemeHelper.registerIcon("symbol","symbol-layer-move-up", VectorFilterExpressionPanel.class);
652
        
653
        
654
        SymbologySwingLocator.getSwingManager().registerLegendEditor(VectorFilterExpressionPanel.class);
655

  
656
//        SymbologySwingLocator.getSwingManager().registerLegendEditor(VectorFilterExpressionPanel2.class);
657

  
658
        
659
        
660
        SymbolTable.addNewCellEditor("expressions",
661
            new ExpressionFieldCellEditor(null));
662
      
663
    }
664
}
org.gvsig.legend.vectorfilterexpression.app.mainplugin/tags/org.gvsig.legend.vectorfilterexpression.app.mainplugin-1.0.224/src/main/java/org/gvsig/symbology/gui/layerproperties/ExpressionFieldCellEditor.java
1
/* 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 progra/**
11
 * gvSIG. Desktop Geographic Information System.
12
 *
13
 * Copyright (C) 2007-2020 gvSIG Association.
14
 *
15
 * This program is free software; you can redistribute it and/or
16
 * modify it under the terms of the GNU General Public License
17
 * as published by the Free Software Foundation; either version 3
18
 * of the License, or (at your option) any later version.
19
 *
20
 * This program is distributed in the hope that it will be useful,
21
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23
 * GNU General Public License for more details.
24
 *
25
 * You should have received a copy of the GNU General Public License
26
 * along with this program; if not, write to the Free Software
27
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
28
 * MA  02110-1301, USA.
29
 *
30
 * For any additional information, do not hesitate to contact us
31
 * at info AT gvsig.com, or visit our website www.gvsig.com.
32
 */
33
package org.gvsig.symbology.gui.layerproperties;
34

  
35
import java.awt.Component;
36
import javax.swing.AbstractCellEditor;
37

  
38
import javax.swing.JTable;
39
import javax.swing.table.TableCellEditor;
40
import org.gvsig.expressionevaluator.Expression;
41
import org.gvsig.expressionevaluator.ExpressionUtils;
42
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
43
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
44
import org.gvsig.expressionevaluator.swing.JExpressionPicker;
45
import org.gvsig.fmap.dal.feature.FeatureStore;
46
import org.gvsig.fmap.dal.swing.DALSwingLocator;
47
import org.gvsig.fmap.dal.swing.DataSwingManager;
48

  
49
/**
50
 * Cell Editor for expressions. It controls the edition events in an expression
51
 * column of the table
52
 *
53
 * @author gvSIG Team
54
 */
55
public class ExpressionFieldCellEditor 
56
        extends AbstractCellEditor
57
        implements TableCellEditor 
58
  {
59

  
60
  private final JExpressionPicker picker;
61

  
62
	public ExpressionFieldCellEditor(FeatureStore store) {
63
    ExpressionEvaluatorSwingManager manager = ExpressionEvaluatorSwingLocator.getManager();
64
    this.picker = manager.createJExpressionPicker();
65
    if( store != null ) {
66
      DataSwingManager dataSwingManager = DALSwingLocator.getManager();    
67
      dataSwingManager.configureExpressionBuilder(picker.getConfig(), store);  
68
    }
69
	}
70

  
71
  @Override
72
  public Object getCellEditorValue() {
73
    Expression value = this.picker.getExpression();
74
    if( value == null ) {
75
      return null;
76
    }
77
    return value.getPhrase();
78
  }
79

  
80
  @Override
81
  public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
82
    if( value instanceof String ) {
83
      this.picker.setExpression(ExpressionUtils.createExpression((String) value));
84
    } else {
85
      this.picker.setExpression(null);
86
    }
87
    return this.picker.asJComponent();
88
  }
89

  
90

  
91
}
org.gvsig.legend.vectorfilterexpression.app.mainplugin/tags/org.gvsig.legend.vectorfilterexpression.app.mainplugin-1.0.224/src/main/java/org/gvsig/symbology/gui/layerproperties/VectorFilterExpressionPanel2.java
1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2020 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.symbology.gui.layerproperties;
25

  
26
import java.awt.event.ActionEvent;
27
import java.io.File;
28
import java.io.IOException;
29
import java.net.URL;
30
import java.util.ArrayList;
31
import java.util.Arrays;
32
import java.util.List;
33

  
34
import javax.swing.ImageIcon;
35
import javax.swing.JOptionPane;
36
import javax.swing.JPanel;
37
import org.apache.commons.lang3.StringUtils;
38

  
39
import org.slf4j.Logger;
40
import org.slf4j.LoggerFactory;
41

  
42
import org.gvsig.andami.IconThemeHelper;
43
import org.gvsig.app.ApplicationLocator;
44
import org.gvsig.app.project.documents.view.legend.gui.Categories;
45
import org.gvsig.app.project.documents.view.legend.gui.ILegendPanel;
46
import org.gvsig.app.project.documents.view.legend.gui.SymbolTable;
47
import org.gvsig.fmap.dal.exception.ReadException;
48
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
49
import org.gvsig.fmap.dal.feature.FeatureStore;
50
import org.gvsig.fmap.dal.feature.FeatureType;
51
import org.gvsig.fmap.mapcontext.layers.FLayer;
52
import org.gvsig.fmap.mapcontext.layers.operations.ClassifiableVectorial;
53
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
54
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
55
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
56
import org.gvsig.i18n.Messages;
57
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.fill.impl.PictureFillSymbol;
58
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.style.IMarkerFillPropertiesStyle;
59
import org.gvsig.symbology.fmap.rendering.VectorFilterExpressionLegend;
60
import org.gvsig.symbology.swing.SymbologySwingLocator;
61
import org.gvsig.tools.ToolsLocator;
62
import org.gvsig.tools.i18n.I18nManager;
63
import org.gvsig.tools.swing.api.ToolsSwingLocator;
64
import org.gvsig.tools.swing.api.ToolsSwingManager;
65
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
66
import org.gvsig.tools.swing.api.windowmanager.Dialog;
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff