package edu.ualberta.med.biobank.widgets.trees;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.PlatformUI;
import edu.ualberta.med.biobank.SessionManager;
import edu.ualberta.med.biobank.common.util.DispatchSpecimenState;
import edu.ualberta.med.biobank.common.wrappers.CommentWrapper;
import edu.ualberta.med.biobank.common.wrappers.DispatchSpecimenWrapper;
import edu.ualberta.med.biobank.common.wrappers.DispatchWrapper;
import edu.ualberta.med.biobank.dialogs.dispatch.ModifyStateDispatchDialog;
import edu.ualberta.med.biobank.forms.utils.DispatchTableGroup;
import edu.ualberta.med.biobank.forms.utils.TableGroup;
import edu.ualberta.med.biobank.gui.common.widgets.BgcBaseWidget;
import edu.ualberta.med.biobank.gui.common.widgets.BgcLabelProvider;
import edu.ualberta.med.biobank.gui.common.widgets.utils.BgcClipboard;
import edu.ualberta.med.biobank.treeview.AbstractAdapterBase;
import edu.ualberta.med.biobank.treeview.Node;
import edu.ualberta.med.biobank.treeview.TreeItemAdapter;
import edu.ualberta.med.biobank.treeview.request.RequestContainerAdapter;
import edu.ualberta.med.biobank.treeview.util.AdapterFactory;
public class DispatchSpecimensTreeTable extends BgcBaseWidget {
private TreeViewer tv;
private DispatchWrapper shipment;
protected List<DispatchTableGroup> groups;
private MenuItem editItem;
private Menu menu;
public DispatchSpecimensTreeTable(Composite parent,
final DispatchWrapper shipment,
final boolean editSpecimensState) {
super(parent, SWT.NONE);
this.shipment = shipment;
setLayout(new FillLayout());
GridData gd = new GridData();
gd.horizontalAlignment = SWT.FILL;
gd.grabExcessHorizontalSpace = true;
gd.heightHint = 400;
setLayoutData(gd);
tv = new TreeViewer(this, SWT.MULTI | SWT.BORDER);
Tree tree = tv.getTree();
tree.setHeaderVisible(true);
tree.setLinesVisible(true);
TreeColumn tc = new TreeColumn(tree, SWT.LEFT);
tc.setText(Messages.DispatchSpecimensTreeTable_inventoryid_label);
tc.setWidth(200);
tc = new TreeColumn(tree, SWT.LEFT);
tc.setText(Messages.DispatchSpecimensTreeTable_type_label);
tc.setWidth(100);
tc = new TreeColumn(tree, SWT.LEFT);
tc.setText(Messages.DispatchSpecimensTreeTable_pnumber_label);
tc.setWidth(120);
tc = new TreeColumn(tree, SWT.LEFT);
tc.setText(Messages.DispatchSpecimensTreeTable_status_label);
tc.setWidth(120);
tc = new TreeColumn(tree, SWT.LEFT);
tc.setText(Messages.DispatchSpecimensTreeTable_comment_label);
tc.setWidth(100);
menu = new Menu(parent);
tv.getTree().setMenu(menu);
ITreeContentProvider contentProvider = new ITreeContentProvider() {
@Override
public void dispose() {
//
}
@Override
public void inputChanged(Viewer viewer, Object oldInput,
Object newInput) {
if (newInput != null)
groups =
DispatchTableGroup
.getGroupsForShipment(
DispatchSpecimensTreeTable.this.shipment);
}
@Override
public Object[] getElements(Object inputElement) {
return groups.toArray();
}
@Override
public Object[] getChildren(Object parentElement) {
return ((Node) parentElement).getChildren().toArray();
}
@Override
public Object getParent(Object element) {
return ((Node) element).getParent();
}
@Override
public boolean hasChildren(Object element) {
return ((Node) element).getChildren().size() != 0;
}
};
tv.setContentProvider(contentProvider);
final BgcLabelProvider labelProvider = new BgcLabelProvider() {
@Override
public String getColumnText(Object element, int columnIndex) {
if (element instanceof TableGroup) {
if (columnIndex == 0)
return ((TableGroup<?>) element).getTitle();
return ""; //$NON-NLS-1$
} else if (element instanceof RequestContainerAdapter) {
if (columnIndex == 0)
return ((RequestContainerAdapter) element)
.getLabelInternal();
return ""; //$NON-NLS-1$
} else if (element instanceof TreeItemAdapter) {
if (columnIndex == 4)
return CommentWrapper
.commentListToString(((DispatchSpecimenWrapper) ((TreeItemAdapter) element)
.getSpecimen()).getCommentCollection(false));
return ((TreeItemAdapter) element)
.getColumnText(columnIndex);
}
return ""; //$NON-NLS-1$
}
@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
};
tv.setLabelProvider(labelProvider);
tv.setInput("root"); //$NON-NLS-1$
menu.addListener(SWT.Show, new Listener() {
@Override
public void handleEvent(Event event) {
DispatchSpecimenWrapper dsa = getSelectedSpecimen();
if (dsa != null) {
for (MenuItem menuItem : menu.getItems()) {
if (!menuItem.equals(editItem))
menuItem.dispose();
}
BgcClipboard
.addClipboardCopySupport(tv, menu, labelProvider, 5);
if (editSpecimensState) {
if (
DispatchSpecimenState.getState(dsa.getState()) == DispatchSpecimenState.NONE)
addSetMissingMenu(menu);
addModifyCommentMenu(menu);
if (DispatchSpecimenState.getState(dsa.getState()) != DispatchSpecimenState.NONE)
addDeleteExtraMenu(menu);
}
}
}
});
}
protected DispatchSpecimenWrapper getSelectedSpecimen() {
IStructuredSelection selection = (IStructuredSelection) tv
.getSelection();
if (selection != null && selection.size() > 0
&& selection.getFirstElement() instanceof TreeItemAdapter) {
return (DispatchSpecimenWrapper) ((TreeItemAdapter) selection
.getFirstElement()).getSpecimen();
}
return null;
}
protected void addModifyCommentMenu(Menu menu) {
MenuItem item;
item = new MenuItem(menu, SWT.PUSH);
item.setText(Messages.DispatchSpecimensTreeTable_modidy_comment_label);
item.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
modifyCommentAndState((IStructuredSelection) tv.getSelection(),
null);
}
});
}
private void addSetMissingMenu(final Menu menu) {
MenuItem item;
item = new MenuItem(menu, SWT.PUSH);
item.setText(Messages.DispatchSpecimensTreeTable_set_missing_label);
item.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
modifyCommentAndState((IStructuredSelection) tv.getSelection(),
DispatchSpecimenState.MISSING);
}
});
}
private void addDeleteExtraMenu(final Menu menu) {
MenuItem item;
item = new MenuItem(menu, SWT.PUSH);
item.setText(Messages.DispatchSpecimensTreeTable_delete_label);
item.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
DispatchSpecimensTreeTable.this.shipment.removeDispatchSpecimens(Arrays
.asList((DispatchSpecimenWrapper) ((TreeItemAdapter) ((IStructuredSelection) tv
.getSelection())
.getFirstElement())
.getSpecimen()));
notifyListeners();
tv.refresh();
}
});
}
private void modifyCommentAndState(
IStructuredSelection iStructuredSelection,
DispatchSpecimenState newState) {
String previousComment = null;
if (iStructuredSelection.size() == 1) {
previousComment =
CommentWrapper
.commentListToString(((DispatchSpecimenWrapper) ((TreeItemAdapter) iStructuredSelection
.getFirstElement()).getSpecimen())
.getCommentCollection(false));
}
ModifyStateDispatchDialog dialog = new ModifyStateDispatchDialog(
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
previousComment, newState);
int res = dialog.open();
if (res == Dialog.OK) {
String comment = dialog.getComment();
for (Iterator<?> iter = iStructuredSelection.iterator(); iter
.hasNext();) {
DispatchSpecimenWrapper dsa =
(DispatchSpecimenWrapper) ((TreeItemAdapter) iter
.next()).getSpecimen();
CommentWrapper commentOb = new CommentWrapper(
SessionManager.getAppService());
commentOb.setCreatedAt(new Date());
commentOb.setUser(SessionManager.getUser());
commentOb.setMessage(comment);
dsa.addToCommentCollection(Arrays.asList(commentOb));
if (newState != null) {
dsa.setDispatchSpecimenState(newState);
}
}
shipment.resetMap();
notifyListeners();
tv.refresh();
}
}
public void refresh() {
tv.setInput("refresh"); //$NON-NLS-1$
}
public void addClickListener() {
tv.addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
DispatchSpecimenWrapper selection = getSelectedSpecimen();
if (selection != null) {
SessionManager.openViewForm(selection.getSpecimen());
}
}
});
editItem = new MenuItem(getMenu(), SWT.PUSH);
editItem.setText(Messages.DispatchSpecimensTreeTable_edit_label);
editItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
DispatchSpecimenWrapper selection = getSelectedSpecimen();
if (selection != null) {
AbstractAdapterBase adapter = AdapterFactory
.getAdapter(selection.getSpecimen());
adapter.openEntryForm();
}
}
});
}
@Override
public Menu getMenu() {
return menu;
}
}