package edu.ualberta.med.biobank.views; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.TraverseEvent; import org.eclipse.swt.events.TraverseListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.ui.ISourceProviderListener; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.ViewPart; import edu.ualberta.med.biobank.SessionManager; import edu.ualberta.med.biobank.common.formatters.DateFormatter; import edu.ualberta.med.biobank.common.peer.LogPeer; import edu.ualberta.med.biobank.common.permission.logging.LoggingPermission; import edu.ualberta.med.biobank.common.wrappers.LogWrapper; import edu.ualberta.med.biobank.forms.LoggingForm; import edu.ualberta.med.biobank.forms.input.FormInput; import edu.ualberta.med.biobank.gui.common.BgcPlugin; import edu.ualberta.med.biobank.gui.common.LoginPermissionSessionState; import edu.ualberta.med.biobank.gui.common.widgets.BgcBaseText; import edu.ualberta.med.biobank.gui.common.widgets.DateTimeWidget; import edu.ualberta.med.biobank.logs.LogQuery; import gov.nih.nci.system.applicationservice.ApplicationException; public class LoggingView extends ViewPart { public static final String ID = "edu.ualberta.med.biobank.views.LoggingView"; //$NON-NLS-1$ private static enum ComboListType { CENTER, USER, TYPE, ACTION } private BgcBaseText patientNumTextInput, inventoryIdTextInput, detailsTextInput, locationTextInput; private Combo centerCombo, userCombo, typeCombo, actionCombo; private DateTimeWidget startDateWidget, endDateWidget; private Button clearButton, searchButton; private Color colorWhite; private String[] siteComboOptions; private final Listener alphaNumericListener = new Listener() { @Override public void handleEvent(Event e) { /* The user can only enter in alphanumeric */ /* Applied to Patient#, Inventory ID, Location */ e.text = e.text.replaceAll("^(?:(?!\\p{Alnum}+).)*$", ""); //$NON-NLS-1$ //$NON-NLS-2$ } }; private final KeyListener enterListener = new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if (e.keyCode == SWT.CR) { searchDatabase(); } } }; private boolean allowed = false; public LoggingView() { try { if (SessionManager.getInstance().isConnected()) allowed = SessionManager.getAppService().isAllowed( new LoggingPermission()); } catch (Exception e) { BgcPlugin.openAccessDeniedErrorMessage(e); } BgcPlugin.getLoginStateSourceProvider() .addSourceProviderListener(new ISourceProviderListener() { @SuppressWarnings("rawtypes") @Override public void sourceChanged(int sourcePriority, Map sourceValuesByName) { } @Override public void sourceChanged(int sourcePriority, String sourceName, Object sourceValue) { try { if (sourceName .equals(LoginPermissionSessionState.LOGIN_STATE_SOURCE_NAME) && sourceValue.equals(LoginPermissionSessionState.LOGGED_OUT)) allowed = false; else if (sourceName .equals(LoginPermissionSessionState.LOGIN_STATE_SOURCE_NAME) && sourceValue.equals(LoginPermissionSessionState.LOGGED_IN)) { allowed = SessionManager.getAppService().isAllowed( new LoggingPermission()); } setEnableAllFields(allowed); loadComboFields(); } catch (Exception e) { BgcPlugin.openAccessDeniedErrorMessage(e); } } }); } @Override public void createPartControl(Composite parent) { colorWhite = new Color(parent.getDisplay(), 255, 255, 255); GridLayout gridlayout = new GridLayout(2, false); gridlayout.verticalSpacing = 2; gridlayout.horizontalSpacing = 5; gridlayout.marginLeft = 1; gridlayout.marginRight = 5; gridlayout.marginBottom = 10; parent.setLayout(gridlayout); parent.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, true)); parent.setBackground(colorWhite); Label label = new Label(parent, SWT.NO_BACKGROUND); label.setText(Messages.LoggingView_center_label); label.setAlignment(SWT.LEFT); label.setBackground(colorWhite); centerCombo = new Combo(parent, SWT.READ_ONLY); centerCombo.setFocus(); centerCombo.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); centerCombo.addKeyListener(enterListener); label = new Label(parent, SWT.NO_BACKGROUND); label.setText(Messages.LoggingView_user_label); label.setAlignment(SWT.LEFT); label.setBackground(colorWhite); userCombo = new Combo(parent, SWT.READ_ONLY); userCombo.setFocus(); userCombo.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); userCombo.addKeyListener(enterListener); label = new Label(parent, SWT.NO_BACKGROUND); label.setText(Messages.LoggingView_type_label); label.setAlignment(SWT.LEFT); label.setBackground(colorWhite); typeCombo = new Combo(parent, SWT.READ_ONLY); typeCombo.setVisible(true); typeCombo.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); typeCombo.addKeyListener(enterListener); label = new Label(parent, SWT.NO_BACKGROUND); label.setText(Messages.LoggingView_action_label); label.setAlignment(SWT.LEFT); label.setBackground(colorWhite); actionCombo = new Combo(parent, SWT.READ_ONLY); actionCombo.setVisible(true); actionCombo.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); actionCombo.addKeyListener(enterListener); new Label(parent, SWT.NONE); new Label(parent, SWT.NONE); label = new Label(parent, SWT.NO_BACKGROUND); label.setText(Messages.LoggingView_patientnber_label); label.setAlignment(SWT.LEFT); label.setBackground(colorWhite); patientNumTextInput = new BgcBaseText(parent, SWT.SINGLE | SWT.BORDER); patientNumTextInput.setVisible(true); patientNumTextInput .setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); patientNumTextInput.addListener(SWT.Verify, alphaNumericListener); patientNumTextInput.addKeyListener(enterListener); label = new Label(parent, SWT.NO_BACKGROUND); label.setText(Messages.LoggingView_inventoryid_label); label.setAlignment(SWT.LEFT); label.setBackground(colorWhite); inventoryIdTextInput = new BgcBaseText(parent, SWT.SINGLE | SWT.BORDER); inventoryIdTextInput.setVisible(true); inventoryIdTextInput.setLayoutData(new GridData( GridData.FILL_HORIZONTAL)); inventoryIdTextInput.addListener(SWT.Verify, alphaNumericListener); inventoryIdTextInput.addKeyListener(enterListener); label = new Label(parent, SWT.NO_BACKGROUND); label.setText(Messages.LoggingView_location_label); label.setAlignment(SWT.LEFT); label.setBackground(colorWhite); locationTextInput = new BgcBaseText(parent, SWT.SINGLE | SWT.BORDER); locationTextInput.setVisible(true); locationTextInput.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); locationTextInput.addListener(SWT.Verify, alphaNumericListener); locationTextInput.addKeyListener(enterListener); label = new Label(parent, SWT.NO_BACKGROUND); label.setText(Messages.LoggingView_details_label); label.setAlignment(SWT.LEFT); label.setBackground(colorWhite); detailsTextInput = new BgcBaseText(parent, SWT.SINGLE | SWT.BORDER); detailsTextInput.setVisible(true); detailsTextInput.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); detailsTextInput.addKeyListener(enterListener); new Label(parent, SWT.NONE); new Label(parent, SWT.NONE); label = new Label(parent, SWT.NO_BACKGROUND); label.setText(Messages.LoggingView_startdate_label); label.setAlignment(SWT.LEFT); label.setBackground(colorWhite); startDateWidget = new DateTimeWidget(parent, SWT.DATE, null); startDateWidget.setBackground(colorWhite); label = new Label(parent, SWT.NO_BACKGROUND); label.setText(Messages.LoggingView_enddate_label); label.setAlignment(SWT.LEFT); label.setBackground(colorWhite); endDateWidget = new DateTimeWidget(parent, SWT.DATE, null); endDateWidget.setBackground(colorWhite); new Label(parent, SWT.NONE); new Label(parent, SWT.NONE); new Label(parent, SWT.NONE); GridLayout gridlayoutButton = new GridLayout(); gridlayoutButton.makeColumnsEqualWidth = false; gridlayoutButton.numColumns = 2; gridlayoutButton.verticalSpacing = 0; gridlayoutButton.horizontalSpacing = 5; gridlayoutButton.marginLeft = 0; gridlayoutButton.marginRight = 0; Composite buttonComposite = new Composite(parent, SWT.NONE); buttonComposite.setLayout(gridlayoutButton); buttonComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); buttonComposite.setBackground(colorWhite); buttonComposite.setVisible(true); clearButton = new Button(buttonComposite, SWT.PUSH); clearButton.setText(Messages.LoggingView_clear_label); clearButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); clearButton.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event e) { switch (e.type) { case SWT.Selection: clearFields(); } } }); searchButton = new Button(buttonComposite, SWT.PUSH); searchButton.setText(Messages.LoggingView_search_label); searchButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); searchButton.addKeyListener(enterListener); searchButton.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event e) { switch (e.type) { case SWT.Selection: searchDatabase(); break; } } }); searchButton.addTraverseListener(new TraverseListener() { @Override public void keyTraversed(TraverseEvent e) { centerCombo.setFocus(); e.doit = false; } }); clearFields(); // if logged in and select the site selected in "working site" combo // box, only if not "All Sites" are selected if (SessionManager.getInstance().isConnected() && allowed) { setEnableAllFields(true); loadComboFields(); } else setEnableAllFields(false); } @Override public void setFocus() { // } private void setEnableAllFields(boolean enabled) { centerCombo.setEnabled(enabled); userCombo.setEnabled(enabled); typeCombo.setEnabled(enabled); actionCombo.setEnabled(enabled); patientNumTextInput.setEnabled(enabled); inventoryIdTextInput.setEnabled(enabled); locationTextInput.setEnabled(enabled); detailsTextInput.setEnabled(enabled); startDateWidget.setEnabled(enabled); endDateWidget.setEnabled(enabled); clearButton.setEnabled(enabled); searchButton.setEnabled(enabled); } private void loadComboFields() { siteComboOptions = loadComboList(ComboListType.CENTER); centerCombo.setItems(siteComboOptions); centerCombo.select(0); userCombo.setItems(loadComboList(ComboListType.USER)); userCombo.select(0); typeCombo.setItems(loadComboList(ComboListType.TYPE)); typeCombo.select(0); actionCombo.setItems(loadComboList(ComboListType.ACTION)); actionCombo.select(0); } private void clearFields() { centerCombo.select(0); userCombo.select(0); typeCombo.select(0); actionCombo.select(0); patientNumTextInput.setText(""); //$NON-NLS-1$ inventoryIdTextInput.setText(""); //$NON-NLS-1$ locationTextInput.setText(""); //$NON-NLS-1$ detailsTextInput.setText(""); //$NON-NLS-1$ startDateWidget.setDate(null); endDateWidget.setDate(null); } private void searchDatabase() { if (startDateWidget.getDate() != null && endDateWidget.getDate() != null && startDateWidget.getDate().after(endDateWidget.getDate())) { BgcPlugin.openAsyncError(Messages.LoggingView_error_title, Messages.LoggingView_date_error_msg); return; } FormInput input = new FormInput(null, Messages.LoggingView_resform_title); try { LogQuery.getInstance().setSearchQueryItem(LogPeer.CENTER.getName(), centerCombo.getText()); LogQuery.getInstance().setSearchQueryItem( LogPeer.USERNAME.getName(), userCombo.getText()); LogQuery.getInstance().setSearchQueryItem(LogPeer.TYPE.getName(), typeCombo.getText()); LogQuery.getInstance().setSearchQueryItem(LogPeer.ACTION.getName(), actionCombo.getText()); LogQuery.getInstance() .setSearchQueryItem(LogPeer.PATIENT_NUMBER.getName(), patientNumTextInput.getText()); LogQuery.getInstance().setSearchQueryItem( LogPeer.INVENTORY_ID.getName(), inventoryIdTextInput.getText()); LogQuery.getInstance().setSearchQueryItem( LogPeer.LOCATION_LABEL.getName(), locationTextInput.getText()); LogQuery.getInstance().setSearchQueryItem( LogPeer.DETAILS.getName(), detailsTextInput.getText()); Date startDateDate = startDateWidget.getDate(); Date endDateDate = endDateWidget.getDate(); String startDateStr = DateFormatter.formatAsDate(startDateDate); if (startDateStr != null && startDateStr.length() > 0) { LogQuery.getInstance().setSearchQueryItem( LogQuery.START_DATE_KEY, startDateStr); } else LogQuery.getInstance().setSearchQueryItem( LogQuery.START_DATE_KEY, ""); String endDateStr = DateFormatter.formatAsDate(endDateDate); if (endDateStr != null && endDateStr.length() > 0) { LogQuery.getInstance().setSearchQueryItem( LogQuery.END_DATE_KEY, endDateStr); } else LogQuery.getInstance().setSearchQueryItem( LogQuery.END_DATE_KEY, ""); /* * LogQuery.getInstance().setSearchQueryItem( "containerType", * containerTypeCombo.getText()); LogQuery.getInstance() * .setSearchQueryItem("containerLabel", * containerLabelTextInput.getText()); */ /* creates logging view */ PlatformUI.getWorkbench().getActiveWorkbenchWindow() .getActivePage().openEditor(input, LoggingForm.ID); } catch (Exception ex) { BgcPlugin.openAsyncError(Messages.LoggingView_error_title, Messages.LoggingView_opening_error_msg, ex); } } private String[] loadComboList(ComboListType possibleList) { try { List<String> arrayList = null; if (!SessionManager.getInstance().isConnected()) { return new String[] { Messages.LoggingView_error_res_string }; } switch (possibleList) { case CENTER: arrayList = LogWrapper.getPossibleCenters(SessionManager .getAppService()); break; case USER: arrayList = LogWrapper.getPossibleUsernames(SessionManager .getAppService()); break; case TYPE: arrayList = LogWrapper.getPossibleTypes(SessionManager .getAppService()); break; case ACTION: arrayList = LogWrapper.getPossibleActions(SessionManager .getAppService()); break; } arrayList.remove(null); List<String> result = new ArrayList<String>(); result.add(LogQuery.ALL); result.add(LogQuery.NONE); for (String item : arrayList) { if (item != null) result.add(item); } return result.toArray(new String[0]); } catch (ApplicationException ex) { BgcPlugin.openAsyncError(Messages.LoggingView_error_title, Messages.LoggingView_combos_error_msg, ex); } return null; } }