Revision 1430

View differences:

org.gvsig.legend.vectorfilterexpression.app.mainplugin/tags/org.gvsig.legend.vectorfilterexpression.app.mainplugin-1.0.44/pom.xml
1
<?xml version="1.0" encoding="UTF-8"?>
2

  
3
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4

  
5
	<modelVersion>4.0.0</modelVersion>
6
	<artifactId>org.gvsig.legend.vectorfilterexpression.app.mainplugin</artifactId>
7
	<name>Vector legend: Filter by expression</name>
8
	<version>1.0.44</version>
9

  
10
  <parent>
11
      <groupId>org.gvsig</groupId>
12
      <artifactId>org.gvsig.desktop</artifactId>
13
      <version>2.0.184</version>
14
  </parent>
15

  
16
	<url>https://devel.gvsig.org/redmine/projects/gvsig-base-legends</url>
17

  
18
    <scm>
19
        <connection>scm:svn:https://devel.gvsig.org/svn/gvsig-base-legends/org.gvsig.legend.vectorfilterexpression.app.mainplugin/tags/org.gvsig.legend.vectorfilterexpression.app.mainplugin-1.0.44</connection>
20
        <developerConnection>scm:svn:https://devel.gvsig.org/svn/gvsig-base-legends/org.gvsig.legend.vectorfilterexpression.app.mainplugin/tags/org.gvsig.legend.vectorfilterexpression.app.mainplugin-1.0.44</developerConnection>
21
        <url>scm:svn:https://devel.gvsig.org/svn/gvsig-base-legends/org.gvsig.legend.vectorfilterexpression.app.mainplugin/tags/org.gvsig.legend.vectorfilterexpression.app.mainplugin-1.0.44</url>
22
    </scm>
23
    <repositories>
24
      <repository>
25
        <id>gvsig-public-http-repository</id>
26
        <name>gvSIG maven public HTTP repository</name>
27
        <url>http://devel.gvsig.org/m2repo/j2se</url>
28
        <releases>
29
          <enabled>true</enabled>
30
          <updatePolicy>daily</updatePolicy>
31
          <checksumPolicy>warn</checksumPolicy>
32
        </releases>
33
        <snapshots>
34
          <enabled>true</enabled>
35
          <updatePolicy>daily</updatePolicy>
36
          <checksumPolicy>warn</checksumPolicy>
37
        </snapshots>
38
      </repository>
39
    </repositories>
40

  
41
	<description>Vector legend: Filter by expression. For each feature, the symbol is only visible if the expression is evaluated to true.</description>
42
	<build>
43

  
44
        <plugins>
45

  
46
		    <plugin>
47
		      <artifactId>maven-release-plugin</artifactId>
48
		      <version>2.0</version>
49
		      <configuration>
50
		        <tagBase>https://devel.gvsig.org/svn/gvsig-base-legends/org.gvsig.legend.vectorfilterexpression.app.mainplugin/tags</tagBase>
51
		      </configuration>
52
		    </plugin>
53

  
54
        </plugins>
55
	</build>
56
	<dependencies>
57
		<dependency>
58
			<groupId>org.gvsig</groupId>
59
			<artifactId>org.gvsig.app.mainplugin</artifactId>
60
		</dependency>
61
        <dependency>
62
            <groupId>org.gvsig</groupId>
63
            <artifactId>org.gvsig.andami</artifactId>
64
        </dependency>
65
        <dependency>
66
            <groupId>org.gvsig</groupId>
67
            <artifactId>org.gvsig.symbology.lib.api</artifactId>
68
        </dependency>
69
        <dependency>
70
            <groupId>org.gvsig</groupId>
71
            <artifactId>org.gvsig.symbology.lib.impl</artifactId>
72
        </dependency>
73
        <dependency>
74
            <groupId>org.gvsig</groupId>
75
            <artifactId>org.gvsig.symbology.swing.api</artifactId>
76
        </dependency>
77
        <dependency>
78
            <groupId>org.gvsig</groupId>
79
            <artifactId>org.gvsig.fmap.mapcontext.api</artifactId>
80
        </dependency>
81
        <dependency>
82
            <groupId>org.gvsig</groupId>
83
            <artifactId>org.gvsig.utils</artifactId>
84
        </dependency>
85
        <dependency>
86
            <groupId>org.gvsig</groupId>
87
            <artifactId>org.gvsig.fmap.dal.api</artifactId>
88
        </dependency>
89

  
90
        <dependency>
91
            <groupId>org.gvsig</groupId>
92
            <artifactId>org.gvsig.i18n</artifactId>
93
        </dependency>
94

  
95
		<dependency>
96
            <groupId>org.gvsig</groupId>
97
            <artifactId>org.gvsig.fmap.geometry.api</artifactId>
98
        </dependency>
99

  
100
        <dependency>
101
            <groupId>org.gvsig</groupId>
102
            <artifactId>org.gvsig.tools.lib</artifactId>
103
        </dependency>
104
        <dependency>
105
            <groupId>org.gvsig</groupId>
106
            <artifactId>org.gvsig.ui</artifactId>
107
        </dependency>
108
        <dependency>
109
            <groupId>org.gvsig</groupId>
110
            <artifactId>org.gvsig.projection.api</artifactId>
111
        </dependency>
112
        <dependency>
113
            <groupId>org.gvsig</groupId>
114
            <artifactId>org.gvsig.metadata.lib.basic.api</artifactId>
115
        </dependency>
116

  
117
        <dependency>
118
            <groupId>org.gvsig</groupId>
119
            <artifactId>org.gvsig.compat.api</artifactId>
120
        </dependency>
121

  
122
		<dependency>
123
            <groupId>org.gvsig</groupId>
124
			<artifactId>org.gvsig.tools.evaluator.sqljep</artifactId>
125
		</dependency>
126

  
127
        <dependency>
128
            <groupId>org.gvsig</groupId>
129
            <artifactId>org.gvsig.tools.lib</artifactId>
130
            <scope>compile</scope>
131
        </dependency>
132

  
133
        <dependency>
134
            <groupId>org.gvsig</groupId>
135
            <artifactId>org.gvsig.tools.swing.api</artifactId>
136
        </dependency>
137

  
138
        <!--
139
		<dependency>
140
			<groupId>bsf</groupId>
141
			<artifactId>bsf</artifactId>
142
            <scope>compile</scope>
143
		</dependency>
144
		-->
145

  
146
	</dependencies>
147

  
148
	<properties>
149
	    <gvsig.package.info.categories>View,Vector,Symbology</gvsig.package.info.categories>
150
        <gvsig.package.info.official>true</gvsig.package.info.official>
151
        <gvsig.package.info.dependencies>required: org.gvsig.app.mainplugin -ge 2.1.0-A</gvsig.package.info.dependencies>
152
        <gvsig.package.info.state>testing</gvsig.package.info.state>
153
		<gvsig.package.info.poolURL>https://devel.gvsig.org/download/projects/gvsig-base-legends/pool</gvsig.package.info.poolURL>
154
	</properties>
155

  
156

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

  
25
import org.gvsig.tools.evaluator.EvaluatorWithDescriptions;
26
import org.gvsig.tools.evaluator.sqljep.SQLJEPEvaluator;
27

  
28

  
29
/**
30
 * 
31
 * Utility class to centralize the creation of an
32
 * @link {@link EvaluatorWithDescriptions}
33
 * 
34
 * TODO Perhaps create a manager in Tools to perform this operation
35
 * 
36
 * @author jldominguez
37
 *
38
 */
39
public class EvaluatorCreator {
40

  
41
    /**
42
     * Create an {@link EvaluatorWithDescriptions} that uses
43
     * the string expression provided
44
     * 
45
     * @param expr
46
     * @return
47
     */
48
    public static EvaluatorWithDescriptions getEvaluator(String expr) {
49
        return new SQLJEPEvaluator(expr);
50
    }
51

  
52
}
org.gvsig.legend.vectorfilterexpression.app.mainplugin/tags/org.gvsig.legend.vectorfilterexpression.app.mainplugin-1.0.44/src/main/java/org/gvsig/symbology/fmap/rendering/VectorFilterExpressionLegend.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 program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib��ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
package org.gvsig.symbology.fmap.rendering;
42

  
43

  
44
import java.util.ArrayList;
45

  
46
import org.slf4j.Logger;
47
import org.slf4j.LoggerFactory;
48

  
49
import org.gvsig.fmap.dal.feature.Feature;
50
import org.gvsig.fmap.geom.Geometry;
51
import org.gvsig.fmap.mapcontext.MapContextLocator;
52
import org.gvsig.fmap.mapcontext.MapContextManager;
53
import org.gvsig.fmap.mapcontext.rendering.legend.events.SymbolLegendEvent;
54
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
55
import org.gvsig.i18n.Messages;
56
import org.gvsig.symbology.fmap.mapcontext.rendering.legend.impl.AbstractClassifiedVectorLegend;
57
import org.gvsig.symbology.fmap.rendering.filterexpression.EvaluatorCreator;
58
import org.gvsig.tools.ToolsLocator;
59
import org.gvsig.tools.dynobject.DynStruct;
60
import org.gvsig.tools.evaluator.Evaluator;
61
import org.gvsig.tools.evaluator.EvaluatorData;
62
import org.gvsig.tools.evaluator.EvaluatorWithDescriptions;
63
import org.gvsig.tools.persistence.PersistenceManager;
64
import org.gvsig.tools.persistence.PersistentState;
65
import org.gvsig.tools.persistence.exception.PersistenceException;
66
import org.gvsig.tools.util.Callable;
67

  
68

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

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

  
94
    public static final String
95
    FILTER_EXPRESSION_LEGEND_PERSISTENCE_DEFINITION_NAME =
96
    "FILTER_EXPRESSION_LEGEND_PERSISTENCE_DEFINITION_NAME";
97

  
98
    public static final String
99
    FILTER_EXPRESSION_LEGEND_NAME = "FILTER_EXPRESSION_LEGEND_NAME";
100

  
101
    public static final String I18N_DEFAULT = Messages.getText("default_value");
102
    public static final String NON_I18N_DEFAULT = Messages.getText("Default");
103

  
104
	private int shapeType;
105
	private ISymbol defaultSymbol;
106

  
107
	private boolean useDefaultSymbol = false;
108

  
109
	private long error_msg_count = 0;
110

  
111
	private ArrayList<Item> newSymbols = new ArrayList<Item>() {
112
		private static final long serialVersionUID = 1L;
113

  
114
		public int indexOf(String expr) {
115
			return super.indexOf(new Item(expr, null));
116
		}
117
	};
118

  
119

  
120
	private class Item implements Cloneable {
121

  
122
		private ISymbol sym;
123
		// get it with getSql()
124
		// private String expression;
125
		private EvaluatorWithDescriptions evaluator;
126

  
127
		public Item(String expression, ISymbol sym) {
128
			this.sym = sym;
129
			evaluator = EvaluatorCreator.getEvaluator(expression);
130
		}
131

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

  
140
		public String getStringExpression() {
141
			return evaluator.getSQL();
142
		}
143

  
144
		public Evaluator getEvaluator() {
145
			return evaluator;
146
		}
147

  
148
		public Object clone() {
149

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

  
161
    public VectorFilterExpressionLegend() {
162
        this.setClassifyingFieldNames(new String[0]);
163
        this.setClassifyingFieldTypes(new int[0]);
164
    }
165

  
166
	public ISymbol getSymbolByFeature(Feature featu) {
167

  
168
	    EvaluatorData evda = featu.getEvaluatorData();
169

  
170
		ISymbol returnSymbol = null;
171
		Object result = null;
172
		String expr = null;
173

  
174
		try {
175

  
176
			for (int i = 0; i < newSymbols.size(); i++) {
177

  
178
				Evaluator eval = newSymbols.get(i).getEvaluator();
179
				expr = eval.getSQL();
180

  
181
                if (expr.equalsIgnoreCase(VectorFilterExpressionLegend.I18N_DEFAULT)){
182
                    /*
183
                     * Skip default item
184
                     */
185
                    continue;
186
                }
187

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

  
198
		    if (error_msg_count % 1000 == 0) {
199
		        logger.info("Error (msg every 1000 occurrences) while getting symbol in VectorFilterExpressionLegend", e);
200
		        error_msg_count = 0;
201
		    }
202
		    error_msg_count++;
203
		}
204

  
205
		if (useDefaultSymbol)
206
			return getDefaultSymbol();
207

  
208
		return null;
209
	}
210

  
211
	/**
212
	 * Tells whether the input object is considered true.
213
	 * Basically, it is false if it has an empty value
214
	 * (FALSE, null, 0, "")
215
	 *
216
     * @param result
217
     * @return
218
     */
219
    private boolean isConsideredTrue(Object res) {
220

  
221
        if (res == null) {
222
            return false;
223
        }
224

  
225
        if (res instanceof Boolean) {
226
            return ((Boolean) res).booleanValue();
227
        }
228

  
229
        if (res instanceof Number) {
230
            return ((Number) res).doubleValue() != 0d;
231
        }
232

  
233
        if (res instanceof String) {
234
            return ((String) res).length() > 0;
235
        }
236

  
237
        // Because it is not null
238
        return true;
239
    }
240

  
241
	public void addSymbol(Object key, ISymbol symbol) {
242
		newSymbols.add(new Item((String)key.toString(),
243
				symbol));
244
	}
245

  
246
	public void clear() {
247
		newSymbols.clear();
248
	}
249

  
250
	public void resetItems() {
251
	    newSymbols = new ArrayList<Item>() {
252
            private static final long serialVersionUID = 1L;
253

  
254
            public int indexOf(String expr) {
255
                return super.indexOf(new Item(expr, null));
256
            }
257
	    };
258
	}
259

  
260
	public void delSymbol(Object key) {
261
		ISymbol mySymbol = null;
262
		for (int i = 0; i < newSymbols.size(); i++) {
263
			if (newSymbols.get(i).evaluator.getSQL().equals(key))
264
				newSymbols.remove(i);
265
		}
266
		fireClassifiedSymbolChangeEvent(new SymbolLegendEvent(mySymbol,null));
267
	}
268

  
269

  
270
	public void replace(ISymbol oldSymbol, ISymbol newSymbol) {
271

  
272
		for (int i = 0; i < newSymbols.size(); i++) {
273
			if (newSymbols.get(i).sym.equals(oldSymbol))
274
				newSymbols.get(i).sym = newSymbol;
275
		}
276

  
277
		fireClassifiedSymbolChangeEvent(new SymbolLegendEvent(oldSymbol,newSymbol));
278
	}
279

  
280

  
281
	public String[] getDescriptions() {
282
		String[] descriptions = new String[newSymbols.size()];
283
		ISymbol[] auxSym = getSymbols();
284

  
285
		for (int i = 0; i < descriptions.length; i++)
286
			descriptions[i] = auxSym[i].getDescription();
287

  
288
		return descriptions;
289
	}
290

  
291
	public ISymbol[] getSymbols() {
292

  
293
		if (newSymbols != null) {
294
			ISymbol[] mySymbols = new ISymbol[newSymbols.size()];
295
			for (int i = 0; i < newSymbols.size(); i++) {
296
				mySymbols[i] = newSymbols.get(i).sym;
297
			}
298
			return mySymbols;
299
		}
300
		return null;
301
	}
302

  
303

  
304

  
305
	public ISymbol getDefaultSymbol() {
306
		if(defaultSymbol==null) {
307

  
308
		    defaultSymbol = MapContextLocator.getSymbolManager(
309
		        ).createSymbol(shapeType);
310
			fireDefaultSymbolChangedEvent(new SymbolLegendEvent(null, defaultSymbol));
311
		}
312
		return defaultSymbol;
313
	}
314

  
315

  
316
	public String getClassName() {
317
		return getClass().getName();
318
	}
319

  
320

  
321
	public int getShapeType() {
322
		return shapeType;
323
	}
324

  
325
	public boolean isUseDefaultSymbol() {
326
		return useDefaultSymbol;
327
	}
328

  
329
	public void setDefaultSymbol(ISymbol s) throws IllegalArgumentException {
330
		if (s == null) throw new NullPointerException("Default symbol cannot be null");
331
		ISymbol old = defaultSymbol;
332
		defaultSymbol = s;
333
		fireDefaultSymbolChangedEvent(new SymbolLegendEvent(old, defaultSymbol));
334
	}
335

  
336
	public void setShapeType(int shapeType) {
337
		if (this.shapeType != shapeType) {
338

  
339
		    ISymbol sym = MapContextLocator.getSymbolManager(
340
		        ).createSymbol(shapeType);
341
			setDefaultSymbol(sym);
342
			this.shapeType = shapeType;
343
		}
344
	}
345

  
346
	public void useDefaultSymbol(boolean b) {
347
		useDefaultSymbol = b;
348
	}
349

  
350
	public Object[] getValues() {
351
		if (newSymbols != null) {
352
			Object[] myObjects = new Object[newSymbols.size()];
353
			for (int i = 0; i < newSymbols.size(); i++) {
354
				myObjects[i] = newSymbols.get(i).getStringExpression();
355
			}
356
			return myObjects;
357
		}
358
		return null;
359
	}
360

  
361
    public static boolean isPolygonal(int ty) {
362
        if (ty == Geometry.TYPES.MULTISURFACE
363
            || ty == Geometry.TYPES.SURFACE
364
            ) {
365
            return true;
366
        } else {
367
            return false;
368
        }
369
    }
370

  
371

  
372
    public static boolean isLinear(int ty) {
373
        if (ty == Geometry.TYPES.CIRCLE
374
            || ty == Geometry.TYPES.ARC
375
            || ty == Geometry.TYPES.CURVE
376
            || ty == Geometry.TYPES.ELLIPSE
377
            || ty == Geometry.TYPES.ELLIPTICARC
378
            || ty == Geometry.TYPES.SPLINE
379
            || ty == Geometry.TYPES.MULTICURVE
380
            ) {
381
            return true;
382
        } else {
383
            return false;
384
        }
385
    }
386

  
387
    public static boolean isPoint(int ty) {
388
        if (ty == Geometry.TYPES.POINT
389
            || ty == Geometry.TYPES.MULTIPOINT
390
            ) {
391
            return true;
392
        } else {
393
            return false;
394
        }
395
    }
396

  
397
    public void removeDefaultSymbol() {
398

  
399
    }
400

  
401
    // =============================
402

  
403
    public static class RegisterPersistence implements Callable {
404

  
405
        public Object call() throws Exception {
406

  
407
            PersistenceManager manager = ToolsLocator.getPersistenceManager();
408
            if (manager.getDefinition(
409
                FILTER_EXPRESSION_LEGEND_PERSISTENCE_DEFINITION_NAME) == null) {
410
                DynStruct definition = manager
411
                    .addDefinition(VectorFilterExpressionLegend.class,
412
                        FILTER_EXPRESSION_LEGEND_PERSISTENCE_DEFINITION_NAME,
413
                        FILTER_EXPRESSION_LEGEND_PERSISTENCE_DEFINITION_NAME
414
                        + " Persistence definition", null, null);
415

  
416
                definition.extend(manager.getDefinition(
417
                    AbstractClassifiedVectorLegend
418
                    .CLASSIFIED_VECTOR_LEGEND_PERSISTENCE_DEFINITION_NAME));
419

  
420
                definition.addDynFieldBoolean("useDefaultSymbol")
421
                .setMandatory(true);
422
                definition.addDynFieldObject("defaultSymbol")
423
                .setClassOfValue(ISymbol.class).setMandatory(true);
424
                definition.addDynFieldInt("shapeType")
425
                .setMandatory(true);
426

  
427
                definition.addDynFieldArray("itemSymbolArray")
428
                .setClassOfItems(ISymbol.class);
429
                definition.addDynFieldArray("itemStringArray")
430
                .setClassOfItems(String.class);
431

  
432
            }
433
            return Boolean.TRUE;
434
        }
435

  
436
    }
437

  
438
    public static class RegisterLegend implements Callable {
439

  
440
        public Object call() throws Exception {
441
            MapContextManager manager =
442
                MapContextLocator.getMapContextManager();
443

  
444
            manager.registerLegend(
445
                FILTER_EXPRESSION_LEGEND_NAME,
446
                VectorFilterExpressionLegend.class);
447

  
448
            return Boolean.TRUE;
449
        }
450

  
451
    }
452

  
453
    public void saveToState(PersistentState state) throws PersistenceException {
454

  
455
        super.saveToState(state);
456
        state.set("useDefaultSymbol", this.isUseDefaultSymbol());
457
        state.set("defaultSymbol", this.getDefaultSymbol());
458
        state.set("shapeType", this.getShapeType());
459

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

  
478
        state.set("itemSymbolArray", syms);
479
        state.set("itemStringArray", vals_str);
480

  
481
    }
482

  
483
    public void loadFromState(PersistentState state)
484
        throws PersistenceException {
485

  
486
        super.loadFromState(state);
487

  
488
        this.setShapeType(state.getInt("shapeType"));
489
        Boolean b = state.getBoolean("useDefaultSymbol");
490
        this.useDefaultSymbol(b);
491
        ISymbol defsym = (ISymbol) state.get("defaultSymbol");
492
        this.setDefaultSymbol(defsym);
493

  
494
        String[] strs = state.getStringArray("itemStringArray");
495
        ISymbol[] syms = (ISymbol[]) state.getArray("itemSymbolArray",
496
            ISymbol.class);
497

  
498
        if (strs.length != syms.length) {
499
            logger.info("VectorFilterExpressionLegend - load state - Different size in arrays: " + strs.length + ", " + syms.length);
500
        }
501
        int nmin = Math.min(strs.length, syms.length);
502
        for (int i=0; i<nmin; i++) {
503
            String aux = strs[i];
504
            aux = translateDefault(aux, true);
505
            this.addSymbol(aux, syms[i]);
506
        }
507
    }
508

  
509
    /**
510
     * Utility method to (un)translate the word 'Default'
511
     * @param aux
512
     * @param forward
513
     * If TRUE, then translate (Default -> Por defecto)
514
     * If FALSE then untranslate (Por defecto -> Default)
515
     * @return
516
     */
517
    private String translateDefault(String aux, boolean forward) {
518

  
519
        if (aux == null) {
520
            return null;
521
        }
522
        if (forward && aux.compareTo(NON_I18N_DEFAULT) == 0) {
523
            return I18N_DEFAULT;
524
        }
525
        if (!forward && aux.compareTo(I18N_DEFAULT) == 0) {
526
            return NON_I18N_DEFAULT;
527
        }
528
        return aux;
529
    }
530

  
531

  
532
    public Object clone() throws CloneNotSupportedException {
533

  
534
        VectorFilterExpressionLegend resp =
535
            (VectorFilterExpressionLegend) super.clone();
536

  
537
        Object[] vals = this.getValues();
538
        ISymbol[] syms = this.getSymbols();
539
        if (vals != null && syms != null) {
540

  
541
            resp.resetItems();
542

  
543
            int n = Math.min(vals.length, syms.length);
544
            for (int i=0; i<n; i++) {
545
                resp.addSymbol(
546
                    vals[i],
547
                    (ISymbol) syms[i].clone());
548
            }
549
        }
550
        ISymbol sym = this.getDefaultSymbol();
551
        sym = (ISymbol) sym.clone();
552
        resp.setDefaultSymbol(sym);
553
        return resp;
554
    }
555

  
556

  
557

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

  
25
import java.awt.Dimension;
26
import java.awt.GridBagConstraints;
27
import java.awt.GridBagLayout;
28
import java.awt.Insets;
29
import java.awt.event.ActionEvent;
30
import java.awt.event.ActionListener;
31

  
32
import javax.swing.BorderFactory;
33
import javax.swing.JOptionPane;
34
import javax.swing.JPanel;
35
import javax.swing.JScrollPane;
36
import javax.swing.JTextArea;
37
import javax.swing.ScrollPaneConstants;
38

  
39
import org.gvsig.andami.ui.mdiManager.IWindow;
40
import org.gvsig.andami.ui.mdiManager.MDIManager;
41
import org.gvsig.andami.ui.mdiManager.WindowInfo;
42
import org.gvsig.app.ApplicationLocator;
43
import org.gvsig.app.project.documents.view.legend.gui.JSymbolPreviewButton;
44
import org.gvsig.fmap.dal.feature.Feature;
45
import org.gvsig.fmap.geom.Geometry;
46
import org.gvsig.fmap.mapcontext.MapContextLocator;
47
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
48
import org.gvsig.gui.beans.AcceptCancelPanel;
49
import org.gvsig.i18n.Messages;
50
import org.gvsig.symbology.fmap.rendering.filterexpression.EvaluatorCreator;
51
import org.gvsig.tools.evaluator.EvaluatorException;
52
import org.gvsig.tools.evaluator.EvaluatorWithDescriptions;
53
import org.gvsig.tools.swing.api.ToolsSwingLocator;
54
import org.gvsig.tools.swing.api.evaluator.ComponentSwingManager;
55
import org.gvsig.tools.swing.api.evaluator.EvaluatorPanel;
56

  
57

  
58
/**
59
 * This panel shows an expression creation panel (from the Tools
60
 * library) and shows a symbol preview panel with a description
61
 * so the user can associate a symbol to the expression (symbol
62
 * will be used if expression evaluates to TRUE)
63
 *
64
 * @see EvaluatorPanel
65
 *
66
 *
67
 * @author jldominguez
68
 *
69
 */
70
public class ExpressionSymbolPanel extends JPanel
71
implements ActionListener, IWindow {
72

  
73
    /**
74
     *
75
     */
76
    private static final long serialVersionUID = 6299256060002740452L;
77
    private Feature dummyFeature = null;
78
    private EvaluatorWithDescriptions evald = null;
79
    private int shptype = Geometry.TYPES.GEOMETRY;
80

  
81
    private JPanel symPanel = null;
82
    private JSymbolPreviewButton templateButton = null;
83
    private JTextArea descArea = null;
84
    private AcceptCancelPanel acPanel;
85
    private boolean okPressed = false;
86
    private WindowInfo winfo = null;
87

  
88
    private EvaluatorPanel evapa = null;
89

  
90
    public ExpressionSymbolPanel(
91
        Feature dummy_feat, EvaluatorWithDescriptions ed, int st, ISymbol sym) {
92

  
93
        dummyFeature = dummy_feat;
94
        evald = ed;
95
        shptype = st;
96

  
97
        initialize(sym);
98
    }
99

  
100
    private EvaluatorPanel getEvaluatorPanel() {
101
        if (evapa == null) {
102
            ComponentSwingManager esm =
103
                ToolsSwingLocator.getComponentSwingManager();
104
            evapa = esm.getEvaluatorPanel(
105
                dummyFeature.getType(),
106
                evald);
107
        }
108
        return evapa;
109
    }
110

  
111
    public String getExpression() {
112
        return getEvaluatorPanel().getExpression();
113
    }
114

  
115
    public ISymbol getSymbol() {
116
        ISymbol resp = getTemplateButton(null).getSymbol();
117
        resp.setDescription(this.getDescArea(null).getText());
118
        return resp;
119
    }
120

  
121
    /**
122
     *
123
     */
124
    private void initialize(ISymbol sym) {
125

  
126
        this.setLayout(new GridBagLayout());
127
        GridBagConstraints gbc = new GridBagConstraints();
128

  
129
        gbc.gridx = 0;
130
        gbc.gridy = 0;
131
        gbc.anchor = GridBagConstraints.CENTER;
132
        gbc.fill = GridBagConstraints.BOTH;
133
        gbc.weightx = 1;
134
        gbc.weighty = 1;
135
        this.add(getEvaluatorPanel(), gbc);
136
        gbc.gridy = 1;
137
        gbc.weighty = 0;
138
        this.add(getSymbolPanel(sym), gbc);
139
        gbc.gridy = 2;
140
        this.add(getAcceptCancel(), gbc);
141
    }
142

  
143
    /**
144
     * @return
145
     */
146
    private JPanel getAcceptCancel() {
147

  
148
        if (acPanel == null) {
149
            acPanel = new AcceptCancelPanel(this, this);
150
        }
151
        return acPanel;
152
    }
153

  
154
    /**
155
     * @return
156
     */
157
    private JPanel getSymbolPanel(ISymbol sym) {
158

  
159
        if (symPanel == null) {
160

  
161
            symPanel = new JPanel();
162
            symPanel.setLayout(new GridBagLayout());
163
            symPanel.setBorder(BorderFactory.createTitledBorder(
164
                Messages.getText("_Symbol_and_description")));
165

  
166
            GridBagConstraints gbc = new GridBagConstraints();
167

  
168
            gbc.fill = GridBagConstraints.BOTH;
169
            gbc.anchor = GridBagConstraints.NORTHWEST;
170
            gbc.gridx = 0;
171
            gbc.gridy = 0;
172
            gbc.weightx = 0.2;
173
            gbc.weighty = 0;
174
            gbc.insets = new Insets(7, 7, 7, 7);
175
            symPanel.add(getTemplateButton(sym), gbc);
176

  
177
            gbc.gridx = 1;
178
            gbc.weightx = 0.8;
179

  
180
            JScrollPane scroll = new JScrollPane(getDescArea(sym));
181
            scroll.setHorizontalScrollBarPolicy(
182
                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
183
            scroll.setVerticalScrollBarPolicy(
184
                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
185
            symPanel.add(scroll, gbc);
186
        }
187
        return symPanel;
188
    }
189

  
190
    /**
191
     * @return
192
     */
193
    private JTextArea getDescArea(ISymbol sym) {
194
        if (descArea == null) {
195

  
196
            descArea = new JTextArea();
197
            descArea.setWrapStyleWord(true);
198
            descArea.setLineWrap(true);
199
            if (sym != null) {
200
                descArea.setText(sym.getDescription());
201
            }
202
        }
203
        return descArea;
204
    }
205

  
206
    /**
207
     * @return
208
     */
209
    private JSymbolPreviewButton getTemplateButton(ISymbol sym) {
210
        if (templateButton == null) {
211
            ISymbol inisym = sym;
212
            if (inisym == null) {
213
                inisym = MapContextLocator.getSymbolManager().
214
                    createSymbol(shptype);
215
            }
216
            templateButton = new JSymbolPreviewButton(inisym, shptype);
217
            templateButton.setPreferredSize(new Dimension(100, 35));
218
            templateButton.setMinimumSize(new Dimension(100, 35));
219
        }
220
        return templateButton;
221
    }
222

  
223
    /* (non-Javadoc)
224
     * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
225
     */
226
    public void actionPerformed(ActionEvent e) {
227

  
228
        if (e.getActionCommand().compareToIgnoreCase("ok") == 0) {
229

  
230
            Class<?> return_class = null;
231
            try {
232
                return_class = validateExpression();
233
            } catch (EvaluatorException epe) {
234

  
235
                if (epe.getCause() instanceof ArithmeticException) {
236

  
237
                    if (!userTolerates(epe)) {
238
                        okPressed = false;
239
                        return;
240
                    } else {
241
                        // User said ok
242
                        okPressed = true;
243
                        closeThis();
244
                        return;
245
                    }
246

  
247
                } else {
248
                    String detail = epe.getMessageStack();
249
                    ApplicationLocator.getManager().messageDialog(
250
                        Messages.getText("incorrect_expression")
251
                        + "\n\n" + detail,
252
                        Messages.getText("error"),
253
                        JOptionPane.ERROR_MESSAGE);
254
                    okPressed = false;
255
                    return;
256
                }
257
            }
258

  
259
            if (return_class != Boolean.class) {
260
                int usr_opt = JOptionPane.showConfirmDialog(
261
                    this,
262
                    Messages.getText("_Result_not_boolean_so_zero_empty_string_null_are_false_Continue_question"),
263
                    Messages.getText("confirmation_dialog"),
264
                    JOptionPane.YES_NO_OPTION);
265
                if (usr_opt == JOptionPane.NO_OPTION) {
266
                    okPressed = false;
267
                    return;
268
                }
269
            }
270
            okPressed = true;
271
            closeThis();
272

  
273
        } else {
274
            if (e.getActionCommand().compareToIgnoreCase("cancel") == 0) {
275
                okPressed = false;
276
                closeThis();
277
            }
278
        }
279
    }
280

  
281

  
282
    /**
283
     * @param epe
284
     * @return
285
     */
286
    private boolean userTolerates(EvaluatorException epe) {
287

  
288
        String detail = Messages.getText(
289
            "_Expression_can_cause_arithmetic_issues_Continue_question");
290
        detail = detail + "\n\nMessage: ";
291
        detail = detail + epe.getMessageStack();
292

  
293
        int usr_opt = JOptionPane.showConfirmDialog(
294
            this,
295
            detail,
296
            Messages.getText("confirmation_dialog"),
297
            JOptionPane.YES_NO_OPTION);
298

  
299
        return usr_opt == JOptionPane.YES_OPTION;
300
    }
301

  
302
    /**
303
     * @return class of the return value
304
     */
305
    private Class<? extends Object> validateExpression() throws EvaluatorException {
306

  
307
        String expr = this.getExpression();
308
        EvaluatorWithDescriptions evde = EvaluatorCreator.getEvaluator(expr);
309
        Object resp_class = null;
310

  
311
        try {
312
            /*
313
             * Try evaluate feature with default values
314
             */
315
            resp_class = evde.evaluate(dummyFeature.getEvaluatorData());
316
        } catch (EvaluatorException e) {
317
            /*
318
             * Parse exception or field not found or
319
             * divison by zero, etc.
320
             * Malformed expression, not valid
321
             */
322
            throw e;
323
        } catch (Exception e) {
324
            /*
325
             * All other exceptions.
326
             * Should not happen often.
327
             * We assume a strange
328
             * exception (NPE, etc) and decide it's not a valid
329
             * expression
330
             *
331
             */
332
            throw new EvaluatorException(e);
333
        }
334

  
335
        if (resp_class == null) {
336
            return null;
337
        } else {
338
            return resp_class.getClass();
339
        }
340
    }
341

  
342
    private void closeThis() {
343
        MDIManager mm = ApplicationLocator.getManager().getUIManager();
344
        mm.closeWindow(this);
345
    }
346

  
347
    public boolean isOkPressed() {
348
        return okPressed;
349
    }
350

  
351
    /* (non-Javadoc)
352
     * @see org.gvsig.andami.ui.mdiManager.IWindow#getWindowInfo()
353
     */
354
    public WindowInfo getWindowInfo() {
355
        if (winfo == null) {
356
            winfo = new WindowInfo(
357
                WindowInfo.MODALDIALOG |
358
                WindowInfo.RESIZABLE);
359

  
360
            winfo.setTitle(Messages.getText("expression_creator"));
361
            winfo.setWidth(675);
362
            winfo.setHeight(400);
363
        }
364
        return winfo;
365
    }
366

  
367
    /* (non-Javadoc)
368
     * @see org.gvsig.andami.ui.mdiManager.IWindow#getWindowProfile()
369
     */
370
    public Object getWindowProfile() {
371
        return WindowInfo.DIALOG_PROFILE;
372
    }
373

  
374
}
org.gvsig.legend.vectorfilterexpression.app.mainplugin/tags/org.gvsig.legend.vectorfilterexpression.app.mainplugin-1.0.44/src/main/java/org/gvsig/symbology/gui/layerproperties/VectorFilterExpressionPanel.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 program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib��ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
package org.gvsig.symbology.gui.layerproperties;
42

  
43
import java.awt.BorderLayout;
44
import java.awt.Dimension;
45
import java.awt.event.ActionEvent;
46
import java.awt.event.ActionListener;
47
import java.io.File;
48
import java.io.IOException;
49
import java.util.ArrayList;
50
import java.util.List;
51

  
52
import javax.swing.BoxLayout;
53
import javax.swing.ImageIcon;
54
import javax.swing.JButton;
55
import javax.swing.JCheckBox;
56
import javax.swing.JOptionPane;
57
import javax.swing.JPanel;
58

  
59
import org.slf4j.Logger;
60
import org.slf4j.LoggerFactory;
61

  
62
import org.gvsig.andami.IconThemeHelper;
63
import org.gvsig.andami.ui.mdiManager.MDIManager;
64
import org.gvsig.app.ApplicationLocator;
65
import org.gvsig.app.project.documents.view.legend.gui.Categories;
66
import org.gvsig.app.project.documents.view.legend.gui.ILegendPanel;
67
import org.gvsig.app.project.documents.view.legend.gui.JSymbolPreviewButton;
68
import org.gvsig.app.project.documents.view.legend.gui.SymbolTable;
69
import org.gvsig.fmap.dal.exception.ReadException;
70
import org.gvsig.fmap.dal.feature.Feature;
71
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
72
import org.gvsig.fmap.dal.feature.FeatureStore;
73
import org.gvsig.fmap.dal.feature.FeatureType;
74
import org.gvsig.fmap.mapcontext.layers.FLayer;
75
import org.gvsig.fmap.mapcontext.layers.operations.ClassifiableVectorial;
76
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
77
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
78
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
79
import org.gvsig.gui.beans.swing.GridBagLayoutPanel;
80
import org.gvsig.gui.beans.swing.JBlank;
81
import org.gvsig.i18n.Messages;
82
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.fill.impl.PictureFillSymbol;
83
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.style.IMarkerFillPropertiesStyle;
84
import org.gvsig.symbology.fmap.rendering.VectorFilterExpressionLegend;
85
import org.gvsig.symbology.fmap.rendering.filterexpression.EvaluatorCreator;
86
import org.gvsig.tools.evaluator.EvaluatorWithDescriptions;
87
import org.gvsig.tools.swing.api.ToolsSwingLocator;
88
import org.gvsig.tools.swing.api.usability.UsabilitySwingManager;
89

  
90
/**
91
 * Implements the JPanel that shows the properties of a
92
 * VectorialFilterExpressionLegend
93
 * in order to allows the user to modify its characteristics
94
 *
95
 * @author Pepe Vidal Salvador - jose.vidal.salvador@iver.es
96
 *
97
 */
98
public class VectorFilterExpressionPanel extends JPanel
99
implements ILegendPanel, ActionListener {
100

  
101
    private static final Logger logger = LoggerFactory.getLogger(
102
        VectorFilterExpressionPanel.class);
103

  
104
	private static final long serialVersionUID = -7187473609965942511L;
105
	private VectorFilterExpressionLegend theLegend;
106
	private VectorFilterExpressionLegend auxLegend;
107
	private ClassifiableVectorial layer;
108
	private PictureFillSymbol previewSymbol;
109
	private JPanel pnlCenter;
110
	private JPanel pnlMovBut;
111
	private SymbolTable symbolTable;
112
	private JButton btnAddExpression;
113
	private JButton btnModExpression;
114
	private JButton btnRemoveExpression;
115
	private JButton moveUp;
116
	private JButton moveDown;
117
	private int shapeType;
118
	protected JCheckBox chkdefaultvalues = null;
119
	protected JSymbolPreviewButton defaultSymbolPrev;
120
	private GridBagLayoutPanel defaultSymbolPanel = new GridBagLayoutPanel();
121
	private UsabilitySwingManager usabilitySwingManager = ToolsSwingLocator.getUsabilitySwingManager();
122

  
123
	/**
124
	 * This is the default constructor
125
	 */
126
	public VectorFilterExpressionPanel() {
127
		super();
128
		initialize();
129
	}
130

  
131

  
132
	/**
133
	 * This method initializes this
134
	 */
135
	private void initialize() {
136

  
137
		pnlCenter = new JPanel();
138
		pnlCenter.setLayout(new BorderLayout());
139

  
140
		JPanel pnlButtons = new JPanel();
141
		btnAddExpression = usabilitySwingManager.createJButton(
142
		    Messages.getText("new_filter_expression"));
143
		btnAddExpression.setActionCommand("NEW_EXPRESSION");
144
		btnAddExpression.addActionListener(this);
145
		pnlButtons.add(btnAddExpression);
146

  
147
		btnModExpression = usabilitySwingManager.createJButton(
148
		    Messages.getText("modify_filter_expression"));
149
		btnModExpression.setActionCommand("MODIFY_EXPRESSION");
150
		btnModExpression.addActionListener(this);
151
		pnlButtons.add(btnModExpression);
152

  
153
		btnRemoveExpression = usabilitySwingManager.createJButton(
154
		    Messages.getText("delete_filter_expression"));
155
		btnRemoveExpression.setActionCommand("REMOVE");
156
		btnRemoveExpression.addActionListener(this);
157
		pnlButtons.add(btnRemoveExpression);
158
		defaultSymbolPanel.add(getChkDefaultvalues());
159
		pnlCenter.add(defaultSymbolPanel,BorderLayout.NORTH);
160

  
161
		this.setLayout(new BorderLayout());
162
		this.add(pnlCenter, BorderLayout.CENTER);
163
		this.add(pnlButtons, BorderLayout.SOUTH);
164

  
165

  
166
	}
167
	public void getDefaultSymbolPrev(int shapeType) {
168
		if(defaultSymbolPrev == null){
169
			defaultSymbolPrev = new JSymbolPreviewButton(shapeType);
170
			defaultSymbolPrev.setPreferredSize(new Dimension(110,20));
171
			defaultSymbolPanel.add(defaultSymbolPrev,null);
172
		}
173
	}
174

  
175
	public String getDescription() {
176
		return Messages.getText(
177
		    "shows_the_elements_of_the_layer_depending_on_the_value_of_a_filter_expression") + ".";
178
	}
179

  
180
	public ISymbol getIconSymbol() {
181
		if (previewSymbol == null) {
182
			try {
183
				previewSymbol = new PictureFillSymbol();
184
				previewSymbol.setImage( new File(
185
						this.getClass().getClassLoader().
186
						getResource("images" + File.separator
187
						    + "legend" + File.separator
188
						    + "legend-overview-vectorial-unique-value.png").
189
						getFile()).toURI().toURL());
190
				previewSymbol.getMarkerFillProperties().
191
				setFillStyle(
192
						IMarkerFillPropertiesStyle.SINGLE_CENTERED_SYMBOL);
193
			} catch (IOException e) {
194
				return null;
195
			}
196
		}
197
		return previewSymbol;
198
	}
199

  
200
	public ILegend getLegend() {
201
		auxLegend.clear();
202
		fillSymbolListFromTable();
203

  
204
		theLegend = (VectorFilterExpressionLegend) auxLegend.cloneLegend();
205
		if(defaultSymbolPrev.getSymbol() != null)
206
			theLegend.setDefaultSymbol(defaultSymbolPrev.getSymbol());
207

  
208
		theLegend.useDefaultSymbol(chkdefaultvalues.isSelected());
209
		return theLegend;
210
	}
211
	/**
212
	 * Fills the list of symbols of the legend
213
	 *
214
	 */
215
	private void fillSymbolListFromTable() {
216
		Object clave;
217
		ISymbol theSymbol;
218

  
219
		FLyrVect m = (FLyrVect) layer;
220
		try {
221

  
222
			if(auxLegend.getClassifyingFieldNames() != null) {
223
				String[] fNames= auxLegend.getClassifyingFieldNames();
224
				int[] fieldTypes  = new int[auxLegend.getClassifyingFieldNames().length];
225

  
226
				FeatureStore fsto = (FeatureStore) m.getDataStore();
227
				FeatureType fty = fsto.getDefaultFeatureType();
228

  
229
				for (int i = 0; i < fNames.length; i++) {
230
					fieldTypes[i] = fty.getAttributeDescriptor(fNames[i]).getType();
231
				}
232

  
233
				auxLegend.setClassifyingFieldTypes(fieldTypes);
234
			}
235
		} catch (Exception e) {
236

  
237
		}
238

  
239
		auxLegend.useDefaultSymbol(chkdefaultvalues.isSelected());
240

  
241
		for (int row = 0; row < symbolTable.getRowCount(); row++) {
242
			clave =  symbolTable.getFieldValue(row, 1);
243
			theSymbol = (ISymbol) symbolTable.getFieldValue(row, 0);
244
			theSymbol.setDescription((String) symbolTable.getFieldValue(row, 2));
245
			auxLegend.addSymbol(clave, theSymbol);
246
		}
247
		if(chkdefaultvalues.isSelected()){
248
			if(defaultSymbolPrev.getSymbol() != null){
249
				String description = VectorFilterExpressionLegend.I18N_DEFAULT;
250
				defaultSymbolPrev.getSymbol().setDescription(description);
251
				auxLegend.addSymbol(
252
				    description, defaultSymbolPrev.getSymbol());
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff