Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.app / org.gvsig.app.mainplugin / src / main / java / org / gvsig / app / project / symboltables / functionPanels / perimeter / PerimeterAditionalPanel.java @ 44129

History | View | Annotate | Download (5.8 KB)

1
package org.gvsig.app.project.symboltables.functionPanels.perimeter;
2

    
3
import java.awt.event.ActionEvent;
4
import java.awt.event.ActionListener;
5
import java.awt.event.ItemEvent;
6
import java.awt.event.ItemListener;
7
import java.util.ArrayList;
8
import java.util.Collections;
9
import java.util.Comparator;
10
import java.util.List;
11
import java.util.function.Predicate;
12
import javax.swing.DefaultListModel;
13
import javax.swing.JComponent;
14
import javax.swing.event.ListSelectionEvent;
15
import javax.swing.event.ListSelectionListener;
16
import org.gvsig.app.project.symboltables.ProjectSymbolTable;
17
import org.gvsig.expressionevaluator.swing.Element;
18
import org.gvsig.expressionevaluator.swing.JExpressionBuilder;
19
import org.gvsig.fmap.dal.DataTypes;
20
import org.gvsig.fmap.dal.exception.DataException;
21
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
22
import org.gvsig.fmap.dal.feature.FeatureStore;
23
import org.gvsig.fmap.dal.swing.DALSwingLocator;
24
import org.gvsig.fmap.dal.swing.DataSwingManager;
25
import org.gvsig.fmap.dal.swing.expressionevaluator.FeatureStoreElement;
26
import org.gvsig.fmap.dal.swing.featuretype.AttributeDescriptorPickerController;
27
import org.gvsig.fmap.geom.Geometry;
28
import org.gvsig.fmap.geom.type.GeometryType;
29
import org.gvsig.fmap.mapcontext.MapContext;
30
import org.gvsig.tools.swing.api.Component;
31
import org.gvsig.tools.swing.api.ListElement;
32

    
33
/**
34
 *
35
 * @author jjdelcerro
36
 */
37
public class PerimeterAditionalPanel 
38
        extends PerimeterAditionalPanelView 
39
        implements Component
40
    {
41

    
42
    private final JExpressionBuilder expressionBuilder;
43
    private AttributeDescriptorPickerController fieldPicker;
44
    
45
    public PerimeterAditionalPanel(JExpressionBuilder expressionBuilder) {
46
        this.expressionBuilder = expressionBuilder;
47
        this.initComponents();
48
    }
49

    
50
    @Override
51
    public JComponent asJComponent() {
52
        return this;
53
    }
54
    
55
    private void initComponents() {
56
        DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
57
        
58
        this.fieldPicker = dataSwingManager.createAttributeDescriptorPickerController(
59
            this.cboFields, 
60
            new Predicate<FeatureAttributeDescriptor>() {
61
            @Override
62
            public boolean test(FeatureAttributeDescriptor descriptor) {
63
                if( descriptor.getDataType().getType()!=DataTypes.GEOMETRY ) {
64
                    return false;
65
                }
66
                GeometryType geomtype = descriptor.getGeomType();
67
                if( geomtype.getType()==Geometry.TYPES.GEOMETRY ) {
68
                    return true;
69
                }
70
                boolean isSurface = geomtype.isTypeOf(Geometry.TYPES.SURFACE) ||
71
                        geomtype.isTypeOf(Geometry.TYPES.MULTISURFACE);
72
                return isSurface;
73
            }
74
        });
75
        final FeatureStore store = this.getFeatureStore();
76
        try {
77
            this.fieldPicker.setFeatureType(store.getDefaultFeatureType());
78
        } catch (DataException ex) {
79
        }
80
        
81
        String[] abbrev = MapContext.getDistanceAbbr();
82
        String[] names = MapContext.getDistanceNames();
83
        List<ListElement<String>> elements = new ArrayList<>();
84
        for (int j = 0; j < names.length; j++) {
85
            elements.add(new ListElement<>(names[j]+" ("+abbrev[j]+")", abbrev[j]));
86
        }
87
        Collections.sort(elements, new Comparator<ListElement<String>>() {
88
            @Override
89
            public int compare(ListElement<String> o1, ListElement<String> o2) {
90
                return o1.toString().compareTo(o2.toString());
91
            }
92
        });
93
        
94
        DefaultListModel unitsModel = new DefaultListModel();
95
        for (ListElement<String> element : elements) {
96
            unitsModel.addElement(element);
97
        }
98
        this.lstUnits.setModel(unitsModel);
99
        if( lstUnits.getModel().getSize()>0 ) {
100
            this.lstUnits.setSelectedIndex(0);
101
        }
102
        if( this.cboFields.getModel().getSize()>0 ) {
103
            this.cboFields.setSelectedIndex(0);
104
        }    
105
        this.cboFields.addItemListener(new ItemListener() {
106
            @Override
107
            public void itemStateChanged(ItemEvent e) {
108
                doUpdatePreview();
109
            }
110
        });
111
        this.lstUnits.addListSelectionListener(new ListSelectionListener() {
112
            @Override
113
            public void valueChanged(ListSelectionEvent e) {
114
                if( e.getValueIsAdjusting() ) {
115
                    return;
116
                }
117
                doUpdatePreview();
118
            }
119
        });
120
        this.btnInsertFunction.addActionListener(new ActionListener() {
121
            @Override
122
            public void actionPerformed(ActionEvent e) {
123
                doInsertFunction();
124
            }
125
        });
126
        doUpdatePreview();
127
    }
128

    
129
    private void doUpdatePreview() {
130
        FeatureAttributeDescriptor descriptor = this.fieldPicker.get();
131
        String fieldName;
132
        if( descriptor == null ) {
133
            fieldName = "{{geometry}}";
134
        } else {
135
            fieldName = descriptor.getName();
136
        }
137
        String unitName = (String) ListElement.getSelected(lstUnits);
138
        String template = ProjectSymbolTable.PERIMETER_NAME + "( "+fieldName+", '"+unitName+"' )";
139
        this.txtPreview.setText(template);
140
        this.txtPreview.setCaretPosition(0);
141
        
142
    }
143
    
144
    private void doInsertFunction() {
145
        this.expressionBuilder.insertText(this.txtPreview.getText());
146
    }
147
    
148
    private FeatureStore getFeatureStore() {
149
        List<Element> elements = this.expressionBuilder.getElements();
150
        for (Element element : elements) {
151
            if( element instanceof FeatureStoreElement ) {
152
                FeatureStore store = ((FeatureStoreElement) element).getFeatureStore();
153
                if( store != null ) {
154
                    return store;
155
                }
156
            }
157
        }
158
        return null;
159
    }
160
}