svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.labeling.app / org.gvsig.labeling.app.mainplugin / src / main / java / org / gvsig / labeling / gui / layerproperties / LabelClassProperties.java @ 41191
History | View | Annotate | Download (28 KB)
1 |
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
|
---|---|
2 |
*
|
3 |
* Copyright (C) 2005 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.labeling.gui.layerproperties; |
42 |
|
43 |
import java.awt.BorderLayout; |
44 |
import java.awt.Component; |
45 |
import java.awt.Dimension; |
46 |
import java.awt.FlowLayout; |
47 |
import java.awt.GridBagConstraints; |
48 |
import java.awt.GridBagLayout; |
49 |
import java.awt.GridLayout; |
50 |
import java.awt.event.ActionEvent; |
51 |
import java.awt.event.ActionListener; |
52 |
|
53 |
import javax.swing.AbstractCellEditor; |
54 |
import javax.swing.BorderFactory; |
55 |
import javax.swing.ButtonGroup; |
56 |
import javax.swing.JButton; |
57 |
import javax.swing.JCheckBox; |
58 |
import javax.swing.JComponent; |
59 |
import javax.swing.JLabel; |
60 |
import javax.swing.JOptionPane; |
61 |
import javax.swing.JPanel; |
62 |
import javax.swing.JRadioButton; |
63 |
import javax.swing.JScrollPane; |
64 |
import javax.swing.JTable; |
65 |
import javax.swing.JTextField; |
66 |
import javax.swing.table.DefaultTableModel; |
67 |
import javax.swing.table.TableCellEditor; |
68 |
import javax.swing.table.TableColumnModel; |
69 |
|
70 |
import org.gvsig.andami.ui.mdiManager.IWindow; |
71 |
import org.gvsig.andami.ui.mdiManager.WindowInfo; |
72 |
import org.gvsig.app.ApplicationLocator; |
73 |
import org.gvsig.app.gui.styling.SingleStyleSelectorFilter; |
74 |
import org.gvsig.app.gui.styling.StylePreviewer; |
75 |
import org.gvsig.app.gui.styling.StyleSelector; |
76 |
import org.gvsig.fmap.dal.exception.DataException; |
77 |
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor; |
78 |
import org.gvsig.fmap.dal.feature.FeatureStore; |
79 |
import org.gvsig.fmap.dal.feature.FeatureType; |
80 |
import org.gvsig.fmap.mapcontext.rendering.legend.styling.ILabelClass; |
81 |
import org.gvsig.fmap.mapcontext.rendering.symbols.ITextSymbol; |
82 |
import org.gvsig.fmap.mapcontext.rendering.symbols.styles.IBackgroundFileStyle; |
83 |
import org.gvsig.fmap.mapcontext.rendering.symbols.styles.ILabelStyle; |
84 |
import org.gvsig.fmap.mapcontext.rendering.symbols.styles.IStyle; |
85 |
import org.gvsig.gui.beans.AcceptCancelPanel; |
86 |
import org.gvsig.gui.beans.swing.GridBagLayoutPanel; |
87 |
import org.gvsig.gui.beans.swing.JBlank; |
88 |
import org.gvsig.i18n.Messages; |
89 |
import org.gvsig.labeling.lang.LabelClassUtils; |
90 |
import org.gvsig.symbology.SymbologyLocator; |
91 |
import org.slf4j.Logger; |
92 |
import org.slf4j.LoggerFactory; |
93 |
|
94 |
|
95 |
/**
|
96 |
*
|
97 |
* LabelClassProperties.java
|
98 |
*
|
99 |
*
|
100 |
* @author jaume dominguez faus - jaume.dominguez@iver.es May 27, 2008
|
101 |
*
|
102 |
*/
|
103 |
public class LabelClassProperties extends JPanel implements IWindow, |
104 |
ActionListener {
|
105 |
|
106 |
private static final Logger logger = |
107 |
LoggerFactory.getLogger(LabelClassProperties.class); |
108 |
|
109 |
private static final String TEST_SQL = "TEST_SQL"; |
110 |
private static final String DELETE_FIELD = "DELETE_FIELD"; |
111 |
private static final long serialVersionUID = 6528513396536811057L; |
112 |
private static final String ADD_FIELD = "ADD_FIELD"; |
113 |
private static final String SELECT_STYLE = "SELECT_STYLE"; |
114 |
private static final String CLEAR_STYLE = "CLEAR_STYLE"; |
115 |
private static final String VERIFY = "VERIFY"; |
116 |
private JTextField txtName; |
117 |
private ILabelClass lc, clonedClass;
|
118 |
private JTable tblExpressions; |
119 |
private JButton btnRemoveField; |
120 |
private JButton btnAddField; |
121 |
private JButton btnVerify; |
122 |
private JComponent styPreviewer; |
123 |
private JButton btnSelStyle; |
124 |
private JRadioButton rdBtnFilteredFeatures; |
125 |
private JRadioButton rdBtnAllFeatures; |
126 |
private JTextField txtSQL; |
127 |
private JCheckBox chkLabelFeatures; |
128 |
private LabelTextStylePanel textStyle;
|
129 |
private JPanel sqlPnl; |
130 |
private LabelClassPreview labelPreview;
|
131 |
|
132 |
/*
|
133 |
private String[] fieldNames;
|
134 |
private int[] fieldTypes;
|
135 |
*/
|
136 |
private FeatureStore featureStore = null; |
137 |
private JButton btnDontUseStyle; |
138 |
private boolean accepted = true; |
139 |
|
140 |
|
141 |
|
142 |
/**
|
143 |
* <p>
|
144 |
* Creates a new instance of the dialog that configures all the properties
|
145 |
* of a LabelClass.
|
146 |
* </p>
|
147 |
* @param strategy
|
148 |
* @param asWindow
|
149 |
*/
|
150 |
public LabelClassProperties(FeatureStore fsto) {
|
151 |
|
152 |
featureStore = fsto; |
153 |
initialize(); |
154 |
} |
155 |
|
156 |
private void initialize() { |
157 |
setPreferredSize(new Dimension(810, 580)); |
158 |
setLayout(new BorderLayout(1, 1)); |
159 |
|
160 |
txtName = new JTextField(40); |
161 |
JPanel northPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 15, 2)); |
162 |
northPanel.add(new JLabel(Messages.getText("name") + ":")); |
163 |
northPanel.add(txtName); |
164 |
add(northPanel, BorderLayout.NORTH);
|
165 |
|
166 |
JPanel centerPanel = new JPanel(new BorderLayout(10, 10)); |
167 |
textStyle = new LabelTextStylePanel();
|
168 |
textStyle.addActionListener(this);
|
169 |
centerPanel.add(textStyle, BorderLayout.NORTH);
|
170 |
|
171 |
JPanel labelExpressionsPanel = new JPanel(new BorderLayout(1, 1)); |
172 |
|
173 |
labelExpressionsPanel.add(new JBlank(10, 30), BorderLayout.WEST); |
174 |
labelExpressionsPanel.add(new JScrollPane(getTableFields()), |
175 |
BorderLayout.CENTER);
|
176 |
|
177 |
JPanel a = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 0)); |
178 |
a.add(new JLabel("<html><b>"+Messages.getText("text_fields")+"</b></html>")); |
179 |
centerPanel.add(labelExpressionsPanel, BorderLayout.CENTER);
|
180 |
|
181 |
|
182 |
GridLayout gbl = new GridLayout(3, 1, 0, 6); |
183 |
JPanel auxp = new JPanel(gbl); |
184 |
auxp.add(getBtnVerify()); |
185 |
auxp.add(getBtnAddField()); |
186 |
auxp.add(getBtnRemoveField()); |
187 |
auxp.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); |
188 |
JPanel auxpp = new JPanel(); |
189 |
auxpp.add(auxp); |
190 |
|
191 |
centerPanel.add(auxpp, BorderLayout.EAST);
|
192 |
|
193 |
|
194 |
GridBagLayoutPanel aux = new GridBagLayoutPanel();
|
195 |
// aux.setBorder(BorderFactory.createTitledBorder(PluginServices.getText(
|
196 |
// this, "features")));
|
197 |
rdBtnAllFeatures = new JRadioButton(Messages.getText("all_features")); |
198 |
rdBtnFilteredFeatures = new JRadioButton(Messages.getText("filtered_features") |
199 |
+" (SQL GDBMS)");
|
200 |
|
201 |
rdBtnAllFeatures.addActionListener(this);
|
202 |
rdBtnFilteredFeatures.addActionListener(this);
|
203 |
|
204 |
ButtonGroup g = new ButtonGroup(); |
205 |
g.add(rdBtnAllFeatures); |
206 |
g.add(rdBtnFilteredFeatures); |
207 |
aux.addComponent(chkLabelFeatures = new JCheckBox( |
208 |
Messages.getText("label_features_in_this_class")));
|
209 |
aux.addComponent("", rdBtnAllFeatures);
|
210 |
aux.addComponent("", rdBtnFilteredFeatures);
|
211 |
sqlPnl = new JPanel(new FlowLayout(FlowLayout.LEFT)); |
212 |
sqlPnl.add(new JLabel(" SQL: SELECT * FROM ")); |
213 |
sqlPnl.add(new JLabel("<" + Messages.getText("layer_name") |
214 |
+ ">"));
|
215 |
sqlPnl.add(new JLabel(" WHERE ")); |
216 |
sqlPnl.add(txtSQL = new JTextField(40)); |
217 |
sqlPnl.add(new JLabel(";")); |
218 |
aux.addComponent("", sqlPnl);
|
219 |
|
220 |
|
221 |
JPanel auxPanel = new JPanel(new BorderLayout(1,1)); |
222 |
|
223 |
JPanel aux2 = new JPanel(); |
224 |
auxPanel.setBorder(BorderFactory.createTitledBorder(
|
225 |
Messages.getText("background_style")));
|
226 |
|
227 |
aux2.add(getStylePreviewer()); |
228 |
|
229 |
gbl = new GridLayout(2, 1, 0, 6); |
230 |
JPanel aux3 = new JPanel(gbl); |
231 |
aux3.add(getBtnSelectStyle()); |
232 |
aux3.add(getBtnDontUseStyle()); |
233 |
aux3.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); |
234 |
auxpp = new JPanel(); |
235 |
auxpp.add(aux3); |
236 |
|
237 |
auxPanel.add(aux2,BorderLayout.CENTER);
|
238 |
auxPanel.add(auxpp,BorderLayout.EAST);
|
239 |
|
240 |
JPanel aux4 = new JPanel(new GridLayout(1,2)); |
241 |
aux4.add(auxPanel); |
242 |
aux2 = new JPanel(new BorderLayout()); |
243 |
aux2.setBorder(BorderFactory.createTitledBorder(Messages.getText("preview"))); |
244 |
aux2.add(labelPreview = new LabelClassPreview(), BorderLayout.CENTER); |
245 |
aux4.add(aux2); |
246 |
|
247 |
GridBagLayoutPanel aux5 = new GridBagLayoutPanel();
|
248 |
aux5.addComponent("", aux);
|
249 |
aux5.addComponent(new JBlank(3, 5)); |
250 |
aux5.addComponent("", aux4);
|
251 |
centerPanel.add(aux5, BorderLayout.SOUTH);
|
252 |
add(centerPanel, BorderLayout.CENTER);
|
253 |
|
254 |
add(new AcceptCancelPanel(this, this), BorderLayout.SOUTH); |
255 |
|
256 |
chkLabelFeatures.addActionListener(this);
|
257 |
txtName.addActionListener(this);
|
258 |
|
259 |
} |
260 |
|
261 |
private JComponent getStylePreviewer() { |
262 |
|
263 |
if (styPreviewer == null) { |
264 |
styPreviewer = new StylePreviewer();
|
265 |
styPreviewer.setPreferredSize(new java.awt.Dimension(90,90)); |
266 |
styPreviewer.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED)); |
267 |
((StylePreviewer) styPreviewer).setShowOutline(true);
|
268 |
} |
269 |
return styPreviewer;
|
270 |
|
271 |
} |
272 |
|
273 |
private JButton getBtnSelectStyle() { |
274 |
if (btnSelStyle == null) { |
275 |
btnSelStyle = new JButton(Messages.getText("select")); |
276 |
btnSelStyle.setActionCommand(SELECT_STYLE); |
277 |
btnSelStyle.addActionListener(this);
|
278 |
} |
279 |
|
280 |
return btnSelStyle;
|
281 |
} |
282 |
|
283 |
|
284 |
private JButton getBtnRemoveField() { |
285 |
if (btnRemoveField == null) { |
286 |
btnRemoveField = new JButton(Messages.getText("remove")); |
287 |
btnRemoveField.setActionCommand(DELETE_FIELD); |
288 |
btnRemoveField.addActionListener(this);
|
289 |
} |
290 |
|
291 |
return btnRemoveField;
|
292 |
} |
293 |
|
294 |
private JButton getBtnAddField() { |
295 |
if (btnAddField == null) { |
296 |
btnAddField = new JButton(Messages.getText("add")); |
297 |
btnAddField.setActionCommand(ADD_FIELD); |
298 |
btnAddField.addActionListener(this);
|
299 |
} |
300 |
|
301 |
return btnAddField;
|
302 |
} |
303 |
|
304 |
private JButton getBtnVerify() { |
305 |
if(btnVerify == null) { |
306 |
btnVerify = new JButton(Messages.getText("verify")); |
307 |
btnVerify.setActionCommand(VERIFY); |
308 |
btnVerify.addActionListener(this);
|
309 |
} |
310 |
return btnVerify;
|
311 |
} |
312 |
|
313 |
private JButton getBtnDontUseStyle() { |
314 |
if (btnDontUseStyle == null) { |
315 |
btnDontUseStyle = new JButton(Messages.getText("no_style")); |
316 |
btnDontUseStyle.setActionCommand(CLEAR_STYLE); |
317 |
btnDontUseStyle.addActionListener(this);
|
318 |
} |
319 |
|
320 |
return btnDontUseStyle;
|
321 |
} |
322 |
|
323 |
private JTable getTableFields() { |
324 |
if (tblExpressions == null) { |
325 |
tblExpressions = new JTable(); |
326 |
tblExpressions.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
|
327 |
} |
328 |
|
329 |
return tblExpressions;
|
330 |
} |
331 |
|
332 |
|
333 |
private void setComponentEnabled(Component c, boolean b) { |
334 |
if (c instanceof JComponent) { |
335 |
JComponent c1 = (JComponent) c; |
336 |
for (int i = 0; i < c1.getComponentCount(); i++) { |
337 |
setComponentEnabled(c1.getComponent(i), b); |
338 |
} |
339 |
} |
340 |
c.setEnabled(b); |
341 |
} |
342 |
|
343 |
|
344 |
|
345 |
public void setLabelClass(ILabelClass labelClass) { |
346 |
if (labelClass == null) |
347 |
return;
|
348 |
|
349 |
lc = labelClass; |
350 |
clonedClass = (ILabelClass) LabelClassUtils.clone(lc); |
351 |
|
352 |
labelPreview.setLabelClass(clonedClass); |
353 |
boolean clo_use_sql = LabelClassUtils.isUseSqlQuery(clonedClass);
|
354 |
if (!clo_use_sql) {
|
355 |
rdBtnAllFeatures.setSelected(true);
|
356 |
txtSQL.setText("");
|
357 |
} else {
|
358 |
rdBtnFilteredFeatures.setSelected(true);
|
359 |
txtSQL.setText(clonedClass.getSQLQuery()); |
360 |
} |
361 |
|
362 |
chkLabelFeatures.setSelected(clonedClass.isVisible()); |
363 |
rdBtnFilteredFeatures.setSelected(clo_use_sql); |
364 |
rdBtnAllFeatures.setSelected(!clo_use_sql); |
365 |
((StylePreviewer) styPreviewer).setStyle(clonedClass.getLabelStyle()); |
366 |
txtName.setText(clonedClass.getName()); |
367 |
|
368 |
// String expr = lc.getStringLabelExpression();
|
369 |
|
370 |
/*
|
371 |
String EOExpr = LabelExpressionParser.tokenFor(LabelExpressionParser.EOEXPR);
|
372 |
if (expr == null)
|
373 |
expr = EOExpr;
|
374 |
expr = expr.trim();
|
375 |
if (!expr.endsWith(EOExpr)) {
|
376 |
throw new Error("Invalid expression. Missing EOExpr token ("+EOExpr+").\n"+expr);
|
377 |
}
|
378 |
expr = expr.substring(0, expr.length()-1);
|
379 |
*/
|
380 |
|
381 |
// expr = expr.trim();
|
382 |
|
383 |
ITextSymbol lcTextSymbol = lc.getTextSymbol(); |
384 |
ITextSymbol clonedSymbol = null;
|
385 |
|
386 |
try {
|
387 |
clonedSymbol = (ITextSymbol) lcTextSymbol.clone(); |
388 |
} catch (CloneNotSupportedException e) { |
389 |
logger.error("While clonin.", e);
|
390 |
} |
391 |
|
392 |
textStyle.setModel( |
393 |
clonedSymbol, //lc.getTextSymbol(),
|
394 |
lc.getUnit(), |
395 |
lc.getReferenceSystem()); |
396 |
|
397 |
getTableFields().setRowHeight(22);
|
398 |
getTableFields().setModel(new FieldTableExpressions(lc.getLabelExpressions()));
|
399 |
TableColumnModel colMod = getTableFields().getColumnModel();
|
400 |
colMod.getColumn(0).setPreferredWidth(100); |
401 |
colMod.getColumn(0).setWidth(100); |
402 |
colMod.getColumn(1).setResizable(true); |
403 |
colMod.getColumn(1).setPreferredWidth(513); |
404 |
|
405 |
FeatureAttributeDescriptor[] atts = null; |
406 |
|
407 |
try {
|
408 |
atts = featureStore.getDefaultFeatureType().getAttributeDescriptors(); |
409 |
} catch (DataException e) {
|
410 |
logger.error("While getting attributes.", e);
|
411 |
} |
412 |
|
413 |
getTableFields().setDefaultEditor( |
414 |
Object.class,
|
415 |
new DefaultEditor(atts));
|
416 |
repaint(); |
417 |
|
418 |
actionPerformed(new ActionEvent(this, 0, null)); |
419 |
} |
420 |
|
421 |
private class DefaultEditor extends AbstractCellEditor implements |
422 |
TableCellEditor, ActionListener { |
423 |
|
424 |
JPanel editor;
|
425 |
LabelExpressionEditorPanel dialog; |
426 |
private JTextField text; |
427 |
private JButton button; |
428 |
protected static final String EDIT = "edit"; |
429 |
|
430 |
public DefaultEditor(FeatureAttributeDescriptor[] atts) { |
431 |
editor = new JPanel(); |
432 |
editor.setLayout(new GridBagLayout()); |
433 |
GridBagConstraints cons = new GridBagConstraints(); |
434 |
// cons.anchor = GridBagConstraints.FIRST_LINE_START;
|
435 |
cons.fill = cons.BOTH; |
436 |
cons.weightx=1.0;
|
437 |
cons.weighty =1.0;
|
438 |
text = new JTextField(); |
439 |
editor.add(text, cons); |
440 |
|
441 |
GridBagConstraints cons1 = new GridBagConstraints(); |
442 |
// cons.anchor = GridBagConstraints.FIRST_LINE_END;
|
443 |
cons1.fill = cons1.VERTICAL; |
444 |
cons1.weighty =1.0;
|
445 |
// cons.gridheight = GridBagConstraints.REMAINDER;
|
446 |
button = new JButton("..."); |
447 |
button.setActionCommand(DefaultEditor.EDIT); |
448 |
button.addActionListener(this);
|
449 |
editor.add(button,cons1); |
450 |
|
451 |
editor.updateUI(); |
452 |
|
453 |
// Set up the dialog that the button brings up.
|
454 |
dialog = new LabelExpressionEditorPanel(atts);
|
455 |
} |
456 |
|
457 |
public void actionPerformed(ActionEvent e) { |
458 |
if (EDIT.equals(e.getActionCommand())) {
|
459 |
|
460 |
dialog.setValue(text.getText()); |
461 |
ApplicationLocator.getManager().getUIManager().addWindow(dialog); |
462 |
//fireEditingStopped(); // Make the renderer reappear.
|
463 |
text.setText(dialog.getValue()); |
464 |
} |
465 |
} |
466 |
|
467 |
// Implement the one CellEditor method that AbstractCellEditor doesn't.
|
468 |
public Object getCellEditorValue() { |
469 |
return text.getText();
|
470 |
} |
471 |
|
472 |
// Implement the one method defined by TableCellEditor.
|
473 |
public Component getTableCellEditorComponent(JTable table, |
474 |
Object value, boolean isSelected, int row, int column) { |
475 |
text.setText((String) value);
|
476 |
return editor;
|
477 |
} |
478 |
} |
479 |
|
480 |
|
481 |
|
482 |
|
483 |
public WindowInfo getWindowInfo() {
|
484 |
WindowInfo wi = new WindowInfo(WindowInfo.MODALDIALOG
|
485 |
| WindowInfo.RESIZABLE); |
486 |
wi.setTitle(Messages.getText("label_class_properties"));
|
487 |
wi.setWidth(getPreferredSize().width + 8);
|
488 |
wi.setHeight(getPreferredSize().height); |
489 |
return wi;
|
490 |
} |
491 |
|
492 |
public Object getWindowProfile() { |
493 |
return WindowInfo.DIALOG_PROFILE;
|
494 |
} |
495 |
|
496 |
|
497 |
/*
|
498 |
* Return a hashtable with example values.
|
499 |
* Only for verification purposes.
|
500 |
private Hashtable<String, Value> getValuesTable(String[] fNames, int[] fTypes) {
|
501 |
|
502 |
Hashtable<String, Value> parser_symbol_table = new Hashtable<String, Value>();
|
503 |
|
504 |
Random rand = new Random();
|
505 |
byte b = 0;
|
506 |
short s = (short)rand.nextInt(Short.MAX_VALUE);
|
507 |
int i = rand.nextInt();
|
508 |
long l = rand.nextLong();
|
509 |
boolean bool = rand.nextBoolean();
|
510 |
float f = rand.nextFloat();
|
511 |
double d = rand.nextDouble();
|
512 |
|
513 |
for (int j = 0; j < fNames.length; j++) {
|
514 |
Value value=null;
|
515 |
|
516 |
int type = fTypes[j];
|
517 |
switch (type) {
|
518 |
case Types.BIGINT:
|
519 |
value = ValueFactory.createValue(l);
|
520 |
break;
|
521 |
case Types.BIT:
|
522 |
case Types.BOOLEAN:
|
523 |
value = ValueFactory.createValue(bool);
|
524 |
break;
|
525 |
case Types.CHAR:
|
526 |
case Types.VARCHAR:
|
527 |
case Types.LONGVARCHAR:
|
528 |
value = ValueFactory.createValue("");
|
529 |
break;
|
530 |
case Types.DATE:
|
531 |
Date auxDate = new Date();
|
532 |
if (auxDate != null){
|
533 |
value = ValueFactory.createValue(auxDate);
|
534 |
}
|
535 |
break;
|
536 |
case Types.DECIMAL:
|
537 |
case Types.NUMERIC:
|
538 |
case Types.FLOAT:
|
539 |
case Types.DOUBLE:
|
540 |
value = ValueFactory.createValue(d);
|
541 |
break;
|
542 |
case Types.INTEGER:
|
543 |
value = ValueFactory.createValue(i);
|
544 |
break;
|
545 |
case Types.REAL:
|
546 |
value = ValueFactory.createValue(f);
|
547 |
break;
|
548 |
case Types.SMALLINT:
|
549 |
value = ValueFactory.createValue(s);
|
550 |
break;
|
551 |
case Types.TINYINT:
|
552 |
value = ValueFactory.createValue(b);
|
553 |
break;
|
554 |
case Types.BINARY:
|
555 |
case Types.VARBINARY:
|
556 |
case Types.LONGVARBINARY:
|
557 |
byte[] auxByteArray = {b}; //new byte[1];
|
558 |
value = ValueFactory.createValue(auxByteArray);
|
559 |
break;
|
560 |
case Types.TIMESTAMP:
|
561 |
value = ValueFactory.createValue(new Timestamp(l));
|
562 |
break;
|
563 |
case Types.TIME:
|
564 |
value = ValueFactory.createValue(new Time(l));
|
565 |
break;
|
566 |
default:
|
567 |
value = ValueFactory.createValue("");
|
568 |
break;
|
569 |
}
|
570 |
parser_symbol_table.put(fNames[j], value);
|
571 |
}
|
572 |
return parser_symbol_table;
|
573 |
}
|
574 |
*/
|
575 |
|
576 |
|
577 |
/*
|
578 |
private boolean verifyExpresion(String expresion, Hashtable<String, Value> symbols){
|
579 |
LabelExpressionParser parser;
|
580 |
try {
|
581 |
parser = new LabelExpressionParser(new StringReader(expresion),symbols);
|
582 |
parser.LabelExpression();
|
583 |
Expression expr = ((Expression)parser.getStack().pop());
|
584 |
expr.evaluate();
|
585 |
} catch (ExpressionException e2) {
|
586 |
return false;
|
587 |
} catch (Exception e3) {
|
588 |
return false;
|
589 |
}
|
590 |
return true;
|
591 |
}
|
592 |
*/
|
593 |
|
594 |
private boolean verifyExpressions(){ |
595 |
|
596 |
String[] expressions = ((FieldTableExpressions) getTableFields().getModel()).getExpression(); |
597 |
if(expressions.length == 1 && expressions[0].equals("")){ |
598 |
return true; |
599 |
} |
600 |
boolean result = true; |
601 |
String message = ""; |
602 |
for (int i = 0; i < expressions.length; i++) { |
603 |
String expresion = expressions[i];
|
604 |
|
605 |
if( !LabelClassUtils.validExpression(expresion, featureStore, false) ){ |
606 |
result = false;
|
607 |
if(message.compareTo("")!=0){ |
608 |
message = message + " , " + (i+1); |
609 |
} else {
|
610 |
message = " " + Messages.getText("at_fields")+" "+(i+1); |
611 |
} |
612 |
} |
613 |
} |
614 |
message = message +".";
|
615 |
if(!result){
|
616 |
JOptionPane.showMessageDialog(
|
617 |
ApplicationLocator.getManager().getRootComponent(), |
618 |
Messages.getText("malformed_or_empty_expression") + message,
|
619 |
Messages.getText("verify"),
|
620 |
JOptionPane.ERROR_MESSAGE);
|
621 |
} else {
|
622 |
JOptionPane.showMessageDialog(
|
623 |
ApplicationLocator.getManager().getRootComponent(), |
624 |
Messages.getText("_Expressions_are_correct"),
|
625 |
Messages.getText("verify"),
|
626 |
JOptionPane.INFORMATION_MESSAGE);
|
627 |
} |
628 |
return result;
|
629 |
} |
630 |
|
631 |
public boolean isAccepted(){ |
632 |
return accepted;
|
633 |
} |
634 |
|
635 |
public void actionPerformed(ActionEvent e) { |
636 |
setComponentEnabled(sqlPnl, rdBtnFilteredFeatures.isSelected()); |
637 |
applySettings(); |
638 |
if ("OK".equals(e.getActionCommand())) { |
639 |
clonedClass.setUnit(textStyle.getUnit()); |
640 |
clonedClass.setReferenceSystem(textStyle.getReferenceSystem()); |
641 |
clonedClass.setTextSymbol(textStyle.getTextSymbol()); |
642 |
lc = clonedClass; |
643 |
accepted = true;
|
644 |
try {
|
645 |
ApplicationLocator.getManager().getUIManager().closeWindow(this);
|
646 |
} catch (Exception ex) { |
647 |
// this only happens when running this as stand-alone app
|
648 |
// from main method;
|
649 |
logger.error("While closing window.", ex);
|
650 |
} |
651 |
} else if ("CANCEL".equals(e.getActionCommand())) { |
652 |
accepted = false;
|
653 |
setLabelClass(lc); |
654 |
try {
|
655 |
ApplicationLocator.getManager().getUIManager().closeWindow(this);
|
656 |
} catch (Exception ex) { |
657 |
// this only happens when running this as stand-alone app
|
658 |
// from main method;
|
659 |
logger.error("While closing window.", ex);
|
660 |
} |
661 |
} else if (CLEAR_STYLE.equals(e.getActionCommand())) { |
662 |
clonedClass.setLabelStyle(null);
|
663 |
// styPreviewer.setStyle(null);
|
664 |
((StylePreviewer) styPreviewer).setStyle(null);
|
665 |
} else if (TEST_SQL.equals(e.getActionCommand())) { |
666 |
logger.info("TEST_SQL = " + TEST_SQL);
|
667 |
} else if (DELETE_FIELD.equals(e.getActionCommand())) { |
668 |
int[] rowInd = getTableFields().getSelectedRows(); |
669 |
for (int i = rowInd.length-1; i >= 0 ; i--) { |
670 |
delField(rowInd[i]); |
671 |
} |
672 |
clonedClass.setLabelExpressions(((FieldTableExpressions) getTableFields().getModel()).getExpression()); |
673 |
setLabelClass(clonedClass); |
674 |
} else if (VERIFY.equals(e.getActionCommand())) { |
675 |
verifyExpressions(); |
676 |
} else if (ADD_FIELD.equals(e.getActionCommand())) { |
677 |
addField(); |
678 |
} else if (SELECT_STYLE.equals(e.getActionCommand())) { |
679 |
|
680 |
IStyle myStyle = ((StylePreviewer)styPreviewer).getStyle(); |
681 |
|
682 |
FeatureType fty = null;
|
683 |
|
684 |
try {
|
685 |
fty = featureStore.getDefaultFeatureType(); |
686 |
} catch (DataException e1) {
|
687 |
logger.error("While getting feat type.", e1);
|
688 |
} |
689 |
|
690 |
int geotype = fty.getDefaultGeometryAttribute().getGeomType().getType();
|
691 |
|
692 |
SingleStyleSelectorFilter filter = |
693 |
new SingleStyleSelectorFilter(ILabelStyle.class);
|
694 |
StyleSelector stySel = null;
|
695 |
|
696 |
try {
|
697 |
stySel = new StyleSelector(myStyle, geotype, filter);
|
698 |
} catch (IllegalArgumentException iae) { |
699 |
JOptionPane.showMessageDialog(this, |
700 |
Messages.getText("_Option_not_available_for_this_geometry_type"),
|
701 |
getWindowInfo().getTitle(), |
702 |
JOptionPane.WARNING_MESSAGE);
|
703 |
return;
|
704 |
} |
705 |
|
706 |
ApplicationLocator.getManager().getUIManager().addWindow(stySel); |
707 |
ILabelStyle sty = (ILabelStyle) stySel.getSelectedObject(); |
708 |
|
709 |
if (sty != null) { |
710 |
// gather the style and apply to the class
|
711 |
clonedClass.setLabelStyle(sty); |
712 |
clonedClass.setUnit(stySel.getUnit()); |
713 |
clonedClass.setReferenceSystem(stySel.getReferenceSystem()); |
714 |
setLabelClass(clonedClass); |
715 |
} |
716 |
|
717 |
// styPreviewer.setStyle(sty);
|
718 |
((StylePreviewer) styPreviewer).setStyle(sty); |
719 |
|
720 |
}else if (e.getSource().equals(rdBtnAllFeatures) || e.getSource().equals(rdBtnFilteredFeatures)){ |
721 |
clonedClass.setUseSqlQuery(rdBtnFilteredFeatures.isSelected()); |
722 |
} |
723 |
|
724 |
repaint(); |
725 |
} |
726 |
|
727 |
private void applySettings() { |
728 |
clonedClass.setVisible(chkLabelFeatures.isSelected()); |
729 |
clonedClass.setName(txtName.getText()); |
730 |
clonedClass.setSQLQuery(txtSQL.getText()); |
731 |
JTable tableFields=getTableFields();
|
732 |
TableCellEditor cellEditor=tableFields.getCellEditor();
|
733 |
if(cellEditor != null){ |
734 |
int row = tableFields.getEditingRow();
|
735 |
int column = tableFields.getEditingColumn();
|
736 |
cellEditor.stopCellEditing(); |
737 |
Object value = cellEditor.getCellEditorValue();
|
738 |
|
739 |
if (value != null) { |
740 |
((FieldTableExpressions) tableFields. |
741 |
getModel()).setValueAt(value, row, column); |
742 |
} |
743 |
} |
744 |
clonedClass.setLabelExpressions( |
745 |
((FieldTableExpressions) tableFields. |
746 |
getModel()).getExpression()); |
747 |
clonedClass.setTextSymbol(textStyle.getTextSymbol()); |
748 |
} |
749 |
|
750 |
private void addField() { |
751 |
addField("");
|
752 |
} |
753 |
|
754 |
private void addField(String fieldExpr) { |
755 |
FieldTableExpressions m = ((FieldTableExpressions) getTableFields().getModel()); |
756 |
m.addRow(new Object[] { m.getRowCount()+1, fieldExpr }); |
757 |
} |
758 |
|
759 |
private void delField(int fieldIndex) { |
760 |
try {
|
761 |
((FieldTableExpressions) getTableFields().getModel()).removeRow(fieldIndex); |
762 |
} catch (ArrayIndexOutOfBoundsException ex) {} |
763 |
} |
764 |
|
765 |
|
766 |
public ILabelClass getLabelClass() {
|
767 |
return lc;
|
768 |
} |
769 |
|
770 |
|
771 |
|
772 |
private static final Object[] TABLE_HEADERS = new String[] { |
773 |
|
774 |
Messages.getText("field_number"),
|
775 |
Messages.getText("label_expression")
|
776 |
}; |
777 |
|
778 |
/*
|
779 |
private static String fieldSeparator =
|
780 |
LabelExpressionParser.tokenImage[LabelExpressionParser.EOFIELD].replaceAll("\"", "");
|
781 |
*/
|
782 |
|
783 |
private class FieldTableExpressions extends DefaultTableModel { |
784 |
private static final long serialVersionUID = 2002427714889477770L; |
785 |
public FieldTableExpressions(String[] expressions) { |
786 |
super();
|
787 |
|
788 |
if(expressions != null && expressions.length > 0){ |
789 |
Integer[] aux = new Integer[expressions.length]; |
790 |
for (int i = 0; i < aux.length; i++) { |
791 |
aux[i] = i+1;
|
792 |
} |
793 |
|
794 |
Object[][] values = new Object[aux.length][2]; |
795 |
for (int i = 0; i < values.length; i++) { |
796 |
values[i][0] = aux[i];
|
797 |
values[i][1] = expressions[i];
|
798 |
} |
799 |
setDataVector(values, TABLE_HEADERS); |
800 |
} |
801 |
else{
|
802 |
Object[][] values = new Object[1][2]; |
803 |
values[0][0] = 1; |
804 |
values[0][1] = ""; |
805 |
setDataVector(values,TABLE_HEADERS); |
806 |
} |
807 |
|
808 |
} |
809 |
|
810 |
|
811 |
@Override
|
812 |
public boolean isCellEditable(int row, int column) { |
813 |
return column == 1; |
814 |
} |
815 |
|
816 |
public String[] getExpression() { |
817 |
|
818 |
String[] expressions = new String[getRowCount()]; |
819 |
|
820 |
for (int i = 0; i < getRowCount(); i++) { |
821 |
expressions[i] = ""+(String) getValueAt(i,1); |
822 |
} |
823 |
return expressions;
|
824 |
} |
825 |
|
826 |
} |
827 |
|
828 |
// public static void main(String[] args) {
|
829 |
// JFrame f = new JFrame("Test LabelClassProperties panel");
|
830 |
//
|
831 |
// String xmlString =
|
832 |
// "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n" +
|
833 |
// "<xml-tag xmlns=\"http://www.gvsig.gva.es\">\n" +
|
834 |
// " <property key=\"className\" value=\"com.iver.cit.gvsig.fmap.rendering.styling.labeling.LabelClass\"/>\n" +
|
835 |
// " <property key=\"isVisible\" value=\"false\"/>\n" +
|
836 |
// " <property key=\"name\" value=\"Default\"/>\n" +
|
837 |
// " <property key=\"labelExpression\" value=\"[TIPO] : lao39805502232 : Substring([MOTO], 2,2);\"/>\n" +
|
838 |
// " <property key=\"unit\" value=\"-1\"/>\n" +
|
839 |
// " <property key=\"referenceSystem\" value=\"0\"/>\n" +
|
840 |
// " <property key=\"sqlQuery\" value=\"TIPO = 'C'\"/>\n" +
|
841 |
// " <property key=\"priority\" value=\"0\"/>\n" +
|
842 |
// " <xml-tag>\n" +
|
843 |
// " <property key=\"className\" value=\"org.gvsig.symbology.fmap.styles.SimpleLabelStyle\"/>\n" +
|
844 |
// " <property key=\"desc\" value=\"Placa Carrer VLC.style\"/>\n" +
|
845 |
// " <property key=\"markerPointX\" value=\"0.0\"/>\n" +
|
846 |
// " <property key=\"markerPointY\" value=\"0.0\"/>\n" +
|
847 |
// " <property key=\"minXArray\" value=\"0.35 ,0.25\"/>\n" +
|
848 |
// " <property key=\"minYArray\" value=\"0.15 ,0.5\"/>\n" +
|
849 |
// " <property key=\"widthArray\" value=\"0.5 ,0.6\"/>\n" +
|
850 |
// " <property key=\"heightArray\" value=\"0.27 ,0.37\"/>\n" +
|
851 |
// " <property key=\"id\" value=\"labelStyle\"/>\n" +
|
852 |
// " <xml-tag>\n" +
|
853 |
// " <property key=\"className\" value=\"org.gvsig.symbology.fmap.styles.RemoteFileStyle\"/>\n" +
|
854 |
// " <property key=\"source\" value=\"http://www.boomlapop.com/boomlapop.jpg\"/>\n" +
|
855 |
// " <property key=\"desc\"/>\n" +
|
856 |
// " <property key=\"id\" value=\"LabelStyle\"/>\n" +
|
857 |
// " </xml-tag>\n" +
|
858 |
// " </xml-tag>\n" +
|
859 |
// " <xml-tag>\n" +
|
860 |
// " <property key=\"className\" value=\"com.iver.cit.gvsig.fmap.core.symbols.SimpleTextSymbol\"/>\n" +
|
861 |
// " <property key=\"desc\"/>\n" +
|
862 |
// " <property key=\"isShapeVisible\" value=\"true\"/>\n" +
|
863 |
// " <property key=\"font\" value=\"Arial\"/>\n" +
|
864 |
// " <property key=\"fontStyle\" value=\"1\"/>\n" +
|
865 |
// " <property key=\"size\" value=\"12\"/>\n" +
|
866 |
// " <property key=\"text\" value=\"GeneralLabeling.sample_text\"/>\n" +
|
867 |
// " <property key=\"textColor\" value=\"255,255,0,255\"/>\n" +
|
868 |
// " <property key=\"unit\" value=\"-1\"/>\n" +
|
869 |
// " <property key=\"referenceSystem\" value=\"0\"/>\n" +
|
870 |
// " <property key=\"id\" value=\"TextSymbol\"/>\n" +
|
871 |
// " </xml-tag>\n" +
|
872 |
// "</xml-tag>\n" +
|
873 |
// "";
|
874 |
//
|
875 |
// LabelClass lc = null;
|
876 |
// try {
|
877 |
// XMLEntity xml = new XMLEntity((XmlTag) XmlTag.unmarshal(
|
878 |
// XMLEncodingUtils.getReader(new ByteArrayInputStream(xmlString.getBytes()))));
|
879 |
// lc = new LabelClass();
|
880 |
// lc.setXMLEntity(xml);
|
881 |
// } catch (Exception e) {
|
882 |
// e.printStackTrace();
|
883 |
// }
|
884 |
// String[] names = new String[] { "Field1", "Field2", "Field3" };
|
885 |
// int[] types = new int[] { Types.VARCHAR, Types.INTEGER, Types.DOUBLE };
|
886 |
// final LabelClassProperties lcp = new LabelClassProperties(
|
887 |
// names, types ) {
|
888 |
// private static final long serialVersionUID = -1843509415649666459L;
|
889 |
//
|
890 |
// @Override
|
891 |
// public void actionPerformed(ActionEvent e) {
|
892 |
// super.actionPerformed(e);
|
893 |
// if ("OK".equals(e.getActionCommand())) {
|
894 |
// Sys tem.out.println(getLabelClass().getXMLEntity());
|
895 |
// }
|
896 |
// }
|
897 |
// };
|
898 |
// lcp.setLabelClass(lc);
|
899 |
// f.setContentPane(lcp);
|
900 |
// f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
901 |
// f.pack();
|
902 |
// f.setVisible(true);
|
903 |
//
|
904 |
// }
|
905 |
|
906 |
} |