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

View differences:

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