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
.security
.core
.GrantedAuthority
;
16 import com
.vaadin
.ui
.Alignment
;
17 import com
.vaadin
.ui
.CheckBox
;
18 import com
.vaadin
.ui
.GridLayout
;
19 import com
.vaadin
.ui
.ListSelect
;
20 import com
.vaadin
.ui
.TextField
;
22 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
23 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
24 import eu
.etaxonomy
.cdm
.model
.name
.TaxonName
;
25 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
26 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.permission
.CRUD
;
27 import eu
.etaxonomy
.cdm
.vaadin
.component
.common
.TeamOrPersonField
;
28 import eu
.etaxonomy
.cdm
.vaadin
.event
.ReferenceEditorAction
;
29 import eu
.etaxonomy
.cdm
.vaadin
.event
.TaxonNameEditorAction
;
30 import eu
.etaxonomy
.cdm
.vaadin
.security
.AccessRestrictedView
;
31 import eu
.etaxonomy
.cdm
.vaadin
.security
.UserHelper
;
32 import eu
.etaxonomy
.cdm
.vaadin
.util
.converter
.SetToListConverter
;
33 import eu
.etaxonomy
.vaadin
.component
.SwitchableTextField
;
34 import eu
.etaxonomy
.vaadin
.component
.ToManyRelatedEntitiesComboboxSelect
;
35 import eu
.etaxonomy
.vaadin
.component
.ToOneRelatedEntityCombobox
;
36 import eu
.etaxonomy
.vaadin
.event
.EditorActionType
;
37 import eu
.etaxonomy
.vaadin
.mvp
.AbstractCdmPopupEditor
;
38 import eu
.etaxonomy
.vaadin
.permission
.EditPermissionTester
;
41 * @author a.kohlbecker
45 public class TaxonNamePopupEditor
extends AbstractCdmPopupEditor
<TaxonName
, TaxonNameEditorPresenter
> implements TaxonNamePopupEditorView
, AccessRestrictedView
{
47 private static final long serialVersionUID
= -7037436241474466359L;
49 private final static int GRID_COLS
= 4;
51 private final static int GRID_ROWS
= 12;
53 private static final boolean HAS_BASIONYM_DEFAULT
= false;
55 private TextField genusOrUninomialField
;
57 private TextField infraGenericEpithetField
;
59 private TextField specificEpithetField
;
61 private TextField infraSpecificEpithetField
;
63 private SwitchableTextField fullTitleCacheFiled
;
65 private SwitchableTextField protectedNameCacheField
;
67 private ToOneRelatedEntityCombobox
<Reference
> nomReferenceCombobox
;
69 private TextField nomenclaturalReferenceDetail
;
71 private TeamOrPersonField exBasionymAuthorshipField
;
73 private TeamOrPersonField basionymAuthorshipField
;
75 private ToManyRelatedEntitiesComboboxSelect
<TaxonName
> basionymsComboboxSelect
;
77 private CheckBox basionymToggle
;
79 private ListSelect rankSelect
;
81 private TeamOrPersonField combinationAuthorshipField
;
83 private TeamOrPersonField exCombinationAuthorshipField
;
85 private EnumSet
<TaxonNamePopupEditorMode
> modesActive
= EnumSet
.noneOf(TaxonNamePopupEditorMode
.class);
91 public TaxonNamePopupEditor() {
92 super(new GridLayout(GRID_COLS
, GRID_ROWS
), TaxonName
.class);
99 public String
getWindowCaption() {
100 return "Name editor";
109 public int getWindowPixelWidth() {
117 public void focusFirst() {
118 // titleField.focus();
126 protected String
getDefaultComponentStyles() {
134 protected void initContent() {
136 GridLayout grid
= (GridLayout
)getFieldLayout();
138 grid
.setSpacing(true);
139 grid
.setColumnExpandRatio(0, 0.3f
);
140 grid
.setColumnExpandRatio(1, 0.3f
);
141 grid
.setColumnExpandRatio(2, 0.3f
);
142 grid
.setColumnExpandRatio(3, 0.0f
);
145 - nameType: preset, needs to be set in the presenter for new names
146 - appendedPhrase: -> TODO field
147 - nomenclaturalMicroReference: -> TODO field
148 - nomenclaturalReference -> field but disabled for REGISTRY
149 - rank -> SelectField which determines the visiblity of the other fields
151 - fullTitleCache + protectedFullTitleCache -> SwitchableTextField : ADVANCED_MODE
152 - nameCache + protectedNameCache -> SwitchableTextField : ADVANCED_MODE
154 - homotypicalGroup -> hidden
155 - typeDesignations -> hidden
156 - descriptions -> hidden
157 - taxonBases -> hidden
158 - registrations -> hidden
160 - relationsFromThisName-> TODO implement later
161 - relationsToThisName -> TODO implement later
163 - genusOrUninomial -> textField
164 - infraGenericEpithet -> textField
165 - specificEpithet -> textField
166 - infraSpecificEpithet -> textField
168 - authorshipCache + protectedAuthorshipCache -> SwitchableTextField : only ADVANCED_MODE and disabled for REGISTRY
169 - basionymAuthorship -> field but disabled for REGISTRY, basionym is set as nameRelationShip
170 - combinationAuthorship -> field but disabled for REGISTRY author team of the reference
171 - exCombinationAuthorship -> textField
172 - exBasionymAuthorship -> textField
174 - status -> TODO field
175 - monomHybrid -> TODO implement hybrids later
176 - binomHybrid -> TODO implement hybrids later
177 - trinomHybrid -> TODO implement hybrids later
179 - hybridParentRelations -> TODO implement hybrids later
180 - hybridChildRelations -> TODO implement hybrids later
181 - hybridFormula -> TODO implement hybrids later
183 ** ViralName attributes **
186 ** BacterialName attributes **
191 - originalPublicationYear
197 rankSelect
= new ListSelect("Rank");
198 rankSelect
.setNullSelectionAllowed(false);
199 rankSelect
.setRows(1);
200 rankSelect
.setWidth(100, Unit
.PERCENTAGE
);
201 rankSelect
.addValueChangeListener(e
-> updateFieldVisibility((Rank
)e
.getProperty().getValue()));
202 addField(rankSelect
, "rank", 0, row
, 1, row
);
203 grid
.setComponentAlignment(rankSelect
, Alignment
.TOP_RIGHT
);
205 basionymToggle
= new CheckBox("With basionym");
206 basionymToggle
.setValue(HAS_BASIONYM_DEFAULT
);
207 basionymToggle
.addValueChangeListener(e
-> {
208 boolean enable
= e
.getProperty().getValue() != null && (Boolean
)e
.getProperty().getValue();
209 enableBasionymFields(enable
);
211 basionymToggle
.setStyleName(getDefaultComponentStyles());
212 grid
.addComponent(basionymToggle
, 2, row
, 3, row
);
213 grid
.setComponentAlignment(basionymToggle
, Alignment
.BOTTOM_LEFT
);
216 fullTitleCacheFiled
= addSwitchableTextField("Full title cache", "fullTitleCache", "protectedFullTitleCache", 0, row
, GRID_COLS
-1, row
);
217 fullTitleCacheFiled
.setWidth(100, Unit
.PERCENTAGE
);
219 protectedNameCacheField
= addSwitchableTextField("Name cache", "nameCache", "protectedNameCache", 0, row
, GRID_COLS
-1, row
);
220 protectedNameCacheField
.setWidth(100, Unit
.PERCENTAGE
);
222 genusOrUninomialField
= addTextField("Genus or uninomial", "genusOrUninomial", 0, row
, 1, row
);
223 genusOrUninomialField
.setWidth(200, Unit
.PIXELS
);
224 infraGenericEpithetField
= addTextField("Infrageneric epithet", "infraGenericEpithet", 2, row
, 3, row
);
225 infraGenericEpithetField
.setWidth(200, Unit
.PIXELS
);
227 specificEpithetField
= addTextField("Specific epithet", "specificEpithet", 0, row
, 1, row
);
228 specificEpithetField
.setWidth(200, Unit
.PIXELS
);
229 infraSpecificEpithetField
= addTextField("Infraspecific epithet", "infraSpecificEpithet", 2, row
, 3, row
);
230 infraSpecificEpithetField
.setWidth(200, Unit
.PIXELS
);
232 combinationAuthorshipField
= new TeamOrPersonField("combination author(s)");
233 combinationAuthorshipField
.setWidth(100, Unit
.PERCENTAGE
);
234 addField(combinationAuthorshipField
, "combinationAuthorship", 0, row
, GRID_COLS
-1, row
);
236 exCombinationAuthorshipField
= new TeamOrPersonField("Ex-combination author(s)");
237 exCombinationAuthorshipField
.setWidth(100, Unit
.PERCENTAGE
);
238 addField(exCombinationAuthorshipField
, "exCombinationAuthorship", 0, row
, GRID_COLS
-1, row
);
240 // nomenclaturalReference
242 nomReferenceCombobox
= new ToOneRelatedEntityCombobox
<Reference
>("Nomenclatural reference", Reference
.class);
243 nomReferenceCombobox
.addClickListenerAddEntity(e
-> getEventBus().publishEvent(
244 new ReferenceEditorAction(EditorActionType
.ADD
, null, nomReferenceCombobox
, this)
246 nomReferenceCombobox
.addClickListenerEditEntity(e
-> {
247 if(nomReferenceCombobox
.getValue() != null){
248 getEventBus().publishEvent(
249 new ReferenceEditorAction(
250 EditorActionType
.EDIT
,
251 nomReferenceCombobox
.getValue().getId(),
252 nomReferenceCombobox
,
257 // nomReferenceCombobox.setWidth(300, Unit.PIXELS);
258 nomReferenceCombobox
.setWidth("100%");
259 addField(nomReferenceCombobox
, "nomenclaturalReference", 0, row
, 2, row
);
260 nomenclaturalReferenceDetail
= addTextField("Reference detail", "nomenclaturalMicroReference", 3, row
, 3, row
);
261 nomenclaturalReferenceDetail
.setWidth(100, Unit
.PIXELS
);
266 basionymsComboboxSelect
= new ToManyRelatedEntitiesComboboxSelect
<TaxonName
>(TaxonName
.class, "Basionym");
267 basionymsComboboxSelect
.setConverter(new SetToListConverter
<TaxonName
>());
268 addField(basionymsComboboxSelect
, "basionyms", 0, row
, 3, row
);
269 basionymsComboboxSelect
.setWidth(100, Unit
.PERCENTAGE
);
270 basionymsComboboxSelect
.withEditButton(true);
271 basionymsComboboxSelect
.setEditPermissionTester(new EditPermissionTester() {
274 public boolean userHasEditPermission(Object bean
) {
275 return UserHelper
.fromSession().userHasPermission((CdmBase
)bean
, CRUD
.UPDATE
, CRUD
.DELETE
);
278 basionymsComboboxSelect
.setEditActionListener(e
-> {
280 Object fieldValue
= e
.getSource().getValue();
281 Integer beanId
= null;
282 if(fieldValue
!= null){
283 beanId
= ((CdmBase
)fieldValue
).getId();
286 eventBus
.publishEvent(new TaxonNameEditorAction(e
.getAction(), beanId
, e
.getSource(), this));
288 grid
.setComponentAlignment(basionymsComboboxSelect
, Alignment
.TOP_RIGHT
);
290 basionymAuthorshipField
= new TeamOrPersonField("Basionym author(s)");
291 basionymAuthorshipField
.setWidth(100, Unit
.PERCENTAGE
);
292 addField(basionymAuthorshipField
, "basionymAuthorship", 0, row
, GRID_COLS
-1, row
);
294 exBasionymAuthorshipField
= new TeamOrPersonField("Ex-basionym author(s)");
295 exBasionymAuthorshipField
.setWidth(100, Unit
.PERCENTAGE
);
296 addField(exBasionymAuthorshipField
, "exBasionymAuthorship", 0, row
, GRID_COLS
-1, row
);
300 setAdvancedModeEnabled(true);
301 enableBasionymFields(HAS_BASIONYM_DEFAULT
);
302 registerAdvancedModeComponents(fullTitleCacheFiled
, protectedNameCacheField
);
303 registerAdvancedModeComponents(basionymAuthorshipField
.getCachFields());
304 registerAdvancedModeComponents(exBasionymAuthorshipField
.getCachFields());
305 registerAdvancedModeComponents(combinationAuthorshipField
.getCachFields());
306 registerAdvancedModeComponents(exCombinationAuthorshipField
.getCachFields());
307 setAdvancedMode(false);
315 private void enableBasionymFields(boolean enable
) {
316 basionymAuthorshipField
.setVisible(enable
);
317 exBasionymAuthorshipField
.setVisible(enable
);
318 basionymsComboboxSelect
.setVisible(enable
);
319 if(modesActive
.contains(TaxonNamePopupEditorMode
.suppressReplacementAuthorshipData
)){
320 TaxonName taxonName
= getBean();
321 basionymAuthorshipField
.setVisible(taxonName
.getBasionymAuthorship() != null);
329 private void updateFieldVisibility(Rank rank
) {
330 boolean isSpeciesOrBelow
= !rank
.isHigher(Rank
.SPECIES());
331 // TODO use getField() instead and remove field references
332 infraSpecificEpithetField
.setVisible(rank
.isInfraSpecific());
333 specificEpithetField
.setVisible(isSpeciesOrBelow
);
334 infraGenericEpithetField
.setVisible(rank
.isInfraGenericButNotSpeciesGroup());
335 genusOrUninomialField
.setCaption(isSpeciesOrBelow ?
"Genus" : "Uninomial");
339 protected void afterItemDataSourceSet() {
340 TaxonName taxonName
= getBean();
341 boolean showBasionymSection
= taxonName
.getBasionyms().size() > 0
342 || taxonName
.getBasionymAuthorship() != null
343 || taxonName
.getExBasionymAuthorship() != null;
344 basionymToggle
.setValue(showBasionymSection
);
346 if(isModeEnabled(TaxonNamePopupEditorMode
.suppressReplacementAuthorshipData
)){
347 combinationAuthorshipField
.setVisible(taxonName
.getCombinationAuthorship() != null);
356 public boolean allowAnonymousAccess() {
364 public Collection
<Collection
<GrantedAuthority
>> allowedGrantedAuthorities() {
372 public ToOneRelatedEntityCombobox
<Reference
> getNomReferenceCombobox() {
373 return nomReferenceCombobox
;
380 public ToManyRelatedEntitiesComboboxSelect
<TaxonName
> getBasionymComboboxSelect() {
381 return basionymsComboboxSelect
;
388 public ListSelect
getRankSelect() {
393 * @return the exBasionymAuthorshipField
396 public TeamOrPersonField
getExBasionymAuthorshipField() {
397 return exBasionymAuthorshipField
;
401 * @return the basionymAuthorshipField
404 public TeamOrPersonField
getBasionymAuthorshipField() {
405 return basionymAuthorshipField
;
409 * @return the combinationAuthorshipField
412 public TeamOrPersonField
getCombinationAuthorshipField() {
413 return combinationAuthorshipField
;
417 * @return the exCombinationAuthorshipField
420 public TeamOrPersonField
getExCombinationAuthorshipField() {
421 return exCombinationAuthorshipField
;
425 public void enableMode(TaxonNamePopupEditorMode mode
){
426 modesActive
.add(mode
);
430 public boolean isModeEnabled(TaxonNamePopupEditorMode mode
){
431 return modesActive
.contains(mode
);
435 public void disableMode(TaxonNamePopupEditorMode mode
){
436 modesActive
.remove(mode
);
440 public CheckBox
getBasionymToggle() {
441 return basionymToggle
;