Statistics
| Revision:

root / trunk / extensions / extSymbology / src / org / gvsig / symbology / gui / layerproperties / FeatureDependent.java @ 23118

History | View | Annotate | Download (16.2 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.List;
47
import java.awt.event.ActionEvent;
48
import java.awt.event.ActionListener;
49
import java.awt.event.MouseAdapter;
50
import java.awt.event.MouseEvent;
51
import java.beans.PropertyChangeEvent;
52

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

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

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

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

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

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

    
113

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

    
123

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

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

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

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

    
160
        private JScrollPane getCenterScrl() {
161

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

    
165
                return scrlPan;
166
        }
167

    
168

    
169
        private JTable getTblClasses() {
170

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

    
191
                TableColumnModel cm = tblClasses.getColumnModel();
192

    
193
                tblClasses.getColumnModel().getColumn(PREVIEW_FIELD_INDEX).setCellRenderer(new TableCellRenderer() {
194

    
195
                        public Component getTableCellRendererComponent(JTable table,
196
                                        Object value, boolean isSelected, boolean hasFocus,
197
                                        int row, int column) {
198
                                LabelClassPreview lcPr = new LabelClassPreview();
199
                                lcPr.setLabelClass((LabelClass) value);
200
                                return lcPr;
201
                        }
202

    
203
                });
204
                tblClasses.getColumnModel().getColumn(VISIBLE_FIELD_INDEX).setCellRenderer(new BooleanTableCellRenderer(false));
205
                tblClasses.getColumnModel().getColumn(LABEL_EXPRESSION_FIELD_INDEX).setCellRenderer(new TableCellRenderer() {
206
                        public Component getTableCellRendererComponent(JTable table,
207
                                        Object value, boolean isSelected, boolean hasFocus,
208
                                        int row, int column) {
209
                                String expr = null;
210
                                if (value != null)
211
                                        expr = (String) value;
212
                                if (expr == null)
213
                                        expr = LabelExpressionParser.tokenFor(LabelExpressionParser.EOEXPR);
214

    
215
                                expr = expr.replaceAll(LabelExpressionParser.tokenFor(LabelExpressionParser.EOFIELD), " | ");
216
                                expr = expr.substring(0, expr.length()-1);
217
                                return new JLabel("<html><p>"+expr+"</p></html>", JLabel.CENTER);
218
                        }
219
                });
220

    
221
                // the editors
222
                for (int i = 0; i < tblClasses.getColumnModel().getColumnCount(); i++) {
223
                        if (i!= VISIBLE_FIELD_INDEX) {
224
                                tblClasses.getColumnModel().getColumn(i).setCellEditor(new LabelClassCellEditor());
225
                        } else {
226
                                tblClasses.getColumnModel().getColumn(VISIBLE_FIELD_INDEX).
227
                                setCellEditor(new BooleanTableCellEditor(tblClasses));
228
                        }
229
                }
230
                ((DefaultTableModel)tblClasses.getModel()).fireTableDataChanged();
231
                repaint();
232

    
233
                return tblClasses;
234
        }
235

    
236

    
237
        private class LabelClassCellEditor extends AbstractCellEditor implements TableCellEditor {
238
                private static final long serialVersionUID = 6399823783851437400L;
239

    
240
                public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
241
                        if (openEditor) {
242
                                LabelClass oldLc = (LabelClass) tblClasses.getValueAt(row, PREVIEW_FIELD_INDEX);
243
                                LabelClassProperties lcProp = new LabelClassProperties(fieldNames, fieldTypes);
244
                                oldLc.setTexts(new String[] {oldLc.getName()});
245
                                lcProp.setLabelClass(oldLc);
246
                                PluginServices.getMDIManager()
247
                                .addWindow(lcProp);
248
                                LabelClass newLc = lcProp.getLabelClass();
249

    
250
                                LabelClassTableModel m = (LabelClassTableModel) tblClasses.getModel();
251
                                Boolean changeDone = false;
252

    
253
                                if (!(oldLc.getName().equals(newLc.getName())))
254
                                        if(!checSameLablClassName(m,newLc.getName())){
255

    
256
                                                m.setValueAt(newLc.getLabelExpression(), row, LABEL_EXPRESSION_FIELD_INDEX);
257
                                                m.setValueAt(newLc.getName(), row, NAME_FIELD_INDEX);
258
                                                m.setValueAt(newLc, row, PREVIEW_FIELD_INDEX);
259
                                                m.setValueAt(newLc.getSQLQuery(), row, FILTER_FIELD_INDEX);
260
                                                m.setValueAt(newLc.isVisible(), row, VISIBLE_FIELD_INDEX);
261
                                                fireEditingStopped(); //Make the renderer reappear.
262
                                                changeDone = true;
263
                                        }
264
                                        else {
265
                                                JOptionPane.showMessageDialog(tblClasses, PluginServices.getText(this, "cannot_exist_two_label_classes_with_the_same_name")+"\n",PluginServices.getText(this,"error"),JOptionPane.ERROR_MESSAGE);
266
                                                changeDone = true;
267
                                        }
268
                                if (!changeDone){
269
                                        m.setValueAt(newLc.getLabelExpression(), row, LABEL_EXPRESSION_FIELD_INDEX);
270
                                        m.setValueAt(newLc.getName(), row, NAME_FIELD_INDEX);
271
                                        m.setValueAt(newLc, row, PREVIEW_FIELD_INDEX);
272
                                        m.setValueAt(newLc.getSQLQuery(), row, FILTER_FIELD_INDEX);
273
                                        m.setValueAt(newLc.isVisible(), row, VISIBLE_FIELD_INDEX);
274
                                        fireEditingStopped(); //Make the renderer reappear.
275
                                        changeDone = true;
276
                                }
277
                        }
278
                        openEditor = false;
279
                        return null;
280
                }
281

    
282
                public Object getCellEditorValue() {
283
                        return null;
284
                }
285

    
286
        }
287

    
288

    
289
        private boolean checSameLablClassName(LabelClassTableModel mod, String name) {
290
                for (int i = 0; i < mod.getRowCount(); i++) {
291
                        if(name.equals(mod.getLabelAtRow(i).getName()))
292
                                return true;
293
                }
294
                return false;
295
        }
296

    
297

    
298
        private class LabelClassTableModel extends DefaultTableModel {
299
                private static final long serialVersionUID = -9152998982339430209L;
300

    
301
                private String[] classesTableFieldNames = new String[] {
302
                                PluginServices.getText(this, "name"),
303
                                PluginServices.getText(this, "preview"),
304
                                PluginServices.getText(this, "filter"),
305
                                PluginServices.getText(this, "label_expression"),
306
                                PluginServices.getText(this, "visible"),
307
                };
308

    
309

    
310
                public LabelClassTableModel() {
311
                        super();
312
                        LabelClass[] labelClasses = method.getLabelClasses();
313

    
314
                        Object[][] values = new Object[labelClasses.length][classesTableFieldNames.length];
315
                        for (int i = 0; i < values.length; i++) {
316
                                values[i][PREVIEW_FIELD_INDEX] = labelClasses[i];
317
                                values[i][NAME_FIELD_INDEX] = labelClasses[i].getName();
318
                                values[i][FILTER_FIELD_INDEX] = labelClasses[i].getSQLQuery();
319
                                values[i][LABEL_EXPRESSION_FIELD_INDEX] = labelClasses[i].getLabelExpression();
320
                                values[i][VISIBLE_FIELD_INDEX] = labelClasses[i].isVisible();
321
                        }
322
                        setDataVector(values, classesTableFieldNames);
323
                }
324

    
325
                public String getColumnName(int col) {
326
                        return classesTableFieldNames[col];
327
                }
328

    
329
                public int getColumnCount() {
330
                        return classesTableFieldNames.length;
331
                }
332

    
333
                @Override
334
                public boolean isCellEditable(int row, int column) {
335
                        return true;
336
                }
337

    
338
                public LabelClass getLabelAtRow(int row) {
339
                        return (LabelClass) getValueAt(row, PREVIEW_FIELD_INDEX);
340
                }
341

    
342
                public LabelClass[] toLabelClassArray() {
343
                        LabelClass[] classes = new LabelClass[getRowCount()];
344
                        for (int i = 0; i < classes.length; i++) {
345
                                classes[i] = getLabelAtRow(i);
346
                                if (getChkDefinePriorities().isSelected()) {
347
                                        classes[i].setPriority(i);
348
                                }
349
                        }
350
                        return classes;
351
                }
352

    
353
                public void setClassArray(LabelClass[] classes) {
354
                        for (int i = 0; i < classes.length; i++) {
355
                                        setValueAt(classes[i],i,PREVIEW_FIELD_INDEX);
356
                                        setValueAt(classes[i].getName(),i,NAME_FIELD_INDEX);
357
                                        setValueAt(classes[i].getSQLQuery(),i,FILTER_FIELD_INDEX);
358
                                        setValueAt(classes[i].getLabelExpression(),i,LABEL_EXPRESSION_FIELD_INDEX);
359
                                        setValueAt(classes[i].isVisible(),i,VISIBLE_FIELD_INDEX);
360
                        }
361

    
362
                }
363
        }
364

    
365
        @Override
366
        protected void initializePanel() {
367

    
368
                setLayout(new BorderLayout());
369
                JPanel panel = new JPanel(new BorderLayout());
370
                buttonPanel = new GridBagLayoutPanel();
371
                buttonPanel.addComponent(getBtnAddClass());
372
                buttonPanel.addComponent(getBtnDelClass());
373
                buttonPanel.addComponent(new JBlank(10, 10));
374
                buttonPanel.addComponent(getBtnMoveUpClass());
375
                buttonPanel.addComponent(getBtnMoveDownClass());
376
                panel.add(buttonPanel, BorderLayout.EAST);
377
                panel.add(getChkDefinePriorities(), BorderLayout.NORTH);
378
                panel.add(getCenterScrl(), BorderLayout.CENTER);
379
                add(panel,BorderLayout.CENTER);
380

    
381
        }
382

    
383

    
384
        @Override
385
        public void fillPanel(ILabelingMethod method, SelectableDataSource dataSource)
386
        throws ReadDriverException {
387
                fieldNames = dataSource.getFieldNames();
388
                fieldTypes = new int[fieldNames.length];
389
                for (int i = 0; i < fieldTypes.length; i++) {
390
                        fieldTypes[i] = dataSource.getFieldType(i);
391
                }
392
                if (method == null) {
393
                        this.method = new FeatureDependentLabeled();
394
                }
395
                chkDefinePriorities.setSelected(this.method.definesPriorities());
396
                repaint();
397
        }
398

    
399
        private void swapClass(int classIndex, int targetPos,int numOfElements) {
400

    
401
                LabelClass[] classes = ((LabelClassTableModel)tblClasses.getModel()).toLabelClassArray();
402
                LabelClass aux = classes[targetPos];
403
                classes[targetPos] = classes[classIndex];
404
                classes[classIndex] = aux;
405
                ((LabelClassTableModel)tblClasses.getModel()).setClassArray(classes);
406
        }
407

    
408
        public void actionPerformed(ActionEvent e) {
409
                if (method == null) return;
410

    
411

    
412
                JComponent c = (JComponent)e.getSource();
413
                LabelClassTableModel mod = ((LabelClassTableModel) tblClasses.getModel());
414

    
415
                if (c.equals(btnAddClass)) {
416

    
417
                        LabelClass newClass = new LabelClass();
418
                        String name = PluginServices.getText(this, "labeling")+
419
                        String.valueOf(1);
420

    
421
                        int count = 0;
422
                        while(checSameLablClassName(mod,name)){
423
                                count++;
424
                                name = PluginServices.getText(this, "labeling")+
425
                                String.valueOf(count);
426
                        }
427
                        newClass.setName(name);
428
                        mod.addRow(new Object[] {newClass.getName(), newClass, newClass.getSQLQuery(), newClass.getLabelExpression(), newClass.isVisible()});
429
                } else if (c.equals(btnDelClass)) {
430
                        if (mod.getRowCount()>=1) {
431
                                int[] sRows = tblClasses.getSelectedRows();
432

    
433
                                for (int i = sRows.length-1; i >= 0 ; i--) {
434
                                        mod.removeRow(sRows[i]);
435
                                }
436
                        }
437
                } else if (c.equals(chkDefinePriorities)) {
438

    
439
                        method.setDefinesPriorities(chkDefinePriorities.isSelected());
440

    
441
                } else  if (c.equals(chkLabel)) {
442
                        int[] sRows = tblClasses.getSelectedRows();
443
                        for (int i = sRows.length-1; i >= 0 ; i--) {
444
                                LabelClass lc = mod.getLabelAtRow(i);
445
                                lc.setVisible(chkLabel.isSelected());
446
                        }
447

    
448
                } else if (c.equals(btnMoveUpClass)) {
449
                        int[] indices = tblClasses.getSelectedRows();
450
                        if (indices.length>0) {
451
                                int classIndex = indices[0];
452
                                int targetPos = Math.max(0, classIndex-1);
453
                                swapClass(classIndex, targetPos,indices.length);
454
                        }
455

    
456
                } else if (c.equals(btnMoveDownClass)) {
457
                        int[] indices = tblClasses.getSelectedRows();
458
                        if (indices.length>0) {
459
                                int classIndex = indices[indices.length-1];
460
                                int targetPos = Math.min(tblClasses.getRowCount()-1, classIndex+1);
461
                                swapClass(classIndex, targetPos,indices.length);
462
                        }
463

    
464
                }else if (c.equals(btnDelClass)) {
465
                        int[] indices = tblClasses.getSelectedRows();
466
                        if (indices.length>0) {
467
                                int classIndex = indices[0];
468
                                int targetPos = Math.min(tblClasses.getRowCount(), classIndex);
469
                                swapClass(classIndex, targetPos,indices.length);
470
                        }
471
                }
472

    
473
                mod.fireTableDataChanged();
474
                method.clearAllClasses();
475
                LabelClass[] classes = ((LabelClassTableModel)tblClasses.getModel()).toLabelClassArray();
476
                for (int i = 0; i < classes.length; i++) {
477
                        method.addLabelClass(classes[i]);
478
                }
479
                repaint();
480
        }
481
        public void propertyChange(PropertyChangeEvent evt) {
482
                // TODO Auto-generated method stub
483

    
484
        }
485

    
486

    
487

    
488

    
489

    
490

    
491
}