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

History | View | Annotate | Download (11.3 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
    ListCellRenderer renderer = DALSwingLocator.getDataSwingManager().createDefaultFeatureAttributeListCellRenderer();
72
    this.lstAvailableColumns.setCellRenderer(renderer);
73
    this.lstOrderColumns.setCellRenderer(renderer);
74

    
75
    this.ascendingGroup.add(this.btnColumnSortAscending);
76
    this.ascendingGroup.add(this.btnColumnSortDescending);
77

    
78
    this.lstAvailableColumns.addListSelectionListener((ListSelectionEvent e) -> {
79
      if (e.getValueIsAdjusting()) {
80
        return;
81
      }
82
      doSelectAvailableColumn();
83
    });
84
    this.lstOrderColumns.addListSelectionListener((ListSelectionEvent e) -> {
85
      if (e.getValueIsAdjusting()) {
86
        return;
87
      }
88
      doSelectOrderColumn();
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.btnColumnSortAscending.addActionListener((ActionEvent e) -> {
103
      doColumnSortAscending();
104
    });
105
    this.btnColumnSortDescending.addActionListener((ActionEvent e) -> {
106
      doColumnSortDescending();
107
    });
108
    this.availableFieldsController = toolsSwingManager.createFilteredListController(
109
            lstAvailableColumns,
110
            txtColumnsFilter,
111
            btnColumnsFilter
112
    );
113
    Dimension sz = this.getPreferredSize();
114
    if (sz.width < DEFAULT_WIDTH) {
115
      sz.width = DEFAULT_WIDTH;
116
    }
117
    if (sz.height < DEFAULT_HEIGHT) {
118
      sz.height = DEFAULT_HEIGHT;
119
    }
120
    this.setPreferredSize(sz);
121
  }
122

    
123
  private void doSelectAvailableColumn() {
124
    if (this.lstAvailableColumns.getSelectedIndex() >= 0) {
125
      this.btnColumnAdd.setEnabled(true);
126
      return;
127
    }
128
    this.btnColumnAdd.setEnabled(false);
129
  }
130

    
131
  private void doSelectOrderColumn() {
132
    if (this.lstOrderColumns.getSelectedIndex() >= 0) {
133
      FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstOrderColumns.getSelectedValue();
134
      if (attr != null) {
135
        FeatureQueryOrderMember member = this.query.getOrder().get(attr.getName());
136
        if (member != null) {
137
          this.btnColumnRemove.setEnabled(true);
138
          this.btnColumnDown.setEnabled(true);
139
          this.btnColumnUp.setEnabled(true);
140
          this.btnColumnSortAscending.setEnabled(true);
141
          this.btnColumnSortDescending.setEnabled(true);
142
          if (member.getAscending()) {
143
            this.btnColumnSortAscending.setSelected(true);
144
            this.btnColumnSortDescending.setSelected(false);
145
          } else {
146
            this.btnColumnSortAscending.setSelected(false);
147
            this.btnColumnSortDescending.setSelected(true);
148
          }
149
          return;
150
        }
151
      }
152
    }
153
    this.btnColumnRemove.setEnabled(false);
154
    this.btnColumnDown.setEnabled(false);
155
    this.btnColumnUp.setEnabled(false);
156
    this.btnColumnSortAscending.setEnabled(false);
157
    this.btnColumnSortDescending.setEnabled(false);
158
    this.btnColumnSortAscending.setSelected(false);
159
    this.btnColumnSortDescending.setSelected(false);
160
  }
161

    
162
  private void doColumnSortAscending() {
163
    FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstOrderColumns.getSelectedValue();
164
    if (attr == null) {
165
      return;
166
    }
167
    FeatureQueryOrderMember member = this.query.getOrder().get(attr.getName());
168
    member.setAscending(true);
169
  }
170

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

    
180
  private void doColumnUp() {
181
    FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstOrderColumns.getSelectedValue();
182
    if (attr == null) {
183
      return;
184
    }
185
    this.query.getOrder().movePrevious(attr.getName());
186
    this.updateControls();
187
  }
188

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

    
198
  private void doColumnRemove() {
199
    FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstOrderColumns.getSelectedValue();
200
    if (attr == null) {
201
      return;
202
    }
203
    FeatureQueryOrderMember member = this.query.getOrder().get(attr.getName());
204
    this.query.getOrder().remove(member);
205
    this.updateControls();
206
  }
207

    
208
  private void doColumnAdd() {
209
    FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstAvailableColumns.getSelectedValue();
210
    if (attr == null) {
211
      return;
212
    }
213
    this.query.getOrder().add(attr.getName(), true);
214
    this.updateControls();
215
  }
216

    
217
  @Override
218
  public void setStore(FeatureStore store) {
219
    try {
220
      this.featureType = store.getDefaultFeatureType();
221
      this.query = store.createFeatureQuery();
222
    } catch (DataException ex) {
223
      throw new RuntimeException("Can't assign store", ex);
224
    }
225
  }
226

    
227
  @Override
228
  public JComponent asJComponent() {
229
    return this;
230
  }
231

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

    
294
  @Override
295
  public ImageIcon loadImage(String imageName) {
296
    String name = FilenameUtils.getBaseName(imageName);
297
    IconTheme theme = ToolsSwingLocator.getIconThemeManager().getDefault();
298
    if (theme.exists(name)) {
299
      return theme.get(name);
300
    }
301
    URL url = this.getClass().getResource(name + ".png");
302
    if (url == null) {
303
      return null;
304
    }
305
    return new ImageIcon(url);
306
  }
307

    
308
  public static void selfRegister() {
309
    String[][] iconNames = new String[][]{
310
      new String[]{"dalswing", "common-filter"},
311
      new String[]{"dalswing", "common-sortdown"},
312
      new String[]{"dalswing", "common-sortup"},
313
      new String[]{"dalswing", "featurequery-column-add-arrow"},
314
      new String[]{"dalswing", "featurequery-column-remove-arrow"},
315
      new String[]{"dalswing", "featurequery-column-down"},
316
      new String[]{"dalswing", "featurequery-column-up"}
317
    };
318
    IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
319
    for (String[] icon : iconNames) {
320
      URL url = DefaultFeatureQueryOrderPanel.class.getResource(icon[1] + ".png");
321
      theme.registerDefault("DALSwing", icon[0], icon[1], null, url);
322
    }
323
  }
324
}