package edu.ualberta.med.biobank.views;
import java.util.Date;
import java.util.List;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import edu.ualberta.med.biobank.SessionManager;
import edu.ualberta.med.biobank.common.formatters.DateFormatter;
import edu.ualberta.med.biobank.common.permission.processingEvent.ProcessingEventReadPermission;
import edu.ualberta.med.biobank.common.wrappers.ModelWrapper;
import edu.ualberta.med.biobank.common.wrappers.ProcessingEventWrapper;
import edu.ualberta.med.biobank.gui.common.BgcPlugin;
import edu.ualberta.med.biobank.gui.common.widgets.DateTimeWidget;
import edu.ualberta.med.biobank.treeview.AbstractAdapterBase;
import edu.ualberta.med.biobank.treeview.AdapterBase;
import edu.ualberta.med.biobank.treeview.RootNode;
import edu.ualberta.med.biobank.treeview.processing.ProcessingEventAdapter;
import edu.ualberta.med.biobank.treeview.processing.ProcessingEventGroup;
import gov.nih.nci.system.applicationservice.ApplicationException;
public class ProcessingView extends AbstractAdministrationView {
public static final String ID =
"edu.ualberta.med.biobank.views.ProcessingView"; //$NON-NLS-1$
private static ProcessingView currentInstance;
private ProcessingEventGroup processingNode;
private Button radioWorksheet;
private Composite dateComposite;
private DateTimeWidget dateWidget;
private Button radioDateProcessed;
private Button radioPatient;
public ProcessingView() {
super();
currentInstance = this;
SessionManager.addView(this);
}
private void createNodes() {
processingNode = new ProcessingEventGroup((RootNode) rootNode, 2,
Messages.ProcessingView_pevent_group_label);
processingNode.setParent(rootNode);
rootNode.addChild(processingNode);
}
@Override
protected void createTreeTextOptions(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(3, false);
layout.horizontalSpacing = 0;
layout.marginHeight = 0;
layout.verticalSpacing = 0;
composite.setLayout(layout);
radioWorksheet = new Button(composite, SWT.RADIO);
radioWorksheet.setText(Messages.ProcessingView_worksheet_label);
radioWorksheet.setSelection(true);
radioWorksheet.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (radioWorksheet.getSelection()) {
showTextOnly(true);
}
}
});
radioPatient = new Button(composite, SWT.RADIO);
radioPatient.setText(Messages.ProcessingView_patient_label);
radioPatient.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (radioPatient.getSelection()) {
showTextOnly(true);
}
}
});
radioDateProcessed = new Button(composite, SWT.RADIO);
radioDateProcessed
.setText(Messages.ProcessingView_date_processed_label);
radioDateProcessed.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (radioDateProcessed.getSelection()) {
showTextOnly(false);
}
}
});
dateComposite = new Composite(parent, SWT.NONE);
layout = new GridLayout(2, false);
layout.horizontalSpacing = 0;
layout.marginHeight = 0;
layout.verticalSpacing = 0;
dateComposite.setLayout(layout);
GridData gd = new GridData();
gd.exclude = true;
dateComposite.setLayoutData(gd);
dateWidget = new DateTimeWidget(dateComposite, SWT.DATE, new Date());
dateWidget.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
internalSearch();
}
});
Button searchButton = new Button(dateComposite, SWT.PUSH);
searchButton.setText(Messages.ProcessingView_go_button_label);
searchButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
internalSearch();
}
});
}
public static ProcessingView getCurrent() {
return currentInstance;
}
public static void reloadCurrent() {
if (currentInstance != null)
currentInstance.reload();
}
@Override
public void reload() {
if (processingNode == null) createNodes();
try {
for (AbstractAdapterBase adaper : processingNode.getChildren()) {
((AdapterBase) adaper).resetObject();
}
setSearchFieldsEnablement(SessionManager.getAppService().isAllowed(
new ProcessingEventReadPermission(SessionManager
.getUser()
.getCurrentWorkingCenter().getWrappedObject())));
} catch (Exception e) {
BgcPlugin.openAccessDeniedErrorMessage();
}
try {
setSearchFieldsEnablement(SessionManager.getAppService().isAllowed(
new ProcessingEventReadPermission(SessionManager
.getUser()
.getCurrentWorkingCenter().getId())));
} catch (ApplicationException e) {
BgcPlugin.openAccessDeniedErrorMessage();
}
super.reload();
}
@Override
public String getId() {
return ID;
}
@Override
protected String getTreeTextToolTip() {
return ""; //$NON-NLS-1$
}
@Override
protected void internalSearch() {
try {
List<? extends ModelWrapper<?>> searchedObject = search();
if (searchedObject.size() == 0) {
String msg;
if (radioWorksheet.getSelection()) {
msg = NLS.bind(
Messages.ProcessingView_notfound_worksheet_msg,
treeText.getText());
} else if (radioPatient.getSelection()) {
msg = NLS.bind(
Messages.ProcessingView_notfound_patient_msg,
treeText.getText());
} else {
msg = NLS.bind(Messages.ProcessingView_notfound_date_msg,
DateFormatter.formatAsDate(dateWidget.getDate()));
}
BgcPlugin.openMessage(Messages.ProcessingView_notFound_title,
msg);
} else {
showSearchedObjectsInTree(searchedObject);
getTreeViewer().expandToLevel(processingNode,
TreeViewer.ALL_LEVELS);
}
} catch (Exception e) {
BgcPlugin.openAsyncError(
Messages.ProcessingView_search_error_title, e);
}
}
protected List<? extends ModelWrapper<?>> search() throws Exception {
List<ProcessingEventWrapper> processingEvents;
if (radioWorksheet.getSelection()) {
processingEvents = ProcessingEventWrapper
.getProcessingEventsWithWorksheet(
SessionManager.getAppService(), treeText.getText().trim());
} else if (radioPatient.getSelection()) {
processingEvents = ProcessingEventWrapper
.getProcessingEventsByPatient(SessionManager.getAppService(),
treeText.getText().trim());
} else
processingEvents = ProcessingEventWrapper
.getProcessingEventsWithDateForCenter(
SessionManager.getAppService(), dateWidget.getDate(),
SessionManager.getUser().getCurrentWorkingCenter());
return processingEvents;
}
protected void showTextOnly(boolean show) {
treeText.setVisible(show);
((GridData) treeText.getLayoutData()).exclude = !show;
dateComposite.setVisible(!show);
((GridData) dateComposite.getLayoutData()).exclude = show;
treeText.getParent().layout(true, true);
}
protected void showSearchedObjectsInTree(
List<? extends ModelWrapper<?>> searchedObjects) {
processingNode.removeAll();
for (ModelWrapper<?> searchedObject : searchedObjects) {
List<AbstractAdapterBase> nodeRes = rootNode.search(
searchedObject.getClass(), searchedObject.getId());
if (nodeRes.size() == 0) {
ProcessingEventAdapter newChild = new ProcessingEventAdapter(
processingNode, (ProcessingEventWrapper) searchedObject);
newChild.setParent(processingNode);
processingNode.addChild(newChild);
}
}
processingNode.performExpand();
if (searchedObjects.size() == 1) {
ModelWrapper<?> modelWrapper = searchedObjects.get(0);
List<AbstractAdapterBase> nodeRes = rootNode.search(
modelWrapper.getClass(), modelWrapper.getId());
nodeRes.get(0).performDoubleClick();
} else
BgcPlugin.openMessage(Messages.ProcessingView_pevent_info_title,
NLS.bind(Messages.ProcessingView_number_found_msg,
searchedObjects.size()));
}
public AdapterBase getProcessingNode() {
return processingNode;
}
@Override
public void clear() {
rootNode.removeAll();
processingNode = null;
setSearchFieldsEnablement(false);
}
@Override
protected void createRootNode() {
createOldRootNode();
}
}