Project

General

Profile

Download (11.5 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2017 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.cdm.vaadin.view.name;
10

    
11
import java.util.Collection;
12
import java.util.EnumSet;
13

    
14
import org.springframework.context.annotation.Scope;
15
import org.springframework.security.core.GrantedAuthority;
16
import org.vaadin.viritin.fields.ElementCollectionField;
17

    
18
import com.vaadin.data.validator.DoubleRangeValidator;
19
import com.vaadin.spring.annotation.SpringComponent;
20
import com.vaadin.ui.AbstractSelect.ItemCaptionMode;
21
import com.vaadin.ui.Component;
22
import com.vaadin.ui.GridLayout;
23
import com.vaadin.ui.ListSelect;
24
import com.vaadin.ui.Panel;
25
import com.vaadin.ui.TextArea;
26

    
27
import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
28
import eu.etaxonomy.cdm.vaadin.component.CollectionRowRepresentative;
29
import eu.etaxonomy.cdm.vaadin.component.PartialDateField;
30
import eu.etaxonomy.cdm.vaadin.component.common.GeoLocationField;
31
import eu.etaxonomy.cdm.vaadin.component.common.MinMaxTextField;
32
import eu.etaxonomy.cdm.vaadin.component.common.TeamOrPersonField;
33
import eu.etaxonomy.cdm.vaadin.model.registration.SpecimenTypeDesignationDTO;
34
import eu.etaxonomy.cdm.vaadin.model.registration.SpecimenTypeDesignationWorkingSetDTO;
35
import eu.etaxonomy.cdm.vaadin.permission.AccessRestrictedView;
36
import eu.etaxonomy.cdm.vaadin.util.TeamOrPersonBaseCaptionGenerator;
37
import eu.etaxonomy.cdm.vaadin.util.converter.DoubleConverter;
38
import eu.etaxonomy.cdm.vaadin.util.converter.IntegerConverter;
39
import eu.etaxonomy.cdm.vaadin.view.PerEntityAuthorityGrantingEditor;
40
import eu.etaxonomy.vaadin.mvp.AbstractPopupEditor;
41

    
42
/**
43
 * @author a.kohlbecker
44
 * @since May 15, 2017
45
 *
46
 */
47
@SpringComponent
48
@Scope("prototype")
49
public class SpecimenTypeDesignationWorkingsetPopupEditor
50
    extends AbstractPopupEditor<SpecimenTypeDesignationWorkingSetDTO, SpecimenTypeDesignationWorkingsetEditorPresenter>
51
    implements SpecimenTypeDesignationWorkingsetPopupEditorView, AccessRestrictedView, PerEntityAuthorityGrantingEditor {
52
    /**
53
     * @param layout
54
     * @param dtoType
55
     */
56
    public SpecimenTypeDesignationWorkingsetPopupEditor() {
57
        super(new GridLayout(), SpecimenTypeDesignationWorkingSetDTO.class);
58
        GridLayout grid = (GridLayout) getFieldLayout();
59
        grid.setMargin(true);
60
        grid.setSpacing(true);
61
    }
62

    
63
    private static final long serialVersionUID = 5418275817834009509L;
64

    
65
    private ListSelect countrySelectField;
66

    
67
    private ElementCollectionField<SpecimenTypeDesignationDTO> typeDesignationsCollectionField;
68

    
69
    private EnumSet<CRUD> crud;
70

    
71
    private TeamOrPersonField collectorField;
72

    
73
    /**
74
     * @return the countrySelectField
75
     */
76
    @Override
77
    public ListSelect getCountrySelectField() {
78
        return countrySelectField;
79
    }
80

    
81
    /**
82
     * {@inheritDoc}
83
     */
84
    @Override
85
    protected void initContent() {
86

    
87
        GridLayout grid = (GridLayout)getFieldLayout();
88
        grid.setSpacing(true);
89
        grid.setMargin(true);
90
        grid.setColumns(3);
91
        grid.setRows(9);
92

    
93
        //TODO typifyingAuthors
94

    
95
        // FieldUnit + GatheringEvent
96

    
97
        int row = 0;
98
        countrySelectField = new ListSelect("Country");
99
        addField(countrySelectField, "country", 1, row , 2, row);
100
        countrySelectField.setWidth("100%");
101
        countrySelectField.setItemCaptionMode(ItemCaptionMode.PROPERTY);
102
        countrySelectField.setItemCaptionPropertyId("label");
103
        countrySelectField.setRows(1);
104

    
105
        row++;
106
        TextArea localityField = new TextArea("Locality");
107
        localityField.setNullRepresentation("");
108
        addField(localityField, "locality", 0, row , 2, row);
109
        localityField.setWidth("100%");
110
        // NOTE: setRows and SetCold breaks he width setting,
111
        //        see https://github.com/vaadin/framework/issues/3617
112

    
113
        row++;
114
        GeoLocationField exactLocation = new GeoLocationField("Geo location");
115
        addField(exactLocation, "exactLocation", 0, row, 2, row);
116
        exactLocation.setWidth("100%");
117

    
118
        row++;
119
        MinMaxTextField absElevationMinMax = new MinMaxTextField("Altitude", "m");
120
        absElevationMinMax.setWidth("100%");
121
        absElevationMinMax.addSubComponentsStyleName(getDefaultComponentStyles());
122
        grid.addComponent(absElevationMinMax, 0, row, 2, row);
123

    
124
        bindField(absElevationMinMax.getMinField(), "absoluteElevation");
125
        bindField(absElevationMinMax.getMaxField(), "absoluteElevationMax");
126
        bindField(absElevationMinMax.getTextField(), "absoluteElevationText");
127

    
128
        absElevationMinMax.getMaxField().setConverter(new IntegerConverter());
129
        absElevationMinMax.getMinField().setConverter(new IntegerConverter());
130

    
131
        row++;
132
        MinMaxTextField distanceToWaterSurfaceMinMax = new MinMaxTextField("Distance to water surface", "m");
133
        distanceToWaterSurfaceMinMax.setWidth("100%");
134
        distanceToWaterSurfaceMinMax.addSubComponentsStyleName(getDefaultComponentStyles());
135
        grid.addComponent(distanceToWaterSurfaceMinMax, 0, row, 2, row);
136

    
137
        bindField(distanceToWaterSurfaceMinMax.getMinField(), "distanceToWaterSurface");
138
        bindField(distanceToWaterSurfaceMinMax.getMaxField(), "distanceToWaterSurfaceMax");
139
        bindField(distanceToWaterSurfaceMinMax.getTextField(), "distanceToWaterSurfaceText");
140
        distanceToWaterSurfaceMinMax.getMaxField().setConverter(new DoubleConverter());
141
        distanceToWaterSurfaceMinMax.getMinField().setConverter(new DoubleConverter());
142
        distanceToWaterSurfaceMinMax.getMaxField().addValidator(new DoubleRangeValidator("Negative values are not allowed here.", 0.0, Double.MAX_VALUE));
143
        distanceToWaterSurfaceMinMax.getMinField().addValidator(new DoubleRangeValidator("Negative values are not allowed here.", 0.0, Double.MAX_VALUE));
144

    
145
        row++;
146
        MinMaxTextField distanceToGroundMinMax = new MinMaxTextField("Distance to substrate", "m");
147
        distanceToGroundMinMax.setWidth("100%");
148
        distanceToGroundMinMax.addSubComponentsStyleName(getDefaultComponentStyles());
149
        grid.addComponent(distanceToGroundMinMax, 0, row, 2, row);
150

    
151
        bindField(distanceToGroundMinMax.getMinField(), "distanceToGround");
152
        bindField(distanceToGroundMinMax.getMaxField(), "distanceToGroundMax");
153
        bindField(distanceToGroundMinMax.getTextField(), "distanceToGroundText");
154
        distanceToGroundMinMax.getMaxField().setConverter(new DoubleConverter());
155
        distanceToGroundMinMax.getMinField().setConverter(new DoubleConverter());
156

    
157
        row++;
158
        collectorField = new TeamOrPersonField("Collector", TeamOrPersonBaseCaptionGenerator.CacheType.NOMENCLATURAL_TITLE);
159
        addField(collectorField, "collector", 0, row, 2, row);
160

    
161
        row++;
162
        PartialDateField collectionDateField = new PartialDateField("Collection date");
163
        collectionDateField.setInputPrompt("dd.mm.yyyy");
164
        addField(collectionDateField, "gatheringDate", 0, row, 1, row);
165
        addTextField("Field number", "fieldNumber", 2, row);
166

    
167

    
168
        row++;
169

    
170
        // FIXME: can we use the Grid instead?
171
        typeDesignationsCollectionField = new ElementCollectionField<>(
172
                SpecimenTypeDesignationDTO.class,
173
                SpecimenTypeDesignationDTORow.class
174
                );
175
        typeDesignationsCollectionField.withCaption("Types");
176
        typeDesignationsCollectionField.getLayout().setSpacing(false);
177
        typeDesignationsCollectionField.getLayout().setColumns(3);
178

    
179
        typeDesignationsCollectionField.setVisibleProperties(SpecimenTypeDesignationDTORow.visibleFields());
180

    
181
        typeDesignationsCollectionField.setPropertyHeader("accessionNumber", "Access. num.");
182
        typeDesignationsCollectionField.setPropertyHeader("preferredStableUri", "Stable URI");
183
        typeDesignationsCollectionField.setPropertyHeader("mediaSpecimenReference", "Image reference");
184
        typeDesignationsCollectionField.setPropertyHeader("mediaSpecimenReferenceDetail", "Reference detail");
185

    
186
        // typeDesignationsCollectionField.getLayout().setMargin(false);
187
        // typeDesignationsCollectionField.addStyleName("composite-field-wrapper");
188
        // addField(typeDesignationsCollectionField, "specimenTypeDesignationDTOs", 0, row, 2, row);
189

    
190
        Panel scrollPanel = new Panel(typeDesignationsCollectionField.getLayout());
191
        scrollPanel.setCaption("Types");
192
        scrollPanel.setWidth(800, Unit.PIXELS);
193

    
194
        bindField(typeDesignationsCollectionField, "specimenTypeDesignationDTOs");
195
        addComponent(scrollPanel, 0, row, 2, row);
196

    
197
     }
198

    
199

    
200
    /**
201
     * {@inheritDoc}
202
     */
203
    @Override
204
    public String getWindowCaption() {
205
        return "Specimen typedesignations editor";
206
    }
207

    
208
    /**
209
     * {@inheritDoc}
210
     */
211
    @Override
212
    public void focusFirst() {
213
        // none
214
    }
215

    
216
    /**
217
     * {@inheritDoc}
218
     */
219
    @Override
220
    protected String getDefaultComponentStyles() {
221
        return "tiny";
222
    }
223

    
224
    /**
225
     * {@inheritDoc}
226
     */
227
    @Override
228
    public boolean allowAnonymousAccess() {
229
        return false;
230
    }
231

    
232
    /**
233
     * {@inheritDoc}
234
     */
235
    @Override
236
    public Collection<Collection<GrantedAuthority>> allowedGrantedAuthorities() {
237
        return null;
238
    }
239

    
240
    /**
241
     * {@inheritDoc}
242
     */
243
    @Override
244
    public boolean isResizable() {
245
        return true;
246
    }
247

    
248

    
249
    // ------- SpecimenTypeDesignationWorkingsetPopupEditorView methods ---- //
250
    @Override
251
    public ElementCollectionField<SpecimenTypeDesignationDTO> getTypeDesignationsCollectionField() {
252
        return typeDesignationsCollectionField;
253
    }
254

    
255
    @Override
256
    public void applyDefaultComponentStyle(Component ... components){
257
        for(int i = 0; i <components.length; i++){
258
            components[i].setStyleName(getDefaultComponentStyles());
259
        }
260
    }
261

    
262
    /**
263
     * {@inheritDoc}
264
     */
265
    @Override
266
    public void grantToCurrentUser(EnumSet<CRUD> crud) {
267
        getPresenter().setGrantsForCurrentUser(crud);
268

    
269
    }
270

    
271
    /**
272
     * {@inheritDoc}
273
     */
274
    @Override
275
    protected void afterItemDataSourceSet() {
276
        super.afterItemDataSourceSet();
277
        GridLayout gridLayout = this.typeDesignationsCollectionField.getLayout();
278
        for(int rowIndex = 1; rowIndex < gridLayout.getRows(); rowIndex++){ // first row is header
279
            Component item = gridLayout.getComponent(SpecimenTypeDesignationDTORow.rowListSelectColumn(), rowIndex);
280
            ((CollectionRowRepresentative)item).updateRowItemsEnabledStates();
281
        }
282
        updateAllowDelete();
283
    }
284

    
285
    /**
286
     * {@inheritDoc}
287
     */
288
    @Override
289
    public void updateAllowDelete(){
290
        // disable the delete button if there is only one typeDesignation
291
        // if this typeDesignation is deleted the fieldUnit would become orphan in the
292
        // TypeDesignationWorkingSet
293
        GridLayout gridLayout = this.typeDesignationsCollectionField.getLayout();
294
        if(gridLayout.getRows() == 3){ // first row is header, last row is next new item
295
            gridLayout.getComponent(gridLayout.getColumns() - 1, 1).setEnabled(false);
296
        }
297
    }
298

    
299
    /**
300
     * {@inheritDoc}
301
     */
302
    @Override
303
    public void setReadOnly(boolean readOnly) {
304
        super.setReadOnly(readOnly);
305
        getFieldLayout().iterator().forEachRemaining(c -> c.setReadOnly(readOnly));
306
        typeDesignationsCollectionField.getLayout().iterator().forEachRemaining(c -> c.setReadOnly(readOnly));
307

    
308
    }
309

    
310
    /**
311
     * @return the collectorField
312
     */
313
    @Override
314
    public TeamOrPersonField getCollectorField() {
315
        return collectorField;
316
    }
317

    
318

    
319

    
320
}
(7-7/13)