Revision 42775 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/DefaultJFeatureForm.java

View differences:

DefaultJFeatureForm.java
1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright ? 2007-2014 gvSIG Association
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18
 * MA  02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us
21
 * at info AT gvsig.com, or visit our website www.gvsig.com.
22
 */
1

  
23 2
package org.gvsig.featureform.swing.impl;
24 3

  
25
import java.awt.BorderLayout;
26
import java.awt.Dimension;
27
import java.awt.event.ActionEvent;
28
import java.util.ArrayList;
29
import java.util.List;
30
import javax.swing.AbstractAction;
31
import javax.swing.Action;
32

  
33 4
import javax.swing.JComponent;
34
import javax.swing.JOptionPane;
35
import javax.swing.JPanel;
36
import org.apache.commons.lang3.StringUtils;
37

  
38
import org.slf4j.Logger;
39
import org.slf4j.LoggerFactory;
40

  
41 5
import org.gvsig.featureform.swing.JFeatureForm;
42 6
import org.gvsig.fmap.dal.DALLocator;
43
import org.gvsig.fmap.dal.DataManager;
44
import org.gvsig.fmap.dal.exception.DataException;
45 7
import org.gvsig.fmap.dal.feature.EditableFeature;
46 8
import org.gvsig.fmap.dal.feature.Feature;
47
import org.gvsig.fmap.dal.feature.FeatureQuery;
48
import org.gvsig.fmap.dal.feature.FeatureSet;
49 9
import org.gvsig.fmap.dal.feature.FeatureStore;
50
import org.gvsig.fmap.dal.feature.FeatureStoreNotification;
51
import org.gvsig.fmap.dal.feature.paging.FeaturePagingHelper;
52
import org.gvsig.fmap.dal.swing.DALSwingLocator;
53
import org.gvsig.fmap.dal.swing.DataSwingManager;
54
import org.gvsig.fmap.dal.swing.queryfilter.QueryFilterExpresion;
55
import org.gvsig.tools.ToolsLocator;
56
import org.gvsig.tools.dynform.AbortActionException;
10
import org.gvsig.fmap.dal.feature.FeatureType;
11
import org.gvsig.fmap.dal.feature.FeatureTypeDefinitionsManager;
57 12
import org.gvsig.tools.dynform.DynFormLocator;
58
import org.gvsig.tools.dynform.DynFormManager;
59 13
import org.gvsig.tools.dynform.JDynForm;
60
import org.gvsig.tools.dynform.JDynFormSet;
61
import org.gvsig.tools.dynform.JDynFormSet.JDynFormSetListener;
62 14
import org.gvsig.tools.dynobject.DynClass;
63
import org.gvsig.tools.dynobject.DynObject;
64
import org.gvsig.tools.exception.BaseException;
65
import org.gvsig.tools.i18n.I18nManager;
66
import org.gvsig.tools.observer.Observable;
67
import org.gvsig.tools.observer.Observer;
68
import org.gvsig.tools.service.ServiceException;
69
import org.gvsig.tools.swing.api.ToolsSwingLocator;
70
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
71
import org.gvsig.tools.swing.api.windowmanager.Dialog;
72
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
73
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
74
import org.gvsig.tools.swing.api.windowmanager.WindowManager.MODE;
75
import org.gvsig.tools.swing.icontheme.IconTheme;
15
import org.slf4j.Logger;
16
import org.slf4j.LoggerFactory;
76 17

  
77
/**
78
 * @author fdiaz
79
 *
80
 */
81
public class DefaultJFeatureForm implements JFeatureForm {
82 18

  
83
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultJFeatureForm.class);
84

  
85
    private static final int PAGE_SIZE = 500;
86
    private final JPanel panel;
87
    private JDynFormSet formset;
88
    private FeatureStore store;
89
    private FeaturePagingHelper ph;
90
    private DynClass definition = null;
91
    private FeatureQuery currentQuery;
92
    private List<Action> otherActions;
93

  
94
    public DefaultJFeatureForm() {
95
        this.panel = new JPanel(new BorderLayout());
96
        this.otherActions = new ArrayList<>();
97
    }
98

  
19
public class DefaultJFeatureForm implements JFeatureForm {
20
    private static final Logger logger = LoggerFactory.getLogger(DefaultJFeatureForm.class);
21
    
22
    Feature feature;
23
    FeatureStore store;
24
    JDynForm form;
25
    
99 26
    @Override
100
    public void setPreferredSize(Dimension dimension) {
101
        panel.setPreferredSize(dimension);
102
    }
103

  
104
    private void updateForm() {
105
        if (this.formset == null) {
106
            this.panel.add(this.getFormset().asJComponent(), BorderLayout.CENTER);
107
        }
108
        try {
109
            this.ph = DALLocator.getDataManager().createFeaturePagingHelper(store, this.currentQuery, PAGE_SIZE);
110
            this.formset.setValues(ph.asListOfDynObjects());
111
        } catch (Exception ex) {
112
            throw new RuntimeException("Can't update form", ex);
113
        }
114
        this.formset.setReadOnly(false);
115
    }
116

  
117
    @Override
118 27
    public JComponent asJComponent() {
119
        if (this.ph == null) {
120
            try {
121
                updateForm();
122
            } catch (Exception ex) {
123
                throw new RuntimeException(ex);
124
            }
125
        }
126
        return this.panel;
28
       return this.form.asJComponent();
127 29
    }
128 30

  
129
    @Override
130
    public void bind(FeatureStore store) {
131
        if (store == null) {
132
            throw new IllegalArgumentException("bind need a store as parameter, not a null.");
133
        }
134
        try {
135
            this.bind(store, store.getDefaultFeatureType());
136
        } catch (Exception ex) {
137
            throw new RuntimeException("Can't bind store '" + store.getName() + "' to form", ex);
138
        }
31
    public DefaultJFeatureForm() {
32
    	this.feature = null;
33
        this.store = null;
139 34
    }
140

  
141
    public void bind(FeatureStore store, DynClass definition) throws ServiceException, DataException {
142
        if (this.store == store) {
35
    
36
    @Override
37
    public void setStore(FeatureStore store) {
38
        if( this.store.equals(store) ) {
143 39
            return;
144 40
        }
145
        if( definition == null ) {
146
            definition = store.getDefaultFeatureType();
147
        }
148
        if (formset != null) {
149
            this.panel.remove(formset.asJComponent());
150
            this.formset = null;
151
        }
152 41
        this.store = store;
153
        this.ph = null;
154
        this.definition = definition;
155
    }
156

  
157
    @Override
158
    public JDynFormSet getFormset() {
159
        if (this.formset == null) {
160
            DynFormManager formManager = DynFormLocator.getDynFormManager();
161
            try {
162
                this.formset = formManager.createJDynFormSet(this.definition);
163
            } catch (ServiceException ex) {
164
                throw new RuntimeException("Can't create form set.", ex);
165
            }
166

  
167
            this.formset.setLayoutMode(JDynForm.USE_SEPARATORS);
168
            this.formset.setReadOnly(false);
169
            this.formset.setAllowClose(true);
170
            this.formset.setAllowDelete(false);
171
            this.formset.setAllowNew(false);
172
            this.formset.setAllowSearch(true);
173
            this.formset.setAllowUpdate(true);
174
            this.formset.setAutosave(true);
175

  
176
            this.formset.addAction(new FinishEditingAction());
177
            for( Action action : this.otherActions ) {
178
                this.formset.addAction(action);
179
            }
180

  
181
            this.formset.addListener(new FormSetListener());
42
        if( store == null ) {
43
            this.form = null;
44
            return;
182 45
        }
183
        return this.formset;
184
    }
185

  
186
    @Override
187
    public void addAction(Action action) {
188
        this.otherActions.add(action);
189
        if( this.formset!=null ) {
190
            this.formset.addAction(action);
191
        }
192
    }
193

  
194
    @Override
195
    public long getCurrentIndex() {
196
        if( this.formset==null ) {
197
            return -1;
198
        }
199
        return this.formset.getCurrentIndex();
200
    }
201

  
202
    @Override
203
    public Feature get(long index) {
204
        if( this.formset==null || this.ph==null ) {
205
            return null;
206
        }
207 46
        try {
208
            return this.ph.getFeatureAt(index);
209
        } catch (BaseException ex) {
210
            return null;
47
            FeatureType featureType = this.store.getDefaultFeatureType();
48
            FeatureTypeDefinitionsManager featureTypeDefinitionsManager = DALLocator.getFeatureTypeDefinitionsManager();
49
            DynClass dynClass = featureTypeDefinitionsManager.get(store,featureType);
50
            this.form = DynFormLocator.getDynFormManager().createJDynForm(dynClass);
51
        } catch (Exception ex) {
52
            logger.warn("Can't create form.",ex);
53
            throw new RuntimeException("Can't create form.",ex);
211 54
        }
212 55
    }
213

  
214
    private class FinishEditingAction extends AbstractAction implements Observer {
215

  
216
        public FinishEditingAction() {
217
            I18nManager i18nManager = ToolsLocator.getI18nManager();
218
            IconTheme iconTheme = ToolsSwingLocator.getIconThemeManager().getDefault();
219

  
220
            this.putValue(NAME,null);
221
            this.putValue(SHORT_DESCRIPTION,i18nManager.getTranslation("_Stop_editing"));
222
            this.putValue(SMALL_ICON, iconTheme.get("table-stop-editing"));
223
            this.putValue(ACTION_COMMAND_KEY, "finishEditing");
224

  
225
            this.setEnabled(store.isEditing());
226
            store.addObserver(this);
227
        }
228

  
229
        @Override
230
        public void actionPerformed(ActionEvent ae) {
231
            if( store.isEditing() ) {
232
                try {
233
                    I18nManager i18nManager = ToolsLocator.getI18nManager();
234
                    ThreadSafeDialogsManager dialogManager = ToolsSwingLocator.getThreadSafeDialogsManager();
235
                    int x = dialogManager.confirmDialog(
236
                            "? Desea terminar edicion y guardar los cambios ?\n\nPulse cancelar para cancelar la edicion y los cambios.",
237
                            i18nManager.getTranslation("_Stop_editing"),
238
                            JOptionPane.YES_NO_CANCEL_OPTION,
239
                            JOptionPane.QUESTION_MESSAGE
240
                    );
241
                    switch(x) {
242
                        case JOptionPane.YES_OPTION:
243
                            store.finishEditing();
244
                            break;
245
                        case JOptionPane.NO_OPTION:
246
                            break;
247
                        case JOptionPane.CANCEL_OPTION:
248
                            store.cancelEditing();
249
                            break;
250
                    }
251
                } catch (DataException ex) {
252
                    LOGGER.warn("Can't finish editing in FeatureForm ("+store.getName()+").",ex);
253
                }
254
            }
255
        }
256

  
257
        @Override
258
        public void update(Observable observable, Object notification) {
259
            if( notification instanceof FeatureStoreNotification ) {
260
                FeatureStoreNotification n =  (FeatureStoreNotification) notification;
261
                switch( n.getType() )  {
262
                    case FeatureStoreNotification.AFTER_STARTEDITING:
263
                        this.setEnabled(true);
264
                        break;
265
                    case FeatureStoreNotification.AFTER_FINISHEDITING:
266
                        this.setEnabled(false);
267
                        break;
268
                    case FeatureStoreNotification.AFTER_CANCELEDITING:
269
                        this.setEnabled(false);
270
                        break;
271
                }
272
            }
273
        }
274

  
275
    }
276

  
56
    
277 57
    @Override
278
    public void setQuery(FeatureQuery query) {
279
        if (this.ph != null) {
280
            if (this.formset != null && this.formset.isAutosave() && this.formset.countValues() > 0) {
281
                if (!store.isEditing()) {
282
                    try {
283
                        store.edit();
284
                    } catch (DataException e1) {
285
                        throw new RuntimeException("Can't set query", e1);
286
                    }
287
                }
288
                saveChanges(this.formset);
289
            }
290
        }
291
        this.currentQuery = query;
292
        updateForm();
58
    public void setFeature(Feature feature) {
59
        this.feature = feature;
60
        this.setStore(this.feature.getStore());
61
        this.form.setValues(feature.getAsDynObject());
293 62
    }
294

  
63
    
295 64
    @Override
296
    public void showForm(MODE mode) {
297
        this.panel.add(this.getFormset().asJComponent(), BorderLayout.CENTER);
298
        WindowManager winmgr = ToolsSwingLocator.getWindowManager();
299
        winmgr.showWindow(this.asJComponent(), store.getName(), mode);
65
    public JDynForm getDynForm() {
66
        return this.form;
300 67
    }
301

  
302
    private void saveChanges(JDynFormSet dynformSet) {
303
        int index = dynformSet.getCurrentIndex();
304
        DynObject dynObject = dynformSet.get(index);
305
        dynformSet.getFormValues(dynObject);
306
        Feature feat = store.getFeature(dynObject);
307
        if (feat == null) {
308
            LOGGER.warn("Can't get the associated feature index " + index);
309
            I18nManager i18nManager = ToolsLocator.getI18nManager();
310
            dynformSet.message(i18nManager.getTranslation("error_saving_data_will_not_save"));
311
            throw new RuntimeException("Can't save values");
312
        }
313

  
314
        try {
315
            ph.update(feat.getEditable());
316
        } catch (BaseException e) {
317
            throw new RuntimeException("Can't save values", e);
318
        }
319
    }
320

  
68
    
321 69
    @Override
322
    public void saveChanges() {
323
        if (this.formset != null && this.formset.countValues() > 0) {
324
            if (store != null && !store.isEditing()) {
325
                try {
326
                    store.edit();
327
                } catch (DataException e1) {
328
                    LOGGER.warn("Can't edit the store " + store.getName());
329
                    throw new RuntimeException("Can't save changes.", e1);
330
                }
331
            }
332
            this.saveChanges(this.formset);
333
        }
70
    public void fetch(EditableFeature feature) {
71
        this.form.getValues(feature.getAsDynObject());
334 72
    }
335

  
336
    @Override
337
    public long getDataSetSize() {
338
        if (this.ph != null) {
339
            return ph.getTotalSize();
340
        }
341
        return 0;
342
    }
343

  
344
    @Override
345
    public FeatureStore getFeatureStore() {
346
        return this.store;
347
    }
348

  
349
    private class FormSetListener implements JDynFormSetListener {
350

  
351
        @Override
352
        public void formMessage(String message) {
353
        }
354

  
355
        @Override
356
        public void formClose() {
357
            panel.setVisible(false);
358
        }
359

  
360
        @Override
361
        public void formMovedTo(int currentPosition) throws AbortActionException {
362
            LOGGER.trace("formMovedTo " + currentPosition);
363
        }
364

  
365
        @Override
366
        public void formBeforeSave(JDynFormSet dynformSet) throws AbortActionException {
367
            LOGGER.trace("formBeforeSave");
368
            if (!store.isEditing()) {
369
                try {
370
                    store.edit();
371
                } catch (DataException e1) {
372
                    throw new StoreEditException(e1, store.getName());
373
                }
374
            }
375
        }
376

  
377
        public void formBeforeNew(JDynFormSet dynformSet) throws AbortActionException {
378
            LOGGER.trace("formBeforeNew");
379
        }
380

  
381
        public void formBeforeDelete(JDynFormSet dynformSet) throws AbortActionException {
382
            LOGGER.trace("formBeforeDelete");
383
        }
384

  
385
        @Override
386
        public void formAfterSave(JDynFormSet dynformSet) throws AbortActionException {
387
            LOGGER.trace("formAfterSave");
388
            saveChanges(dynformSet);
389
        }
390

  
391
        @Override
392
        public void formAfterNew(JDynFormSet dynformSet) throws AbortActionException {
393
            LOGGER.trace("formAfterNew");
394
        }
395

  
396
        @Override
397
        public void formAfterDelete(JDynFormSet dynformSet) throws AbortActionException {
398
            LOGGER.trace("formAfterDelete");
399
        }
400

  
401
        @Override
402
        public void formBeforeSearch(JDynFormSet dynformSet) throws AbortActionException {
403
            LOGGER.trace("formBeforeSearch");
404
            DataManager dataManager = DALLocator.getDataManager();
405
            DataSwingManager dataSwingmanager = DALSwingLocator.getSwingManager();
406
            WindowManager_v2 winmgr = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
407

  
408
            QueryFilterExpresion querypanel = dataSwingmanager.createQueryFilterExpresion(store);
409
            Dialog dialog = winmgr.createDialog(
410
                    querypanel.asJComponent(),
411
                    "Filtro",
412
                    "Creacion de filtro sobre '"+store.getName()+"'",
413
                    WindowManager_v2.BUTTONS_OK_CANCEL
414
            );
415
            dialog.show(WindowManager.MODE.DIALOG);
416

  
417
            if( dialog.getAction() == WindowManager_v2.BUTTON_OK ) {
418
                String expresion = querypanel.getExpresion();
419
                try {
420
                    FeatureQuery query = store.createFeatureQuery();
421
                    if( !StringUtils.isEmpty(expresion) ) {
422
                        query.setFilter(dataManager.createExpresion(expresion));
423
                    }
424
                    FeatureSet set = store.getFeatureSet(query);
425
                    setQuery(query);
426
                } catch (Exception ex) {
427
                    LOGGER.warn("Can't apply filter '" + expresion + "'.", ex);
428
                    return;
429
                }
430
            }
431
        }
432

  
433
        @Override
434
        public void formAfterSearch(JDynFormSet dynformSet) throws AbortActionException {
435
            LOGGER.trace("formAfterSearch");
436
        }
437
    }
438

  
439
    private static class StoreEditException extends AbortActionException {
440

  
441
        /**
442
         *
443
         */
444
        private static final long serialVersionUID = -7682017811778577130L;
445

  
446
        public StoreEditException(Throwable cause, String storename) {
447
            super("Can't edit the store '%(storename)'", cause, "cant_edit_the store_XstorenameX", serialVersionUID);
448
            setValue("storename", storename);
449
        }
450
    }
73
    
451 74
}

Also available in: Unified diff