Statistics
| Revision:

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 / FeatureDependent.java @ 40911

History | View | Annotate | Download (17.3 KB)

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

    
26
import java.awt.BorderLayout;
27
import java.awt.Component;
28
import java.awt.Dimension;
29
import java.awt.GridLayout;
30
import java.awt.event.ActionEvent;
31
import java.awt.event.ActionListener;
32
import java.awt.event.MouseAdapter;
33
import java.awt.event.MouseEvent;
34
import java.beans.PropertyChangeEvent;
35

    
36
import javax.swing.AbstractCellEditor;
37
import javax.swing.JButton;
38
import javax.swing.JCheckBox;
39
import javax.swing.JComponent;
40
import javax.swing.JLabel;
41
import javax.swing.JOptionPane;
42
import javax.swing.JPanel;
43
import javax.swing.JScrollPane;
44
import javax.swing.JTable;
45
import javax.swing.ListSelectionModel;
46
import javax.swing.event.TableModelEvent;
47
import javax.swing.event.TableModelListener;
48
import javax.swing.table.DefaultTableModel;
49
import javax.swing.table.TableCellEditor;
50
import javax.swing.table.TableCellRenderer;
51
import javax.swing.table.TableColumnModel;
52

    
53
import org.gvsig.app.ApplicationLocator;
54
import org.gvsig.fmap.dal.exception.ReadException;
55
import org.gvsig.fmap.dal.feature.FeatureStore;
56
import org.gvsig.fmap.dal.feature.FeatureType;
57
import org.gvsig.fmap.mapcontext.rendering.legend.styling.ILabelClass;
58
import org.gvsig.fmap.mapcontext.rendering.legend.styling.ILabelingMethod;
59
import org.gvsig.gui.beans.swing.GridBagLayoutPanel;
60
import org.gvsig.gui.beans.swing.JBlank;
61
import org.gvsig.gui.beans.swing.celleditors.BooleanTableCellEditor;
62
import org.gvsig.gui.beans.swing.cellrenderers.BooleanTableCellRenderer;
63
import org.gvsig.i18n.Messages;
64
import org.gvsig.labeling.label.FeatureDependentLabeled;
65
import org.gvsig.symbology.SymbologyLocator;
66

    
67
public class FeatureDependent extends AbstractLabelingMethodPanel implements ActionListener{
68
        private static final long serialVersionUID = 5493451803343695650L;
69
        private static int NAME_FIELD_INDEX = 0;
70
        private static int PREVIEW_FIELD_INDEX = 1;
71
        private static int FILTER_FIELD_INDEX = 2;
72
        private static int LABEL_EXPRESSION_FIELD_INDEX = 3;
73
        private static int VISIBLE_FIELD_INDEX = 4;
74
        JTable tblClasses = null;
75
        private JButton btnMoveUpClass;
76
        private JButton btnAddClass;
77
        private JCheckBox chkLabel;
78
        private JCheckBox chkDefinePriorities;
79
        private JScrollPane scrlPan;
80
        private boolean openEditor = false;
81
        private JButton btnMoveDownClass;
82
        private JButton btnDelClass;
83
        
84
        /*
85
        private String[] fieldNames;
86
        private int[] fieldTypes;
87
        */
88
        private JPanel buttonPanel;
89

    
90
        @Override
91
        public String getName() {
92
                
93
                return Messages.getText(
94
                                "define_classes_of_features_and_label_each_differently")+".";
95
        }
96

    
97
        @Override
98
        public Class<? extends ILabelingMethod> getLabelingMethodClass() {
99
                return FeatureDependentLabeled.class;
100
        }
101

    
102

    
103
        private JCheckBox getChkDefinePriorities() {
104
                if (chkDefinePriorities == null) {
105
                        chkDefinePriorities = new JCheckBox(Messages.getText("label_priority"));
106
                        chkDefinePriorities.addActionListener(this);
107
                        chkDefinePriorities.setName("CHK_DEFINE_PRIORITIES");
108
                }
109
                return chkDefinePriorities;
110
        }
111

    
112

    
113
        private JButton getBtnDelClass() {
114
                if (btnDelClass == null) {
115
                        btnDelClass = new JButton(Messages.getText("delete"));
116
                        btnDelClass.setName("BTNDELCLASS");
117
                        btnDelClass.addActionListener(this);
118
                }
119
                return btnDelClass;
120
        }
121

    
122
        private JButton getBtnAddClass() {
123
                if (btnAddClass == null) {
124
                        btnAddClass = new JButton(Messages.getText("add"));
125
                        btnAddClass.setName("BTNADDCLASS");
126
                        btnAddClass.addActionListener(this);
127
                }
128
                return btnAddClass;
129
        }
130

    
131
        private JButton getBtnMoveUpClass() {
132
                if (btnMoveUpClass == null) {
133
                        btnMoveUpClass = new JButton(Messages.getText("move_up"));
134
                        btnMoveUpClass.setName("BTNMOVEUPCLASS");
135
                        btnMoveUpClass.addActionListener(this);
136
                }
137
                return btnMoveUpClass;
138
        }
139

    
140
        private JButton getBtnMoveDownClass() {
141
                if (btnMoveDownClass == null) {
142
                        btnMoveDownClass = new JButton(Messages.getText("move_down"));
143
                        btnMoveDownClass.setName("BTNMOVEDOWNCLASS");
144
                        btnMoveDownClass.addActionListener(this);
145
                }
146
                return btnMoveDownClass;
147
        }
148

    
149
        private JScrollPane getCenterScrl() {
150

    
151
                        scrlPan = new JScrollPane(getTblClasses());
152
                        scrlPan.setPreferredSize(new Dimension(180, 300));
153

    
154
                return scrlPan;
155
        }
156

    
157

    
158
        private JTable getTblClasses() {
159

    
160
                        tblClasses = new JTable(new LabelClassTableModel());
161
                tblClasses.setRowHeight(50);
162
                tblClasses.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
163
                tblClasses.addMouseListener(new MouseAdapter() {
164
                        int prevRow =-1;
165
                        @Override
166
                        public void mouseClicked(MouseEvent e) {
167
                                        if (!tblClasses.isEnabled()){
168
                                                return;
169
                                        }
170
                                        int col = tblClasses.getColumnModel().getColumnIndexAtX(e.getX());
171
                                        int row = (int) ((e.getY()-tblClasses.getLocation().getY()) / tblClasses.getRowHeight());
172
                                        if(!(row > tblClasses.getRowCount()-1 || col > tblClasses.getColumnCount()-1))
173
                                        {
174
                                                openEditor = (row == prevRow && e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2
175
                                                ) ;
176
                                                prevRow = row;
177
                                                if (openEditor)
178
                                                        tblClasses.editCellAt(row, col);
179
                                        }
180
                                }
181
                });
182

    
183
                tblClasses.getModel().addTableModelListener(new TableModelListener() {
184

    
185
                        public void tableChanged(TableModelEvent e) {
186
                                if (!tblClasses.isEnabled()){
187
                                        return;
188
                                }
189

    
190
                                if(e.getColumn() == VISIBLE_FIELD_INDEX){
191
                                        ILabelClass oldLc = (ILabelClass) tblClasses.getValueAt(e.getFirstRow(), PREVIEW_FIELD_INDEX);
192
                                        oldLc.setVisible(Boolean.valueOf(tblClasses.getValueAt(e.getFirstRow(), VISIBLE_FIELD_INDEX).toString()));
193
                                }
194
                        }
195

    
196
                });
197

    
198
                TableColumnModel cm = tblClasses.getColumnModel();
199

    
200
                tblClasses.getColumnModel().getColumn(PREVIEW_FIELD_INDEX).setCellRenderer(new TableCellRenderer() {
201

    
202
                        public Component getTableCellRendererComponent(JTable table,
203
                                        Object value, boolean isSelected, boolean hasFocus,
204
                                        int row, int column) {
205
                                LabelClassPreview lcPr = new LabelClassPreview();
206
                                lcPr.setLabelClass((ILabelClass) value);
207
                                return lcPr;
208
                        }
209

    
210
                });
211
                tblClasses.getColumnModel().getColumn(VISIBLE_FIELD_INDEX).setCellRenderer(new BooleanTableCellRenderer(false));
212
                tblClasses.getColumnModel().getColumn(LABEL_EXPRESSION_FIELD_INDEX).setCellRenderer(new TableCellRenderer() {
213
                        public Component getTableCellRendererComponent(JTable table,
214
                                        Object value, boolean isSelected, boolean hasFocus,
215
                                        int row, int column) {
216
                                String expr = null;
217
                                if (value != null)
218
                                        expr = (String) value;
219
                                if (expr == null)
220
                                        expr = "";
221
                                // LabelExpressionParser.tokenFor(LabelExpressionParser.EOEXPR);
222

    
223
//                                expr = expr.replaceAll(LabelExpressionParser.tokenFor(LabelExpressionParser.EOFIELD), " | ");
224
                                // expr = expr.substring(0, expr.length()-1);
225
                                return new JLabel("<html><p>"+expr+"</p></html>", JLabel.CENTER);
226
                        }
227
                });
228

    
229
                // the editors
230

    
231
                for (int i = 0; i < tblClasses.getColumnModel().getColumnCount(); i++) {
232
                        if (i!= VISIBLE_FIELD_INDEX) {
233
                                tblClasses.getColumnModel().getColumn(i).setCellEditor(
234
                                                new LabelClassCellEditor(this.layer.getFeatureStore()));
235
                        } else {
236
                                tblClasses.getColumnModel().getColumn(VISIBLE_FIELD_INDEX).
237
                                setCellEditor(new BooleanTableCellEditor(tblClasses));
238
                        }
239
                }
240
                ((DefaultTableModel)tblClasses.getModel()).fireTableDataChanged();
241
                repaint();
242

    
243
                return tblClasses;
244
        }
245

    
246

    
247
        private class LabelClassCellEditor extends AbstractCellEditor implements TableCellEditor {
248
                
249
                private static final long serialVersionUID = 6399823783851437400L;
250
                private FeatureStore fsto = null;
251
                
252
                public LabelClassCellEditor(FeatureStore store) {
253
                        fsto = store;
254
                }
255

    
256
                public Component getTableCellEditorComponent(
257
                                JTable table, Object value, boolean isSelected, int row, int column) {
258
                        
259
                        if (openEditor) {
260
                                ILabelClass oldLc = (ILabelClass) tblClasses.getValueAt(row, PREVIEW_FIELD_INDEX);
261
                                oldLc.setVisible(Boolean.valueOf(tblClasses.getValueAt(row, VISIBLE_FIELD_INDEX).toString()));
262
                                LabelClassProperties lcProp = new LabelClassProperties(fsto);
263
                                oldLc.setTexts(new String[] {oldLc.getName()});
264
                                lcProp.setLabelClass(oldLc);
265
                                
266
                                ApplicationLocator.getManager().getUIManager().addWindow(lcProp);
267
                                ILabelClass newLc = lcProp.getLabelClass();
268

    
269
                                LabelClassTableModel m = (LabelClassTableModel) tblClasses.getModel();
270
                                Boolean changeDone = false;
271

    
272
                                if (!(oldLc.getName().equals(newLc.getName())))
273
                                        if(!checSameLablClassName(m,newLc.getName())){
274

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

    
302
                        method.clearAllClasses();
303
                        ILabelClass[] classes = ((LabelClassTableModel)tblClasses.getModel()).toLabelClassArray();
304
                        for (int i = 0; i < classes.length; i++) {
305
                                method.addLabelClass(classes[i]);
306
                        }
307

    
308
                        openEditor = false;
309
                        return null;
310
                }
311

    
312
                public Object getCellEditorValue() {
313
                        return null;
314
                }
315

    
316
        }
317

    
318

    
319
        private boolean checSameLablClassName(LabelClassTableModel mod, String name) {
320
                for (int i = 0; i < mod.getRowCount(); i++) {
321
                        if(name.equals(mod.getLabelAtRow(i).getName()))
322
                                return true;
323
                }
324
                return false;
325
        }
326

    
327

    
328
        private class LabelClassTableModel extends DefaultTableModel {
329
                
330
                private static final long serialVersionUID = -9152998982339430209L;
331
                Object[][] values;
332

    
333
                private String[] classesTableFieldNames = new String[] {
334
                                Messages.getText("name"),
335
                                Messages.getText("preview"),
336
                                Messages.getText("filter"),
337
                                Messages.getText("label_expression"),
338
                                Messages.getText("visible"),
339
                };
340

    
341

    
342
                public LabelClassTableModel() {
343
                        super();
344
                        ILabelClass[] labelClasses = method.getLabelClasses();
345

    
346
                        values = new Object[labelClasses.length][classesTableFieldNames.length];
347
                        for (int i = 0; i < values.length; i++) {
348
                                values[i][PREVIEW_FIELD_INDEX] = labelClasses[i];
349
                                values[i][NAME_FIELD_INDEX] = labelClasses[i].getName();
350
                                values[i][FILTER_FIELD_INDEX] = labelClasses[i].getSQLQuery();
351
                                values[i][LABEL_EXPRESSION_FIELD_INDEX] = labelClasses[i].getStringLabelExpression();
352
                                values[i][VISIBLE_FIELD_INDEX] = labelClasses[i].isVisible();
353
                        }
354
                        setDataVector(values, classesTableFieldNames);
355
                }
356

    
357
                public String getColumnName(int col) {
358
                        return classesTableFieldNames[col];
359
                }
360

    
361
                public int getColumnCount() {
362
                        return classesTableFieldNames.length;
363
                }
364

    
365
                @Override
366
                public boolean isCellEditable(int row, int column) {
367
                        return true;
368
                }
369

    
370
                public ILabelClass getLabelAtRow(int row) {
371
                        return (ILabelClass) getValueAt(row, PREVIEW_FIELD_INDEX);
372
                }
373

    
374
                public ILabelClass[] toLabelClassArray() {
375
                        ILabelClass[] classes = new ILabelClass[getRowCount()];
376
                        for (int i = 0; i < classes.length; i++) {
377
                                classes[i] = getLabelAtRow(i);
378
                                if (getChkDefinePriorities().isSelected()) {
379
                                        classes[i].setPriority(i);
380
                                }
381
                        }
382
                        return classes;
383
                }
384

    
385
                public void setClassArray(ILabelClass[] classes) {
386
                        for (int i = 0; i < classes.length; i++) {
387
                                        setValueAt(classes[i],i,PREVIEW_FIELD_INDEX);
388
                                        setValueAt(classes[i].getName(),i,NAME_FIELD_INDEX);
389
                                        setValueAt(classes[i].getSQLQuery(),i,FILTER_FIELD_INDEX);
390
                                        setValueAt(classes[i].getStringLabelExpression(),i,LABEL_EXPRESSION_FIELD_INDEX);
391
                                        setValueAt(classes[i].isVisible(),i,VISIBLE_FIELD_INDEX);
392
                        }
393

    
394
                }
395

    
396
        }
397

    
398
        @Override
399
        protected void initializePanel() {
400

    
401
                        setLayout(new BorderLayout());
402
                        JPanel panel = new JPanel(new BorderLayout());
403
                        
404
                        GridLayout gl = new GridLayout(4,1);
405
                        buttonPanel = new JPanel(gl);
406
                        buttonPanel.add(getBtnAddClass());
407
                        buttonPanel.add(getBtnDelClass());
408
                        // buttonPanel.addComponent(new JBlank(10, 10));
409
                        buttonPanel.add(getBtnMoveUpClass());
410
                        buttonPanel.add(getBtnMoveDownClass());
411
                        
412
                        JPanel auxp = new JPanel();
413
                        auxp.add(buttonPanel);
414
                        
415
                        panel.add(auxp, BorderLayout.EAST);
416
                        panel.add(getChkDefinePriorities(), BorderLayout.NORTH);
417
                        panel.add(getCenterScrl(), BorderLayout.CENTER);
418
                        add(panel,BorderLayout.CENTER);
419
                }
420

    
421

    
422
        public void fillPanel(ILabelingMethod method, FeatureType fty)
423
        throws ReadException {
424
                
425
                if (method == null) {
426
                        this.method = new FeatureDependentLabeled();
427
                }
428
                chkDefinePriorities.setSelected(this.method.definesPriorities());
429
                repaint();
430
        }
431

    
432
        private void swapClass(int classIndex, int targetPos,int numOfElements) {
433

    
434
                ILabelClass[] classes = ((LabelClassTableModel)tblClasses.getModel()).toLabelClassArray();
435
                ILabelClass aux = classes[targetPos];
436
                classes[targetPos] = classes[classIndex];
437
                classes[classIndex] = aux;
438
                ((LabelClassTableModel)tblClasses.getModel()).setClassArray(classes);
439
        }
440

    
441
        public void actionPerformed(ActionEvent e) {
442
                if (method == null) return;
443

    
444

    
445
                JComponent c = (JComponent)e.getSource();
446
                LabelClassTableModel mod = ((LabelClassTableModel) tblClasses.getModel());
447

    
448
                if (c.equals(btnAddClass)) {
449

    
450
                        ILabelClass newClass =
451
                                        SymbologyLocator.getSymbologyManager().createDefaultLabel();
452
                        
453
                        String name = Messages.getText("labeling")+
454
                        String.valueOf(1);
455

    
456
                        int count = 0;
457
                        while(checSameLablClassName(mod,name)){
458
                                count++;
459
                                name = Messages.getText("labeling")+
460
                                String.valueOf(count);
461
                        }
462
                        newClass.setName(name);
463
                        mod.addRow(new Object[] {
464
                                        newClass.getName(),
465
                                        newClass,
466
                                        newClass.getSQLQuery(),
467
                                        newClass.getStringLabelExpression(),
468
                                        newClass.isVisible()});
469
                        
470
                } else if (c.equals(btnDelClass)) {
471
                        if (mod.getRowCount()>=1) {
472
                                int[] sRows = tblClasses.getSelectedRows();
473

    
474
                                for (int i = sRows.length-1; i >= 0 ; i--) {
475
                                        mod.removeRow(sRows[i]);
476
                                }
477
                        }
478
                } else if (c.equals(chkDefinePriorities)) {
479

    
480
                        method.setDefinesPriorities(chkDefinePriorities.isSelected());
481

    
482
                } else  if (c.equals(chkLabel)) {
483
                        int[] sRows = tblClasses.getSelectedRows();
484
                        for (int i = sRows.length-1; i >= 0 ; i--) {
485
                                ILabelClass lc = mod.getLabelAtRow(i);
486
                                lc.setVisible(chkLabel.isSelected());
487
                        }
488

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

    
497
                } else if (c.equals(btnMoveDownClass)) {
498
                        int[] indices = tblClasses.getSelectedRows();
499
                        if (indices.length>0) {
500
                                int classIndex = indices[indices.length-1];
501
                                int targetPos = Math.min(tblClasses.getRowCount()-1, classIndex+1);
502
                                swapClass(classIndex, targetPos,indices.length);
503
                        }
504

    
505
                }else if (c.equals(btnDelClass)) {
506
                        int[] indices = tblClasses.getSelectedRows();
507
                        if (indices.length>0) {
508
                                int classIndex = indices[0];
509
                                int targetPos = Math.min(tblClasses.getRowCount(), classIndex);
510
                                swapClass(classIndex, targetPos,indices.length);
511
                        }
512
                }
513

    
514

    
515
                mod.fireTableDataChanged();
516
                method.clearAllClasses();
517
                ILabelClass[] classes = ((LabelClassTableModel)tblClasses.getModel()).toLabelClassArray();
518
                for (int i = 0; i < classes.length; i++) {
519
                        method.addLabelClass(classes[i]);
520
                }
521
                repaint();
522
        }
523
        public void propertyChange(PropertyChangeEvent evt) {
524
                // TODO Auto-generated method stub
525

    
526
        }
527

    
528
        public void setEnabled(boolean enabled) {
529
                super.setEnabled(enabled);
530
                getBtnAddClass().setEnabled(enabled);
531
                getBtnDelClass().setEnabled(enabled);
532
                getBtnMoveDownClass().setEnabled(enabled);
533
                getBtnMoveUpClass().setEnabled(enabled);
534
                getChkDefinePriorities().setEnabled(enabled);
535
                scrlPan.setEnabled(enabled);
536
                tblClasses.setEnabled(enabled);
537
        }
538

    
539

    
540

    
541

    
542

    
543

    
544
}