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

History | View | Annotate | Download (7.99 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.net.URL;
7
import javax.swing.DefaultComboBoxModel;
8
import javax.swing.ImageIcon;
9
import javax.swing.JComponent;
10
import javax.swing.JLabel;
11
import javax.swing.JList;
12
import javax.swing.event.ListSelectionEvent;
13
import org.apache.commons.io.FilenameUtils;
14
import org.apache.commons.lang3.StringUtils;
15
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
16
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
17
import org.gvsig.expressionevaluator.Function;
18
import org.gvsig.expressionevaluator.SymbolTable;
19
import org.gvsig.expressionevaluator.SymbolTableFactory;
20
import org.gvsig.fmap.dal.exception.DataException;
21
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
22
import org.gvsig.fmap.dal.feature.FeatureQuery;
23
import org.gvsig.fmap.dal.feature.FeatureStore;
24
import org.gvsig.fmap.dal.feature.FeatureStoreProviderFactory;
25
import org.gvsig.fmap.dal.feature.FeatureType;
26
import org.gvsig.fmap.dal.swing.impl.featuretype.FeatureAttributeListCellRenderer;
27
import org.gvsig.fmap.dal.swing.impl.featuretype.DefaultFeatureAttributesSelectionPanel;
28
import org.gvsig.tools.dataTypes.DataType;
29
import org.gvsig.tools.swing.api.FilteredListController;
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
import org.gvsig.fmap.dal.swing.featurequery.FeatureQueryGroupByPanel;
34
import org.gvsig.tools.swing.api.FilteredListModel;
35

    
36
/**
37
 *
38
 * @author jjdelcerro
39
 */
40
public class DefaultFeatureQueryGroupByPanel
41
        extends DefaultFeatureQueryGroupByPanelView
42
        implements FeatureQueryGroupByPanel {
43

    
44
  private class AttributesWithAggregateRenderer extends FeatureAttributeListCellRenderer {
45

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

    
63
  private FilteredListController aggregateFunctionsController;
64
  private DefaultFeatureAttributesSelectionPanel groupByPanel;
65

    
66
  private FeatureQuery query;
67
  
68
  public DefaultFeatureQueryGroupByPanel() {
69
    this.initComponents();
70
  }
71

    
72
  @Override
73
  public JComponent asJComponent() {
74
    return this;
75
  }
76

    
77
  @Override
78
  public ImageIcon loadImage(String imageName) {
79
    String name = FilenameUtils.getBaseName(imageName);
80
    IconTheme theme = ToolsSwingLocator.getIconThemeManager().getDefault();
81
    if (theme.exists(name)) {
82
      return theme.get(name);
83
    }
84
    URL url = this.getClass().getResource(name + ".png");
85
    if (url == null) {
86
      return null;
87
    }
88
    return new ImageIcon(url);
89
  }
90

    
91
  @Override
92
  public void setStore(FeatureStore store) {
93
    try {
94
      this.featureType = store.getDefaultFeatureType();
95
      this.store = store;
96
      this.query = store.createFeatureQuery();
97
      this.groupByPanel.setFeatureType(featureType);
98
      this.groupByPanel.setSelectedNames(query.getGroupByColumns());
99
      this.updateControls();
100
    } catch (DataException ex) {
101
      throw new RuntimeException("Can't assign store", ex);
102
    }
103
  }
104

    
105
  private void initComponents() {
106
    ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
107
    
108
    this.groupByPanel = new DefaultFeatureAttributesSelectionPanel();
109

    
110
    this.pnlGroupByAttributes.setLayout(new BorderLayout());
111
    this.pnlGroupByAttributes.add(this.groupByPanel, BorderLayout.CENTER);
112

    
113
    this.lstAttributes.setCellRenderer(new AttributesWithAggregateRenderer());
114
    this.lstAttributes.addListSelectionListener((ListSelectionEvent e) -> {
115
      if (e.getValueIsAdjusting()) {
116
        return;
117
      }
118
      doSelectAttribute();
119
    });
120

    
121
    this.aggregateFunctionsController = toolsSwingManager.createFilteredListController(
122
            lstAttributes,
123
            txtAttributesFilter,
124
            btnAttributesFilter
125
    );
126
    Dimension sz = this.getPreferredSize();
127
    if (sz.width < DEFAULT_WIDTH) {
128
      sz.width = DEFAULT_WIDTH;
129
    }
130
    if (sz.height < DEFAULT_HEIGHT) {
131
      sz.height = DEFAULT_HEIGHT;
132
    }
133
    this.setPreferredSize(sz);
134
  }
135

    
136
  private void doSelectAttribute() {
137
    String previuos = this.txtCurrentAttributeName.getText();
138
    if( !StringUtils.isBlank(previuos) ) {
139
      String aggregate = (String) this.cboAggretateFunctions.getSelectedItem();
140
      if( StringUtils.isBlank(aggregate) || aggregate.equalsIgnoreCase("<NULL>") ) {
141
        this.query.getAggregateFunctions().remove(previuos);
142
      } else {
143
        this.query.getAggregateFunctions().put(previuos, aggregate);
144
      }
145
      this.updateControls();
146
    }
147
    
148
    FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstAttributes.getSelectedValue();
149
    if( attr == null ) {
150
      return;
151
    }
152
    this.txtCurrentAttributeName.setText(attr.getName());
153
    String aggregate = this.query.getAggregateFunctions().get(attr.getName());
154
    if( StringUtils.isBlank(aggregate) || aggregate.equalsIgnoreCase("<NULL>") ) {
155
      this.cboAggretateFunctions.setSelectedIndex(0);
156
    } else {
157
      this.cboAggretateFunctions.setSelectedItem(aggregate);
158
    }    
159
  }
160

    
161
  private void updateControls() {
162
    int indexAttributes = this.lstAttributes.getSelectedIndex();
163
    if( this.cboAggretateFunctions.getModel().getSize() < 1 ) {
164
      DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>();
165
      model.addElement("<NULL>");
166
      java.util.function.Function<String, Integer> isAllowed = ((FeatureStoreProviderFactory)(store.getProviderFactory())).allowFunction();
167
      ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();    
168
      for (SymbolTableFactory factory : manager.getSymbolTableFactories()) {
169
        if( StringUtils.equalsIgnoreCase(Function.GROUP_AGGREGATE, factory.getName()) ) {
170
          SymbolTable symbolTable = factory.create();
171
          for (Function function : symbolTable) {
172
            if( isAllowed.apply(function.name())!=DataType.NO ) {
173
              model.addElement(function.name());
174
            }
175
          }
176
          break;
177
        }
178
      }
179
      this.cboAggretateFunctions.setModel(model);
180
      this.cboAggretateFunctions.setSelectedIndex(0);
181
      this.txtCurrentAttributeName.setText("");
182
    }
183
    ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
184
    FilteredListModel model = toolsSwingManager.createFilteredListModel();
185
    for (FeatureAttributeDescriptor attr : featureType) {
186
        model.addElement(attr);
187
    }
188
    model.setFilter(this.txtAttributesFilter.getText());
189
    model.sort(true);
190
    this.lstAttributes.setModel(model);
191
    this.lstAttributes.setSelectedIndex(indexAttributes);
192
    this.txtCurrentAttributeName.setText("");
193
    this.cboAggretateFunctions.setSelectedIndex(0);
194
    
195
    // 
196
    //groupByPanel.setSelectedNames(query.getGroupByColumns());
197
  }
198

    
199
  @Override
200
  public FeatureQuery fetch(FeatureQuery query) {
201
    if( query == null ) {
202
      return this.query.getCopy();
203
    }
204
    query.getGroupByColumns().clear();
205
    query.getGroupByColumns().addAll(this.groupByPanel.getSelectedNames());
206
    query.getAggregateFunctions().clear();
207
    query.getAggregateFunctions().putAll(this.query.getAggregateFunctions());
208
    return query;
209
  }
210

    
211
  @Override
212
  public FeatureQuery fetch() {
213
    return this.fetch(null);
214
  }
215

    
216
  @Override
217
  public void put(FeatureQuery query) {
218
    this.query.copyFrom(query);
219
    groupByPanel.setSelectedNames(query.getGroupByColumns());
220
    this.updateControls();
221
  }
222

    
223
  public static void selfRegister() {
224

    
225
  }
226

    
227
}