X-Git-Url: https://dev.e-taxonomy.eu/gitweb/taxeditor.git/blobdiff_plain/b04ed1c348548b60ece8c5b597fbf2b770a3f964..3915821a57f59fed53c4fe969253b24671ff9010:/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/selection/EntitySelectionElement.java diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/selection/EntitySelectionElement.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/selection/EntitySelectionElement.java index b7555cf7b..6f87d5e63 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/selection/EntitySelectionElement.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/selection/EntitySelectionElement.java @@ -3,35 +3,72 @@ */ package eu.etaxonomy.taxeditor.ui.selection; +import java.util.EnumSet; +import java.util.Observable; +import java.util.Observer; + import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; import org.springframework.security.core.GrantedAuthority; import eu.etaxonomy.cdm.api.conversation.ConversationHolder; +import eu.etaxonomy.cdm.api.conversation.IConversationEnabled; +import eu.etaxonomy.cdm.api.service.IAgentService; +import eu.etaxonomy.cdm.api.service.ICollectionService; +import eu.etaxonomy.cdm.api.service.INameService; +import eu.etaxonomy.cdm.api.service.IOccurrenceService; +import eu.etaxonomy.cdm.api.service.IReferenceService; +import eu.etaxonomy.cdm.api.service.IService; +import eu.etaxonomy.cdm.api.service.IUserService; +import eu.etaxonomy.cdm.api.service.molecular.IAmplificationService; +import eu.etaxonomy.cdm.api.service.molecular.IPrimerService; import eu.etaxonomy.cdm.common.CdmUtils; +import eu.etaxonomy.cdm.model.agent.Institution; +import eu.etaxonomy.cdm.model.agent.Person; +import eu.etaxonomy.cdm.model.agent.Team; +import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.cdm.model.common.Group; import eu.etaxonomy.cdm.model.common.ICdmBase; import eu.etaxonomy.cdm.model.common.IIdentifiableEntity; +import eu.etaxonomy.cdm.model.common.User; +import eu.etaxonomy.cdm.model.molecular.Amplification; +import eu.etaxonomy.cdm.model.molecular.Primer; +import eu.etaxonomy.cdm.model.name.NonViralName; +import eu.etaxonomy.cdm.model.occurrence.Collection; +import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase; +import eu.etaxonomy.cdm.model.reference.Reference; import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap; +import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD; +import eu.etaxonomy.taxeditor.model.AbstractUtility; import eu.etaxonomy.taxeditor.model.ImageResources; +import eu.etaxonomy.taxeditor.model.MessagingUtils; import eu.etaxonomy.taxeditor.preference.Resources; +import eu.etaxonomy.taxeditor.store.CdmStore; +import eu.etaxonomy.taxeditor.store.LoginManager; import eu.etaxonomy.taxeditor.store.StoreUtil; -import eu.etaxonomy.taxeditor.ui.campanula.compatibility.ICdmFormElement; -import eu.etaxonomy.taxeditor.ui.campanula.compatibility.IEntitySelectionElement; import eu.etaxonomy.taxeditor.ui.dialog.selection.SelectionDialogFactory; import eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement; import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory; import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent; +import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement; +import eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement; +import eu.etaxonomy.taxeditor.ui.element.IEntityElement; +import eu.etaxonomy.taxeditor.ui.element.ILabeledElement; +import eu.etaxonomy.taxeditor.ui.element.ISelectableElement; import eu.etaxonomy.taxeditor.ui.element.LayoutConstants; import eu.etaxonomy.taxeditor.ui.element.SelectionArbitrator; +import eu.etaxonomy.taxeditor.ui.section.grantedAuthority.GrantedAuthorityLabelTextProvider; /** *

@@ -44,7 +81,11 @@ import eu.etaxonomy.taxeditor.ui.element.SelectionArbitrator; * @param */ public class EntitySelectionElement extends - AbstractCdmFormElement implements IEntitySelectionElement{ + AbstractCdmFormElement implements SelectionListener, IEnableableFormElement, ISelectableElement, IEntityElement, ILabeledElement, IConversationEnabled, Observer { + + private static final EnumSet UPDATE = EnumSet.of(CRUD.UPDATE); + private static final EnumSet DELETE = EnumSet.of(CRUD.DELETE); + private static final EnumSet CREATE = EnumSet.of(CRUD.CREATE); /** * Bitmask for configuring functionality of selection element @@ -58,7 +99,7 @@ public class EntitySelectionElement extends protected T entity; protected Label label; - protected Label text; + protected Text text; protected Button button_selection; private SelectionArbitrator selectionArbitrator; @@ -115,7 +156,7 @@ public class EntitySelectionElement extends this.isDeletable = (mode & DELETABLE) == DELETABLE; boolean isSelectable = (mode & SELECTABLE) == SELECTABLE; - this.labelString = labelString; + this.labelString = (labelString == null || labelString.equals("")) ? "" : labelString + " : "; this.conversation = conversation; @@ -137,7 +178,7 @@ public class EntitySelectionElement extends private void createControls(Composite parent, int style) { - label = formFactory.createLabel(getLayoutComposite(), labelString + " : ", + label = formFactory.createLabel(getLayoutComposite(), labelString, SWT.NULL); addControl(label); @@ -157,7 +198,8 @@ public class EntitySelectionElement extends addControl(selectableComposite); - text = formFactory.createLabel(selectableComposite, null, SWT.WRAP); + text = formFactory.createText(selectableComposite, null, SWT.WRAP); + text.setEditable(false); addControl(text); text.setLayoutData(LayoutConstants.FILL_HORIZONTALLY()); @@ -196,7 +238,7 @@ public class EntitySelectionElement extends @Override public void widgetSelected(SelectionEvent e) { - T selection = SelectionDialogFactory.getSelectionFromDialog(clazz, getShell(), getConversationHolder(), getEntity()); + T selection = SelectionDialogFactory.getSelectionFromDialog(clazz, getShell(), getConversationHolder(), getEntity(), getParentElement()); setSelectionInternal(selection); } @@ -220,10 +262,18 @@ public class EntitySelectionElement extends public void setEnabled(boolean enabled) { button_selection.setEnabled(enabled); if (isEditable) { - button_edit.setEnabled(enabled && entity != null); + updateButtonStates(); } } + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#isEnabled() + */ + @Override + public boolean isEnabled() { + return button_selection.isEnabled(); + } + /** *

* setSelectionInternal @@ -257,16 +307,12 @@ public class EntitySelectionElement extends */ protected void updateElement() { String title = CdmUtils.Nz(getTitle()); - // we have to duplicate ampersands otherwise they are treated as - // mnenomic (see Label.setText() documentation) - title = title.replace("&", "&&"); text.setText(title); // title can be null if (isEditable) { - button_edit.setEnabled(entity != null); + updateButtonStates(); } } - @Override public void updateFromWizard() { updateElement(); firePropertyChangeEvent(new CdmPropertyChangeEvent(this, null)); @@ -286,8 +332,15 @@ public class EntitySelectionElement extends } else if(entity instanceof Group){ return ((Group) entity).getName(); } else if(entity instanceof GrantedAuthority){ - return ((GrantedAuthority) entity).getAuthority(); - } + return GrantedAuthorityLabelTextProvider.getText(((GrantedAuthority) entity)); + } else if(entity instanceof User){ + return ((User) entity).getUsername(); + } else if (entity instanceof Primer){ + return ((Primer) entity).getLabel(); + } else if (entity instanceof Amplification){ + return ((Amplification) entity).getLabelCache(); + } + } return ""; } @@ -339,7 +392,6 @@ public class EntitySelectionElement extends * * @return a {@link org.eclipse.swt.widgets.Shell} object. */ - @Override public Shell getShell() { return getLayoutComposite().getShell(); } @@ -372,7 +424,9 @@ public class EntitySelectionElement extends private class EditListener extends SelectionAdapter { - private final EntitySelectionElement selectionElement; + private static final String TRANSIENT_EDITING_WARNING_TEXT = "Warning: All changes for this element are directly reflected in the data base.\nThe \"Cancel\" button has no effect"; + private static final String TRANSIENT_EDITING_WARNING_TITLE = "CDM element not yet saved."; + private final EntitySelectionElement selectionElement; public EditListener(EntitySelectionElement selectionElement) { this.selectionElement = selectionElement; @@ -381,11 +435,80 @@ public class EntitySelectionElement extends /** {@inheritDoc} */ @Override public void widgetSelected(SelectionEvent e) { + T originalEntity = selectionElement.getEntity(); + T clonedEntity = null; + IService service = null; + if(originalEntity instanceof CdmBase){ + //get corresponding service + if(entity instanceof Reference){ + service = (IService) CdmStore.getService(IReferenceService.class); + } + else if (entity instanceof Team || entity instanceof Person || entity instanceof Institution) { + service = (IService) CdmStore.getService(IAgentService.class); + } + else if (entity instanceof NonViralName) { + service = (IService) CdmStore.getService(INameService.class); + } + else if (entity instanceof SpecimenOrObservationBase) { + service = (IService) CdmStore.getService(IOccurrenceService.class); + } + else if (entity instanceof Collection) { + service = (IService) CdmStore.getService(ICollectionService.class); + } + else if (entity instanceof User) { + service = (IService) CdmStore.getService(IUserService.class); + } + else if (entity instanceof Primer) { + service = (IService) CdmStore.getService(IPrimerService.class); + } + else if (entity instanceof Amplification) { + service = (IService) CdmStore.getService(IAmplificationService.class); + } + //check if original already exists in data base. If not then do not clone and all changes will be persisted directly -> Warning to user. + if(service !=null && service.find(originalEntity.getUuid())==null && originalEntity.getId() != 0){ + if(MessagingUtils.confirmDialog(TRANSIENT_EDITING_WARNING_TITLE, "["+originalEntity.getClass().getSimpleName()+"]"+originalEntity + " has to be saved before it can be edited. Save now?")){ + service.save(originalEntity); + AbstractUtility.getActiveEditor().doSave(new NullProgressMonitor()); + } + else{ + //transient CDM elements should not be edited to avoid merge conflicts + // when the elements are cascaded + return; + } + } + else{ + //FIXME temporarily disabled cloning re-opening bug #2645 (EditFromSelectionWizard persists data even when canceled) +// try { +// //clone original +// clonedEntity = (T) ((CdmBase) originalEntity).clone(); +// } catch (CloneNotSupportedException e1) { +// MessagingUtils.warningDialog(TRANSIENT_EDITING_WARNING_TITLE, this, TRANSIENT_EDITING_WARNING_TEXT); +// } + } + + } + if(clonedEntity!=null){ + selectionElement.setEntity(clonedEntity); + } WizardDialog dialog = new WizardDialog(selectionElement.getShell(), new EditFromSelectionWizard(selectionElement)); if (dialog.open() == IStatus.OK) { + if(service!=null && clonedEntity!=null){//check if cloning happened + T editedClonedEntity = selectionElement.getEntity(); + editedClonedEntity.setId(originalEntity.getId()); + editedClonedEntity.setUuid(originalEntity.getUuid()); + + //merge clone and original + service.merge(editedClonedEntity); + originalEntity = service.load(originalEntity.getUuid()); + + } + selectionElement.setEntity(originalEntity); selectionElement.updateFromWizard(); } + //be sure to reset to original in all cases + selectionElement.setEntity(originalEntity); + selectionElement.refresh(); } } @@ -411,7 +534,9 @@ public class EntitySelectionElement extends /** {@inheritDoc} */ @Override public void setBackground(Color color) { - label.setBackground(color); + if(!label.isDisposed()){ + label.setBackground(color); + } } /** {@inheritDoc} */ @@ -441,4 +566,27 @@ public class EntitySelectionElement extends @Override public void update(CdmDataChangeMap changeEvents) { } + + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement#removeElements() + */ + @Override + public void removeElements(){ + super.removeElements(); + LoginManager loginManager = CdmStore.getLoginManager(); + loginManager.addObserver(this); + } + + @Override + public void update(Observable o, Object arg) { + if(o instanceof LoginManager){ + updateButtonStates(); + } + } + + private void updateButtonStates() { + if(button_edit != null && !button_selection.isDisposed()){ + button_edit.setEnabled(isEditable && button_selection.isEnabled() && getEntity() != null && CdmStore.currentAuthentiationHasPermission((CdmBase) getEntity(), UPDATE)); + } + } }