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
.shared
.ui
.label
.ContentMode
;
17 import com
.vaadin
.ui
.Alignment
;
18 import com
.vaadin
.ui
.CheckBox
;
19 import com
.vaadin
.ui
.GridLayout
;
20 import com
.vaadin
.ui
.Label
;
21 import com
.vaadin
.ui
.ListSelect
;
22 import com
.vaadin
.ui
.TextField
;
24 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
25 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
26 import eu
.etaxonomy
.cdm
.model
.name
.TaxonName
;
27 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
28 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.permission
.CRUD
;
29 import eu
.etaxonomy
.cdm
.vaadin
.component
.common
.TeamOrPersonField
;
30 import eu
.etaxonomy
.cdm
.vaadin
.event
.ReferenceEditorAction
;
31 import eu
.etaxonomy
.cdm
.vaadin
.event
.TaxonNameEditorAction
;
32 import eu
.etaxonomy
.cdm
.vaadin
.security
.AccessRestrictedView
;
33 import eu
.etaxonomy
.cdm
.vaadin
.security
.UserHelper
;
34 import eu
.etaxonomy
.cdm
.vaadin
.util
.converter
.SetToListConverter
;
35 import eu
.etaxonomy
.vaadin
.component
.SwitchableTextField
;
36 import eu
.etaxonomy
.vaadin
.component
.ToManyRelatedEntitiesComboboxSelect
;
37 import eu
.etaxonomy
.vaadin
.component
.ToOneRelatedEntityCombobox
;
38 import eu
.etaxonomy
.vaadin
.event
.EditorActionType
;
39 import eu
.etaxonomy
.vaadin
.mvp
.AbstractCdmPopupEditor
;
40 import eu
.etaxonomy
.vaadin
.permission
.EditPermissionTester
;
43 * @author a.kohlbecker
47 public class TaxonNamePopupEditor
extends AbstractCdmPopupEditor
<TaxonName
, TaxonNameEditorPresenter
> implements TaxonNamePopupEditorView
, AccessRestrictedView
{
49 private static final long serialVersionUID
= -7037436241474466359L;
51 private final static int GRID_COLS
= 4;
53 private final static int GRID_ROWS
= 12;
55 private static final boolean HAS_BASIONYM_DEFAULT
= false;
57 private TextField genusOrUninomialField
;
59 private TextField infraGenericEpithetField
;
61 private TextField specificEpithetField
;
63 private TextField infraSpecificEpithetField
;
65 private SwitchableTextField fullTitleCacheFiled
;
67 private SwitchableTextField protectedNameCacheField
;
69 private ToOneRelatedEntityCombobox
<Reference
> nomReferenceCombobox
;
71 private TextField nomenclaturalReferenceDetail
;
73 private TeamOrPersonField exBasionymAuthorshipField
;
75 private TeamOrPersonField basionymAuthorshipField
;
77 private ToManyRelatedEntitiesComboboxSelect
<TaxonName
> basionymsComboboxSelect
;
79 private CheckBox basionymToggle
;
81 private ListSelect rankSelect
;
83 private TeamOrPersonField combinationAuthorshipField
;
85 private TeamOrPersonField exCombinationAuthorshipField
;
87 private EnumSet
<TaxonNamePopupEditorMode
> modesActive
= EnumSet
.noneOf(TaxonNamePopupEditorMode
.class);
93 public TaxonNamePopupEditor() {
94 super(new GridLayout(GRID_COLS
, GRID_ROWS
), TaxonName
.class);
101 public String
getWindowCaption() {
102 return "Name editor";
111 public int getWindowPixelWidth() {
119 public void focusFirst() {
120 // titleField.focus();
128 protected String
getDefaultComponentStyles() {
136 protected void initContent() {
138 GridLayout grid
= (GridLayout
)getFieldLayout();
140 grid
.setSpacing(true);
141 grid
.setColumnExpandRatio(0, 0.3f
);
142 grid
.setColumnExpandRatio(1, 0.3f
);
143 grid
.setColumnExpandRatio(2, 0.3f
);
144 grid
.setColumnExpandRatio(3, 0.0f
);
147 - nameType: preset, needs to be set in the presenter for new names
148 - appendedPhrase: -> TODO field
149 - nomenclaturalMicroReference: -> TODO field
150 - nomenclaturalReference -> field but disabled for REGISTRY
151 - rank -> SelectField which determines the visiblity of the other fields
153 - fullTitleCache + protectedFullTitleCache -> SwitchableTextField : ADVANCED_MODE
154 - nameCache + protectedNameCache -> SwitchableTextField : ADVANCED_MODE
156 - homotypicalGroup -> hidden
157 - typeDesignations -> hidden
158 - descriptions -> hidden
159 - taxonBases -> hidden
160 - registrations -> hidden
162 - relationsFromThisName-> TODO implement later
163 - relationsToThisName -> TODO implement later
165 - genusOrUninomial -> textField
166 - infraGenericEpithet -> textField
167 - specificEpithet -> textField
168 - infraSpecificEpithet -> textField
170 - authorshipCache + protectedAuthorshipCache -> SwitchableTextField : only ADVANCED_MODE and disabled for REGISTRY
171 - basionymAuthorship -> field but disabled for REGISTRY, basionym is set as nameRelationShip
172 - combinationAuthorship -> field but disabled for REGISTRY author team of the reference
173 - exCombinationAuthorship -> textField
174 - exBasionymAuthorship -> textField
176 - status -> TODO field
177 - monomHybrid -> TODO implement hybrids later
178 - binomHybrid -> TODO implement hybrids later
179 - trinomHybrid -> TODO implement hybrids later
181 - hybridParentRelations -> TODO implement hybrids later
182 - hybridChildRelations -> TODO implement hybrids later
183 - hybridFormula -> TODO implement hybrids later
185 ** ViralName attributes **
188 ** BacterialName attributes **
193 - originalPublicationYear
199 rankSelect
= new ListSelect("Rank");
200 rankSelect
.setNullSelectionAllowed(false);
201 rankSelect
.setRows(1);
202 rankSelect
.setWidth(100, Unit
.PERCENTAGE
);
203 rankSelect
.addValueChangeListener(e
-> updateFieldVisibility((Rank
)e
.getProperty().getValue()));
204 addField(rankSelect
, "rank", 0, row
, 1, row
);
205 grid
.setComponentAlignment(rankSelect
, Alignment
.TOP_RIGHT
);
207 basionymToggle
= new CheckBox("With basionym");
208 basionymToggle
.setValue(HAS_BASIONYM_DEFAULT
);
209 basionymToggle
.addValueChangeListener(e
-> {
210 boolean enable
= e
.getProperty().getValue() != null && (Boolean
)e
.getProperty().getValue();
211 enableBasionymFields(enable
);
213 basionymToggle
.setStyleName(getDefaultComponentStyles());
214 grid
.addComponent(basionymToggle
, 2, row
, 3, row
);
215 grid
.setComponentAlignment(basionymToggle
, Alignment
.BOTTOM_LEFT
);
218 fullTitleCacheFiled
= addSwitchableTextField("Full title cache", "fullTitleCache", "protectedFullTitleCache", 0, row
, GRID_COLS
-1, row
);
219 fullTitleCacheFiled
.setWidth(100, Unit
.PERCENTAGE
);
221 protectedNameCacheField
= addSwitchableTextField("Name cache", "nameCache", "protectedNameCache", 0, row
, GRID_COLS
-1, row
);
222 protectedNameCacheField
.setWidth(100, Unit
.PERCENTAGE
);
224 genusOrUninomialField
= addTextField("Genus or uninomial", "genusOrUninomial", 0, row
, 1, row
);
225 genusOrUninomialField
.setWidth(200, Unit
.PIXELS
);
226 infraGenericEpithetField
= addTextField("Infrageneric epithet", "infraGenericEpithet", 2, row
, 3, row
);
227 infraGenericEpithetField
.setWidth(200, Unit
.PIXELS
);
229 specificEpithetField
= addTextField("Specific epithet", "specificEpithet", 0, row
, 1, row
);
230 specificEpithetField
.setWidth(200, Unit
.PIXELS
);
231 infraSpecificEpithetField
= addTextField("Infraspecific epithet", "infraSpecificEpithet", 2, row
, 3, row
);
232 infraSpecificEpithetField
.setWidth(200, Unit
.PIXELS
);
235 grid
.addComponent(new Label("Hint: <i>Edit nomenclatural authors in the nomenclatural reference.</i>", ContentMode
.HTML
), 0, row
, 3, row
);
238 combinationAuthorshipField
= new TeamOrPersonField("combination author(s)");
239 combinationAuthorshipField
.setWidth(100, Unit
.PERCENTAGE
);
240 addField(combinationAuthorshipField
, "combinationAuthorship", 0, row
, GRID_COLS
-1, row
);
243 nomReferenceCombobox
= new ToOneRelatedEntityCombobox
<Reference
>("Nomenclatural reference", Reference
.class);
244 nomReferenceCombobox
.addClickListenerAddEntity(e
-> getEventBus().publishEvent(
245 new ReferenceEditorAction(EditorActionType
.ADD
, null, nomReferenceCombobox
, this)
247 nomReferenceCombobox
.addClickListenerEditEntity(e
-> {
248 if(nomReferenceCombobox
.getValue() != null){
249 getEventBus().publishEvent(
250 new ReferenceEditorAction(
251 EditorActionType
.EDIT
,
252 nomReferenceCombobox
.getValue().getId(),
253 nomReferenceCombobox
,
258 // nomReferenceCombobox.setWidth(300, Unit.PIXELS);
259 nomReferenceCombobox
.setWidth("100%");
260 addField(nomReferenceCombobox
, "nomenclaturalReference", 0, row
, 2, row
);
261 nomenclaturalReferenceDetail
= addTextField("Reference detail", "nomenclaturalMicroReference", 3, row
, 3, row
);
262 nomenclaturalReferenceDetail
.setWidth(100, Unit
.PIXELS
);
265 exCombinationAuthorshipField
= new TeamOrPersonField("Ex-combination author(s)");
266 exCombinationAuthorshipField
.setWidth(100, Unit
.PERCENTAGE
);
267 addField(exCombinationAuthorshipField
, "exCombinationAuthorship", 0, row
, GRID_COLS
-1, row
);
271 basionymsComboboxSelect
= new ToManyRelatedEntitiesComboboxSelect
<TaxonName
>(TaxonName
.class, "Basionym");
272 basionymsComboboxSelect
.setConverter(new SetToListConverter
<TaxonName
>());
273 addField(basionymsComboboxSelect
, "basionyms", 0, row
, 3, row
);
274 basionymsComboboxSelect
.setWidth(100, Unit
.PERCENTAGE
);
275 basionymsComboboxSelect
.withEditButton(true);
276 basionymsComboboxSelect
.setEditPermissionTester(new EditPermissionTester() {
279 public boolean userHasEditPermission(Object bean
) {
280 return UserHelper
.fromSession().userHasPermission((CdmBase
)bean
, CRUD
.UPDATE
, CRUD
.DELETE
);
283 basionymsComboboxSelect
.setEditActionListener(e
-> {
285 Object fieldValue
= e
.getSource().getValue();
286 Integer beanId
= null;
287 if(fieldValue
!= null){
288 beanId
= ((CdmBase
)fieldValue
).getId();
291 eventBus
.publishEvent(new TaxonNameEditorAction(e
.getAction(), beanId
, e
.getSource(), this));
293 grid
.setComponentAlignment(basionymsComboboxSelect
, Alignment
.TOP_RIGHT
);
295 basionymAuthorshipField
= new TeamOrPersonField("Basionym author(s)");
296 basionymAuthorshipField
.setWidth(100, Unit
.PERCENTAGE
);
297 addField(basionymAuthorshipField
, "basionymAuthorship", 0, row
, GRID_COLS
-1, row
);
299 exBasionymAuthorshipField
= new TeamOrPersonField("Ex-basionym author(s)");
300 exBasionymAuthorshipField
.setWidth(100, Unit
.PERCENTAGE
);
301 addField(exBasionymAuthorshipField
, "exBasionymAuthorship", 0, row
, GRID_COLS
-1, row
);
305 setAdvancedModeEnabled(true);
306 enableBasionymFields(HAS_BASIONYM_DEFAULT
);
307 registerAdvancedModeComponents(fullTitleCacheFiled
, protectedNameCacheField
);
308 registerAdvancedModeComponents(basionymAuthorshipField
.getCachFields());
309 registerAdvancedModeComponents(exBasionymAuthorshipField
.getCachFields());
310 registerAdvancedModeComponents(combinationAuthorshipField
.getCachFields());
311 registerAdvancedModeComponents(exCombinationAuthorshipField
.getCachFields());
312 setAdvancedMode(false);
320 private void enableBasionymFields(boolean enable
) {
323 basionymAuthorshipField
.setVisible(enable
);
324 exBasionymAuthorshipField
.setVisible(enable
);
325 basionymsComboboxSelect
.setVisible(enable
);
326 TaxonName taxonName
= getBean();
328 if(taxonName
!= null){
329 if(modesActive
.contains(TaxonNamePopupEditorMode
.suppressReplacementAuthorshipData
)){
330 basionymAuthorshipField
.setVisible(taxonName
.getBasionymAuthorship() != null);
332 updateFieldVisibility(taxonName
.getRank());
340 private void updateFieldVisibility(Rank rank
) {
341 boolean isSpeciesOrBelow
= !rank
.isHigher(Rank
.SPECIES());
342 // TODO use getField() instead and remove field references
343 infraSpecificEpithetField
.setVisible(rank
.isInfraSpecific());
344 specificEpithetField
.setVisible(isSpeciesOrBelow
);
345 infraGenericEpithetField
.setVisible(rank
.isInfraGenericButNotSpeciesGroup());
346 genusOrUninomialField
.setCaption(isSpeciesOrBelow ?
"Genus" : "Uninomial");
347 exCombinationAuthorshipField
.setVisible(isSpeciesOrBelow
);
351 protected void afterItemDataSourceSet() {
352 TaxonName taxonName
= getBean();
353 boolean showBasionymSection
= taxonName
.getBasionyms().size() > 0
354 || taxonName
.getBasionymAuthorship() != null
355 || taxonName
.getExBasionymAuthorship() != null;
356 basionymToggle
.setValue(showBasionymSection
);
358 if(isModeEnabled(TaxonNamePopupEditorMode
.suppressReplacementAuthorshipData
)){
359 combinationAuthorshipField
.setVisible(taxonName
.getCombinationAuthorship() != null);
361 if(isModeEnabled(TaxonNamePopupEditorMode
.nomenclaturalReferenceSectionEditingOnly
) && getBean().getNomenclaturalReference() != null) {
362 nomReferenceCombobox
.setCaption("Selection limited to nomenclatural reference and sections");
371 public boolean allowAnonymousAccess() {
379 public Collection
<Collection
<GrantedAuthority
>> allowedGrantedAuthorities() {
387 public ToOneRelatedEntityCombobox
<Reference
> getNomReferenceCombobox() {
388 return nomReferenceCombobox
;
395 public ToManyRelatedEntitiesComboboxSelect
<TaxonName
> getBasionymComboboxSelect() {
396 return basionymsComboboxSelect
;
403 public ListSelect
getRankSelect() {
408 * @return the exBasionymAuthorshipField
411 public TeamOrPersonField
getExBasionymAuthorshipField() {
412 return exBasionymAuthorshipField
;
416 * @return the basionymAuthorshipField
419 public TeamOrPersonField
getBasionymAuthorshipField() {
420 return basionymAuthorshipField
;
424 * @return the combinationAuthorshipField
427 public TeamOrPersonField
getCombinationAuthorshipField() {
428 return combinationAuthorshipField
;
432 * @return the exCombinationAuthorshipField
435 public TeamOrPersonField
getExCombinationAuthorshipField() {
436 return exCombinationAuthorshipField
;
440 public void enableMode(TaxonNamePopupEditorMode mode
){
441 modesActive
.add(mode
);
445 public boolean isModeEnabled(TaxonNamePopupEditorMode mode
){
446 return modesActive
.contains(mode
);
450 public void disableMode(TaxonNamePopupEditorMode mode
){
451 modesActive
.remove(mode
);
455 public EnumSet
<TaxonNamePopupEditorMode
> getModesActive(){
460 public CheckBox
getBasionymToggle() {
461 return basionymToggle
;