2 * Copyright (C) 2017 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
9 package eu
.etaxonomy
.cdm
.vaadin
.view
.name
;
11 import java
.util
.Collection
;
12 import java
.util
.EnumSet
;
14 import org
.springframework
.context
.annotation
.Scope
;
15 import org
.springframework
.security
.core
.GrantedAuthority
;
16 import org
.vaadin
.viritin
.fields
.ElementCollectionField
;
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
;
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
.security
.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
;
43 * @author a.kohlbecker
49 public class SpecimenTypeDesignationWorkingsetPopupEditor
50 extends AbstractPopupEditor
<SpecimenTypeDesignationWorkingSetDTO
, SpecimenTypeDesignationWorkingsetEditorPresenter
>
51 implements SpecimenTypeDesignationWorkingsetPopupEditorView
, AccessRestrictedView
, PerEntityAuthorityGrantingEditor
{
56 public SpecimenTypeDesignationWorkingsetPopupEditor() {
57 super(new GridLayout(), SpecimenTypeDesignationWorkingSetDTO
.class);
58 GridLayout grid
= (GridLayout
) getFieldLayout();
60 grid
.setSpacing(true);
63 private static final long serialVersionUID
= 5418275817834009509L;
65 private ListSelect countrySelectField
;
67 private ElementCollectionField
<SpecimenTypeDesignationDTO
> typeDesignationsCollectionField
;
69 private EnumSet
<CRUD
> crud
;
71 private TeamOrPersonField collectorField
;
74 * @return the countrySelectField
77 public ListSelect
getCountrySelectField() {
78 return countrySelectField
;
85 protected void initContent() {
87 GridLayout grid
= (GridLayout
)getFieldLayout();
88 grid
.setSpacing(true);
93 //TODO typifyingAuthors
95 // FieldUnit + GatheringEvent
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);
106 TextArea localityField
= new TextArea("Locality");
107 addField(localityField
, "locality", 0, row
, 2, row
);
108 localityField
.setWidth("100%");
109 // NOTE: setRows and SetCold breaks he width setting,
110 // see https://github.com/vaadin/framework/issues/3617
113 GeoLocationField exactLocation
= new GeoLocationField("Geo location");
114 addField(exactLocation
, "exactLocation", 0, row
, 2, row
);
115 exactLocation
.setWidth("100%");
118 MinMaxTextField absElevationMinMax
= new MinMaxTextField("Altitude", "m");
119 absElevationMinMax
.setWidth("100%");
120 absElevationMinMax
.addSubComponentsStyleName(getDefaultComponentStyles());
121 grid
.addComponent(absElevationMinMax
, 0, row
, 2, row
);
123 bindField(absElevationMinMax
.getMinField(), "absoluteElevation");
124 bindField(absElevationMinMax
.getMaxField(), "absoluteElevationMax");
125 bindField(absElevationMinMax
.getTextField(), "absoluteElevationText");
127 absElevationMinMax
.getMaxField().setConverter(new IntegerConverter());
128 absElevationMinMax
.getMinField().setConverter(new IntegerConverter());
131 MinMaxTextField distanceToWaterSurfaceMinMax
= new MinMaxTextField("Distance to water surface", "m");
132 distanceToWaterSurfaceMinMax
.setWidth("100%");
133 distanceToWaterSurfaceMinMax
.addSubComponentsStyleName(getDefaultComponentStyles());
134 grid
.addComponent(distanceToWaterSurfaceMinMax
, 0, row
, 2, row
);
136 bindField(distanceToWaterSurfaceMinMax
.getMinField(), "distanceToWaterSurface");
137 bindField(distanceToWaterSurfaceMinMax
.getMaxField(), "distanceToWaterSurfaceMax");
138 bindField(distanceToWaterSurfaceMinMax
.getTextField(), "distanceToWaterSurfaceText");
139 distanceToWaterSurfaceMinMax
.getMaxField().setConverter(new DoubleConverter());
140 distanceToWaterSurfaceMinMax
.getMinField().setConverter(new DoubleConverter());
141 distanceToWaterSurfaceMinMax
.getMaxField().addValidator(new DoubleRangeValidator("Negative values are not allowed here.", 0.0, Double
.MAX_VALUE
));
142 distanceToWaterSurfaceMinMax
.getMinField().addValidator(new DoubleRangeValidator("Negative values are not allowed here.", 0.0, Double
.MAX_VALUE
));
145 MinMaxTextField distanceToGroundMinMax
= new MinMaxTextField("Distance to substrate", "m");
146 distanceToGroundMinMax
.setWidth("100%");
147 distanceToGroundMinMax
.addSubComponentsStyleName(getDefaultComponentStyles());
148 grid
.addComponent(distanceToGroundMinMax
, 0, row
, 2, row
);
150 bindField(distanceToGroundMinMax
.getMinField(), "distanceToGround");
151 bindField(distanceToGroundMinMax
.getMaxField(), "distanceToGroundMax");
152 bindField(distanceToGroundMinMax
.getTextField(), "distanceToGroundText");
153 distanceToGroundMinMax
.getMaxField().setConverter(new DoubleConverter());
154 distanceToGroundMinMax
.getMinField().setConverter(new DoubleConverter());
157 collectorField
= new TeamOrPersonField("Collector", TeamOrPersonBaseCaptionGenerator
.CacheType
.NOMENCLATURAL_TITLE
);
158 addField(collectorField
, "collector", 0, row
, 2, row
);
161 PartialDateField collectionDateField
= new PartialDateField("Collection date");
162 collectionDateField
.setInputPrompt("dd.mm.yyyy");
163 addField(collectionDateField
, "gatheringDate", 0, row
, 1, row
);
164 addTextField("Field number", "fieldNumber", 2, row
);
169 // FIXME: can we use the Grid instead?
170 typeDesignationsCollectionField
= new ElementCollectionField
<>(
171 SpecimenTypeDesignationDTO
.class,
172 SpecimenTypeDesignationDTORow
.class
174 typeDesignationsCollectionField
.withCaption("Types");
175 typeDesignationsCollectionField
.getLayout().setSpacing(false);
176 typeDesignationsCollectionField
.getLayout().setColumns(3);
178 typeDesignationsCollectionField
.setVisibleProperties(SpecimenTypeDesignationDTORow
.visibleFields());
180 typeDesignationsCollectionField
.setPropertyHeader("accessionNumber", "Access. num.");
181 typeDesignationsCollectionField
.setPropertyHeader("preferredStableUri", "Stable URI");
182 typeDesignationsCollectionField
.setPropertyHeader("mediaSpecimenReference", "Image reference");
183 typeDesignationsCollectionField
.setPropertyHeader("mediaSpecimenReferenceDetail", "Reference detail");
185 // typeDesignationsCollectionField.getLayout().setMargin(false);
186 // typeDesignationsCollectionField.addStyleName("composite-field-wrapper");
187 // addField(typeDesignationsCollectionField, "specimenTypeDesignationDTOs", 0, row, 2, row);
189 Panel scrollPanel
= new Panel(typeDesignationsCollectionField
.getLayout());
190 scrollPanel
.setCaption("Types");
191 scrollPanel
.setWidth(800, Unit
.PIXELS
);
193 bindField(typeDesignationsCollectionField
, "specimenTypeDesignationDTOs");
194 addComponent(scrollPanel
, 0, row
, 2, row
);
203 public String
getWindowCaption() {
204 return "Specimen typedesignations editor";
211 public void focusFirst() {
219 protected String
getDefaultComponentStyles() {
227 public boolean allowAnonymousAccess() {
235 public Collection
<Collection
<GrantedAuthority
>> allowedGrantedAuthorities() {
243 public boolean isResizable() {
248 // ------- SpecimenTypeDesignationWorkingsetPopupEditorView methods ---- //
250 public ElementCollectionField
<SpecimenTypeDesignationDTO
> getTypeDesignationsCollectionField() {
251 return typeDesignationsCollectionField
;
255 public void applyDefaultComponentStyle(Component
... components
){
256 for(int i
= 0; i
<components
.length
; i
++){
257 components
[i
].setStyleName(getDefaultComponentStyles());
265 public void grantToCurrentUser(EnumSet
<CRUD
> crud
) {
266 getPresenter().setGrantsForCurrentUser(crud
);
274 protected void afterItemDataSourceSet() {
275 super.afterItemDataSourceSet();
276 GridLayout gridLayout
= this.typeDesignationsCollectionField
.getLayout();
277 for(int rowIndex
= 1; rowIndex
< gridLayout
.getRows(); rowIndex
++){ // first row is header
278 Component item
= gridLayout
.getComponent(SpecimenTypeDesignationDTORow
.rowListSelectColumn(), rowIndex
);
279 ((CollectionRowRepresentative
)item
).updateRowItemsEnabledStates();
288 public void updateAllowDelete(){
289 // disable the delete button if there is only one typeDesignation
290 // if this typeDesignation is deleted the fieldUnit would become orphan in the
291 // TypeDesignationWorkingSet
292 GridLayout gridLayout
= this.typeDesignationsCollectionField
.getLayout();
293 if(gridLayout
.getRows() == 3){ // first row is header, last row is next new item
294 gridLayout
.getComponent(gridLayout
.getColumns() - 1, 1).setEnabled(false);
302 public void setReadOnly(boolean readOnly
) {
303 super.setReadOnly(readOnly
);
304 getFieldLayout().iterator().forEachRemaining(c
-> c
.setReadOnly(readOnly
));
305 typeDesignationsCollectionField
.getLayout().iterator().forEachRemaining(c
-> c
.setReadOnly(readOnly
));
310 * @return the collectorField
313 public TeamOrPersonField
getCollectorField() {
314 return collectorField
;