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

History | View | Annotate | Download (7.55 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.DefaultListModel;
9
import javax.swing.ImageIcon;
10
import javax.swing.JComponent;
11
import javax.swing.JLabel;
12
import javax.swing.JList;
13
import javax.swing.event.ListSelectionEvent;
14
import org.apache.commons.io.FilenameUtils;
15
import org.apache.commons.lang3.StringUtils;
16
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
17
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
18
import org.gvsig.expressionevaluator.Function;
19
import org.gvsig.expressionevaluator.SymbolTable;
20
import org.gvsig.expressionevaluator.SymbolTableFactory;
21
import org.gvsig.fmap.dal.exception.DataException;
22
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
23
import org.gvsig.fmap.dal.feature.FeatureQuery;
24
import org.gvsig.fmap.dal.feature.FeatureStore;
25
import org.gvsig.fmap.dal.feature.FeatureStoreProviderFactory;
26
import org.gvsig.fmap.dal.feature.FeatureType;
27
import org.gvsig.fmap.dal.swing.impl.featuretype.FeatureAttributeListCellRenderer;
28
import org.gvsig.fmap.dal.swing.impl.featuretype.DefaultFeatureAttributesSelectionPanel;
29
import org.gvsig.tools.dataTypes.DataType;
30
import org.gvsig.tools.swing.api.FilteredListController;
31
import org.gvsig.tools.swing.api.ToolsSwingLocator;
32
import org.gvsig.tools.swing.api.ToolsSwingManager;
33
import org.gvsig.tools.swing.icontheme.IconTheme;
34
import org.gvsig.fmap.dal.swing.featurequery.FeatureQueryGroupByPanel;
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.updateControls();
98
    } catch (DataException ex) {
99
      throw new RuntimeException("Can't assign store", ex);
100
    }
101
  }
102

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

    
108
    this.pnlGroupByAttributes.setLayout(new BorderLayout());
109
    this.pnlGroupByAttributes.add(this.groupByPanel, BorderLayout.CENTER);
110

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

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

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

    
159
  private void updateControls() {
160
    if( this.cboAggretateFunctions.getModel().getSize() < 1 ) {
161
      DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>();
162
      model.addElement("<NULL>");
163
      java.util.function.Function<String, Integer> isAllowed = ((FeatureStoreProviderFactory)(store.getProviderFactory())).allowFunction();
164
      ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();    
165
      for (SymbolTableFactory factory : manager.getSymbolTableFactories()) {
166
        if( StringUtils.equalsIgnoreCase(Function.GROUP_AGGREGATE, factory.getName()) ) {
167
          SymbolTable symbolTable = factory.create();
168
          for (Function function : symbolTable) {
169
            if( isAllowed.apply(function.name())!=DataType.NO ) {
170
              model.addElement(function.name());
171
            }
172
          }
173
          break;
174
        }
175
      }
176
      this.cboAggretateFunctions.setModel(model);
177
      this.cboAggretateFunctions.setSelectedIndex(0);
178
      this.txtCurrentAttributeName.setText("");
179
    }
180
    this.groupByPanel.setFeatureType(featureType);
181
    this.groupByPanel.setSelectedNames(query.getGroupByColumns());
182
    DefaultListModel<FeatureAttributeDescriptor> model = new DefaultListModel<>();
183
    for (FeatureAttributeDescriptor attr : featureType) {
184
      model.addElement(attr);
185
    }
186
    this.lstAttributes.setModel(model);
187
    this.txtCurrentAttributeName.setText("");
188
    this.cboAggretateFunctions.setSelectedIndex(0);
189
  }
190

    
191
  @Override
192
  public FeatureQuery fetch(FeatureQuery query) {
193
    if( query == null ) {
194
      return this.query.getCopy();
195
    }
196
    query.getGroupByColumns().clear();
197
    query.getGroupByColumns().addAll(this.query.getGroupByColumns());
198
    query.getAggregateFunctions().clear();
199
    query.getAggregateFunctions().putAll(this.query.getAggregateFunctions());
200
    return query;
201
  }
202

    
203
  @Override
204
  public FeatureQuery fetch() {
205
    return this.fetch(null);
206
  }
207

    
208
  @Override
209
  public void put(FeatureQuery query) {
210
    this.query.copyFrom(query);
211
    this.updateControls();
212
  }
213

    
214
  public static void selfRegister() {
215

    
216
  }
217

    
218
}