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 @ 45155

History | View | Annotate | Download (14 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
    
51
    public DefaultFeatureAttributesSelectionPanel() {
52
        this.actionListenerSupport = ToolsSwingLocator.getToolsSwingManager().createActionListenerSupport();
53
        this.selecteds = new ArrayList<>();
54
        this.initComponents();
55
    }
56
    
57
    private void initComponents() {
58
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
59
//        ListCellRenderer renderer = DALSwingLocator.getDataSwingManager().createDefaultFeatureAttributeListCellRenderer();
60
        DefaultListCellRenderer renderer = new DefaultListCellRenderer();
61
        this.lstAvailableColumns.setCellRenderer(renderer);
62
        this.lstSelectedColumns.setCellRenderer(renderer);
63
        
64
        this.lstAvailableColumns.addListSelectionListener((ListSelectionEvent e) -> {
65
          if( e.getValueIsAdjusting() ) {
66
            return;
67
          }
68
          doSelectAvailableColumn();
69
        });
70
        this.lstSelectedColumns.addListSelectionListener((ListSelectionEvent e) -> {
71
          if( e.getValueIsAdjusting() ) {
72
            return;
73
          }
74
          doSelectColumn();
75
        });
76
        this.txtExpression.getDocument().addDocumentListener(new DocumentListener() {
77
            public void changedUpdate(DocumentEvent e) {
78
              doSelectAvailableColumn();
79
            }
80
            @Override
81
            public void insertUpdate(DocumentEvent de) {
82
                 doSelectAvailableColumn();
83
            }
84

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

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

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

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

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

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

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

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

    
259
    @Override
260
    public void setFeatureType(FeatureType featureType) {
261
        this.featureType = featureType;
262
        if( !this.selecteds.isEmpty() ) {
263
            return;
264
        }
265
        this.updateControls();
266
    }
267

    
268
    @Override
269
    public FeatureType getFeatureType() {
270
        return this.featureType;
271
    }
272

    
273
    @Override
274
    public JComponent asJComponent() {
275
        return this;
276
    }
277

    
278
    @Override
279
    public void addActionListener(ActionListener al) {
280
        this.actionListenerSupport.addActionListener(al);
281
    }
282

    
283
    @Override
284
    public ActionListener[] getActionListeners() {
285
        return this.actionListenerSupport.getActionListeners();
286
    }
287

    
288
    @Override
289
    public void removeActionListener(ActionListener al) {
290
        this.actionListenerSupport.removeActionListener(al);
291
    }
292

    
293
    @Override
294
    public void removeAllActionListener() {
295
        this.actionListenerSupport.removeAllActionListener();
296
    }
297

    
298
    @Override
299
    public void fireActionEvent(ActionEvent ae) {
300
        this.actionListenerSupport.fireActionEvent(ae);
301
    }
302

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

    
369
    @Override
370
    public ImageIcon loadImage(String imageName) {
371
        String name = FilenameUtils.getBaseName(imageName);
372
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getDefault();
373
        if (theme.exists(name)) {
374
            return theme.get(name);
375
        }
376
        URL url = this.getClass().getResource(name + ".png");
377
        if (url == null) {
378
            return null;
379
        }
380
        return new ImageIcon(url);
381
    }
382

    
383
    public static void selfRegister() {
384
        String[][] iconNames = new String[][]{
385
            new String[]{"dalswing", "common-filter"},
386
            new String[]{"dalswing", "featuretype-column-add-arrow"},
387
            new String[]{"dalswing", "featuretype-column-remove-arrow"},
388
            new String[]{"dalswing", "featuretype-column-down"},
389
            new String[]{"dalswing", "featuretype-column-up"}
390
        };
391
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
392
        for (String[] icon : iconNames) {
393
            URL url = DefaultFeatureAttributesSelectionPanel.class.getResource(icon[1] + ".png");
394
            theme.registerDefault("DALSwing", icon[0], icon[1], null, url);
395
        }
396
    }
397

    
398
    public void allowCalculatedAttributes(boolean b) {
399
        this.allowCalculatedAttributes = b;
400
    }
401
}