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

Java tutorial

Introduction

Here is the source code for at.rc.tacos.client.view.PersonalView.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 java.util.Calendar;

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.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
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.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.part.ViewPart;

import at.rc.tacos.client.controller.PersonalCancelSignInAction;
import at.rc.tacos.client.controller.PersonalCancelSignOutAction;
import at.rc.tacos.client.controller.PersonalDeleteEntryAction;
import at.rc.tacos.client.controller.PersonalEditEntryAction;
import at.rc.tacos.client.controller.PersonalSignInAction;
import at.rc.tacos.client.controller.PersonalSignOutAction;
import at.rc.tacos.client.modelManager.LockManager;
import at.rc.tacos.client.modelManager.ModelFactory;
import at.rc.tacos.client.providers.PersonalDateFilter;
import at.rc.tacos.client.providers.PersonalViewContentProvider;
import at.rc.tacos.client.providers.PersonalViewFilter;
import at.rc.tacos.client.providers.PersonalViewLabelProvider;
import at.rc.tacos.client.util.CustomColors;
import at.rc.tacos.client.view.sorterAndTooltip.PersonalTooltip;
import at.rc.tacos.client.view.sorterAndTooltip.PersonalViewSorter;
import at.rc.tacos.model.Job;
import at.rc.tacos.model.Location;
import at.rc.tacos.model.RosterEntry;
import at.rc.tacos.model.ServiceType;
import at.rc.tacos.model.StaffMember;

public class PersonalView extends ViewPart implements PropertyChangeListener {

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

    // the toolkit to use
    private FormToolkit toolkit;
    private Form form;
    private TableViewer viewer;
    private PersonalTooltip tooltip;
    // the tab folder
    private TabFolder tabFolder;

    // the actions for the context menu
    private PersonalCancelSignInAction cancelSignInAction;
    private PersonalCancelSignOutAction cancelSignOutAction;
    private PersonalSignInAction signInAction;
    private PersonalSignOutAction signOutAction;
    private PersonalEditEntryAction editEntryAction;
    private PersonalDeleteEntryAction deleteEntryAction;

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

    /**
     * Constructs a new personal view.
     */
    public PersonalView() {
        // add listener to model to keep on track.
        ModelFactory.getInstance().getRosterEntryManager().addPropertyChangeListener(this);
        ModelFactory.getInstance().getLocationManager().addPropertyChangeListener(this);
        ModelFactory.getInstance().getVehicleManager().addPropertyChangeListener(this);
        ModelFactory.getInstance().getLockManager().addPropertyChangeListener(this);
        // listen to changes of jobs, serviceTypes and staff member updates
        ModelFactory.getInstance().getStaffManager().addPropertyChangeListener(this);
        ModelFactory.getInstance().getServiceManager().addPropertyChangeListener(this);
        ModelFactory.getInstance().getJobList().addPropertyChangeListener(this);
    }

    /**
     * Cleanup the view
     */
    @Override
    public void dispose() {
        ModelFactory.getInstance().getRosterEntryManager().removePropertyChangeListener(this);
        ModelFactory.getInstance().getLocationManager().removePropertyChangeListener(this);
        ModelFactory.getInstance().getVehicleManager().removePropertyChangeListener(this);
        ModelFactory.getInstance().getLockManager().removePropertyChangeListener(this);
        // remove again
        ModelFactory.getInstance().getStaffManager().removePropertyChangeListener(this);
        ModelFactory.getInstance().getServiceManager().removePropertyChangeListener(this);
        ModelFactory.getInstance().getJobList().removePropertyChangeListener(this);
    }

    /**
     * Callback method to create the control and initalize 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.createForm(parent);
        toolkit.decorateFormHeading(form);
        form.getBody().setLayout(new FillLayout());

        final Composite composite = form.getBody();

        // tab folder
        tabFolder = new TabFolder(composite, SWT.NONE);
        tabFolder.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                // assert valid
                if (e.item.getData() == null)
                    return;
                if (!(e.item.getData() instanceof Location))
                    return;

                // remove all location filter
                for (ViewerFilter filter : viewer.getFilters()) {
                    if (filter instanceof PersonalViewFilter)
                        viewer.removeFilter(filter);
                }

                // cast to a location and apply the new filter
                Location location = (Location) e.item.getData();
                viewer.addFilter(new PersonalViewFilter(location));
            }
        });

        viewer = new TableViewer(tabFolder, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
        viewer.setContentProvider(new PersonalViewContentProvider());
        viewer.setLabelProvider(new PersonalViewLabelProvider());
        viewer.setInput(ModelFactory.getInstance().getRosterEntryManager().toArray());
        viewer.getTable().setLinesVisible(true);

        // set the tooltip
        tooltip = new PersonalTooltip(viewer.getControl());
        // show the tooltip when the selection has changed
        viewer.addSelectionChangedListener(new ISelectionChangedListener() {

            public void selectionChanged(SelectionChangedEvent event) {
                TableItem[] selection = viewer.getTable().getSelection();
                if (selection != null && selection.length > 0) {
                    Rectangle bounds = selection[0].getBounds();
                    tooltip.show(new Point(bounds.x, bounds.y));
                }
            }
        });

        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());
                }
            }
        });
        // sort the table by default
        viewer.setSorter(new PersonalViewSorter(PersonalViewSorter.NAME_SORTER, SWT.UP));
        viewer.addFilter(new PersonalDateFilter(Calendar.getInstance()));

        // create the table for the roster entries
        final Table table = viewer.getTable();
        table.setLinesVisible(true);
        table.setHeaderVisible(true);

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

        final TableColumn columnStandby = new TableColumn(table, SWT.NONE);
        columnStandby.setToolTipText("Mitarbeiter auf Bereitschaft (Symbol, wenn der Fall)");
        columnStandby.setWidth(30);
        columnStandby.setText("B");

        final TableColumn columnNotes = new TableColumn(table, SWT.NONE);
        columnNotes.setToolTipText("Anmerkung (Symbol, wenn Anmerkung vorhanden)");
        columnNotes.setWidth(30);
        columnNotes.setText("A");

        final TableColumn columnStaffName = new TableColumn(table, SWT.NONE);
        columnStaffName.setWidth(130);
        columnStaffName.setText("Name");

        final TableColumn columnWorkTime = new TableColumn(table, SWT.NONE);
        columnWorkTime.setToolTipText("Dienst lt. Dienstplan");
        columnWorkTime.setWidth(120);
        columnWorkTime.setText("Dienst");

        final TableColumn columnCheckin = new TableColumn(table, SWT.NONE);
        columnCheckin.setToolTipText("Zeit der tatschlichen Anmeldung");
        columnCheckin.setWidth(70);
        columnCheckin.setText("Anm");

        final TableColumn columnCheckout = new TableColumn(table, SWT.NONE);
        columnCheckout.setToolTipText("Zeit der tatschlichen Abmeldung");
        columnCheckout.setWidth(70);
        columnCheckout.setText("Abm");

        final TableColumn columnService = new TableColumn(table, SWT.NONE);
        columnService.setToolTipText("Dienstverhltnis");
        columnService.setWidth(90);
        columnService.setText("DV");

        final TableColumn columnJob = new TableColumn(table, SWT.NONE);
        columnJob.setToolTipText("Verwendung");
        columnJob.setWidth(80);
        columnJob.setText("V");

        final TableColumn columnVehicle = new TableColumn(table, SWT.NONE);
        columnVehicle.setToolTipText("Fahrzeug, dem der Mitarbeiter zugewiesen ist");
        columnVehicle.setWidth(55);
        columnVehicle.setText("Fzg");

        // make the columns sortable
        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 sortorder 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 == columnStaffName)
                    sortIdentifier = PersonalViewSorter.NAME_SORTER;
                if (currentColumn == columnWorkTime)
                    sortIdentifier = PersonalViewSorter.WORKTIME_SORTER;
                if (currentColumn == columnCheckin)
                    sortIdentifier = PersonalViewSorter.CHECKIN_SORTER;
                if (currentColumn == columnCheckout)
                    sortIdentifier = PersonalViewSorter.CHECKOUT_SORTER;
                if (currentColumn == columnService)
                    sortIdentifier = PersonalViewSorter.SERVICE_SORTER;
                if (currentColumn == columnJob)
                    sortIdentifier = PersonalViewSorter.JOB_SORTER;
                // apply the filter
                viewer.getTable().setSortDirection(dir);
                viewer.setSorter(new PersonalViewSorter(sortIdentifier, dir));
            }
        };

        // attach the listener
        columnStaffName.addListener(SWT.Selection, sortListener);
        columnWorkTime.addListener(SWT.Selection, sortListener);
        columnCheckin.addListener(SWT.Selection, sortListener);
        columnCheckout.addListener(SWT.Selection, sortListener);
        columnService.addListener(SWT.Selection, sortListener);
        columnJob.addListener(SWT.Selection, sortListener);

        // create the actions
        makeActions();
        hookContextMenu();

        // load the data
        loadData();
    }

    /**
     * Loads the data from the model
     */
    public void loadData() {
        ModelFactory.getInstance().getLocationManager().initViews(this);
        ModelFactory.getInstance().getVehicleManager().initViews(this);
        ModelFactory.getInstance().getRosterEntryManager().initViews(this);
    }

    /**
     * Creates the needed actions
     */
    private void makeActions() {
        cancelSignInAction = new PersonalCancelSignInAction(this.viewer);
        cancelSignOutAction = new PersonalCancelSignOutAction(this.viewer);
        signInAction = new PersonalSignInAction(this.viewer);
        signOutAction = new PersonalSignOutAction(this.viewer);
        editEntryAction = new PersonalEditEntryAction(this.viewer);
        deleteEntryAction = new PersonalDeleteEntryAction(this.viewer);
    }

    /**
     * Creates the context menue
     */
    private void hookContextMenu() {
        MenuManager menuManager = new MenuManager("#PersonalPopupMenu");
        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 RosterEntry
        RosterEntry entry = (RosterEntry) firstSelectedObject;

        if (entry == null)
            return;

        // add the actions
        manager.add(signInAction);
        manager.add(signOutAction);
        manager.add(new Separator());
        manager.add(editEntryAction);
        manager.add(deleteEntryAction);
        manager.add(new Separator());
        manager.add(cancelSignInAction);
        manager.add(cancelSignOutAction);
        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));

        // default
        signInAction.setEnabled(true);
        signOutAction.setEnabled(true);
        deleteEntryAction.setEnabled(true);
        cancelSignInAction.setEnabled(true);
        cancelSignOutAction.setEnabled(true);

        // enable or disable the actions
        if (entry.getRealStartOfWork() > 0) {
            signInAction.setEnabled(false);
            cancelSignInAction.setEnabled(true);
        } else {
            signInAction.setEnabled(true);
            cancelSignInAction.setEnabled(false);
        }
        if (entry.getRealEndOfWork() > 0) {
            signOutAction.setEnabled(false);
            cancelSignOutAction.setEnabled(true);
        } else {
            signOutAction.setEnabled(true);
            cancelSignOutAction.setEnabled(false);
        }

        // disable actions if the vehicle is locked
        if (lockManager.containsLock(RosterEntry.ID, entry.getRosterId())) {
            signInAction.setEnabled(false);
            signOutAction.setEnabled(false);
            deleteEntryAction.setEnabled(false);
            cancelSignInAction.setEnabled(false);
            cancelSignOutAction.setEnabled(false);
        }
    }

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

    public void propertyChange(PropertyChangeEvent evt) {
        // add a new tab item to the TabFolder
        if ("LOCATION_ADD".equalsIgnoreCase(evt.getPropertyName())) {
            // get the new location
            Location location = (Location) evt.getNewValue();
            // create a new tab item
            TabItem tabItem = new TabItem(tabFolder, SWT.NONE);
            tabItem.setText(location.getLocationName());
            // Store the location
            tabItem.setData(location);
            tabItem.setControl(viewer.getTable());
            tabFolder.setSelection(1);
            tabFolder.setSelection(0);

            // set the default filter to the first location
            if (location.getId() == 1)
                viewer.addFilter(new PersonalViewFilter(location));
        }
        // update the TabItem
        if ("LOCATION_UPDATE".equalsIgnoreCase(evt.getPropertyName())) {
            // the updated location
            Location updatedLocation = (Location) evt.getNewValue();

            // loop and update the location in the tab folder
            for (TabItem tabItem : tabFolder.getItems()) {
                // get the location out of the tab
                Location tabLocation = (Location) tabItem.getData();
                // check if we have the location
                if (tabLocation.equals(updatedLocation)) {
                    // store the new location in the data and update the tab
                    // text
                    tabItem.setData(updatedLocation);
                    tabItem.setText(updatedLocation.getLocationName());
                }
            }
        }
        // remove a specific location
        if ("LOCATION_REMOVE".equalsIgnoreCase(evt.getPropertyName())) {
            // get the removed location
            Location removedLocation = (Location) evt.getOldValue();

            // loop and remove the location
            for (TabItem tabItem : tabFolder.getItems()) {
                // get the location out of the tab
                Location tabLocation = (Location) tabItem.getData();
                // check if we have the tab and dispose it
                if (tabLocation.equals(removedLocation))
                    tabItem.dispose();
            }
        }

        // clear the locations
        if ("LOCATION_CLEARED".equalsIgnoreCase(evt.getPropertyName())) {
            // loop and remove all tabs
            for (TabItem tabItem : tabFolder.getItems())
                tabItem.dispose();
        }

        // add the new element to the viewer
        if ("ROSTERENTRY_ADD".equals(evt.getPropertyName())) {
            // get the new added entry
            RosterEntry entry = (RosterEntry) evt.getNewValue();
            viewer.add(entry);
        }
        // update the existing element
        if ("ROSTERENTRY_UPDATE".equals(evt.getPropertyName())) {
            // get the updated element
            RosterEntry entry = (RosterEntry) evt.getNewValue();
            viewer.refresh(entry, true);
        }
        // remove the single entry
        if ("ROSTERENTRY_REMOVE".equals(evt.getPropertyName())) {
            // get the removed element
            RosterEntry entry = (RosterEntry) evt.getOldValue();
            viewer.remove(entry);
        }
        // refresh the complete table
        if ("ROSTERENTRY_CLEARED".equals(evt.getPropertyName())) {
            viewer.refresh();
        }

        // update the staff member when it is changed
        if ("STAFF_UPDATE".equalsIgnoreCase(evt.getPropertyName())
                || "SERVICETYPE_UPDATE".equalsIgnoreCase(evt.getPropertyName())
                || "JOB_UPDATE".equalsIgnoreCase(evt.getPropertyName())) {
            // the three types
            Object updatedObject = evt.getNewValue();
            StaffMember updatedMember = null;
            Job updatedJob = null;
            ServiceType updatedService = null;

            // check the type
            if (updatedObject instanceof StaffMember)
                updatedMember = (StaffMember) updatedObject;
            if (updatedObject instanceof Job)
                updatedJob = (Job) updatedObject;
            if (updatedObject instanceof ServiceType)
                updatedService = (ServiceType) updatedObject;
            // loop over each roster entry
            for (RosterEntry entry : ModelFactory.getInstance().getRosterEntryManager().getRosterList()) {
                if (updatedMember != null && entry.getStaffMember().equals(updatedMember))
                    entry.setStaffMember(updatedMember);
                if (updatedJob != null && entry.getJob().equals(updatedJob))
                    entry.setJob(updatedJob);
                if (updatedService != null && entry.getServicetype().equals(updatedService))
                    entry.setServicetype(updatedService);
                // update the entry
            }
            viewer.refresh();
        }
        // update the assigned vehicle of the staff member
        if ("VEHICLE_ADD".equalsIgnoreCase(evt.getPropertyName())
                || "VEHICLE_UPDATE".equalsIgnoreCase(evt.getPropertyName())
                || "VEHICLE_CLEAR".equalsIgnoreCase(evt.getPropertyName())
                || "VEHICLE_REMOVE".equalsIgnoreCase(evt.getPropertyName())
                || "VEHICLE_ADD_ALL".equalsIgnoreCase(evt.getPropertyName())) {
            viewer.refresh();
        }

        // listen to changes of the date to set up the filter
        if ("ROSTER_DATE_CHANGED".equalsIgnoreCase(evt.getPropertyName())) {
            Calendar newDate = (Calendar) evt.getNewValue();

            // remove all date filter
            for (ViewerFilter filter : viewer.getFilters()) {
                if (filter instanceof PersonalDateFilter)
                    viewer.removeFilter(filter);
            }
            // apply the new date filter
            viewer.addFilter(new PersonalDateFilter(newDate));
        }
        // listen to lock changes
        if ("LOCK_ADD".equalsIgnoreCase(evt.getPropertyName())
                || "LOCK_REMOVE".equalsIgnoreCase(evt.getPropertyName())) {
            viewer.refresh();
        }
    }
}