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 / DefaultSearchPanel.java @ 44836

History | View | Annotate | Download (39.8 KB)

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

    
3
import java.awt.BorderLayout;
4
import java.awt.Cursor;
5
import java.awt.Dimension;
6
import java.awt.FlowLayout;
7
import java.awt.event.ActionEvent;
8
import java.awt.event.ActionListener;
9
import java.net.URL;
10
import java.text.DateFormat;
11
import java.text.SimpleDateFormat;
12
import java.util.ArrayList;
13
import java.util.Calendar;
14
import java.util.Collection;
15
import java.util.Collections;
16
import java.util.Date;
17
import java.util.HashMap;
18
import java.util.List;
19
import java.util.Map;
20
import javax.swing.AbstractAction;
21
import javax.swing.Action;
22
import static javax.swing.Action.ACTION_COMMAND_KEY;
23
import static javax.swing.Action.NAME;
24
import javax.swing.BorderFactory;
25
import javax.swing.ImageIcon;
26
import javax.swing.JButton;
27
import javax.swing.JComponent;
28
import javax.swing.JOptionPane;
29
import javax.swing.SwingUtilities;
30
import javax.swing.event.ListSelectionEvent;
31
import javax.swing.event.ListSelectionListener;
32
import javax.swing.table.TableModel;
33
import org.apache.commons.io.FilenameUtils;
34
import org.apache.commons.lang.mutable.MutableObject;
35
import org.apache.commons.lang3.StringUtils;
36
import org.gvsig.configurableactions.ConfigurableActionsMamager;
37
import org.gvsig.expressionevaluator.Expression;
38
import org.gvsig.expressionevaluator.ExpressionBuilder;
39
import org.gvsig.expressionevaluator.ExpressionUtils;
40
import static org.gvsig.fmap.dal.DataManager.DAL_USE_LABELS;
41
import static org.gvsig.fmap.dal.DataManager.USE_LABELS_BOTH;
42
import static org.gvsig.fmap.dal.DataManager.USE_LABELS_NO;
43
import static org.gvsig.fmap.dal.DataManager.USE_LABELS_YES;
44
import org.gvsig.fmap.dal.DataStore;
45
import org.gvsig.fmap.dal.complements.Search;
46
import org.gvsig.fmap.dal.exception.DataException;
47
import org.gvsig.fmap.dal.feature.Feature;
48
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
49
import org.gvsig.fmap.dal.feature.FeatureQuery;
50
import org.gvsig.fmap.dal.feature.FeatureStore;
51
import org.gvsig.fmap.dal.feature.FeatureStoreProviderFactory;
52
import org.gvsig.fmap.dal.feature.FeatureType;
53
import org.gvsig.fmap.dal.feature.paging.FacadeOfAFeaturePagingHelper;
54
import org.gvsig.fmap.dal.swing.AbstractDALActionFactory.AbstractDALActionContext;
55
import org.gvsig.fmap.dal.swing.DALActionFactory;
56
import org.gvsig.fmap.dal.swing.DALSwingLocator;
57
import org.gvsig.fmap.dal.swing.featurequery.FeatureQueryCalculatedColumnsPanel;
58
import org.gvsig.fmap.dal.swing.impl.featuretable.SimpleFeaturesTableModel;
59
import org.gvsig.fmap.dal.swing.impl.featurequery.DefaultFeatureQueryGroupByPanel;
60
import org.gvsig.fmap.dal.swing.searchpanel.FeatureStoreSearchPanel;
61
import org.gvsig.fmap.dal.swing.searchpanel.SearchConditionPanel;
62
import org.gvsig.fmap.dal.swing.searchpanel.SearchConditionPanel.SearchConditionPanelFactory;
63
import org.gvsig.tools.ToolsLocator;
64
import org.gvsig.tools.dataTypes.DataType;
65
import org.gvsig.tools.dynobject.Tags;
66
import org.gvsig.tools.i18n.I18nManager;
67
import org.gvsig.tools.swing.api.ActionListenerSupport;
68
import org.gvsig.tools.swing.api.ToolsSwingLocator;
69
import org.gvsig.tools.swing.api.ToolsSwingManager;
70
import org.gvsig.tools.swing.api.windowmanager.Dialog;
71
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
72
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
73
import org.gvsig.tools.swing.icontheme.IconTheme;
74
import org.gvsig.tools.util.ToolsUtilLocator;
75
import org.slf4j.Logger;
76
import org.slf4j.LoggerFactory;
77
import org.gvsig.fmap.dal.swing.featurequery.FeatureQueryGroupByPanel;
78
import org.gvsig.fmap.dal.swing.featurequery.FeatureQueryOrderPanel;
79
import org.gvsig.fmap.dal.swing.impl.featurequery.DefaultFeatureQueryCalculatedColumnsPanel;
80
import org.gvsig.fmap.dal.swing.featuretype.FeatureAttributesSelectionPanel;
81
import org.gvsig.fmap.dal.swing.searchpanel.SearchParameters;
82
import org.gvsig.tools.bookmarksandhistory.Bookmarks;
83
import org.gvsig.tools.bookmarksandhistory.History;
84
import org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue;
85
import static org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue.ID_GETVALUE;
86
import static org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue.ID_SETVALUE;
87
import org.gvsig.tools.swing.api.bookmarkshistory.BookmarksController;
88
import org.gvsig.tools.swing.api.bookmarkshistory.HistoryController;
89
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
90

    
91
/**
92
 *
93
 * @author jjdelcerro
94
 */
95
@SuppressWarnings({"UseSpecificCatch"})
96
public class DefaultSearchPanel
97
        extends DefaultSearchPanelView
98
        implements FeatureStoreSearchPanel {
99

    
100
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultSearchPanel.class);
101

    
102
    static /* friend */ Integer useLabels = null;
103
    private BookmarksController bookmarksController;
104
    private HistoryController historyController;
105
    private FeatureQuery lastQuery;
106

    
107
    public static class UseLabelsYesAction extends AbstractAction {
108

    
109
        @SuppressWarnings("OverridableMethodCallInConstructor")
110
        public UseLabelsYesAction() {
111
            I18nManager i18n = ToolsLocator.getI18nManager();
112

    
113
            this.putValue(NAME, i18n.getTranslation("_Use_labels"));
114
            this.putValue(ACTION_COMMAND_KEY, "UseLabelsYes");
115
        }
116

    
117
        @Override
118
        public Object getValue(String key) {
119
            if (NAME.equals(key)) {
120
                // Cuando se registra la accion aun no se han cargado las traducciones
121
                I18nManager i18n = ToolsLocator.getI18nManager();
122
                return i18n.getTranslation("_Use_labels");
123
            }
124
            return super.getValue(key);
125
        }
126

    
127
        @Override
128
        public void actionPerformed(ActionEvent ae) {
129
            DefaultSearchPanel.useLabels = USE_LABELS_YES;
130
        }
131
    }
132

    
133
    public static class UseLabelsNoAction extends AbstractAction {
134

    
135
        @SuppressWarnings("OverridableMethodCallInConstructor")
136
        public UseLabelsNoAction() {
137
            I18nManager i18n = ToolsLocator.getI18nManager();
138
            this.putValue(NAME, i18n.getTranslation("_Use_names"));
139
            this.putValue(ACTION_COMMAND_KEY, "UseLabelsNo");
140
        }
141

    
142
        @Override
143
        public Object getValue(String key) {
144
            if (NAME.equals(key)) {
145
                // Cuando se registra la accion aun no se han cargado las traducciones
146
                I18nManager i18n = ToolsLocator.getI18nManager();
147
                return i18n.getTranslation("_Use_names");
148
            }
149
            return super.getValue(key);
150
        }
151

    
152
        @Override
153
        public void actionPerformed(ActionEvent ae) {
154
            DefaultSearchPanel.useLabels = USE_LABELS_NO;
155
        }
156
    }
157

    
158
    public static class UseLabelsBothAction extends AbstractAction {
159

    
160
        @SuppressWarnings("OverridableMethodCallInConstructor")
161
        public UseLabelsBothAction() {
162
            I18nManager i18n = ToolsLocator.getI18nManager();
163

    
164
            this.putValue(NAME, i18n.getTranslation("_Use_labels_and_names"));
165
            this.putValue(ACTION_COMMAND_KEY, "UseLabelsBoth");
166
        }
167

    
168
        @Override
169
        public Object getValue(String key) {
170
            if (NAME.equals(key)) {
171
                // Cuando se registra la accion aun no se han cargado las traducciones
172
                I18nManager i18n = ToolsLocator.getI18nManager();
173
                return i18n.getTranslation("_Use_labels_and_names");
174
            }
175
            return super.getValue(key);
176
        }
177

    
178
        @Override
179
        public void actionPerformed(ActionEvent ae) {
180
            DefaultSearchPanel.useLabels = USE_LABELS_BOTH;
181
        }
182
    }
183

    
184
    public static class SelectColumnsAction extends AbstractAction {
185

    
186
        @SuppressWarnings("OverridableMethodCallInConstructor")
187
        public SelectColumnsAction() {
188
            I18nManager i18n = ToolsLocator.getI18nManager();
189

    
190
            this.putValue(NAME, i18n.getTranslation("_Select_columns_to_display"));
191
            this.putValue(ACTION_COMMAND_KEY, "SelectColumns");
192
        }
193

    
194
        @Override
195
        public Object getValue(String key) {
196
            if (NAME.equals(key)) {
197
                // Cuando se registra la accion aun no se han cargado las traducciones
198
                I18nManager i18n = ToolsLocator.getI18nManager();
199
                return i18n.getTranslation("_Select_columns_to_display");
200
            }
201
            return super.getValue(key);
202
        }
203

    
204
        @Override
205
        public void actionPerformed(ActionEvent ae) {
206
            DefaultSearchPanel panel = (DefaultSearchPanel) ae.getSource();
207
            panel.doSelectResultColumnNames();
208
        }
209
    }
210

    
211
    public static class CalculatedColumnsAction extends AbstractAction {
212

    
213
        @SuppressWarnings("OverridableMethodCallInConstructor")
214
        public CalculatedColumnsAction() {
215
            I18nManager i18n = ToolsLocator.getI18nManager();
216

    
217
            this.putValue(NAME, i18n.getTranslation("_Calculated_columns"));
218
            this.putValue(ACTION_COMMAND_KEY, "CalculatedColumns");
219
        }
220

    
221
        @Override
222
        public Object getValue(String key) {
223
            if (NAME.equals(key)) {
224
                // Cuando se registra la accion aun no se han cargado las traducciones
225
                I18nManager i18n = ToolsLocator.getI18nManager();
226
                return i18n.getTranslation("_Calculated_columns");
227
            }
228
            return super.getValue(key);
229
        }
230

    
231
        @Override
232
        public void actionPerformed(ActionEvent ae) {
233
            DefaultSearchPanel panel = (DefaultSearchPanel) ae.getSource();
234
            panel.doCalculatedColumns();
235
        }
236
    }
237

    
238
    public static class GroupByAction extends AbstractAction {
239

    
240
        @SuppressWarnings("OverridableMethodCallInConstructor")
241
        public GroupByAction() {
242
            I18nManager i18n = ToolsLocator.getI18nManager();
243

    
244
            this.putValue(NAME, i18n.getTranslation("_Group_by"));
245
            this.putValue(ACTION_COMMAND_KEY, "GroupBy");
246
        }
247

    
248
        @Override
249
        public Object getValue(String key) {
250
            if (NAME.equals(key)) {
251
                // Cuando se registra la accion aun no se han cargado las traducciones
252
                I18nManager i18n = ToolsLocator.getI18nManager();
253
                return i18n.getTranslation("_Group_by");
254
            }
255
            return super.getValue(key);
256
        }
257

    
258
        @Override
259
        public void actionPerformed(ActionEvent ae) {
260
            DefaultSearchPanel panel = (DefaultSearchPanel) ae.getSource();
261
            panel.doGroupBy();
262
        }
263
    }
264

    
265
    public static class OrderByAction extends AbstractAction {
266

    
267
        @SuppressWarnings("OverridableMethodCallInConstructor")
268
        public OrderByAction() {
269
            I18nManager i18n = ToolsLocator.getI18nManager();
270

    
271
            this.putValue(NAME, i18n.getTranslation("_Order_by"));
272
            this.putValue(ACTION_COMMAND_KEY, "SelectOrderBy");
273
        }
274

    
275
        @Override
276
        public Object getValue(String key) {
277
            if (NAME.equals(key)) {
278
                // Cuando se registra la accion aun no se han cargado las traducciones
279
                I18nManager i18n = ToolsLocator.getI18nManager();
280
                return i18n.getTranslation("_Order_by");
281
            }
282
            return super.getValue(key);
283
        }
284

    
285
        @Override
286
        public void actionPerformed(ActionEvent ae) {
287
            DefaultSearchPanel panel = (DefaultSearchPanel) ae.getSource();
288
            panel.doOrderBy();
289
        }
290
    }
291

    
292
    private class ActionButtons {
293

    
294
        private final DALActionFactory factory;
295
        private final Action action;
296
        private final JButton button;
297

    
298
        public ActionButtons(DALActionFactory factory, Action action, JButton button) {
299
            this.factory = factory;
300
            this.action = action;
301
            this.button = button;
302
        }
303
    }
304

    
305
    public static class SearchActionContext extends AbstractDALActionContext {
306

    
307
        private final DefaultSearchPanel panel;
308

    
309
        public SearchActionContext(DefaultSearchPanel panel) {
310
            super(FeatureStoreSearchPanel.ACTION_CONTEXT_NAME);
311
            this.panel = panel;
312
        }
313

    
314
        @Override
315
        public DataStore getStore() {
316
            return this.panel.getStore();
317
        }
318

    
319
        @Override
320
        public JComponent getActionButton(String actionName) {
321
            return this.panel.getActionButton(actionName);
322
        }
323

    
324
        @Override
325
        public int getSelectedsCount() {
326
            return this.panel.getSelectedFeatureCount();
327
        }
328

    
329
        @Override
330
        public Expression getFilterForSelecteds() {
331
            return this.panel.getFilterForSelectedFeature();
332
        }
333

    
334
        @Override
335
        public FeatureQuery getQuery() {
336
            return this.panel.getQuery();
337
        }
338
    }
339

    
340
    private final FeatureStore store;
341
    private final ActionListenerSupport acctionListeners;
342
    private final Map<String, ActionButtons> actions;
343
    private boolean showActions = true;
344
    private DefaultSearchParameters parameters;
345

    
346
    private List<SearchConditionPanel> conditionPanels;
347

    
348
    private static final int PANEL_SIMPLIFIED = 0;
349
    private static final int PANEL_ADVANCED = 1;
350
    private static final String BOOKMARKSANDHISTORY_NAME = "SearchPanel";
351
    private final Bookmarks<Object> bookmarks;
352
    private final History<Object> history;
353

    
354
    public DefaultSearchPanel(FeatureStore store) {
355
        this.store = store;
356
        this.acctionListeners = ToolsSwingLocator.getToolsSwingManager().createActionListenerSupport();
357
        this.actions = new HashMap<>();
358
        this.parameters = new DefaultSearchParameters();
359
        FeatureQuery featureQuery = this.store.createFeatureQuery();
360
        featureQuery.retrievesAllAttributes();
361
        this.parameters.setQuery(featureQuery);
362

    
363
        Search search = (Search) ToolsLocator.getComplementsManager().get(
364
                Search.COMPLEMENT_MANE, getFeatureType()
365
        );
366
        List<Search.OrderedAttribute> attributos = search.getOrderedAttributes(
367
                Search.BASIC_TYPES_FILTER,
368
                Search.STR_INT_LONG_LABEL_ORDER,
369
                12
370
        );
371
        for (Search.OrderedAttribute attrdesc : attributos) {
372
            this.parameters.getResultColumnNames().add(attrdesc.getDescriptor().getName());
373
        }
374
        this.bookmarks = ToolsLocator.getBookmarksAndHistoryManager().getBookmarksGroup(BOOKMARKSANDHISTORY_NAME);
375
        this.history = ToolsLocator.getBookmarksAndHistoryManager().getHistoryGroup(BOOKMARKSANDHISTORY_NAME);
376
    }
377

    
378
    @Override
379
    public JComponent asJComponent() {
380
        if (this.conditionPanels == null) {
381
            this.initComponents();
382
        }
383
        return this;
384
    }
385

    
386
    private void addActions() {
387
        if (!this.showActions) {
388
            return;
389
        }
390
        this.pnlActions.removeAll();
391
        this.pnlActions.setLayout(new FlowLayout(FlowLayout.TRAILING, 8, 4));
392
        SearchActionContext actionContext = new SearchActionContext(this);
393
        Collection<DALActionFactory> factories = DALSwingLocator.getSwingManager().getStoreActions();
394
        for (DALActionFactory factory : factories) {
395
            Action action = factory.createAction(actionContext);
396
            JButton button = new JButton(action);
397
            this.actions.put(factory.getName(), new ActionButtons(factory, action, button));
398
            button.setBorder(BorderFactory.createEmptyBorder());
399
            button.setBorderPainted(false);
400
            button.setFocusPainted(false);
401
            button.setContentAreaFilled(false);
402
            button.setCursor(new Cursor(Cursor.HAND_CURSOR));
403
            this.pnlActions.add(button);
404
        }
405
        this.pnlActions.revalidate();
406
        this.pnlActions.repaint();
407
    }
408

    
409
    @Override
410
    public void addActionListener(ActionListener listener) {
411
        this.acctionListeners.addActionListener(listener);
412
    }
413

    
414
    @Override
415
    public ActionListener[] getActionListeners() {
416
        return this.acctionListeners.getActionListeners();
417
    }
418

    
419
    @Override
420
    public void removeActionListener(ActionListener listener) {
421
        this.acctionListeners.removeActionListener(listener);
422
    }
423

    
424
    @Override
425
    public void removeAllActionListener() {
426
        this.acctionListeners.removeAllActionListener();
427
    }
428

    
429
    @Override
430
    public void fireActionEvent(ActionEvent event) {
431
        this.acctionListeners.fireActionEvent(event);
432
    }
433

    
434
    @Override
435
    public boolean hasActionListeners() {
436
        return this.acctionListeners.hasActionListeners();
437
    }
438

    
439
    private void initComponents() {
440
        this.conditionPanels = new ArrayList<>();
441

    
442
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
443
        swingManager.translate(this.tabSearchMode);
444
        swingManager.translate(this.btnSearch);
445
        swingManager.translate(this.btnClear);
446
        swingManager.translate(this.lblExpressionDeBusqueda);
447
        swingManager.translate(this.btnAddAccumulatedFilter);
448
        swingManager.translate(this.btnRemoveAccumulatedFilter);
449
        swingManager.translate(this.btnViewAccumulatedFilter);
450

    
451
        ConfigurableActionsMamager cfgActionsManager = ToolsUtilLocator.getConfigurableActionsMamager();
452
        JComponent c = cfgActionsManager.getConfigurableActionsComponent(CONFIGURABLE_PANEL_ID, this);
453
        this.pnlCfgActions.setLayout(new BorderLayout(0, 0));
454
        this.pnlCfgActions.add(c, BorderLayout.CENTER);
455

    
456
        this.conditionPanels.add(
457
                new SearchConditionPanelSimplified(
458
                        store,
459
                        btnAddAccumulatedFilter,
460
                        btnRemoveAccumulatedFilter,
461
                        btnViewAccumulatedFilter,
462
                        lblField1,
463
                        lblExtraFields1,
464
                        lblRelationalOperator1,
465
                        cboValue1,
466
                        lblLogicalOperators1,
467
                        lblField2,
468
                        lblExtraFields2,
469
                        lblRelationalOperator2,
470
                        cboValue2,
471
                        lblLogicalOperators2,
472
                        lblField3,
473
                        lblExtraFields3,
474
                        lblRelationalOperator3,
475
                        cboValue3,
476
                        lblLogicalOperators3,
477
                        lblField4,
478
                        lblExtraFields4,
479
                        lblRelationalOperator4,
480
                        cboValue4,
481
                        null
482
                )
483
        );
484
        this.conditionPanels.add(
485
                new SearchConditionPanelAdvanced(
486
                        this.store,
487
                        txtAdvancedExpression,
488
                        btnAdvancedExpression,
489
                        btnAdvancedExpressionHistory,
490
                        btnAdvancedExpressionBookmarks
491
                )
492
        );
493
        for (SearchConditionPanelFactory factory : DALSwingLocator.getManager().getSearchConditionPanels()) {
494
            String factoryName = "unknown";
495
            try {
496
                factoryName = factory.getName();
497
                if (factory.isApplicable(store)) {
498
                    SearchConditionPanel panel = factory.create(this);
499
                    this.conditionPanels.add(panel);
500
                    this.tabSearchMode.add(factory.getName(), panel.asJComponent());
501
                }
502
            } catch (Throwable th) {
503
                LOGGER.warn("Can't create search panel '" + factoryName + "'.");
504
            }
505
        }
506

    
507
        this.btnSearch.addActionListener((ActionEvent e) -> {
508
            search();
509
        });
510

    
511
        this.tblResults.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
512
            for (ActionButtons actionButton : actions.values()) {
513
                if (actionButton.action instanceof ListSelectionListener) {
514
                    ((ListSelectionListener) actionButton.action).valueChanged(e);
515
                }
516
            }
517
        });
518
        this.btnClear.addActionListener((ActionEvent e) -> {
519
            clear();
520
        });
521
        addActions();
522

    
523
        swingManager.createTableColumnAdjuster(tblResults);
524

    
525
        this.setPreferredSize(new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT));
526

    
527
        this.bookmarksController = ToolsSwingLocator.getToolsSwingManager().createBookmarksController(this.bookmarks, btnBookmarks);
528
        this.historyController = ToolsSwingLocator.getToolsSwingManager().createHistoryController(this.history, btnHistory);
529

    
530
        this.historyController.setFilter(null);
531

    
532
        ActionListener bookmarksAndHistoryListener = new ActionListener() {
533
            @Override
534
            public void actionPerformed(ActionEvent e) {
535
                ActionEventWithCurrentValue<DefaultSearchParameters> b = (ActionEventWithCurrentValue<DefaultSearchParameters>) e;
536
                switch (b.getID()) {
537
                    case ID_GETVALUE:
538
                        DefaultSearchParameters actualParams = (DefaultSearchParameters) fetch(null);
539
                        b.setCurrentValue(actualParams);
540
                        break;
541

    
542
                    case ID_SETVALUE:
543
                        if (b.getCurrentValue() == null) {
544
                            return;
545
                        }
546
                        DefaultSearchParameters searchParams;
547
                        try {
548
                            searchParams = b.getCurrentValue().getCopy();
549
                        } catch (Exception ex) {
550
                            LOGGER.warn("Not been able to clone export parameters", ex);
551
                            return;
552
                        }
553
                        clear();
554
                        put(searchParams);
555
                        break;
556
                }
557

    
558
            }
559
        };
560
        this.historyController.addActionListener(bookmarksAndHistoryListener);
561
        this.bookmarksController.addActionListener(bookmarksAndHistoryListener);
562

    
563
        search();
564
    }
565

    
566
    private FeatureType getFeatureType() {
567
        try {
568
            return store.getDefaultFeatureType();
569
        } catch (Exception ex) {
570
            throw new RuntimeException("Can't retrieve the feature type.", ex);
571
        }
572
    }
573

    
574
    @Override
575
    public void setEnabled(boolean enabled) {
576
        if (this.conditionPanels == null) {
577
            this.initComponents();
578
        }
579
        for (SearchConditionPanel conditionPanel : conditionPanels) {
580
            conditionPanel.setEnabled(enabled);
581
        }
582

    
583
        this.btnClear.setEnabled(enabled);
584
        this.btnSearch.setEnabled(enabled);
585
        for (ActionButtons actionButton : actions.values()) {
586
            actionButton.action.setEnabled(enabled);
587
        }
588
    }
589

    
590
    @Override
591
    public void clear() {
592
        if (this.conditionPanels == null) {
593
            return;
594
        }
595
        for (SearchConditionPanel conditionPanel : conditionPanels) {
596
            conditionPanel.clear();
597
        }
598
    }
599

    
600
    @Override
601
    public FeatureQuery getLastQuery() {
602
        return this.lastQuery;
603
    }
604

    
605
    public boolean isValid(StringBuilder message) {
606
        int searchMode = this.tabSearchMode.getSelectedIndex();
607
        SearchConditionPanel panel = this.conditionPanels.get(searchMode);
608
        boolean valid = panel.isValid(message);
609
        return valid;
610
    }
611

    
612
    @Override
613
    public void search() {
614
        final MutableObject model = new MutableObject(null);
615

    
616
        StringBuilder message = new StringBuilder();
617
        if (!this.isValid(message)) {
618
            ThreadSafeDialogsManager dialogManager = ToolsSwingLocator.getThreadSafeDialogsManager();
619
            dialogManager.messageDialog(
620
                    "_The_specified_search_condition_is_not_valid",
621
                    "_Search",
622
                    JOptionPane.WARNING_MESSAGE
623
            );
624
            return;
625
        }
626
        lblMsg.setText("Searching...");
627
        setEnabled(false);
628
        Thread th = new Thread(() -> {
629
                FeatureQuery myQuery = null;
630
                SearchParameters params;
631
            try {
632
                params = this.fetch(this.parameters.getCopy()); // esto lo actualiza a la ultima // decidir si se devuelve clonado
633
                Date date = Calendar.getInstance().getTime();
634
                DateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
635
                String strDate = dateFormat.format(date);
636
                params.setName("Params: " + strDate);
637
            } catch (Exception ex) {
638
                LOGGER.warn("Not able to create search parameters.", ex);
639
                return;
640
            }
641

    
642
            try {
643
                final List<Feature> features;
644

    
645
                myQuery = this.getQuery().getCopy();
646
                features = store.getFeatures(myQuery);
647
                FacadeOfAFeaturePagingHelper facade = (FacadeOfAFeaturePagingHelper) features;
648
                FeatureType ftype = facade.getFeaturePagingHelper().getFeatureSet().getDefaultFeatureType();
649
                // al modelo le pasamos el ftype de esas features
650
                model.setValue(new SimpleFeaturesTableModel(
651
                        ftype,
652
                        params.getResultColumnNames(),
653
                        features
654
                )
655
                );
656
            } catch (Exception ex) {
657
                LOGGER.warn("Search not able to be executed. Can't get features or create table model", ex);
658
            } finally {
659
                SwingUtilities.invokeLater(() -> {
660
                    I18nManager i18n = ToolsLocator.getI18nManager();
661
                    SimpleFeaturesTableModel m = (SimpleFeaturesTableModel) model.getValue();
662
                    tblResults.setModel(m);
663
                    if( m.hasErrors() ) {
664
                      lblMsg.setText("_Errors_occurred_during_search");
665
                    } else {
666
                      lblMsg.setText(String.format("%d " + i18n.getTranslation("_elements"), m.getRowCount()));
667
                    }
668
                    setEnabled(true);
669
                });
670
                if (this.parameters != null && this.parameters.getQuery() != null) {
671
                    this.history.add(params);
672
                }
673
            }
674
        });
675
        th.start();
676
    }
677

    
678
    public void setResultColumnNames(List<String> names) {
679
        this.parameters.getResultColumnNames().clear();
680
        this.parameters.getResultColumnNames().addAll(names);
681
        if (this.conditionPanels == null) {
682
            return;
683
        }
684
        SimpleFeaturesTableModel model;
685
        model = (SimpleFeaturesTableModel) this.tblResults.getModel();
686
        List<Feature> features = store.getFeatures(this.parameters.getQuery());
687
        FacadeOfAFeaturePagingHelper facade = (FacadeOfAFeaturePagingHelper) features;
688
        FeatureType ftype = facade.getFeaturePagingHelper().getFeatureSet().getDefaultFeatureType();
689
        model = new SimpleFeaturesTableModel(
690
                ftype,
691
                this.parameters.getResultColumnNames(),
692
                features
693
        );
694
        tblResults.setModel(model);
695
    }
696

    
697
    @Override
698
    public boolean setFilter(Expression filter) {
699
        try {
700
            if (this.conditionPanels == null) {
701
                this.initComponents();
702
            }
703
            if (ExpressionUtils.isPhraseEmpty(filter)) {
704
                this.clear();
705
                return true;
706
            }
707
            int panel = 0;
708
            int selected = PANEL_ADVANCED;
709
            for (SearchConditionPanel conditionPanel : conditionPanels) {
710
                if (panel != PANEL_ADVANCED && conditionPanel.set(filter)) {
711
                    selected = panel;
712
                }
713
                panel++;
714
            }
715
            this.tabSearchMode.setSelectedIndex(selected);
716

    
717
//            SimpleFeaturesTableModel model = new SimpleFeaturesTableModel(this.getStore());
718
//            tblResults.setModel(model);
719
//            lblMsg.setText("");
720
            return true;
721
        } catch (Exception ex) {
722
            LOGGER.warn("Can't set current search", ex);
723
            return false;
724
        }
725
    }
726

    
727
    @Override
728
    public List<SearchConditionPanel> getConditionPanels() {
729
        return Collections.unmodifiableList(this.conditionPanels);
730
    }
731

    
732
    @Override
733
    public SearchConditionPanel getConditionPanel(String name) {
734
        for (SearchConditionPanel panel : conditionPanels) {
735
            if (StringUtils.equalsIgnoreCase(name, panel.getFactory().getName())) {
736
                return panel;
737
            }
738
        }
739
        return null;
740
    }
741

    
742
    @Override
743
    public Expression getFilterForSelectedFeature() {
744
        if (this.conditionPanels == null) {
745
            return null;
746
        }
747
        int selectedRow = this.tblResults.getSelectedRow();
748
        if (selectedRow < 0) {
749
            return null;
750
        }
751
        try {
752
            List<Feature> features = ((SimpleFeaturesTableModel) this.tblResults.getModel()).getFeatures();
753
            Feature feature = features.get(selectedRow);
754

    
755
            ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
756
            FeatureType ftype = this.store.getDefaultFeatureType();
757
            for (FeatureAttributeDescriptor attrdesc : ftype.getPrimaryKey()) {
758
                builder.and(
759
                        builder.eq(
760
                                builder.column(attrdesc.getName()),
761
                                builder.constant(feature.get(attrdesc.getName()))
762
                        )
763
                );
764
            }
765
            Expression filter = ExpressionUtils.createExpression(builder.toString());
766
            return filter;
767
        } catch (Exception ex) {
768
            LOGGER.warn("Can't build search for the selected feature.", ex);
769
            return null;
770
        }
771
    }
772

    
773
    @Override
774
    public FeatureStore getStore() {
775
        return store;
776
    }
777

    
778
    private void doOrderBy() {
779
        I18nManager i18n = ToolsLocator.getI18nManager();
780
        WindowManager_v2 windowManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
781
        FeatureQueryOrderPanel orderPanel = DALSwingLocator.getDataSwingManager().createFeatureStoreOrderPanel();
782
        orderPanel.setStore(store);
783
        orderPanel.put(parameters.getQuery());
784
        Dialog dialog = windowManager.createDialog(
785
                orderPanel.asJComponent(),
786
                i18n.getTranslation("_Select_order"),
787
                null,
788
                WindowManager_v2.BUTTONS_OK_CANCEL
789
        );
790
        dialog.addActionListener((ActionEvent e) -> {
791
            if (dialog.getAction() == WindowManager_v2.BUTTON_OK) {
792
                orderPanel.fetch(this.parameters.getQuery());
793
                search();
794
            }
795
        });
796
        dialog.show(WindowManager.MODE.DIALOG);
797

    
798
    }
799

    
800
    @Override
801
    public ImageIcon loadImage(String imageName) {
802
        String name = FilenameUtils.getBaseName(imageName);
803
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getDefault();
804
        if (theme.exists(name)) {
805
            return theme.get(name);
806
        }
807
        URL url = this.getClass().getResource(name + ".png");
808
        if (url == null) {
809
            return null;
810
        }
811
        return new ImageIcon(url);
812
    }
813

    
814
    @Override
815
    public int getSelectedFeatureCount() {
816
        if (this.conditionPanels == null) {
817
            return 0;
818
        }
819
        return this.tblResults.getSelectedRowCount();
820
    }
821

    
822
    @Override
823
    public JComponent getActionButton(String name) {
824
        ActionButtons actionButton = this.actions.get(name);
825
        if (actionButton == null) {
826
            return null;
827
        }
828
        return actionButton.button;
829
    }
830

    
831
    @Override
832
    public void setShowActions(boolean showActions) {
833
        this.showActions = showActions;
834
    }
835

    
836
    @Override
837
    public boolean isShowActions() {
838
        return this.showActions;
839
    }
840

    
841
    public static String getAttributeDescriptorLabel(FeatureAttributeDescriptor attrdesc, String tableName) {
842
        String theLabel;
843
        int theUseLabels;
844
        if (useLabels == null) {
845
            Tags tags = attrdesc.getTags();
846
            if (tags.has(DAL_USE_LABELS)) {
847
                theUseLabels = tags.getInt(DAL_USE_LABELS, USE_LABELS_NO);
848
            } else {
849
                tags = attrdesc.getFeatureType().getTags();
850
                theUseLabels = tags.getInt(DAL_USE_LABELS, USE_LABELS_NO);
851
            }
852
        } else {
853
            theUseLabels = useLabels;
854
        }
855
        switch (theUseLabels) {
856
            case USE_LABELS_YES:
857
                if (StringUtils.isBlank(tableName)) {
858
                    theLabel = attrdesc.getLocalizedLabel();
859
                } else {
860
                    theLabel = String.format("%s [%s]", attrdesc.getLocalizedLabel(), tableName);
861
                }
862
                break;
863
            default:
864
            case USE_LABELS_NO:
865
                if (StringUtils.isBlank(tableName)) {
866
                    theLabel = attrdesc.getName();
867
                } else {
868
                    theLabel = String.format("%s [%s]", attrdesc.getName(), tableName);
869
                }
870
                break;
871
            case USE_LABELS_BOTH:
872
                if (StringUtils.isBlank(tableName)) {
873
                    theLabel = String.format("%s [%s]", attrdesc.getLocalizedLabel(), attrdesc.getName());
874
                } else {
875
                    theLabel = String.format("%s [%s/%s]", attrdesc.getLocalizedLabel(), attrdesc.getName(), tableName);
876
                }
877
                break;
878
        }
879
        return theLabel;
880
    }
881

    
882
    private void doCalculatedColumns() {
883
        WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
884
        I18nManager i18n = ToolsLocator.getI18nManager();
885
        final FeatureQueryCalculatedColumnsPanel panel = new DefaultFeatureQueryCalculatedColumnsPanel();
886
        panel.setStore(this.store);
887
        panel.put(this.parameters.getQuery());
888
        final Dialog dialog = winmanager.createDialog(
889
                panel.asJComponent(),
890
                i18n.getTranslation("_Calculated_columns"),
891
                null,
892
                WindowManager_v2.BUTTONS_OK_CANCEL
893
        );
894
        dialog.addActionListener((ActionEvent e) -> {
895
            if (dialog.getAction() == WindowManager_v2.BUTTONS_OK) {
896
                panel.fetch(this.parameters.getQuery());
897
                search();
898
            }
899
        });
900
        dialog.show(WindowManager.MODE.DIALOG);
901
    }
902

    
903
    private void doGroupBy() {
904
        int allowGroupBy = ((FeatureStoreProviderFactory) (this.store.getProviderFactory())).allowGroupBy();
905
        if (allowGroupBy != DataType.YES) {
906
            // FIXME: mensaje al usaurio.
907
            return;
908
        }
909

    
910
        WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
911
        I18nManager i18n = ToolsLocator.getI18nManager();
912
        final FeatureQueryGroupByPanel panel = new DefaultFeatureQueryGroupByPanel();
913
        panel.setStore(this.store);
914
        panel.put(this.parameters.getQuery());
915
        final Dialog dialog = winmanager.createDialog(
916
                panel.asJComponent(),
917
                i18n.getTranslation("_Select_group_columns_and_aggregate_functions"),
918
                null,
919
                WindowManager_v2.BUTTONS_OK_CANCEL
920
        );
921
        dialog.addActionListener((ActionEvent e) -> {
922
            if (dialog.getAction() == WindowManager_v2.BUTTONS_OK) {
923
                panel.fetch(this.parameters.getQuery());
924
                search();
925
            }
926
        });
927
        dialog.show(WindowManager.MODE.DIALOG);
928
    }
929

    
930
    private void doSelectResultColumnNames() {
931
        WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
932
        I18nManager i18n = ToolsLocator.getI18nManager();
933
        final FeatureAttributesSelectionPanel panel = DALSwingLocator.getManager().createFeatureAttributeSelectionPanel();
934
        FeatureType ftype;
935
        try {
936
            ftype = store.findFirst(this.parameters.getQuery()).getType();
937
        } catch (DataException ex) {
938
            ftype = this.getFeatureType();
939
        }
940
        panel.setFeatureType(ftype);
941
        panel.setSelectedNames(this.parameters.getResultColumnNames());
942
        final Dialog dialog = winmanager.createDialog(
943
                panel.asJComponent(),
944
                i18n.getTranslation("_Select_the_columns_to_display"),
945
                null,
946
                WindowManager_v2.BUTTONS_OK_CANCEL
947
        );
948
        dialog.addActionListener((ActionEvent e) -> {
949
            if (dialog.getAction() == WindowManager_v2.BUTTONS_OK) {
950
                this.setResultColumnNames(panel.getSelectedNames());
951
            }
952
        });
953
        dialog.show(WindowManager.MODE.DIALOG);
954
    }
955

    
956
    @Override
957
    public void put(SearchParameters inParams) {
958
        for (SearchConditionPanel conditionPanel : this.conditionPanels) {
959
            try {
960
                conditionPanel.put(inParams);
961
            } catch (Exception ex) {
962
                LOGGER.warn("Can't open panel", ex);
963
            }
964
        }
965
        this.parameters = (DefaultSearchParameters) inParams;
966

    
967
    }
968

    
969
    private FeatureQuery getQuery() {
970
        FeatureQuery query;
971
        try {
972
            int searchMode = this.tabSearchMode.getSelectedIndex();
973
            SearchConditionPanel panel = this.conditionPanels.get(searchMode);
974
            Expression filter = panel.get();
975
            if (searchMode != PANEL_ADVANCED) {
976
                this.conditionPanels.get(PANEL_ADVANCED).set(filter);
977
            }
978
            query = (FeatureQuery) this.parameters.getQuery().clone();
979
            query.retrievesAllAttributes();
980
            if (ExpressionUtils.isPhraseEmpty(filter)) {
981
                return query;
982
            }
983
            query.setFilter(filter);
984
            query.retrievesAllAttributes();
985
            return query;
986
        } catch (Exception ex) {
987
            LOGGER.warn("Can't build query.", ex);
988
            return null;
989
        }
990
    }
991

    
992
    @Override
993
    public SearchParameters fetch(SearchParameters outParams) {
994
        // Actualiza el fquery del parameters con los paneles
995
        for (SearchConditionPanel conditionPanel : conditionPanels) {
996
            try {
997
                conditionPanel.fetch(this.parameters);
998
            } catch (Exception ex) {
999
                LOGGER.warn("Panel not able to fetch values", ex);
1000
            }
1001
        }
1002

    
1003
        // Actualiza el filtro con el panel activo
1004
        int searchMode = this.tabSearchMode.getSelectedIndex();
1005
        SearchConditionPanel panel = this.conditionPanels.get(searchMode);
1006
        Expression filter = panel.get();
1007
        if (searchMode != PANEL_ADVANCED) {
1008
            this.conditionPanels.get(PANEL_ADVANCED).set(filter);
1009
        }
1010
        FeatureQuery query = (FeatureQuery) this.parameters.getQuery();
1011
        this.lastQuery = query.getCopy();
1012
        query.retrievesAllAttributes();
1013
        query.clearFilter();
1014
        if (!ExpressionUtils.isPhraseEmpty(filter)) {
1015
            query.setFilter(filter);
1016
            query.retrievesAllAttributes();
1017
        }
1018

    
1019
        if (outParams == null) {
1020
            return this.parameters.getCopy();
1021
        }
1022
        outParams.copyFrom(this.parameters.getCopy());
1023
        return outParams;
1024
    }
1025

    
1026
    public static void selfRegister() {
1027
        String[][] iconNames = new String[][]{
1028
            new String[]{"dalswing", "featurestore-column"},
1029
            new String[]{"dalswing", "featurestore-foreing-key"},
1030
            new String[]{"dalswing", "featurestore-table"},
1031
            new String[]{"dalswing", "search-action-showform"},
1032
            new String[]{"dalswing", "search-action-select"},
1033
            new String[]{"dalswing", "search-action-select-add"},
1034
            new String[]{"dalswing", "search-action-select-filter"}
1035
        };
1036
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
1037
        for (String[] icon : iconNames) {
1038
            URL url = DefaultSearchPanel.class.getResource(icon[1] + ".png");
1039
            theme.registerDefault("DALSwing", icon[0], icon[1], null, url);
1040
        }
1041

    
1042
        ConfigurableActionsMamager cfgActionsManager = ToolsUtilLocator.getConfigurableActionsMamager();
1043
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new UseLabelsYesAction());
1044
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new UseLabelsNoAction());
1045
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new UseLabelsBothAction());
1046
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new SelectColumnsAction());
1047
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new CalculatedColumnsAction());
1048
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new GroupByAction());
1049
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new OrderByAction());
1050
    }
1051
}