com.jinnova.docaid.parts.DiagListPart.java Source code

Java tutorial

Introduction

Here is the source code for com.jinnova.docaid.parts.DiagListPart.java

Source

/*******************************************************************************
 * Copyright (c) 2010 - 2013 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Lars Vogel <lars.Vogel@gmail.com> - Bug 419770
 *******************************************************************************/
package com.jinnova.docaid.parts;

import java.sql.SQLException;
import java.util.Comparator;
import java.util.LinkedList;

import javax.annotation.PostConstruct;
import javax.inject.Inject;

import org.eclipse.e4.ui.di.Focus;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
import org.eclipse.e4.ui.workbench.modeling.ISelectionListener;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;

import com.jinnova.docaid.DBManager;
import com.jinnova.docaid.DiagRecord;
import com.jinnova.docaid.Patient;
import com.jinnova.docaid.QueuePeekingListener;
import com.jinnova.docaid.QueueTicket;
import com.jinnova.docaid.WaitingList;

public class DiagListPart {

    @Inject
    private ESelectionService selService;

    private TableViewer diagListViewer;

    private Patient currentPatient;
    private LinkedList<DiagRecord> diagList;

    private Color colorOpening;

    private Label patientNameLabel;

    private class DiagLabelProvider extends ColumnLabelProvider {

        @Override
        public Color getForeground(Object element) {
            DiagRecord d = (DiagRecord) element;
            //if (d.id.getValue() == null) {
            if (d.isInDayNotEnd()) {
                return colorOpening;
            }
            return null;
        }
    }

    @PostConstruct
    public void createComposite(Composite parent) {
        parent.setLayout(new GridLayout(1, false));
        colorOpening = parent.getDisplay().getSystemColor(SWT.COLOR_BLUE);

        patientNameLabel = new Label(parent, SWT.None);
        GridData gdata = new GridData(GridData.FILL_HORIZONTAL);
        //gdata.widthHint = 200;
        patientNameLabel.setLayoutData(gdata);
        patientNameLabel.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_BLUE));

        diagListViewer = new TableViewer(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION);
        //patientList.add("Sample item 1");
        //patientList.add("Sample item 2");
        diagListViewer.setContentProvider(ArrayContentProvider.getInstance());
        //patientList.setInput(new String[] {"a", "b"});

        createColumn(30, Messages.DiagListPart_queueNumberAbbr, new DiagLabelProvider() {
            @Override
            public String getText(Object element) {
                DiagRecord p = (DiagRecord) element;
                //int i = diagList.size() - diagList.indexOf(p);
                return String.valueOf(diagList.indexOf(p) + 1);
            }
        });
        createColumn(100, Messages.DiagListPart_date, new DiagLabelProvider() {
            @Override
            public String getText(Object element) {
                DiagRecord d = (DiagRecord) element;
                //if (d.id.getValue() == null || d.id.getValue() == -1) {
                if (d.isInDayNotEnd()) {
                    return Messages.DiagListPart_new_in_brackets;
                } else {
                    return d.date.getEasyLabel();
                }
            }
        });
        createColumn(50, Messages.DiagListPart_weight, new DiagLabelProvider() {
            @Override
            public String getText(Object element) {
                DiagRecord d = (DiagRecord) element;
                return String.valueOf(d.weight.getValueAsEditing());
            }
        });
        createColumn(50, Messages.DiagListPart_height, new DiagLabelProvider() {
            @Override
            public String getText(Object element) {
                DiagRecord d = (DiagRecord) element;
                return String.valueOf(d.height.getValueAsEditing());
            }
        });
        createColumn(800, "", new DiagLabelProvider() { //$NON-NLS-1$
            @Override
            public String getText(Object element) {
                DiagRecord d = (DiagRecord) element;
                if (d.id.getValue() == null || d.id.getValue() == -1) {
                    return ""; //$NON-NLS-1$
                }
                String s = null;
                s = append(s, Messages.DiagListPart_small_symtoms_colon, d.symptons.getValue());
                s = append(s, Messages.DiagListPart_small_diag_colon, d.diagnosis.getValue());
                s = append(s, Messages.DiagListPart_small_treatments_colon, d.treatment.getValue());
                s = append(s, Messages.DiagListPart_small_prescription_colon, d.prescription.getSummary());
                if (s == null) {
                    return ""; //$NON-NLS-1$
                } else {
                    return s.substring(0, 1).toUpperCase() + s.substring(1);
                }
            }

            private String append(String dest, String title, String value) {
                if (value == null || "".equals(value.trim())) { //$NON-NLS-1$
                    return dest;
                }
                if (dest == null) {
                    return title + value;
                } else {
                    return dest + ", " + title + value; //$NON-NLS-1$
                }
            }
        });

        GridData layoutData = new GridData(GridData.FILL_BOTH);
        layoutData.horizontalSpan = 4;
        diagListViewer.getTable().setLayoutData(layoutData);
        final Table table = diagListViewer.getTable();
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
        diagListViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                selService.setSelection(selection.size() == 1 ? selection.getFirstElement() : selection.toArray());
            }
        });

        //diagListViewer.setInput(diagList);
        //WaitingList.registerViewer(diagListViewer);
        selService.addSelectionListener(new ISelectionListener() {

            //private Patient newPatient;
            //private LinkedList<DiagRecord> newDiagList;

            @Override
            public void selectionChanged(MPart part, Object selection) {
                Patient newPatient = null;
                DiagRecord newDiag = null;
                if (selection instanceof QueueTicket) {
                    newDiag = ((QueueTicket) selection).patient.todayDiag;
                    newPatient = newDiag.patient;
                } else if (selection instanceof Patient) {
                    newPatient = (Patient) selection;
                    newDiag = null;
                    if (newPatient.id.getValue() != null) {
                        QueueTicket q = WaitingList.diagQueue.getQueueItem(newPatient.id.getValue());
                        if (q != null) {
                            newDiag = q.patient.todayDiag;
                        }
                    }
                    if (newDiag == null) {
                        //newDiag = newPatient.getOrCreateDirectTicket().diag;
                        newDiag = newPatient.todayDiag;
                    }
                }

                if (newPatient == null || newPatient == currentPatient) {
                    return;
                }
                /*if (diag != null) {
                   diagList = new LinkedList<DiagRecord>();
                   diagList.add(((QueuedPatient) selection).diag);
                   diagListViewer.setInput(diagList);
                   diagListViewer.setSelection(new StructuredSelection(diagList.getFirst()), true);
                }*/

                setPatient(newPatient, newDiag);
            }

            /*private void loadViewer(LinkedList<DiagRecord> newDiagList) {
               patientNameLabel.setText(currentPatient.name.getValueAsEditing() + " (" +
              currentPatient.dob.getValueAsEditing() + ")");
               diagList = newDiagList;
               diagListViewer.setInput(newDiagList.toArray());
            }*/
        });

        Patient.addPatientSelectionEmptyListener(new Runnable() {

            @Override
            public void run() {
                /*patientNameLabel.setText("");
                diagList = null;
                diagListViewer.setInput(null);*/
                setPatient(null, null);
            }
        });
        WaitingList.diagQueue.addQueuePeekingListener(new QueuePeekingListener() {

            @Override
            public void queuePeeked(QueueTicket ticket) {
                if (ticket == null) {
                    setPatient(null, null);
                } else {
                    setPatient(ticket.patient, ticket.patient.todayDiag);
                }
            }
        });
    }

    public void setPatient(Patient newPatient, DiagRecord newDiag) {

        if (newPatient == null) {
            populate(null, new LinkedList<>());
            return;
        }
        LinkedList<DiagRecord> newDiagList = new LinkedList<DiagRecord>();
        //if (diag != null && (diag.id.getValue() == null || diag.id.getValue() == -1)) {
        //boolean retainQueuedDiag = newDiag != null && newDiag.isInDayNotEnd();
        boolean retainQueuedDiag = newDiag != null && newDiag.isInDay();
        if (retainQueuedDiag) {
            newDiagList.add(newDiag);
        }
        new Thread() {
            public void run() {

                try {
                    LinkedList<DiagRecord> loaded = DBManager.loadDiagRecords(newPatient);
                    if (retainQueuedDiag) {
                        loaded.remove(newDiag);
                    }
                    loaded.sort(new Comparator<DiagRecord>() {
                        @Override
                        public int compare(DiagRecord o1, DiagRecord o2) {
                            //use backup value to get timestamp
                            return o2.date.getBackupValue().compareTo(o1.date.getBackupValue());
                        }
                    });
                    newDiagList.addAll(loaded);
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                diagListViewer.getTable().getDisplay().asyncExec(new Runnable() {
                    @Override
                    public void run() {
                        populate(newPatient, newDiagList);
                    }
                });
            }
        }.start();
    }

    private void populate(Patient newPatient, LinkedList<DiagRecord> newDiagList) {

        currentPatient = newPatient;
        if (currentPatient != null) {
            patientNameLabel.setText(currentPatient.name.getValueAsEditing() + " (" + //$NON-NLS-1$
                    currentPatient.dob.getValueAsEditing() + ")"); //$NON-NLS-1$
        } else {
            patientNameLabel.setText(""); //$NON-NLS-1$
        }
        diagList = newDiagList;
        diagListViewer.setInput(newDiagList.toArray());
    }

    private void createColumn(int width, String caption, ColumnLabelProvider labelProvider) {
        TableViewerColumn col = new TableViewerColumn(diagListViewer, SWT.NONE);
        col.getColumn().setWidth(width);
        col.getColumn().setText(caption);
        col.setLabelProvider(labelProvider);
    }

    @Focus
    public void setFocus() {
        diagListViewer.getTable().setFocus();
    }
}