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

History | View | Annotate | Download (27.9 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.HashMap;
13
import java.util.List;
14
import java.util.Map;
15
import javax.swing.AbstractAction;
16
import javax.swing.Action;
17
import static javax.swing.Action.ACTION_COMMAND_KEY;
18
import static javax.swing.Action.NAME;
19
import javax.swing.BorderFactory;
20
import javax.swing.ImageIcon;
21
import javax.swing.JButton;
22
import javax.swing.JComponent;
23
import javax.swing.SwingUtilities;
24
import javax.swing.event.ListSelectionEvent;
25
import javax.swing.event.ListSelectionListener;
26
import javax.swing.table.TableModel;
27
import org.apache.commons.io.FilenameUtils;
28
import org.apache.commons.lang.mutable.MutableObject;
29
import org.apache.commons.lang3.StringUtils;
30
import org.gvsig.configurableactions.ConfigurableActionsMamager;
31
import org.gvsig.expressionevaluator.Code;
32
import org.gvsig.expressionevaluator.Expression;
33
import org.gvsig.expressionevaluator.ExpressionBuilder;
34
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_AND;
35
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_OR;
36
import org.gvsig.expressionevaluator.ExpressionUtils;
37
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
38
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
39
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
40
import static org.gvsig.fmap.dal.DataManager.DAL_USE_LABELS;
41
import static org.gvsig.fmap.dal.DataManager.USE_LABELS_BOTH;
42
import static org.gvsig.fmap.dal.DataManager.USE_LABELS_NO;
43
import static org.gvsig.fmap.dal.DataManager.USE_LABELS_YES;
44
import org.gvsig.fmap.dal.DataStore;
45
import org.gvsig.fmap.dal.complements.Search;
46
import org.gvsig.fmap.dal.exception.DataException;
47
import org.gvsig.fmap.dal.feature.Feature;
48
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
49
import org.gvsig.fmap.dal.feature.FeatureQueryOrder;
50
import org.gvsig.fmap.dal.feature.FeatureStore;
51
import org.gvsig.fmap.dal.feature.FeatureType;
52
import org.gvsig.fmap.dal.swing.AbstractDALActionFactory.AbstractDALActionContext;
53
import org.gvsig.fmap.dal.swing.DALActionFactory;
54
import org.gvsig.fmap.dal.swing.DALSwingLocator;
55
import org.gvsig.fmap.dal.swing.impl.featuretable.SimpleFeaturesTableModel;
56
import org.gvsig.fmap.dal.swing.orderpanel.FeatureStoreOrderPanel;
57
import org.gvsig.fmap.dal.swing.searchpanel.FeatureStoreSearchPanel;
58
import org.gvsig.tools.ToolsLocator;
59
import org.gvsig.tools.dynobject.Tags;
60
import org.gvsig.tools.i18n.I18nManager;
61
import org.gvsig.tools.swing.api.ActionListenerSupport;
62
import org.gvsig.tools.swing.api.ToolsSwingLocator;
63
import org.gvsig.tools.swing.api.ToolsSwingManager;
64
import org.gvsig.tools.swing.api.windowmanager.Dialog;
65
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
66
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
67
import org.gvsig.tools.swing.icontheme.IconTheme;
68
import org.gvsig.tools.util.ToolsUtilLocator;
69
import org.slf4j.Logger;
70
import org.slf4j.LoggerFactory;
71

    
72
/**
73
 *
74
 * @author jjdelcerro
75
 */
76
@SuppressWarnings({"UseSpecificCatch","Convert2Lambda"})
77
public class DefaultSearchPanel
78
        extends DefaultSearchPanelView
79
        implements FeatureStoreSearchPanel {
80

    
81
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultSearchPanel.class);
82
    
83
    static /* friend */ Integer useLabels = null;
84
    
85
    public static class UseLabelsYesAction extends AbstractAction {
86

    
87
        @SuppressWarnings("OverridableMethodCallInConstructor")
88
        public UseLabelsYesAction() {
89
            I18nManager i18n = ToolsLocator.getI18nManager();
90

    
91
            this.putValue(NAME, i18n.getTranslation("_Use_labels"));
92
            this.putValue(ACTION_COMMAND_KEY, "UseLabelsYes");
93
        }
94

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

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

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

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

    
138
        @SuppressWarnings("OverridableMethodCallInConstructor")
139
        public UseLabelsBothAction() {
140
            I18nManager i18n = ToolsLocator.getI18nManager();
141

    
142
            this.putValue(NAME, i18n.getTranslation("_Use_labels_and_names"));
143
            this.putValue(ACTION_COMMAND_KEY, "UseLabelsBoth");
144
        }
145

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

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

    
165
        @SuppressWarnings("OverridableMethodCallInConstructor")
166
        public SelectOrderAction() {
167
            I18nManager i18n = ToolsLocator.getI18nManager();
168

    
169
            this.putValue(NAME, i18n.getTranslation("_Select_order"));
170
            this.putValue(ACTION_COMMAND_KEY, "SelectOrder");
171
        }
172

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

    
183
        @Override
184
        public void actionPerformed(ActionEvent ae) {
185
            DefaultSearchPanel panel = (DefaultSearchPanel) ae.getSource();
186
            panel.doSelectOrder();
187
        }
188
    }
189
    
190
    
191
    private class ActionButtons {
192
        
193
        private final DALActionFactory factory;
194
        private final Action action;
195
        private final JButton button;
196
        
197
        public ActionButtons(DALActionFactory factory, Action action, JButton button) {
198
            this.factory = factory;
199
            this.action = action;
200
            this.button = button;
201
        }
202
    }
203

    
204
    public static class SearchActionContext extends AbstractDALActionContext {
205

    
206
        private final DefaultSearchPanel panel;
207
        
208
        public SearchActionContext(DefaultSearchPanel panel) {
209
            super(FeatureStoreSearchPanel.ACTION_CONTEXT_NAME);
210
            this.panel = panel;
211
        }
212
        
213
        @Override
214
        public DataStore getStore() {
215
            return this.panel.getStore();
216
        }
217

    
218
        @Override
219
        public Expression getFilter() {
220
            return this.panel.getCurrentSearch();
221
        }
222

    
223
        @Override
224
        public FeatureQueryOrder getOrder() {
225
            return this.panel.getOrder();
226
        }
227

    
228
        @Override
229
        public JComponent getActionButton(String actionName) {
230
            return this.panel.getActionButton(actionName);
231
        }
232
        
233
        @Override
234
        public int getSelectedsCount() {
235
            return this.panel.getSelectedFeatureCount();
236
        }
237
        
238
        @Override
239
        public Expression getFilterForSelecteds() {
240
            return this.panel.getSearchForSelectedFeature();
241
        }
242
    }
243
    
244
    private final FeatureStore store;
245
    private final ActionListenerSupport acctionListeners;
246
    private List<SearchFieldController> searchFields;
247
    private ExpressionPickerController advancedExpression;
248
    private final Map<String, ActionButtons> actions;
249
    private boolean showActions = true;
250
    private int maxSearhFields = 4;
251
    private final I18nManager i18n = ToolsLocator.getI18nManager();
252
    private Expression currentSearch;
253
    private FeatureQueryOrder order;
254

    
255
    public DefaultSearchPanel(FeatureStore store) {
256
        this.store = store;
257
        this.acctionListeners = ToolsSwingLocator.getToolsSwingManager().createActionListenerSupport();
258
        this.searchFields = null;
259
        this.actions = new HashMap<>();
260
    }
261

    
262
    @Override
263
    public JComponent asJComponent() {
264
        if( this.searchFields==null ) {
265
            this.initComponents();
266
        }
267
        return this;
268
    }
269

    
270
    private void addActions() {
271
        if( !this.showActions ) {
272
            return;
273
        }
274
        this.pnlActions.removeAll();
275
        this.pnlActions.setLayout(new FlowLayout(FlowLayout.TRAILING, 8, 4));
276
        SearchActionContext actionContext = new SearchActionContext(this);
277
        Collection<DALActionFactory> factories = DALSwingLocator.getSwingManager().getStoreActions();
278
        for (DALActionFactory factory : factories) {
279
            Action action = factory.createAction(actionContext);
280
            JButton button = new JButton(action);
281
            this.actions.put(factory.getName(), new ActionButtons(factory, action, button));
282
            button.setBorder(BorderFactory.createEmptyBorder());
283
            button.setBorderPainted(false);
284
            button.setFocusPainted(false);
285
            button.setContentAreaFilled(false);
286
            button.setCursor(new Cursor(Cursor.HAND_CURSOR));
287
            this.pnlActions.add(button);
288
        }
289
        this.pnlActions.revalidate();
290
        this.pnlActions.repaint();
291
    }
292

    
293
    @Override
294
    public void addActionListener(ActionListener listener) {
295
        this.acctionListeners.addActionListener(listener);
296
    }
297

    
298
    @Override
299
    public ActionListener[] getActionListeners() {
300
        return this.acctionListeners.getActionListeners();
301
    }
302

    
303
    @Override
304
    public void removeActionListener(ActionListener listener) {
305
        this.acctionListeners.removeActionListener(listener);
306
    }
307

    
308
    @Override
309
    public void removeAllActionListener() {
310
        this.acctionListeners.removeAllActionListener();
311
    }
312

    
313
    @Override
314
    public void fireActionEvent(ActionEvent event) {
315
        this.acctionListeners.fireActionEvent(event);
316
    }
317

    
318
    @Override
319
    public boolean hasActionListeners() {
320
        return this.acctionListeners.hasActionListeners();
321
    }
322

    
323
    private void initComponents() {
324
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
325
        swingManager.translate(this.tabSearchMode);
326
        swingManager.translate(this.btnSearch);
327
        swingManager.translate(this.btnClear);
328
        swingManager.translate(this.lblExpressionDeBusqueda);
329
                
330
        ConfigurableActionsMamager cfgActionsManager = ToolsUtilLocator.getConfigurableActionsMamager();
331
        JComponent c = cfgActionsManager.getConfigurableActionsComponent(CONFIGURABLE_PANEL_ID, this);
332
        this.pnlCfgActions.setLayout(new BorderLayout(0,0));
333
        this.pnlCfgActions.add(c, BorderLayout.CENTER);
334
        
335
        this.searchFields = new ArrayList<>();
336
        SearchFieldController controller = new SearchFieldController(
337
                store,
338
                lblField1,
339
                lblExtraFields1,
340
                lblRelationalOperator1,
341
                cboValue1,
342
                lblLogicalOperators1
343
        );
344
        this.searchFields.add(controller);
345
        controller = new SearchFieldController(
346
                store,
347
                lblField2,
348
                lblExtraFields2,
349
                lblRelationalOperator2,
350
                cboValue2,
351
                lblLogicalOperators2
352
        );
353
        this.searchFields.add(controller);
354
        controller = new SearchFieldController(
355
                store,
356
                lblField3,
357
                lblExtraFields3,
358
                lblRelationalOperator3,
359
                cboValue3,
360
                lblLogicalOperators3
361
        );
362
        this.searchFields.add(controller);
363
        controller = new SearchFieldController(
364
                store,
365
                lblField4,
366
                lblExtraFields4,
367
                lblRelationalOperator4,
368
                cboValue4,
369
                null
370
        );
371
        this.searchFields.add(controller);
372
        try {
373
            Search search = (Search) ToolsLocator.getComplementsManager().get(
374
                    Search.COMPLEMENT_MANE, this.store.getDefaultFeatureType()
375
            );
376
            List<Search.OrderedAttribute> orderedAttributes = search.getOrderedAttributes(
377
                    Search.BASIC_TYPES_FILTER,
378
                    Search.STR_INT_LONG_LABEL_ORDER,
379
                    5
380
            );
381
            this.maxSearhFields = Integer.min(orderedAttributes.size(), 4);
382
            int n = 0;
383
            for (SearchFieldController searchField : searchFields) {
384
                if( n<this.maxSearhFields ) {
385
                    searchField.setAttribute(orderedAttributes.get(n++).getDescriptor().getName());
386
                } else {
387
                    searchField.setEnabled(false);
388
                }
389
            }
390
        } catch (DataException ex) {
391
            LOGGER.warn("Can't determine order of attributes", ex);
392
        }
393

    
394
        ExpressionEvaluatorSwingManager expressionSwingManager = ExpressionEvaluatorSwingLocator.getManager();
395
        this.advancedExpression = expressionSwingManager.createExpressionPickerController(
396
                txtAdvancedExpression, 
397
                btnAdvancedExpression,
398
                btnAdvancedExpressionHistory,
399
                btnAdvancedExpressionBookmarks
400
        );
401
        this.advancedExpression.addElement(
402
            DALSwingLocator.getSwingManager().createFeatureStoreElement(store)
403
        );
404

    
405
        this.btnSearch.addActionListener(new ActionListener() {
406
            @Override
407
            public void actionPerformed(ActionEvent e) {
408
                doSearch();
409
            }
410
        });
411

    
412
        this.tblResults.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
413
            @Override
414
            public void valueChanged(ListSelectionEvent e) {
415
                for (ActionButtons actionButton : actions.values()) {
416
                    if( actionButton.action instanceof ListSelectionListener) {
417
                        ((ListSelectionListener) actionButton.action).valueChanged(e);
418
                    }
419
                }
420
            }
421
        });
422
        this.btnClear.addActionListener(new ActionListener() {
423
            @Override
424
            public void actionPerformed(ActionEvent e) {
425
                clear();
426
            }
427
        });
428
        addActions();
429
        this.setPreferredSize(new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT));
430

    
431
        doSearch(null,null);
432
    }
433

    
434
    @Override
435
    public void setEnabled(boolean enabled) {
436
        if( this.searchFields==null ) {
437
            initComponents();
438
        }
439
        int n=0;
440
        for (SearchFieldController searchField : searchFields) {
441
            if( n<this.maxSearhFields ) {
442
                searchField.setEnabled(enabled);
443
            } else {
444
                searchField.setEnabled(false);
445
            }
446
            n++;
447
        }
448
        this.btnClear.setEnabled(enabled);
449
        this.btnSearch.setEnabled(enabled);
450
        this.advancedExpression.setEnabled(enabled);
451
        for (ActionButtons actionButton : actions.values()) {
452
            actionButton.action.setEnabled(enabled);
453
        }
454
    }
455

    
456
    public void clear() {
457
        if( this.searchFields==null ) {
458
            return;
459
        }
460
        for (SearchFieldController searchField : searchFields) {
461
            searchField.clear();
462
        }
463
        this.advancedExpression.set(null);
464
    }
465

    
466
    @Override
467
    public FeatureQueryOrder getOrder() {
468
        return this.order;
469
    }
470

    
471
    @Override
472
    public Expression getFilter() {
473
        Expression filter;
474
        int searchMode = this.tabSearchMode.getSelectedIndex();
475
        if (searchMode == 1) { // Avanzada
476
            filter = this.advancedExpression.get();
477
        } else {
478
            ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
479
            String relational = OPERATOR_OR;
480
            for (SearchFieldController searchField : searchFields) {
481
                if (searchField.getAttribute() != null && searchField.getValue() != null) {
482
                    ExpressionBuilder.BinaryOperator cond = builder.binaryOperator(
483
                            searchField.getRelationalOperator(),
484
                            searchField.isAttributeAnExpression()
485
                            ? builder.custom(searchField.getAttribute())
486
                            : builder.column(searchField.getAttribute()),
487
                            builder.constant(searchField.getValue())
488
                    );
489
                    if (relational.equals(OPERATOR_AND)) {
490
                        builder.and(cond);
491
                    } else {
492
                        builder.or(cond);
493
                    }
494
                    relational = searchField.getLogicalOperator();
495
                }
496
            }
497
            if (builder.isEmpty()) {
498
                filter = null;
499
            } else {
500
                filter = ExpressionUtils.createExpression(builder.toString());
501
            }
502
        }
503
        if (ExpressionUtils.isPhraseEmpty(filter)) {
504
            return null;
505
        }
506
        return filter;
507
    }
508
    
509
    private void doSearch() {
510
        Expression filter = this.getFilter();
511
        FeatureQueryOrder theOrder = this.getOrder();
512
        if( theOrder!=null ) {
513
            doSearch(filter,theOrder.toString());
514
        } else {
515
            doSearch(filter,null);
516
        }
517
    }
518

    
519
    private void doSearch(final Expression exp, String order) {
520
        final MutableObject model = new MutableObject(null);
521
        
522
        lblMsg.setText("Searching...");
523
        setEnabled(false);
524
        Thread th = new Thread(new Runnable() {
525
            @Override
526
            public void run() {
527
                try {
528
                    final List<Feature> features;
529
                    features = store.getFeatures(exp,order);
530
                    currentSearch = exp;
531
                    model.setValue( new SimpleFeaturesTableModel(
532
                            store.getDefaultFeatureType(),
533
                            null,
534
                            features
535
                        )
536
                    );
537
                } catch (DataException ex) {
538
                    LOGGER.warn("Can't get features or create table model",ex);
539
                } finally {
540
                    SwingUtilities.invokeLater(new Runnable() {
541
                        @Override
542
                        public void run() {
543
                            TableModel m = (TableModel) model.getValue();
544
                            tblResults.setModel(m);
545
                            lblMsg.setText(String.format("%d "+i18n.getTranslation("_elements"), m.getRowCount()));
546
                            setEnabled(true);
547
                        }
548
                    });
549
                }
550
            }
551
        });
552
        th.start();
553
    }
554

    
555
    @Override
556
    public Expression getCurrentSearch() {
557
        return this.currentSearch;
558
    }
559

    
560
    @Override
561
    public boolean setFilter(Expression filter) {
562
        try {
563
            if( this.advancedExpression==null ) {
564
                this.initComponents();
565
            }
566
            if( ExpressionUtils.isPhraseEmpty(filter) ) {
567
                this.clear();
568
                return true;
569
            }
570
            this.advancedExpression.set(filter);
571
            this.tabSearchMode.setSelectedIndex(1);
572
            
573
            Code code = filter.getCode();
574
            if( code.code()==Code.CALLER) {
575
                SearchFieldController searchField = this.searchFields.get(0);
576
                Code.Caller caller = (Code.Caller)code;
577
                if( searchField.isAValidRelationOperator(caller.name())) {
578
                    Code op1 = caller.parameters().get(0);
579
                    Code op2 = caller.parameters().get(1);
580
                    if( op1.code()==Code.IDENTIFIER && op2.code()==Code.CONSTANT ) {
581
                        if( searchField.setAttribute(((Code.Identifier)op1).name())>=0 ) {
582
                            searchField.setRelationalOperator(caller.name());
583
                            searchField.setValue(((Code.Constant)op2).value());
584
                            this.tabSearchMode.setSelectedIndex(0);
585
                        }
586
                    }
587
                }
588
            }
589
            SimpleFeaturesTableModel model = new SimpleFeaturesTableModel(this.getStore());
590
            tblResults.setModel(model);
591
            lblMsg.setText("");
592
            return true;
593
        } catch(Exception ex) {
594
            LOGGER.warn("Can't set current search", ex);
595
            return false;
596
        }
597
    }
598
   
599
    @Override
600
    public void setCurrentSearch(Expression filter) {
601
        if( this.setFilter(filter) ) {
602
            doSearch();
603
        }
604
    }
605
    
606
    @Override
607
    public Expression getSearchForSelectedFeature() {
608
        if( this.searchFields==null ) {
609
            return null;
610
        }
611
        int selectedRow = this.tblResults.getSelectedRow();
612
        if (selectedRow < 0) {
613
            return null;
614
        }
615
        try {
616
            List<Feature> features = ((SimpleFeaturesTableModel) this.tblResults.getModel()).getFeatures();
617
            Feature feature = features.get(selectedRow);
618
            
619
            ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
620
            FeatureType ftype = this.store.getDefaultFeatureType();
621
            for (FeatureAttributeDescriptor attrdesc : ftype.getPrimaryKey()) {
622
                builder.and(
623
                        builder.eq(
624
                                builder.column(attrdesc.getName()),
625
                                builder.constant(feature.get(attrdesc.getName()))
626
                        )
627
                );
628
            }
629
            Expression filter = ExpressionUtils.createExpression(builder.toString());
630
            return filter;
631
        } catch (Exception ex) {
632
            LOGGER.warn("Can't build search for the selected feature.", ex);
633
            return null;
634
        }
635
    }
636

    
637
    @Override
638
    public FeatureStore getStore() {
639
        return store;
640
    }
641

    
642
    private void doSelectOrder() {
643
        WindowManager_v2 windowManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
644
        FeatureStoreOrderPanel orderPanel = DALSwingLocator.getDataSwingManager().createFeatureStoreOrderPanel();
645
        orderPanel.setStore(store);
646
        orderPanel.setOrder(order);
647
        Dialog dialog = windowManager.createDialog(
648
                orderPanel.asJComponent(),
649
                i18n.getTranslation("_Select_order"),
650
                null, 
651
                WindowManager_v2.BUTTONS_OK_CANCEL
652
        );
653
        dialog.addActionListener(new ActionListener() {
654
            @Override
655
            public void actionPerformed(ActionEvent e) {
656
                if( dialog.getAction()==WindowManager_v2.BUTTON_OK ) {
657
                    order = orderPanel.getOrder();
658
                    doSearch();
659
                }
660
            }
661
        });
662
        dialog.show(WindowManager.MODE.DIALOG);
663
        
664
    }
665
    
666
    @Override
667
    public ImageIcon loadImage(String imageName) {
668
        String name = FilenameUtils.getBaseName(imageName);
669
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getDefault();
670
        if (theme.exists(name)) {
671
            return theme.get(name);
672
        }
673
        URL url = this.getClass().getResource(name + ".png");
674
        if (url == null) {
675
            return null;
676
        }
677
        return new ImageIcon(url);
678
    }
679

    
680
    public static void selfRegister() {
681
        String[][] iconNames = new String[][]{
682
            new String[]{"dalswing", "featurestore-column"},
683
            new String[]{"dalswing", "featurestore-foreing-key"},
684
            new String[]{"dalswing", "featurestore-table"},
685
            new String[]{"dalswing", "search-action-showform"},
686
            new String[]{"dalswing", "search-action-select"},
687
            new String[]{"dalswing", "search-action-select-add"},
688
            new String[]{"dalswing", "search-action-select-filter"}
689
        };
690
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
691
        for (String[] icon : iconNames) {
692
            URL url = DefaultSearchPanel.class.getResource(icon[1] + ".png");
693
            theme.registerDefault("DALSwing", icon[0], icon[1], null, url);
694
        }
695

    
696
        ConfigurableActionsMamager cfgActionsManager = ToolsUtilLocator.getConfigurableActionsMamager();
697
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new UseLabelsYesAction());
698
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new UseLabelsNoAction());
699
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new UseLabelsBothAction());
700
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new SelectOrderAction());
701
    }
702

    
703
    @Override
704
    public int getSelectedFeatureCount() {
705
        if( this.searchFields==null ) {
706
            return 0;
707
        }
708
        return this.tblResults.getSelectedRowCount();
709
    }
710
    
711
    @Override
712
    public JComponent getActionButton(String name) {
713
        ActionButtons actionButton = this.actions.get(name);
714
        if( actionButton==null ) {
715
            return null;
716
        }
717
        return actionButton.button;
718
    }
719

    
720
    @Override
721
    public void setShowActions(boolean showActions) {
722
        this.showActions = showActions;
723
    }
724
    
725
    @Override
726
    public boolean isShowActions() {
727
        return this.showActions;
728
    }
729

    
730

    
731
    public static String getAttributeDescriptorLabel(FeatureAttributeDescriptor attrdesc, String tableName) {
732
        String theLabel;
733
        int theUseLabels;
734
        if( useLabels == null ) {
735
            Tags tags = attrdesc.getTags();
736
            if( tags.has(DAL_USE_LABELS) ) {
737
                theUseLabels = tags.getInt(DAL_USE_LABELS, USE_LABELS_NO);
738
            } else {
739
                tags = attrdesc.getFeatureType().getTags();
740
                theUseLabels = tags.getInt(DAL_USE_LABELS, USE_LABELS_NO);
741
            }
742
        } else {
743
            theUseLabels = useLabels;
744
        }
745
        switch(theUseLabels) {
746
            case USE_LABELS_YES:
747
                if( StringUtils.isBlank(tableName) ) {
748
                    theLabel = attrdesc.getLocalizedLabel();
749
                } else {
750
                    theLabel = String.format("%s [%s]", attrdesc.getLocalizedLabel(), tableName);
751
                }
752
                break;
753
            default:
754
            case USE_LABELS_NO:
755
                if( StringUtils.isBlank(tableName) ) {
756
                    theLabel = attrdesc.getName();
757
                } else {
758
                    theLabel = String.format("%s [%s]", attrdesc.getName(), tableName);
759
                }
760
                break;
761
            case USE_LABELS_BOTH:
762
                if( StringUtils.isBlank(tableName) ) {
763
                    theLabel = String.format("%s [%s]", attrdesc.getLocalizedLabel(), attrdesc.getName());
764
                } else {
765
                    theLabel = String.format("%s [%s/%s]", attrdesc.getLocalizedLabel(), attrdesc.getName(), tableName);
766
                }
767
                break;
768
        }
769
        return theLabel;
770
    }
771
     
772
}