org.celllife.idart.gui.patient.PatientIdentifierDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.celllife.idart.gui.patient.PatientIdentifierDialog.java

Source

/*
 * iDART: The Intelligent Dispensing of Antiretroviral Treatment
 * Copyright (C) 2006 Cell-Life
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 as published by
 * the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License version
 * 2 for more details.
 *
 * You should have received a copy of the GNU General Public License version 2
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 */

package org.celllife.idart.gui.patient;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

import model.manager.PatientManager;

import org.apache.log4j.Logger;
import org.celllife.idart.commonobjects.iDartProperties;
import org.celllife.idart.database.hibernate.AlternatePatientIdentifier;
import org.celllife.idart.database.hibernate.IdentifierType;
import org.celllife.idart.database.hibernate.Patient;
import org.celllife.idart.database.hibernate.PatientIdentifier;
import org.celllife.idart.gui.platform.GenericOthersGui;
import org.celllife.idart.gui.utils.ResourceUtils;
import org.celllife.idart.gui.utils.iDartFont;
import org.celllife.idart.gui.utils.iDartImage;
import org.celllife.idart.messages.Messages;
import org.celllife.idart.misc.iDARTUtil;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.hibernate.Session;

public class PatientIdentifierDialog extends GenericOthersGui {

    class PatientIdentifierEditingSupport extends EditingSupport {

        private CellEditor editor;

        public PatientIdentifierEditingSupport(ColumnViewer viewer) {
            super(viewer);
            editor = new TextCellEditor(((TableViewer) viewer).getTable());
        }

        @Override
        protected boolean canEdit(Object element) {
            return true;
        }

        @Override
        protected CellEditor getCellEditor(Object arg0) {
            return editor;
        }

        @Override
        protected Object getValue(Object element) {
            PatientIdentifier model = (PatientIdentifier) element;
            return model.getValueEdit();
        }

        @Override
        protected void setValue(Object element, Object value) {
            PatientIdentifier model = (PatientIdentifier) element;
            model.setValueEdit(((String) value).trim().toUpperCase());
            getViewer().update(element, null);
        }
    }

    private Patient localPatient;

    private TableViewer tblViewer;

    private ArrayList<PatientIdentifier> identiers;

    private boolean changesMade;

    public PatientIdentifierDialog(Shell parent, Session session, Patient patient) {
        super(parent, session);
        localPatient = patient;
    }

    private void loadPatientIdentifiers() {
        List<IdentifierType> types = PatientManager.getAllIdentifierTypes(getHSession());
        identiers = new ArrayList<PatientIdentifier>();
        typeLoop: for (IdentifierType type : types) {
            if (type.isVoided())
                continue;

            for (PatientIdentifier identifier : localPatient.getPatientIdentifiers()) {
                if (identifier.getType().getId() == type.getId()) {
                    identifier.setValueEdit(identifier.getValue());
                    identiers.add(identifier);
                    continue typeLoop;
                }
            }

            // create new identifier if the patient doesn't already have on for this type
            PatientIdentifier identifier = new PatientIdentifier();
            identifier.setType(type);
            identifier.setValueEdit(EMPTY);
            identifier.setPatient(localPatient);
            identiers.add(identifier);
        }

        tblViewer.setInput(identiers);
    }

    /**
     * This method initializes newPrintBlankLabel
     */
    @Override
    protected void createShell() {
        buildShell(Messages.getString("PatientIdDialog.title"), new Rectangle(0, 0, 600, 570)); //$NON-NLS-1$
    }

    /**
     * This method initializes compHeader
     * 
     */
    @Override
    protected void createCompHeader() {
        buildCompHeader(Messages.getString("PatientIdDialog.title"), iDartImage.PATIENTINFOLABEL); //$NON-NLS-1$
    }

    /**
     * This method initializes compOptions
     * 
     */
    @Override
    protected void createCompOptions() {
        Label lblInfoText = new Label(getShell(), SWT.WRAP);
        lblInfoText.setBounds(new Rectangle(50, 80, 500, 40));
        lblInfoText.setText(Messages.getString("PatientIdDialog.info_text")); //$NON-NLS-1$

        tblViewer = new TableViewer(getShell(), SWT.BORDER | SWT.V_SCROLL | SWT.FULL_SELECTION);
        tblViewer.getTable().setBounds(new org.eclipse.swt.graphics.Rectangle(50, 130, 500, 330));
        tblViewer.getTable().setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
        tblViewer.setContentProvider(new ArrayContentProvider());
        tblViewer.getTable().setHeaderVisible(true);
        tblViewer.getTable().setLinesVisible(true);
        createColumns(tblViewer);

    }

    /**
     * Creates the table layout
     * 
     * @param viewer
     */
    public void createColumns(final TableViewer viewer) {
        TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
        column.getColumn().setWidth(300);
        column.getColumn().setText(Messages.getString("PatientIdDialog.column_header.type")); //$NON-NLS-1$
        column.getColumn().setMoveable(true);
        column.setLabelProvider(new ColumnLabelProvider() {

            @Override
            public String getText(Object element) {
                PatientIdentifier content = (PatientIdentifier) element;
                return content.getType().getName();
            }
        });

        TableViewerColumn column1 = new TableViewerColumn(viewer, SWT.NONE);
        column1.getColumn().setWidth(200);
        column1.getColumn().setText(Messages.getString("PatientIdDialog.column_header.number")); //$NON-NLS-1$
        column1.getColumn().setMoveable(true);
        column1.setEditingSupport(new PatientIdentifierEditingSupport(viewer));
        column1.setLabelProvider(new ColumnLabelProvider() {

            @Override
            public String getText(Object element) {
                PatientIdentifier content = (PatientIdentifier) element;
                return content.getValueEdit();
            }
        });
    }

    /**
     * This method initializes compButtons
     * 
     */
    @Override
    protected void createCompButtons() {
        Button btnClose = new Button(getCompButtons(), SWT.PUSH);
        btnClose.setText(Messages.getString("PatientIdDialog.button.done")); //$NON-NLS-1$
        btnClose.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
            @Override
            public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
                cmdSaveSelected();
            }
        });
        btnClose.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));

        Button btnCancel = new Button(getCompButtons(), SWT.PUSH);
        btnCancel.setText(Messages.getString("genericformgui.button.cancel.text")); //$NON-NLS-1$
        btnCancel.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
            @Override
            public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
                cmdCloseSelected();
            }
        });
        btnCancel.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));

    }

    protected void cmdSaveSelected() {
        if (fieldsOk()) {
            Set<PatientIdentifier> patientIds = localPatient.getPatientIdentifiers();
            for (PatientIdentifier newId : identiers) {
                if (newId.getValueEdit() == null || newId.getValueEdit().isEmpty()) {
                    if (newId.getId() != -1) {
                        patientIds.remove(newId);
                        changesMade = true;
                    }
                    continue;
                }

                if (newId.getId() == -1) {
                    changesMade = true;
                    patientIds.add(newId);
                    newId.setValue(newId.getValueEdit());
                    newId.setValueEdit(null);
                    continue;
                }

                // check if an existing id was changed
                if (!newId.getValue().equals(newId.getValueEdit())) {
                    changesMade = true;
                    AlternatePatientIdentifier alt = new AlternatePatientIdentifier(newId.getValue(), localPatient,
                            new Date(), true, newId.getType());
                    localPatient.getAlternateIdentifiers().add(alt);
                    newId.setValue(newId.getValueEdit());
                    newId.setValueEdit(null);
                }
            }

            localPatient.setPatientId(localPatient.getPreferredIdentifier().getValue());
            cmdCloseSelected();
        }
    }

    private boolean fieldsOk() {
        boolean allEmpty = true;
        for (PatientIdentifier newId : identiers) {
            if (newId.getValueEdit() == null || newId.getValueEdit().isEmpty())
                continue;

            allEmpty = false;

            String illegalText = iDARTUtil.checkPatientId(newId.getValueEdit());
            if (illegalText != null) {
                showMessage(MessageDialog.ERROR,
                        MessageFormat.format(Messages.getString("patient.error.badCharacterInPatientId.title"), //$NON-NLS-1$
                                illegalText),
                        MessageFormat.format(Messages.getString("patient.error.badCharacterInPatientId"), //$NON-NLS-1$
                                iDartProperties.illegalPatientIdChars));
                return false;
            }

            if (PatientManager.checkPatientIdentifier(getHSession(), newId.getPatient(), newId.getType(),
                    newId.getValueEdit())) {
                showMessage(MessageDialog.ERROR, Messages.getString("PatientIdDialog.error.exists.title"), //$NON-NLS-1$
                        MessageFormat.format(Messages.getString("PatientIdDialog.error.exists.message"), //$NON-NLS-1$
                                newId.getType().getName(), newId.getValueEdit()));
                return false;
            }

            List<Patient> altPatients = PatientManager.getPatientsByAltId(getHSession(), newId.getType(),
                    newId.getValueEdit());
            if (!altPatients.isEmpty()) {
                String patientsWithThisOldId = EMPTY;
                for (Patient p : altPatients) {
                    patientsWithThisOldId += (p.getPatientId() + ", "); //$NON-NLS-1$
                }
                patientsWithThisOldId = patientsWithThisOldId.substring(0, patientsWithThisOldId.length() - 2);

                MessageBox mSave = new MessageBox(getShell(), SWT.ICON_WARNING | SWT.YES | SWT.NO);
                mSave.setText(Messages.getString("patient.warning.saveDuplicateId.title")); //$NON-NLS-1$
                mSave.setMessage(MessageFormat.format(Messages.getString("patient.warning.saveDuplicateId"), //$NON-NLS-1$
                        patientsWithThisOldId));
                if (mSave.open() != SWT.YES) {
                    return false;
                }
            }
        }

        if (allEmpty) {
            showMessage(MessageDialog.ERROR, Messages.getString("PatientIdDialog.error.empty.title"), //$NON-NLS-1$
                    Messages.getString("PatientIdDialog.error.empyt.message")); //$NON-NLS-1$
            return false;
        }

        return true;
    }

    /**
     * This method is called when the user pressed the "Close" button It
     * disposes the current shell.
     */
    private void cmdCloseSelected() {
        closeShell(false);
    }

    @Override
    protected void setLogger() {
        setLog(Logger.getLogger(this.getClass()));
    }

    public void openAndWait() {
        activate();
        loadPatientIdentifiers();
        while (!getShell().isDisposed()) {
            if (!getShell().getDisplay().readAndDispatch()) {
                getShell().getDisplay().sleep();
            }
        }
    }

    public boolean isChangesMade() {
        return changesMade;
    }
}