package edu.ualberta.med.biobank.widgets.infotables.entry; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.PlatformUI; import edu.ualberta.med.biobank.SessionManager; import edu.ualberta.med.biobank.common.wrappers.ContactWrapper; import edu.ualberta.med.biobank.dialogs.select.ContactAddDialog; import edu.ualberta.med.biobank.gui.common.BgcPlugin; import edu.ualberta.med.biobank.gui.common.widgets.IInfoTableAddItemListener; import edu.ualberta.med.biobank.gui.common.widgets.IInfoTableDeleteItemListener; import edu.ualberta.med.biobank.gui.common.widgets.IInfoTableEditItemListener; import edu.ualberta.med.biobank.gui.common.widgets.InfoTableEvent; import edu.ualberta.med.biobank.widgets.infotables.BiobankTableSorter; import edu.ualberta.med.biobank.widgets.infotables.ContactInfoTable; public class ContactEntryInfoTable extends ContactInfoTable { private List<ContactWrapper> selectedContacts; private List<ContactWrapper> addedOrModifiedContacts; private List<ContactWrapper> deletedContacts; private List<ContactWrapper> originalContacts; public ContactEntryInfoTable(Composite parent, List<ContactWrapper> contacts) { super(parent, contacts); originalContacts = new ArrayList<ContactWrapper>(); if (contacts != null) { originalContacts.addAll(contacts); } selectedContacts = contacts; if (selectedContacts == null) { selectedContacts = new ArrayList<ContactWrapper>(); } addedOrModifiedContacts = new ArrayList<ContactWrapper>(); deletedContacts = new ArrayList<ContactWrapper>(); addAddItemListener(new IInfoTableAddItemListener<ContactWrapper>() { @Override public void addItem(InfoTableEvent<ContactWrapper> event) { addContact(); } }); addEditItemListener(new IInfoTableEditItemListener<ContactWrapper>() { @Override public void editItem(InfoTableEvent<ContactWrapper> event) { ContactWrapper contact = getSelection(); if (contact != null) addOrEditContact(false, contact); } }); addDeleteItemListener(new IInfoTableDeleteItemListener<ContactWrapper>() { @Override public void deleteItem(InfoTableEvent<ContactWrapper> event) { ContactWrapper contact = getSelection(); if (contact != null) { if (!contact.deleteAllowed()) { BgcPlugin .openError( Messages.ContactEntryInfoTable_delete_error_title, NLS.bind( Messages.ContactEntryInfoTable_delete_error_msg, contact.getName())); return; } if (!BgcPlugin .openConfirm( Messages.ContactEntryInfoTable_delete_confirm_title, NLS.bind( Messages.ContactEntryInfoTable_delete_confirm_msg, contact.getName()))) { return; } deletedContacts.add(contact); selectedContacts.remove(contact); setList(selectedContacts); notifyListeners(); } } }); } @Override protected boolean isEditMode() { return true; } private void addOrEditContact(boolean add, ContactWrapper contactWrapper) { ContactAddDialog dlg = new ContactAddDialog(PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getShell(), contactWrapper); int res = dlg.open(); if (res == Dialog.OK) { ContactWrapper contact = dlg.getContactWrapper(); if (add) { // only add to the collection when adding and not editing selectedContacts.add(contact); addedOrModifiedContacts.add(contact); } reloadCollection(selectedContacts, contact); notifyListeners(); } else if (!add && res == Dialog.CANCEL) { try { contactWrapper.reload(); } catch (Exception e) { BgcPlugin.openAsyncError( Messages.ContactEntryInfoTable_cancel_error_title, e); } reloadCollection(selectedContacts, null); } } public void addContact() { addOrEditContact(true, new ContactWrapper(SessionManager.getAppService())); } public List<ContactWrapper> getAddedOrModifedContacts() { return addedOrModifiedContacts; } public List<ContactWrapper> getDeletedContacts() { return deletedContacts; } @Override public void reload() { selectedContacts = new ArrayList<ContactWrapper>(originalContacts); addedOrModifiedContacts = new ArrayList<ContactWrapper>(); deletedContacts = new ArrayList<ContactWrapper>(); reloadCollection(selectedContacts, null); } @SuppressWarnings("serial") @Override protected BiobankTableSorter getComparator() { return new BiobankTableSorter() { @Override public int compare(Object e1, Object e2) { try { TableRowData i1 = getCollectionModelObject(e1); TableRowData i2 = getCollectionModelObject(e2); return super.compare(i1.name, i2.name); } catch (Exception e) { return 0; } } }; } }