package edu.ualberta.med.biobank.widgets; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.ui.forms.widgets.FormToolkit; import edu.ualberta.med.biobank.SessionManager; import edu.ualberta.med.biobank.common.wrappers.ContainerWrapper; import edu.ualberta.med.biobank.common.wrappers.SiteWrapper; import edu.ualberta.med.biobank.common.wrappers.helpers.SiteQuery; import edu.ualberta.med.biobank.gui.common.BgcPlugin; import edu.ualberta.med.biobank.server.applicationservice.BiobankApplicationService; import edu.ualberta.med.biobank.widgets.utils.GuiUtil; public class TopContainerListWidget { private SelectionListener listener; private class NameFilter extends ViewerFilter { @Override public boolean select(Viewer viewer, Object top, Object child) { if (filterText.equals("")) //$NON-NLS-1$ return true; return filterText.startsWith(((ContainerWrapper) child).getLabel()); } } private ComboViewer siteCombo; private ListViewer topContainers; private String filterText; private Boolean enabled; private List<SiteWrapper> sites; @SuppressWarnings("unchecked") public TopContainerListWidget(final Composite parent, FormToolkit toolkit) { filterText = ""; //$NON-NLS-1$ enabled = true; toolkit.createLabel(parent, Messages.TopContainerListWidget_site_label); final BiobankApplicationService appService = SessionManager .getAppService(); siteCombo = new ComboViewer(parent, SWT.NONE); siteCombo.setLabelProvider(new BiobankLabelProvider() { @Override public String getText(Object e) { return ((SiteWrapper) e).getNameShort(); } }); siteCombo.setContentProvider(new ArrayContentProvider()); try { sites = SiteQuery.getSites(appService); SiteWrapper allsites = new SiteWrapper(appService); allsites.setNameShort(Messages.TopContainerListWidget_all_label); sites.add(allsites); siteCombo.setInput(sites); GuiUtil.reset(siteCombo, sites.get(0)); } catch (Exception e1) { BgcPlugin.openAsyncError( Messages.TopContainerListWidget_load_error_title, e1); } siteCombo.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { if (siteCombo.getSelection() != null) { List<ContainerWrapper> containers = new ArrayList<ContainerWrapper>(); try { SiteWrapper s = (SiteWrapper) ((IStructuredSelection) siteCombo .getSelection()).getFirstElement(); if (s != null) { if (s.getNameShort().equals( Messages.TopContainerListWidget_all_label)) { List<SiteWrapper> sites = SiteQuery .getSites(appService); for (SiteWrapper site : sites) { containers.addAll(site .getTopContainerCollection()); } } else { containers.addAll(s.getTopContainerCollection()); } } } catch (Exception e) { BgcPlugin .openAsyncError( Messages.TopContainerListWidget_retrieve_error_title, e); } topContainers.setInput(containers); filterBy(filterText); parent.getShell().layout(true, true); } } }); siteCombo.getCombo().setLayoutData( new GridData(SWT.FILL, SWT.FILL, true, true)); toolkit.createLabel(parent, Messages.TopContainerListWidget_topContainers_label); topContainers = new ListViewer(parent, SWT.MULTI | SWT.BORDER); topContainers.setLabelProvider(new LabelProvider() { @Override public String getText(Object element) { return ((ContainerWrapper) element).getLabel() + "(" //$NON-NLS-1$ + ((ContainerWrapper) element).getContainerType() .getNameShort() + ") (" //$NON-NLS-1$ + ((ContainerWrapper) element).getSite().getNameShort() + ")"; //$NON-NLS-1$ } }); topContainers.setContentProvider(new ArrayContentProvider()); topContainers.getList().setLayoutData( new GridData(SWT.FILL, SWT.FILL, true, true)); siteCombo.setSelection(new StructuredSelection( ((List<SiteWrapper>) siteCombo.getInput()).get(0))); } public List<Integer> getSelectedContainerIds() { List<Integer> containerList = new ArrayList<Integer>(); IStructuredSelection selections = (IStructuredSelection) topContainers .getSelection(); Iterator<?> it = selections.iterator(); while (it.hasNext()) { containerList.add(((ContainerWrapper) it.next()).getId()); } if (containerList.size() == 0) { Iterator<?> it2 = ((List<?>) topContainers.getInput()).iterator(); while (it2.hasNext()) { containerList.add(((ContainerWrapper) it2.next()).getId()); } } return containerList; } public void filterBy(String text) { filterText = text; topContainers.addFilter(new NameFilter()); topContainers.setSelection(null); if (topContainers.getList().getItemCount() != 0) { setEnabled(true); } else setEnabled(false); } public void setEnabled(boolean b) { enabled = b; topContainers.getList().setEnabled(b); if (!b) topContainers.setSelection(null); notifyListeners(); } private void notifyListeners() { if (listener != null) { Event e1 = new Event(); e1.widget = siteCombo.getCombo(); SelectionEvent e = new SelectionEvent(e1); listener.widgetSelected(e); } } public boolean getEnabled() { return enabled; } public void addSelectionChangedListener(SelectionListener l) { listener = l; } public List<String> getSelectedContainerNames() { List<String> containerList = new ArrayList<String>(); IStructuredSelection selections = (IStructuredSelection) topContainers .getSelection(); Iterator<?> it = selections.iterator(); while (it.hasNext()) { ContainerWrapper c = (ContainerWrapper) it.next(); containerList.add(c.getFullInfoLabel()); } if (containerList.size() == 0) { Iterator<?> it2 = ((List<?>) topContainers.getInput()).iterator(); while (it2.hasNext()) { containerList.add(((ContainerWrapper) it2.next()) .getFullInfoLabel()); } } return containerList; } public void reset() { topContainers.setSelection(null); GuiUtil.reset(siteCombo, sites.get(0)); } }