Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.swing / org.gvsig.fmap.dal.swing.impl / src / main / java / org / gvsig / fmap / dal / swing / impl / featuretype / DefaultFeatureAttributesSelectionPanel.java @ 45162

History | View | Annotate | Download (14.6 KB)

1
package org.gvsig.fmap.dal.swing.impl.featuretype;
2

    
3
import java.awt.Dimension;
4
import java.awt.event.ActionEvent;
5
import java.awt.event.ActionListener;
6
import java.net.URL;
7
import java.util.ArrayList;
8
import java.util.Collections;
9
import java.util.List;
10
import javax.swing.DefaultListCellRenderer;
11
import javax.swing.ImageIcon;
12
import javax.swing.JComponent;
13
import javax.swing.event.DocumentEvent;
14
import javax.swing.event.DocumentListener;
15
import javax.swing.event.ListSelectionEvent;
16
import org.apache.commons.io.FilenameUtils;
17
import org.gvsig.expressionevaluator.Expression;
18
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
19
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
20
import org.gvsig.fmap.dal.exception.DataException;
21
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
22
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
23
import org.gvsig.fmap.dal.feature.FeatureStore;
24
import org.gvsig.fmap.dal.feature.FeatureType;
25
import org.gvsig.fmap.dal.swing.DALSwingLocator;
26
import org.gvsig.tools.swing.api.ActionListenerSupport;
27
import org.gvsig.tools.swing.api.FilteredListController;
28
import org.gvsig.tools.swing.api.FilteredListModel;
29
import org.gvsig.tools.swing.api.ToolsSwingLocator;
30
import org.gvsig.tools.swing.api.ToolsSwingManager;
31
import org.gvsig.tools.swing.icontheme.IconTheme;
32
import org.gvsig.fmap.dal.swing.featuretype.FeatureAttributesSelectionPanel;
33
import org.gvsig.tools.util.LabeledValue;
34

    
35
/**
36
 *
37
 * @author jjdelcerro
38
 */
39
public class DefaultFeatureAttributesSelectionPanel 
40
        extends DefaultFeatureAttributesSelectionPanelView
41
        implements FeatureAttributesSelectionPanel 
42
    {
43

    
44
    private FeatureType featureType;
45
    private final ActionListenerSupport actionListenerSupport;
46
    private FilteredListController availableFieldsController;
47
    private final List<String> selecteds;
48
    private ExpressionPickerController expressionPicker = null;
49
    private boolean allowCalculatedAttributes;
50
    private List<EditableFeatureAttributeDescriptor> extraColumns;
51
    
52
    public DefaultFeatureAttributesSelectionPanel() {
53
        this.actionListenerSupport = ToolsSwingLocator.getToolsSwingManager().createActionListenerSupport();
54
        this.selecteds = new ArrayList<>();
55
        this.initComponents();
56
    }
57
    
58
    private void initComponents() {
59
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
60
//        ListCellRenderer renderer = DALSwingLocator.getDataSwingManager().createDefaultFeatureAttributeListCellRenderer();
61
        DefaultListCellRenderer renderer = new DefaultListCellRenderer();
62
        this.lstAvailableColumns.setCellRenderer(renderer);
63
        this.lstSelectedColumns.setCellRenderer(renderer);
64
        
65
        this.lstAvailableColumns.addListSelectionListener((ListSelectionEvent e) -> {
66
          if( e.getValueIsAdjusting() ) {
67
            return;
68
          }
69
          doSelectAvailableColumn();
70
        });
71
        this.lstSelectedColumns.addListSelectionListener((ListSelectionEvent e) -> {
72
          if( e.getValueIsAdjusting() ) {
73
            return;
74
          }
75
          doSelectColumn();
76
        });
77
        this.txtExpression.getDocument().addDocumentListener(new DocumentListener() {
78
            public void changedUpdate(DocumentEvent e) {
79
              doSelectAvailableColumn();
80
            }
81
            @Override
82
            public void insertUpdate(DocumentEvent de) {
83
                 doSelectAvailableColumn();
84
            }
85

    
86
            @Override
87
            public void removeUpdate(DocumentEvent de) {
88
                 doSelectAvailableColumn();
89
            }
90
        });
91
        this.btnColumnAdd.addActionListener((ActionEvent e) -> {
92
          doColumnAdd();
93
        });
94
        this.btnColumnRemove.addActionListener((ActionEvent e) -> {
95
          doColumnRemove();
96
        });
97
        this.btnColumnDown.addActionListener((ActionEvent e) -> {
98
          doColumnDown();
99
        });
100
        this.btnColumnUp.addActionListener((ActionEvent e) -> {
101
          doColumnUp();
102
        });
103
        this.availableFieldsController = toolsSwingManager.createFilteredListController(
104
                lstAvailableColumns, 
105
                txtColumnsFilter, 
106
                btnColumnsFilter
107
        );     
108
        Dimension sz = this.getPreferredSize();
109
        if( sz.width<450 ) {
110
            sz.width = 450;
111
        }
112
        if( sz.height < 320 ) {
113
            sz.height = 320;
114
        }
115
        this.setPreferredSize(sz);
116
    }
117

    
118
    @Override
119
    public List<String> getSelectedNames() {
120
      return Collections.unmodifiableList(selecteds);
121
    }
122

    
123
    @Override
124
    public void setSelectedNames(List<String> names) {
125
      this.selecteds.clear();
126
      for (String name : names) {
127
        if(!this.selecteds.contains(name)) {
128
          this.selecteds.add(name);
129
        }
130
      }
131
      updateControls();
132
    }
133

    
134
    private void doSelectAvailableColumn() {
135
        if( this.lstAvailableColumns.getSelectedIndex()>=0 || !this.expressionPicker.isEmpty()) {
136
            this.btnColumnAdd.setEnabled(true);
137
            return;
138
        }
139
        this.btnColumnAdd.setEnabled(false);
140
    }
141
    
142
    private void doSelectColumn() {
143
        if( this.lstSelectedColumns.getSelectedIndex()>=0 ) {
144
//            FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstSelectedColumns.getSelectedValue();
145
//            if( attr != null ) {
146
//              this.selecteds.add(attr.getName());
147
              this.btnColumnRemove.setEnabled(true);
148
              this.btnColumnDown.setEnabled(true);
149
              this.btnColumnUp.setEnabled(true);
150
              return;
151
//            }
152
        }
153
        this.btnColumnRemove.setEnabled(false);
154
        this.btnColumnDown.setEnabled(false);
155
        this.btnColumnUp.setEnabled(false);
156
    }
157
    
158
    private void doColumnUp() {
159
        LabeledValue attr = (LabeledValue) this.lstSelectedColumns.getSelectedValue();
160
        if( attr == null ) {
161
            return;
162
        }
163
        int n = this.selecteds.indexOf(attr.getLabel());
164
        if( n<1 ) {
165
          return;
166
        }
167
        Collections.swap(selecteds, n, n-1);
168
        this.lstSelectedColumns.setSelectedIndex(n-1);
169
        this.updateControls();
170
    }
171

    
172
    private void doColumnDown() {
173
        LabeledValue attr = (LabeledValue) this.lstSelectedColumns.getSelectedValue();
174
        if( attr == null ) {
175
            return;
176
        }
177
        int n = this.selecteds.indexOf(attr.getLabel());
178
        if( n<1 || n>=this.selecteds.size()-1 ) {
179
          return;
180
        }
181
        Collections.swap(selecteds, n, n+1);
182
        this.lstSelectedColumns.setSelectedIndex(n+1);
183
        this.updateControls();
184
    }
185
    
186
    private boolean checkIfAttributeInFeatureType(String myAttr) {
187
        for (FeatureAttributeDescriptor attr : featureType) {
188
            if(attr.getName().equalsIgnoreCase(myAttr) ) {
189
               return true;
190
            }
191
        }
192
        List<EditableFeatureAttributeDescriptor> columns = featureType.getExtraColumns().getColumns();
193
        if (columns!=null && !columns.isEmpty()) {
194
            for (EditableFeatureAttributeDescriptor extraCol : columns) {
195
                if(extraCol.getName().equalsIgnoreCase(myAttr)) {
196
                    return true;
197
                }
198
            }
199
        }
200
        return false;
201
    }
202

    
203
    private void doColumnRemove() {
204
        LabeledValue attr = (LabeledValue) this.lstSelectedColumns.getSelectedValue();
205
        if( attr == null ) {
206
            return;
207
        }
208
        String label = attr.getLabel();
209
        int n = this.selecteds.indexOf(label);
210
        if( n<0 ) {
211
          return;
212
        }
213
        
214
        if (!checkIfAttributeInFeatureType(label)) {
215
            Expression toExp = ExpressionEvaluatorLocator.getManager().createExpression();
216
            toExp.setPhrase(label);
217
            this.expressionPicker.set(toExp);
218
        } 
219
 
220
        this.selecteds.remove(n);
221
        this.updateControls();
222
    }
223

    
224
    private void doColumnAdd() {
225
        
226
        if (this.expressionPicker.isEmpty()) {
227
            LabeledValue attr = (LabeledValue) this.lstAvailableColumns.getSelectedValue();
228
            if( attr == null ) {
229
                return;
230
            }
231
            int n = this.selecteds.indexOf(attr);
232
            if( n>=0 ) {
233
              return;
234
            }
235
            this.selecteds.add(attr.getLabel());
236
        } else {
237
            if (this.expressionPicker.isValid()) {
238
                Expression exp = this.expressionPicker.get();
239
                String expressionField = exp.getPhrase();
240
                int n = this.selecteds.indexOf(expressionField);
241
                if (n >= 0) {
242
                    return;
243
                }
244
                this.selecteds.add(expressionField);
245
                this.expressionPicker.set(null);
246
            }
247
        }
248
        this.updateControls();
249
    }
250

    
251
    @Override
252
    public void setStore(FeatureStore store) {
253
        try {
254
            this.setFeatureType(store.getDefaultFeatureType());
255
        } catch (DataException ex) {
256
            throw new RuntimeException("Can't assign store", ex);
257
        }
258
    }
259

    
260
    @Override
261
    public void setFeatureType(FeatureType featureType) {
262
        this.featureType = featureType;
263
        if( !this.selecteds.isEmpty() ) {
264
            return;
265
        }
266
        this.updateControls();
267
    }
268
    @Override
269
    public void setExtraColumns(List<EditableFeatureAttributeDescriptor> extraColumns) {
270
        this.extraColumns = extraColumns;
271
        this.updateControls();
272
    }
273

    
274
    @Override
275
    public FeatureType getFeatureType() {
276
        return this.featureType;
277
    }
278

    
279
    @Override
280
    public JComponent asJComponent() {
281
        return this;
282
    }
283

    
284
    @Override
285
    public void addActionListener(ActionListener al) {
286
        this.actionListenerSupport.addActionListener(al);
287
    }
288

    
289
    @Override
290
    public ActionListener[] getActionListeners() {
291
        return this.actionListenerSupport.getActionListeners();
292
    }
293

    
294
    @Override
295
    public void removeActionListener(ActionListener al) {
296
        this.actionListenerSupport.removeActionListener(al);
297
    }
298

    
299
    @Override
300
    public void removeAllActionListener() {
301
        this.actionListenerSupport.removeAllActionListener();
302
    }
303

    
304
    @Override
305
    public void fireActionEvent(ActionEvent ae) {
306
        this.actionListenerSupport.fireActionEvent(ae);
307
    }
308

    
309
    @Override
310
    public boolean hasActionListeners() {
311
        return this.actionListenerSupport.hasActionListeners();
312
    }
313
    
314
    private void updateControls() {
315
        
316
        if (this.expressionPicker == null) {
317
                this.expressionPicker = 
318
                DALSwingLocator.getDataSwingManager().createExpressionPickerController(
319
                        this.featureType.getStore(), 
320
                        txtExpression, 
321
                        btnExpression, 
322
                        btnBookmarks, 
323
                        btnHistory);
324
        }
325
        int indexAvailables = this.lstAvailableColumns.getSelectedIndex();
326
        int indexSelecteds = this.lstSelectedColumns.getSelectedIndex();
327
        FilteredListModel modelAvailables = ToolsSwingLocator.getToolsSwingManager().createFilteredListModel();
328
        FilteredListModel modelSelecteds = ToolsSwingLocator.getToolsSwingManager().createFilteredListModel();
329
        for (FeatureAttributeDescriptor attr : featureType) {
330
            if( !this.selecteds.contains(attr.getName()) ) {
331
                modelAvailables.addElement(attr.getName()); //label?
332
            }
333
        }
334
        List<EditableFeatureAttributeDescriptor> columns = featureType.getExtraColumns().getColumns();
335
        if (columns!=null && !columns.isEmpty()) {
336
            for (EditableFeatureAttributeDescriptor extraCol : columns) {
337
                if( !this.selecteds.contains(extraCol.getName()) ) {
338
                    modelAvailables.addElement(extraCol.getName());
339
                }
340
            }
341
        }
342
        
343
        if (this.extraColumns!=null && !this.extraColumns.isEmpty()) {
344
            for (FeatureAttributeDescriptor extraCol : this.extraColumns) {
345
                if( !this.extraColumns.contains(extraCol.getName()) ) {
346
                    modelAvailables.addElement(extraCol.getName());
347
                }
348
            }
349
        }
350
        
351
        modelAvailables.setFilter(this.txtColumnsFilter.getText());
352
        modelAvailables.sort(true);
353
        for (String name : this.selecteds) {
354
            modelSelecteds.addElement(name);
355
        }
356
        modelAvailables.sort(true);
357
        this.lstAvailableColumns.setModel(modelAvailables);
358
        this.lstSelectedColumns.setModel(modelSelecteds);
359
        if( indexAvailables >= 0 && modelAvailables.getSize()>0 ) {
360
            if( indexAvailables >= modelAvailables.getSize() ) {
361
                indexAvailables = modelAvailables.getSize()-1;
362
            }
363
            this.lstAvailableColumns.setSelectedIndex(indexAvailables);
364
            this.btnColumnAdd.setEnabled(true);
365
        } else {
366
            if(!this.expressionPicker.isEmpty()) {
367
                this.btnColumnAdd.setEnabled(true);  
368
            } else {
369
                this.btnColumnAdd.setEnabled(false);
370
            }
371
        }
372
        
373
        if( indexSelecteds >= 0 && modelSelecteds.getSize()>0 ) {
374
            if( indexSelecteds >= modelSelecteds.getSize() ) {
375
                indexSelecteds = modelSelecteds.getSize()-1;
376
            }
377
            this.lstSelectedColumns.setSelectedIndex(indexSelecteds);
378
            this.btnColumnRemove.setEnabled(true);
379
        } else {
380
            this.btnColumnRemove.setEnabled(false);
381
        }
382
    }
383

    
384
    @Override
385
    public ImageIcon loadImage(String imageName) {
386
        String name = FilenameUtils.getBaseName(imageName);
387
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getDefault();
388
        if (theme.exists(name)) {
389
            return theme.get(name);
390
        }
391
        URL url = this.getClass().getResource(name + ".png");
392
        if (url == null) {
393
            return null;
394
        }
395
        return new ImageIcon(url);
396
    }
397

    
398
    public static void selfRegister() {
399
        String[][] iconNames = new String[][]{
400
            new String[]{"dalswing", "common-filter"},
401
            new String[]{"dalswing", "featuretype-column-add-arrow"},
402
            new String[]{"dalswing", "featuretype-column-remove-arrow"},
403
            new String[]{"dalswing", "featuretype-column-down"},
404
            new String[]{"dalswing", "featuretype-column-up"}
405
        };
406
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
407
        for (String[] icon : iconNames) {
408
            URL url = DefaultFeatureAttributesSelectionPanel.class.getResource(icon[1] + ".png");
409
            theme.registerDefault("DALSwing", icon[0], icon[1], null, url);
410
        }
411
    }
412

    
413
    public void allowCalculatedAttributes(boolean b) {
414
        this.allowCalculatedAttributes = b;
415
    }
416
}