Revision 44262 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/featureform/swing/impl/dynformfield/linkforeingkey/JDynFormFieldForeingKey.java
JDynFormFieldForeingKey.java | ||
---|---|---|
41 | 41 |
import javax.swing.ListModel; |
42 | 42 |
import javax.swing.event.ListDataListener; |
43 | 43 |
import javax.swing.text.JTextComponent; |
44 |
import org.gvsig.expressionevaluator.Expression; |
|
45 |
import org.gvsig.expressionevaluator.ExpressionBuilder; |
|
46 |
import org.gvsig.expressionevaluator.ExpressionUtils; |
|
47 | 44 |
import org.gvsig.featureform.swing.JFeaturesForm; |
48 | 45 |
import org.gvsig.featureform.swing.JFeaturesForm.FeaturesFormContext; |
49 |
import org.gvsig.fmap.dal.DALLocator; |
|
50 |
import org.gvsig.fmap.dal.DataManager; |
|
51 |
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable; |
|
46 |
import org.gvsig.fmap.dal.StoresRepository; |
|
52 | 47 |
import org.gvsig.fmap.dal.feature.Feature; |
48 |
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor; |
|
53 | 49 |
import org.gvsig.fmap.dal.feature.FeatureQuery; |
54 | 50 |
import org.gvsig.fmap.dal.feature.FeatureStore; |
51 |
import org.gvsig.fmap.dal.feature.FeatureType; |
|
52 |
import org.gvsig.fmap.dal.feature.ForeingKey; |
|
53 |
import org.gvsig.fmap.dal.feature.ForeingKey.ContextForeingKey; |
|
55 | 54 |
import org.gvsig.fmap.dal.swing.DALSwingLocator; |
56 | 55 |
import org.gvsig.fmap.dal.swing.DataSwingManager; |
56 |
import org.gvsig.tools.ToolsLocator; |
|
57 |
import org.gvsig.tools.dispose.DisposeUtils; |
|
57 | 58 |
import org.gvsig.tools.dynform.DynFormFieldDefinition; |
58 |
import org.gvsig.tools.dynform.JDynForm.DynFormContext;
|
|
59 |
import org.gvsig.tools.dynform.JDynForm; |
|
59 | 60 |
|
60 | 61 |
import org.gvsig.tools.dynform.JDynFormField; |
61 | 62 |
import org.gvsig.tools.dynform.spi.DynFormSPIManager; |
... | ... | |
71 | 72 |
@SuppressWarnings("UseSpecificCatch") |
72 | 73 |
public class JDynFormFieldForeingKey extends AbstractJDynFormField implements JDynFormField { |
73 | 74 |
|
74 |
private static final String DAL_FOREING_CODE = "DAL.foreingCode"; |
|
75 |
private static final String DAL_FOREING_TABLE = "DAL.foreingTable"; |
|
76 |
private static final String DAL_FOREING_LABEL = "DAL.foreingLabel"; |
|
77 |
|
|
78 | 75 |
private Object assignedValue = null; |
79 | 76 |
private Object value = null; |
80 | 77 |
private JTextComponent txtDescription = null; |
... | ... | |
212 | 209 |
return button; |
213 | 210 |
} |
214 | 211 |
|
212 |
private ForeingKey getForeingKey() { |
|
213 |
JDynForm.DynFormContext context = this.getForm().getContext(); |
|
214 |
if( !(context instanceof FeaturesFormContext) ) { |
|
215 |
return null; |
|
216 |
} |
|
217 |
FeatureType featureType = ((FeaturesFormContext)context).getFeatureType(); |
|
218 |
if( featureType==null ) { |
|
219 |
return null; |
|
220 |
} |
|
221 |
FeatureAttributeDescriptor attribute = featureType.getAttributeDescriptor(this.getName()); |
|
222 |
if( attribute == null ) { |
|
223 |
return null; |
|
224 |
} |
|
225 |
ForeingKey foreingKey = attribute.getForeingKey(); |
|
226 |
return foreingKey; |
|
227 |
} |
|
228 |
|
|
215 | 229 |
private void doLink() { |
216 |
final String foreingTableName = getTagValueAsString(DAL_FOREING_TABLE, null); |
|
217 |
final String foreingCodeName = getTagValueAsString(DAL_FOREING_CODE, null); |
|
230 |
final ForeingKey foreingKey = this.getForeingKey(); |
|
231 |
if( foreingKey==null ) { |
|
232 |
return; |
|
233 |
} |
|
234 |
final ContextForeingKey context = foreingKey.createContext(); |
|
218 | 235 |
try { |
219 |
WindowManager_v2 winManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager(); |
|
220 |
|
|
221 |
FeatureStore store = null; |
|
222 |
DynFormContext context = this.getForm().getContext(); |
|
223 |
if( context instanceof FeaturesFormContext ) { |
|
224 |
store = ((FeaturesFormContext) context).getFeatureStore(foreingTableName); |
|
225 |
} |
|
226 |
final List<Feature> features = store.getFeatures(); |
|
236 |
final List<Feature> features = foreingKey.getFeatures(context); |
|
237 |
|
|
227 | 238 |
ListModel<String> model = new ListModel<String>() { |
228 | 239 |
@Override |
229 | 240 |
public int getSize() { |
... | ... | |
233 | 244 |
@Override |
234 | 245 |
public String getElementAt(int index) { |
235 | 246 |
Feature feature = features.get(index); |
236 |
return getDescription(feature); |
|
247 |
ForeingKey foreingKey = getForeingKey(); |
|
248 |
return foreingKey.getLabel(context, feature); |
|
237 | 249 |
} |
238 | 250 |
|
239 | 251 |
@Override |
... | ... | |
244 | 256 |
public void removeListDataListener(ListDataListener l) { |
245 | 257 |
} |
246 | 258 |
}; |
259 |
WindowManager_v2 winManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager(); |
|
260 |
|
|
247 | 261 |
final JList<String> jlist = new JList<>(); |
248 | 262 |
jlist.setModel(model); |
249 | 263 |
jlist.setPreferredSize(new Dimension(350, 200)); |
... | ... | |
263 | 277 |
} |
264 | 278 |
Feature feature = features.get(n); |
265 | 279 |
if( feature!=null ) { |
266 |
setValue(feature.get(foreingCodeName));
|
|
280 |
setValue(foreingKey.getCode(context, feature));
|
|
267 | 281 |
} |
268 | 282 |
} |
269 | 283 |
} |
... | ... | |
272 | 286 |
|
273 | 287 |
} catch (Exception ex) { |
274 | 288 |
LOGGER.warn("Can't show selector", ex); |
289 |
} finally { |
|
290 |
DisposeUtils.disposeQuietly(context); |
|
275 | 291 |
} |
276 | 292 |
} |
277 | 293 |
|
... | ... | |
283 | 299 |
if (this.value == null) { |
284 | 300 |
return; |
285 | 301 |
} |
286 |
String foreingTableName = getTagValueAsString(DAL_FOREING_TABLE, null); |
|
287 |
String foreingCodeName = getTagValueAsString(DAL_FOREING_CODE, null); |
|
302 |
final ForeingKey foreingKey = this.getForeingKey(); |
|
303 |
if( foreingKey==null ) { |
|
304 |
return; |
|
305 |
} |
|
306 |
final ContextForeingKey context = foreingKey.createContext(); |
|
288 | 307 |
try { |
289 | 308 |
this.btnEdit.setEnabled(false); |
290 |
DataManager dataManager = DALLocator.getDataManager(); |
|
291 | 309 |
DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager(); |
292 |
|
|
293 |
FeatureStore store = null; |
|
294 |
DynFormContext context = this.getForm().getContext(); |
|
295 |
if( context instanceof FeaturesFormContext ) { |
|
296 |
store = ((FeaturesFormContext) context).getFeatureStore(foreingTableName); |
|
297 |
} |
|
298 |
if( store == null ) { |
|
299 |
this.problemIndicator().set("Unable to locate the related table '" + foreingTableName + "'."); |
|
300 |
return; |
|
301 |
} |
|
302 |
ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder(); |
|
303 |
FeatureQuery query = store.createFeatureQuery(); |
|
304 |
query.setFilter(builder.eq( |
|
305 |
builder.variable(foreingCodeName), |
|
306 |
builder.constant(value) |
|
307 |
).toString() |
|
310 |
FeatureQuery query = foreingKey.getQuery(context, value); |
|
311 |
JFeaturesForm form = dataSwingManager.createJFeaturesForm( |
|
312 |
foreingKey.getFeatureStore(context) |
|
308 | 313 |
); |
309 |
query.retrievesAllAttributes(); |
|
310 |
JFeaturesForm form = dataSwingManager.createJFeaturesForm(store); |
|
311 | 314 |
form.setQuery(query); |
312 | 315 |
form.showForm(WindowManager.MODE.WINDOW); |
313 | 316 |
|
... | ... | |
315 | 318 |
LOGGER.warn("Can't show linked form", ex); |
316 | 319 |
} finally { |
317 | 320 |
this.btnEdit.setEnabled(true); |
321 |
DisposeUtils.disposeQuietly(context); |
|
318 | 322 |
} |
319 | 323 |
} |
320 | 324 |
|
... | ... | |
322 | 326 |
if (this.value == null) { |
323 | 327 |
return null; |
324 | 328 |
} |
325 |
String foreingLabel = getTagValueAsString(DAL_FOREING_LABEL, null); |
|
326 |
String foreingTableName = getTagValueAsString(DAL_FOREING_TABLE, null); |
|
327 |
String foreingCodeName = getTagValueAsString(DAL_FOREING_CODE, null); |
|
328 | 329 |
try { |
329 |
FeatureStore store = null; |
|
330 |
DynFormContext context = this.getForm().getContext(); |
|
331 |
if( context instanceof FeaturesFormContext ) { |
|
332 |
store = ((FeaturesFormContext) context).getFeatureStore(foreingTableName); |
|
330 |
final ForeingKey foreingKey = this.getForeingKey(); |
|
331 |
if( foreingKey==null ) { |
|
332 |
return null; |
|
333 | 333 |
} |
334 |
if ( store == null ) { |
|
335 |
this.problemIndicator().set("Unable to locate the related table '" + foreingTableName + "'."); |
|
336 |
return Objects.toString(value, ""); |
|
337 |
} |
|
338 |
ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder(); |
|
339 |
Feature feature = store.findFirst( |
|
340 |
builder.eq( |
|
341 |
builder.variable(foreingCodeName), |
|
342 |
builder.constant(value) |
|
343 |
).toString() |
|
344 |
); |
|
345 |
return this.getDescription(feature); |
|
346 |
|
|
334 |
String description = foreingKey.getLabel(null, value); |
|
335 |
return description; |
|
347 | 336 |
} catch (Exception ex) { |
348 |
LOGGER.warn("Can't get description from table '" + foreingTableName + "' for field '" + this.getForm().getDefinition().getName() + ":" + this.getName() + "'.", ex); |
|
349 | 337 |
} |
350 | 338 |
return null; |
351 | 339 |
|
352 | 340 |
} |
353 | 341 |
|
354 |
private String getDescription(Feature feature) { |
|
355 |
if (feature == null) { |
|
356 |
return null; |
|
357 |
} |
|
358 |
String foreingLabel = getTagValueAsString(DAL_FOREING_LABEL, null); |
|
359 |
DataManager dataManager = DALLocator.getDataManager(); |
|
360 |
|
|
361 |
Expression labelExpression = ExpressionUtils.createExpression(foreingLabel); |
|
362 |
FeatureSymbolTable symbolTable = dataManager.createFeatureSymbolTable(); |
|
363 |
symbolTable.setFeature(feature); |
|
364 |
Object x = labelExpression.execute(symbolTable.createParent()); |
|
365 |
if (x == null) { |
|
366 |
return null; |
|
367 |
} |
|
368 |
return x.toString(); |
|
369 |
} |
|
370 |
|
|
371 | 342 |
@Override |
372 | 343 |
public void setReadOnly(boolean readonly) { |
373 | 344 |
initComponentIfNeed(); |
Also available in: Unified diff