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
.registration
;
11 import static eu
.etaxonomy
.cdm
.vaadin
.component
.registration
.RegistrationStyles
.LABEL_NOWRAP
;
13 import java
.util
.ArrayList
;
14 import java
.util
.Collection
;
15 import java
.util
.Collections
;
16 import java
.util
.EnumSet
;
17 import java
.util
.HashMap
;
18 import java
.util
.Iterator
;
19 import java
.util
.List
;
22 import java
.util
.Stack
;
23 import java
.util
.UUID
;
25 import org
.springframework
.security
.core
.GrantedAuthority
;
26 import org
.vaadin
.viritin
.fields
.LazyComboBox
;
28 import com
.vaadin
.navigator
.View
;
29 import com
.vaadin
.navigator
.ViewChangeListener
.ViewChangeEvent
;
30 import com
.vaadin
.server
.FontAwesome
;
31 import com
.vaadin
.server
.Page
;
32 import com
.vaadin
.shared
.ui
.label
.ContentMode
;
33 import com
.vaadin
.spring
.annotation
.SpringView
;
34 import com
.vaadin
.ui
.Alignment
;
35 import com
.vaadin
.ui
.Button
;
36 import com
.vaadin
.ui
.Component
;
37 import com
.vaadin
.ui
.CssLayout
;
38 import com
.vaadin
.ui
.GridLayout
;
39 import com
.vaadin
.ui
.HorizontalLayout
;
40 import com
.vaadin
.ui
.Label
;
41 import com
.vaadin
.ui
.Notification
;
42 import com
.vaadin
.ui
.Panel
;
43 import com
.vaadin
.ui
.UI
;
44 import com
.vaadin
.ui
.VerticalLayout
;
45 import com
.vaadin
.ui
.Window
;
46 import com
.vaadin
.ui
.themes
.ValoTheme
;
48 import eu
.etaxonomy
.cdm
.api
.service
.dto
.RegistrationDTO
;
49 import eu
.etaxonomy
.cdm
.api
.service
.dto
.RegistrationType
;
50 import eu
.etaxonomy
.cdm
.api
.service
.dto
.RegistrationWorkingSet
;
51 import eu
.etaxonomy
.cdm
.api
.service
.name
.TypeDesignationSet
.TypeDesignationSetType
;
52 import eu
.etaxonomy
.cdm
.api
.util
.RoleProberImpl
;
53 import eu
.etaxonomy
.cdm
.model
.common
.VersionableEntity
;
54 import eu
.etaxonomy
.cdm
.model
.name
.Registration
;
55 import eu
.etaxonomy
.cdm
.model
.name
.RegistrationStatus
;
56 import eu
.etaxonomy
.cdm
.model
.name
.TaxonName
;
57 import eu
.etaxonomy
.cdm
.model
.permission
.CRUD
;
58 import eu
.etaxonomy
.cdm
.ref
.EntityReference
;
59 import eu
.etaxonomy
.cdm
.ref
.TypedEntityReference
;
60 import eu
.etaxonomy
.cdm
.service
.UserHelperAccess
;
61 import eu
.etaxonomy
.cdm
.vaadin
.component
.BadgeButton
;
62 import eu
.etaxonomy
.cdm
.vaadin
.component
.registration
.RegistrationItem
;
63 import eu
.etaxonomy
.cdm
.vaadin
.component
.registration
.RegistrationItemButtons
;
64 import eu
.etaxonomy
.cdm
.vaadin
.component
.registration
.RegistrationItemNameAndTypeButtons
;
65 import eu
.etaxonomy
.cdm
.vaadin
.component
.registration
.RegistrationItemNameAndTypeButtons
.TypeDesignationSetButton
;
66 import eu
.etaxonomy
.cdm
.vaadin
.component
.registration
.RegistrationItemsPanel
;
67 import eu
.etaxonomy
.cdm
.vaadin
.component
.registration
.RegistrationStatusFieldInstantiator
;
68 import eu
.etaxonomy
.cdm
.vaadin
.component
.registration
.RegistrationStatusLabel
;
69 import eu
.etaxonomy
.cdm
.vaadin
.event
.EditorActionContext
;
70 import eu
.etaxonomy
.cdm
.vaadin
.event
.RegistrationEditorAction
;
71 import eu
.etaxonomy
.cdm
.vaadin
.event
.ShowDetailsEvent
;
72 import eu
.etaxonomy
.cdm
.vaadin
.event
.TaxonNameEditorAction
;
73 import eu
.etaxonomy
.cdm
.vaadin
.event
.TypeDesignationSetEditorAction
;
74 import eu
.etaxonomy
.cdm
.vaadin
.event
.registration
.RegistrationWorkingsetAction
;
75 import eu
.etaxonomy
.cdm
.vaadin
.permission
.AccessRestrictedView
;
76 import eu
.etaxonomy
.cdm
.vaadin
.permission
.PermissionDebugUtils
;
77 import eu
.etaxonomy
.cdm
.vaadin
.permission
.RolesAndPermissions
;
78 import eu
.etaxonomy
.cdm
.vaadin
.theme
.EditValoTheme
;
79 import eu
.etaxonomy
.cdm
.vaadin
.view
.AbstractPageView
;
80 import eu
.etaxonomy
.vaadin
.event
.EditorActionType
;
83 * @author a.kohlbecker
86 @SpringView(name
=RegistrationWorksetViewBean
.NAME
)
87 public class RegistrationWorksetViewBean
88 extends AbstractPageView
<RegistrationWorkingsetPresenter
>
89 implements RegistrationWorkingsetView
, View
, AccessRestrictedView
{
91 private static final long serialVersionUID
= -213040114015958970L;
93 private static final int COL_INDEX_STATE_LABEL
= 0;
95 private static final int COL_INDEX_REG_ITEM
= 1;
97 private static final int COL_INDEX_BUTTON_GROUP
= 2;
99 public static final String DOM_ID_WORKINGSET
= "workingset";
101 public static final String TEXT_NAME_TYPIFICATION
= "covering the name and typifications";
102 public static final String TEXT_TYPIFICATION_ONLY
= "covering typifications only";
104 public static final String NAME
= "workingset";
106 private List
<CssLayout
> registrations
= new ArrayList
<>();
108 private String headerText
= "Registration Workingset Editor";
109 private String subheaderText
= "";
111 private UUID citationUuid
;
113 private GridLayout registrationsGrid
;
115 private RegistrationItem workingsetHeader
;
117 private Panel registrationListPanel
;
119 private Button addNewNameRegistrationButton
;
121 private Button addExistingNameButton
;
123 private LazyComboBox
<TaxonName
> existingNameCombobox
;
125 private Label existingNameRegistrationTypeLabel
;
128 * uses the registrationId as key
130 private Map
<UUID
, RegistrationDetailsItem
> registrationItemMap
= new HashMap
<>();
133 * uses the registrationId as key
135 private Map
<UUID
, EntityReference
> typifiedNamesMap
= new HashMap
<>();
137 private RegistrationStatusFieldInstantiator statusFieldInstantiator
;
139 private String accessDeniedMessage
;
141 private Object existingNameEditor
;
143 public RegistrationWorksetViewBean() {
148 protected void initContent() {
149 getLayout().setId(NAME
);
151 // all content is added in createRegistrationsList()
155 public void enter(ViewChangeEvent event
) {
156 if(event
.getParameters() != null){
157 this.citationUuid
= UUID
.fromString(event
.getParameters());
159 getPresenter().handleViewEntered();
164 public void setWorkingset(RegistrationWorkingSet workingset
) {
166 if(workingsetHeader
!= null){
167 getLayout().removeComponent(workingsetHeader
);
168 getLayout().removeComponent(registrationListPanel
);
170 workingsetHeader
= new RegistrationItem(workingset
, this, getPresenter().getCache());
171 addContentComponent(workingsetHeader
, null);
173 registrationListPanel
= createRegistrationsList(workingset
);
174 registrationListPanel
.setHeight("100%");
175 registrationListPanel
.setStyleName("registration-list");
176 registrationListPanel
.setCaption("Registrations");
177 addContentComponent(registrationListPanel
, 1.0f
);
181 public void setBlockingRegistrations(UUID registrationUuid
, Set
<RegistrationDTO
> blockingRegDTOs
) {
183 RegistrationDetailsItem regItem
= registrationItemMap
.get(registrationUuid
);
185 boolean blockingRegAdded
= false;
186 for(Iterator it
= regItem
.itemFooter
.iterator(); it
.hasNext(); ){
187 if(it
.next() instanceof RegistrationItemsPanel
){
188 blockingRegAdded
= true;
192 if(!blockingRegAdded
){
193 regItem
.itemFooter
.addComponent(new RegistrationItemsPanel(this, "Blocked by", blockingRegDTOs
, getPresenter().getCache()));
198 @Deprecated // no longer needed
199 public void addBlockingRegistration(RegistrationDTO blocking
) {
200 if(registrations
== null) {
201 throw new RuntimeException("A Workingset must be present prior adding blocking registrations.");
203 // add the blocking registration
207 public Panel
createRegistrationsList(RegistrationWorkingSet workingset
) {
209 registrationsGrid
= new GridLayout(3, 1);
210 registrationsGrid
.setWidth("100%");
211 // allow vertical scrolling:
212 registrationsGrid
.setHeightUndefined();
214 //registrationsGrid.setColumnExpandRatio(0, 0.1f);
215 registrationsGrid
.setColumnExpandRatio(1, 1f
);
217 registrationItemMap
.clear();
218 registrationsGrid
.setRows(workingset
.getRegistrationDTOs().size() * 2 + 3);
220 for(RegistrationDTO dto
: workingset
.getRegistrationDTOs()) {
221 row
= putRegistrationListComponent(row
, dto
);
224 // --- Footer with UI to create new registrations ----
225 Label addRegistrationLabel_1
= new Label("Add a new registration for a");
226 Label addRegistrationLabel_2
= new Label("or an");
228 addNewNameRegistrationButton
= new Button("new name");
229 addNewNameRegistrationButton
.setDescription("A name which is newly published in this publication.");
230 Stack
<EditorActionContext
> context
= new Stack
<EditorActionContext
>();
231 context
.push(new EditorActionContext(
232 new TypedEntityReference
<>(Registration
.class, null),
235 addNewNameRegistrationButton
.addClickListener(
237 getViewEventBus().publish(this, new TaxonNameEditorAction(EditorActionType
.ADD
, null, addNewNameRegistrationButton
, null, this, context
));
242 existingNameRegistrationTypeLabel
= new Label();
243 addExistingNameButton
= new Button("existing name:");
244 addExistingNameButton
.setEnabled(false);
245 addExistingNameButton
.addClickListener(e
-> reviewExistingName());
247 existingNameCombobox
= new LazyComboBox
<TaxonName
>(TaxonName
.class);
248 existingNameCombobox
.addValueChangeListener(
250 boolean selectionNotEmpty
= e
.getProperty().getValue() != null;
251 addExistingNameButton
.setEnabled(false);
252 existingNameRegistrationTypeLabel
.setValue(null);
253 if(selectionNotEmpty
){
254 TaxonName name
= (TaxonName
)e
.getProperty().getValue();
255 if(getPresenter().canCreateNameRegistrationFor(name
)){
256 existingNameRegistrationTypeLabel
.setValue(TEXT_NAME_TYPIFICATION
);
257 addExistingNameButton
.setEnabled(true);
259 if(!getPresenter().checkWokingsetContainsProtologe(name
)){
260 existingNameRegistrationTypeLabel
.setValue(TEXT_TYPIFICATION_ONLY
);
261 addExistingNameButton
.setEnabled(true);
265 existingNameRegistrationTypeLabel
.setValue(null);
270 HorizontalLayout buttonContainer
= new HorizontalLayout(
271 addRegistrationLabel_1
,
272 addNewNameRegistrationButton
,
273 addRegistrationLabel_2
,
274 addExistingNameButton
,
275 existingNameCombobox
,
276 existingNameRegistrationTypeLabel
278 buttonContainer
.setSpacing(true);
279 // buttonContainer.setWidth(100, Unit.PERCENTAGE);
280 buttonContainer
.setComponentAlignment(addRegistrationLabel_1
, Alignment
.MIDDLE_LEFT
);
281 buttonContainer
.setComponentAlignment(addRegistrationLabel_2
, Alignment
.MIDDLE_LEFT
);
284 registrationsGrid
.addComponent(buttonContainer
, 0, row
, COL_INDEX_BUTTON_GROUP
, row
);
285 registrationsGrid
.setComponentAlignment(buttonContainer
, Alignment
.MIDDLE_RIGHT
);
288 Label hint
= new Label(
289 "For most names that already exist in the system, it is only possible to create a registration covering type designations. "
290 + "In all other cases please choose <a href=\"registration#!regStart\">\"New\"</a> from the main menu and start a registration for the nomenclatural reference of the name to be registered.",
292 registrationsGrid
.addComponent(hint
, 0, row
, COL_INDEX_BUTTON_GROUP
, row
);
293 registrationsGrid
.setComponentAlignment(hint
, Alignment
.MIDDLE_RIGHT
);
295 Panel namesTypesPanel
= new Panel(registrationsGrid
);
296 namesTypesPanel
.setStyleName(EditValoTheme
.PANEL_CONTENT_PADDING_LEFT
);
297 return namesTypesPanel
;
300 private void reviewExistingName() {
301 // call commit to make the selection available
302 existingNameCombobox
.commit();
303 UUID uuid
= existingNameCombobox
.getValue().getUuid();
304 Stack
<EditorActionContext
> context
= new Stack
<EditorActionContext
>();
305 context
.push(new EditorActionContext(
306 new TypedEntityReference
<>(TaxonName
.class, uuid
),
309 getViewEventBus().publish(
311 new TaxonNameEditorAction(
312 EditorActionType
.EDIT
,
314 addExistingNameButton
,
315 existingNameCombobox
,
323 * publishes an event to the {@link RegistrationWorkingsetPresenter}
324 * @deprecated no longer used but kept for reference
325 * TODO remove for version 5.8 when not used again.
328 private void triggerRegistrationForExistingName() {
329 getViewEventBus().publish(this, new RegistrationWorkingsetAction(
331 RegistrationWorkingsetAction
.Action
.start
336 protected int putRegistrationListComponent(int row
, RegistrationDTO dto
) {
338 EntityReference typifiedNameReference
= dto
.getTypifiedNameRef();
339 if(typifiedNameReference
== null){
340 typifiedNameReference
= dto
.getNameRef();
342 typifiedNamesMap
.put(dto
.getUuid(), typifiedNameReference
);
344 RegistrationItemNameAndTypeButtons regItemButtonGroup
= new RegistrationItemNameAndTypeButtons(dto
, getPresenter().getCache());
345 UUID registrationEntityUuid
= dto
.getUuid();
347 RegistrationItemButtons regItemButtons
= new RegistrationItemButtons();
349 CssLayout footer
= new CssLayout();
350 footer
.setWidth(100, Unit
.PERCENTAGE
);
351 footer
.setStyleName("item-footer");
353 RegistrationDetailsItem regDetailsItem
= new RegistrationDetailsItem(regItemButtonGroup
, regItemButtons
, footer
);
354 registrationItemMap
.put(registrationEntityUuid
, regDetailsItem
);
356 Stack
<EditorActionContext
> context
= new Stack
<EditorActionContext
>();
357 context
.push(new EditorActionContext(
358 new TypedEntityReference
<>(Registration
.class, registrationEntityUuid
),
362 if(regItemButtonGroup
.getNameButton() != null){
363 regItemButtonGroup
.getNameButton().getButton().addClickListener(e
-> {
364 UUID nameuUuid
= regItemButtonGroup
.getNameButton().getUuid();
365 getViewEventBus().publish(this, new TaxonNameEditorAction(
366 EditorActionType
.EDIT
,
377 for(TypeDesignationSetButton workingsetButton
: regItemButtonGroup
.getTypeDesignationButtons()){
378 workingsetButton
.getButton().addClickListener(e
-> {
379 VersionableEntity baseEntity
= workingsetButton
.getBaseEntity();
380 EntityReference typifiedNameRef
= typifiedNamesMap
.get(registrationEntityUuid
);
381 TypeDesignationSetType workingsetType
= workingsetButton
.getType();
382 getViewEventBus().publish(this, new TypeDesignationSetEditorAction(
385 registrationEntityUuid
,
386 typifiedNameRef
.getUuid(),
396 regItemButtonGroup
.getAddTypeDesignationButton().addClickListener(
397 e
-> chooseNewTypeRegistrationWorkingset(dto
.getUuid())
400 Button blockingRegistrationButton
= regItemButtons
.getBlockingRegistrationButton();
401 blockingRegistrationButton
.setStyleName(ValoTheme
.BUTTON_TINY
);
402 blockingRegistrationButton
.setDescription("No blocking registrations");
404 blockingRegistrationButton
.setEnabled(true);
405 blockingRegistrationButton
.setDescription("This registration is currently blocked by other registrations");
406 blockingRegistrationButton
.addStyleName(EditValoTheme
.BUTTON_HIGHLITE
);
407 blockingRegistrationButton
.addClickListener(e
-> getViewEventBus().publish(
409 new ShowDetailsEvent
<RegistrationDTO
, UUID
>(
411 RegistrationDTO
.class,
413 RegistrationItem
.BLOCKED_BY
418 BadgeButton validationProblemsButton
= regItemButtons
.getValidationProblemsButton();
419 validationProblemsButton
.setStyleName(ValoTheme
.BUTTON_TINY
); // + " " + RegistrationStyles.STYLE_FRIENDLY_FOREGROUND);
421 if(!dto
.getValidationProblems().isEmpty()){
422 validationProblemsButton
.setEnabled(true);
423 validationProblemsButton
.addClickListener(e
-> getViewEventBus().publish(this,
424 new ShowDetailsEvent
<RegistrationDTO
, UUID
>(
426 RegistrationDTO
.class,
428 RegistrationItem
.VALIDATION_PROBLEMS
433 int problemCount
= dto
.getValidationProblems().size();
434 validationProblemsButton
.setCaption(problemCount
> 0 ? Integer
.toString(problemCount
) : null);
436 Component statusComponent
;
437 if(statusFieldInstantiator
!= null){
438 statusComponent
= statusFieldInstantiator
.create(dto
);
440 statusComponent
= new RegistrationStatusLabel().update(dto
.getStatus());
442 Label submitterLabel
= new Label(dto
.getSubmitterUserName());
443 submitterLabel
.setStyleName(LABEL_NOWRAP
+ " submitter");
444 submitterLabel
.setIcon(FontAwesome
.USER
);
445 submitterLabel
.setContentMode(ContentMode
.HTML
);
446 CssLayout stateAndSubmitter
= new CssLayout(statusComponent
, submitterLabel
);
449 if(UserHelperAccess
.userHelper().userIs(new RoleProberImpl(RolesAndPermissions
.ROLE_CURATION
)) || UserHelperAccess
.userHelper().userIsAdmin()) {
451 Button editRegistrationButton
= new Button(FontAwesome
.COG
);
452 editRegistrationButton
.setStyleName(ValoTheme
.BUTTON_TINY
);
453 editRegistrationButton
.setDescription("Edit registration");
454 editRegistrationButton
.addClickListener(e
-> getViewEventBus().publish(this, new RegistrationEditorAction(
455 EditorActionType
.EDIT
,
462 Button unlockButton
= new Button(FontAwesome
.LOCK
);
463 unlockButton
.setStyleName(ValoTheme
.BUTTON_TINY
);
464 unlockButton
.setDescription("Unlock");
465 unlockButton
.addClickListener(e
-> {
466 regItemButtonGroup
.setLockOverride(!regItemButtonGroup
.isLockOverride());
467 if(regItemButtonGroup
.isRegistrationLocked()){
468 unlockButton
.setIcon(regItemButtonGroup
.isLockOverride() ? FontAwesome
.UNLOCK_ALT
: FontAwesome
.LOCK
);
469 unlockButton
.setDescription(regItemButtonGroup
.isLockOverride() ?
"Click to unlock editing" : "Click to lock editing");
472 unlockButton
.setEnabled(regItemButtonGroup
.isRegistrationLocked());
473 regItemButtons
.addComponents(unlockButton
, editRegistrationButton
);
476 PermissionDebugUtils
.addGainPerEntityPermissionButton(regItemButtons
, Registration
.class, dto
.getUuid(),
477 EnumSet
.of(CRUD
.UPDATE
), RegistrationStatus
.PREPARATION
.name());
480 registrationsGrid
.addComponent(stateAndSubmitter
, COL_INDEX_STATE_LABEL
, row
);
481 // registrationsGrid.setComponentAlignment(stateLabel, Alignment.TOP_LEFT);
482 registrationsGrid
.addComponent(regItemButtonGroup
, COL_INDEX_REG_ITEM
, row
);
483 registrationsGrid
.addComponent(regItemButtons
, COL_INDEX_BUTTON_GROUP
, row
);
484 registrationsGrid
.setComponentAlignment(regItemButtons
, Alignment
.TOP_LEFT
);
487 registrationsGrid
.addComponent(footer
, 0, row
, COL_INDEX_BUTTON_GROUP
, row
);
493 public void chooseNewTypeRegistrationWorkingset(UUID registrationEntityUuid
){
494 Window typeDesignationTypeCooser
= new Window();
495 typeDesignationTypeCooser
.setModal(true);
496 typeDesignationTypeCooser
.setResizable(false);
497 typeDesignationTypeCooser
.setCaption("Add new type designation");
498 Label label
= new Label("Please select kind of type designation to be created.");
499 Button newSpecimenTypeDesignationButton
= new Button("Specimen type designation",
500 e
-> addNewTypeDesignationSet(TypeDesignationSetType
.SPECIMEN_TYPE_DESIGNATION_SET
, registrationEntityUuid
, typeDesignationTypeCooser
, e
.getButton()));
501 Button newNameTypeDesignationButton
= new Button("Name type designation",
502 e
-> addNewTypeDesignationSet(TypeDesignationSetType
.NAME_TYPE_DESIGNATION_SET
, registrationEntityUuid
, typeDesignationTypeCooser
, e
.getButton()));
504 VerticalLayout layout
= new VerticalLayout(label
, newSpecimenTypeDesignationButton
, newNameTypeDesignationButton
);
505 layout
.setMargin(true);
506 layout
.setSpacing(true);
507 layout
.setComponentAlignment(newSpecimenTypeDesignationButton
, Alignment
.MIDDLE_CENTER
);
508 layout
.setComponentAlignment(newNameTypeDesignationButton
, Alignment
.MIDDLE_CENTER
);
509 typeDesignationTypeCooser
.setContent(layout
);
510 UI
.getCurrent().addWindow(typeDesignationTypeCooser
);
513 protected void addNewTypeDesignationSet(TypeDesignationSetType newWorkingsetType
, UUID registrationEntityUuid
, Window typeDesignationTypeCooser
, Button sourceButton
) {
514 UI
.getCurrent().removeWindow(typeDesignationTypeCooser
);
515 EntityReference typifiedNameRef
= typifiedNamesMap
.get(registrationEntityUuid
);
516 getViewEventBus().publish(this, new TypeDesignationSetEditorAction(
518 registrationEntityUuid
,
519 typifiedNameRef
.getUuid(),
527 public void openReferenceEditor(UUID referenceUuid
) {
528 // TODO Auto-generated method stub
532 public void openNameEditor(UUID nameUuid
) {
533 // TODO Auto-generated method stub
537 protected String
getHeaderText() {
542 public void setHeaderText(String text
) {
543 this.headerText
= text
;
547 public String
getSubheaderText() {
548 return subheaderText
;
552 public void setSubheaderText(String text
) {
553 subheaderText
= text
;
558 protected String
getSubHeaderText() {
559 return subheaderText
;
563 public void openDetailsPopup(String caption
, List
<String
> messages
) {
564 StringBuffer sb
= new StringBuffer();
565 sb
.append("<div class=\"details-popup-content\">");
566 messages
.forEach(s
-> sb
.append(s
).append("</br>"));
568 new Notification(caption
, sb
.toString(), Notification
.Type
.HUMANIZED_MESSAGE
, true).show(Page
.getCurrent());
572 public boolean allowAnonymousAccess() {
577 public Collection
<Collection
<GrantedAuthority
>> allowedGrantedAuthorities() {
582 public String
getAccessDeniedMessage() {
583 return accessDeniedMessage
;
587 public void setAccessDeniedMessage(String accessDeniedMessage
) {
588 this.accessDeniedMessage
= accessDeniedMessage
;
592 * @return the addNewNameRegistrationButton
595 public Button
getAddNewNameRegistrationButton() {
596 return addNewNameRegistrationButton
;
600 public Button
getAddExistingNameRegistrationButton() {
601 return addExistingNameButton
;
605 public LazyComboBox
<TaxonName
> getExistingNameCombobox() {
606 return existingNameCombobox
;
610 public UUID
getCitationUuid() {
615 public Map
<UUID
, RegistrationDetailsItem
> getRegistrationItemMap(){
616 return Collections
.unmodifiableMap(registrationItemMap
);
620 * @param statusFieldInstantiator the statusFieldInstantiator to set
623 public void setStatusComponentInstantiator(RegistrationStatusFieldInstantiator statusComponentInstantiator
) {
624 this.statusFieldInstantiator
= statusComponentInstantiator
;