at.rc.tacos.client.view.DialysisView.java Source code

Java tutorial

Introduction

Here is the source code for at.rc.tacos.client.view.DialysisView.java

Source

/*******************************************************************************
 * Copyright (c) 2008, 2009 Internettechnik, FH JOANNEUM
 * http://www.fh-joanneum.at/itm
 * 
 *    Licenced under the GNU GENERAL PUBLIC LICENSE Version 2;
 *    You may obtain a copy of the License at
 *    http://www.gnu.org/licenses/gpl-2.0.txt
 * 
 * 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 for more details.
 *******************************************************************************/
package at.rc.tacos.client.view;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.part.ViewPart;

import at.rc.tacos.client.controller.DialysisDeleteAction;
import at.rc.tacos.client.controller.DialysisEditAction;
import at.rc.tacos.client.controller.DialysisTransportNowAction;
import at.rc.tacos.client.controller.RefreshViewAction;
import at.rc.tacos.client.modelManager.LockManager;
import at.rc.tacos.client.modelManager.ModelFactory;
import at.rc.tacos.client.providers.DialysisTransportContentProvider;
import at.rc.tacos.client.providers.DialysisTransportLabelProvider;
import at.rc.tacos.client.util.CustomColors;
import at.rc.tacos.client.view.sorterAndTooltip.DialysisTransportSorter;
import at.rc.tacos.model.DialysisPatient;

public class DialysisView extends ViewPart implements PropertyChangeListener {

    public static final String ID = "at.rc.tacos.client.view.dialysis_view";

    // the toolkit to use
    private FormToolkit toolkit;
    private ScrolledForm form;
    private TableViewer viewer;

    // the actions for the context menu
    private DialysisEditAction dialysisEditAction;
    private DialysisDeleteAction dialysisDeleteAction;
    private DialysisTransportNowAction dialysisTransportNowAction;

    // the lock manager
    private LockManager lockManager = ModelFactory.getInstance().getLockManager();

    /**
     * Constructs a new outstanding transports view adds listeners.
     */
    public DialysisView() {
        ModelFactory.getInstance().getDialyseManager().addPropertyChangeListener(this);
        ModelFactory.getInstance().getLockManager().addPropertyChangeListener(this);
    }

    /**
     * Cleanup the view
     */
    @Override
    public void dispose() {
        ModelFactory.getInstance().getDialyseManager().removePropertyChangeListener(this);
        ModelFactory.getInstance().getLockManager().removePropertyChangeListener(this);
    }

    /**
     * Call back method to create the control and initialize them.
     * 
     * @param parent
     *            the parent composite to add
     */
    @Override
    public void createPartControl(final Composite parent) {
        // Create the scrolled parent component
        toolkit = new FormToolkit(CustomColors.FORM_COLOR(parent.getDisplay()));
        form = toolkit.createScrolledForm(parent);
        toolkit.decorateFormHeading(form.getForm());
        form.getBody().setLayout(new FillLayout());

        final Composite composite = form.getBody();

        viewer = new TableViewer(composite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
        viewer.setContentProvider(new DialysisTransportContentProvider());
        viewer.setLabelProvider(new DialysisTransportLabelProvider());
        viewer.setInput(ModelFactory.getInstance().getDialyseManager());
        viewer.getTable().setLinesVisible(true);
        viewer.refresh();

        final Table table_2 = viewer.getTable();
        table_2.setLinesVisible(true);
        table_2.setHeaderVisible(true);

        final TableColumn lockColumn = new TableColumn(table_2, SWT.NONE);
        lockColumn.setToolTipText("Eintrag wird gerade bearbeitet");
        lockColumn.setWidth(24);
        lockColumn.setText("L");

        final TableColumn newColumnTableColumnStationDialyse = new TableColumn(table_2, SWT.NONE);
        newColumnTableColumnStationDialyse.setToolTipText("Zustndige Ortsstelle");
        newColumnTableColumnStationDialyse.setWidth(200);
        newColumnTableColumnStationDialyse.setText("OS");

        final TableColumn newColumnTableColumnAbfDialyse = new TableColumn(table_2, SWT.NONE);
        newColumnTableColumnAbfDialyse.setToolTipText("Geplante Abfahrt an Ortsstelle");
        newColumnTableColumnAbfDialyse.setWidth(68);
        newColumnTableColumnAbfDialyse.setText("Abf");

        final TableColumn newColumnTableColumnAnkDialyse = new TableColumn(table_2, SWT.NONE);
        newColumnTableColumnAnkDialyse.setToolTipText("Geplante Ankunft beim Patienten");
        newColumnTableColumnAnkDialyse.setWidth(68);
        newColumnTableColumnAnkDialyse.setText("Ank");

        final TableColumn newColumnTableColumnTerminDialyse = new TableColumn(table_2, SWT.NONE);
        newColumnTableColumnTerminDialyse.setToolTipText("Termin auf der Dialyse");
        newColumnTableColumnTerminDialyse.setWidth(68);
        newColumnTableColumnTerminDialyse.setText("Termin");

        final TableColumn newColumnTableColumnRTAbfahrtDialyse = new TableColumn(table_2, SWT.NONE);
        newColumnTableColumnRTAbfahrtDialyse.setToolTipText("Abfahrt an der Ortsstelle");
        newColumnTableColumnRTAbfahrtDialyse.setWidth(68);
        newColumnTableColumnRTAbfahrtDialyse.setText("RT Abfahrt");

        final TableColumn newColumnTableColumnAbholbereitDialyse = new TableColumn(table_2, SWT.NONE);
        newColumnTableColumnAbholbereitDialyse.setToolTipText("Patient ist mit Dialyse fertig, abholbereit im LKH");
        newColumnTableColumnAbholbereitDialyse.setWidth(68);
        newColumnTableColumnAbholbereitDialyse.setText("Abholbereit");

        final TableColumn newColumnTableColumnWohnortDialyse = new TableColumn(table_2, SWT.NONE);
        newColumnTableColumnWohnortDialyse.setWidth(250);
        newColumnTableColumnWohnortDialyse.setText("Wohnort");

        final TableColumn newColumnTableColumnNameDialyse = new TableColumn(table_2, SWT.NONE);
        newColumnTableColumnNameDialyse.setWidth(250);
        newColumnTableColumnNameDialyse.setText("Name");

        final TableColumn newColumnTableColumnDialyseort = new TableColumn(table_2, SWT.NONE);
        newColumnTableColumnDialyseort.setWidth(250);
        newColumnTableColumnDialyseort.setText("Dialyseort");

        final TableColumn newColumnTableColumnMontag = new TableColumn(table_2, SWT.NONE);
        newColumnTableColumnMontag.setData("newKey", null);
        newColumnTableColumnMontag.setWidth(30);
        newColumnTableColumnMontag.setText("Mo");

        final TableColumn newColumnTableColumnDienstag = new TableColumn(table_2, SWT.NONE);
        newColumnTableColumnDienstag.setWidth(30);
        newColumnTableColumnDienstag.setText("Di");

        final TableColumn newColumnTableColumnMittwoch = new TableColumn(table_2, SWT.NONE);
        newColumnTableColumnMittwoch.setWidth(30);
        newColumnTableColumnMittwoch.setText("Mi");

        final TableColumn newColumnTableColumnDonnerstag = new TableColumn(table_2, SWT.NONE);
        newColumnTableColumnDonnerstag.setWidth(30);
        newColumnTableColumnDonnerstag.setText("Do");

        final TableColumn newColumnTableColumnFreitag = new TableColumn(table_2, SWT.NONE);
        newColumnTableColumnFreitag.setWidth(30);
        newColumnTableColumnFreitag.setText("Fr");

        final TableColumn newColumnTableColumnSamstag = new TableColumn(table_2, SWT.NONE);
        newColumnTableColumnSamstag.setWidth(30);
        newColumnTableColumnSamstag.setText("Sa");

        final TableColumn newColumnTableColumnSonntag = new TableColumn(table_2, SWT.NONE);
        newColumnTableColumnSonntag.setWidth(30);
        newColumnTableColumnSonntag.setText("So");

        final TableColumn newColumnTableColumnTA = new TableColumn(table_2, SWT.NONE);
        newColumnTableColumnTA.setWidth(90);
        newColumnTableColumnTA.setText("TA");

        final TableColumn newColumnTableColumnStationaer = new TableColumn(table_2, SWT.NONE);
        newColumnTableColumnStationaer.setToolTipText("Patient wird derzeit nicht transportiert");
        newColumnTableColumnStationaer.setWidth(40);
        newColumnTableColumnStationaer.setText("Stat");

        viewer.getTable().addMouseListener(new MouseAdapter() {

            public void mouseDown(MouseEvent e) {
                if (viewer.getTable().getItem(new Point(e.x, e.y)) == null) {
                    viewer.setSelection(new StructuredSelection());
                }
            }
        });

        /** make the columns sort able */
        Listener sortListener = new Listener() {

            public void handleEvent(Event e) {
                // determine new sort column and direction
                TableColumn sortColumn = viewer.getTable().getSortColumn();
                TableColumn currentColumn = (TableColumn) e.widget;
                int dir = viewer.getTable().getSortDirection();
                // revert the sort order if the column is the same
                if (sortColumn == currentColumn) {
                    if (dir == SWT.UP)
                        dir = SWT.DOWN;
                    else
                        dir = SWT.UP;
                } else {
                    viewer.getTable().setSortColumn(currentColumn);
                    dir = SWT.UP;
                }
                // sort the data based on column and direction
                String sortIdentifier = null;

                if (currentColumn == newColumnTableColumnStationDialyse)
                    sortIdentifier = DialysisTransportSorter.RESP_STATION_SORTER;
                if (currentColumn == newColumnTableColumnAbfDialyse)
                    sortIdentifier = DialysisTransportSorter.ABF_SORTER;
                if (currentColumn == newColumnTableColumnAnkDialyse)
                    sortIdentifier = DialysisTransportSorter.AT_PATIENT_SORTER;
                if (currentColumn == newColumnTableColumnTerminDialyse)
                    sortIdentifier = DialysisTransportSorter.TERM_SORTER;
                if (currentColumn == newColumnTableColumnWohnortDialyse)
                    sortIdentifier = DialysisTransportSorter.TRANSPORT_FROM_SORTER;
                if (currentColumn == newColumnTableColumnNameDialyse)
                    sortIdentifier = DialysisTransportSorter.PATIENT_SORTER;
                if (currentColumn == newColumnTableColumnDialyseort)
                    sortIdentifier = DialysisTransportSorter.TRANSPORT_TO_SORTER;
                if (currentColumn == newColumnTableColumnRTAbfahrtDialyse)
                    sortIdentifier = DialysisTransportSorter.RT_SORTER;
                if (currentColumn == newColumnTableColumnAbholbereitDialyse)
                    sortIdentifier = DialysisTransportSorter.READY_SORTER;
                if (currentColumn == newColumnTableColumnTA)
                    sortIdentifier = DialysisTransportSorter.TA_SORTER;
                // apply the filter
                viewer.getTable().setSortDirection(dir);
                viewer.setSorter(new DialysisTransportSorter(sortIdentifier, dir));
            }
        };

        // attach the listener
        newColumnTableColumnStationDialyse.addListener(SWT.Selection, sortListener);
        newColumnTableColumnAbfDialyse.addListener(SWT.Selection, sortListener);
        newColumnTableColumnAnkDialyse.addListener(SWT.Selection, sortListener);
        newColumnTableColumnTerminDialyse.addListener(SWT.Selection, sortListener);
        newColumnTableColumnWohnortDialyse.addListener(SWT.Selection, sortListener);
        newColumnTableColumnNameDialyse.addListener(SWT.Selection, sortListener);
        newColumnTableColumnRTAbfahrtDialyse.addListener(SWT.Selection, sortListener);
        newColumnTableColumnAbholbereitDialyse.addListener(SWT.Selection, sortListener);
        newColumnTableColumnTA.addListener(SWT.Selection, sortListener);
        newColumnTableColumnDialyseort.addListener(SWT.Selection, sortListener);

        makeActions();
        hookContextMenu();
        createToolBarActions();

        viewer.refresh();
    }

    /**
     * Creates the needed actions
     */
    private void makeActions() {
        dialysisEditAction = new DialysisEditAction(viewer);
        dialysisDeleteAction = new DialysisDeleteAction(viewer);
        dialysisTransportNowAction = new DialysisTransportNowAction(viewer);
    }

    /**
     * Creates the context menu
     */
    private void hookContextMenu() {
        MenuManager menuManager = new MenuManager("#DialysisPopupMenu");
        menuManager.setRemoveAllWhenShown(true);
        menuManager.addMenuListener(new IMenuListener() {

            public void menuAboutToShow(IMenuManager manager) {
                fillContextMenu(manager);
            }
        });
        Menu menu = menuManager.createContextMenu(viewer.getControl());
        viewer.getControl().setMenu(menu);
        getSite().registerContextMenu(menuManager, viewer);
    }

    /**
     * Fills the context menu with the actions
     */
    private void fillContextMenu(IMenuManager manager) {
        // get the selected object
        final Object firstSelectedObject = ((IStructuredSelection) viewer.getSelection()).getFirstElement();

        // cast to a dialysis transport
        DialysisPatient dia = (DialysisPatient) firstSelectedObject;

        if (dia == null)
            return;

        // add the actions
        manager.add(dialysisEditAction);
        manager.add(new Separator());
        manager.add(dialysisDeleteAction);
        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
        manager.add(dialysisTransportNowAction);

        if (lockManager.containsLock(DialysisPatient.ID, dia.getId())) {
            dialysisDeleteAction.setEnabled(false);
            dialysisTransportNowAction.setEnabled(false);
        } else {
            dialysisDeleteAction.setEnabled(true);
            dialysisTransportNowAction.setEnabled(true);
        }
    }

    /**
     * Passing the focus request to the viewer's control.
     */
    @Override
    public void setFocus() {
    }

    public void propertyChange(PropertyChangeEvent evt) {
        // the viewer represents simple model. refresh should be enough.
        if ("DIALYSISPATIENT_ADD".equals(evt.getPropertyName())
                || "DIALYSISPATIENT_REMOVE".equals(evt.getPropertyName())
                || "DIALYSISPATIENT_UPDATE".equals(evt.getPropertyName())
                || "DIALYSISPATIENT_CLEARED".equals(evt.getPropertyName())) {
            viewer.refresh();
        }

        // listen to lock changes
        if ("LOCK_ADD".equalsIgnoreCase(evt.getPropertyName())
                || "LOCK_REMOVE".equalsIgnoreCase(evt.getPropertyName())) {
            viewer.refresh();
        }
    }

    /**
     * Creates and adds the actions for the toolbar
     */
    private void createToolBarActions() {
        // create the action
        RefreshViewAction viewAction = new RefreshViewAction(DialysisPatient.ID);
        // add to the toolbar
        form.getToolBarManager().add(viewAction);
        form.getToolBarManager().update(true);
    }
}