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
.model
.common
.AnnotationType
;
28 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.permission
.CRUD
;
29 import eu
.etaxonomy
.cdm
.vaadin
.component
.CollectionRowRepresentative
;
30 import eu
.etaxonomy
.cdm
.vaadin
.component
.PartialDateField
;
31 import eu
.etaxonomy
.cdm
.vaadin
.component
.common
.FilterableAnnotationsField
;
32 import eu
.etaxonomy
.cdm
.vaadin
.component
.common
.GeoLocationField
;
33 import eu
.etaxonomy
.cdm
.vaadin
.component
.common
.MinMaxTextField
;
34 import eu
.etaxonomy
.cdm
.vaadin
.component
.common
.TeamOrPersonField
;
35 import eu
.etaxonomy
.cdm
.vaadin
.model
.registration
.SpecimenTypeDesignationDTO
;
36 import eu
.etaxonomy
.cdm
.vaadin
.model
.registration
.SpecimenTypeDesignationWorkingSetDTO
;
37 import eu
.etaxonomy
.cdm
.vaadin
.permission
.AccessRestrictedView
;
38 import eu
.etaxonomy
.cdm
.vaadin
.ui
.RegistrationUIDefaults
;
39 import eu
.etaxonomy
.cdm
.vaadin
.util
.TeamOrPersonBaseCaptionGenerator
;
40 import eu
.etaxonomy
.cdm
.vaadin
.util
.converter
.DoubleConverter
;
41 import eu
.etaxonomy
.cdm
.vaadin
.util
.converter
.IntegerConverter
;
42 import eu
.etaxonomy
.cdm
.vaadin
.view
.PerEntityAuthorityGrantingEditor
;
43 import eu
.etaxonomy
.vaadin
.mvp
.AbstractPopupEditor
;
46 * @author a.kohlbecker
52 public class SpecimenTypeDesignationWorkingsetPopupEditor
53 extends AbstractPopupEditor
<SpecimenTypeDesignationWorkingSetDTO
, SpecimenTypeDesignationWorkingsetEditorPresenter
>
54 implements SpecimenTypeDesignationWorkingsetPopupEditorView
, AccessRestrictedView
, PerEntityAuthorityGrantingEditor
{
58 private static final String CAN_T_SAVE_AS_LONG_AS_TYPE_DESIGNATIONS_ARE_MISSING
= "Can't save as long as type designations are missing.";
64 public SpecimenTypeDesignationWorkingsetPopupEditor() {
65 super(new GridLayout(), SpecimenTypeDesignationWorkingSetDTO
.class);
66 GridLayout grid
= (GridLayout
) getFieldLayout();
68 grid
.setSpacing(true);
71 private static final long serialVersionUID
= 5418275817834009509L;
73 private ListSelect countrySelectField
;
75 private ElementCollectionField
<SpecimenTypeDesignationDTO
> typeDesignationsCollectionField
;
77 private EnumSet
<CRUD
> crud
;
79 private TeamOrPersonField collectorField
;
81 private FilterableAnnotationsField annotationsListField
;
83 private AnnotationType
[] editableAnotationTypes
= RegistrationUIDefaults
.EDITABLE_ANOTATION_TYPES
;
86 * @return the countrySelectField
89 public ListSelect
getCountrySelectField() {
90 return countrySelectField
;
97 protected void initContent() {
99 GridLayout grid
= (GridLayout
)getFieldLayout();
100 grid
.setSpacing(true);
101 grid
.setMargin(true);
105 //TODO typifyingAuthors
107 // FieldUnit + GatheringEvent
110 countrySelectField
= new ListSelect("Country");
111 addField(countrySelectField
, "country", 1, row
, 2, row
);
112 countrySelectField
.setWidth("100%");
113 countrySelectField
.setItemCaptionMode(ItemCaptionMode
.PROPERTY
);
114 countrySelectField
.setItemCaptionPropertyId("label");
115 countrySelectField
.setRows(1);
118 TextArea localityField
= new TextArea("Locality");
119 localityField
.setNullRepresentation("");
120 addField(localityField
, "locality", 0, row
, 2, row
);
121 localityField
.setWidth("100%");
122 // NOTE: setRows and SetCold breaks he width setting,
123 // see https://github.com/vaadin/framework/issues/3617
126 GeoLocationField exactLocation
= new GeoLocationField("Geo location");
127 addField(exactLocation
, "exactLocation", 0, row
, 2, row
);
128 exactLocation
.setWidth("100%");
131 MinMaxTextField absElevationMinMax
= new MinMaxTextField("Altitude", "m");
132 absElevationMinMax
.setWidth("100%");
133 absElevationMinMax
.addSubComponentsStyleName(getDefaultComponentStyles());
134 grid
.addComponent(absElevationMinMax
, 0, row
, 2, row
);
136 bindField(absElevationMinMax
.getMinField(), "absoluteElevation");
137 bindField(absElevationMinMax
.getMaxField(), "absoluteElevationMax");
138 bindField(absElevationMinMax
.getTextField(), "absoluteElevationText");
140 absElevationMinMax
.getMaxField().setConverter(new IntegerConverter());
141 absElevationMinMax
.getMinField().setConverter(new IntegerConverter());
144 MinMaxTextField distanceToWaterSurfaceMinMax
= new MinMaxTextField("Distance to water surface", "m");
145 distanceToWaterSurfaceMinMax
.setWidth("100%");
146 distanceToWaterSurfaceMinMax
.addSubComponentsStyleName(getDefaultComponentStyles());
147 grid
.addComponent(distanceToWaterSurfaceMinMax
, 0, row
, 2, row
);
149 bindField(distanceToWaterSurfaceMinMax
.getMinField(), "distanceToWaterSurface");
150 bindField(distanceToWaterSurfaceMinMax
.getMaxField(), "distanceToWaterSurfaceMax");
151 bindField(distanceToWaterSurfaceMinMax
.getTextField(), "distanceToWaterSurfaceText");
152 distanceToWaterSurfaceMinMax
.getMaxField().setConverter(new DoubleConverter());
153 distanceToWaterSurfaceMinMax
.getMinField().setConverter(new DoubleConverter());
154 distanceToWaterSurfaceMinMax
.getMaxField().addValidator(new DoubleRangeValidator("Negative values are not allowed here.", 0.0, Double
.MAX_VALUE
));
155 distanceToWaterSurfaceMinMax
.getMinField().addValidator(new DoubleRangeValidator("Negative values are not allowed here.", 0.0, Double
.MAX_VALUE
));
158 MinMaxTextField distanceToGroundMinMax
= new MinMaxTextField("Distance to substrate", "m");
159 distanceToGroundMinMax
.setWidth("100%");
160 distanceToGroundMinMax
.addSubComponentsStyleName(getDefaultComponentStyles());
161 grid
.addComponent(distanceToGroundMinMax
, 0, row
, 2, row
);
163 bindField(distanceToGroundMinMax
.getMinField(), "distanceToGround");
164 bindField(distanceToGroundMinMax
.getMaxField(), "distanceToGroundMax");
165 bindField(distanceToGroundMinMax
.getTextField(), "distanceToGroundText");
166 distanceToGroundMinMax
.getMaxField().setConverter(new DoubleConverter());
167 distanceToGroundMinMax
.getMinField().setConverter(new DoubleConverter());
170 collectorField
= new TeamOrPersonField("Collector", TeamOrPersonBaseCaptionGenerator
.CacheType
.NOMENCLATURAL_TITLE
);
171 addField(collectorField
, "collector", 0, row
, 2, row
);
174 PartialDateField collectionDateField
= new PartialDateField("Collection date");
175 collectionDateField
.setInputPrompt("dd.mm.yyyy");
176 addField(collectionDateField
, "gatheringDate", 0, row
, 1, row
);
177 addTextField("Field number", "fieldNumber", 2, row
);
182 // FIXME: can we use the Grid instead?
183 typeDesignationsCollectionField
= new ElementCollectionField
<>(
184 SpecimenTypeDesignationDTO
.class,
185 SpecimenTypeDesignationDTORow
.class
187 typeDesignationsCollectionField
.withCaption("Types");
188 typeDesignationsCollectionField
.getLayout().setSpacing(false);
189 typeDesignationsCollectionField
.getLayout().setColumns(3);
191 typeDesignationsCollectionField
.setVisibleProperties(SpecimenTypeDesignationDTORow
.visibleFields());
193 typeDesignationsCollectionField
.setPropertyHeader("accessionNumber", "Access. num.");
194 typeDesignationsCollectionField
.setPropertyHeader("preferredStableUri", "Stable URI");
195 typeDesignationsCollectionField
.setPropertyHeader("mediaSpecimenReference", "Image reference");
196 typeDesignationsCollectionField
.setPropertyHeader("mediaSpecimenReferenceDetail", "Reference detail");
197 typeDesignationsCollectionField
.addElementAddedListener( e
-> updateAllowSave());
198 typeDesignationsCollectionField
.addElementRemovedListener( e
-> updateAllowSave());
200 // typeDesignationsCollectionField.getLayout().setMargin(false);
201 // typeDesignationsCollectionField.addStyleName("composite-field-wrapper");
202 // addField(typeDesignationsCollectionField, "specimenTypeDesignationDTOs", 0, row, 2, row);
204 Panel scrollPanel
= new Panel(typeDesignationsCollectionField
.getLayout());
205 scrollPanel
.setCaption("Types");
206 scrollPanel
.setWidth(800, Unit
.PIXELS
);
208 bindField(typeDesignationsCollectionField
, "specimenTypeDesignationDTOs");
209 addComponent(scrollPanel
, 0, row
, 2, row
);
212 annotationsListField
= new FilterableAnnotationsField("Editorial notes");
213 annotationsListField
.setWidth(100, Unit
.PERCENTAGE
);
214 annotationsListField
.setAnnotationTypesVisible(editableAnotationTypes
);
215 addField(annotationsListField
, "annotations", 0, row
, 2, row
);
224 public String
getWindowCaption() {
225 return "Specimen typedesignations editor";
232 public void focusFirst() {
240 protected String
getDefaultComponentStyles() {
248 public boolean allowAnonymousAccess() {
256 public Collection
<Collection
<GrantedAuthority
>> allowedGrantedAuthorities() {
264 public boolean isResizable() {
269 // ------- SpecimenTypeDesignationWorkingsetPopupEditorView methods ---- //
271 public ElementCollectionField
<SpecimenTypeDesignationDTO
> getTypeDesignationsCollectionField() {
272 return typeDesignationsCollectionField
;
276 public void applyDefaultComponentStyle(Component
... components
){
277 for(int i
= 0; i
<components
.length
; i
++){
278 components
[i
].setStyleName(getDefaultComponentStyles());
286 public void grantToCurrentUser(EnumSet
<CRUD
> crud
) {
287 getPresenter().setGrantsForCurrentUser(crud
);
295 protected void afterItemDataSourceSet() {
296 super.afterItemDataSourceSet();
297 GridLayout gridLayout
= this.typeDesignationsCollectionField
.getLayout();
298 for(int rowIndex
= 1; rowIndex
< gridLayout
.getRows(); rowIndex
++){ // first row is header
299 Component item
= gridLayout
.getComponent(SpecimenTypeDesignationDTORow
.rowListSelectColumn(), rowIndex
);
300 ((CollectionRowRepresentative
)item
).updateRowItemsEnabledStates();
310 public void updateAllowDelete(){
311 // disable the delete button if there is only one typeDesignation
312 // if this typeDesignation is deleted the fieldUnit would become orphan in the
313 // TypeDesignationWorkingSet
314 GridLayout gridLayout
= this.typeDesignationsCollectionField
.getLayout();
315 if(gridLayout
.getRows() == 3){ // first row is header, last row is next new item
316 gridLayout
.getComponent(gridLayout
.getColumns() - 1, 1).setEnabled(false);
320 public void updateAllowSave(){
321 boolean hasTypeDesignations
= getBean().getSpecimenTypeDesignationDTOs().size() > 0;
322 setSaveButtonEnabled(hasTypeDesignations
);
323 if(!hasTypeDesignations
){
324 addStatusMessage(CAN_T_SAVE_AS_LONG_AS_TYPE_DESIGNATIONS_ARE_MISSING
);
326 removeStatusMessage(CAN_T_SAVE_AS_LONG_AS_TYPE_DESIGNATIONS_ARE_MISSING
);
335 public void setReadOnly(boolean readOnly
) {
336 super.setReadOnly(readOnly
);
337 getFieldLayout().iterator().forEachRemaining(c
-> c
.setReadOnly(readOnly
));
338 typeDesignationsCollectionField
.getLayout().iterator().forEachRemaining(c
-> c
.setReadOnly(readOnly
));
343 * @return the collectorField
346 public TeamOrPersonField
getCollectorField() {
347 return collectorField
;
351 * By default AnnotationType.EDITORIAL() is enabled.
353 * @return the editableAnotationTypes
356 public AnnotationType
[] getEditableAnotationTypes() {
357 return editableAnotationTypes
;
361 * By default AnnotationType.EDITORIAL() is enabled.
364 * @param editableAnotationTypes the editableAnotationTypes to set
367 public void setEditableAnotationTypes(AnnotationType
... editableAnotationTypes
) {
368 this.editableAnotationTypes
= editableAnotationTypes
;
375 public FilterableAnnotationsField
getAnnotationsField() {
376 return annotationsListField
;