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

History | View | Annotate | Download (62.6 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.FlowLayout;
6
import java.awt.event.ActionEvent;
7
import java.awt.event.ActionListener;
8
import java.awt.event.ComponentAdapter;
9
import java.awt.event.ComponentEvent;
10
import java.awt.event.KeyAdapter;
11
import java.awt.event.KeyEvent;
12
import java.net.URL;
13
import java.text.DateFormat;
14
import java.text.SimpleDateFormat;
15
import java.util.ArrayList;
16
import java.util.Calendar;
17
import java.util.Collection;
18
import java.util.Collections;
19
import java.util.Date;
20
import java.util.HashMap;
21
import java.util.List;
22
import java.util.Map;
23
import java.util.Objects;
24
import javax.swing.AbstractAction;
25
import javax.swing.Action;
26
import static javax.swing.Action.ACTION_COMMAND_KEY;
27
import static javax.swing.Action.NAME;
28
import javax.swing.BorderFactory;
29
import javax.swing.ImageIcon;
30
import javax.swing.JButton;
31
import javax.swing.JComponent;
32
import javax.swing.JMenuItem;
33
import javax.swing.JOptionPane;
34
import javax.swing.JPopupMenu;
35
import javax.swing.JTable;
36
import javax.swing.ListSelectionModel;
37
import javax.swing.SwingUtilities;
38
import javax.swing.event.ChangeEvent;
39
import javax.swing.event.ListSelectionEvent;
40
import javax.swing.event.ListSelectionListener;
41
import javax.swing.table.DefaultTableModel;
42
import javax.swing.table.TableCellRenderer;
43
import javax.swing.table.TableModel;
44
import org.apache.commons.io.FilenameUtils;
45
import org.apache.commons.lang.mutable.MutableObject;
46
import org.apache.commons.lang3.StringUtils;
47
import org.apache.commons.lang3.mutable.MutableLong;
48
import org.gvsig.configurableactions.ConfigurableActionsMamager;
49
import org.gvsig.expressionevaluator.Expression;
50
import org.gvsig.expressionevaluator.ExpressionBuilder;
51
import org.gvsig.expressionevaluator.ExpressionUtils;
52
import static org.gvsig.fmap.dal.DataManager.DAL_USE_LABELS;
53
import static org.gvsig.fmap.dal.DataManager.USE_LABELS_BOTH;
54
import static org.gvsig.fmap.dal.DataManager.USE_LABELS_NO;
55
import static org.gvsig.fmap.dal.DataManager.USE_LABELS_YES;
56
import org.gvsig.fmap.dal.DataStore;
57
import org.gvsig.fmap.dal.DataStoreProviderFactory;
58
import org.gvsig.fmap.dal.complements.Search;
59
import org.gvsig.fmap.dal.exception.DataException;
60
import org.gvsig.fmap.dal.feature.Feature;
61
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
62
import org.gvsig.fmap.dal.feature.FeatureQuery;
63
import org.gvsig.fmap.dal.feature.FeatureStore;
64
import org.gvsig.fmap.dal.feature.FeatureStoreProviderFactory;
65
import org.gvsig.fmap.dal.feature.FeatureType;
66
import org.gvsig.fmap.dal.feature.paging.FacadeOfAFeaturePagingHelper;
67
import org.gvsig.fmap.dal.swing.AbstractDALActionFactory.AbstractDALActionContext;
68
import org.gvsig.fmap.dal.swing.DALActionFactory;
69
import org.gvsig.fmap.dal.swing.DALSwingLocator;
70
import org.gvsig.fmap.dal.swing.DataSwingManager;
71
import org.gvsig.fmap.dal.swing.featurequery.FeatureQueryCalculatedColumnsPanel;
72
import org.gvsig.fmap.dal.swing.impl.featurequery.DefaultFeatureQueryGroupByPanel;
73
import org.gvsig.fmap.dal.swing.searchpanel.FeatureStoreSearchPanel;
74
import org.gvsig.fmap.dal.swing.searchpanel.SearchConditionPanel;
75
import org.gvsig.fmap.dal.swing.searchpanel.SearchConditionPanel.SearchConditionPanelFactory;
76
import org.gvsig.tools.ToolsLocator;
77
import org.gvsig.tools.dataTypes.DataType;
78
import org.gvsig.tools.dynobject.Tags;
79
import org.gvsig.tools.i18n.I18nManager;
80
import org.gvsig.tools.swing.api.ActionListenerSupport;
81
import org.gvsig.tools.swing.api.ToolsSwingLocator;
82
import org.gvsig.tools.swing.api.ToolsSwingManager;
83
import org.gvsig.tools.swing.api.windowmanager.Dialog;
84
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
85
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
86
import org.gvsig.tools.swing.icontheme.IconTheme;
87
import org.gvsig.tools.util.ToolsUtilLocator;
88
import org.slf4j.Logger;
89
import org.slf4j.LoggerFactory;
90
import org.gvsig.fmap.dal.swing.featurequery.FeatureQueryGroupByPanel;
91
import org.gvsig.fmap.dal.swing.featurequery.FeatureQueryOrderPanel;
92
import org.gvsig.fmap.dal.swing.featuretable.SimpleFeaturesTableModel;
93
import org.gvsig.fmap.dal.swing.impl.featurequery.DefaultFeatureQueryCalculatedColumnsPanel;
94
import org.gvsig.fmap.dal.swing.featuretype.FeatureAttributesSelectionPanel;
95
import org.gvsig.fmap.dal.swing.impl.featuretable.SimpleFeaturesTableModelImpl;
96
import org.gvsig.fmap.dal.swing.searchPostProcess.SearchPostProcess;
97
import org.gvsig.fmap.dal.swing.searchPostProcess.SearchPostProcessFactory;
98
import org.gvsig.fmap.dal.swing.searchpanel.SearchParameters;
99
import org.gvsig.tools.bookmarksandhistory.Bookmark;
100
import org.gvsig.tools.bookmarksandhistory.Bookmarks;
101
import org.gvsig.tools.bookmarksandhistory.History;
102
import org.gvsig.tools.dispose.Disposable;
103
import org.gvsig.tools.dispose.DisposeUtils;
104
import org.gvsig.tools.dynform.DynFormLocator;
105
import org.gvsig.tools.dynform.JDynForm;
106
import org.gvsig.tools.dynobject.DynObject;
107
import org.gvsig.tools.locator.ReferenceNotRegisteredException;
108
import org.gvsig.tools.swing.api.SupportIsEnable;
109
import org.gvsig.tools.swing.api.SupportIsVisible;
110
import org.gvsig.tools.swing.api.ToolsSwingUtils;
111
import org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue;
112
import static org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue.ID_GETVALUE;
113
import static org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue.ID_SETVALUE;
114
import org.gvsig.tools.swing.api.bookmarkshistory.BookmarksController;
115
import org.gvsig.tools.swing.api.bookmarkshistory.BookmarksController.BookmarkEvent;
116
import org.gvsig.tools.swing.api.bookmarkshistory.HistoryController;
117
import org.gvsig.tools.swing.api.task.TaskStatusController;
118
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
119
import org.gvsig.tools.task.SimpleTaskStatus;
120
import org.gvsig.tools.util.PropertiesSupportHelper;
121

    
122
/**
123
 *
124
 * @author jjdelcerro
125
 */
126
@SuppressWarnings({"UseSpecificCatch"})
127
public class DefaultSearchPanel
128
        extends DefaultSearchPanelView2
129
        implements FeatureStoreSearchPanel, SupportIsEnable, SupportIsVisible {
130

    
131
        private static final Logger LOGGER = LoggerFactory.getLogger(DefaultSearchPanel.class);
132

    
133
        private BookmarksController bookmarksController;
134
        private HistoryController historyController;
135
        private FeatureQuery lastQuery;
136
        private Feature lastSelectedFeature;
137
        private final PropertiesSupportHelper propertiesHelper;
138
        private TaskStatusController taskStatusController;
139
        private boolean automaticallySearch;
140

    
141
        public static class UseLabelsYesAction extends AbstractAction {
142

    
143
                @SuppressWarnings("OverridableMethodCallInConstructor")
144
                public UseLabelsYesAction() {
145
                        I18nManager i18n = ToolsLocator.getI18nManager();
146

    
147
                        this.putValue(NAME, i18n.getTranslation("_Use_labels"));
148
                        this.putValue(ACTION_COMMAND_KEY, "UseLabelsYes");
149
                }
150

    
151
                @Override
152
                public Object getValue(String key) {
153
                        if (NAME.equals(key)) {
154
                                // Cuando se registra la accion aun no se han cargado las traducciones
155
                                I18nManager i18n = ToolsLocator.getI18nManager();
156
                                return i18n.getTranslation("_Use_labels");
157
                        }
158
                        return super.getValue(key);
159
                }
160

    
161
                @Override
162
                public void actionPerformed(ActionEvent ae) {
163
                    DALSwingLocator.getDataSwingManager().setUseLabels(USE_LABELS_YES);
164
                }
165
        }
166

    
167
        public static class UseLabelsNoAction extends AbstractAction {
168

    
169
                @SuppressWarnings("OverridableMethodCallInConstructor")
170
                public UseLabelsNoAction() {
171
                        I18nManager i18n = ToolsLocator.getI18nManager();
172
                        this.putValue(NAME, i18n.getTranslation("_Use_names"));
173
                        this.putValue(ACTION_COMMAND_KEY, "UseLabelsNo");
174
                }
175

    
176
                @Override
177
                public Object getValue(String key) {
178
                        if (NAME.equals(key)) {
179
                                // Cuando se registra la accion aun no se han cargado las traducciones
180
                                I18nManager i18n = ToolsLocator.getI18nManager();
181
                                return i18n.getTranslation("_Use_names");
182
                        }
183
                        return super.getValue(key);
184
                }
185

    
186
                @Override
187
                public void actionPerformed(ActionEvent ae) {
188
                    DALSwingLocator.getDataSwingManager().setUseLabels(USE_LABELS_NO);
189
                }
190
        }
191

    
192
        public static class UseLabelsBothAction extends AbstractAction {
193

    
194
                @SuppressWarnings("OverridableMethodCallInConstructor")
195
                public UseLabelsBothAction() {
196
                        I18nManager i18n = ToolsLocator.getI18nManager();
197

    
198
                        this.putValue(NAME, i18n.getTranslation("_Use_labels_and_names"));
199
                        this.putValue(ACTION_COMMAND_KEY, "UseLabelsBoth");
200
                }
201

    
202
                @Override
203
                public Object getValue(String key) {
204
                        if (NAME.equals(key)) {
205
                                // Cuando se registra la accion aun no se han cargado las traducciones
206
                                I18nManager i18n = ToolsLocator.getI18nManager();
207
                                return i18n.getTranslation("_Use_labels_and_names");
208
                        }
209
                        return super.getValue(key);
210
                }
211

    
212
                @Override
213
                public void actionPerformed(ActionEvent ae) {
214
                    DALSwingLocator.getDataSwingManager().setUseLabels(USE_LABELS_BOTH);
215
                }
216
        }
217

    
218
        public static class SelectColumnsAction extends AbstractAction {
219

    
220
                @SuppressWarnings("OverridableMethodCallInConstructor")
221
                public SelectColumnsAction() {
222
                        I18nManager i18n = ToolsLocator.getI18nManager();
223

    
224
                        this.putValue(NAME, i18n.getTranslation("_Select_columns_to_display"));
225
                        this.putValue(ACTION_COMMAND_KEY, "SelectColumns");
226
                }
227

    
228
                @Override
229
                public Object getValue(String key) {
230
                        if (NAME.equals(key)) {
231
                                // Cuando se registra la accion aun no se han cargado las traducciones
232
                                I18nManager i18n = ToolsLocator.getI18nManager();
233
                                return i18n.getTranslation("_Select_columns_to_display");
234
                        }
235
                        return super.getValue(key);
236
                }
237

    
238
                @Override
239
                public void actionPerformed(ActionEvent ae) {
240
                        DefaultSearchPanel panel = (DefaultSearchPanel) ae.getSource();
241
                        panel.doSelectResultColumnNames();
242
                }
243
        }
244

    
245
        public static class CalculatedColumnsAction extends AbstractAction {
246

    
247
                @SuppressWarnings("OverridableMethodCallInConstructor")
248
                public CalculatedColumnsAction() {
249
                        I18nManager i18n = ToolsLocator.getI18nManager();
250

    
251
                        this.putValue(NAME, i18n.getTranslation("_Calculated_columns"));
252
                        this.putValue(ACTION_COMMAND_KEY, "CalculatedColumns");
253
                }
254

    
255
                @Override
256
                public Object getValue(String key) {
257
                        if (NAME.equals(key)) {
258
                                // Cuando se registra la accion aun no se han cargado las traducciones
259
                                I18nManager i18n = ToolsLocator.getI18nManager();
260
                                return i18n.getTranslation("_Calculated_columns");
261
                        }
262
                        return super.getValue(key);
263
                }
264

    
265
                @Override
266
                public void actionPerformed(ActionEvent ae) {
267
                        DefaultSearchPanel panel = (DefaultSearchPanel) ae.getSource();
268
                        panel.doCalculatedColumns();
269
                }
270
        }
271

    
272
        public static class GroupByAction extends AbstractAction {
273

    
274
                @SuppressWarnings("OverridableMethodCallInConstructor")
275
                public GroupByAction() {
276
                        I18nManager i18n = ToolsLocator.getI18nManager();
277

    
278
                        this.putValue(NAME, i18n.getTranslation("_Group_by"));
279
                        this.putValue(ACTION_COMMAND_KEY, "GroupBy");
280
                }
281

    
282
                @Override
283
                public Object getValue(String key) {
284
                        if (NAME.equals(key)) {
285
                                // Cuando se registra la accion aun no se han cargado las traducciones
286
                                I18nManager i18n = ToolsLocator.getI18nManager();
287
                                return i18n.getTranslation("_Group_by");
288
                        }
289
                        return super.getValue(key);
290
                }
291

    
292
                @Override
293
                public void actionPerformed(ActionEvent ae) {
294
                        DefaultSearchPanel panel = (DefaultSearchPanel) ae.getSource();
295
                        panel.doGroupBy();
296
                }
297
        }
298

    
299
        public static class OrderByAction extends AbstractAction {
300

    
301
                @SuppressWarnings("OverridableMethodCallInConstructor")
302
                public OrderByAction() {
303
                        I18nManager i18n = ToolsLocator.getI18nManager();
304

    
305
                        this.putValue(NAME, i18n.getTranslation("_Order_by"));
306
                        this.putValue(ACTION_COMMAND_KEY, "SelectOrderBy");
307
                }
308

    
309
                @Override
310
                public Object getValue(String key) {
311
                        if (NAME.equals(key)) {
312
                                // Cuando se registra la accion aun no se han cargado las traducciones
313
                                I18nManager i18n = ToolsLocator.getI18nManager();
314
                                return i18n.getTranslation("_Order_by");
315
                        }
316
                        return super.getValue(key);
317
                }
318

    
319
                @Override
320
                public void actionPerformed(ActionEvent ae) {
321
                        DefaultSearchPanel panel = (DefaultSearchPanel) ae.getSource();
322
                        panel.doOrderBy();
323
                }
324
        }
325

    
326
        private class TablePopupMenu extends JPopupMenu {
327

    
328
                public final JTable table;
329

    
330
                @SuppressWarnings("OverridableMethodCallInConstructor")
331
                public TablePopupMenu(JTable inputTable) {
332
                        this.table = inputTable;
333
                        I18nManager i18n = ToolsLocator.getI18nManager();
334
                        JMenuItem copyRowsActionMenu = new JMenuItem(i18n.getTranslation("_Copy_rows"));
335
                        copyRowsActionMenu.addActionListener((ActionEvent e) -> {
336
                                doCopyRows(table);
337
                        });
338
                        this.add(copyRowsActionMenu);
339
                }
340
        }
341

    
342
        private class ActionButtons {
343

    
344
                private final DALActionFactory factory;
345
                private final Action action;
346
                private final JButton button;
347

    
348
                public ActionButtons(DALActionFactory factory, Action action, JButton button) {
349
                        this.factory = factory;
350
                        this.action = action;
351
                        this.button = button;
352
                }
353
        }
354

    
355
        public static class SearchActionContext extends AbstractDALActionContext {
356

    
357
                private final DefaultSearchPanel panel;
358

    
359
                public SearchActionContext(DefaultSearchPanel panel) {
360
                        super(FeatureStoreSearchPanel.ACTION_CONTEXT_NAME);
361
                        this.panel = panel;
362
                }
363

    
364
                @Override
365
                public DataStore getStore() {
366
                        if (this.panel.currentPostProcess == null || this.panel.tabResults.getSelectedIndex() == 0) {
367
                                return this.panel.getStore();
368
                        } else {
369
                                return this.panel.postProcessStore;
370
//                DataSwingManager manager = DALSwingLocator.getDataSwingManager();
371
//                SearchPostProcessFactory factory= manager.getSearchPostProcess(this.panel.currentPostProcess);
372
//                SearchParameters searchParams = this.panel.parameters.getCopy();
373
//                if (factory.hasProcessParameters()){
374
//                    SearchPostProcess.SearchPostProcessResult searchPostProcessResult = this.panel.doExecuteSearchPostProcess(this.panel.store, this.panel.parameters.getQuery(), factory, this.panel.postProcessParams, searchParams);
375
//                    return searchPostProcessResult.getStore();
376
//                }
377
//                SearchPostProcess.SearchPostProcessResult searchPostProcessResult = this.panel.doExecuteSearchPostProcess(this.panel.store, this.panel.parameters.getQuery(), factory, null, searchParams);
378
//                return searchPostProcessResult.getStore();
379
                        }
380
                }
381

    
382
                @Override
383
                public JComponent getActionButton(String actionName) {
384
                        return this.panel.getActionButton(actionName);
385
                }
386

    
387
                @Override
388
                public int getSelectedsCount() {
389
                        return this.panel.getSelectedFeatureCount();
390
                }
391

    
392
                @Override
393
                public Expression getFilterForSelecteds() {
394
                        return this.panel.getFilterForSelectedFeature();
395
                }
396

    
397
                @Override
398
                public FeatureQuery getQuery() {
399
                        if (this.panel.currentPostProcess == null || this.panel.tabResults.getSelectedIndex() == 0) {
400
                                return this.panel.parameters.getQuery();
401
                        } else {
402
                                return this.panel.postProcessQuery;
403
//                DataSwingManager manager = DALSwingLocator.getDataSwingManager();
404
//                SearchPostProcessFactory factory= manager.getSearchPostProcess(this.panel.currentPostProcess);
405
//                SearchParameters searchParams =this.panel.parameters.getCopy();
406
//                if (factory.hasProcessParameters()){
407
//                    SearchPostProcess.SearchPostProcessResult searchPostProcessResult = this.panel.doExecuteSearchPostProcess(this.panel.store, this.panel.parameters.getQuery(), factory, this.panel.postProcessParams, searchParams);
408
//                    return searchPostProcessResult.getQuery();
409
//                }
410
//                SearchPostProcess.SearchPostProcessResult searchPostProcessResult = this.panel.doExecuteSearchPostProcess(this.panel.store, this.panel.parameters.getQuery(), factory, null, searchParams);
411
//                return searchPostProcessResult.getQuery();
412
                        }
413
                }
414
        }
415

    
416
//    private class SearchPostProcessListener implements ActionListener {
417
//
418
//        private final FeatureStore input;
419
//        private final SearchPostProcessFactory factory;
420
//        private final FeatureQuery query;
421
//
422
//        public SearchPostProcessListener(
423
//                FeatureStore input,
424
//                FeatureQuery query,
425
//                SearchPostProcessFactory factory
426
//        ) {
427
//            this.input = input;
428
//            this.query = query;
429
//            this.factory = factory;
430
//        }
431
//
432
//        @Override
433
//        public void actionPerformed(ActionEvent e) {
434
//            // habilita la pesta�a del tab con los resultados del post procesado
435
//            if (this.factory.hasProcessParameters()) {
436
//                DynObject parameters = this.factory.createProcessParameters(this.input);
437
//                JDynForm form = DynFormLocator.getDynFormManager().createJDynForm(parameters);
438
//                form.asJComponent().setPreferredSize(new Dimension(350, 250));
439
//
440
//                I18nManager i18n = ToolsLocator.getI18nManager();
441
//                WindowManager_v2 windowManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
442
//
443
//                Dialog dialog = windowManager.createDialog(
444
//                        form.asJComponent(),
445
//                        i18n.getTranslation("_create_parameters"),
446
//                        i18n.getTranslation("_parameters_list"),
447
//                        WindowManager_v2.BUTTONS_OK_CANCEL);
448
//
449
//                dialog.addActionListener((ActionEvent e2) -> {
450
//                    if (dialog.getAction() == WindowManager_v2.BUTTON_OK) {
451
//                        form.getValues(parameters); // actualiza el valor de lo los parametros con los valores introducidos por el usuario
452
//                        doExecuteSearchPostProcess(this.input, this.query, this.factory, parameters);
453
//                        postProcessParams = parameters;
454
//                    }
455
//                });
456
//
457
//                dialog.show(WindowManager.MODE.DIALOG);
458
//
459
//            } else {
460
//                doExecuteSearchPostProcess(this.input, this.query, this.factory, null);
461
//            }
462
//        }
463
//    }
464
        private FeatureStore store;
465
        private final ActionListenerSupport acctionListeners;
466
        private final Map<String, ActionButtons> actions;
467
        private boolean showActions = true;
468
        private DefaultSearchParameters parameters;
469

    
470
        private List<SearchConditionPanel> conditionPanels;
471

    
472
        public static final int PANEL_SIMPLIFIED = 0;
473
        public static final int PANEL_ADVANCED = 1;
474
        private static final String BOOKMARKSANDHISTORY_NAME = "SearchPanel";
475
        private final Bookmarks<Object> bookmarks;
476
        private final History<Object> history;
477
        private boolean filterOnlyMode;
478

    
479
        private String currentPostProcess;
480

    
481
        private DynObject postProcessParams;
482
        private FeatureStore postProcessStore;
483
        private FeatureQuery postProcessQuery;
484
        private SimpleFeaturesTableModel resultModel;
485
        private SimpleFeaturesTableModel resultPostProcessModel;
486

    
487
        private boolean processing;
488
        private JComponent configurableActions;
489

    
490
        @SuppressWarnings({"OverridableMethodCallInConstructor", "LeakingThisInConstructor"})
491
        public DefaultSearchPanel(FeatureStore store) {
492
                this.store = store;
493
                this.filterOnlyMode = false;
494
                DisposeUtils.bind(store);
495
                this.acctionListeners = ToolsSwingLocator.getToolsSwingManager().createActionListenerSupport();
496
                this.actions = new HashMap<>();
497
                this.parameters = new DefaultSearchParameters();
498
                FeatureQuery featureQuery = this.store.createFeatureQuery();
499
                featureQuery.retrievesAllAttributes();
500
                this.parameters.setQuery(featureQuery);
501
                this.currentPostProcess = null;
502
                this.postProcessParams = null;
503
                this.postProcessStore = null;
504
                this.postProcessQuery = null;
505
                this.processing = false;
506
                this.configurableActions = null;
507
                this.resultModel = null;
508
                this.resultPostProcessModel = null;
509
                this.propertiesHelper = new PropertiesSupportHelper();
510
                this.propertiesHelper.setProperty("SearchPanel", this);
511
                this.automaticallySearch = true;
512

    
513
                Search search = (Search) ToolsLocator.getComplementsManager().get(
514
                        Search.COMPLEMENT_MANE, getFeatureType()
515
                );
516
                List<Search.OrderedAttribute> attributos = search.getOrderedAttributes(
517
                        Search.BASIC_TYPES_FILTER,
518
                        Search.STR_INT_LONG_LABEL_ORDER,
519
                        12
520
                );
521
                for (Search.OrderedAttribute attrdesc : attributos) {
522
                        this.parameters.getResultColumnNames().add(attrdesc.getDescriptor().getName());
523
                }
524
                this.bookmarks = ToolsLocator.getBookmarksAndHistoryManager().getBookmarksGroup(BOOKMARKSANDHISTORY_NAME);
525
                this.history = ToolsLocator.getBookmarksAndHistoryManager().getHistoryGroup(BOOKMARKSANDHISTORY_NAME);
526
        }
527

    
528
        @Override
529
        public void dispose() {
530
                DisposeUtils.disposeQuietly(store);
531
                TableModel m = this.tblResults.getModel();
532
                if (m instanceof Disposable) {
533
                        DisposeUtils.disposeQuietly((Disposable) m);
534
                }
535
                this.store = null;
536
                this.tblResults.setModel(new DefaultTableModel());
537
        }
538

    
539
        @Override
540
        public JComponent asJComponent() {
541
                if (this.conditionPanels == null) {
542
                        this.initComponents();
543
                }
544
                return this;
545
        }
546

    
547
        private void addActions() {
548
                if (!this.showActions) {
549
                        return;
550
                }
551
                this.pnlActions.removeAll();
552
                this.pnlActions.setLayout(new FlowLayout(FlowLayout.TRAILING, 8, 4));
553
                SearchActionContext actionContext = new SearchActionContext(this);
554
                Collection<DALActionFactory> factories = DALSwingLocator.getSwingManager().getStoreActions();
555
                for (DALActionFactory factory : factories) {
556
                        if (!factory.isApplicable(actionContext)) {
557
                                continue;
558
                        }
559
                        Action action = factory.createAction(actionContext);
560
                        JButton button = new JButton(action);
561
                        this.actions.put(factory.getName(), new ActionButtons(factory, action, button));
562
                        button.setBorder(BorderFactory.createEmptyBorder());
563
                        button.setBorderPainted(false);
564
                        button.setFocusPainted(false);
565
                        button.setContentAreaFilled(false);
566
                        button.setCursor(new Cursor(Cursor.HAND_CURSOR));
567
                        this.pnlActions.add(button);
568
                }
569
                this.pnlActions.revalidate();
570
                this.pnlActions.repaint();
571
        }
572

    
573
        @Override
574
        public void addActionListener(ActionListener listener) {
575
                this.acctionListeners.addActionListener(listener);
576
        }
577

    
578
        @Override
579
        public ActionListener[] getActionListeners() {
580
                return this.acctionListeners.getActionListeners();
581
        }
582

    
583
        @Override
584
        public void removeActionListener(ActionListener listener) {
585
                this.acctionListeners.removeActionListener(listener);
586
        }
587

    
588
        @Override
589
        public void removeAllActionListener() {
590
                this.acctionListeners.removeAllActionListener();
591
        }
592

    
593
        @Override
594
        public void fireActionEvent(ActionEvent event) {
595
                this.acctionListeners.fireActionEvent(event);
596
        }
597

    
598
        @Override
599
        public boolean hasActionListeners() {
600
                return this.acctionListeners.hasActionListeners();
601
        }
602

    
603
        private void initComponents() {
604
                this.conditionPanels = new ArrayList<>();
605

    
606
                ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
607
                swingManager.translate(this.tabSearchMode);
608
                swingManager.translate(this.tabResults);
609
                swingManager.translate(this.btnSearch);
610
                swingManager.translate(this.btnClear);
611
                swingManager.translate(this.btnSearchPostProcess);
612
                swingManager.translate(this.lblExpressionDeBusqueda);
613
                swingManager.translate(this.btnAddAccumulatedFilter);
614
                swingManager.translate(this.btnRemoveAccumulatedFilter);
615
                swingManager.translate(this.btnViewAccumulatedFilter);
616

    
617
                ConfigurableActionsMamager cfgActionsManager = ToolsUtilLocator.getConfigurableActionsMamager();
618
                this.configurableActions = cfgActionsManager.getConfigurableActionsComponent(CONFIGURABLE_PANEL_ID, this);
619
                this.pnlCfgActions.setLayout(new BorderLayout(0, 0));
620
                this.pnlCfgActions.add(configurableActions, BorderLayout.CENTER);
621

    
622
                this.taskStatusController = ToolsSwingLocator.getTaskStatusSwingManager().createTaskStatusController(
623
                        this.lblStatusTitle,
624
                        this.lblMsg,
625
                        this.pgbStatus);
626
                this.pgbStatus.setVisible(false);
627

    
628
                this.conditionPanels.add(
629
                        new SearchConditionPanelSimplified(
630
                                parameters,
631
                                store,
632
                                btnAddAccumulatedFilter,
633
                                btnRemoveAccumulatedFilter,
634
                                btnViewAccumulatedFilter,
635
                                lblField1,
636
                                lblExtraFields1,
637
                                lblRelationalOperator1,
638
                                cboValue1,
639
                                lblNull1,
640
                                lblLogicalOperators1,
641
                                lblField2,
642
                                lblExtraFields2,
643
                                lblRelationalOperator2,
644
                                cboValue2,
645
                                lblNull2,
646
                                lblLogicalOperators2,
647
                                lblField3,
648
                                lblExtraFields3,
649
                                lblRelationalOperator3,
650
                                cboValue3,
651
                                lblNull3,
652
                                lblLogicalOperators3,
653
                                lblField4,
654
                                lblExtraFields4,
655
                                lblRelationalOperator4,
656
                                cboValue4,
657
                                lblNull4,
658
                                null
659
                        )
660
                );
661

    
662
                SearchConditionPanelAdvanced advancedPanel = new SearchConditionPanelAdvanced(
663
                        this.store,
664
                        txtAdvancedExpression,
665
                        btnAdvancedExpression,
666
                        btnAdvancedExpressionHistory,
667
                        btnAdvancedExpressionBookmarks
668
                );
669
                this.conditionPanels.add(advancedPanel);
670

    
671
                for (SearchConditionPanelFactory factory : DALSwingLocator.getManager().getSearchConditionPanels()) {
672
                        String factoryName = "unknown";
673
                        try {
674
                                factoryName = factory.getName();
675
                                if (factory.isApplicable(store)) {
676
                                        SearchConditionPanel panel = factory.create(this);
677
                                        this.conditionPanels.add(panel);
678
                                        this.tabSearchMode.add(factory.getName(), panel.asJComponent());
679
                                }
680
                        } catch (Throwable th) {
681
                                LOGGER.warn("Can't create search panel '" + factoryName + "'.");
682
                        }
683
                }
684

    
685
                this.btnSearch.addActionListener((ActionEvent e) -> {
686
                        this.tabResults.setEnabledAt(1, false);
687
                        search();
688
                });
689

    
690
                this.tblResults.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
691
                        try {
692
                                lastSelectedFeature = resultModel.getFeatureAt(tblResults.getSelectedRow());
693
                        } catch (Throwable th) {
694
                                LOGGER.debug("Can't retrieve last selected feature.", th);
695
                        }
696
                        for (ActionButtons actionButton : actions.values()) {
697
                                if (actionButton.action instanceof ListSelectionListener) {
698
                                        ((ListSelectionListener) actionButton.action).valueChanged(e);
699
                                }
700
                        }
701
                });
702
                this.btnClear.addActionListener((ActionEvent e) -> {
703
                        clear();
704
                });
705
                addActions();
706

    
707
                //swingManager.createTableColumnAdjuster(tblResults);
708
                //swingManager.createTableColumnAdjuster(tblSearchPostProcessResults);
709
//        this.setPreferredSize(new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT));
710
                ToolsSwingUtils.ensureRowsCols(this, 20, 100, 30, 120);
711

    
712
                this.bookmarksController = ToolsSwingLocator.getToolsSwingManager().createBookmarksController(this.bookmarks, btnBookmarks);
713
                this.historyController = ToolsSwingLocator.getToolsSwingManager().createHistoryController(this.history, btnHistory);
714

    
715
                this.historyController.setFilter(null);
716

    
717
                this.historyController.addActionListener((ActionEvent e) -> {
718
                        ActionEventWithCurrentValue<DefaultSearchParameters> b = (ActionEventWithCurrentValue<DefaultSearchParameters>) e;
719
                        switch (b.getID()) {
720
                                case ID_GETVALUE:
721
                                        DefaultSearchParameters actualParams = (DefaultSearchParameters) fetch(null);
722
                                        b.setCurrentValue(actualParams);
723
                                        break;
724

    
725
                                case ID_SETVALUE:
726
                                        if (b.getCurrentValue() == null) {
727
                                                return;
728
                                        }
729
                                        putParametersAndSearch(b.getCurrentValue());
730
                                        break;
731
                        }
732
                });
733
                this.bookmarksController.addActionListener((ActionEvent e) -> {
734
                        BookmarkEvent<DefaultSearchParameters> b = (BookmarkEvent<DefaultSearchParameters>) e;
735
                        switch (b.getID()) {
736
                                case ID_GETVALUE:
737
                                        DefaultSearchParameters actualParams = (DefaultSearchParameters) fetch(null);
738
                                        b.setCurrentValue(actualParams);
739
                                        break;
740

    
741
                                case ID_SETVALUE:
742
                                        if (b.getCurrentValue() == null) {
743
                                                return;
744
                                        }
745
                                        b.getBookmark().used();
746
                                        putParametersAndSearch(b.getCurrentValue());
747
                                        break;
748
                        }
749
                });
750
                this.addComponentListener(new ComponentAdapter() {
751
                        @Override
752
                        public void componentHidden(ComponentEvent e) {
753
                                dispose();
754
                        }
755
                });
756

    
757
                this.btnSearchPostProcess.addActionListener((ActionEvent e) -> {
758
                        try {
759
                                doSelectSearchPostprocess();
760
                        } catch (DataException ex) {
761
                                LOGGER.warn("Can't select a Search Post Process", ex);
762
                        }
763
                });
764

    
765
                this.tabResults.setEnabledAt(1, false);
766

    
767
                this.tblResults.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
768
                this.tblResults.addKeyListener(new KeyAdapter() {
769
                        @Override
770
                        public void keyPressed(KeyEvent e) {
771
                                if (e.getKeyCode() == KeyEvent.VK_F4) {
772
                                        doShowCellInDialog();
773
                                }
774
                        }
775
                });
776

    
777
                this.tblResults.setComponentPopupMenu(new TablePopupMenu(this.tblResults));
778
                this.tblSearchPostProcessResults.setComponentPopupMenu(new TablePopupMenu(this.tblSearchPostProcessResults));
779

    
780
                this.tabResults.addChangeListener((ChangeEvent evt) -> {
781
                        SwingUtilities.invokeLater(() -> {
782
                                if (tabResults.getSelectedIndex() == 0) {
783
                                        updateNumberElementsMsg(resultModel);
784
                                } else {
785
                                        updateNumberElementsMsg(resultPostProcessModel);
786
                                }
787
                        });
788
                });
789
                if (this.filterOnlyMode) {
790
                        this.btnSearchPostProcess.setVisible(false);
791
                }
792

    
793
                //this.tblResults.add
794
                if (this.automaticallySearch){
795
                    if (this.bookmarks.hasBookmark(this.store.getName())) {
796
                            Bookmark<DefaultSearchParameters> initBookmark = this.bookmarks.get(this.store.getName());
797
                            initBookmark.used();
798
                            putParametersAndSearch(initBookmark.getValue());
799
                    } else {
800
                        clear();
801
                        search();
802
                    }
803
                } else {
804
                    clear();
805
                    
806
                }
807
        }
808
        
809
    private void putParametersAndSearch(DefaultSearchParameters searchParams) {
810
        DefaultSearchParameters params;
811
        try {
812
            params = searchParams.getCopy();
813
            params.fix(this.getFeatureType());
814
            // TODO: habria que comprobar y preguntar al usuario de forma
815
            // similar a lo que se hace en DefaultFeatureQueryCalculatedColumnsPanel.doRemove
816
        } catch (Exception ex) {
817
            LOGGER.warn("Not been able to clone export parameters", ex);
818
            return;
819
        }
820
        clear();
821
        put(params);
822
        Thread th = new Thread(() -> {
823
            doSearch(params);
824
        });
825
        th.start();
826

    
827
    }
828

    
829
        private void doShowCellInDialog() {
830
                int row = this.tblResults.getSelectedRow();
831
                if (row < 0) {
832
                        return;
833
                }
834
                int col = this.tblResults.getSelectedColumn();
835
                if (col < 0) {
836
                        return;
837
                }
838
                String s = Objects.toString(this.tblResults.getValueAt(row, col), null);
839
                if (StringUtils.isBlank(s)) {
840
                        return;
841
                }
842
                ToolsSwingLocator.getToolsSwingManager().showZoomDialog(
843
                        this,
844
                        this.tblResults.getColumnName(col),
845
                        s,
846
                        false
847
                );
848
        }
849

    
850
        @Override
851
        public FeatureType getFeatureType() {
852
                try {
853
                        return store.getDefaultFeatureType();
854
                } catch (Exception ex) {
855
                        throw new RuntimeException("Can't retrieve the feature type.", ex);
856
                }
857
        }
858

    
859
        @Override
860
        public void setEnabled(boolean enabled) {
861
                if (!SwingUtilities.isEventDispatchThread()) {
862
                        SwingUtilities.invokeLater(() -> {
863
                                setEnabled(enabled);
864
                        });
865
                        return;
866
                }
867

    
868
                if (this.conditionPanels == null) {
869
                        this.initComponents();
870
                }
871
                for (SearchConditionPanel conditionPanel : conditionPanels) {
872
                        conditionPanel.setEnabled(enabled);
873
                }
874

    
875
                this.btnClear.setEnabled(enabled);
876
                this.btnSearch.setEnabled(enabled);
877
                for (ActionButtons actionButton : actions.values()) {
878
                        actionButton.action.setEnabled(enabled);
879
                }
880
                this.btnSearchPostProcess.setEnabled(enabled);
881
                //bookmarkController,historyController,configurableActions
882
        }
883

    
884
        @Override
885
        public void clear() {
886
                this.taskStatusController.setTitle("");
887
                if (this.conditionPanels == null) {
888
                        return;
889
                }
890
                for (SearchConditionPanel conditionPanel : conditionPanels) {
891
                        conditionPanel.clear();
892
                }
893
                FeatureQuery emptyQuery = this.store.createFeatureQuery();
894
                emptyQuery.retrievesAllAttributes();
895
                this.parameters.setQuery(emptyQuery);
896
                // Mantener las columnas visualizadas
897
                // Elimina las que no existen en el store como campos calculados que
898
                // pudieran existir en el fquery
899
                List<String> resultColumnNames = this.parameters.getResultColumnNames();
900
                ArrayList<String> toDeleteAlreadyDontExist = new ArrayList<>();
901
                for (String resultColumnName : resultColumnNames) {
902
                        try {
903
                                FeatureAttributeDescriptor attr = this.store.getDefaultFeatureType().getAttributeDescriptor(resultColumnName);
904
                                if (attr == null) {
905
                                        toDeleteAlreadyDontExist.add(resultColumnName);
906
                                }
907
                        } catch (DataException ex) {
908

    
909
                        }
910
                }
911
                resultColumnNames.removeAll(toDeleteAlreadyDontExist);
912
                resetTable();
913
        }
914

    
915
        @Override
916
        public FeatureQuery getLastQuery() {
917
                return this.lastQuery;
918
        }
919

    
920
        public boolean isValid(StringBuilder message) {
921
                int searchMode = this.tabSearchMode.getSelectedIndex();
922
                SearchConditionPanel panel = this.conditionPanels.get(searchMode);
923
                boolean valid = panel.isValid(message);
924
                return valid;
925
        }
926

    
927
        @Override
928
        public int search() {
929
                StringBuilder message = new StringBuilder();
930
                if (!this.isValid(message)) {
931
                        ThreadSafeDialogsManager dialogManager = ToolsSwingLocator.getThreadSafeDialogsManager();
932
                        dialogManager.messageDialog(
933
                                "_The_specified_search_condition_is_not_valid",
934
                                "_Search",
935
                                JOptionPane.WARNING_MESSAGE
936
                        );
937
                        return STATUS_NOT_VALID;
938
                }
939
                lblMsg.setText(ToolsLocator.getI18nManager().getTranslation("_Searching") + "...");
940
                setEnabled(false);
941
                Thread th = new Thread(() -> {
942
                        try {
943
                                SearchParameters searchParams;
944
                                try {
945
                                        searchParams = this.fetch(this.parameters.getCopy()); // esto lo actualiza a la ultima // decidir si se devuelve clonado
946

    
947
                                        Date date = Calendar.getInstance().getTime();
948
                                        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
949
                                        String strDate = dateFormat.format(date);
950
                                        searchParams.setName("Params: " + strDate);
951
                                } catch (Exception ex) {
952
                                        LOGGER.warn("Not able to create search parameters.", ex);
953
                                        this.taskStatusController.setTitle(ToolsLocator.getI18nManager().getTranslation("_Errors_fetching_new_query") + "...");
954
                                        resetTable();
955
                                        return;
956
                                }
957
                                doSearch(searchParams);
958
                        } catch (Exception ex) {
959
                                LOGGER.warn("Search panel has errors during the search", ex);
960
                                resetTable();
961
                        } finally {
962
                                SwingUtilities.invokeLater(() -> {
963
                                        setEnabled(true);
964
                                });
965
                        }
966
                });
967
                th.start();
968
                return STATUS_OK;
969
        }
970

    
971
        @Override
972
        public int search(SearchParameters searchParams) {
973
            ((DefaultSearchParameters)searchParams).fix(this.getFeatureType());
974
            return doSearch(searchParams);
975
        }
976
        
977
        private int doSearch(SearchParameters searchParams) {
978
                final MutableObject model = new MutableObject(null);
979
                final MutableLong rowCount = new MutableLong();
980
                Cursor savedCursor = this.getCursor();
981
                SimpleTaskStatus status = ToolsLocator.getTaskStatusManager().createDefaultSimpleTaskStatus("");
982
                status.setAutoremove(true);
983
                status.add();
984
                this.taskStatusController.bind(status);
985
                try {
986
                        status.setTitle(ToolsLocator.getI18nManager().getTranslation("_Processing_search"));
987
                        SwingUtilities.invokeLater(() -> {
988
                                this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
989
                        });
990
                        final List<Feature> features;
991
                        FeatureQuery myQuery;
992
//                myQuery = this.getQuery().getCopy();
993
                        this.tabResults.setSelectedIndex(0);
994
                        List<String> resultColumnNames = searchParams.getResultColumnNames();
995
                        myQuery = searchParams.getQuery().getCopy();
996
                        features = store.getFeatures(myQuery, 50);
997
                        FacadeOfAFeaturePagingHelper facade = (FacadeOfAFeaturePagingHelper) features;
998
                        FeatureType ftype = facade.getFeaturePagingHelper().getFeatureSet().getDefaultFeatureType();
999
                        // al modelo le pasamos el ftype de esas features
1000
                        SimpleFeaturesTableModel tableModel = new SimpleFeaturesTableModelImpl(
1001
                                ftype,
1002
                                resultColumnNames,
1003
                                features
1004
                        );
1005
                        model.setValue(tableModel);
1006
                        rowCount.setValue(tableModel.getRowCount());
1007
                        resultModel = (SimpleFeaturesTableModel) model.getValue();
1008
                } catch (Exception ex) {
1009
                        LOGGER.warn("Search not able to be executed. Can't get features or create table model", ex);
1010
                        status.setTitle(ToolsLocator.getI18nManager().getTranslation("_Errors_getting_new_feature_set") + "...");
1011
                        status.abort();
1012
                        resetTable();
1013
                        return STATUS_ERROR1;
1014
                } finally {
1015
                        SwingUtilities.invokeLater(() -> {
1016
                                I18nManager i18n = ToolsLocator.getI18nManager();
1017
                                try {
1018
                                        TableModel oldmodel = tblResults.getModel();
1019
                                        tblResults.setModel(resultModel);
1020
                                        resultModel.setCellRenderers(tblResults, getCustomRenderers(searchParams));
1021
                                        if (oldmodel instanceof SimpleFeaturesTableModelImpl) {
1022
                                                ((SimpleFeaturesTableModelImpl) oldmodel).dispose();
1023
                                        }
1024
                                        if (resultModel.hasErrors()) {
1025
                                                status.setTitle(i18n.getTranslation("_Errors_occurred_during_search"));
1026
                                        } else {
1027
                                                status.setTitle(String.format("%d " + i18n.getTranslation("_elements"), rowCount.getValue()));
1028
                                        }
1029
                                        if (this.parameters != null && this.parameters.getQuery() != null) {
1030
                                                this.history.add(searchParams);
1031
                                        }
1032
                                } catch (Exception ex) {
1033
                                        LOGGER.warn(" Errors occurred during search getting old model", ex);
1034
                                        status.setTitle(i18n.getTranslation("_Errors_occurred_during_search"));
1035
                                } finally {
1036
                                        setEnabled(true);
1037
                                        status.terminate();
1038
                                        this.setCursor(savedCursor);
1039
                                }
1040
                        });
1041
                }
1042
                return STATUS_OK;
1043
        }
1044

    
1045
        @Override
1046
        public SimpleFeaturesTableModel getResultsTableModel() {
1047
            return this.resultModel;
1048
        }
1049
        
1050
        private Map<String, TableCellRenderer> getCustomRenderers(SearchParameters parameters) {
1051
                FeatureType ft = this.store.getDefaultFeatureTypeQuietly();
1052
                HashMap<String, TableCellRenderer> renderers = new HashMap<String, TableCellRenderer>();
1053
                for (FeatureAttributeDescriptor attr : ft) {
1054
                        if (attr.getDataType().isNumeric()) {
1055
//                renderers.put(attr.getName(), new ColorRangeRenderer(attr, 20, 50));
1056
                        }
1057
                }
1058
                return renderers;
1059
        }
1060

    
1061
        private void resetTable() {
1062
                if (!SwingUtilities.isEventDispatchThread()) {
1063
                        SwingUtilities.invokeLater(this::resetTable);
1064
                        return;
1065
                }
1066
                List<String> resultColumnNames = null;
1067
                try {
1068
                        resultColumnNames = this.parameters.getResultColumnNames();
1069
                } catch (Exception ex) {
1070

    
1071
                }
1072
                FeatureType ftype = this.store.getDefaultFeatureTypeQuietly();
1073
                SimpleFeaturesTableModelImpl emptyTableModel = new SimpleFeaturesTableModelImpl(
1074
                        ftype,
1075
                        resultColumnNames,
1076
                        null
1077
                );
1078
                this.tblResults.setModel(emptyTableModel);
1079

    
1080
        }
1081

    
1082
        public void setResultColumnNames(List<String> names) {
1083
                this.parameters.getResultColumnNames().clear();
1084
                this.parameters.getResultColumnNames().addAll(names);
1085
//        if (this.conditionPanels == null) {
1086
//            return;
1087
//        }
1088
//        SimpleFeaturesTableModelImpl model;
1089
////        model = (SimpleFeaturesTableModel) this.tblResults.getModel();
1090
//        List<Feature> features = store.getFeatures(this.parameters.getQuery());
1091
//        FacadeOfAFeaturePagingHelper facade = (FacadeOfAFeaturePagingHelper) features;
1092
//        FeatureType ftype = facade.getFeaturePagingHelper().getFeatureSet().getDefaultFeatureType();
1093
//        model = new SimpleFeaturesTableModelImpl(
1094
//                ftype,
1095
//                this.parameters.getResultColumnNames(),
1096
//                features
1097
//        );
1098
//        tblResults.setModel(model);
1099
        }
1100

    
1101
        @Override
1102
        public boolean setFilter(Expression filter) {
1103
                try {
1104
                        if (this.conditionPanels == null) {
1105
                                this.initComponents();
1106
                        }
1107
                        if (ExpressionUtils.isPhraseEmpty(filter)) {
1108
                                this.clear();
1109
                                return true;
1110
                        }
1111
                        int panel = 0;
1112
                        int selected = PANEL_ADVANCED;
1113
                        for (SearchConditionPanel conditionPanel : conditionPanels) {
1114
                                if (panel != PANEL_ADVANCED && conditionPanel.set(filter)) {
1115
                                        selected = panel;
1116
                                }
1117
                                panel++;
1118
                        }
1119
                        this.tabSearchMode.setSelectedIndex(selected);
1120

    
1121
//            SimpleFeaturesTableModel model = new SimpleFeaturesTableModel(this.getStore());
1122
//            tblResults.setModel(model);
1123
//            lblMsg.setText("");
1124
                        return true;
1125
                } catch (Exception ex) {
1126
                        LOGGER.warn("Can't set current search", ex);
1127
                        return false;
1128
                }
1129
        }
1130

    
1131
        @Override
1132
        public List<SearchConditionPanel> getConditionPanels() {
1133
                return Collections.unmodifiableList(this.conditionPanels);
1134
        }
1135

    
1136
        @Override
1137
        public SearchConditionPanel getConditionPanel(String name) {
1138
                if (conditionPanels == null) {
1139
                        return null;
1140
                }
1141
                for (SearchConditionPanel panel : conditionPanels) {
1142
                        if (StringUtils.equalsIgnoreCase(name, panel.getFactory().getName())) {
1143
                                return panel;
1144
                        }
1145
                }
1146
                return null;
1147
        }
1148

    
1149
        @Override
1150
        public Expression getFilterForSelectedFeature() {
1151
                if (this.conditionPanels == null) {
1152
                        return null;
1153
                }
1154
                if (this.tabResults.getSelectedIndex() == 0) {
1155
                        int selectedRow = this.tblResults.getSelectedRow();
1156
                        if (selectedRow < 0) {
1157
                                return null;
1158
                        }
1159
                        try {
1160
                                List<Feature> features = ((SimpleFeaturesTableModelImpl) this.tblResults.getModel()).getFeatures();
1161
                                Feature feature = features.get(selectedRow);
1162

    
1163
                                ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
1164
                                FeatureType ftype = this.store.getDefaultFeatureType();
1165
                                for (FeatureAttributeDescriptor attrdesc : ftype.getPrimaryKey()) {
1166
                                        builder.and(
1167
                                                builder.eq(
1168
                                                        builder.column(attrdesc.getName()),
1169
                                                        builder.constant(feature.get(attrdesc.getName()))
1170
                                                )
1171
                                        );
1172
                                }
1173
                                Expression filter = ExpressionUtils.createExpression(builder.toString());
1174
                                return filter;
1175
                        } catch (Exception ex) {
1176
                                LOGGER.warn("Can't build search for the selected feature.", ex);
1177
                                return null;
1178
                        }
1179
                } else {
1180
                        if (this.currentPostProcess == null) {
1181
                                return null;
1182
                        }
1183
                        int selectedRow = this.tblSearchPostProcessResults.getSelectedRow();
1184
                        if (selectedRow < 0) {
1185
                                return null;
1186
                        }
1187
                        try {
1188
                                List<Feature> features = ((SimpleFeaturesTableModelImpl) this.tblSearchPostProcessResults.getModel()).getFeatures();
1189
                                Feature feature = features.get(selectedRow);
1190

    
1191
                                ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
1192
                                FeatureType ftype = this.postProcessStore.getDefaultFeatureType();
1193
                                for (FeatureAttributeDescriptor attrdesc : ftype.getPrimaryKey()) {
1194
                                        builder.and(
1195
                                                builder.eq(
1196
                                                        builder.column(attrdesc.getName()),
1197
                                                        builder.constant(feature.get(attrdesc.getName()))
1198
                                                )
1199
                                        );
1200
                                }
1201
                                Expression filter = ExpressionUtils.createExpression(builder.toString());
1202
                                return filter;
1203
                        } catch (Exception ex) {
1204
                                LOGGER.warn("Can't build search for the selected feature.", ex);
1205
                                return null;
1206
                        }
1207
                }
1208

    
1209
        }
1210

    
1211
        @Override
1212
        public FeatureStore getStore() {
1213
                return store;
1214
        }
1215

    
1216
        private void doOrderBy() {
1217
                I18nManager i18n = ToolsLocator.getI18nManager();
1218
                WindowManager_v2 windowManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
1219
                FeatureQueryOrderPanel orderPanel = DALSwingLocator.getDataSwingManager().createFeatureStoreOrderPanel();
1220
                orderPanel.setStore(store);
1221
                orderPanel.put(parameters.getQuery());
1222
                Dialog dialog = windowManager.createDialog(
1223
                        orderPanel.asJComponent(),
1224
                        i18n.getTranslation("_Select_order"),
1225
                        null,
1226
                        WindowManager_v2.BUTTONS_OK_CANCEL
1227
                );
1228
                dialog.addActionListener((ActionEvent e) -> {
1229
                        if (dialog.getAction() == WindowManager_v2.BUTTON_OK) {
1230
                                orderPanel.fetch(this.parameters.getQuery());
1231
                                search();
1232
                        }
1233
                });
1234
                dialog.show(WindowManager.MODE.DIALOG);
1235
        }
1236

    
1237
        private void doCopyRows(JTable table) {
1238
                Cursor savedCursor = this.getCursor();
1239
                SimpleTaskStatus status = ToolsLocator.getTaskStatusManager().createDefaultSimpleTaskStatus("");
1240
                status.setAutoremove(true);
1241
                status.add();
1242
                this.taskStatusController.bind(status);
1243
                Thread task = new Thread(() -> {
1244
                        try {
1245
                                this.processing = true;
1246
                                this.updateComponentState();
1247
                                status.setTitle(ToolsLocator.getI18nManager().getTranslation("_Copying_rows_to_clipboard"));
1248
                                SwingUtilities.invokeLater(() -> {
1249
                                        this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
1250
                                });
1251

    
1252
                                SimpleFeaturesTableModel model = null;
1253
                                if (table.getModel() instanceof SimpleFeaturesTableModel) {
1254
                                        model = (SimpleFeaturesTableModel) table.getModel();
1255
                                }
1256

    
1257
                                String LINE_BREAK = System.lineSeparator();
1258
                                String CELL_BREAK = "\t";
1259
                                char DELIMITER = '"';
1260

    
1261
                                int[] selection = table.getSelectedRows();
1262
                                for (int i = 0; i < selection.length; i++) {
1263
                                        selection[i] = table.convertRowIndexToModel(selection[i]);
1264
                                }
1265

    
1266
                                int numCols = table.getColumnCount();
1267
                                StringBuilder excelStr = new StringBuilder();
1268
                                boolean valueIsNumeric;
1269

    
1270
                                for (int j = 0; j < numCols; j++) {
1271

    
1272
                                        excelStr.append(DELIMITER);
1273
                                        excelStr.append(escape(table.getColumnName(j), LINE_BREAK, CELL_BREAK));
1274
                                        excelStr.append(DELIMITER);
1275

    
1276
                                        if (j < numCols - 1) {
1277
                                                excelStr.append(CELL_BREAK);
1278
                                        }
1279
                                }
1280

    
1281
                                //from( 0, selection.length)
1282
                                status.setRangeOfValues(0, selection.length);
1283
                                excelStr.append(LINE_BREAK);
1284
                                for (int i : selection) {
1285
                                        status.incrementCurrentValue();
1286
                                        if (status.isCancellationRequested()) {
1287
                                                status.message("");
1288
                                                status.cancel();
1289
                                                return;
1290
                                        }
1291
                                        for (int j = 0; j < numCols; j++) {
1292
                                                valueIsNumeric = false;
1293
                                                FeatureAttributeDescriptor descriptor = null;
1294
                                                if (model != null) {
1295
                                                        descriptor = model.getFeatureDescriptor(j);
1296
                                                        if (descriptor.getDataType().isNumeric()) {
1297
                                                                if (!descriptor.hasAvailableValues()) {
1298
                                                                        valueIsNumeric = true;
1299
                                                                }
1300
                                                        }
1301
                                                }
1302
                                                if (!valueIsNumeric) {
1303
                                                        excelStr.append(DELIMITER);
1304
                                                }
1305
                                                Object value = table.getValueAt(i, j);
1306
                                                String valueStr;
1307
                                                if (descriptor != null) {
1308
                                                        valueStr = escape(descriptor.format(value), LINE_BREAK, CELL_BREAK);
1309
                                                } else {
1310
                                                        valueStr = escape(value, LINE_BREAK, CELL_BREAK);
1311

    
1312
                                                }
1313
                                                excelStr.append(valueStr);
1314

    
1315
                                                if (!valueIsNumeric) {
1316
                                                        excelStr.append(DELIMITER);
1317
                                                }
1318
                                                if (j < numCols - 1) {
1319
                                                        excelStr.append(CELL_BREAK);
1320
                                                }
1321
                                        }
1322
                                        excelStr.append(LINE_BREAK);
1323
                                }
1324
                                String toStr = excelStr.toString();
1325

    
1326
                                doPostCopyRows(status, toStr);
1327
                                SwingUtilities.invokeLater(() -> {
1328
                                        status.setTitle(ToolsLocator.getI18nManager().getTranslation("_Copy_ended"));
1329
                                        status.terminate();
1330
                                });
1331

    
1332
                        } catch (Exception ex) {
1333
                                LOGGER.warn("Not able to copy rows to the clipboard", ex);
1334
                                status.message("Not able to copy rows to the clipboard");
1335
                                status.abort();
1336
                        } finally {
1337
                                this.processing = false;
1338
                                SwingUtilities.invokeLater(() -> {
1339
                                        this.setCursor(savedCursor);
1340
                                });
1341
                                this.updateComponentState();
1342
                        }
1343
                }, "SearchPanelCopyRows");
1344
                task.start();
1345
        }
1346

    
1347
        private void doPostCopyRows(SimpleTaskStatus status, String toStr) {
1348
                if (!SwingUtilities.isEventDispatchThread()) {
1349
                        SwingUtilities.invokeLater(() -> {
1350
                                doPostCopyRows(status, toStr);
1351
                        });
1352
                        return;
1353
                }
1354
                ToolsSwingLocator.getToolsSwingManager().putInClipboard(toStr);
1355
//        StringSelection sel = new StringSelection(toStr);
1356
//        Clipboard CLIPBOARD = Toolkit.getDefaultToolkit().getSystemClipboard();
1357
//        CLIPBOARD.setContents(sel, null);            
1358
        }
1359

    
1360
        private String escape(Object cell, String LINE_BREAK, String CELL_BREAK) {
1361
                return (cell == null ? "" : cell.toString()
1362
                        .replace(CELL_BREAK, " ")
1363
                        .replace("\n", " ")
1364
                        .replace("\r", " "));
1365
        }
1366

    
1367
        @Override
1368
        public ImageIcon loadImage(String imageName) {
1369
                String name = FilenameUtils.getBaseName(imageName);
1370
                IconTheme theme = ToolsSwingLocator.getIconThemeManager().getDefault();
1371
                if (theme.exists(name)) {
1372
                        return theme.get(name);
1373
                }
1374
                URL url = this.getClass().getResource(name + ".png");
1375
                if (url == null) {
1376
                        return null;
1377
                }
1378
                return new ImageIcon(url);
1379
        }
1380

    
1381
        @Override
1382
        public int getSelectedFeatureCount() {
1383
                if (this.conditionPanels == null) {
1384
                        return 0;
1385
                }
1386
                if (this.currentPostProcess == null || this.tabResults.getSelectedIndex() == 0) {
1387
                        return this.tblResults.getSelectedRowCount();
1388
                }
1389
                return this.tblSearchPostProcessResults.getSelectedRowCount();
1390
        }
1391

    
1392
        @Override
1393
        public JComponent getActionButton(String name) {
1394
                ActionButtons actionButton = this.actions.get(name);
1395
                if (actionButton == null) {
1396
                        return null;
1397
                }
1398
                return actionButton.button;
1399
        }
1400

    
1401
        @Override
1402
        public void setShowActions(boolean showActions) {
1403
                this.showActions = showActions;
1404
        }
1405

    
1406
        @Override
1407
        public boolean isShowActions() {
1408
                return this.showActions;
1409
        }
1410

    
1411
        private void doCalculatedColumns() {
1412
                WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
1413
                I18nManager i18n = ToolsLocator.getI18nManager();
1414
                final FeatureQueryCalculatedColumnsPanel panel = new DefaultFeatureQueryCalculatedColumnsPanel();
1415
                panel.setStore(this.store);
1416
                panel.put(this.parameters.getQuery());
1417
                final Dialog dialog = winmanager.createDialog(
1418
                        panel.asJComponent(),
1419
                        i18n.getTranslation("_Calculated_columns"),
1420
                        null,
1421
                        WindowManager_v2.BUTTONS_OK_CANCEL
1422
                );
1423
                dialog.addActionListener((ActionEvent e) -> {
1424
                        if (dialog.getAction() == WindowManager_v2.BUTTONS_OK) {
1425
                                panel.fetch(this.parameters.getQuery());
1426
                                search();
1427
                        }
1428
                });
1429
                dialog.show(WindowManager.MODE.DIALOG);
1430
        }
1431

    
1432
        private void doGroupBy() {
1433
                DataStoreProviderFactory dataFactory = this.store.getProviderFactory();
1434
                int allowGroupBy = ((FeatureStoreProviderFactory) dataFactory).allowGroupBy();
1435
                if (allowGroupBy != DataType.YES) {
1436
                        // FIXME: mensaje al usaurio.
1437
                        I18nManager i18n = ToolsLocator.getI18nManager();
1438
                        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
1439
                        dialogs.messageDialog(
1440
                                i18n.getTranslation("_The_group_function_is_not_available_for_this_table"),
1441
                                i18n.getTranslation("_Information"),
1442
                                JOptionPane.INFORMATION_MESSAGE
1443
                        );
1444
                        return;
1445
                }
1446

    
1447
                WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
1448
                I18nManager i18n = ToolsLocator.getI18nManager();
1449
                final FeatureQueryGroupByPanel panelGroupBy = new DefaultFeatureQueryGroupByPanel();
1450
                panelGroupBy.setStore(this.store);
1451
                panelGroupBy.put(this.parameters.getQuery());
1452
                final Dialog dialog = winmanager.createDialog(
1453
                        panelGroupBy.asJComponent(),
1454
                        i18n.getTranslation("_Select_group_columns_and_aggregate_functions"),
1455
                        null,
1456
                        WindowManager_v2.BUTTONS_OK_CANCEL
1457
                );
1458
                dialog.addActionListener((ActionEvent e) -> {
1459
                        if (dialog.getAction() == WindowManager_v2.BUTTONS_OK) {
1460
                                panelGroupBy.fetch(this.parameters.getQuery());
1461
                                search();
1462
                        }
1463
                });
1464
                dialog.show(WindowManager.MODE.DIALOG);
1465
        }
1466

    
1467
        private void doSelectResultColumnNames() {
1468
                WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
1469
                I18nManager i18n = ToolsLocator.getI18nManager();
1470
                final FeatureAttributesSelectionPanel panelSelectColumns = DALSwingLocator.getManager().createFeatureAttributeSelectionPanel();
1471
                panelSelectColumns.allowCalculatedAttributes(false);
1472
                FeatureType ftype = this.getFeatureType();
1473
                try {
1474
                        Feature f = store.findFirst(this.parameters.getQuery());
1475
                        if (f != null) {
1476
                                ftype = f.getType();
1477
                        }
1478
                } catch (Throwable ex) {
1479
                        LOGGER.warn("Can't retrieve the feature type from the first feature.", ex);
1480
                }
1481
                panelSelectColumns.setFeatureType(ftype);
1482
                panelSelectColumns.setSelectedNames(this.parameters.getResultColumnNames());
1483
                final Dialog dialog = winmanager.createDialog(
1484
                        panelSelectColumns.asJComponent(),
1485
                        i18n.getTranslation("_Select_the_columns_to_display"),
1486
                        null,
1487
                        WindowManager_v2.BUTTONS_OK_CANCEL
1488
                );
1489
                dialog.addActionListener((ActionEvent e) -> {
1490
                        if (dialog.getAction() == WindowManager_v2.BUTTONS_OK) {
1491
                                this.setResultColumnNames(panelSelectColumns.getSelectedNames());
1492
                                search();
1493
                        }
1494
                });
1495
                dialog.show(WindowManager.MODE.DIALOG);
1496
        }
1497

    
1498
        @Override
1499
        public void put(SearchParameters inParams) {
1500
                this.parameters = (DefaultSearchParameters) inParams;
1501
                for (SearchConditionPanel conditionPanel : this.conditionPanels) {
1502
                        try {
1503
                                conditionPanel.put(inParams);
1504
                        } catch (Exception ex) {
1505
                                LOGGER.warn("Can't open panel", ex);
1506
                        }
1507
                }
1508
                this.tabSearchMode.setSelectedIndex(inParams.getSearchMode());
1509
//        this.resetTable();
1510

    
1511
        }
1512

    
1513
        private FeatureQuery getQuery() {
1514
                FeatureQuery query;
1515
                try {
1516
                        int searchMode = this.tabSearchMode.getSelectedIndex();
1517
                        SearchConditionPanel panel = this.conditionPanels.get(searchMode);
1518
                        Expression filter = panel.get();
1519
                        if (searchMode != PANEL_ADVANCED) {
1520
                                this.conditionPanels.get(PANEL_ADVANCED).set(filter);
1521
                        }
1522
                        query = (FeatureQuery) this.parameters.getQuery().clone();
1523
                        query.retrievesAllAttributes();
1524
                        if (ExpressionUtils.isPhraseEmpty(filter)) {
1525
                                return query;
1526
                        }
1527
                        query.setFilter(filter);
1528
                        query.retrievesAllAttributes();
1529
                        return query;
1530
                } catch (Exception ex) {
1531
                        LOGGER.warn("Can't build query.", ex);
1532
                        return null;
1533
                }
1534
        }
1535

    
1536
        @Override
1537
        public SearchParameters fetch(SearchParameters outParams) {
1538
                // Actualiza el fquery del parameters con los paneles
1539
                for (SearchConditionPanel conditionPanel : conditionPanels) {
1540
                        try {
1541
                                conditionPanel.fetch(this.parameters);
1542
                        } catch (Exception ex) {
1543
                                LOGGER.warn("Panel not able to fetch values", ex);
1544
                        }
1545
                }
1546

    
1547
                // Actualiza el filtro con el panel activo
1548
                int searchMode = this.tabSearchMode.getSelectedIndex();
1549
                SearchConditionPanel panel = this.conditionPanels.get(searchMode);
1550
                Expression filter = panel.get();
1551
                if (searchMode != PANEL_ADVANCED) {
1552
                        this.conditionPanels.get(PANEL_ADVANCED).set(filter);
1553
                }
1554
                this.parameters.setSearchMode(searchMode);
1555
                FeatureQuery query = (FeatureQuery) this.parameters.getQuery();
1556
                this.lastQuery = query.getCopy();
1557
                query.retrievesAllAttributes();
1558
                query.clearFilter();
1559
                if (!ExpressionUtils.isPhraseEmpty(filter)) {
1560
                        query.setFilter(filter);
1561
                        query.retrievesAllAttributes();
1562
                }
1563

    
1564
                if (outParams == null) {
1565
                        return this.parameters.getCopy();
1566
                }
1567
                outParams.copyFrom(this.parameters.getCopy());
1568
                return outParams;
1569
        }
1570

    
1571
        public static void selfRegister() {
1572
                IconTheme theme;
1573
                try {
1574
                   theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
1575
                } catch(ReferenceNotRegisteredException ex) {
1576
                    return;
1577
                }
1578
                String[][] iconNames = new String[][]{
1579
                        new String[]{"dalswing", "featurestore-column"},
1580
                        new String[]{"dalswing", "featurestore-foreing-key"},
1581
                        new String[]{"dalswing", "featurestore-table"},
1582
                        new String[]{"dalswing", "search-action-select"},
1583
                        new String[]{"dalswing", "search-action-select-add"},
1584
                        new String[]{"dalswing", "search-action-select-filter"},
1585
                        new String[]{"dalswing", "search-nullbehavior-null"},
1586
                        new String[]{"dalswing", "search-nullbehavior-true"},
1587
                        new String[]{"dalswing", "search-nullbehavior-false2"}
1588

    
1589
                };
1590
                for (String[] icon : iconNames) {
1591
                        URL url = DefaultSearchPanel.class.getResource(icon[1] + ".png");
1592
                        theme.registerDefault("DALSwing", icon[0], icon[1], null, url);
1593
                }
1594

    
1595
                ConfigurableActionsMamager cfgActionsManager = ToolsUtilLocator.getConfigurableActionsMamager();
1596
                cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new UseLabelsYesAction());
1597
                cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new UseLabelsNoAction());
1598
                cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new UseLabelsBothAction());
1599
                cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new SelectColumnsAction());
1600
                cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new CalculatedColumnsAction());
1601
                cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new GroupByAction());
1602
                cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new OrderByAction());
1603
        }
1604

    
1605
        private void doSelectSearchPostprocess() throws DataException {
1606
                DataSwingManager manager = DALSwingLocator.getDataSwingManager();
1607
                Map<String, SearchPostProcessFactory> searchPostProcessFactoryMap = manager.getSearchPostProcess();
1608

    
1609
                JPopupMenu menu = new JPopupMenu();
1610
                for (String factory : searchPostProcessFactoryMap.keySet()) {
1611
                        JMenuItem item;
1612
                        item = new JMenuItem(factory);
1613
                        SearchParameters searchParams = this.fetch(this.parameters.getCopy());
1614
                        FeatureQuery myQuery = searchParams.getQuery().getCopy();
1615
//            item.addActionListener(new SearchPostProcessListener(this.store, myQuery, manager.getSearchPostProcess(factory)));
1616
                        item.addActionListener((ActionEvent e) -> {
1617
                                doSearchPostProcess(store, myQuery, manager.getSearchPostProcess(factory), searchParams);
1618
                        });
1619
                        menu.add(item);
1620
                }
1621
                menu.show(this.btnSearchPostProcess, 0, this.btnSearchPostProcess.getHeight());
1622
        }
1623

    
1624
        private void doExecuteSearchPostProcess(
1625
                FeatureStore input,
1626
                FeatureQuery query,
1627
                SearchPostProcessFactory factory,
1628
                DynObject parameters
1629
        ) {
1630
                Cursor savedCursor = this.getCursor();
1631
                SimpleTaskStatus status = ToolsLocator.getTaskStatusManager().createDefaultSimpleTaskStatus("");
1632
                status.setAutoremove(true);
1633
                status.add();
1634
                this.taskStatusController.bind(status);
1635
                Thread task = new Thread(() -> {
1636
                        try {
1637
                                SwingUtilities.invokeLater(() -> {
1638
                                        this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
1639
                                });
1640
                                this.processing = true;
1641
                                this.updateComponentState();
1642
                                SearchPostProcess process = factory.createProcess(factory, input, query, parameters);
1643

    
1644
                                if (parameters != null) {
1645
                                        process.setParameters(parameters);
1646
                                }
1647
                                //Ejecutar el execute en thread para no bloquear el software
1648
                                SearchPostProcess.SearchPostProcessResult output = process.execute(input, query, parameters, status);
1649
                                if (output != null) {
1650
                                        this.postProcessStore = output.getStore();
1651
                                        this.postProcessQuery = output.getQuery();
1652

    
1653
                                        doLoadSearchPostProccessResults(this.postProcessStore);
1654

    
1655
                                }
1656
                                this.currentPostProcess = factory.getName();
1657
                                status.terminate();
1658

    
1659
                        } catch (Exception ex) {
1660
                                LOGGER.warn("SearchPostProcess not able to be executed.", ex);
1661
                                resetPostProcessTable();
1662
                                status.setTitle(ToolsLocator.getI18nManager().getTranslation("_Error_in_post_process_operation"));
1663
                                status.message("");
1664
                                status.abort();
1665
                        } finally {
1666
                                SwingUtilities.invokeLater(() -> {
1667
                                        this.setCursor(savedCursor);
1668
                                });
1669
                                this.processing = false;
1670
                                this.updateComponentState();
1671
                        }
1672
                }, "ExecuteSearchPostProcess");
1673

    
1674
                task.start();
1675

    
1676
        }
1677

    
1678
        private void doLoadSearchPostProccessResults(FeatureStore input) {
1679
                if (!SwingUtilities.isEventDispatchThread()) {
1680
                        SwingUtilities.invokeLater(() -> {
1681
                                doLoadSearchPostProccessResults(input);
1682
                        });
1683
                        return;
1684
                }
1685

    
1686
                final List<Feature> featuresSearchPostProccessResults;
1687
                final FeatureQuery finalQuery;
1688
                finalQuery = null;
1689
                try {
1690
                        this.tabResults.setEnabledAt(1, true);
1691
                        this.tabResults.setSelectedIndex(1);
1692
                        featuresSearchPostProccessResults = input.getFeatures(finalQuery, 20);
1693
                        FacadeOfAFeaturePagingHelper facadeSearchPostProccessResults = (FacadeOfAFeaturePagingHelper) featuresSearchPostProccessResults;
1694
                        FeatureType ftypeSearchPostProccessResults = facadeSearchPostProccessResults.getFeaturePagingHelper().getFeatureSet().getDefaultFeatureType();
1695
                        // al modelo le pasamos el ftype de esas features
1696
                        resultPostProcessModel = new SimpleFeaturesTableModelImpl(
1697
                                ftypeSearchPostProccessResults,
1698
                                this.parameters.getResultColumnNames(),
1699
                                featuresSearchPostProccessResults
1700
                        );
1701

    
1702
                        I18nManager i18n = ToolsLocator.getI18nManager();
1703
                        TableModel oldmodel = tblSearchPostProcessResults.getModel();
1704
                        tblSearchPostProcessResults.setModel(resultPostProcessModel);
1705
                        resultPostProcessModel.setCellRenderers(tblSearchPostProcessResults);
1706
                        if (oldmodel instanceof SimpleFeaturesTableModel) {
1707
                                ((SimpleFeaturesTableModel) oldmodel).dispose();
1708
                        }
1709
                        updateNumberElementsMsg(resultPostProcessModel);
1710
//            if (resultPostProcessModel.hasErrors()) {
1711
//                lblMsg.setText("_Errors_occurred_load_search_post_process");
1712
//            } else {
1713
//                lblMsg.setText(String.format("%d " + i18n.getTranslation("_elements"), resultPostProcessModel.getRowCount()));
1714
//            }
1715
                } catch (Exception ex) {
1716
                        resetPostProcessTable();
1717
                        LOGGER.warn("SearchPostProcess not able to be executed. Can't get features or create table model", ex);
1718
                }
1719
        }
1720

    
1721
        private void updateComponentState() {
1722
                if (!SwingUtilities.isEventDispatchThread()) {
1723
                        SwingUtilities.invokeLater(this::updateComponentState);
1724
                        return;
1725
                }
1726
                this.pgbStatus.setVisible(processing);
1727
                this.setEnabled(!processing);
1728
        }
1729

    
1730
        private void resetPostProcessTable() {
1731
                if (!SwingUtilities.isEventDispatchThread()) {
1732
                        SwingUtilities.invokeLater(this::resetPostProcessTable);
1733
                        return;
1734
                }
1735

    
1736
                this.tblSearchPostProcessResults.setModel(new DefaultTableModel());
1737
        }
1738

    
1739
        private void doSearchPostProcess(FeatureStore store, FeatureQuery query, SearchPostProcessFactory factory, SearchParameters searchParams) {
1740
                if (factory.hasProcessParameters()) {
1741
                        DynObject parametersPostProcess = factory.createProcessParameters(store, query, searchParams);
1742
                        JDynForm form = DynFormLocator.getDynFormManager().createJDynForm(parametersPostProcess);
1743
                        form.setLayoutMode(JDynForm.USE_SEPARATORS);
1744

    
1745
                        I18nManager i18n = ToolsLocator.getI18nManager();
1746
                        WindowManager_v2 windowManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
1747

    
1748
                        Dialog dialog = windowManager.createDialog(
1749
                                form.asJComponent(),
1750
                                i18n.getTranslation("_Postprocess_parameters"),
1751
                                i18n.getTranslation(
1752
                                        "_Parameters_for_XpostprocessNameX_postprocess_on_XtableNameX",
1753
                                        new String[]{
1754
                                                factory.getName(),
1755
                                                this.store.getName()
1756
                                        }
1757
                                ),
1758
                                WindowManager_v2.BUTTONS_OK_CANCEL);
1759

    
1760
                        ToolsSwingUtils.ensureRowsCols(dialog.asJComponent(), 20, 60, 30, 100);
1761
                        dialog.addActionListener((ActionEvent e2) -> {
1762
                                if (dialog.getAction() == WindowManager_v2.BUTTON_OK) {
1763
                                        form.getValues(parametersPostProcess); // actualiza el valor de lo los parametros con los valores introducidos por el usuario
1764
                                        doExecuteSearchPostProcess(store, query, factory, parametersPostProcess);
1765
                                        this.postProcessParams = parametersPostProcess;
1766
                                }
1767
                        });
1768

    
1769
                        dialog.show(WindowManager.MODE.DIALOG);
1770

    
1771
                } else {
1772
                        doExecuteSearchPostProcess(store, query, factory, null);
1773
                }
1774
        }
1775

    
1776
        private void updateNumberElementsMsg(SimpleFeaturesTableModel model) {
1777
                I18nManager i18n = ToolsLocator.getI18nManager();
1778

    
1779
                if (model.hasErrors()) {
1780
                        this.taskStatusController.setTitle(i18n.getTranslation("_Errors_occurred_load_search_post_process"));
1781
                } else {
1782
                        this.taskStatusController.setTitle(String.format("%d " + i18n.getTranslation("_elements"), model.getRowCount()));
1783
                }
1784
        }
1785

    
1786
        @Override
1787
        public boolean isVisible(Object component) {
1788
                if (this.filterOnlyMode) {
1789
                        if (component instanceof GroupByAction) {
1790
                                return false;
1791
                        }
1792
//            if( component instanceof OrderByAction ) {
1793
//                return false;
1794
//            }
1795
//            if( component instanceof CalculatedColumnsAction ) {
1796
//                return false;
1797
//            }
1798
                }
1799
                return true;
1800
        }
1801

    
1802
        @Override
1803
        public boolean isEnabled(Object component) {
1804
                if (component instanceof GroupByAction) {
1805
                        DataStoreProviderFactory dataFactory = this.store.getProviderFactory();
1806
                        int allowGroupBy = ((FeatureStoreProviderFactory) dataFactory).allowGroupBy();
1807
                        if (allowGroupBy != DataType.YES) {
1808
                                return false;
1809
                        }
1810
                }
1811
                return true;
1812
        }
1813

    
1814
        @Override
1815
        public void setFilterOnlyMode(boolean filterOnlyMode) {
1816
                if (this.conditionPanels != null) {
1817
                        throw new IllegalStateException("Cannot change filter-only-mode after invoking asJComponent.");
1818
                }
1819
                this.filterOnlyMode = filterOnlyMode;
1820
                this.showActions = false;
1821
        }
1822

    
1823
        @Override
1824
        public boolean isFilterOnlyMode() {
1825
                return this.filterOnlyMode;
1826
        }
1827

    
1828
        @Override
1829
        public Feature getLastSelectedFeature() {
1830
                return this.lastSelectedFeature;
1831
        }
1832

    
1833
        @Override
1834
        public Object getProperty(String name) {
1835
                return this.propertiesHelper.getProperty(name);
1836
        }
1837

    
1838
        @Override
1839
        public void setProperty(String name, Object value) {
1840
                this.propertiesHelper.setProperty(name, value);
1841
        }
1842

    
1843
        @Override
1844
        public Map<String, Object> getProperties() {
1845
                return this.propertiesHelper.getProperties();
1846
        }
1847

    
1848
    public void setAutomaticallySearch(boolean automaticallySearch){
1849
        this.automaticallySearch = automaticallySearch;
1850
    }
1851
    
1852
    public boolean isAutomaticallySearch(){
1853
        return automaticallySearch;
1854
    }
1855
        
1856
}