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

History | View | Annotate | Download (29.3 KB)

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

    
3
import java.awt.BorderLayout;
4
import java.awt.Cursor;
5
import java.awt.Dimension;
6
import java.awt.FlowLayout;
7
import java.awt.event.ActionEvent;
8
import java.awt.event.ActionListener;
9
import java.net.URL;
10
import java.util.ArrayList;
11
import java.util.Collection;
12
import java.util.Collections;
13
import java.util.HashMap;
14
import java.util.List;
15
import java.util.Map;
16
import javax.swing.AbstractAction;
17
import javax.swing.Action;
18
import static javax.swing.Action.ACTION_COMMAND_KEY;
19
import static javax.swing.Action.NAME;
20
import javax.swing.BorderFactory;
21
import javax.swing.ImageIcon;
22
import javax.swing.JButton;
23
import javax.swing.JComponent;
24
import javax.swing.SwingUtilities;
25
import javax.swing.event.ListSelectionEvent;
26
import javax.swing.event.ListSelectionListener;
27
import javax.swing.table.TableModel;
28
import org.apache.commons.io.FilenameUtils;
29
import org.apache.commons.lang.mutable.MutableObject;
30
import org.apache.commons.lang3.StringUtils;
31
import org.gvsig.configurableactions.ConfigurableActionsMamager;
32
import org.gvsig.expressionevaluator.Expression;
33
import org.gvsig.expressionevaluator.ExpressionBuilder;
34
import org.gvsig.expressionevaluator.ExpressionUtils;
35
import static org.gvsig.fmap.dal.DataManager.DAL_USE_LABELS;
36
import static org.gvsig.fmap.dal.DataManager.USE_LABELS_BOTH;
37
import static org.gvsig.fmap.dal.DataManager.USE_LABELS_NO;
38
import static org.gvsig.fmap.dal.DataManager.USE_LABELS_YES;
39
import org.gvsig.fmap.dal.DataStore;
40
import org.gvsig.fmap.dal.complements.Search;
41
import org.gvsig.fmap.dal.feature.Feature;
42
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
43
import org.gvsig.fmap.dal.feature.FeatureQueryOrder;
44
import org.gvsig.fmap.dal.feature.FeatureStore;
45
import org.gvsig.fmap.dal.feature.FeatureType;
46
import org.gvsig.fmap.dal.swing.AbstractDALActionFactory.AbstractDALActionContext;
47
import org.gvsig.fmap.dal.swing.DALActionFactory;
48
import org.gvsig.fmap.dal.swing.DALSwingLocator;
49
import org.gvsig.fmap.dal.swing.featuretype.FeatureAttributeSelectionPanel;
50
import org.gvsig.fmap.dal.swing.impl.featuretable.SimpleFeaturesTableModel;
51
import org.gvsig.fmap.dal.swing.orderpanel.FeatureStoreOrderPanel;
52
import org.gvsig.fmap.dal.swing.searchpanel.FeatureStoreSearchPanel;
53
import org.gvsig.fmap.dal.swing.searchpanel.SearchConditionPanel;
54
import org.gvsig.fmap.dal.swing.searchpanel.SearchConditionPanel.SearchConditionPanelFactory;
55
import org.gvsig.tools.ToolsLocator;
56
import org.gvsig.tools.dynobject.Tags;
57
import org.gvsig.tools.i18n.I18nManager;
58
import org.gvsig.tools.swing.api.ActionListenerSupport;
59
import org.gvsig.tools.swing.api.ToolsSwingLocator;
60
import org.gvsig.tools.swing.api.ToolsSwingManager;
61
import org.gvsig.tools.swing.api.windowmanager.Dialog;
62
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
63
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
64
import org.gvsig.tools.swing.icontheme.IconTheme;
65
import org.gvsig.tools.util.ToolsUtilLocator;
66
import org.slf4j.Logger;
67
import org.slf4j.LoggerFactory;
68

    
69
/**
70
 *
71
 * @author jjdelcerro
72
 */
73
@SuppressWarnings({"UseSpecificCatch"})
74
public class DefaultSearchPanel
75
        extends DefaultSearchPanelView
76
        implements FeatureStoreSearchPanel {
77

    
78
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultSearchPanel.class);
79
    
80
    static /* friend */ Integer useLabels = null;
81

    
82
    public static class UseLabelsYesAction extends AbstractAction {
83

    
84
        @SuppressWarnings("OverridableMethodCallInConstructor")
85
        public UseLabelsYesAction() {
86
            I18nManager i18n = ToolsLocator.getI18nManager();
87

    
88
            this.putValue(NAME, i18n.getTranslation("_Use_labels"));
89
            this.putValue(ACTION_COMMAND_KEY, "UseLabelsYes");
90
        }
91

    
92
        @Override
93
        public Object getValue(String key) {
94
            if( NAME.equals(key) ) {
95
                // Cuando se registra la accion aun no se han cargado las traducciones
96
                I18nManager i18n = ToolsLocator.getI18nManager();
97
                return i18n.getTranslation("_Use_labels");
98
            }
99
            return super.getValue(key);
100
        }
101

    
102
        @Override
103
        public void actionPerformed(ActionEvent ae) {
104
            DefaultSearchPanel.useLabels = USE_LABELS_YES;
105
        }
106
    }
107
    
108
    public static class UseLabelsNoAction extends AbstractAction {
109

    
110
        @SuppressWarnings("OverridableMethodCallInConstructor")
111
        public UseLabelsNoAction() {
112
            I18nManager i18n = ToolsLocator.getI18nManager();
113
            this.putValue(NAME, i18n.getTranslation("_Use_names"));
114
            this.putValue(ACTION_COMMAND_KEY, "UseLabelsNo");
115
        }
116

    
117
        @Override
118
        public Object getValue(String key) {
119
            if( NAME.equals(key) ) {
120
                // Cuando se registra la accion aun no se han cargado las traducciones
121
                I18nManager i18n = ToolsLocator.getI18nManager();
122
                return i18n.getTranslation("_Use_names");
123
            }
124
            return super.getValue(key);
125
        }
126
       
127
        @Override
128
        public void actionPerformed(ActionEvent ae) {
129
            DefaultSearchPanel.useLabels = USE_LABELS_NO;
130
        }
131
    }
132
    
133
    public static class UseLabelsBothAction extends AbstractAction {
134

    
135
        @SuppressWarnings("OverridableMethodCallInConstructor")
136
        public UseLabelsBothAction() {
137
            I18nManager i18n = ToolsLocator.getI18nManager();
138

    
139
            this.putValue(NAME, i18n.getTranslation("_Use_labels_and_names"));
140
            this.putValue(ACTION_COMMAND_KEY, "UseLabelsBoth");
141
        }
142

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

    
153
        @Override
154
        public void actionPerformed(ActionEvent ae) {
155
            DefaultSearchPanel.useLabels = USE_LABELS_BOTH;
156
        }
157
    }
158
    
159
    
160
    public static class SelectOrderAction extends AbstractAction {
161

    
162
        @SuppressWarnings("OverridableMethodCallInConstructor")
163
        public SelectOrderAction() {
164
            I18nManager i18n = ToolsLocator.getI18nManager();
165

    
166
            this.putValue(NAME, i18n.getTranslation("_Select_order"));
167
            this.putValue(ACTION_COMMAND_KEY, "SelectOrder");
168
        }
169

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

    
180
        @Override
181
        public void actionPerformed(ActionEvent ae) {
182
            DefaultSearchPanel panel = (DefaultSearchPanel) ae.getSource();
183
            panel.doSelectOrder();
184
        }
185
    }
186
    
187
    public static class SelectColumnsAction extends AbstractAction {
188

    
189
        @SuppressWarnings("OverridableMethodCallInConstructor")
190
        public SelectColumnsAction() {
191
            I18nManager i18n = ToolsLocator.getI18nManager();
192

    
193
            this.putValue(NAME, i18n.getTranslation("_Select_columns_to_display"));
194
            this.putValue(ACTION_COMMAND_KEY, "SelectColumns");
195
        }
196

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

    
207
        @Override
208
        public void actionPerformed(ActionEvent ae) {
209
            DefaultSearchPanel panel = (DefaultSearchPanel) ae.getSource();
210
            panel.doSelectResultColumnNames();
211
        }
212
    }
213
    
214
    public static class GroupAction extends AbstractAction {
215

    
216
        @SuppressWarnings("OverridableMethodCallInConstructor")
217
        public GroupAction() {
218
            I18nManager i18n = ToolsLocator.getI18nManager();
219

    
220
            this.putValue(NAME, i18n.getTranslation("_Group"));
221
            this.putValue(ACTION_COMMAND_KEY, "Group");
222
        }
223

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

    
234
        @Override
235
        public void actionPerformed(ActionEvent ae) {
236
            DefaultSearchPanel panel = (DefaultSearchPanel) ae.getSource();
237
            panel.doGroup();
238
        }
239
    }
240
    
241
    
242
    private class ActionButtons {
243
        
244
        private final DALActionFactory factory;
245
        private final Action action;
246
        private final JButton button;
247
        
248
        public ActionButtons(DALActionFactory factory, Action action, JButton button) {
249
            this.factory = factory;
250
            this.action = action;
251
            this.button = button;
252
        }
253
    }
254

    
255
    public static class SearchActionContext extends AbstractDALActionContext {
256

    
257
        private final DefaultSearchPanel panel;
258
        
259
        public SearchActionContext(DefaultSearchPanel panel) {
260
            super(FeatureStoreSearchPanel.ACTION_CONTEXT_NAME);
261
            this.panel = panel;
262
        }
263
        
264
        @Override
265
        public DataStore getStore() {
266
            return this.panel.getStore();
267
        }
268

    
269
        @Override
270
        public Expression getFilter() {
271
            return this.panel.getCurrentSearch();
272
        }
273

    
274
        @Override
275
        public FeatureQueryOrder getOrder() {
276
            return this.panel.getOrder();
277
        }
278

    
279
        @Override
280
        public JComponent getActionButton(String actionName) {
281
            return this.panel.getActionButton(actionName);
282
        }
283
        
284
        @Override
285
        public int getSelectedsCount() {
286
            return this.panel.getSelectedFeatureCount();
287
        }
288
        
289
        @Override
290
        public Expression getFilterForSelecteds() {
291
            return this.panel.getSearchForSelectedFeature();
292
        }
293
    }
294
    
295
    private final FeatureStore store;
296
    private final ActionListenerSupport acctionListeners;
297
    private final Map<String, ActionButtons> actions;
298
    private boolean showActions = true;
299
    private Expression currentSearch;
300
    private FeatureQueryOrder order;
301

    
302
    private List<SearchConditionPanel> conditionPanels;
303
    
304
    private List<String> resultColumnNames; 
305
    
306
    private static final int PANEL_SIMPLIFIED = 0;
307
    private static final int PANEL_ADVANCED = 1;
308
    
309
    
310
    public DefaultSearchPanel(FeatureStore store) {
311
        this.store = store;
312
        this.acctionListeners = ToolsSwingLocator.getToolsSwingManager().createActionListenerSupport();
313
        this.actions = new HashMap<>();        
314
        this.resultColumnNames = new ArrayList<>();
315
        Search search = (Search) ToolsLocator.getComplementsManager().get(
316
                Search.COMPLEMENT_MANE, getFeatureType()
317
        );
318
        List<Search.OrderedAttribute> attributos = search.getOrderedAttributes(
319
                Search.BASIC_TYPES_FILTER,
320
                Search.STR_INT_LONG_LABEL_ORDER,
321
                12
322
        );
323
        for (Search.OrderedAttribute attrdesc : attributos) {
324
            this.resultColumnNames.add(attrdesc.getDescriptor().getName());
325
        }
326
    }
327

    
328
    @Override
329
    public JComponent asJComponent() {
330
        if( this.conditionPanels==null ) {
331
            this.initComponents();
332
        }
333
        return this;
334
    }
335

    
336
    private void addActions() {
337
        if( !this.showActions ) {
338
            return;
339
        }
340
        this.pnlActions.removeAll();
341
        this.pnlActions.setLayout(new FlowLayout(FlowLayout.TRAILING, 8, 4));
342
        SearchActionContext actionContext = new SearchActionContext(this);
343
        Collection<DALActionFactory> factories = DALSwingLocator.getSwingManager().getStoreActions();
344
        for (DALActionFactory factory : factories) {
345
            Action action = factory.createAction(actionContext);
346
            JButton button = new JButton(action);
347
            this.actions.put(factory.getName(), new ActionButtons(factory, action, button));
348
            button.setBorder(BorderFactory.createEmptyBorder());
349
            button.setBorderPainted(false);
350
            button.setFocusPainted(false);
351
            button.setContentAreaFilled(false);
352
            button.setCursor(new Cursor(Cursor.HAND_CURSOR));
353
            this.pnlActions.add(button);
354
        }
355
        this.pnlActions.revalidate();
356
        this.pnlActions.repaint();
357
    }
358

    
359
    @Override
360
    public void addActionListener(ActionListener listener) {
361
        this.acctionListeners.addActionListener(listener);
362
    }
363

    
364
    @Override
365
    public ActionListener[] getActionListeners() {
366
        return this.acctionListeners.getActionListeners();
367
    }
368

    
369
    @Override
370
    public void removeActionListener(ActionListener listener) {
371
        this.acctionListeners.removeActionListener(listener);
372
    }
373

    
374
    @Override
375
    public void removeAllActionListener() {
376
        this.acctionListeners.removeAllActionListener();
377
    }
378

    
379
    @Override
380
    public void fireActionEvent(ActionEvent event) {
381
        this.acctionListeners.fireActionEvent(event);
382
    }
383

    
384
    @Override
385
    public boolean hasActionListeners() {
386
        return this.acctionListeners.hasActionListeners();
387
    }
388

    
389
     private void initComponents() {
390
        this.conditionPanels = new ArrayList<>();
391

    
392
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
393
        swingManager.translate(this.tabSearchMode);
394
        swingManager.translate(this.btnSearch);
395
        swingManager.translate(this.btnClear);
396
        swingManager.translate(this.lblExpressionDeBusqueda);
397
        swingManager.translate(this.btnAddAccumulatedFilter);
398
        swingManager.translate(this.btnRemoveAccumulatedFilter);
399
        swingManager.translate(this.btnViewAccumulatedFilter);
400
                
401
        ConfigurableActionsMamager cfgActionsManager = ToolsUtilLocator.getConfigurableActionsMamager();
402
        JComponent c = cfgActionsManager.getConfigurableActionsComponent(CONFIGURABLE_PANEL_ID, this);
403
        this.pnlCfgActions.setLayout(new BorderLayout(0,0));
404
        this.pnlCfgActions.add(c, BorderLayout.CENTER);
405
                
406
        this.conditionPanels.add(
407
            new SearchConditionPanelSimplified(
408
                store,
409
                btnAddAccumulatedFilter,
410
                btnRemoveAccumulatedFilter,
411
                btnViewAccumulatedFilter,
412
                lblField1,
413
                lblExtraFields1,
414
                lblRelationalOperator1,
415
                cboValue1,
416
                lblLogicalOperators1,
417
                lblField2,
418
                lblExtraFields2,
419
                lblRelationalOperator2,
420
                cboValue2,
421
                lblLogicalOperators2,
422
                lblField3,
423
                lblExtraFields3,
424
                lblRelationalOperator3,
425
                cboValue3,
426
                lblLogicalOperators3,
427
                lblField4,
428
                lblExtraFields4,
429
                lblRelationalOperator4,
430
                cboValue4,
431
                null
432
            )
433
        );
434
        this.conditionPanels.add(
435
            new SearchConditionPanelAdvanced(
436
                this.store,
437
                txtAdvancedExpression, 
438
                btnAdvancedExpression,
439
                btnAdvancedExpressionHistory,
440
                btnAdvancedExpressionBookmarks
441
            )
442
        );
443
        for (SearchConditionPanelFactory factory : DALSwingLocator.getManager().getSearchConditionPanels()) {
444
          if( factory.isApplicable(store) ) {
445
            this.conditionPanels.add(factory.create(this));
446
          }
447
        }
448
        
449
        this.btnSearch.addActionListener(new ActionListener() {
450
            @Override
451
            public void actionPerformed(ActionEvent e) {
452
                doSearch();
453
            }
454
        });
455

    
456
        this.tblResults.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
457
            @Override
458
            public void valueChanged(ListSelectionEvent e) {
459
                for (ActionButtons actionButton : actions.values()) {
460
                    if( actionButton.action instanceof ListSelectionListener) {
461
                        ((ListSelectionListener) actionButton.action).valueChanged(e);
462
                    }
463
                }
464
            }
465
        });
466
        this.btnClear.addActionListener(new ActionListener() {
467
            @Override
468
            public void actionPerformed(ActionEvent e) {
469
                clear();
470
            }
471
        });
472
        addActions();
473
        this.setPreferredSize(new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT));
474

    
475
        doSearch(null,null);
476
    }
477

    
478
    private FeatureType getFeatureType() {
479
      try {
480
        return store.getDefaultFeatureType();
481
      } catch (Exception ex) {
482
        throw new RuntimeException("Can't retrieve the feature type.", ex);
483
      }
484
    }
485
    
486
    @Override
487
    public void setEnabled(boolean enabled) {
488
        if( this.conditionPanels==null ) {
489
            this.initComponents();
490
        }
491
        for (SearchConditionPanel conditionPanel : conditionPanels) {
492
          conditionPanel.setEnabled(enabled);
493
        }
494
        
495
        this.btnClear.setEnabled(enabled);
496
        this.btnSearch.setEnabled(enabled);
497
        for (ActionButtons actionButton : actions.values()) {
498
            actionButton.action.setEnabled(enabled);
499
        }
500
    }
501

    
502
    public void clear() {
503
        if( this.conditionPanels==null ) {
504
            return;
505
        }
506
        for (SearchConditionPanel conditionPanel : conditionPanels) {
507
          conditionPanel.clear();
508
        }
509
    }
510

    
511
    @Override
512
    public FeatureQueryOrder getOrder() {
513
        return this.order;
514
    }
515

    
516
    @Override
517
    public Expression getFilter() {
518
        Expression filter;
519
        int searchMode = this.tabSearchMode.getSelectedIndex();
520
        SearchConditionPanel panel = this.conditionPanels.get(searchMode);
521
        filter = panel.get();
522
        if( searchMode!=PANEL_ADVANCED ) {
523
          this.conditionPanels.get(PANEL_ADVANCED).set(filter);
524
        }
525
        if (ExpressionUtils.isPhraseEmpty(filter)) {
526
            return null;
527
        }
528
        return filter;
529
    }
530
    
531
    private void doSearch() {
532
        Expression filter = this.getFilter();
533
        FeatureQueryOrder theOrder = this.getOrder();
534
        if( theOrder!=null ) {
535
            doSearch(filter,theOrder.toString());
536
        } else {
537
            doSearch(filter,null);
538
        }
539
    }
540

    
541
    private void doSearch(final Expression exp, String order) {
542
        final MutableObject model = new MutableObject(null);
543
        
544
        lblMsg.setText("Searching...");
545
        setEnabled(false);
546
        Thread th = new Thread(new Runnable() {
547
            @Override
548
            public void run() {
549
                try {
550
                    final List<Feature> features;
551
                    features = store.getFeatures(exp,order);
552
                    currentSearch = exp;
553
                    model.setValue( new SimpleFeaturesTableModel(
554
                            getFeatureType(),
555
                            resultColumnNames,
556
                            features
557
                        )
558
                    );
559
                } catch (Exception ex) {
560
                    LOGGER.warn("Can't get features or create table model",ex);
561
                } finally {
562
                    SwingUtilities.invokeLater(new Runnable() {
563
                        @Override
564
                        public void run() {
565
                            I18nManager i18n = ToolsLocator.getI18nManager();
566
                            TableModel m = (TableModel) model.getValue();
567
                            tblResults.setModel(m);
568
                            lblMsg.setText(String.format("%d "+i18n.getTranslation("_elements"), m.getRowCount()));
569
                            setEnabled(true);
570
                        }
571
                    });
572
                }
573
            }
574
        });
575
        th.start();
576
    }
577

    
578
    public void setResultColumnNames(List<String> names) {
579
      resultColumnNames.clear();
580
      resultColumnNames.addAll(names);
581
      if( this.conditionPanels==null ) {
582
        return;
583
      }
584
      SimpleFeaturesTableModel model = (SimpleFeaturesTableModel) this.tblResults.getModel();
585
      List<Feature> features = model.getFeatures();
586
      model = new SimpleFeaturesTableModel(
587
          getFeatureType(),
588
          resultColumnNames,
589
          features
590
      );
591
      tblResults.setModel(model);
592
    }
593
    
594
    @Override
595
    public Expression getCurrentSearch() {
596
        return this.currentSearch;
597
    }
598

    
599
    @Override
600
    public boolean setFilter(Expression filter) {
601
        try {
602
            if( this.conditionPanels==null ) {
603
                this.initComponents();
604
            }
605
            if( ExpressionUtils.isPhraseEmpty(filter) ) {
606
              this.clear();
607
              return true;
608
            }
609
            int panel = 0;
610
            int selected = PANEL_ADVANCED;
611
            for (SearchConditionPanel conditionPanel : conditionPanels) {
612
              if( panel!=PANEL_ADVANCED && conditionPanel.set(filter) ) {
613
                selected = panel;
614
              }
615
              panel++;
616
            }
617
            this.tabSearchMode.setSelectedIndex(selected);
618
            
619
            SimpleFeaturesTableModel model = new SimpleFeaturesTableModel(this.getStore());
620
            tblResults.setModel(model);
621
            lblMsg.setText("");
622
            return true;
623
        } catch(Exception ex) {
624
            LOGGER.warn("Can't set current search", ex);
625
            return false;
626
        }
627
    }
628

    
629
    @Override
630
    public List<SearchConditionPanel> getConditionPanels() {
631
      return Collections.unmodifiableList(this.conditionPanels);
632
    }
633
    
634
    @Override
635
    public void setCurrentSearch(Expression filter) {
636
        if( this.setFilter(filter) ) {
637
            doSearch();
638
        }
639
    }
640
    
641
    @Override
642
    public Expression getSearchForSelectedFeature() {
643
        if( this.conditionPanels==null ) {
644
            return null;
645
        }
646
        int selectedRow = this.tblResults.getSelectedRow();
647
        if (selectedRow < 0) {
648
            return null;
649
        }
650
        try {
651
            List<Feature> features = ((SimpleFeaturesTableModel) this.tblResults.getModel()).getFeatures();
652
            Feature feature = features.get(selectedRow);
653
            
654
            ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
655
            FeatureType ftype = this.store.getDefaultFeatureType();
656
            for (FeatureAttributeDescriptor attrdesc : ftype.getPrimaryKey()) {
657
                builder.and(
658
                        builder.eq(
659
                                builder.column(attrdesc.getName()),
660
                                builder.constant(feature.get(attrdesc.getName()))
661
                        )
662
                );
663
            }
664
            Expression filter = ExpressionUtils.createExpression(builder.toString());
665
            return filter;
666
        } catch (Exception ex) {
667
            LOGGER.warn("Can't build search for the selected feature.", ex);
668
            return null;
669
        }
670
    }
671

    
672
    @Override
673
    public FeatureStore getStore() {
674
        return store;
675
    }
676

    
677
    private void doSelectOrder() {
678
        I18nManager i18n = ToolsLocator.getI18nManager();
679
        WindowManager_v2 windowManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
680
        FeatureStoreOrderPanel orderPanel = DALSwingLocator.getDataSwingManager().createFeatureStoreOrderPanel();
681
        orderPanel.setStore(store);
682
        orderPanel.setOrder(order);
683
        Dialog dialog = windowManager.createDialog(
684
                orderPanel.asJComponent(),
685
                i18n.getTranslation("_Select_order"),
686
                null, 
687
                WindowManager_v2.BUTTONS_OK_CANCEL
688
        );
689
        dialog.addActionListener(new ActionListener() {
690
            @Override
691
            public void actionPerformed(ActionEvent e) {
692
                if( dialog.getAction()==WindowManager_v2.BUTTON_OK ) {
693
                    order = orderPanel.getOrder();
694
                    doSearch();
695
                }
696
            }
697
        });
698
        dialog.show(WindowManager.MODE.DIALOG);
699
        
700
    }
701
    
702
    @Override
703
    public ImageIcon loadImage(String imageName) {
704
        String name = FilenameUtils.getBaseName(imageName);
705
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getDefault();
706
        if (theme.exists(name)) {
707
            return theme.get(name);
708
        }
709
        URL url = this.getClass().getResource(name + ".png");
710
        if (url == null) {
711
            return null;
712
        }
713
        return new ImageIcon(url);
714
    }
715

    
716
    public static void selfRegister() {
717
        String[][] iconNames = new String[][]{
718
            new String[]{"dalswing", "featurestore-column"},
719
            new String[]{"dalswing", "featurestore-foreing-key"},
720
            new String[]{"dalswing", "featurestore-table"},
721
            new String[]{"dalswing", "search-action-showform"},
722
            new String[]{"dalswing", "search-action-select"},
723
            new String[]{"dalswing", "search-action-select-add"},
724
            new String[]{"dalswing", "search-action-select-filter"}
725
        };
726
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
727
        for (String[] icon : iconNames) {
728
            URL url = DefaultSearchPanel.class.getResource(icon[1] + ".png");
729
            theme.registerDefault("DALSwing", icon[0], icon[1], null, url);
730
        }
731

    
732
        ConfigurableActionsMamager cfgActionsManager = ToolsUtilLocator.getConfigurableActionsMamager();
733
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new UseLabelsYesAction());
734
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new UseLabelsNoAction());
735
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new UseLabelsBothAction());
736
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new SelectOrderAction());
737
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new SelectColumnsAction());
738
//        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new GroupAction());
739
    }
740

    
741
    @Override
742
    public int getSelectedFeatureCount() {
743
        if( this.conditionPanels==null ) {
744
            return 0;
745
        }
746
        return this.tblResults.getSelectedRowCount();
747
    }
748
    
749
    @Override
750
    public JComponent getActionButton(String name) {
751
        ActionButtons actionButton = this.actions.get(name);
752
        if( actionButton==null ) {
753
            return null;
754
        }
755
        return actionButton.button;
756
    }
757

    
758
    @Override
759
    public void setShowActions(boolean showActions) {
760
        this.showActions = showActions;
761
    }
762
    
763
    @Override
764
    public boolean isShowActions() {
765
        return this.showActions;
766
    }
767

    
768
    public static String getAttributeDescriptorLabel(FeatureAttributeDescriptor attrdesc, String tableName) {
769
        String theLabel;
770
        int theUseLabels;
771
        if( useLabels == null ) {
772
            Tags tags = attrdesc.getTags();
773
            if( tags.has(DAL_USE_LABELS) ) {
774
                theUseLabels = tags.getInt(DAL_USE_LABELS, USE_LABELS_NO);
775
            } else {
776
                tags = attrdesc.getFeatureType().getTags();
777
                theUseLabels = tags.getInt(DAL_USE_LABELS, USE_LABELS_NO);
778
            }
779
        } else {
780
            theUseLabels = useLabels;
781
        }
782
        switch(theUseLabels) {
783
            case USE_LABELS_YES:
784
                if( StringUtils.isBlank(tableName) ) {
785
                    theLabel = attrdesc.getLocalizedLabel();
786
                } else {
787
                    theLabel = String.format("%s [%s]", attrdesc.getLocalizedLabel(), tableName);
788
                }
789
                break;
790
            default:
791
            case USE_LABELS_NO:
792
                if( StringUtils.isBlank(tableName) ) {
793
                    theLabel = attrdesc.getName();
794
                } else {
795
                    theLabel = String.format("%s [%s]", attrdesc.getName(), tableName);
796
                }
797
                break;
798
            case USE_LABELS_BOTH:
799
                if( StringUtils.isBlank(tableName) ) {
800
                    theLabel = String.format("%s [%s]", attrdesc.getLocalizedLabel(), attrdesc.getName());
801
                } else {
802
                    theLabel = String.format("%s [%s/%s]", attrdesc.getLocalizedLabel(), attrdesc.getName(), tableName);
803
                }
804
                break;
805
        }
806
        return theLabel;
807
    }
808
     
809
    private void doGroup() {
810
      // FIXME
811
    }
812

    
813
    private void doSelectResultColumnNames() {
814
      WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
815
      I18nManager i18n = ToolsLocator.getI18nManager();
816
      final FeatureAttributeSelectionPanel panel = DALSwingLocator.getManager().createFeatureAttributeSelectionPanel();
817
      panel.setFeatureType(this.getFeatureType());
818
      panel.setSelectedNames(this.resultColumnNames);
819
      final Dialog dialog = winmanager.createDialog(
820
              panel.asJComponent(),
821
              i18n.getTranslation("_Select_the_columns_to_display"),
822
              null, 
823
              WindowManager_v2.BUTTONS_OK_CANCEL
824
      );
825
      dialog.addActionListener((ActionEvent e) -> {
826
        if( dialog.getAction()==WindowManager_v2.BUTTONS_OK ) {
827
           this.setResultColumnNames(panel.getSelectedNames());
828
        }
829
      });
830
      dialog.show(WindowManager.MODE.DIALOG);
831
    }
832

    
833
}