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 / firstlayerfeature / FirstLayerFeatureAditionalPanel.java @ 44259

History | View | Annotate | Download (8.89 KB)

1
package org.gvsig.app.project.symboltables.functionPanels.firstlayerfeature;
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 javax.swing.DefaultComboBoxModel;
12
import javax.swing.JComponent;
13
import javax.swing.event.ChangeEvent;
14
import javax.swing.event.ChangeListener;
15
import org.apache.commons.lang.StringEscapeUtils;
16
import org.apache.commons.lang3.StringUtils;
17
import org.gvsig.app.ApplicationLocator;
18
import org.gvsig.app.ApplicationManager;
19
import org.gvsig.app.project.Project;
20
import org.gvsig.app.project.documents.Document;
21
import org.gvsig.app.project.documents.view.ViewDocument;
22
import org.gvsig.app.project.documents.view.ViewManager;
23
import org.gvsig.app.project.symboltables.ProjectSymbolTable;
24
import org.gvsig.expressionevaluator.Expression;
25
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
26
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
27
import org.gvsig.expressionevaluator.swing.JExpressionBuilder;
28
import org.gvsig.fmap.dal.DALLocator;
29
import org.gvsig.fmap.dal.DataManager;
30
import org.gvsig.fmap.dal.exception.DataException;
31
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable;
32
import org.gvsig.fmap.dal.feature.Feature;
33
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
34
import org.gvsig.fmap.dal.feature.FeatureStore;
35
import org.gvsig.fmap.dal.swing.DALSwingLocator;
36
import org.gvsig.fmap.dal.swing.DataSwingManager;
37
import org.gvsig.fmap.dal.swing.expressionevaluator.FeatureStoreElement;
38
import org.gvsig.fmap.dal.swing.featuretype.AttributeDescriptorPickerController;
39
import org.gvsig.fmap.mapcontext.layers.FLayer;
40
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
41
import org.gvsig.fmap.mapcontrol.LayersTreeModel;
42
import org.gvsig.tools.swing.api.Component;
43
import org.gvsig.tools.swing.api.ListElement;
44
import org.gvsig.tools.swing.api.ToolsSwingLocator;
45
import org.gvsig.tools.swing.api.ToolsSwingManager;
46

    
47
/**
48
 *
49
 * @author jjdelcerro
50
 */
51
public class FirstLayerFeatureAditionalPanel 
52
        extends FirstLayerFeatureAditionalPanelView 
53
        implements Component
54
    {
55

    
56
    private final JExpressionBuilder expressionBuilder;
57
    private AttributeDescriptorPickerController fieldPicker;
58
    private AttributeDescriptorPickerController pickerFields;
59
    private ExpressionPickerController picketFilter;
60
    private FeatureSymbolTable featureSymbolTable;
61
    private FeatureStoreElement storeElement;
62
    
63
    public FirstLayerFeatureAditionalPanel(JExpressionBuilder expressionBuilder) {
64
        this.expressionBuilder = expressionBuilder;
65
        this.initComponents();
66
    }
67

    
68
    @Override
69
    public JComponent asJComponent() {
70
        return this;
71
    }
72
    
73
    private void initComponents() {
74
        DataManager dataManager = DALLocator.getDataManager();
75
        DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
76
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
77
        ApplicationManager application = ApplicationLocator.getManager();
78
        
79
        toolsSwingManager.setDefaultPopupMenu(this.txtPreview);
80
        
81
        Project project = application.getCurrentProject();
82
        List<Document> views = project.getDocuments(ViewManager.TYPENAME);
83
        List<ListElement<Document>> views2 = new ArrayList<>();
84
        for (Document view : views) {
85
            views2.add(new ListElement<>(view.getName(),view));
86
        }
87
        Collections.sort(views2, new Comparator<ListElement<Document>>() {
88
            @Override
89
            public int compare(ListElement<Document> o1, ListElement<Document> o2) {
90
                return StringUtils.compare(o1.toString(), o2.toString());
91
            }
92
        });
93
        DefaultComboBoxModel model = new DefaultComboBoxModel();
94
        for (ListElement<Document> element : views2) {
95
            model.addElement(element);
96
        }
97
        this.cboViews.setModel(model);
98
        this.cboViews.addItemListener(new ItemListener() {
99
            @Override
100
            public void itemStateChanged(ItemEvent e) {
101
                doChangeView();
102
            }
103
        });
104
    
105
        this.cboLayers.addItemListener(new ItemListener() {
106
            @Override
107
            public void itemStateChanged(ItemEvent e) {
108
                doChangeLayer();
109
            }
110
        });
111
    
112
        this.pickerFields = DALSwingLocator.getSwingManager().createAttributeDescriptorPickerController(
113
                this.cboFields
114
        );
115
        this.pickerFields.addChangeListener(new ChangeListener() {
116
            @Override
117
            public void stateChanged(ChangeEvent e) {
118
                doChangeField();
119
            }
120
        });
121
    
122
        this.picketFilter = ExpressionEvaluatorSwingLocator.getManager().createExpressionPickerController(
123
                this.txtFilter, 
124
                this.btnFilter
125
        );
126
        this.cboViews.setSelectedIndex(0);
127
        doChangeView();
128
        
129
        this.btnInsertFunction.addActionListener(new ActionListener() {
130
            @Override
131
            public void actionPerformed(ActionEvent e) {
132
                doInsertFunction();
133
            }
134
        });
135

    
136

    
137
        this.featureSymbolTable = dataManager.createFeatureSymbolTable();
138
        this.storeElement = dataSwingManager.createFeatureStoreElement();
139
        this.picketFilter.addElement(this.storeElement);
140
    }
141

    
142
    private void doChangeView() {
143
        ViewDocument viewdoc = (ViewDocument) ListElement.getSelected(this.cboViews);
144
        if( viewdoc == null ) {
145
            this.cboLayers.setEnabled(false);
146
            this.pickerFields.setEnabled(false);
147
            return;
148
        }
149
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
150
        LayersTreeModel layerTreeModel = new LayersTreeModel(viewdoc.getMapContext().getLayers());
151
        toolsSwingManager.setTreeModel(this.cboLayers, layerTreeModel);
152
        this.cboLayers.setEnabled(true);
153
        this.cboLayers.setSelectedIndex(0);
154
        this.doChangeLayer();
155
    }
156
    
157
    private void doChangeLayer() {
158
        FLayer layer = (FLayer) ListElement.getSelected(this.cboLayers);
159
        if( layer == null ) {
160
            this.pickerFields.setEnabled(false);
161
            return;
162
        }
163
        if( !(layer instanceof FLyrVect) ) {
164
            this.pickerFields.setEnabled(false);
165
            return;
166
        }
167
        FeatureStore store = ((FLyrVect)layer).getFeatureStore();
168
        try {
169
            this.pickerFields.setFeatureType(store.getDefaultFeatureType());
170
            this.pickerFields.setEnabled(true);
171
        } catch (DataException ex) {
172
            //TODO:
173
        }
174
        Feature sampleFeature = null;
175
        try {
176
            sampleFeature = store.getFeatureSelection().first();
177
            if( sampleFeature == null ) {
178
                sampleFeature = store.first();
179
            }
180
        } catch (DataException ex) {
181
        }      
182
        if( sampleFeature!=null ) {
183
            this.featureSymbolTable.setFeature(sampleFeature);
184
            this.picketFilter.setPreviewSymbolTable(this.featureSymbolTable.createParent());
185
        }
186
        this.storeElement.setFeatureStore(store);
187
    }
188
    
189
    private void doChangeField() {
190
        FeatureAttributeDescriptor descriptor = this.pickerFields.get();
191
        if( descriptor == null ) {
192
            this.txtPreview.setText("");
193
            return;
194
        }
195
        doUpdatePreview();
196
    }
197
    
198
    private void doUpdatePreview() {
199
        ViewDocument viewdoc = (ViewDocument) ListElement.getSelected(this.cboViews);
200
        if( viewdoc == null ) {
201
            this.txtPreview.setText("");
202
            return;
203
        }
204
        FLayer layer = (FLayer) ListElement.getSelected(this.cboLayers);
205
        if( layer == null ) {
206
            this.txtPreview.setText("");
207
            return;
208
        }
209
        FeatureAttributeDescriptor descriptor = this.pickerFields.get();
210
        if( descriptor == null ) {
211
            this.txtPreview.setText("");
212
            return;
213
        }
214
        Expression filter = this.picketFilter.get();
215
        StringBuilder template = new StringBuilder();
216
        template.append(ProjectSymbolTable.FETCH_FIRST_NAME);
217
        template.append("( '");
218
        template.append(viewdoc.getName());
219
        template.append("', '");
220
        template.append(layer.getName());
221
        template.append("', '");
222
        template.append(descriptor.getName());
223
        template.append("'");
224
        if( !filter.isPhraseEmpty() ) {
225
            template.append(", '");
226
            template.append(StringEscapeUtils.escapeSql(filter.getPhrase()));            
227
            template.append("'");
228
        }
229
        template.append(" )");
230
        this.txtPreview.setText(template.toString());
231
        this.txtPreview.setCaretPosition(0);
232
    }
233
    
234
    private void doInsertFunction() {
235
        this.expressionBuilder.insertText(this.txtPreview.getText());
236
    }
237
    
238
}