Revision 3371

View differences:

org.gvsig.legend.vectorfilterexpression.app.mainplugin/tags/org.gvsig.legend.vectorfilterexpression.app.mainplugin-1.0.93/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.93/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());
253
			}
254
		}
255

  
256
	}
257

  
258
	public Class<VectorFilterExpressionLegend> getLegendClass() {
259
		return VectorFilterExpressionLegend.class;
260
	}
261

  
262
	public JPanel getPanel() {
263
		return this;
264
	}
265

  
266
	public Class<Categories> getParentClass() {
267
		return Categories.class;
268
	}
269

  
270
	public String getTitle() {
271
		return Messages.getText("expressions");
272
	}
273

  
274
	public boolean isSuitableFor(FLayer layer) {
275
		FLyrVect lVect = (FLyrVect) layer;
276
		try {
277
			return
278
			    VectorFilterExpressionLegend.isPoint(lVect.getShapeType())
279
			    ||
280
                VectorFilterExpressionLegend.isLinear(lVect.getShapeType())
281
                ||
282
                VectorFilterExpressionLegend.isPolygonal(lVect.getShapeType());
283
		} catch (Exception e) {
284
			return false;
285
		}
286

  
287
	}
288

  
289
	public void setData(FLayer lyr, ILegend legend) {
290
		this.layer = (ClassifiableVectorial) lyr;
291
		shapeType = 0;
292

  
293
		try {
294
			shapeType = this.layer.getGeometryType().getType();
295
		} catch (ReadException e) {
296
		    logger.info("Error while getting layer shp type", e);
297
		    ApplicationLocator.getManager().message(
298
		        Messages.getText("generating_intervals"),
299
		        JOptionPane.ERROR_MESSAGE);
300
		}
301

  
302
		if (symbolTable != null)
303
			pnlCenter.remove(symbolTable);
304
		if (pnlMovBut != null)
305
			pnlCenter.remove(pnlMovBut);
306

  
307
		getDefaultSymbolPrev(shapeType);
308

  
309
		symbolTable = new SymbolTable(this, "expressions", shapeType);
310
		pnlCenter.add(symbolTable, BorderLayout.CENTER);
311
		pnlCenter.add(getPnlMovBut(),BorderLayout.EAST);
312

  
313

  
314
		if (legend instanceof VectorFilterExpressionLegend) {
315

  
316
            auxLegend = (VectorFilterExpressionLegend) legend.cloneLegend();
317
            if (auxLegend.isUseDefaultSymbol()) {
318
                // Default must not be in table
319
                fillTableSkipDefault(auxLegend);
320
            } else {
321
                symbolTable.fillTableFromSymbolList(
322
                    auxLegend.getSymbols(),
323
                    auxLegend.getValues(),
324
                    auxLegend.getDescriptions());
325
            }
326

  
327

  
328
		} else {
329
			auxLegend = new VectorFilterExpressionLegend();
330
			auxLegend.setShapeType(shapeType);
331
		}
332
		defaultSymbolPrev.setSymbol(auxLegend.getDefaultSymbol());
333
		getChkDefaultvalues().setSelected(auxLegend.isUseDefaultSymbol());
334
	}
335

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

  
360
	public void actionPerformed(ActionEvent e) {
361

  
362
		int[] indices = null;
363
		Feature dummyFeat = null;
364

  
365
		if(e.getActionCommand() == "MOVE-UP" || e.getActionCommand() == "MOVE-DOWN"){
366
			indices = symbolTable.getSelectedRows();
367
		}
368

  
369
		if(e.getActionCommand() == "MOVE-UP"){
370
			if (indices.length>0) {
371
				int classIndex = indices[0];
372
				int targetPos = Math.max(0, classIndex-1);
373
				symbolTable.moveUpRows(classIndex, targetPos,indices.length);
374
			}
375
		}
376

  
377
		if(e.getActionCommand() == "MOVE-DOWN"){
378
			if (indices.length>0) {
379
				int classIndex = indices[indices.length-1];
380
				int targetPos = Math.min(symbolTable.getRowCount()-1, classIndex+1);
381
				symbolTable.moveDownRows(classIndex, targetPos,indices.length);
382
			}
383
		}
384

  
385
		if(e.getActionCommand() == "MOVE-UP" || e.getActionCommand() == "MOVE-DOWN"){
386
			ArrayList<String> orders = new ArrayList<String>();
387

  
388
			for (int i = 0; i < symbolTable.getRowCount(); i++) {
389
				orders.add(symbolTable.getFieldValue(i,1).toString());
390
			}
391
		}
392
		if (e.getActionCommand() == "NEW_EXPRESSION") {
393

  
394
		    FLyrVect vect = (FLyrVect) layer;
395
		    FeatureStore fsto = (FeatureStore) vect.getDataStore();
396
		    FeatureType fty = null;
397
		    int shptype = 0;
398

  
399
		    try {
400
		        fty = fsto.getDefaultFeatureType();
401
		        shptype = vect.getGeometryType().getType();
402
		        dummyFeat = fsto.createNewFeature(true);
403
		    } catch (Exception exc) {
404
		        logger.error(Messages.getText(
405
		            "error_trying_to_access_to_the_layer"), exc);
406
		        return;
407
		    }
408

  
409
		    EvaluatorWithDescriptions evalu = EvaluatorCreator.getEvaluator("");
410
		    MDIManager mm = ApplicationLocator.getManager().getUIManager();
411

  
412
		    ExpressionSymbolPanel esp = new ExpressionSymbolPanel(
413
		        dummyFeat, evalu, shptype, null);
414
		    mm.addCentredWindow(esp);
415

  
416
		    /*
417
		     * esp is modal
418
		     */
419
		    if (!esp.isOkPressed()) {
420
		        return;
421
		    }
422

  
423
		    String expr = esp.getExpression();
424
		    if (expr == null || expr.length() == 0) {
425
		        ApplicationLocator.getManager().messageDialog(
426
		            Messages.getText("error_validating_filter_query"),
427
		            Messages.getText("error"),
428
		            JOptionPane.ERROR_MESSAGE);
429
		        return;
430
		    }
431

  
432
		    ISymbol sym = esp.getSymbol();
433
//		    evalu = EvaluatorCreator.getEvaluator(expr);
434
		    // Add all fields in the feature type
435
		    this.addClassFieldNames(fty);
436

  
437
            auxLegend.addSymbol(expr, sym);
438
            symbolTable.removeAllItems();
439
            fillTableSkipDefault(auxLegend);
440

  
441
			repaint();
442
		}
443
		else if (e.getActionCommand() == "MODIFY_EXPRESSION") {
444

  
445
			if(symbolTable.getSelectedRowElements() == null) {
446
				JOptionPane.showMessageDialog(this,
447
				    Messages.getText("select_one_row")+".\n");
448
			} else {
449

  
450
		         FLyrVect vect = (FLyrVect) layer;
451
		         FeatureStore fsto = (FeatureStore) vect.getDataStore();
452
		         FeatureType fty = null;
453
		         int shptype = 0;
454
		         try {
455
		             fty = fsto.getDefaultFeatureType();
456
		             shptype = vect.getGeometryType().getType();
457
		             dummyFeat = fsto.createNewFeature(true);
458
		         } catch (Exception exc) {
459
		             logger.error(Messages.getText(
460
		                 "error_trying_to_access_to_the_layer"), exc);
461
		             return;
462
		         }
463

  
464
		        ISymbol mySymbol = (ISymbol) symbolTable.getSelectedRowElements()[0];
465
                String expression = (String) symbolTable.getSelectedRowElements()[1];
466

  
467
                EvaluatorWithDescriptions evalu =
468
                    EvaluatorCreator.getEvaluator(expression);
469

  
470
                MDIManager mm = ApplicationLocator.getManager().getUIManager();
471
                ExpressionSymbolPanel esp = new ExpressionSymbolPanel(
472
                    dummyFeat, evalu, shptype, mySymbol);
473
                mm.addCentredWindow(esp);
474
	            /*
475
	             * esp is modal
476
	             */
477
	            if (!esp.isOkPressed()) {
478
	                return;
479
	            }
480

  
481
	            String expr = esp.getExpression();
482
	            if (expr == null || expr.length() == 0) {
483
	                ApplicationLocator.getManager().messageDialog(
484
	                    Messages.getText("error_validating_filter_query"),
485
	                    Messages.getText("error"),
486
	                    JOptionPane.ERROR_MESSAGE);
487
	                return;
488
	            }
489

  
490
	            ISymbol sym = esp.getSymbol();
491
//	            evalu = EvaluatorCreator.getEvaluator(expr);
492
	            // Add all fields in the feature type
493
	            this.addClassFieldNames(fty);
494

  
495
	            // Remove old
496
				auxLegend.delSymbol(expression);
497
				auxLegend.addSymbol(expr, sym);
498
				symbolTable.removeAllItems();
499
				this.fillTableSkipDefault(auxLegend);
500

  
501
				repaint();
502
			}
503
		}
504

  
505
		else if (e.getActionCommand() == "REMOVE") {
506

  
507
			if(symbolTable.getSelectedRowElements() == null) {
508
				JOptionPane.showMessageDialog(this,
509
				    Messages.getText("select_one_row"));
510
			} else{
511
				String my_expr = (String) symbolTable.getSelectedRowElements()[1];
512
				auxLegend.delSymbol(my_expr);
513
				symbolTable.removeAllItems();
514
				fillTableSkipDefault(auxLegend);
515

  
516
				repaint();
517
			}
518
		}
519
	}
520

  
521

  
522
	private void addClassFieldNames(FeatureType ft) {
523

  
524
	    FeatureAttributeDescriptor[] atts = ft.getAttributeDescriptors();
525
	    String[] nn = new String[atts.length];
526
	    for (int i=0; i<atts.length; i++) {
527
	        nn[i] = atts[i].getName();
528
	    }
529
	    addClassFieldNames(nn);
530
	}
531
	/**
532
	 * Adds new classifying field names to the legend when a new expression is
533
	 * created or an existing one is modified
534
	 * @param fieldNamesExpression
535
	 */
536
	private void addClassFieldNames(String[] fieldNamesExpression) {
537
		boolean appears = false;
538
		ArrayList<String> myFieldNames = new ArrayList<String>();
539

  
540
		if (auxLegend.getClassifyingFieldNames() != null) {
541

  
542
			for (int i = 0; i < auxLegend.getClassifyingFieldNames().length; i++) {
543
				myFieldNames.add(auxLegend.getClassifyingFieldNames()[i]);
544
			}
545
			for (int i = 0; i < fieldNamesExpression.length; i++) {
546
				appears = false;
547
				for (int j = 0; j < auxLegend.getClassifyingFieldNames().length; j++) {
548
					if (auxLegend.getClassifyingFieldNames()[j].compareTo((String) fieldNamesExpression[i]) == 0)
549
						appears = true;
550
				}
551
				if(!appears) {
552
					myFieldNames.add((String) fieldNamesExpression[i]);
553
				}
554
			}
555

  
556
			auxLegend.setClassifyingFieldNames((String[])myFieldNames.toArray(new
557
					String[myFieldNames.size()]));
558
		}
559

  
560
		else {
561
			for (int i = 0; i < fieldNamesExpression.length; i++) {
562
				myFieldNames.add((String) fieldNamesExpression[i]);
563
			}
564
			auxLegend.setClassifyingFieldNames((String[])myFieldNames.toArray(new
565
					String[myFieldNames.size()]));
566
		}
567
	}
568

  
569

  
570
	public ImageIcon getIcon() {
571
	    ImageIcon ii = IconThemeHelper.getImageIcon(
572
	        "legend-overview-vector-filter-expression");
573
	    return ii;
574
	}
575

  
576
	/**
577
	 * This method initializes chkdefaultvalues
578
	 *
579
	 * @return javax.swing.JCheckBox
580
	 */
581
	protected JCheckBox getChkDefaultvalues() {
582
		if (chkdefaultvalues == null) {
583
			chkdefaultvalues = new JCheckBox();
584
			chkdefaultvalues.setText(Messages.getText("resto_valores")+": ");
585
			chkdefaultvalues.setBounds(new java.awt.Rectangle(342, 26, 141, 20));
586
			chkdefaultvalues.setSelected(false);
587
			chkdefaultvalues.addActionListener(new java.awt.event.ActionListener() {
588
				public void actionPerformed(java.awt.event.ActionEvent e) {
589
					if (chkdefaultvalues.isSelected()) {
590
						auxLegend.useDefaultSymbol(true);
591
					} else {
592
						auxLegend.useDefaultSymbol(false);
593
					}
594
				}
595
			});
596
		}
597

  
598
		return chkdefaultvalues;
599
	}
600

  
601
	private void fillTableSkipDefault(VectorFilterExpressionLegend leg) {
602

  
603
	    Object[] src_expr = leg.getValues();
604
	    List<Integer> rem_ind = new ArrayList<Integer>();
605
	    for (int i=0; i<src_expr.length; i++) {
606
	        if (VectorFilterExpressionLegend.I18N_DEFAULT.
607
	            compareToIgnoreCase((String) src_expr[i]) == 0) {
608
	            rem_ind.add(new Integer(i));
609
	        }
610
	    }
611
        ISymbol[] src_syms = leg.getSymbols();
612
        String[] src_descs = leg.getDescriptions();
613
        // Object[] src_expr
614

  
615
        List<ISymbol> syms = new ArrayList<ISymbol>();
616
        List<Object> vals = new ArrayList<Object>();
617
        List<String> descs = new ArrayList<String>();
618
        for (int i=0; i<src_expr.length; i++) {
619
            if (!isIn(i, rem_ind)) {
620
                syms.add(src_syms[i]);
621
                vals.add(src_expr[i]);
622
                descs.add(src_descs[i]);
623
            }
624
        }
625
	    symbolTable.fillTableFromSymbolList(
626
	        (ISymbol[]) syms.toArray(new ISymbol[0]),
627
            (Object[]) vals.toArray(new Object[0]),
628
            (String[]) descs.toArray(new String[0]));
629
	}
630

  
631

  
632
    /**
633
     * @param i
634
     * @param rem_ind
635
     * @return
636
     */
637
    private boolean isIn(int n, List<Integer> int_list) {
638

  
639
        if (int_list == null || int_list.size() == 0) {
640
            return false;
641
        }
642

  
643
        for (int i=0; i<int_list.size(); i++) {
644
            if (int_list.get(i) instanceof Integer) {
645
                Integer item = (Integer) int_list.get(i);
646
                if (item.intValue() == n) {
647
                    return true;
648
                }
649
            }
650
        }
651
        return false;
652
    }
653

  
654
}
org.gvsig.legend.vectorfilterexpression.app.mainplugin/tags/org.gvsig.legend.vectorfilterexpression.app.mainplugin-1.0.93/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 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.Component;
44
import java.util.EventObject;
45

  
46
import javax.swing.JTable;
47
import javax.swing.JTextField;
48
import javax.swing.event.CellEditorListener;
49
import javax.swing.table.TableCellEditor;
50

  
51
/**
52
 * Cell Editor for expressions. It controls the edition events in an expression
53
 * column of the table
54
 *
55
 * @author pepe vidal salvador - jose.vidal.salvador@iver.es
56
 */
57
public class ExpressionFieldCellEditor extends JTextField implements TableCellEditor {
58

  
59
	private static final long serialVersionUID = 1L;
60

  
61
	public ExpressionFieldCellEditor() {
62

  
63
	}
64

  
65
	public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
66

  
67
		return null;
68
	}
69

  
70
	public void addCellEditorListener(CellEditorListener l) {
71
		throw new RuntimeException("Not yet implemented");
72
	}
73

  
74
	public void cancelCellEditing() {
75
		throw new RuntimeException("Not yet implemented");
76

  
77
	}
78

  
79
	public Object getCellEditorValue() {
80
		return null;
81
	}
82

  
83
	public boolean isCellEditable(EventObject anEvent) {
84
		return false;
85
	}
86

  
87
	public void removeCellEditorListener(CellEditorListener l) {
88
		throw new RuntimeException("Not yet implemented");
89

  
90
	}
91

  
92
	public boolean shouldSelectCell(EventObject anEvent) {
93
		return false;
94
	}
95

  
96
	public boolean stopCellEditing() {
97
		return false;
98
	}
99

  
100
}
org.gvsig.legend.vectorfilterexpression.app.mainplugin/tags/org.gvsig.legend.vectorfilterexpression.app.mainplugin-1.0.93/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.93/src/main/java/org/gvsig/symbology/library/VectorFilterExpressionLibrary.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.library;
24

  
25
import org.gvsig.andami.IconThemeHelper;
26
import org.gvsig.app.project.documents.view.legend.gui.SymbolTable;
27
import org.gvsig.fmap.mapcontext.MapContextLocator;
28
import org.gvsig.fmap.mapcontext.MapContextManager;
29
import org.gvsig.fmap.mapcontext.rendering.legend.ISingleSymbolLegend;
30
import org.gvsig.fmap.mapcontext.rendering.symbols.SymbolManager;
31
import org.gvsig.symbology.SymbologyLibrary;
32
import org.gvsig.symbology.fmap.mapcontext.rendering.legend.driver.impl.PersistenceBasedLegendReader;
33
import org.gvsig.symbology.fmap.mapcontext.rendering.legend.driver.impl.PersistenceBasedLegendWriter;
34
import org.gvsig.symbology.fmap.rendering.VectorFilterExpressionLegend;
35
import org.gvsig.symbology.gui.layerproperties.ExpressionFieldCellEditor;
36
import org.gvsig.symbology.gui.layerproperties.VectorFilterExpressionPanel;
37
import org.gvsig.symbology.swing.SymbologySwingLocator;
38
import org.gvsig.tools.library.AbstractLibrary;
39
import org.gvsig.tools.library.LibraryException;
40
import org.gvsig.tools.persistence.xml.XMLPersistenceLibrary;
41
import org.gvsig.tools.util.Caller;
42
import org.gvsig.tools.util.impl.DefaultCaller;
43

  
44

  
45
/**
46
 * Simple library to register vector filter expression legend
47
 *
48
 * @author jldominguez
49
 *
50
 */
51
public class VectorFilterExpressionLibrary extends AbstractLibrary {
52

  
53

  
54
    public void doRegistration() {
55
        registerAsImplementationOf(VectorFilterExpressionLibrary.class);
56
        /*
57
         * This checks map context library registration
58
         */
59
        require(SymbologyLibrary.class);
60
        /*
61
         * This is because we need to use persistence manager
62
         */
63
        require(XMLPersistenceLibrary.class);
64
    }
65

  
66
    protected void doInitialize() throws LibraryException {
67

  
68
    }
69

  
70

  
71
    protected void doPostInitialize() throws LibraryException {
72

  
73
        IconThemeHelper.registerIcon("legend",
74
            "legend-overview-vector-filter-expression", this);
75
        IconThemeHelper.registerIcon("legend",
76
            "legend-overview-vectorial-unique-value", this);
77
        IconThemeHelper.registerIcon("symbol",
78
            "symbol-layer-move-down", this);
79
        IconThemeHelper.registerIcon("symbol",
80
            "symbol-layer-move-up", this);
81

  
82
        Caller caller = new DefaultCaller();
83

  
84
        caller.add(new VectorFilterExpressionLegend.RegisterLegend());
85
        caller.add(new VectorFilterExpressionLegend.RegisterPersistence());
86

  
87
        /*
88
         * Do register of all
89
         */
90
        if( !caller.call() ) {
91
            throw new LibraryException(
92
                VectorFilterExpressionLibrary.class,
93
                caller.getExceptions());
94
        }
95
        
96
        MapContextManager mcoman = MapContextLocator.getMapContextManager();
97
        mcoman.registerLegendWriter(
98
        		VectorFilterExpressionLegend.class,
99
                SymbolManager.LEGEND_FILE_EXTENSION.substring(1),
100
                PersistenceBasedLegendWriter.class);
101
        
102
        SymbologySwingLocator.getSwingManager().registerLegendEditor(VectorFilterExpressionPanel.class);
103

  
104
        
105
        
106
        SymbolTable.addNewCellEditor("expressions",
107
            new ExpressionFieldCellEditor());
108

  
109
    }
110

  
111

  
112

  
113
}
org.gvsig.legend.vectorfilterexpression.app.mainplugin/tags/org.gvsig.legend.vectorfilterexpression.app.mainplugin-1.0.93/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.93/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.geom.GeometryLocator;
52
import org.gvsig.fmap.geom.GeometryManager;
53
import org.gvsig.fmap.mapcontext.MapContextLocator;
54
import org.gvsig.fmap.mapcontext.MapContextManager;
55
import org.gvsig.fmap.mapcontext.rendering.legend.events.SymbolLegendEvent;
56
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
57
import org.gvsig.i18n.Messages;
58
import org.gvsig.symbology.fmap.mapcontext.rendering.legend.impl.AbstractClassifiedVectorLegend;
59
import org.gvsig.symbology.fmap.rendering.filterexpression.EvaluatorCreator;
60
import org.gvsig.tools.ToolsLocator;
61
import org.gvsig.tools.dynobject.DynStruct;
62
import org.gvsig.tools.evaluator.Evaluator;
63
import org.gvsig.tools.evaluator.EvaluatorData;
64
import org.gvsig.tools.evaluator.EvaluatorWithDescriptions;
65
import org.gvsig.tools.persistence.PersistenceManager;
66
import org.gvsig.tools.persistence.PersistentState;
67
import org.gvsig.tools.persistence.exception.PersistenceException;
68
import org.gvsig.tools.util.Callable;
69

  
70

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

  
93
    private static final Logger logger = LoggerFactory.getLogger(
94
        VectorFilterExpressionLegend.class);
95

  
96
    public static final String
97
    FILTER_EXPRESSION_LEGEND_PERSISTENCE_DEFINITION_NAME =
98
    "FILTER_EXPRESSION_LEGEND_PERSISTENCE_DEFINITION_NAME";
99

  
100
    public static final String
101
    FILTER_EXPRESSION_LEGEND_NAME = "FILTER_EXPRESSION_LEGEND_NAME";
102

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

  
106
	private int shapeType;
107
	private ISymbol defaultSymbol;
108

  
109
	private boolean useDefaultSymbol = false;
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff