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 / searchpanel / SearchConditionPanelSimplified.java @ 44764

History | View | Annotate | Download (11.7 KB)

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

    
3
import java.awt.event.ActionEvent;
4
import java.util.ArrayList;
5
import java.util.List;
6
import javax.swing.JButton;
7
import javax.swing.JComboBox;
8
import javax.swing.JComponent;
9
import javax.swing.JLabel;
10
import javax.swing.event.ChangeListener;
11
import org.apache.commons.lang3.StringUtils;
12
import org.gvsig.expressionevaluator.Code;
13
import org.gvsig.expressionevaluator.Expression;
14
import org.gvsig.expressionevaluator.ExpressionBuilder;
15
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_AND;
16
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_OR;
17
import org.gvsig.expressionevaluator.ExpressionUtils;
18
import org.gvsig.expressionevaluator.swing.JExpressionBuilder;
19
import org.gvsig.fmap.dal.complements.Search;
20
import org.gvsig.fmap.dal.exception.DataException;
21
import org.gvsig.fmap.dal.feature.FeatureStore;
22
import org.gvsig.fmap.dal.swing.DALSwingLocator;
23
import org.gvsig.fmap.dal.swing.DataSwingManager;
24
import org.gvsig.fmap.dal.swing.searchpanel.SearchConditionPanel;
25
import org.gvsig.tools.ToolsLocator;
26
import org.gvsig.tools.i18n.I18nManager;
27
import org.gvsig.tools.swing.api.ChangeListenerHelper;
28
import org.gvsig.tools.swing.api.ToolsSwingLocator;
29
import org.gvsig.tools.swing.api.windowmanager.Dialog;
30
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
31
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
32
import org.slf4j.Logger;
33
import org.slf4j.LoggerFactory;
34

    
35
/**
36
 *
37
 * @author jjdelcerro
38
 */
39
public class SearchConditionPanelSimplified implements SearchConditionPanel {
40

    
41
  private static final Logger LOGGER = LoggerFactory.getLogger(SearchConditionPanelSimplified.class);
42

    
43
    @Override
44
    public JComponent asJComponent() {
45
        return null;
46
    }
47

    
48
  private static class SearchConditionPanelAdvancedFactory 
49
     implements SearchConditionPanelFactory
50
  {
51

    
52
    @Override
53
    public boolean isApplicable(FeatureStore store) {
54
      return true;
55
    }
56

    
57
    @Override
58
    public SearchConditionPanel create(Object... os) {
59
      return null;
60
    }
61

    
62
    @Override
63
    public String getName() {
64
      return "Simplified";
65
    }
66
    
67
  }
68
  
69
  private static final SearchConditionPanelFactory FACTORY = new SearchConditionPanelAdvancedFactory();
70
  
71
  private final FeatureStore store;
72
  private final List<SearchConditionFieldController> searchFields;
73
  private int maxSearhFields = 4;
74
  private String accumulatedFilter;
75
  private final JButton btnAddAccumulatedFilter;
76
  private final JButton btnRemoveAccumulatedFilter;
77
  private final JButton btnViewAccumulatedFilter;
78
  private final String baseToolTip;
79
  private SearchConditionPanelFactory factory;
80
  private final ChangeListenerHelper changeListenerHelper;
81

    
82
  public SearchConditionPanelSimplified(
83
          FeatureStore store,
84
          JButton btnAddToAccumulatedFilter,
85
          JButton btnRemoveAccumulatedFilter,
86
          JButton btnViewAccumulatedFilter,
87
          JLabel lblField1,
88
          JLabel lblExtraFields1,
89
          JLabel lblRelationalOperator1,
90
          JComboBox cboValue1,
91
          JLabel lblLogicalOperators1,
92
          JLabel lblField2,
93
          JLabel lblExtraFields2,
94
          JLabel lblRelationalOperator2,
95
          JComboBox cboValue2,
96
          JLabel lblLogicalOperators2,
97
          JLabel lblField3,
98
          JLabel lblExtraFields3,
99
          JLabel lblRelationalOperator3,
100
          JComboBox cboValue3,
101
          JLabel lblLogicalOperators3,
102
          JLabel lblField4,
103
          JLabel lblExtraFields4,
104
          JLabel lblRelationalOperator4,
105
          JComboBox cboValue4,
106
          JLabel lblLogicalOperators4
107
  ) {
108
    this.changeListenerHelper = ToolsSwingLocator.getToolsSwingManager().createChangeListenerHelper();
109
    this.store = store;
110
    this.searchFields = new ArrayList<>();
111
    SearchConditionFieldController controller = new SearchConditionFieldController(
112
            store,
113
            lblField1,
114
            lblExtraFields1,
115
            lblRelationalOperator1,
116
            cboValue1,
117
            lblLogicalOperators1
118
    );
119
    this.searchFields.add(controller);
120
    controller = new SearchConditionFieldController(
121
            store,
122
            lblField2,
123
            lblExtraFields2,
124
            lblRelationalOperator2,
125
            cboValue2,
126
            lblLogicalOperators2
127
    );
128
    this.searchFields.add(controller);
129
    controller = new SearchConditionFieldController(
130
            store,
131
            lblField3,
132
            lblExtraFields3,
133
            lblRelationalOperator3,
134
            cboValue3,
135
            lblLogicalOperators3
136
    );
137
    this.searchFields.add(controller);
138
    controller = new SearchConditionFieldController(
139
            store,
140
            lblField4,
141
            lblExtraFields4,
142
            lblRelationalOperator4,
143
            cboValue4,
144
            null
145
    );
146
    this.searchFields.add(controller);
147
    this.accumulatedFilter = null;
148
    this.btnAddAccumulatedFilter = btnAddToAccumulatedFilter;
149
    this.btnRemoveAccumulatedFilter = btnRemoveAccumulatedFilter;
150
    this.btnViewAccumulatedFilter = btnViewAccumulatedFilter;
151
    this.baseToolTip = this.btnAddAccumulatedFilter.getToolTipText();
152
    initComponents();
153
  }
154

    
155
  @Override
156
  public SearchConditionPanelFactory getFactory() {
157
    return FACTORY;
158
  }
159

    
160
  @Override
161
  public boolean isValid(StringBuilder message) {
162
    return true;
163
  }
164
  
165
  private void initComponents() {
166
    try {
167
      Search search = (Search) ToolsLocator.getComplementsManager().get(
168
              Search.COMPLEMENT_MANE, this.store.getDefaultFeatureType()
169
      );
170
      List<Search.OrderedAttribute> orderedAttributes = search.getOrderedAttributes(
171
              Search.BASIC_TYPES_FILTER,
172
              Search.STR_INT_LONG_LABEL_ORDER,
173
              5
174
      );
175
      this.maxSearhFields = Integer.min(orderedAttributes.size(), 4);
176
      int n = 0;
177
      for (SearchConditionFieldController searchField : searchFields) {
178
        if (n < this.maxSearhFields) {
179
          searchField.setAttribute(orderedAttributes.get(n++).getDescriptor().getName());
180
        } else {
181
          searchField.setEnabled(false);
182
        }
183
      }
184
    } catch (DataException ex) {
185
      LOGGER.warn("Can't determine order of attributes", ex);
186
    }
187
    this.btnAddAccumulatedFilter.addActionListener((ActionEvent e) -> {
188
      addToAccumulatedFilter(this.getCurrentFilter());
189
    });
190
    this.btnRemoveAccumulatedFilter.addActionListener((ActionEvent e) -> {
191
      clearAccumulatedFilter();
192
    });
193
    this.btnViewAccumulatedFilter.addActionListener((ActionEvent e) -> {
194
      showAccumulatedFilter();
195
    });
196
    this.btnRemoveAccumulatedFilter.setEnabled(false);
197
    this.btnViewAccumulatedFilter.setEnabled(false);
198
    this.btnAddAccumulatedFilter.setEnabled(true);
199
  }
200

    
201
  public void addToAccumulatedFilter(String filter) {
202
    if( StringUtils.isBlank(filter) ) {
203
      return;
204
    }
205
    String theAccumulatedFilter = this.accumulatedFilter;
206
    this.clear();
207
    if( !StringUtils.isBlank(theAccumulatedFilter) ) {
208
      filter = "( " + theAccumulatedFilter + ") AND \n( " + filter + ")";
209
    }
210
    this.btnAddAccumulatedFilter.setToolTipText("<html><b>"+this.baseToolTip + "</b><br><br>" + filter.replaceAll("\\n", "<br>")+"</html>");
211
    this.accumulatedFilter = filter;
212
    this.btnRemoveAccumulatedFilter.setEnabled(true);
213
    this.btnViewAccumulatedFilter.setEnabled(true);
214
    this.changeListenerHelper.fireEvent();
215
  }
216
  
217
  public void clearAccumulatedFilter() {
218
    this.accumulatedFilter = null;
219
    this.btnRemoveAccumulatedFilter.setEnabled(false);
220
    this.btnViewAccumulatedFilter.setEnabled(false);
221
    this.btnAddAccumulatedFilter.setToolTipText(this.baseToolTip);
222
    this.changeListenerHelper.fireEvent();
223
  }
224
  
225
  public void showAccumulatedFilter() {
226
    WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
227
    DataSwingManager manager = DALSwingLocator.getDataSwingManager();
228
    I18nManager i18n = ToolsLocator.getI18nManager();
229

    
230
    JExpressionBuilder panel = manager.createQueryFilterExpresion(store);
231
    panel.setExpression(ExpressionUtils.createExpression(this.getAccumulatedFilter()));
232
    Dialog dialog = winmanager.createDialog(
233
            panel.asJComponent(),
234
            i18n.getTranslation("_Expression_builder"),
235
            null, 
236
            WindowManager_v2.BUTTONS_OK_CANCEL
237
    );
238
    dialog.addActionListener((ActionEvent e) -> {
239
      if( dialog.getAction()==WindowManager_v2.BUTTON_OK ) {
240
        this.clearAccumulatedFilter();
241
        this.addToAccumulatedFilter(panel.getExpression().getPhrase());
242
      }
243
    });
244
    dialog.show(WindowManager.MODE.DIALOG);
245
  }
246
  
247
  @Override
248
  public void setEnabled(boolean enabled) {
249
    if (this.searchFields == null) {
250
      initComponents();
251
    }
252
    int n = 0;
253
    for (SearchConditionFieldController searchField : searchFields) {
254
      if (n < this.maxSearhFields) {
255
        searchField.setEnabled(enabled);
256
      } else {
257
        searchField.setEnabled(false);
258
      }
259
      n++;
260
    }
261
  }
262

    
263
  @Override
264
  public void clear() {
265
    if (this.searchFields == null) {
266
      return;
267
    }
268
    for (SearchConditionFieldController searchField : searchFields) {
269
      searchField.clear();
270
    }
271
    this.clearAccumulatedFilter();
272
  }
273

    
274
  @Override
275
  public Expression get() {
276
    String currentFilter = this.getCurrentFilter();
277
    if( StringUtils.isBlank(accumulatedFilter) ) {
278
      if( StringUtils.isBlank(currentFilter) ) {
279
        return null;
280
      }
281
      return ExpressionUtils.createExpression(currentFilter);
282
    }
283
    if( StringUtils.isBlank(currentFilter) ) {
284
      return ExpressionUtils.createExpression(accumulatedFilter);
285
    }
286
    return ExpressionUtils.createExpression("( " + accumulatedFilter + " ) AND ( "+ currentFilter +" )");
287
  }
288
  
289
  public String getAccumulatedFilter() {
290
    return this.accumulatedFilter;
291
  }
292
  
293
  public String getCurrentFilter() {
294
    ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
295
    String relational = OPERATOR_OR;
296
    for (SearchConditionFieldController searchField : searchFields) {
297
      ExpressionBuilder.Value cond = searchField.getFilter();
298
      if( cond != null ) {
299
        if (relational.equals(OPERATOR_AND)) {
300
          builder.and(cond);
301
        } else {
302
          builder.or(cond);
303
        }
304
        relational = searchField.getLogicalOperator();
305
      }
306
    }
307
    if (builder.isEmpty()) {
308
      return null;
309
    }
310
    return builder.toString();
311
  }
312

    
313
  @Override
314
  public boolean set(Expression filter) {
315
    try {
316
      Code code = filter.getCode();
317
      if (code.code() == Code.CALLABLE) {
318
        SearchConditionFieldController searchField = this.searchFields.get(0);
319
        Code.Callable caller = (Code.Callable) code;
320
        if (searchField.isAValidRelationOperator(caller.name())) {
321
          Code op1 = caller.parameters().get(0);
322
          Code op2 = caller.parameters().get(1);
323
          if (op1.code() == Code.IDENTIFIER && op2.code() == Code.CONSTANT) {
324
            if (searchField.setAttribute(((Code.Identifier) op1).name()) >= 0) {
325
              searchField.setRelationalOperator(caller.name());
326
              searchField.setValue(((Code.Constant) op2).value());
327
              return true;
328
            }
329
          }
330
        }
331
      }
332
      return false;
333
    } finally {
334
      this.changeListenerHelper.fireEvent();
335
    }
336
  }
337

    
338
  @Override
339
  public void addChangeListener(ChangeListener listener) {
340
    this.changeListenerHelper.addChangeListener(listener);
341
  }
342

    
343
  @Override
344
  public ChangeListener[] getChangeListeners() {
345
    return this.changeListenerHelper.getChangeListeners();
346
  }
347

    
348
  @Override
349
  public void removeChangeListener(ChangeListener listener) {
350
    this.changeListenerHelper.removeChangeListener(listener);
351
  }
352

    
353
  @Override
354
  public void removeAllChangeListener() {
355
    this.changeListenerHelper.removeAllChangeListener();
356
  }
357

    
358
  @Override
359
  public boolean hasChangeListeners() {
360
    return this.changeListenerHelper.hasChangeListeners();
361
  }
362
}