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 / SearchConditionPanelSimplified.java @ 44748
History | View | Annotate | Download (10.5 KB)
1 | 44707 | jjdelcerro | package org.gvsig.fmap.dal.swing.impl.searchpanel; |
---|---|---|---|
2 | |||
3 | import java.awt.event.ActionEvent; |
||
4 | import java.util.ArrayList; |
||
5 | import java.util.List; |
||
6 | import javax.swing.JButton; |
||
7 | import javax.swing.JComboBox; |
||
8 | 44729 | omartinez | import javax.swing.JComponent; |
9 | 44707 | jjdelcerro | import javax.swing.JLabel; |
10 | import org.apache.commons.lang3.StringUtils; |
||
11 | import org.gvsig.expressionevaluator.Code; |
||
12 | import org.gvsig.expressionevaluator.Expression; |
||
13 | import org.gvsig.expressionevaluator.ExpressionBuilder; |
||
14 | import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_AND; |
||
15 | import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_OR; |
||
16 | import org.gvsig.expressionevaluator.ExpressionUtils; |
||
17 | import org.gvsig.expressionevaluator.swing.JExpressionBuilder; |
||
18 | import org.gvsig.fmap.dal.complements.Search; |
||
19 | import org.gvsig.fmap.dal.exception.DataException; |
||
20 | import org.gvsig.fmap.dal.feature.FeatureStore; |
||
21 | import org.gvsig.fmap.dal.swing.DALSwingLocator; |
||
22 | import org.gvsig.fmap.dal.swing.DataSwingManager; |
||
23 | import org.gvsig.fmap.dal.swing.searchpanel.SearchConditionPanel; |
||
24 | import org.gvsig.tools.ToolsLocator; |
||
25 | import org.gvsig.tools.i18n.I18nManager; |
||
26 | import org.gvsig.tools.swing.api.ToolsSwingLocator; |
||
27 | import org.gvsig.tools.swing.api.windowmanager.Dialog; |
||
28 | import org.gvsig.tools.swing.api.windowmanager.WindowManager; |
||
29 | import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2; |
||
30 | import org.slf4j.Logger; |
||
31 | import org.slf4j.LoggerFactory; |
||
32 | |||
33 | /**
|
||
34 | *
|
||
35 | * @author jjdelcerro
|
||
36 | */
|
||
37 | public class SearchConditionPanelSimplified implements SearchConditionPanel { |
||
38 | |||
39 | private static final Logger LOGGER = LoggerFactory.getLogger(SearchConditionPanelSimplified.class); |
||
40 | |||
41 | 44729 | omartinez | @Override
|
42 | public JComponent asJComponent() { |
||
43 | return null; |
||
44 | } |
||
45 | |||
46 | 44712 | jjdelcerro | private static class SearchConditionPanelAdvancedFactory |
47 | implements SearchConditionPanelFactory
|
||
48 | { |
||
49 | |||
50 | @Override
|
||
51 | public boolean isApplicable(FeatureStore store) { |
||
52 | return true; |
||
53 | } |
||
54 | |||
55 | @Override
|
||
56 | public SearchConditionPanel create(Object... os) { |
||
57 | return null; |
||
58 | } |
||
59 | |||
60 | @Override
|
||
61 | public String getName() { |
||
62 | return "Simplified"; |
||
63 | } |
||
64 | |||
65 | } |
||
66 | |||
67 | private static final SearchConditionPanelFactory FACTORY = new SearchConditionPanelAdvancedFactory(); |
||
68 | |||
69 | 44707 | jjdelcerro | private final FeatureStore store; |
70 | 44713 | jjdelcerro | private final List<SearchConditionFieldController> searchFields; |
71 | 44707 | jjdelcerro | private int maxSearhFields = 4; |
72 | private String accumulatedFilter; |
||
73 | private final JButton btnAddAccumulatedFilter; |
||
74 | private final JButton btnRemoveAccumulatedFilter; |
||
75 | private final JButton btnViewAccumulatedFilter; |
||
76 | private final String baseToolTip; |
||
77 | 44712 | jjdelcerro | private SearchConditionPanelFactory factory;
|
78 | 44707 | jjdelcerro | |
79 | public SearchConditionPanelSimplified(
|
||
80 | FeatureStore store, |
||
81 | JButton btnAddToAccumulatedFilter,
|
||
82 | JButton btnRemoveAccumulatedFilter,
|
||
83 | JButton btnViewAccumulatedFilter,
|
||
84 | JLabel lblField1,
|
||
85 | JLabel lblExtraFields1,
|
||
86 | JLabel lblRelationalOperator1,
|
||
87 | JComboBox cboValue1,
|
||
88 | JLabel lblLogicalOperators1,
|
||
89 | JLabel lblField2,
|
||
90 | JLabel lblExtraFields2,
|
||
91 | JLabel lblRelationalOperator2,
|
||
92 | JComboBox cboValue2,
|
||
93 | JLabel lblLogicalOperators2,
|
||
94 | JLabel lblField3,
|
||
95 | JLabel lblExtraFields3,
|
||
96 | JLabel lblRelationalOperator3,
|
||
97 | JComboBox cboValue3,
|
||
98 | JLabel lblLogicalOperators3,
|
||
99 | JLabel lblField4,
|
||
100 | JLabel lblExtraFields4,
|
||
101 | JLabel lblRelationalOperator4,
|
||
102 | JComboBox cboValue4,
|
||
103 | JLabel lblLogicalOperators4
|
||
104 | ) { |
||
105 | this.store = store;
|
||
106 | this.searchFields = new ArrayList<>(); |
||
107 | 44713 | jjdelcerro | SearchConditionFieldController controller = new SearchConditionFieldController(
|
108 | 44707 | jjdelcerro | store, |
109 | lblField1, |
||
110 | lblExtraFields1, |
||
111 | lblRelationalOperator1, |
||
112 | cboValue1, |
||
113 | lblLogicalOperators1 |
||
114 | ); |
||
115 | this.searchFields.add(controller);
|
||
116 | 44713 | jjdelcerro | controller = new SearchConditionFieldController(
|
117 | 44707 | jjdelcerro | store, |
118 | lblField2, |
||
119 | lblExtraFields2, |
||
120 | lblRelationalOperator2, |
||
121 | cboValue2, |
||
122 | lblLogicalOperators2 |
||
123 | ); |
||
124 | this.searchFields.add(controller);
|
||
125 | 44713 | jjdelcerro | controller = new SearchConditionFieldController(
|
126 | 44707 | jjdelcerro | store, |
127 | lblField3, |
||
128 | lblExtraFields3, |
||
129 | lblRelationalOperator3, |
||
130 | cboValue3, |
||
131 | lblLogicalOperators3 |
||
132 | ); |
||
133 | this.searchFields.add(controller);
|
||
134 | 44713 | jjdelcerro | controller = new SearchConditionFieldController(
|
135 | 44707 | jjdelcerro | store, |
136 | lblField4, |
||
137 | lblExtraFields4, |
||
138 | lblRelationalOperator4, |
||
139 | cboValue4, |
||
140 | null
|
||
141 | ); |
||
142 | this.searchFields.add(controller);
|
||
143 | this.accumulatedFilter = null; |
||
144 | this.btnAddAccumulatedFilter = btnAddToAccumulatedFilter;
|
||
145 | this.btnRemoveAccumulatedFilter = btnRemoveAccumulatedFilter;
|
||
146 | this.btnViewAccumulatedFilter = btnViewAccumulatedFilter;
|
||
147 | this.baseToolTip = this.btnAddAccumulatedFilter.getToolTipText(); |
||
148 | initComponents(); |
||
149 | } |
||
150 | |||
151 | 44712 | jjdelcerro | @Override
|
152 | public SearchConditionPanelFactory getFactory() {
|
||
153 | return FACTORY;
|
||
154 | } |
||
155 | |||
156 | 44707 | jjdelcerro | private void initComponents() { |
157 | try {
|
||
158 | Search search = (Search) ToolsLocator.getComplementsManager().get( |
||
159 | Search.COMPLEMENT_MANE, this.store.getDefaultFeatureType()
|
||
160 | ); |
||
161 | List<Search.OrderedAttribute> orderedAttributes = search.getOrderedAttributes(
|
||
162 | Search.BASIC_TYPES_FILTER, |
||
163 | Search.STR_INT_LONG_LABEL_ORDER, |
||
164 | 5
|
||
165 | ); |
||
166 | this.maxSearhFields = Integer.min(orderedAttributes.size(), 4); |
||
167 | int n = 0; |
||
168 | 44713 | jjdelcerro | for (SearchConditionFieldController searchField : searchFields) {
|
169 | 44707 | jjdelcerro | if (n < this.maxSearhFields) { |
170 | searchField.setAttribute(orderedAttributes.get(n++).getDescriptor().getName()); |
||
171 | } else {
|
||
172 | searchField.setEnabled(false);
|
||
173 | } |
||
174 | } |
||
175 | } catch (DataException ex) {
|
||
176 | LOGGER.warn("Can't determine order of attributes", ex);
|
||
177 | } |
||
178 | this.btnAddAccumulatedFilter.addActionListener((ActionEvent e) -> { |
||
179 | addToAccumulatedFilter(this.getCurrentFilter());
|
||
180 | }); |
||
181 | this.btnRemoveAccumulatedFilter.addActionListener((ActionEvent e) -> { |
||
182 | clearAccumulatedFilter(); |
||
183 | }); |
||
184 | this.btnViewAccumulatedFilter.addActionListener((ActionEvent e) -> { |
||
185 | showAccumulatedFilter(); |
||
186 | }); |
||
187 | this.btnRemoveAccumulatedFilter.setEnabled(false); |
||
188 | this.btnViewAccumulatedFilter.setEnabled(false); |
||
189 | this.btnAddAccumulatedFilter.setEnabled(true); |
||
190 | } |
||
191 | |||
192 | public void addToAccumulatedFilter(String filter) { |
||
193 | if( StringUtils.isBlank(filter) ) {
|
||
194 | return;
|
||
195 | } |
||
196 | String theAccumulatedFilter = this.accumulatedFilter; |
||
197 | this.clear();
|
||
198 | if( !StringUtils.isBlank(theAccumulatedFilter) ) {
|
||
199 | filter = "( " + theAccumulatedFilter + ") AND \n( " + filter + ")"; |
||
200 | } |
||
201 | this.btnAddAccumulatedFilter.setToolTipText("<html><b>"+this.baseToolTip + "</b><br><br>" + filter.replaceAll("\\n", "<br>")+"</html>"); |
||
202 | this.accumulatedFilter = filter;
|
||
203 | this.btnRemoveAccumulatedFilter.setEnabled(true); |
||
204 | this.btnViewAccumulatedFilter.setEnabled(true); |
||
205 | } |
||
206 | |||
207 | public void clearAccumulatedFilter() { |
||
208 | this.accumulatedFilter = null; |
||
209 | this.btnRemoveAccumulatedFilter.setEnabled(false); |
||
210 | this.btnViewAccumulatedFilter.setEnabled(false); |
||
211 | 44714 | jjdelcerro | this.btnAddAccumulatedFilter.setToolTipText(this.baseToolTip); |
212 | 44707 | jjdelcerro | } |
213 | |||
214 | public void showAccumulatedFilter() { |
||
215 | WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager(); |
||
216 | DataSwingManager manager = DALSwingLocator.getDataSwingManager(); |
||
217 | I18nManager i18n = ToolsLocator.getI18nManager(); |
||
218 | |||
219 | JExpressionBuilder panel = manager.createQueryFilterExpresion(store); |
||
220 | panel.setExpression(ExpressionUtils.createExpression(this.getAccumulatedFilter()));
|
||
221 | Dialog dialog = winmanager.createDialog(
|
||
222 | panel.asJComponent(), |
||
223 | i18n.getTranslation("_Expression_builder"),
|
||
224 | null,
|
||
225 | WindowManager_v2.BUTTONS_OK_CANCEL |
||
226 | ); |
||
227 | dialog.addActionListener((ActionEvent e) -> {
|
||
228 | if( dialog.getAction()==WindowManager_v2.BUTTON_OK ) {
|
||
229 | this.clearAccumulatedFilter();
|
||
230 | this.addToAccumulatedFilter(panel.getExpression().getPhrase());
|
||
231 | } |
||
232 | }); |
||
233 | dialog.show(WindowManager.MODE.DIALOG); |
||
234 | } |
||
235 | |||
236 | @Override
|
||
237 | public void setEnabled(boolean enabled) { |
||
238 | if (this.searchFields == null) { |
||
239 | initComponents(); |
||
240 | } |
||
241 | int n = 0; |
||
242 | 44713 | jjdelcerro | for (SearchConditionFieldController searchField : searchFields) {
|
243 | 44707 | jjdelcerro | if (n < this.maxSearhFields) { |
244 | searchField.setEnabled(enabled); |
||
245 | } else {
|
||
246 | searchField.setEnabled(false);
|
||
247 | } |
||
248 | n++; |
||
249 | } |
||
250 | } |
||
251 | |||
252 | @Override
|
||
253 | public void clear() { |
||
254 | if (this.searchFields == null) { |
||
255 | return;
|
||
256 | } |
||
257 | 44713 | jjdelcerro | for (SearchConditionFieldController searchField : searchFields) {
|
258 | 44707 | jjdelcerro | searchField.clear(); |
259 | } |
||
260 | this.clearAccumulatedFilter();
|
||
261 | } |
||
262 | |||
263 | @Override
|
||
264 | public Expression get() { |
||
265 | String currentFilter = this.getCurrentFilter(); |
||
266 | if( StringUtils.isBlank(accumulatedFilter) ) {
|
||
267 | if( StringUtils.isBlank(currentFilter) ) {
|
||
268 | return null; |
||
269 | } |
||
270 | return ExpressionUtils.createExpression(currentFilter);
|
||
271 | } |
||
272 | if( StringUtils.isBlank(currentFilter) ) {
|
||
273 | return ExpressionUtils.createExpression(accumulatedFilter);
|
||
274 | } |
||
275 | return ExpressionUtils.createExpression("( " + accumulatedFilter + " ) AND ( "+ currentFilter +" )"); |
||
276 | } |
||
277 | |||
278 | public String getAccumulatedFilter() { |
||
279 | return this.accumulatedFilter; |
||
280 | } |
||
281 | |||
282 | public String getCurrentFilter() { |
||
283 | ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder(); |
||
284 | String relational = OPERATOR_OR;
|
||
285 | 44713 | jjdelcerro | for (SearchConditionFieldController searchField : searchFields) {
|
286 | 44748 | jjdelcerro | ExpressionBuilder.Value cond = searchField.getFilter(); |
287 | if( cond != null ) { |
||
288 | 44707 | jjdelcerro | if (relational.equals(OPERATOR_AND)) {
|
289 | builder.and(cond); |
||
290 | } else {
|
||
291 | builder.or(cond); |
||
292 | } |
||
293 | relational = searchField.getLogicalOperator(); |
||
294 | } |
||
295 | } |
||
296 | if (builder.isEmpty()) {
|
||
297 | return null; |
||
298 | } |
||
299 | return builder.toString();
|
||
300 | } |
||
301 | |||
302 | @Override
|
||
303 | public boolean set(Expression filter) { |
||
304 | Code code = filter.getCode(); |
||
305 | if (code.code() == Code.CALLER) {
|
||
306 | 44713 | jjdelcerro | SearchConditionFieldController searchField = this.searchFields.get(0); |
307 | 44707 | jjdelcerro | Code.Caller caller = (Code.Caller) code; |
308 | if (searchField.isAValidRelationOperator(caller.name())) {
|
||
309 | Code op1 = caller.parameters().get(0);
|
||
310 | Code op2 = caller.parameters().get(1);
|
||
311 | if (op1.code() == Code.IDENTIFIER && op2.code() == Code.CONSTANT) {
|
||
312 | if (searchField.setAttribute(((Code.Identifier) op1).name()) >= 0) { |
||
313 | searchField.setRelationalOperator(caller.name()); |
||
314 | searchField.setValue(((Code.Constant) op2).value()); |
||
315 | return true; |
||
316 | } |
||
317 | } |
||
318 | } |
||
319 | } |
||
320 | return false; |
||
321 | } |
||
322 | } |