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 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.ui.section.grantedAuthority.GrantedAuthorityLabelTextProvider;
/**
- * <p>
- * Abstract AbstractSelectionElement class.
- * </p>
- *
* @author n.hoffmann
* @created Nov 17, 2009
* @version 1.0
* @param <T>
*/
-public class EntitySelectionElement<T extends ICdmBase> extends
- AbstractCdmFormElement implements SelectionListener, IEnableableFormElement, ISelectableElement, IEntityElement<T>, ILabeledElement, IConversationEnabled, Observer {
+public class EntitySelectionElement<T extends CdmBase> extends
+ AbstractCdmFormElement implements SelectionListener, IEnableableFormElement, ISelectableElement, IEntityElement<T>, ILabeledElement, //IConversationEnabled,
+ Observer {
private static final EnumSet<CRUD> UPDATE = EnumSet.of(CRUD.UPDATE);
private static final EnumSet<CRUD> DELETE = EnumSet.of(CRUD.DELETE);
/**
* Bitmask for configuring functionality of selection element
*/
- public static final int NOTHING = 0; // 000
- public static final int EDITABLE = 1 << 0; // 001
- public static final int DELETABLE = 1 << 1; // 010
- public static final int SELECTABLE = 1 << 2; // 100
- public static final int ALL = EDITABLE | DELETABLE | SELECTABLE; // 111
-
+ public static final int NOTHING = 0; // 0000
+ public static final int EDITABLE = 1 << 0; // 0001
+ public static final int DELETABLE = 1 << 1; // 0010
+ public static final int SELECTABLE = 1 << 2; // 0100
+ public static final int EXTERNAL = 1 << 3; // 1000
+ public static final int ALL = EDITABLE | DELETABLE | SELECTABLE ; // 0111
+ public static final int ALL_WITH_EXT = EDITABLE | DELETABLE | SELECTABLE | EXTERNAL ; // 1111
protected T entity;
+ protected T filteredEntity;
protected Label label;
protected Text text;
protected Button button_selection;
+ protected Button button_selectionExt;
+
private SelectionArbitrator selectionArbitrator;
protected Button button_edit;
private final boolean isEditable;
private final boolean isDeletable;
+ private final boolean isExternal;
- private final ConversationHolder conversation;
+// private final ConversationHolder conversation;
private Class<T> clazz;
- /**
- * <p>
- * Constructor for AbstractSelectionElement.
- * </p>
- *
- * @param formFactory
- * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
- * object.
- * @param conversation
- * TODO
- * @param parentElement
- * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
- * object.
- * @param labelString
- * a {@link java.lang.String} object.
- * @param entity
- * a T object.
- * @param isEditable
- * a boolean.
- * @param isSelectable
- * a boolean.
- * @param isDeletable
- * a boolean.
- * @param style
- * a int.
- * @param <T>
- * a T object.
- */
public EntitySelectionElement(CdmFormFactory formFactory,
- ConversationHolder conversation, ICdmFormElement parentElement,
- String labelString, T entity, int mode, int style) {
+// ConversationHolder conversation,
+ ICdmFormElement parentElement, Class<T> clazz,
+ String labelString, T entity, int mode, int style, boolean filterElement) {
super(formFactory, parentElement);
+ this.clazz = clazz;
this.isEditable = (mode & EDITABLE) == EDITABLE;
this.isDeletable = (mode & DELETABLE) == DELETABLE;
+ this.isExternal= (mode & EXTERNAL) == EXTERNAL;
boolean isSelectable = (mode & SELECTABLE) == SELECTABLE;
- this.labelString = (labelString == null || labelString.equals("")) ? "" : labelString + " : ";
+ this.labelString = (labelString == null || labelString.equals("")) ? "" : labelString;
- this.conversation = conversation;
+// this.conversation = conversation;
if (isSelectable && formFactory.getSelectionProvider() != null) {
selectionArbitrator = formFactory.createSelectionArbitrator(this);
}
createControls(getLayoutComposite(), SWT.NULL);
-
- setEntity(entity);
+ if (filterElement){
+ setFilteredEntity(entity);
+ }else{
+ setEntity(entity);
+ }
}
- public EntitySelectionElement(CdmFormFactory formFactory,
- ConversationHolder conversation, ICdmFormElement parentElement, Class<T> clazz,
- String labelString, T entity, int mode, int style) {
- this(formFactory, conversation, parentElement, labelString, entity, mode, style);
- this.clazz = clazz;
- }
+ private void setFilteredEntity(T filterEntity) {
+ this.filteredEntity =filterEntity;
+
+ }
+
+ public EntitySelectionElement(CdmFormFactory formFactory,//ConversationHolder conversation,
+ ICdmFormElement parentElement, Class<T> clazz,
+ String labelString, T entity, int mode, int style){
+ this(formFactory, //conversation,
+ parentElement, clazz, labelString, entity, mode, style, false);
+ }
private void createControls(Composite parent, int style) {
if (isDeletable) {
columns += 1;
}
+ if (isExternal) {
+ columns += 1;
+ }
selectableComposite.setLayout(LayoutConstants.LAYOUT(columns, false));
selectableComposite.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());
addControl(button_selection);
button_selection.addSelectionListener(this);
-
+ if (isExternal){
+ button_selectionExt = formFactory.createButton(selectableComposite, null,
+ SWT.PUSH);
+ button_selectionExt.setImage(ImageResources
+ .getImage(ImageResources.BROWSE_ICON));
+ button_selectionExt.setToolTipText("Browse existing from external cdm store");
+ button_selectionExt.setText("Ext");
+ addControl(button_selectionExt);
+ button_selectionExt.addSelectionListener(this);
+ }
if (isEditable) {
button_edit = formFactory.createButton(selectableComposite, null,
SWT.PUSH);
@Override
public void widgetSelected(SelectionEvent e) {
- T selection = SelectionDialogFactory.getSelectionFromDialog(clazz, getShell(), getConversationHolder(), getEntity());
- setSelectionInternal(selection);
+ if (e.getSource().equals(button_selection) ){
+ T selection = SelectionDialogFactory.getSelectionFromDialog(clazz, getShell(), //getConversationHolder(),
+ getFilteredEntity(), getParentElement());
+ setSelectionInternal(selection);
+ }else{
+ Reference selection = SelectionDialogFactory.getSelectionFromExtDialog(Reference.class, getShell(),//null,
+ getParentElement());
+ setSelectionInternal((T)selection);
+ }
+
}
/**
+ * @return
+ */
+ public T getFilteredEntity() {
+
+ return this.filteredEntity;
+ }
+
+ /**
* Return the selected object
*
* @return a T object.
/** {@inheritDoc} */
@Override
public void setEnabled(boolean enabled) {
+
button_selection.setEnabled(enabled);
+ if (isDeletable){
+ button_remove.setEnabled(enabled);
+ }
if (isEditable) {
updateButtonStates();
}
+
}
/* (non-Javadoc)
*/
protected String getTitle() {
if (entity != null){
- if(entity instanceof IIdentifiableEntity) {
- return ((IIdentifiableEntity) entity).getTitleCache();
- } else if(entity instanceof Group){
+ if(entity instanceof Group){
return ((Group) entity).getName();
} else if(entity instanceof GrantedAuthority){
return GrantedAuthorityLabelTextProvider.getText(((GrantedAuthority) entity));
} else if (entity instanceof Amplification){
return ((Amplification) entity).getLabelCache();
}
+ else if(entity instanceof IIdentifiableEntity) {
+ return ((IIdentifiableEntity) entity).getTitleCache();
+ }
}
return "";
private class EditListener extends SelectionAdapter {
- 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<T> selectionElement;
public EditListener(EntitySelectionElement<T> selectionElement) {
/** {@inheritDoc} */
@Override
public void widgetSelected(SelectionEvent e) {
- T originalEntity = selectionElement.getEntity();
- T clonedEntity = null;
- IService<T> service = null;
- if(originalEntity instanceof CdmBase){
- //get corresponding service
- if(entity instanceof Reference<?>){
- service = (IService<T>) CdmStore.getService(IReferenceService.class);
- }
- else if (entity instanceof Team || entity instanceof Person || entity instanceof Institution) {
- service = (IService<T>) CdmStore.getService(IAgentService.class);
- }
- else if (entity instanceof NonViralName) {
- service = (IService<T>) CdmStore.getService(INameService.class);
- }
- else if (entity instanceof SpecimenOrObservationBase) {
- service = (IService<T>) CdmStore.getService(IOccurrenceService.class);
- }
- else if (entity instanceof Collection) {
- service = (IService<T>) CdmStore.getService(ICollectionService.class);
- }
- else if (entity instanceof User) {
- service = (IService<T>) CdmStore.getService(IUserService.class);
- }
- else if (entity instanceof Primer) {
- service = (IService<T>) CdmStore.getService(IPrimerService.class);
- }
- else if (entity instanceof Amplification) {
- service = (IService<T>) 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){
- 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{
- 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();
+ //if the edited entity has already been persisted
+ //but the transient entity is still set in this
+ //EntitySelectionElement, re-load it and set it
+ IService<T> service = CdmStore.getService(entity);
+ if(entity.getId()==0){
+ T loadedEntity = service.load(entity.getUuid());
+ if(loadedEntity!=null){
+ setEntity(loadedEntity);
+ }
+ }
}
- //be sure to reset to original in all cases
- selectionElement.setEntity(originalEntity);
}
}
* @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
* object.
*/
- @Override
+// @Override
public ConversationHolder getConversationHolder() {
- return conversation;
+ if(getParentElement() instanceof IConversationEnabled) {
+ return ((IConversationEnabled)getParentElement()).getConversationHolder();
+ }
+ return null;
}
/** {@inheritDoc} */
}
/** {@inheritDoc} */
- @Override
- public void update(CdmDataChangeMap changeEvents) {
- }
+// @Override
+// public void update(CdmDataChangeMap changeEvents) {
+// }
/* (non-Javadoc)
* @see eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement#removeElements()
private void updateButtonStates() {
if(button_edit != null && !button_selection.isDisposed()){
- button_edit.setEnabled(isEditable && button_selection.isEnabled() && getEntity() != null && CdmStore.currentAuthentiationHasPermission((CdmBase) getEntity(), UPDATE));
+ button_edit.setEnabled(isEditable && button_selection.isEnabled() && getEntity() != null && CdmStore.currentAuthentiationHasPermission(getEntity(), UPDATE));
}
}
}