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

History | View | Annotate | Download (24.7 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.FeatureStore;
50
import org.gvsig.fmap.dal.feature.FeatureType;
51
import org.gvsig.fmap.dal.swing.AbstractDALActionFactory.AbstractDALActionContext;
52
import org.gvsig.fmap.dal.swing.DALActionFactory;
53
import org.gvsig.fmap.dal.swing.DALSwingLocator;
54
import org.gvsig.fmap.dal.swing.impl.featuretable.SimpleFeaturesTableModel;
55
import org.gvsig.fmap.dal.swing.searchpanel.FeatureStoreSearchPanel;
56
import org.gvsig.tools.ToolsLocator;
57
import org.gvsig.tools.dynobject.Tags;
58
import org.gvsig.tools.i18n.I18nManager;
59
import org.gvsig.tools.swing.api.ActionListenerSupport;
60
import org.gvsig.tools.swing.api.ToolsSwingLocator;
61
import org.gvsig.tools.swing.icontheme.IconTheme;
62
import org.gvsig.tools.util.ToolsUtilLocator;
63
import org.slf4j.Logger;
64
import org.slf4j.LoggerFactory;
65

    
66
/**
67
 *
68
 * @author jjdelcerro
69
 */
70
@SuppressWarnings({"UseSpecificCatch","Convert2Lambda"})
71
public class DefaultSearchPanel
72
        extends DefaultSearchPanelView
73
        implements FeatureStoreSearchPanel {
74

    
75
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultSearchPanel.class);
76
    private Expression currentSearch;
77
    
78
    static /* friend */ Integer useLabels = null;
79
    
80
    public static class UseLabelsYesAction extends AbstractAction {
81

    
82
        public UseLabelsYesAction() {
83
            I18nManager i18n = ToolsLocator.getI18nManager();
84

    
85
            this.putValue(NAME, i18n.getTranslation("_Use_labels"));
86
            this.putValue(ACTION_COMMAND_KEY, "UseLabelsYes");
87
        }
88

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

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

    
107
        public UseLabelsNoAction() {
108
            I18nManager i18n = ToolsLocator.getI18nManager();
109
            this.putValue(NAME, i18n.getTranslation("_Use_names"));
110
            this.putValue(ACTION_COMMAND_KEY, "UseLabelsNo");
111
        }
112

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

    
131
        public UseLabelsBothAction() {
132
            I18nManager i18n = ToolsLocator.getI18nManager();
133

    
134
            this.putValue(NAME, i18n.getTranslation("_Use_labels_and_names"));
135
            this.putValue(ACTION_COMMAND_KEY, "UseLabelsBoth");
136
        }
137

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

    
148
        @Override
149
        public void actionPerformed(ActionEvent ae) {
150
            DefaultSearchPanel.useLabels = USE_LABELS_BOTH;
151
        }
152
    }
153
    
154
    
155
    private class ActionButtons {
156
        
157
        private final DALActionFactory factory;
158
        private final Action action;
159
        private final JButton button;
160
        
161
        public ActionButtons(DALActionFactory factory, Action action, JButton button) {
162
            this.factory = factory;
163
            this.action = action;
164
            this.button = button;
165
        }
166
    }
167

    
168
    public static class SearchActionContext extends AbstractDALActionContext {
169

    
170
        private final DefaultSearchPanel panel;
171
        
172
        public SearchActionContext(DefaultSearchPanel panel) {
173
            super(FeatureStoreSearchPanel.ACTION_CONTEXT_NAME);
174
            this.panel = panel;
175
        }
176
        
177
        @Override
178
        public DataStore getStore() {
179
            return this.panel.getStore();
180
        }
181

    
182
        @Override
183
        public Expression getFilter() {
184
            return this.panel.getCurrentSearch();
185
        }
186

    
187
        @Override
188
        public JComponent getActionButton(String actionName) {
189
            return this.panel.getActionButton(actionName);
190
        }
191
        
192
        @Override
193
        public int getSelectedsCount() {
194
            return this.panel.getSelectedFeatureCount();
195
        }
196
        
197
        @Override
198
        public Expression getFilterForSelecteds() {
199
            return this.panel.getSearchForSelectedFeature();
200
        }
201
    }
202
    
203
    private final FeatureStore store;
204
    private final ActionListenerSupport acctionListeners;
205
    private List<SearchFieldController> searchFields;
206
    private ExpressionPickerController advancedExpression;
207
    private final Map<String, ActionButtons> actions;
208
    private boolean showActions = true;
209
    private int maxSearhFields = 4;
210

    
211
    public DefaultSearchPanel(FeatureStore store) {
212
        this.store = store;
213
        this.acctionListeners = ToolsSwingLocator.getToolsSwingManager().createActionListenerSupport();
214
        this.searchFields = null;
215
        this.actions = new HashMap<>();
216
    }
217

    
218
    @Override
219
    public JComponent asJComponent() {
220
        if( this.searchFields==null ) {
221
            this.initComponents();
222
        }
223
        return this;
224
    }
225

    
226
    private void addActions() {
227
        if( !this.showActions ) {
228
            return;
229
        }
230
        this.pnlActions.removeAll();
231
        this.pnlActions.setLayout(new FlowLayout(FlowLayout.TRAILING, 8, 4));
232
        SearchActionContext actionContext = new SearchActionContext(this);
233
        Collection<DALActionFactory> factories = DALSwingLocator.getSwingManager().getStoreActions();
234
        for (DALActionFactory factory : factories) {
235
            Action action = factory.createAction(actionContext);
236
            JButton button = new JButton(action);
237
            this.actions.put(factory.getName(), new ActionButtons(factory, action, button));
238
            button.setBorder(BorderFactory.createEmptyBorder());
239
            button.setBorderPainted(false);
240
            button.setFocusPainted(false);
241
            button.setContentAreaFilled(false);
242
            button.setCursor(new Cursor(Cursor.HAND_CURSOR));
243
            this.pnlActions.add(button);
244
        }
245
        this.pnlActions.revalidate();
246
        this.pnlActions.repaint();
247
    }
248

    
249
    @Override
250
    public void addActionListener(ActionListener listener) {
251
        this.acctionListeners.addActionListener(listener);
252
    }
253

    
254
    @Override
255
    public ActionListener[] getActionListeners() {
256
        return this.acctionListeners.getActionListeners();
257
    }
258

    
259
    @Override
260
    public void removeActionListener(ActionListener listener) {
261
        this.acctionListeners.removeActionListener(listener);
262
    }
263

    
264
    @Override
265
    public void removeAllActionListener() {
266
        this.acctionListeners.removeAllActionListener();
267
    }
268

    
269
    @Override
270
    public void fireActionEvent(ActionEvent event) {
271
        this.acctionListeners.fireActionEvent(event);
272
    }
273

    
274
    @Override
275
    public boolean hasActionListeners() {
276
        return this.acctionListeners.hasActionListeners();
277
    }
278

    
279
    private void initComponents() {
280
        ConfigurableActionsMamager cfgActionsManager = ToolsUtilLocator.getConfigurableActionsMamager();
281
        JComponent c = cfgActionsManager.getConfigurableActionsComponent(CONFIGURABLE_PANEL_ID, this);
282
        this.pnlCfgActions.setLayout(new BorderLayout(0,0));
283
        this.pnlCfgActions.add(c, BorderLayout.CENTER);
284
        
285
        this.searchFields = new ArrayList<>();
286
        SearchFieldController controller = new SearchFieldController(
287
                store,
288
                lblField1,
289
                lblExtraFields1,
290
                lblRelationalOperator1,
291
                cboValue1,
292
                lblLogicalOperators1
293
        );
294
        this.searchFields.add(controller);
295
        controller = new SearchFieldController(
296
                store,
297
                lblField2,
298
                lblExtraFields2,
299
                lblRelationalOperator2,
300
                cboValue2,
301
                lblLogicalOperators2
302
        );
303
        this.searchFields.add(controller);
304
        controller = new SearchFieldController(
305
                store,
306
                lblField3,
307
                lblExtraFields3,
308
                lblRelationalOperator3,
309
                cboValue3,
310
                lblLogicalOperators3
311
        );
312
        this.searchFields.add(controller);
313
        controller = new SearchFieldController(
314
                store,
315
                lblField4,
316
                lblExtraFields4,
317
                lblRelationalOperator4,
318
                cboValue4,
319
                null
320
        );
321
        this.searchFields.add(controller);
322
        try {
323
            Search search = (Search) ToolsLocator.getComplementsManager().get(
324
                    Search.COMPLEMENT_MANE, this.store.getDefaultFeatureType()
325
            );
326
            List<Search.OrderedAttribute> orderedAttributes = search.getOrderedAttributes(
327
                    Search.BASIC_TYPES_FILTER,
328
                    Search.STR_INT_LONG_LABEL_ORDER,
329
                    5
330
            );
331
            this.maxSearhFields = Integer.min(orderedAttributes.size(), 4);
332
            int n = 0;
333
            for (SearchFieldController searchField : searchFields) {
334
                if( n<this.maxSearhFields ) {
335
                    searchField.setAttribute(orderedAttributes.get(n++).getDescriptor().getName());
336
                } else {
337
                    searchField.setEnabled(false);
338
                }
339
            }
340
        } catch (DataException ex) {
341
            LOGGER.warn("Can't determine order of attributes", ex);
342
        }
343

    
344
        ExpressionEvaluatorSwingManager expressionSwingManager = ExpressionEvaluatorSwingLocator.getManager();
345
        this.advancedExpression = expressionSwingManager.createExpressionPickerController(
346
                txtAdvancedExpression, 
347
                btnAdvancedExpression,
348
                btnAdvancedExpressionHistory,
349
                btnAdvancedExpressionBookmarks
350
        );
351
        this.advancedExpression.addElement(
352
            DALSwingLocator.getSwingManager().createFeatureStoreElement(store)
353
        );
354

    
355
        this.btnSearch.addActionListener(new ActionListener() {
356
            @Override
357
            public void actionPerformed(ActionEvent e) {
358
                doSearch();
359
            }
360
        });
361

    
362
        this.tblResults.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
363
            @Override
364
            public void valueChanged(ListSelectionEvent e) {
365
                for (ActionButtons actionButton : actions.values()) {
366
                    if( actionButton.action instanceof ListSelectionListener) {
367
                        ((ListSelectionListener) actionButton.action).valueChanged(e);
368
                    }
369
                }
370
            }
371
        });
372
        this.btnClear.addActionListener(new ActionListener() {
373
            @Override
374
            public void actionPerformed(ActionEvent e) {
375
                clear();
376
            }
377
        });
378
        addActions();
379
        this.setPreferredSize(new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT));
380

    
381
        doSearch(null);
382
    }
383

    
384
    @Override
385
    public void setEnabled(boolean enabled) {
386
        if( this.searchFields==null ) {
387
            initComponents();
388
        }
389
        int n=0;
390
        for (SearchFieldController searchField : searchFields) {
391
            if( n<this.maxSearhFields ) {
392
                searchField.setEnabled(enabled);
393
            } else {
394
                searchField.setEnabled(false);
395
            }
396
            n++;
397
        }
398
        this.btnClear.setEnabled(enabled);
399
        this.btnSearch.setEnabled(enabled);
400
        this.advancedExpression.setEnabled(enabled);
401
        for (ActionButtons actionButton : actions.values()) {
402
            actionButton.action.setEnabled(enabled);
403
        }
404
    }
405

    
406
    public void clear() {
407
        if( this.searchFields==null ) {
408
            return;
409
        }
410
        for (SearchFieldController searchField : searchFields) {
411
            searchField.clear();
412
        }
413
        this.advancedExpression.set(null);
414
    }
415

    
416
    @Override
417
    public Expression getFilter() {
418
        Expression filter;
419
        int searchMode = this.tabSearchMode.getSelectedIndex();
420
        if (searchMode == 1) { // Avanzada
421
            filter = this.advancedExpression.get();
422
        } else {
423
            ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
424
            String relational = OPERATOR_OR;
425
            for (SearchFieldController searchField : searchFields) {
426
                if (searchField.getAttribute() != null && searchField.getValue() != null) {
427
                    ExpressionBuilder.BinaryOperator cond = builder.binaryOperator(
428
                            searchField.getRelationalOperator(),
429
                            searchField.isAttributeAnExpression()
430
                            ? builder.custom(searchField.getAttribute())
431
                            : builder.column(searchField.getAttribute()),
432
                            builder.constant(searchField.getValue())
433
                    );
434
                    if (relational.equals(OPERATOR_AND)) {
435
                        builder.and(cond);
436
                    } else {
437
                        builder.or(cond);
438
                    }
439
                    relational = searchField.getLogicalOperator();
440
                }
441
            }
442
            if (builder.isEmpty()) {
443
                filter = null;
444
            } else {
445
                filter = ExpressionUtils.createExpression(builder.toString());
446
            }
447
        }
448
        if (ExpressionUtils.isPhraseEmpty(filter)) {
449
            return null;
450
        }
451
        return filter;
452
    }
453
    
454
    private void doSearch() {
455
        Expression filter = this.getFilter();
456
        doSearch(filter);
457
    }
458

    
459
    private void doSearch(final Expression exp) {
460
        final MutableObject model = new MutableObject(null);
461
        
462
        lblMsg.setText("Searching...");
463
        setEnabled(false);
464
        Thread th = new Thread(new Runnable() {
465
            @Override
466
            public void run() {
467
                try {
468
                    final List<Feature> features;
469
                    if (exp == null) {
470
                        features = store.getFeatures();
471
                    } else {
472
                        features = store.getFeatures(exp);
473
                    }
474
                    currentSearch = exp;
475
                    model.setValue( new SimpleFeaturesTableModel(
476
                            store.getDefaultFeatureType(),
477
                            null,
478
                            features
479
                        )
480
                    );
481
                } catch (DataException ex) {
482
                    LOGGER.warn("Can't get features or create table model",ex);
483
                } finally {
484
                    SwingUtilities.invokeLater(new Runnable() {
485
                        @Override
486
                        public void run() {
487
                            TableModel m = (TableModel) model.getValue();
488
                            tblResults.setModel(m);
489
                            lblMsg.setText(String.format("%d elementos", m.getRowCount()));
490
                            setEnabled(true);
491
                        }
492
                    });
493
                }
494
            }
495
        });
496
        th.start();
497
    }
498

    
499
    @Override
500
    public Expression getCurrentSearch() {
501
        return this.currentSearch;
502
    }
503

    
504
    @Override
505
    public boolean setFilter(Expression filter) {
506
        try {
507
            if( this.advancedExpression==null ) {
508
                this.initComponents();
509
            }
510
            if( ExpressionUtils.isPhraseEmpty(filter) ) {
511
                this.clear();
512
                return true;
513
            }
514
            this.advancedExpression.set(filter);
515
            this.tabSearchMode.setSelectedIndex(1);
516
            
517
            Code code = filter.getCode();
518
            if( code.code()==Code.CALLER) {
519
                SearchFieldController searchField = this.searchFields.get(0);
520
                Code.Caller caller = (Code.Caller)code;
521
                if( searchField.isAValidRelationOperator(caller.name())) {
522
                    Code op1 = caller.parameters().get(0);
523
                    Code op2 = caller.parameters().get(1);
524
                    if( op1.code()==Code.IDENTIFIER && op2.code()==Code.CONSTANT ) {
525
                        if( searchField.setAttribute(((Code.Identifier)op1).name())>=0 ) {
526
                            searchField.setRelationalOperator(caller.name());
527
                            searchField.setValue(((Code.Constant)op2).value());
528
                            this.tabSearchMode.setSelectedIndex(0);
529
                        }
530
                    }
531
                }
532
            }
533
            SimpleFeaturesTableModel model = new SimpleFeaturesTableModel(this.getStore());
534
            tblResults.setModel(model);
535
            lblMsg.setText("");
536
            return true;
537
        } catch(Exception ex) {
538
            LOGGER.warn("Can't set current search", ex);
539
            return false;
540
        }
541
    }
542
   
543
    @Override
544
    public void setCurrentSearch(Expression filter) {
545
        if( this.setFilter(filter) ) {
546
            doSearch();
547
        }
548
    }
549
    
550
    @Override
551
    public Expression getSearchForSelectedFeature() {
552
        if( this.searchFields==null ) {
553
            return null;
554
        }
555
        int selectedRow = this.tblResults.getSelectedRow();
556
        if (selectedRow < 0) {
557
            return null;
558
        }
559
        try {
560
            List<Feature> features = ((SimpleFeaturesTableModel) this.tblResults.getModel()).getFeatures();
561
            Feature feature = features.get(selectedRow);
562
            
563
            ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
564
            FeatureType ftype = this.store.getDefaultFeatureType();
565
            for (FeatureAttributeDescriptor attrdesc : ftype.getPrimaryKey()) {
566
                builder.and(
567
                        builder.eq(
568
                                builder.column(attrdesc.getName()),
569
                                builder.constant(feature.get(attrdesc.getName()))
570
                        )
571
                );
572
            }
573
            Expression filter = ExpressionUtils.createExpression(builder.toString());
574
            return filter;
575
        } catch (Exception ex) {
576
            LOGGER.warn("Can't build search for the selected feature.", ex);
577
            return null;
578
        }
579
    }
580

    
581
    @Override
582
    public FeatureStore getStore() {
583
        return store;
584
    }
585
    
586
    @Override
587
    public ImageIcon loadImage(String imageName) {
588
        String name = FilenameUtils.getBaseName(imageName);
589
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getDefault();
590
        if (theme.exists(name)) {
591
            return theme.get(name);
592
        }
593
        URL url = this.getClass().getResource(name + ".png");
594
        if (url == null) {
595
            return null;
596
        }
597
        return new ImageIcon(url);
598
    }
599

    
600
    public static void selfRegister() {
601
        String[][] iconNames = new String[][]{
602
            new String[]{"dalswing", "featurestore-column"},
603
            new String[]{"dalswing", "featurestore-foreing-key"},
604
            new String[]{"dalswing", "featurestore-table"},
605
            new String[]{"dalswing", "search-action-showform"},
606
            new String[]{"dalswing", "search-action-select"},
607
            new String[]{"dalswing", "search-action-select-add"},
608
            new String[]{"dalswing", "search-action-select-filter"}
609
        };
610
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
611
        for (String[] icon : iconNames) {
612
            URL url = DefaultSearchPanel.class.getResource(icon[1] + ".png");
613
            theme.registerDefault("DALSwing", icon[0], icon[1], null, url);
614
        }
615

    
616
        ConfigurableActionsMamager cfgActionsManager = ToolsUtilLocator.getConfigurableActionsMamager();
617
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new UseLabelsYesAction());
618
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new UseLabelsNoAction());
619
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new UseLabelsBothAction());
620
        
621
    }
622

    
623
    @Override
624
    public int getSelectedFeatureCount() {
625
        if( this.searchFields==null ) {
626
            return 0;
627
        }
628
        return this.tblResults.getSelectedRowCount();
629
    }
630
    
631
    @Override
632
    public JComponent getActionButton(String name) {
633
        ActionButtons actionButton = this.actions.get(name);
634
        if( actionButton==null ) {
635
            return null;
636
        }
637
        return actionButton.button;
638
    }
639

    
640
    @Override
641
    public void setShowActions(boolean showActions) {
642
        this.showActions = showActions;
643
    }
644
    
645
    @Override
646
    public boolean isShowActions() {
647
        return this.showActions;
648
    }
649

    
650

    
651
    public static String getAttributeDescriptorLabel(FeatureAttributeDescriptor attrdesc, String tableName) {
652
        String theLabel;
653
        int theUseLabels;
654
        if( useLabels == null ) {
655
            Tags tags = attrdesc.getTags();
656
            if( tags.has(DAL_USE_LABELS) ) {
657
                theUseLabels = tags.getInt(DAL_USE_LABELS, USE_LABELS_NO);
658
            } else {
659
                tags = attrdesc.getFeatureType().getTags();
660
                theUseLabels = tags.getInt(DAL_USE_LABELS, USE_LABELS_NO);
661
            }
662
        } else {
663
            theUseLabels = useLabels;
664
        }
665
        switch(theUseLabels) {
666
            case USE_LABELS_YES:
667
                if( StringUtils.isBlank(tableName) ) {
668
                    theLabel = attrdesc.getLocalizedLabel();
669
                } else {
670
                    theLabel = String.format("%s [%s]", attrdesc.getLocalizedLabel(), tableName);
671
                }
672
                break;
673
            default:
674
            case USE_LABELS_NO:
675
                if( StringUtils.isBlank(tableName) ) {
676
                    theLabel = attrdesc.getName();
677
                } else {
678
                    theLabel = String.format("%s [%s]", attrdesc.getName(), tableName);
679
                }
680
                break;
681
            case USE_LABELS_BOTH:
682
                if( StringUtils.isBlank(tableName) ) {
683
                    theLabel = String.format("%s [%s]", attrdesc.getLocalizedLabel(), attrdesc.getName());
684
                } else {
685
                    theLabel = String.format("%s [%s/%s]", attrdesc.getLocalizedLabel(), attrdesc.getName(), tableName);
686
                }
687
                break;
688
        }
689
        return theLabel;
690
    }
691
     
692
}