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 / featurequery / DefaultFeatureQueryOrderPanel.java @ 45902

History | View | Annotate | Download (11.8 KB)

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

    
3
import java.awt.Dimension;
4
import java.awt.event.ActionEvent;
5
import java.net.URL;
6
import javax.swing.ButtonGroup;
7
import javax.swing.DefaultListModel;
8
import javax.swing.ImageIcon;
9
import javax.swing.JComponent;
10
import javax.swing.ListCellRenderer;
11
import javax.swing.event.ListSelectionEvent;
12
import org.apache.commons.io.FilenameUtils;
13
import org.gvsig.fmap.dal.exception.DataException;
14
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
15
import org.gvsig.fmap.dal.feature.FeatureQuery;
16
import org.gvsig.fmap.dal.feature.FeatureQueryOrder.FeatureQueryOrderMember;
17
import org.gvsig.fmap.dal.feature.FeatureStore;
18
import org.gvsig.fmap.dal.feature.FeatureType;
19
import org.gvsig.fmap.dal.swing.DALSwingLocator;
20
import org.gvsig.tools.swing.api.ActionListenerSupport;
21
import org.gvsig.tools.swing.api.FilteredListController;
22
import org.gvsig.tools.swing.api.FilteredListModel;
23
import org.gvsig.tools.swing.api.ToolsSwingLocator;
24
import org.gvsig.tools.swing.api.ToolsSwingManager;
25
import org.gvsig.tools.swing.icontheme.IconTheme;
26
import org.gvsig.fmap.dal.swing.featurequery.FeatureQueryOrderPanel;
27

    
28
/**
29
 *
30
 * @author jjdelcerro
31
 */
32
public class DefaultFeatureQueryOrderPanel
33
        extends DefaultFeatureQueryOrderPanelView
34
        implements FeatureQueryOrderPanel {
35

    
36
  private FeatureQuery query;
37
  private FeatureType featureType;
38
  private final ActionListenerSupport actionListenerSupport;
39
  private final ButtonGroup ascendingGroup;
40
  private FilteredListController availableFieldsController;
41

    
42
  public DefaultFeatureQueryOrderPanel() {
43
    this.actionListenerSupport = ToolsSwingLocator.getToolsSwingManager().createActionListenerSupport();
44
    this.ascendingGroup = new ButtonGroup();
45
    this.initComponents();
46
  }
47

    
48
  @Override
49
  public FeatureQuery fetch(FeatureQuery query) {
50
    if (query == null) {
51
      return this.query.getCopy();
52
    }
53
    query.getOrder().copyFrom(this.query.getOrder());
54
    return query;
55
  }
56

    
57
  @Override
58
  public FeatureQuery fetch() {
59
    return this.fetch(null);
60
  }
61

    
62
  @Override
63
  public void put(FeatureQuery query) {
64
    this.query.copyFrom(query);
65
    this.updateControls();
66
  }
67

    
68
  private void initComponents() {
69
    ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
70

    
71
    toolsSwingManager.translate(this.btnColumnAdd);
72
    toolsSwingManager.translate(this.btnColumnDown);
73
    toolsSwingManager.translate(this.btnColumnRemove);
74
    toolsSwingManager.translate(this.btnColumnSortAscending);
75
    toolsSwingManager.translate(this.btnColumnSortDescending);
76
    toolsSwingManager.translate(this.btnColumnUp);
77
    toolsSwingManager.translate(this.btnColumnsFilter);
78
    
79
    ListCellRenderer renderer = DALSwingLocator.getDataSwingManager().createDefaultFeatureAttributeListCellRenderer();
80
    this.lstAvailableColumns.setCellRenderer(renderer);
81
    this.lstOrderColumns.setCellRenderer(renderer);
82

    
83
    this.ascendingGroup.add(this.btnColumnSortAscending);
84
    this.ascendingGroup.add(this.btnColumnSortDescending);
85

    
86
    this.lstAvailableColumns.addListSelectionListener((ListSelectionEvent e) -> {
87
      if (e.getValueIsAdjusting()) {
88
        return;
89
      }
90
      doSelectAvailableColumn();
91
    });
92
    this.lstOrderColumns.addListSelectionListener((ListSelectionEvent e) -> {
93
      if (e.getValueIsAdjusting()) {
94
        return;
95
      }
96
      doSelectOrderColumn();
97
    });
98
    this.btnColumnAdd.addActionListener((ActionEvent e) -> {
99
      doColumnAdd();
100
    });
101
    this.btnColumnRemove.addActionListener((ActionEvent e) -> {
102
      doColumnRemove();
103
    });
104
    this.btnColumnDown.addActionListener((ActionEvent e) -> {
105
      doColumnDown();
106
    });
107
    this.btnColumnUp.addActionListener((ActionEvent e) -> {
108
      doColumnUp();
109
    });
110
    this.btnColumnSortAscending.addActionListener((ActionEvent e) -> {
111
      doColumnSortAscending();
112
    });
113
    this.btnColumnSortDescending.addActionListener((ActionEvent e) -> {
114
      doColumnSortDescending();
115
    });
116
    this.availableFieldsController = toolsSwingManager.createFilteredListController(
117
            lstAvailableColumns,
118
            txtColumnsFilter,
119
            btnColumnsFilter
120
    );
121
    Dimension sz = this.getPreferredSize();
122
    if (sz.width < DEFAULT_WIDTH) {
123
      sz.width = DEFAULT_WIDTH;
124
    }
125
    if (sz.height < DEFAULT_HEIGHT) {
126
      sz.height = DEFAULT_HEIGHT;
127
    }
128
    this.setPreferredSize(sz);
129
  }
130

    
131
  private void doSelectAvailableColumn() {
132
    if (this.lstAvailableColumns.getSelectedIndex() >= 0) {
133
      this.btnColumnAdd.setEnabled(true);
134
      return;
135
    }
136
    this.btnColumnAdd.setEnabled(false);
137
  }
138

    
139
  private void doSelectOrderColumn() {
140
    if (this.lstOrderColumns.getSelectedIndex() >= 0) {
141
      FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstOrderColumns.getSelectedValue();
142
      if (attr != null) {
143
        FeatureQueryOrderMember member = this.query.getOrder().get(attr.getName());
144
        if (member != null) {
145
          this.btnColumnRemove.setEnabled(true);
146
          this.btnColumnDown.setEnabled(true);
147
          this.btnColumnUp.setEnabled(true);
148
          this.btnColumnSortAscending.setEnabled(true);
149
          this.btnColumnSortDescending.setEnabled(true);
150
          if (member.getAscending()) {
151
            this.btnColumnSortAscending.setSelected(true);
152
            this.btnColumnSortDescending.setSelected(false);
153
          } else {
154
            this.btnColumnSortAscending.setSelected(false);
155
            this.btnColumnSortDescending.setSelected(true);
156
          }
157
          return;
158
        }
159
      }
160
    }
161
    this.btnColumnRemove.setEnabled(false);
162
    this.btnColumnDown.setEnabled(false);
163
    this.btnColumnUp.setEnabled(false);
164
    this.btnColumnSortAscending.setEnabled(false);
165
    this.btnColumnSortDescending.setEnabled(false);
166
    this.btnColumnSortAscending.setSelected(false);
167
    this.btnColumnSortDescending.setSelected(false);
168
  }
169

    
170
  private void doColumnSortAscending() {
171
    FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstOrderColumns.getSelectedValue();
172
    if (attr == null) {
173
      return;
174
    }
175
    FeatureQueryOrderMember member = this.query.getOrder().get(attr.getName());
176
    member.setAscending(true);
177
  }
178

    
179
  private void doColumnSortDescending() {
180
    FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstOrderColumns.getSelectedValue();
181
    if (attr == null) {
182
      return;
183
    }
184
    FeatureQueryOrderMember member = this.query.getOrder().get(attr.getName());
185
    member.setAscending(false);
186
  }
187

    
188
  private void doColumnUp() {
189
    FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstOrderColumns.getSelectedValue();
190
    if (attr == null) {
191
      return;
192
    }
193
    this.query.getOrder().movePrevious(attr.getName());
194
    this.updateControls();
195
  }
196

    
197
  private void doColumnDown() {
198
    FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstOrderColumns.getSelectedValue();
199
    if (attr == null) {
200
      return;
201
    }
202
    this.query.getOrder().moveNext(attr.getName());
203
    this.updateControls();
204
  }
205

    
206
  private void doColumnRemove() {
207
    FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstOrderColumns.getSelectedValue();
208
    if (attr == null) {
209
      return;
210
    }
211
    FeatureQueryOrderMember member = this.query.getOrder().get(attr.getName());
212
    this.query.getOrder().remove(member);
213
    this.updateControls();
214
  }
215

    
216
  private void doColumnAdd() {
217
    FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstAvailableColumns.getSelectedValue();
218
    if (attr == null) {
219
      return;
220
    }
221
    this.query.getOrder().add(attr.getName(), true);
222
    this.updateControls();
223
  }
224

    
225
  @Override
226
  public void setStore(FeatureStore store) {
227
    try {
228
      this.featureType = store.getDefaultFeatureType();
229
      this.query = store.createFeatureQuery();
230
    } catch (DataException ex) {
231
      throw new RuntimeException("Can't assign store", ex);
232
    }
233
  }
234

    
235
  @Override
236
  public JComponent asJComponent() {
237
    return this;
238
  }
239

    
240
  private void updateControls() {
241
    int indexAvailables = this.lstAvailableColumns.getSelectedIndex();
242
    int indexOrder = this.lstOrderColumns.getSelectedIndex();
243
    FilteredListModel modelAvailables = ToolsSwingLocator.getToolsSwingManager().createFilteredListModel();
244
    DefaultListModel<FeatureAttributeDescriptor> modelOrder = new DefaultListModel<>();
245
    for (FeatureAttributeDescriptor attr : featureType) {
246
      if (this.query.getOrder() == null || !this.query.getOrder().contains(attr.getName())) {
247
        modelAvailables.addElement(attr);
248
      }
249
    }
250
    for (FeatureAttributeDescriptor attr : this.query.getExtraColumn().getColumns()) {
251
      if (this.query.getOrder() == null || !this.query.getOrder().contains(attr.getName())) {
252
        modelAvailables.addElement(attr);
253
      }
254
    }
255
    for (FeatureQueryOrderMember member : this.query.getOrder().members()) {
256
      FeatureAttributeDescriptor attr = this.featureType.getAttributeDescriptor(member.getAttributeName());
257
      if (attr==null) {
258
          attr = this.query.getExtraColumn().get(member.getAttributeName());
259
      }
260
      modelOrder.addElement(attr);
261
    }
262
    modelAvailables.setFilter(this.txtColumnsFilter.getText());
263
    modelAvailables.sort(true);
264
    this.lstAvailableColumns.setModel(modelAvailables);
265
    this.lstOrderColumns.setModel(modelOrder);
266
    if (indexAvailables >= 0 && modelAvailables.getSize() > 0) {
267
      if (indexAvailables >= modelAvailables.getSize()) {
268
        indexAvailables = modelAvailables.getSize() - 1;
269
      }
270
      this.lstAvailableColumns.setSelectedIndex(indexAvailables);
271
      this.btnColumnAdd.setEnabled(true);
272
    } else {
273
      this.btnColumnAdd.setEnabled(false);
274
    }
275
    
276
    
277
    if (indexOrder >= 0 && modelOrder.getSize() > 0) {
278
      if (indexOrder >= modelOrder.getSize()) {
279
        indexOrder = modelOrder.getSize() - 1;
280
      }
281
      this.lstOrderColumns.setSelectedIndex(indexOrder);
282
      FeatureAttributeDescriptor attr = modelOrder.get(indexOrder);
283
      FeatureQueryOrderMember member = this.query.getOrder().get(attr.getName());
284
      if (member == null) {
285
        this.btnColumnSortAscending.setSelected(true);
286
        this.btnColumnSortDescending.setSelected(false);
287
        this.btnColumnSortAscending.setEnabled(false);
288
        this.btnColumnSortDescending.setEnabled(false);
289
      } else {
290
        this.btnColumnSortAscending.setEnabled(true);
291
        this.btnColumnSortDescending.setEnabled(true);
292
        if (member.getAscending()) {
293
          this.btnColumnSortAscending.setSelected(true);
294
          this.btnColumnSortDescending.setSelected(false);
295
        } else {
296
          this.btnColumnSortAscending.setSelected(false);
297
          this.btnColumnSortDescending.setSelected(true);
298
        }
299
      }
300
      this.btnColumnRemove.setEnabled(true);
301
    } else {
302
      this.btnColumnSortAscending.setSelected(true);
303
      this.btnColumnSortDescending.setSelected(false);
304
      this.btnColumnSortAscending.setEnabled(false);
305
      this.btnColumnSortDescending.setEnabled(false);
306
      this.btnColumnRemove.setEnabled(false);
307
    }
308
  }
309

    
310
  @Override
311
  public ImageIcon loadImage(String imageName) {
312
    String name = FilenameUtils.getBaseName(imageName);
313
    IconTheme theme = ToolsSwingLocator.getIconThemeManager().getDefault();
314
    if (theme.exists(name)) {
315
      return theme.get(name);
316
    }
317
    URL url = this.getClass().getResource(name + ".png");
318
    if (url == null) {
319
      return null;
320
    }
321
    return new ImageIcon(url);
322
  }
323

    
324
  public static void selfRegister() {
325
    String[][] iconNames = new String[][]{
326
      new String[]{"dalswing", "featurequery-column-add-arrow"},
327
      new String[]{"dalswing", "featurequery-column-remove-arrow"},
328
      new String[]{"dalswing", "featurequery-column-down"},
329
      new String[]{"dalswing", "featurequery-column-up"}
330
    };
331
    IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
332
    for (String[] icon : iconNames) {
333
      URL url = DefaultFeatureQueryOrderPanel.class.getResource(icon[1] + ".png");
334
      theme.registerDefault("DALSwing", icon[0], icon[1], null, url);
335
    }
336
  }
337
}