Project

General

Profile

Download (16.1 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.security.core.GrantedAuthority;
15

    
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;
23

    
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;
41

    
42
/**
43
 * @author a.kohlbecker
44
 * @since May 22, 2017
45
 *
46
 */
47
public class TaxonNamePopupEditor extends AbstractCdmPopupEditor<TaxonName, TaxonNameEditorPresenter> implements TaxonNamePopupEditorView, AccessRestrictedView {
48

    
49
    private static final long serialVersionUID = -7037436241474466359L;
50

    
51
    private final static int GRID_COLS = 4;
52

    
53
    private final static int GRID_ROWS = 12;
54

    
55
    private static final boolean HAS_BASIONYM_DEFAULT = false;
56

    
57
    private TextField genusOrUninomialField;
58

    
59
    private TextField infraGenericEpithetField;
60

    
61
    private TextField specificEpithetField;
62

    
63
    private TextField infraSpecificEpithetField;
64

    
65
    private SwitchableTextField fullTitleCacheFiled;
66

    
67
    private SwitchableTextField protectedNameCacheField;
68

    
69
    private ToOneRelatedEntityCombobox<Reference> nomReferenceCombobox;
70

    
71
    private TextField nomenclaturalReferenceDetail;
72

    
73
    private TeamOrPersonField exBasionymAuthorshipField;
74

    
75
    private TeamOrPersonField basionymAuthorshipField;
76

    
77
    private ToManyRelatedEntitiesComboboxSelect<TaxonName> basionymsComboboxSelect;
78

    
79
    private CheckBox basionymToggle;
80

    
81
    private ListSelect rankSelect;
82

    
83
    private TeamOrPersonField combinationAuthorshipField;
84

    
85
    private TeamOrPersonField exCombinationAuthorshipField;
86

    
87
    private EnumSet<TaxonNamePopupEditorMode> modesActive = EnumSet.noneOf(TaxonNamePopupEditorMode.class);
88

    
89
    /**
90
     * @param layout
91
     * @param dtoType
92
     */
93
    public TaxonNamePopupEditor() {
94
        super(new GridLayout(GRID_COLS, GRID_ROWS), TaxonName.class);
95
    }
96

    
97
    /**
98
     * {@inheritDoc}
99
     */
100
    @Override
101
    public String getWindowCaption() {
102
        return "Name editor";
103
    }
104

    
105

    
106

    
107
    /**
108
     * {@inheritDoc}
109
     */
110
    @Override
111
    public int getWindowPixelWidth() {
112
        return 700;
113
    }
114

    
115
    /**
116
     * {@inheritDoc}
117
     */
118
    @Override
119
    public void focusFirst() {
120
        // titleField.focus();
121

    
122
    }
123

    
124
    /**
125
     * {@inheritDoc}
126
     */
127
    @Override
128
    protected String getDefaultComponentStyles() {
129
        return "tiny";
130
    }
131

    
132
    /**
133
     * {@inheritDoc}
134
     */
135
    @Override
136
    protected void initContent() {
137

    
138
        GridLayout grid = (GridLayout)getFieldLayout();
139
        grid.setSizeFull();
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);
145

    
146
        /*
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
152

    
153
         - fullTitleCache + protectedFullTitleCache -> SwitchableTextField : ADVANCED_MODE
154
         - nameCache + protectedNameCache -> SwitchableTextField : ADVANCED_MODE
155

    
156
         - homotypicalGroup -> hidden
157
         - typeDesignations -> hidden
158
         - descriptions -> hidden
159
         - taxonBases -> hidden
160
         - registrations -> hidden
161

    
162
         - relationsFromThisName-> TODO implement later
163
         - relationsToThisName -> TODO implement later
164

    
165
         - genusOrUninomial -> textField
166
         - infraGenericEpithet  -> textField
167
         - specificEpithet  -> textField
168
         - infraSpecificEpithet  -> textField
169

    
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
175

    
176
         - status -> TODO field
177
         - monomHybrid -> TODO implement hybrids later
178
         - binomHybrid -> TODO implement hybrids later
179
         - trinomHybrid -> TODO implement hybrids later
180

    
181
         - hybridParentRelations -> TODO implement hybrids later
182
         - hybridChildRelations -> TODO implement hybrids later
183
         - hybridFormula -> TODO implement hybrids later
184

    
185
         ** ViralName attributes **
186
         - acronym
187

    
188
         ** BacterialName attributes **
189
         - subGenusAuthorship
190
         - nameApprobation
191
         - breed
192
         - publicationYear
193
         - originalPublicationYear
194
         - cultivarName
195
        */
196

    
197
        int row = 0;
198

    
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);
206

    
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);
212
            });
213
        basionymToggle.setStyleName(getDefaultComponentStyles());
214
        grid.addComponent(basionymToggle, 2, row, 3, row);
215
        grid.setComponentAlignment(basionymToggle, Alignment.BOTTOM_LEFT);
216
        row++;
217
        // fullTitleCache
218
        fullTitleCacheFiled = addSwitchableTextField("Full title cache", "fullTitleCache", "protectedFullTitleCache", 0, row, GRID_COLS-1, row);
219
        fullTitleCacheFiled.setWidth(100, Unit.PERCENTAGE);
220
        row++;
221
        protectedNameCacheField = addSwitchableTextField("Name cache", "nameCache", "protectedNameCache", 0, row, GRID_COLS-1, row);
222
        protectedNameCacheField.setWidth(100, Unit.PERCENTAGE);
223
        row++;
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);
228
        row++;
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);
233
        row++;
234
        combinationAuthorshipField = new TeamOrPersonField("combination author(s)");
235
        combinationAuthorshipField.setWidth(100,  Unit.PERCENTAGE);
236
        addField(combinationAuthorshipField, "combinationAuthorship", 0, row, GRID_COLS-1, row);
237

    
238
        row++;
239
        grid.addComponent(new Label("Hint: <i>Nomenclatural authors can be edited in the nomenclatural reference.</i>", ContentMode.HTML), 0, row, 3, row);
240
        // nomenclaturalReference
241
        row++;
242
        nomReferenceCombobox = new ToOneRelatedEntityCombobox<Reference>("Nomenclatural reference", Reference.class);
243
        nomReferenceCombobox.addClickListenerAddEntity(e -> getEventBus().publishEvent(
244
                new ReferenceEditorAction(EditorActionType.ADD, null, nomReferenceCombobox, this)
245
                ));
246
        nomReferenceCombobox.addClickListenerEditEntity(e -> {
247
            if(nomReferenceCombobox.getValue() != null){
248
                getEventBus().publishEvent(
249
                    new ReferenceEditorAction(
250
                            EditorActionType.EDIT,
251
                            nomReferenceCombobox.getValue().getId(),
252
                            nomReferenceCombobox,
253
                            this)
254
                );
255
            }
256
            });
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);
262

    
263
        row++;
264
        exCombinationAuthorshipField = new TeamOrPersonField("Ex-combination author(s)");
265
        exCombinationAuthorshipField.setWidth(100,  Unit.PERCENTAGE);
266
        addField(exCombinationAuthorshipField, "exCombinationAuthorship", 0, row, GRID_COLS-1, row);
267

    
268
        // Basionym
269
        row++;
270
        basionymsComboboxSelect = new ToManyRelatedEntitiesComboboxSelect<TaxonName>(TaxonName.class, "Basionym");
271
        basionymsComboboxSelect.setConverter(new SetToListConverter<TaxonName>());
272
        addField(basionymsComboboxSelect, "basionyms", 0, row, 3, row);
273
        basionymsComboboxSelect.setWidth(100, Unit.PERCENTAGE);
274
        basionymsComboboxSelect.withEditButton(true);
275
        basionymsComboboxSelect.setEditPermissionTester(new EditPermissionTester() {
276

    
277
            @Override
278
            public boolean userHasEditPermission(Object bean) {
279
                return  UserHelper.fromSession().userHasPermission((CdmBase)bean, CRUD.UPDATE, CRUD.DELETE);
280
            }
281
        });
282
        basionymsComboboxSelect.setEditActionListener(e -> {
283

    
284
            Object fieldValue = e.getSource().getValue();
285
            Integer beanId = null;
286
            if(fieldValue != null){
287
                beanId = ((CdmBase)fieldValue).getId();
288

    
289
            }
290
            eventBus.publishEvent(new TaxonNameEditorAction(e.getAction(), beanId, e.getSource(), this));
291
        });
292
        grid.setComponentAlignment(basionymsComboboxSelect, Alignment.TOP_RIGHT);
293
        row++;
294
        basionymAuthorshipField = new TeamOrPersonField("Basionym author(s)");
295
        basionymAuthorshipField.setWidth(100,  Unit.PERCENTAGE);
296
        addField(basionymAuthorshipField, "basionymAuthorship", 0, row, GRID_COLS-1, row);
297
        row++;
298
        exBasionymAuthorshipField = new TeamOrPersonField("Ex-basionym author(s)");
299
        exBasionymAuthorshipField.setWidth(100,  Unit.PERCENTAGE);
300
        addField(exBasionymAuthorshipField, "exBasionymAuthorship", 0, row, GRID_COLS-1, row);
301

    
302

    
303

    
304
        setAdvancedModeEnabled(true);
305
        enableBasionymFields(HAS_BASIONYM_DEFAULT);
306
        registerAdvancedModeComponents(fullTitleCacheFiled, protectedNameCacheField);
307
        registerAdvancedModeComponents(basionymAuthorshipField.getCachFields());
308
        registerAdvancedModeComponents(exBasionymAuthorshipField.getCachFields());
309
        registerAdvancedModeComponents(combinationAuthorshipField.getCachFields());
310
        registerAdvancedModeComponents(exCombinationAuthorshipField.getCachFields());
311
        setAdvancedMode(false);
312

    
313
    }
314

    
315
    /**
316
     * @param value
317
     * @return
318
     */
319
    private void enableBasionymFields(boolean enable) {
320

    
321

    
322
        basionymAuthorshipField.setVisible(enable);
323
        exBasionymAuthorshipField.setVisible(enable);
324
        basionymsComboboxSelect.setVisible(enable);
325
        TaxonName taxonName = getBean();
326

    
327
        if(taxonName != null){
328
            if(modesActive.contains(TaxonNamePopupEditorMode.suppressReplacementAuthorshipData)){
329
                basionymAuthorshipField.setVisible(taxonName.getBasionymAuthorship() != null);
330
            }
331
            updateFieldVisibility(taxonName.getRank());
332
        }
333
    }
334

    
335
    /**
336
     * @param rank
337
     * @return
338
     */
339
    private void updateFieldVisibility(Rank rank) {
340
        boolean isSpeciesOrBelow = !rank.isHigher(Rank.SPECIES());
341
        // TODO use getField() instead and remove field references
342
        infraSpecificEpithetField.setVisible(rank.isInfraSpecific());
343
        specificEpithetField.setVisible(isSpeciesOrBelow);
344
        infraGenericEpithetField.setVisible(rank.isInfraGenericButNotSpeciesGroup());
345
        genusOrUninomialField.setCaption(isSpeciesOrBelow ? "Genus" : "Uninomial");
346
        exCombinationAuthorshipField.setVisible(isSpeciesOrBelow);
347
    }
348

    
349
    @Override
350
    protected void afterItemDataSourceSet() {
351
        TaxonName taxonName = getBean();
352
        boolean showBasionymSection = taxonName.getBasionyms().size() > 0
353
                || taxonName.getBasionymAuthorship() != null
354
                || taxonName.getExBasionymAuthorship() != null;
355
        basionymToggle.setValue(showBasionymSection);
356

    
357
        if(isModeEnabled(TaxonNamePopupEditorMode.suppressReplacementAuthorshipData)){
358
            combinationAuthorshipField.setVisible(taxonName.getCombinationAuthorship() != null);
359
        }
360
        if(isModeEnabled(TaxonNamePopupEditorMode.nomenclaturalReferenceSectionEditingOnly) && getBean().getNomenclaturalReference() != null) {
361
            nomReferenceCombobox.setCaption("Nomenclatural reference (sections of " + getBean().getNomenclaturalReference().getTitle() + " only)");
362
        }
363

    
364
    }
365

    
366
    /**
367
     * {@inheritDoc}
368
     */
369
    @Override
370
    public boolean allowAnonymousAccess() {
371
        return false;
372
    }
373

    
374
    /**
375
     * {@inheritDoc}
376
     */
377
    @Override
378
    public Collection<Collection<GrantedAuthority>> allowedGrantedAuthorities() {
379
        return null;
380
    }
381

    
382
    /**
383
     * {@inheritDoc}
384
     */
385
    @Override
386
    public ToOneRelatedEntityCombobox<Reference> getNomReferenceCombobox() {
387
        return nomReferenceCombobox;
388
    }
389

    
390
    /**
391
     * {@inheritDoc}
392
     */
393
    @Override
394
    public ToManyRelatedEntitiesComboboxSelect<TaxonName> getBasionymComboboxSelect() {
395
        return basionymsComboboxSelect;
396
    }
397

    
398
    /**
399
     * {@inheritDoc}
400
     */
401
    @Override
402
    public ListSelect getRankSelect() {
403
        return rankSelect;
404
    }
405

    
406
    /**
407
     * @return the exBasionymAuthorshipField
408
     */
409
    @Override
410
    public TeamOrPersonField getExBasionymAuthorshipField() {
411
        return exBasionymAuthorshipField;
412
    }
413

    
414
    /**
415
     * @return the basionymAuthorshipField
416
     */
417
    @Override
418
    public TeamOrPersonField getBasionymAuthorshipField() {
419
        return basionymAuthorshipField;
420
    }
421

    
422
    /**
423
     * @return the combinationAuthorshipField
424
     */
425
    @Override
426
    public TeamOrPersonField getCombinationAuthorshipField() {
427
        return combinationAuthorshipField;
428
    }
429

    
430
    /**
431
     * @return the exCombinationAuthorshipField
432
     */
433
    @Override
434
    public TeamOrPersonField getExCombinationAuthorshipField() {
435
        return exCombinationAuthorshipField;
436
    }
437

    
438
    @Override
439
    public void enableMode(TaxonNamePopupEditorMode mode){
440
        modesActive.add(mode);
441
    }
442

    
443
    @Override
444
    public boolean isModeEnabled(TaxonNamePopupEditorMode mode){
445
        return modesActive.contains(mode);
446
    }
447

    
448
    @Override
449
    public void disableMode(TaxonNamePopupEditorMode mode){
450
        modesActive.remove(mode);
451
    }
452

    
453
    @Override
454
    public CheckBox getBasionymToggle() {
455
        return basionymToggle;
456
    }
457

    
458

    
459
}
(7-7/10)