Revision 43169 trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/org.gvsig.app/org.gvsig.app.mainplugin/src/main/java/org/gvsig/app/gui/filter/FilterDialog.java
FilterDialog.java | ||
---|---|---|
32 | 32 |
import java.util.Comparator; |
33 | 33 |
import java.util.Date; |
34 | 34 |
import java.util.Iterator; |
35 |
import java.util.List; |
|
35 | 36 |
import java.util.TreeSet; |
36 | 37 |
import java.util.regex.Matcher; |
37 | 38 |
import java.util.regex.Pattern; |
39 |
import javax.swing.JOptionPane; |
|
38 | 40 |
|
39 | 41 |
import javax.swing.tree.DefaultMutableTreeNode; |
40 | 42 |
import javax.swing.tree.DefaultTreeModel; |
43 |
import org.apache.commons.lang.StringEscapeUtils; |
|
44 |
import org.apache.commons.lang3.StringUtils; |
|
41 | 45 |
|
42 | 46 |
import org.slf4j.Logger; |
43 | 47 |
import org.slf4j.LoggerFactory; |
44 | 48 |
|
45 | 49 |
import org.gvsig.andami.PluginServices; |
46 |
import org.gvsig.andami.messages.NotificationManager; |
|
47 | 50 |
import org.gvsig.andami.ui.mdiManager.IWindow; |
48 | 51 |
import org.gvsig.andami.ui.mdiManager.IWindowListener; |
49 | 52 |
import org.gvsig.andami.ui.mdiManager.WindowInfo; |
53 |
import org.gvsig.app.ApplicationLocator; |
|
54 |
import org.gvsig.app.ApplicationManager; |
|
50 | 55 |
import org.gvsig.fmap.dal.exception.DataException; |
51 | 56 |
import org.gvsig.fmap.dal.feature.Feature; |
52 | 57 |
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor; |
... | ... | |
54 | 59 |
import org.gvsig.fmap.dal.feature.FeatureSet; |
55 | 60 |
import org.gvsig.fmap.dal.feature.FeatureStore; |
56 | 61 |
import org.gvsig.gui.beans.filterPanel.tableFilterQueryPanel.TableFilterQueryJPanel; |
62 |
import org.gvsig.tools.ToolsLocator; |
|
57 | 63 |
import org.gvsig.tools.dispose.DisposableIterator; |
58 | 64 |
import org.gvsig.tools.dispose.DisposeUtils; |
65 |
import org.gvsig.tools.i18n.I18nManager; |
|
59 | 66 |
import org.gvsig.utils.DefaultCharSet; |
60 | 67 |
import org.gvsig.utils.StringUtilities; |
61 | 68 |
import org.gvsig.utils.exceptionHandling.ExceptionHandlingSupport; |
... | ... | |
76 | 83 |
* |
77 | 84 |
*/ |
78 | 85 |
private static final long serialVersionUID = -149317534873551735L; |
79 |
private static final Logger logger = |
|
80 |
LoggerFactory.getLogger(FilterDialog.class); |
|
86 |
private static final Logger logger = LoggerFactory.getLogger(FilterDialog.class);
|
|
87 |
|
|
81 | 88 |
private FeatureStore model = null; |
82 |
private ArrayList expressionListeners = new ArrayList(); |
|
83 |
private ExceptionHandlingSupport exceptionHandlingSupport =
|
|
84 |
new ExceptionHandlingSupport();
|
|
85 |
private NumberFormat nf = NumberFormat.getNumberInstance(); |
|
89 |
|
|
90 |
private final List<ExpressionListener> expressionListeners = new ArrayList<>();
|
|
91 |
private final ExceptionHandlingSupport exceptionHandlingSupport = new ExceptionHandlingSupport();
|
|
92 |
private final NumberFormat nf = NumberFormat.getNumberInstance();
|
|
86 | 93 |
|
87 | 94 |
private String title; |
88 | 95 |
|
... | ... | |
96 | 103 |
|
97 | 104 |
/** |
98 | 105 |
* This is the default constructor |
106 |
* @param _title |
|
99 | 107 |
*/ |
100 | 108 |
public FilterDialog(String _title) { |
101 | 109 |
super(); |
... | ... | |
134 | 142 |
// Listener for "btnAdd" |
135 | 143 |
// Adds more elements to the current set |
136 | 144 |
getBtnAddToCurrentSet().addActionListener( |
137 |
new java.awt.event.ActionListener() { |
|
145 |
new java.awt.event.ActionListener() {
|
|
138 | 146 |
|
139 |
/* |
|
140 |
* (non-Javadoc) |
|
141 |
* |
|
142 |
* @see |
|
143 |
* java.awt.event.ActionListener#actionPerformed(java.awt.event |
|
144 |
* .ActionEvent) |
|
145 |
*/ |
|
146 |
public void actionPerformed(java.awt.event.ActionEvent e) { |
|
147 |
// final String expr = "select * from '" + |
|
148 |
// model.getName() + "' where " + |
|
149 |
// getTxtExpression().getText() + ";"; |
|
150 |
final String expr = getTxtExpression().getText(); |
|
151 |
logger.debug(expr); |
|
147 |
@Override |
|
148 |
public void actionPerformed(java.awt.event.ActionEvent e) { |
|
149 |
final String expr = getTxtExpression().getText(); |
|
150 |
if (!validateQuotes(expr) || !validateLike(expr)) { |
|
151 |
return; |
|
152 |
} |
|
152 | 153 |
|
153 |
PluginServices.backgroundExecution(new Runnable() { |
|
154 |
PluginServices.backgroundExecution(new Runnable() {
|
|
154 | 155 |
|
155 |
public void run() { |
|
156 |
for (int i = 0; i < expressionListeners.size(); i++) { |
|
157 |
ExpressionListener l = |
|
158 |
(ExpressionListener) expressionListeners |
|
159 |
.get(i); |
|
160 |
try { |
|
161 |
l.addToSet(expr); |
|
162 |
} catch (DataException e) { |
|
163 |
e.printStackTrace(); |
|
156 |
@Override |
|
157 |
public void run() { |
|
158 |
for (ExpressionListener l : expressionListeners) { |
|
159 |
try { |
|
160 |
l.addToSet(expr); |
|
161 |
} catch (DataException e) { |
|
162 |
logger.warn("Can't add expression '"+expr+"' to set.", e); |
|
163 |
} |
|
164 | 164 |
} |
165 | 165 |
} |
166 |
} |
|
167 |
}); |
|
168 |
} |
|
169 |
}); |
|
166 |
}); |
|
167 |
} |
|
168 |
}); |
|
170 | 169 |
|
171 | 170 |
// Listener for "btnNuevo" |
172 | 171 |
// Adds a new set |
173 | 172 |
getBtnNewSet().addActionListener(new java.awt.event.ActionListener() { |
174 | 173 |
|
174 |
@Override |
|
175 | 175 |
public void actionPerformed(java.awt.event.ActionEvent e) { |
176 |
// final String expr = "select * from '" + |
|
177 |
// model.getName() + "' where " + |
|
178 |
// getTxtExpression().getText() + ";"; |
|
179 | 176 |
final String expr = getTxtExpression().getText(); |
177 |
if (!validateQuotes(expr) || !validateLike(expr)) { |
|
178 |
return; |
|
179 |
} |
|
180 | 180 |
|
181 |
logger.debug(expr); |
|
182 |
|
|
183 | 181 |
PluginServices.backgroundExecution(new Runnable() { |
184 | 182 |
|
183 |
@Override |
|
185 | 184 |
public void run() { |
186 |
for (int i = 0; i < expressionListeners.size(); i++) { |
|
187 |
ExpressionListener l = |
|
188 |
(ExpressionListener) expressionListeners.get(i); |
|
185 |
for (ExpressionListener l : expressionListeners) { |
|
189 | 186 |
try { |
190 | 187 |
l.newSet(expr); |
191 | 188 |
} catch (DataException e) { |
192 |
// TODO Auto-generated catch block |
|
193 |
NotificationManager.addError(e); |
|
189 |
logger.warn("Can't create set with expression '"+expr+"'.", e); |
|
194 | 190 |
} |
195 | 191 |
} |
196 | 192 |
} |
... | ... | |
202 | 198 |
// Selects elements from the current filtered selection |
203 | 199 |
getBtnFromSet().addActionListener(new java.awt.event.ActionListener() { |
204 | 200 |
|
201 |
@Override |
|
205 | 202 |
public void actionPerformed(java.awt.event.ActionEvent e) { |
206 |
// final String expr = "select * from '" + |
|
207 |
// model.getName() + "' where " + |
|
208 |
// getTxtExpression().getText() + ";"; |
|
209 | 203 |
final String expr = getTxtExpression().getText(); |
210 |
logger.debug(expr); |
|
204 |
if (!validateQuotes(expr) || !validateLike(expr) ) { |
|
205 |
return; |
|
206 |
} |
|
211 | 207 |
|
212 | 208 |
PluginServices.backgroundExecution(new Runnable() { |
213 | 209 |
|
210 |
@Override |
|
214 | 211 |
public void run() { |
215 |
for (int i = 0; i < expressionListeners.size(); i++) { |
|
216 |
ExpressionListener l = |
|
217 |
(ExpressionListener) expressionListeners.get(i); |
|
212 |
for (ExpressionListener l : expressionListeners) { |
|
218 | 213 |
try { |
219 | 214 |
l.fromSet(expr); |
220 | 215 |
} catch (DataException e) { |
221 |
NotificationManager.addError(e);
|
|
216 |
logger.warn("Can't create expression '"+expr+"' from set.", e);
|
|
222 | 217 |
} |
223 | 218 |
} |
224 | 219 |
} |
... | ... | |
229 | 224 |
// Listener for "fieldsJTree" |
230 | 225 |
getFieldsJTree().addMouseListener(new MouseAdapter() { |
231 | 226 |
|
232 |
/* |
|
233 |
* (non-Javadoc) |
|
234 |
* |
|
235 |
* @see |
|
236 |
* java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent |
|
237 |
* ) |
|
238 |
*/ |
|
239 | 227 |
@Override |
240 | 228 |
public void mouseClicked(MouseEvent e) { |
241 | 229 |
int row = fieldsJTree.getRowForLocation(e.getX(), e.getY()); |
242 |
|
|
243 | 230 |
if (row > -1) { |
244 | 231 |
switch (e.getClickCount()) { |
245 |
case 1: |
|
246 |
fillValues(row); |
|
247 |
break; |
|
248 |
case 2: |
|
249 |
putSymbol(jtreeRoot.getChildAt(row).toString()); |
|
250 |
break; |
|
232 |
case 1:
|
|
233 |
fillValues(row);
|
|
234 |
break;
|
|
235 |
case 2:
|
|
236 |
putSymbol(jtreeRoot.getChildAt(row).toString());
|
|
237 |
break;
|
|
251 | 238 |
} |
252 | 239 |
} |
253 | 240 |
} |
... | ... | |
256 | 243 |
// Listener for "valuesJList" |
257 | 244 |
getValuesJList().addMouseListener(new MouseAdapter() { |
258 | 245 |
|
259 |
/* |
|
260 |
* (non-Javadoc) |
|
261 |
* |
|
262 |
* @see |
|
263 |
* java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent |
|
264 |
* ) |
|
265 |
*/ |
|
266 | 246 |
@Override |
267 | 247 |
public void mouseClicked(MouseEvent e) { |
268 | 248 |
if (e.getClickCount() == 2) { |
269 |
Object valor = |
|
270 |
valuesListModel.getElementAt(getValuesJList() |
|
249 |
Object valor = valuesListModel.getElementAt(getValuesJList() |
|
271 | 250 |
.getSelectedIndex()); |
272 |
|
|
273 |
if (valor instanceof Date) { |
|
251 |
if (valor == null) { |
|
252 |
putSymbol("null"); |
|
253 |
} else if (valor instanceof Date) { |
|
274 | 254 |
putSymbol("date('" + valor + "')"); |
275 |
} else |
|
276 |
if (valor instanceof Boolean) { |
|
277 |
putSymbol(valor.toString()); |
|
278 |
} else |
|
279 |
if (valor instanceof String) { |
|
280 |
putSymbol("'" + valor + "'"); |
|
281 |
} else { |
|
282 |
putSymbol(valor.toString()); |
|
283 |
} |
|
255 |
} else if (valor instanceof Boolean) { |
|
256 |
putSymbol(valor.toString()); |
|
257 |
} else if (valor instanceof String) { |
|
258 |
// putSymbol("'" + StringEscapeUtils.escapeSql((String) valor) + "'"); |
|
259 |
putSymbol("'" + ((String)valor).replace('\'', '?') + "'"); |
|
260 |
} else { |
|
261 |
putSymbol(StringEscapeUtils.escapeSql(valor.toString())); |
|
262 |
} |
|
284 | 263 |
} |
285 | 264 |
} |
286 | 265 |
}); |
287 | 266 |
} |
288 | 267 |
|
268 |
private boolean validateQuotes(String expr) { |
|
269 |
if ((StringUtils.countMatches(expr, "'") % 2) != 0) { |
|
270 |
ApplicationManager application = ApplicationLocator.getManager(); |
|
271 |
I18nManager i18n = ToolsLocator.getI18nManager(); |
|
272 |
String msg = i18n.getTranslation("_The_number_of_quotes_is_doubtful_It_could_be_that_some_of_them_should_escape_Do_you_want_to_continue_the_operation_anyway"); |
|
273 |
int resp = application.confirmDialog( |
|
274 |
msg, |
|
275 |
i18n.getTranslation("_Caution"), |
|
276 |
JOptionPane.YES_NO_OPTION, |
|
277 |
JOptionPane.QUESTION_MESSAGE, |
|
278 |
"Doubtless number of quotes in the filter dialog" |
|
279 |
); |
|
280 |
if (resp == JOptionPane.NO_OPTION) { |
|
281 |
return false; |
|
282 |
} |
|
283 |
} |
|
284 |
return true; |
|
285 |
|
|
286 |
} |
|
287 |
|
|
288 |
private boolean validateLike(String expr) { |
|
289 |
if( (expr.toLowerCase().contains("?") || |
|
290 |
expr.toLowerCase().contains("%")) && |
|
291 |
!expr.toLowerCase().contains("like") ) |
|
292 |
{ |
|
293 |
ApplicationManager application = ApplicationLocator.getManager(); |
|
294 |
I18nManager i18n = ToolsLocator.getI18nManager(); |
|
295 |
String msg = i18n.getTranslation("_It_looks_like_youre_using_percent_o_question_and_the_like_operator_is_not_being_used_I_should_probably_keep_the_equal_operator_by_like_Do_you_want_to_continue_anyway"); |
|
296 |
int resp = application.confirmDialog( |
|
297 |
msg, |
|
298 |
i18n.getTranslation("_Caution"), |
|
299 |
JOptionPane.YES_NO_OPTION, |
|
300 |
JOptionPane.QUESTION_MESSAGE, |
|
301 |
"You may need the like operator in the filter dialog" |
|
302 |
); |
|
303 |
if (resp == JOptionPane.NO_OPTION) { |
|
304 |
return false; |
|
305 |
} |
|
306 |
} |
|
307 |
return true; |
|
308 |
|
|
309 |
} |
|
289 | 310 |
/** |
290 | 311 |
* Rellena la lista con los valores del campo seleccionado |
291 | 312 |
*/ |
Also available in: Unified diff