Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extSymbology / src / org / gvsig / symbology / gui / layerproperties / FeatureDependent.java @ 23903

History | View | Annotate | Download (17 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.symbology.gui.layerproperties;
42

    
43
import java.awt.BorderLayout;
44
import java.awt.Component;
45
import java.awt.Dimension;
46
import java.awt.event.ActionEvent;
47
import java.awt.event.ActionListener;
48
import java.awt.event.MouseAdapter;
49
import java.awt.event.MouseEvent;
50
import java.beans.PropertyChangeEvent;
51

    
52
import javax.swing.AbstractCellEditor;
53
import javax.swing.JCheckBox;
54
import javax.swing.JComponent;
55
import javax.swing.JLabel;
56
import javax.swing.JOptionPane;
57
import javax.swing.JPanel;
58
import javax.swing.JScrollPane;
59
import javax.swing.JTable;
60
import javax.swing.ListSelectionModel;
61
import javax.swing.event.TableModelEvent;
62
import javax.swing.event.TableModelListener;
63
import javax.swing.table.DefaultTableModel;
64
import javax.swing.table.TableCellEditor;
65
import javax.swing.table.TableCellRenderer;
66
import javax.swing.table.TableColumnModel;
67

    
68
import org.gvsig.gui.beans.swing.GridBagLayoutPanel;
69
import org.gvsig.gui.beans.swing.JBlank;
70
import org.gvsig.gui.beans.swing.JButton;
71
import org.gvsig.gui.beans.swing.celleditors.BooleanTableCellEditor;
72
import org.gvsig.gui.beans.swing.cellrenderers.BooleanTableCellRenderer;
73
import org.gvsig.symbology.fmap.labeling.FeatureDependentLabeled;
74
import org.gvsig.symbology.fmap.labeling.parse.LabelExpressionParser;
75

    
76
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
77
import com.iver.andami.PluginServices;
78
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
79
import com.iver.cit.gvsig.fmap.rendering.styling.labeling.ILabelingMethod;
80
import com.iver.cit.gvsig.fmap.rendering.styling.labeling.LabelClass;
81

    
82
public class FeatureDependent extends AbstractLabelingMethodPanel implements ActionListener{
83
        private static final long serialVersionUID = 5493451803343695650L;
84
        private static int NAME_FIELD_INDEX = 0;
85
        private static int PREVIEW_FIELD_INDEX = 1;
86
        private static int FILTER_FIELD_INDEX = 2;
87
        private static int LABEL_EXPRESSION_FIELD_INDEX = 3;
88
        private static int VISIBLE_FIELD_INDEX = 4;
89
        JTable tblClasses = null;
90
        private JButton btnMoveUpClass;
91
        private JButton btnAddClass;
92
        private JCheckBox chkLabel;
93
        private JCheckBox chkDefinePriorities;
94
        private JScrollPane scrlPan;
95
        private boolean openEditor = false;
96
        private JButton btnMoveDownClass;
97
        private JButton btnDelClass;
98
        private String[] fieldNames;
99
        private int[] fieldTypes;
100
        private GridBagLayoutPanel buttonPanel;
101

    
102
        @Override
103
        public String getName() {
104
                return PluginServices.getText(
105
                                this,
106
                "define_classes_of_features_and_label_each_differently")+".";
107
        }
108

    
109
        @Override
110
        public Class<? extends ILabelingMethod> getLabelingMethodClass() {
111
                return FeatureDependentLabeled.class;
112
        }
113

    
114

    
115
        private JCheckBox getChkDefinePriorities() {
116
                if (chkDefinePriorities == null) {
117
                        chkDefinePriorities = new JCheckBox(PluginServices.getText(this, "label_priority"));
118
                        chkDefinePriorities.addActionListener(this);
119
                        chkDefinePriorities.setName("CHK_DEFINE_PRIORITIES");
120
                }
121
                return chkDefinePriorities;
122
        }
123

    
124

    
125
        private JButton getBtnDelClass() {
126
                if (btnDelClass == null) {
127
                        btnDelClass = new JButton(PluginServices.getText(this, "delete"));
128
                        btnDelClass.setName("BTNDELCLASS");
129
                        btnDelClass.addActionListener(this);
130
                }
131
                return btnDelClass;
132
        }
133

    
134
        private JButton getBtnAddClass() {
135
                if (btnAddClass == null) {
136
                        btnAddClass = new JButton(PluginServices.getText(this, "add"));
137
                        btnAddClass.setName("BTNADDCLASS");
138
                        btnAddClass.addActionListener(this);
139
                }
140
                return btnAddClass;
141
        }
142

    
143
        private JButton getBtnMoveUpClass() {
144
                if (btnMoveUpClass == null) {
145
                        btnMoveUpClass = new JButton(PluginServices.getText(this, "move_up"));
146
                        btnMoveUpClass.setName("BTNMOVEUPCLASS");
147
                        btnMoveUpClass.addActionListener(this);
148
                }
149
                return btnMoveUpClass;
150
        }
151

    
152
        private JButton getBtnMoveDownClass() {
153
                if (btnMoveDownClass == null) {
154
                        btnMoveDownClass = new JButton(PluginServices.getText(this, "move_down"));
155
                        btnMoveDownClass.setName("BTNMOVEDOWNCLASS");
156
                        btnMoveDownClass.addActionListener(this);
157
                }
158
                return btnMoveDownClass;
159
        }
160

    
161
        private JScrollPane getCenterScrl() {
162

    
163
                scrlPan = new JScrollPane(getTblClasses());
164
                scrlPan.setPreferredSize(new Dimension(180, 300));
165

    
166
                return scrlPan;
167
        }
168

    
169

    
170
        private JTable getTblClasses() {
171

    
172
                tblClasses = new JTable(new LabelClassTableModel());
173
                tblClasses.setRowHeight(50);
174
                tblClasses.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
175
                tblClasses.addMouseListener(new MouseAdapter() {
176
                        int prevRow =-1;
177
                        @Override
178
                        public void mouseClicked(MouseEvent e) {
179
                                int col = tblClasses.getColumnModel().getColumnIndexAtX(e.getX());
180
                                int row = (int) ((e.getY()-tblClasses.getLocation().getY()) / tblClasses.getRowHeight());
181
                                if(!(row > tblClasses.getRowCount()-1 || col > tblClasses.getColumnCount()-1))
182
                                {
183
                                        openEditor = (row == prevRow && e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2
184
                                        ) ;
185
                                        prevRow = row;
186
                                        if (openEditor)
187
                                                tblClasses.editCellAt(row, col);
188
                                }
189
                        }
190
                });
191

    
192
                tblClasses.getModel().addTableModelListener(new TableModelListener() {
193

    
194
                        public void tableChanged(TableModelEvent e) {
195
                                if(e.getColumn() == VISIBLE_FIELD_INDEX){
196
                                        System.err.println("ahora toca cambiar la visibilidad");
197
                                        LabelClass oldLc = (LabelClass) tblClasses.getValueAt(e.getFirstRow(), PREVIEW_FIELD_INDEX);
198
                                        oldLc.setVisible(Boolean.valueOf(tblClasses.getValueAt(e.getFirstRow(), VISIBLE_FIELD_INDEX).toString()));
199
                                }
200
                        }
201

    
202
                });
203

    
204
                TableColumnModel cm = tblClasses.getColumnModel();
205

    
206
                tblClasses.getColumnModel().getColumn(PREVIEW_FIELD_INDEX).setCellRenderer(new TableCellRenderer() {
207

    
208
                        public Component getTableCellRendererComponent(JTable table,
209
                                        Object value, boolean isSelected, boolean hasFocus,
210
                                        int row, int column) {
211
                                LabelClassPreview lcPr = new LabelClassPreview();
212
                                lcPr.setLabelClass((LabelClass) value);
213
                                return lcPr;
214
                        }
215

    
216
                });
217
                tblClasses.getColumnModel().getColumn(VISIBLE_FIELD_INDEX).setCellRenderer(new BooleanTableCellRenderer(false));
218
                tblClasses.getColumnModel().getColumn(LABEL_EXPRESSION_FIELD_INDEX).setCellRenderer(new TableCellRenderer() {
219
                        public Component getTableCellRendererComponent(JTable table,
220
                                        Object value, boolean isSelected, boolean hasFocus,
221
                                        int row, int column) {
222
                                String expr = null;
223
                                if (value != null)
224
                                        expr = (String) value;
225
                                if (expr == null)
226
                                        expr = LabelExpressionParser.tokenFor(LabelExpressionParser.EOEXPR);
227

    
228
//                                expr = expr.replaceAll(LabelExpressionParser.tokenFor(LabelExpressionParser.EOFIELD), " | ");
229
                                expr = expr.substring(0, expr.length()-1);
230
                                return new JLabel("<html><p>"+expr+"</p></html>", JLabel.CENTER);
231
                        }
232
                });
233

    
234
                // the editors
235

    
236
                for (int i = 0; i < tblClasses.getColumnModel().getColumnCount(); i++) {
237
                        if (i!= VISIBLE_FIELD_INDEX) {
238
                                tblClasses.getColumnModel().getColumn(i).setCellEditor(new LabelClassCellEditor());
239
                        } else {
240
                                tblClasses.getColumnModel().getColumn(VISIBLE_FIELD_INDEX).
241
                                setCellEditor(new BooleanTableCellEditor(tblClasses));
242
                        }
243
                }
244
                ((DefaultTableModel)tblClasses.getModel()).fireTableDataChanged();
245
                repaint();
246

    
247
                return tblClasses;
248
        }
249

    
250

    
251
        private class LabelClassCellEditor extends AbstractCellEditor implements TableCellEditor {
252
                private static final long serialVersionUID = 6399823783851437400L;
253

    
254
                public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
255
                        if (openEditor) {
256
                                LabelClass oldLc = (LabelClass) tblClasses.getValueAt(row, PREVIEW_FIELD_INDEX);
257
                                oldLc.setVisible(Boolean.valueOf(tblClasses.getValueAt(row, VISIBLE_FIELD_INDEX).toString()));
258
                                LabelClassProperties lcProp = new LabelClassProperties(fieldNames, fieldTypes);
259
                                oldLc.setTexts(new String[] {oldLc.getName()});
260
                                lcProp.setLabelClass(oldLc);
261
                                PluginServices.getMDIManager()
262
                                .addWindow(lcProp);
263
                                LabelClass newLc = lcProp.getLabelClass();
264

    
265
                                LabelClassTableModel m = (LabelClassTableModel) tblClasses.getModel();
266
                                Boolean changeDone = false;
267

    
268
                                if (!(oldLc.getName().equals(newLc.getName())))
269
                                        if(!checSameLablClassName(m,newLc.getName())){
270

    
271
                                                m.setValueAt(newLc.getStringLabelExpression(), row, LABEL_EXPRESSION_FIELD_INDEX);
272
                                                m.setValueAt(newLc.getName(), row, NAME_FIELD_INDEX);
273
                                                m.setValueAt(newLc, row, PREVIEW_FIELD_INDEX);
274
                                                m.setValueAt(newLc.getSQLQuery(), row, FILTER_FIELD_INDEX);
275
                                                m.setValueAt(newLc.isVisible(), row, VISIBLE_FIELD_INDEX);
276
                                                fireEditingStopped(); //Make the renderer reappear.
277
                                                changeDone = true;
278
                                        }
279
                                        else {
280
                                                JOptionPane.showMessageDialog(tblClasses, PluginServices.getText(this, "cannot_exist_two_label_classes_with_the_same_name")+"\n",PluginServices.getText(this,"error"),JOptionPane.ERROR_MESSAGE);
281
                                                changeDone = true;
282
                                        }
283
                                if (!changeDone){
284
                                        m.setValueAt(newLc.getStringLabelExpression(), row, LABEL_EXPRESSION_FIELD_INDEX);
285
                                        m.setValueAt(newLc.getName(), row, NAME_FIELD_INDEX);
286
                                        m.setValueAt(newLc, row, PREVIEW_FIELD_INDEX);
287
                                        m.setValueAt(newLc.getSQLQuery(), row, FILTER_FIELD_INDEX);
288
                                        m.setValueAt(newLc.isVisible(), row, VISIBLE_FIELD_INDEX);
289
                                        fireEditingStopped(); //Make the renderer reappear.
290
                                        changeDone = true;
291
                                }
292
                        }
293

    
294
                        method.clearAllClasses();
295
                        LabelClass[] classes = ((LabelClassTableModel)tblClasses.getModel()).toLabelClassArray();
296
                        for (int i = 0; i < classes.length; i++) {
297
                                method.addLabelClass(classes[i]);
298
                        }
299

    
300
                        openEditor = false;
301
                        return null;
302
                }
303

    
304
                public Object getCellEditorValue() {
305
                        return null;
306
                }
307

    
308
        }
309

    
310

    
311
        private boolean checSameLablClassName(LabelClassTableModel mod, String name) {
312
                for (int i = 0; i < mod.getRowCount(); i++) {
313
                        if(name.equals(mod.getLabelAtRow(i).getName()))
314
                                return true;
315
                }
316
                return false;
317
        }
318

    
319

    
320
        private class LabelClassTableModel extends DefaultTableModel {
321
                private static final long serialVersionUID = -9152998982339430209L;
322
                Object[][] values;
323

    
324
                private String[] classesTableFieldNames = new String[] {
325
                                PluginServices.getText(this, "name"),
326
                                PluginServices.getText(this, "preview"),
327
                                PluginServices.getText(this, "filter"),
328
                                PluginServices.getText(this, "label_expression"),
329
                                PluginServices.getText(this, "visible"),
330
                };
331

    
332

    
333
                public LabelClassTableModel() {
334
                        super();
335
                        LabelClass[] labelClasses = method.getLabelClasses();
336

    
337
                        values = new Object[labelClasses.length][classesTableFieldNames.length];
338
                        for (int i = 0; i < values.length; i++) {
339
                                values[i][PREVIEW_FIELD_INDEX] = labelClasses[i];
340
                                values[i][NAME_FIELD_INDEX] = labelClasses[i].getName();
341
                                values[i][FILTER_FIELD_INDEX] = labelClasses[i].getSQLQuery();
342
                                values[i][LABEL_EXPRESSION_FIELD_INDEX] = labelClasses[i].getStringLabelExpression();
343
                                values[i][VISIBLE_FIELD_INDEX] = labelClasses[i].isVisible();
344
                        }
345
                        setDataVector(values, classesTableFieldNames);
346
                }
347

    
348
                public String getColumnName(int col) {
349
                        return classesTableFieldNames[col];
350
                }
351

    
352
                public int getColumnCount() {
353
                        return classesTableFieldNames.length;
354
                }
355

    
356
                @Override
357
                public boolean isCellEditable(int row, int column) {
358
                        return true;
359
                }
360

    
361
                public LabelClass getLabelAtRow(int row) {
362
                        return (LabelClass) getValueAt(row, PREVIEW_FIELD_INDEX);
363
                }
364

    
365
                public LabelClass[] toLabelClassArray() {
366
                        LabelClass[] classes = new LabelClass[getRowCount()];
367
                        for (int i = 0; i < classes.length; i++) {
368
                                classes[i] = getLabelAtRow(i);
369
                                if (getChkDefinePriorities().isSelected()) {
370
                                        classes[i].setPriority(i);
371
                                }
372
                        }
373
                        return classes;
374
                }
375

    
376
                public void setClassArray(LabelClass[] classes) {
377
                        for (int i = 0; i < classes.length; i++) {
378
                                        setValueAt(classes[i],i,PREVIEW_FIELD_INDEX);
379
                                        setValueAt(classes[i].getName(),i,NAME_FIELD_INDEX);
380
                                        setValueAt(classes[i].getSQLQuery(),i,FILTER_FIELD_INDEX);
381
                                        setValueAt(classes[i].getStringLabelExpression(),i,LABEL_EXPRESSION_FIELD_INDEX);
382
                                        setValueAt(classes[i].isVisible(),i,VISIBLE_FIELD_INDEX);
383
                        }
384

    
385
                }
386

    
387
        }
388

    
389
        @Override
390
        protected void initializePanel() {
391

    
392
                setLayout(new BorderLayout());
393
                JPanel panel = new JPanel(new BorderLayout());
394
                buttonPanel = new GridBagLayoutPanel();
395
                buttonPanel.addComponent(getBtnAddClass());
396
                buttonPanel.addComponent(getBtnDelClass());
397
                buttonPanel.addComponent(new JBlank(10, 10));
398
                buttonPanel.addComponent(getBtnMoveUpClass());
399
                buttonPanel.addComponent(getBtnMoveDownClass());
400
                panel.add(buttonPanel, BorderLayout.EAST);
401
                panel.add(getChkDefinePriorities(), BorderLayout.NORTH);
402
                panel.add(getCenterScrl(), BorderLayout.CENTER);
403
                add(panel,BorderLayout.CENTER);
404

    
405
        }
406

    
407

    
408
        @Override
409
        public void fillPanel(ILabelingMethod method, SelectableDataSource dataSource)
410
        throws ReadDriverException {
411
                fieldNames = dataSource.getFieldNames();
412
                fieldTypes = new int[fieldNames.length];
413
                for (int i = 0; i < fieldTypes.length; i++) {
414
                        fieldTypes[i] = dataSource.getFieldType(i);
415
                }
416
                if (method == null) {
417
                        this.method = new FeatureDependentLabeled();
418
                }
419
                chkDefinePriorities.setSelected(this.method.definesPriorities());
420
                repaint();
421
        }
422

    
423
        private void swapClass(int classIndex, int targetPos,int numOfElements) {
424

    
425
                LabelClass[] classes = ((LabelClassTableModel)tblClasses.getModel()).toLabelClassArray();
426
                LabelClass aux = classes[targetPos];
427
                classes[targetPos] = classes[classIndex];
428
                classes[classIndex] = aux;
429
                ((LabelClassTableModel)tblClasses.getModel()).setClassArray(classes);
430
        }
431

    
432
        public void actionPerformed(ActionEvent e) {
433
                if (method == null) return;
434

    
435

    
436
                JComponent c = (JComponent)e.getSource();
437
                LabelClassTableModel mod = ((LabelClassTableModel) tblClasses.getModel());
438

    
439
                if (c.equals(btnAddClass)) {
440

    
441
                        LabelClass newClass = new LabelClass();
442
                        String name = PluginServices.getText(this, "labeling")+
443
                        String.valueOf(1);
444

    
445
                        int count = 0;
446
                        while(checSameLablClassName(mod,name)){
447
                                count++;
448
                                name = PluginServices.getText(this, "labeling")+
449
                                String.valueOf(count);
450
                        }
451
                        newClass.setName(name);
452
                        mod.addRow(new Object[] {newClass.getName(), newClass, newClass.getSQLQuery(), newClass.getStringLabelExpression(), newClass.isVisible()});
453
                } else if (c.equals(btnDelClass)) {
454
                        if (mod.getRowCount()>=1) {
455
                                int[] sRows = tblClasses.getSelectedRows();
456

    
457
                                for (int i = sRows.length-1; i >= 0 ; i--) {
458
                                        mod.removeRow(sRows[i]);
459
                                }
460
                        }
461
                } else if (c.equals(chkDefinePriorities)) {
462

    
463
                        method.setDefinesPriorities(chkDefinePriorities.isSelected());
464

    
465
                } else  if (c.equals(chkLabel)) {
466
                        int[] sRows = tblClasses.getSelectedRows();
467
                        for (int i = sRows.length-1; i >= 0 ; i--) {
468
                                LabelClass lc = mod.getLabelAtRow(i);
469
                                lc.setVisible(chkLabel.isSelected());
470
                        }
471

    
472
                } else if (c.equals(btnMoveUpClass)) {
473
                        int[] indices = tblClasses.getSelectedRows();
474
                        if (indices.length>0) {
475
                                int classIndex = indices[0];
476
                                int targetPos = Math.max(0, classIndex-1);
477
                                swapClass(classIndex, targetPos,indices.length);
478
                        }
479

    
480
                } else if (c.equals(btnMoveDownClass)) {
481
                        int[] indices = tblClasses.getSelectedRows();
482
                        if (indices.length>0) {
483
                                int classIndex = indices[indices.length-1];
484
                                int targetPos = Math.min(tblClasses.getRowCount()-1, classIndex+1);
485
                                swapClass(classIndex, targetPos,indices.length);
486
                        }
487

    
488
                }else if (c.equals(btnDelClass)) {
489
                        int[] indices = tblClasses.getSelectedRows();
490
                        if (indices.length>0) {
491
                                int classIndex = indices[0];
492
                                int targetPos = Math.min(tblClasses.getRowCount(), classIndex);
493
                                swapClass(classIndex, targetPos,indices.length);
494
                        }
495
                }
496

    
497

    
498
                mod.fireTableDataChanged();
499
                method.clearAllClasses();
500
                LabelClass[] classes = ((LabelClassTableModel)tblClasses.getModel()).toLabelClassArray();
501
                for (int i = 0; i < classes.length; i++) {
502
                        method.addLabelClass(classes[i]);
503
                }
504
                repaint();
505
        }
506
        public void propertyChange(PropertyChangeEvent evt) {
507
                // TODO Auto-generated method stub
508

    
509
        }
510

    
511

    
512

    
513

    
514

    
515

    
516
}