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 / orderpanel / DefaultFeatureStoreOrderPanel.java @ 44644

History | View | Annotate | Download (16.1 KB)

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

    
3
import java.awt.Dimension;
4
import java.awt.event.ActionEvent;
5
import java.awt.event.ActionListener;
6
import java.awt.event.KeyAdapter;
7
import java.awt.event.KeyEvent;
8
import java.net.URL;
9
import javax.swing.ButtonGroup;
10
import javax.swing.DefaultListModel;
11
import javax.swing.ImageIcon;
12
import javax.swing.JButton;
13
import javax.swing.JComponent;
14
import javax.swing.JList;
15
import javax.swing.ListCellRenderer;
16
import javax.swing.event.ListSelectionEvent;
17
import javax.swing.event.ListSelectionListener;
18
import javax.swing.text.JTextComponent;
19
import org.apache.commons.io.FilenameUtils;
20
import org.gvsig.fmap.dal.exception.DataException;
21
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
22
import org.gvsig.fmap.dal.feature.FeatureQueryOrder;
23
import org.gvsig.fmap.dal.feature.FeatureQueryOrder.FeatureQueryOrderMember;
24
import org.gvsig.fmap.dal.feature.FeatureStore;
25
import org.gvsig.fmap.dal.feature.FeatureType;
26
import org.gvsig.fmap.dal.swing.DALSwingLocator;
27
import org.gvsig.fmap.dal.swing.orderpanel.FeatureStoreOrderPanel;
28
import org.gvsig.tools.swing.api.ActionListenerSupport;
29
import org.gvsig.tools.swing.api.FilteredListModel;
30
import org.gvsig.tools.swing.api.ToolsSwingLocator;
31
import org.gvsig.tools.swing.api.ToolsSwingManager;
32
import org.gvsig.tools.swing.icontheme.IconTheme;
33

    
34
/**
35
 *
36
 * @author jjdelcerro
37
 */
38
public class DefaultFeatureStoreOrderPanel 
39
        extends DefaultFeatureStoreOrderPanelView
40
        implements FeatureStoreOrderPanel 
41
    {
42

    
43
    private static class FilteredListController {
44
        
45
        private final JList list;
46
        private final JTextComponent text;
47
        private final JButton button;
48
        
49
        public FilteredListController(JList list, JTextComponent text, JButton button) {
50
            this.list = list;
51
            this.text = text;
52
            this.button = button;
53
            this.initComponents();
54
        }
55
        
56
        private void initComponents() {
57
            ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
58
            toolsSwingManager.addClearButton(this.text, new ActionListener() {
59
                @Override
60
                public void actionPerformed(ActionEvent e) {
61
                    FilteredListModel model = (FilteredListModel) list.getModel();
62
                    text.setText("");
63
                    model.setFilter(null);
64
                }
65
            });
66
            toolsSwingManager.setDefaultPopupMenu(this.text);
67
            this.text.addKeyListener(new KeyAdapter() {
68
                @Override
69
                public void keyTyped(KeyEvent e) {
70
                    if (e.getKeyChar() == '\n') {
71
                        FilteredListModel model = (FilteredListModel) list.getModel();
72
                        model.setFilter(text.getText());
73
                    }
74
                }
75
            });        
76
            this.button.addActionListener(new ActionListener() {
77
                @Override
78
                public void actionPerformed(ActionEvent e) {
79
                    FilteredListModel model = (FilteredListModel) list.getModel();
80
                    model.setFilter(text.getText());
81
                }
82
            });
83
        }
84
        
85
        
86
    }
87
    
88
    private FeatureQueryOrder order;
89
    private FeatureType featureType;
90
    private final ActionListenerSupport actionListenerSupport;
91
    private final ButtonGroup ascendingGroup;
92
    private FilteredListController availableFieldsController;
93
    
94
    public DefaultFeatureStoreOrderPanel() {
95
        this.actionListenerSupport = ToolsSwingLocator.getToolsSwingManager().createActionListenerSupport();
96
        this.ascendingGroup = new ButtonGroup();
97
        this.order = new FeatureQueryOrder();
98
        this.initComponents();
99
    }
100
    
101
    private void initComponents() {
102
        ListCellRenderer renderer = DALSwingLocator.getDataSwingManager().createDefaultFeatureAttributeListCellRenderer();
103
        this.lstAvailableColumns.setCellRenderer(renderer);
104
        this.lstOrderColumns.setCellRenderer(renderer);
105
        
106
        this.ascendingGroup.add(this.btnColumnSortAscending);
107
        this.ascendingGroup.add(this.btnColumnSortDescending);
108
        
109
        this.lstAvailableColumns.addListSelectionListener(new ListSelectionListener() {
110
            @Override
111
            public void valueChanged(ListSelectionEvent e) {
112
                if( e.getValueIsAdjusting() ) {
113
                    return;
114
                }
115
                doSelectAvailableColumn();
116
            }
117
        });
118
        this.lstOrderColumns.addListSelectionListener(new ListSelectionListener() {
119
            @Override
120
            public void valueChanged(ListSelectionEvent e) {
121
                if( e.getValueIsAdjusting() ) {
122
                    return;
123
                }
124
                doSelectOrderColumn();
125
            }
126
        });
127
        this.btnColumnAdd.addActionListener(new ActionListener() {
128
            @Override
129
            public void actionPerformed(ActionEvent e) {
130
                doColumnAdd();
131
            }
132
        });
133
        this.btnColumnRemove.addActionListener(new ActionListener() {
134
            @Override
135
            public void actionPerformed(ActionEvent e) {
136
                doColumnRemove();
137
            }
138
        });
139
        this.btnColumnDown.addActionListener(new ActionListener() {
140
            @Override
141
            public void actionPerformed(ActionEvent e) {
142
                doColumnDown();
143
            }
144
        });
145
        this.btnColumnUp.addActionListener(new ActionListener() {
146
            @Override
147
            public void actionPerformed(ActionEvent e) {
148
                doColumnUp();
149
            }
150
        });
151
        this.btnColumnSortAscending.addActionListener(new ActionListener() {
152
            @Override
153
            public void actionPerformed(ActionEvent e) {
154
                doColumnSortAscending();
155
            }
156

    
157
        });
158
        this.btnColumnSortDescending.addActionListener(new ActionListener() {
159
            @Override
160
            public void actionPerformed(ActionEvent e) {
161
                doColumnSortDescending();
162
            }
163
        });
164
        this.availableFieldsController = new FilteredListController(
165
                lstAvailableColumns, 
166
                txtColumnsFilter, 
167
                btnColumnsFilter
168
        );
169
        Dimension sz = this.getPreferredSize();
170
        if( sz.width<450 ) {
171
            sz.width = 450;
172
        }
173
        if( sz.height < 320 ) {
174
            sz.height = 320;
175
        }
176
        this.setPreferredSize(sz);
177
    }
178

    
179
    private void doSelectAvailableColumn() {
180
        if( this.lstAvailableColumns.getSelectedIndex()>=0 ) {
181
            this.btnColumnAdd.setEnabled(true);
182
            return;
183
        }
184
        this.btnColumnAdd.setEnabled(false);
185
    }
186
    
187
    private void doSelectOrderColumn() {
188
        if( this.lstOrderColumns.getSelectedIndex()>=0 ) {
189
            FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstOrderColumns.getSelectedValue();
190
            if( attr != null ) {
191
                FeatureQueryOrderMember member = this.order.get(attr.getName());
192
                if( member != null ) {
193
                    this.btnColumnRemove.setEnabled(true);
194
                    this.btnColumnDown.setEnabled(true);
195
                    this.btnColumnUp.setEnabled(true);
196
                    this.btnColumnSortAscending.setEnabled(true);
197
                    this.btnColumnSortDescending.setEnabled(true);
198
                    if( member.getAscending() ) {
199
                        this.btnColumnSortAscending.setSelected(true);
200
                        this.btnColumnSortDescending.setSelected(false);
201
                    } else {
202
                        this.btnColumnSortAscending.setSelected(false);
203
                        this.btnColumnSortDescending.setSelected(true);
204
                    }
205
                    return;
206
                }
207
            }
208
        }
209
        this.btnColumnRemove.setEnabled(false);
210
        this.btnColumnDown.setEnabled(false);
211
        this.btnColumnUp.setEnabled(false);
212
        this.btnColumnSortAscending.setEnabled(false);
213
        this.btnColumnSortDescending.setEnabled(false);
214
        this.btnColumnSortAscending.setSelected(false);
215
        this.btnColumnSortDescending.setSelected(false);
216
    }
217
    
218
    private void doColumnSortAscending() {
219
        FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstOrderColumns.getSelectedValue();
220
        if( attr == null ) {
221
            return;
222
        }
223
        FeatureQueryOrderMember member = this.order.get(attr.getName());
224
        member.setAscending(true);
225
    }
226

    
227
    private void doColumnSortDescending() {
228
        FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstOrderColumns.getSelectedValue();
229
        if( attr == null ) {
230
            return;
231
        }
232
        FeatureQueryOrderMember member = this.order.get(attr.getName());
233
        member.setAscending(false);
234
    }
235

    
236
    private void doColumnUp() {
237
        FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstOrderColumns.getSelectedValue();
238
        if( attr == null ) {
239
            return;
240
        }
241
        this.order.movePrevious(attr.getName());
242
        this.updateControls();
243
    }
244

    
245
    private void doColumnDown() {
246
        FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstOrderColumns.getSelectedValue();
247
        if( attr == null ) {
248
            return;
249
        }
250
        this.order.moveNext(attr.getName());
251
        this.updateControls();
252
    }
253

    
254
    private void doColumnRemove() {
255
        FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstOrderColumns.getSelectedValue();
256
        if( attr == null ) {
257
            return;
258
        }
259
        FeatureQueryOrderMember member = this.order.get(attr.getName());
260
        this.order.remove(member);
261
        this.updateControls();
262
    }
263

    
264
    private void doColumnAdd() {
265
        FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstAvailableColumns.getSelectedValue();
266
        if( attr == null ) {
267
            return;
268
        }
269
        this.order.add(attr.getName(), true);
270
        this.updateControls();
271
    }
272

    
273
    @Override
274
    public FeatureQueryOrder getOrder() {
275
        if( this.order==null || this.order.isEmpty() ) {
276
            return null;
277
        }
278
        return this.order;
279
    }
280

    
281
    @Override
282
    public void setOrder(FeatureQueryOrder order) {
283
        if(order==null ) {
284
           this.order = new FeatureQueryOrder();
285
        } else {
286
           try {
287
               this.order = order.clone();
288
           } catch (CloneNotSupportedException ex) {
289
               throw new RuntimeException("Can't assign order", ex);
290
           }
291
        }
292
        if( this.featureType==null ) {
293
            return;
294
        }
295
        this.updateControls();
296
    }
297

    
298
    @Override
299
    public void setStore(FeatureStore store) {
300
        try {
301
            this.setFeatureType(store.getDefaultFeatureType());
302
        } catch (DataException ex) {
303
            throw new RuntimeException("Can't assign store", ex);
304
        }
305
    }
306

    
307
    @Override
308
    public void setFeatureType(FeatureType featureType) {
309
        this.featureType = featureType;
310
        if( this.order == null ) {
311
            return;
312
        }
313
        this.updateControls();
314
    }
315

    
316
    @Override
317
    public FeatureType getFeatureType() {
318
        return this.featureType;
319
    }
320

    
321
    @Override
322
    public JComponent asJComponent() {
323
        return this;
324
    }
325

    
326
    @Override
327
    public void addActionListener(ActionListener al) {
328
        this.actionListenerSupport.addActionListener(al);
329
    }
330

    
331
    @Override
332
    public ActionListener[] getActionListeners() {
333
        return this.actionListenerSupport.getActionListeners();
334
    }
335

    
336
    @Override
337
    public void removeActionListener(ActionListener al) {
338
        this.actionListenerSupport.removeActionListener(al);
339
    }
340

    
341
    @Override
342
    public void removeAllActionListener() {
343
        this.actionListenerSupport.removeAllActionListener();
344
    }
345

    
346
    @Override
347
    public void fireActionEvent(ActionEvent ae) {
348
        this.actionListenerSupport.fireActionEvent(ae);
349
    }
350

    
351
    @Override
352
    public boolean hasActionListeners() {
353
        return this.actionListenerSupport.hasActionListeners();
354
    }
355
    
356
    private void updateControls() {
357
        int indexAvailables = this.lstAvailableColumns.getSelectedIndex();
358
        int indexOrder = this.lstOrderColumns.getSelectedIndex();
359
        FilteredListModel modelAvailables = ToolsSwingLocator.getToolsSwingManager().createFilteredListModel();
360
        DefaultListModel<FeatureAttributeDescriptor> modelOrder = new DefaultListModel<>();
361
        for (FeatureAttributeDescriptor attr : featureType) {
362
            if( this.order == null || !this.order.contains(attr.getName()) ) {
363
                modelAvailables.addElement(attr);
364
            }
365
        }
366
        for (FeatureQueryOrderMember member : this.order.members()) {
367
            FeatureAttributeDescriptor attr = this.featureType.getAttributeDescriptor(member.getAttributeName());
368
            modelOrder.addElement(attr);
369
        }
370
        modelAvailables.sort(true);
371
        this.lstAvailableColumns.setModel(modelAvailables);
372
        this.lstOrderColumns.setModel(modelOrder);
373
        if( indexAvailables >= 0 && modelAvailables.getSize()>0 ) {
374
            if( indexAvailables >= modelAvailables.getSize() ) {
375
                indexAvailables = modelAvailables.getSize()-1;
376
            }
377
            this.lstAvailableColumns.setSelectedIndex(indexAvailables);
378
            this.btnColumnAdd.setEnabled(true);
379
        } else {
380
            this.btnColumnAdd.setEnabled(false);
381
        }
382
        
383
        if( indexOrder >= 0 && modelOrder.getSize()>0 ) {
384
            if( indexOrder >= modelOrder.getSize() ) {
385
                indexOrder = modelOrder.getSize()-1;
386
            }
387
            this.lstOrderColumns.setSelectedIndex(indexOrder);
388
            FeatureAttributeDescriptor attr = modelOrder.get(indexOrder);
389
            FeatureQueryOrderMember member = this.order.get(attr.getName());
390
            if( member==null ) {
391
                this.btnColumnSortAscending.setSelected(true);
392
                this.btnColumnSortDescending.setSelected(false);
393
                this.btnColumnSortAscending.setEnabled(false);
394
                this.btnColumnSortDescending.setEnabled(false);
395
            } else {
396
                this.btnColumnSortAscending.setEnabled(true);
397
                this.btnColumnSortDescending.setEnabled(true);
398
                if( member.getAscending() ) {
399
                    this.btnColumnSortAscending.setSelected(true);
400
                    this.btnColumnSortDescending.setSelected(false);
401
                } else {
402
                    this.btnColumnSortAscending.setSelected(false);
403
                    this.btnColumnSortDescending.setSelected(true);
404
                }
405
            }
406
            this.btnColumnRemove.setEnabled(true);
407
        } else {
408
            this.btnColumnSortAscending.setSelected(true);
409
            this.btnColumnSortDescending.setSelected(false);
410
            this.btnColumnSortAscending.setEnabled(false);
411
            this.btnColumnSortDescending.setEnabled(false);
412
            this.btnColumnRemove.setEnabled(false);
413
        }
414
    }
415

    
416
    @Override
417
    public ImageIcon loadImage(String imageName) {
418
        String name = FilenameUtils.getBaseName(imageName);
419
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getDefault();
420
        if (theme.exists(name)) {
421
            return theme.get(name);
422
        }
423
        URL url = this.getClass().getResource(name + ".png");
424
        if (url == null) {
425
            return null;
426
        }
427
        return new ImageIcon(url);
428
    }
429

    
430
    public static void selfRegister() {
431
        String[][] iconNames = new String[][]{
432
            new String[]{"dalswing", "common-filter"},
433
            new String[]{"dalswing", "common-sortdown"},
434
            new String[]{"dalswing", "common-sortup"},
435
            new String[]{"dalswing", "orderpanel-column-add"},
436
            new String[]{"dalswing", "orderpanel-column-remove"},
437
            new String[]{"dalswing", "orderpanel-column-down"},
438
            new String[]{"dalswing", "orderpanel-column-up"}
439
        };
440
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
441
        for (String[] icon : iconNames) {
442
            URL url = DefaultFeatureStoreOrderPanel.class.getResource(icon[1] + ".png");
443
            theme.registerDefault("DALSwing", icon[0], icon[1], null, url);
444
        }
445
    }
446
}