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 / DefaultFeatureQueryGroupByPanel.java @ 44801

History | View | Annotate | Download (8.68 KB)

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

    
3
import java.awt.BorderLayout;
4
import java.awt.Component;
5
import java.awt.Dimension;
6
import java.awt.event.ActionEvent;
7
import java.awt.event.ActionListener;
8
import java.net.URL;
9
import javax.swing.DefaultComboBoxModel;
10
import javax.swing.ImageIcon;
11
import javax.swing.JComponent;
12
import javax.swing.JLabel;
13
import javax.swing.JList;
14
import javax.swing.event.ChangeEvent;
15
import javax.swing.event.ChangeListener;
16
import javax.swing.event.ListDataEvent;
17
import javax.swing.event.ListDataListener;
18
import javax.swing.event.ListSelectionEvent;
19
import javax.swing.event.ListSelectionListener;
20
import org.apache.commons.io.FilenameUtils;
21
import org.apache.commons.lang3.StringUtils;
22
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
23
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
24
import org.gvsig.expressionevaluator.Function;
25
import org.gvsig.expressionevaluator.SymbolTable;
26
import org.gvsig.expressionevaluator.SymbolTableFactory;
27
import org.gvsig.fmap.dal.exception.DataException;
28
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
29
import org.gvsig.fmap.dal.feature.FeatureQuery;
30
import org.gvsig.fmap.dal.feature.FeatureStore;
31
import org.gvsig.fmap.dal.feature.FeatureStoreProviderFactory;
32
import org.gvsig.fmap.dal.feature.FeatureType;
33
import org.gvsig.fmap.dal.swing.impl.featuretype.FeatureAttributeListCellRenderer;
34
import org.gvsig.fmap.dal.swing.impl.featuretype.DefaultFeatureAttributesSelectionPanel;
35
import org.gvsig.tools.dataTypes.DataType;
36
import org.gvsig.tools.swing.api.FilteredListController;
37
import org.gvsig.tools.swing.api.ToolsSwingLocator;
38
import org.gvsig.tools.swing.api.ToolsSwingManager;
39
import org.gvsig.tools.swing.icontheme.IconTheme;
40
import org.gvsig.fmap.dal.swing.featurequery.FeatureQueryGroupByPanel;
41
import org.gvsig.tools.swing.api.FilteredListModel;
42

    
43
/**
44
 *
45
 * @author jjdelcerro
46
 */
47
public class DefaultFeatureQueryGroupByPanel
48
        extends DefaultFeatureQueryGroupByPanelView
49
        implements FeatureQueryGroupByPanel {
50

    
51
  private class AttributesWithAggregateRenderer extends FeatureAttributeListCellRenderer {
52

    
53
    @Override
54
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
55
      JLabel c = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); //To change body of generated methods, choose Tools | Templates.
56
      FeatureAttributeDescriptor attrdesc = (FeatureAttributeDescriptor) value;
57
      String aggregate = query.getAggregateFunctions().get(attrdesc.getName());
58
      if( aggregate !=null ) {
59
        c.setText(c.getText() + "  ["+aggregate+"]");
60
      } else {
61
        c.setText(c.getText() + "  [<NULL>]");
62
      }
63
      return c;
64
    }
65
  }
66
  
67
  private FeatureStore store;
68
  private FeatureType featureType;
69

    
70
  private FilteredListController aggregateFunctionsController;
71
  private DefaultFeatureAttributesSelectionPanel groupByPanel;
72

    
73
  private FeatureQuery query;
74
  
75
  public DefaultFeatureQueryGroupByPanel() {
76
    this.initComponents();
77
  }
78

    
79
  @Override
80
  public JComponent asJComponent() {
81
    return this;
82
  }
83

    
84
  @Override
85
  public ImageIcon loadImage(String imageName) {
86
    String name = FilenameUtils.getBaseName(imageName);
87
    IconTheme theme = ToolsSwingLocator.getIconThemeManager().getDefault();
88
    if (theme.exists(name)) {
89
      return theme.get(name);
90
    }
91
    URL url = this.getClass().getResource(name + ".png");
92
    if (url == null) {
93
      return null;
94
    }
95
    return new ImageIcon(url);
96
  }
97

    
98
  @Override
99
  public void setStore(FeatureStore store) {
100
    try {
101
      this.featureType = store.getDefaultFeatureType();
102
      this.store = store;
103
      this.query = store.createFeatureQuery();
104
      this.groupByPanel.setFeatureType(featureType);
105
      this.groupByPanel.setSelectedNames(query.getGroupByColumns());
106
      this.updateControls();
107
    } catch (DataException ex) {
108
      throw new RuntimeException("Can't assign store", ex);
109
    }
110
  }
111

    
112
  private void initComponents() {
113
    ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
114
    
115
    this.groupByPanel = new DefaultFeatureAttributesSelectionPanel();
116

    
117
    this.pnlGroupByAttributes.setLayout(new BorderLayout());
118
    this.pnlGroupByAttributes.add(this.groupByPanel, BorderLayout.CENTER);
119

    
120
    this.lstAttributes.setCellRenderer(new AttributesWithAggregateRenderer());
121
    this.lstAttributes.addListSelectionListener((ListSelectionEvent e) -> {
122
            if (e.getValueIsAdjusting()) {
123
                return;
124
            }
125
            doSelectAttribute();
126
    });
127
    
128
    this.cboAggretateFunctions.addActionListener(new ActionListener() {
129
        @Override
130
        public void actionPerformed(ActionEvent e) {
131
            doSelectAttribute();
132
        }
133
    });
134

    
135
    this.aggregateFunctionsController = toolsSwingManager.createFilteredListController(
136
            lstAttributes,
137
            txtAttributesFilter,
138
            btnAttributesFilter
139
    );
140
    this.aggregateFunctionsController.addChangeListener(new ChangeListener() {
141
        @Override
142
        public void stateChanged(ChangeEvent ce) {
143
            doSelectAttribute();
144
        }
145
    });
146
    Dimension sz = this.getPreferredSize();
147
    if (sz.width < DEFAULT_WIDTH) {
148
      sz.width = DEFAULT_WIDTH;
149
    }
150
    if (sz.height < DEFAULT_HEIGHT) {
151
      sz.height = DEFAULT_HEIGHT;
152
    }
153
    this.setPreferredSize(sz);
154
  }
155

    
156
  private void doSelectAttribute() {
157
    String previuos = this.txtCurrentAttributeName.getText();
158
    if( !StringUtils.isBlank(previuos) ) {
159
      String aggregate = (String) this.cboAggretateFunctions.getSelectedItem();
160
      if( StringUtils.isBlank(aggregate) || aggregate.equalsIgnoreCase("<NULL>") ) {
161
        this.query.getAggregateFunctions().remove(previuos);
162
      } else {
163
        this.query.getAggregateFunctions().put(previuos, aggregate);
164
      }
165
      this.updateControls();
166
    }
167
    
168
    FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstAttributes.getSelectedValue();
169
    if( attr == null ) {
170
      return;
171
    }
172
    this.txtCurrentAttributeName.setText(attr.getName());
173
    String aggregate = this.query.getAggregateFunctions().get(attr.getName());
174
    if( StringUtils.isBlank(aggregate) || aggregate.equalsIgnoreCase("<NULL>") ) {
175
      this.cboAggretateFunctions.setSelectedIndex(0);
176
    } else {
177
      this.cboAggretateFunctions.setSelectedItem(aggregate);
178
    }    
179
  }
180

    
181
  private void updateControls() {
182
    int indexAttributes = this.lstAttributes.getSelectedIndex();
183
    if( this.cboAggretateFunctions.getModel().getSize() < 1 ) {
184
      DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>();
185
      model.addElement("<NULL>");
186
      java.util.function.Function<String, Integer> isAllowed = ((FeatureStoreProviderFactory)(store.getProviderFactory())).allowFunction();
187
      ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();    
188
      for (SymbolTableFactory factory : manager.getSymbolTableFactories()) {
189
        if( StringUtils.equalsIgnoreCase(Function.GROUP_AGGREGATE, factory.getName()) ) {
190
          SymbolTable symbolTable = factory.create();
191
          for (Function function : symbolTable) {
192
            if( isAllowed.apply(function.name())!=DataType.NO ) {
193
              model.addElement(function.name());
194
            }
195
          }
196
          break;
197
        }
198
      }
199
      this.cboAggretateFunctions.setModel(model);
200
      this.cboAggretateFunctions.setSelectedIndex(0);
201
      this.txtCurrentAttributeName.setText("");
202
    }
203
    ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
204
    FilteredListModel model = toolsSwingManager.createFilteredListModel();
205
    for (FeatureAttributeDescriptor attr : featureType) {
206
        model.addElement(attr);
207
    }
208
    model.setFilter(this.txtAttributesFilter.getText());
209
    model.sort(true);
210
    this.lstAttributes.setModel(model);
211
    this.lstAttributes.setSelectedIndex(indexAttributes);
212
    this.txtCurrentAttributeName.setText("");
213
    this.cboAggretateFunctions.setSelectedIndex(0);
214
    
215
    // 
216
    //groupByPanel.setSelectedNames(query.getGroupByColumns());
217
  }
218

    
219
  @Override
220
  public FeatureQuery fetch(FeatureQuery query) {
221
    if( query == null ) {
222
      return this.query.getCopy();
223
    }
224
    query.getGroupByColumns().clear();
225
    query.getGroupByColumns().addAll(this.groupByPanel.getSelectedNames());
226
    query.getAggregateFunctions().clear();
227
    query.getAggregateFunctions().putAll(this.query.getAggregateFunctions());
228
    return query;
229
  }
230

    
231
  @Override
232
  public FeatureQuery fetch() {
233
    return this.fetch(null);
234
  }
235

    
236
  @Override
237
  public void put(FeatureQuery query) {
238
    this.query.copyFrom(query);
239
    groupByPanel.setSelectedNames(query.getGroupByColumns());
240
    this.updateControls();
241
  }
242

    
243
  public static void selfRegister() {
244

    
245
  }
246

    
247
}