package edu.ualberta.med.biobank.forms;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
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.Display;
import org.eclipse.ui.PlatformUI;
import org.springframework.remoting.RemoteConnectFailureException;
import edu.ualberta.med.biobank.gui.common.BgcPlugin;
import edu.ualberta.med.biobank.widgets.PlateSelectionWidget;
import edu.ualberta.med.biobank.widgets.grids.ScanPalletWidget;
import edu.ualberta.med.biobank.widgets.grids.cell.PalletCell;
import edu.ualberta.med.biobank.widgets.grids.cell.UICellStatus;
import edu.ualberta.med.scannerconfig.ScannerConfigPlugin;
import edu.ualberta.med.scannerconfig.dmscanlib.ScanCell;
import edu.ualberta.med.scannerconfig.preferences.scanner.profiles.ProfileManager;
public class DecodePlateForm extends PlateForm {
public static final String ID =
"edu.ualberta.med.biobank.forms.DecodePlateForm";
private ScanPalletWidget spw;
private PlateSelectionWidget plateSelectionWidget;
Integer plateToScan;
@Override
protected void init() throws Exception {
setPartName("Decode Plate");
}
@Override
public void dispose() {
ScannerConfigPlugin.getDefault().getPreferenceStore()
.removePropertyChangeListener(propertyListener);
}
@Override
protected void createFormContent() throws Exception {
form.setText("Decode Plate");
GridLayout layout = new GridLayout(2, false);
page.setLayout(layout);
page.setLayoutData(new GridData(SWT.BEGINNING, SWT.TOP, false, false));
plateSelectionWidget = new PlateSelectionWidget(page, SWT.NONE);
plateSelectionWidget.adaptToToolkit(toolkit, true);
GridData gd = new GridData();
gd.horizontalSpan = 2;
gd.grabExcessHorizontalSpace = true;
plateSelectionWidget.setLayoutData(gd);
scanButton = toolkit.createButton(page,
"Scan && Decode Plate", SWT.PUSH);
scanButton
.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, false, false));
scanButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
scanAndProcessResult();
}
});
spw = new ScanPalletWidget(page, Arrays.asList(UICellStatus.EMPTY,
UICellStatus.FILLED));
spw.setVisible(true);
toolkit.adapt(spw);
ScannerConfigPlugin.getDefault().getPreferenceStore()
.addPropertyChangeListener(propertyListener);
}
@Override
public void setFocus() {
scanButton.setFocus();
}
protected void scanAndProcessResult() {
plateToScan = plateSelectionWidget.getSelectedPlate();
if (plateToScan == null) {
BgcPlugin.openAsyncError("Decode Plate Error",
"No plate selected");
return;
}
IRunnableWithProgress op = new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) {
monitor.beginTask("Scanning and decoding...",
IProgressMonitor.UNKNOWN);
try {
scanAndProcessResult(monitor);
} catch (RemoteConnectFailureException exp) {
BgcPlugin.openRemoteConnectErrorMessage(exp);
} catch (Exception e) {
BgcPlugin.openAsyncError(
"Scan && Decode Error", e);
}
monitor.done();
}
};
try {
new ProgressMonitorDialog(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell()).run(true, true, op);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
protected void scanAndProcessResult(IProgressMonitor monitor)
throws Exception {
launchScan(monitor);
monitor.subTask("Decoding...");
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
processScanResult();
spw.setCells(cells);
}
});
}
protected void launchScan(IProgressMonitor monitor) throws Exception {
monitor.subTask("Launching scan");
List<ScanCell> decodedCells = ScannerConfigPlugin.decodePlate(
plateToScan, ProfileManager.ALL_PROFILE_NAME);
cells = PalletCell.convertArray(decodedCells);
}
@Override
public void setValues() throws Exception {
// TODO Auto-generated method stub
}
}