ch.elexis.core.ui.views.ReminderView.java Source code

Java tutorial

Introduction

Here is the source code for ch.elexis.core.ui.views.ReminderView.java

Source

/*******************************************************************************
 * Copyright (c) 2006-2010, G. Weirich and Elexis
 * 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:
 *    G. Weirich - initial implementation
 *    
 *******************************************************************************/
package ch.elexis.core.ui.views;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;

import org.apache.commons.lang3.StringUtils;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.resource.FontDescriptor;
import org.eclipse.jface.viewers.IColorProvider;
import org.eclipse.jface.viewers.IFontProvider;
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.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.part.ViewPart;

import ch.elexis.admin.AccessControlDefaults;
import ch.elexis.core.constants.Preferences;
import ch.elexis.core.constants.StringConstants;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.data.events.ElexisEvent;
import ch.elexis.core.data.events.ElexisEventDispatcher;
import ch.elexis.core.data.events.ElexisEventListener;
import ch.elexis.core.data.events.Heartbeat.HeartListener;
import ch.elexis.core.lock.types.LockResponse;
import ch.elexis.core.model.issue.Priority;
import ch.elexis.core.model.issue.ProcessStatus;
import ch.elexis.core.model.issue.Type;
import ch.elexis.core.model.issue.Visibility;
import ch.elexis.core.ui.UiDesk;
import ch.elexis.core.ui.actions.GlobalEventDispatcher;
import ch.elexis.core.ui.actions.IActivationListener;
import ch.elexis.core.ui.actions.RestrictedAction;
import ch.elexis.core.ui.dialogs.ReminderDetailDialog;
import ch.elexis.core.ui.events.ElexisUiEventListenerImpl;
import ch.elexis.core.ui.icons.Images;
import ch.elexis.core.ui.locks.AcquireLockBlockingUi;
import ch.elexis.core.ui.locks.ILockHandler;
import ch.elexis.core.ui.locks.LockResponseHelper;
import ch.elexis.core.ui.util.SWTHelper;
import ch.elexis.core.ui.util.ViewMenus;
import ch.elexis.core.ui.util.viewers.CommonContentProviderAdapter;
import ch.elexis.core.ui.util.viewers.CommonViewer;
import ch.elexis.core.ui.util.viewers.DefaultLabelProvider;
import ch.elexis.core.ui.util.viewers.SimpleWidgetProvider;
import ch.elexis.core.ui.util.viewers.ViewerConfigurer;
import ch.elexis.core.ui.views.reminder.ReminderStatusSubMenu;
import ch.elexis.data.Anwender;
import ch.elexis.data.Patient;
import ch.elexis.data.PersistentObject;
import ch.elexis.data.Query;
import ch.elexis.data.Reminder;
import ch.rgw.io.Settings;
import ch.rgw.tools.TimeTool;

public class ReminderView extends ViewPart implements IActivationListener, HeartListener {

    public static final String ID = "ch.elexis.reminderview"; //$NON-NLS-1$

    private IAction newReminderAction, deleteReminderAction, showOnlyOwnDueReminderToggleAction,
            showSelfCreatedReminderAction, toggleAutoSelectPatientAction, reloadAction;
    private IAction sortByDueDate;
    private RestrictedAction showOthersRemindersAction;
    private RestrictedAction selectPatientAction;
    private boolean bVisible;

    private ReminderLabelProvider reminderLabelProvider = new ReminderLabelProvider();

    private IAction filterActionType[] = new IAction[Type.values().length];
    private Set<Integer> filterActionSet = new HashSet<Integer>();

    private long cvHighestLastUpdate = 0l;

    private boolean autoSelectPatient = CoreHub.userCfg.get(Preferences.USR_REMINDER_AUTO_SELECT_PATIENT, false);
    private boolean showOnlyDueReminders = CoreHub.userCfg.get(Preferences.USR_REMINDERSOPEN, false);
    private boolean showAllReminders = (CoreHub.userCfg.get(Preferences.USR_REMINDEROTHERS, false)
            && CoreHub.acl.request(AccessControlDefaults.ADMIN_VIEW_ALL_REMINDERS));
    private boolean showSelfCreatedReminders = CoreHub.userCfg.get(Preferences.USR_REMINDEROWN, false);

    private CommonViewer cv = new CommonViewer();
    private ViewerConfigurer vc;
    private Query<Reminder> qbe;
    private ReminderFilter filter = new ReminderFilter();
    private Patient actPatient;
    private Text txtSearch;

    private ElexisEventListener eeli_reminder = new ElexisUiEventListenerImpl(Reminder.class,
            ElexisEvent.EVENT_RELOAD | ElexisEvent.EVENT_CREATE | ElexisEvent.EVENT_UPDATE) {
        public void catchElexisEvent(ElexisEvent ev) {
            cv.notify(CommonViewer.Message.update);
        }
    };

    // 1079 - nur wenn der View offen ist werden bei Patienten-Wechsel die Reminders abgefragt!
    private ElexisEventListener eeli_pat = new ElexisUiEventListenerImpl(Patient.class) {

        public void runInUi(final ElexisEvent ev) {
            if (((Patient) ev.getObject()).equals(actPatient)) {
                return;
            }
            actPatient = (Patient) ev.getObject();
            // clear selection before update
            cv.getViewerWidget().setSelection(StructuredSelection.EMPTY);

            if (bVisible) {
                cv.notify(CommonViewer.Message.update);
            }
            /**
             * ch.elexis.core.data.events.PatientEventListener will be called on opposite
             * Preferences.USR_SHOWPATCHGREMINDER condition.
             */
            if (!CoreHub.userCfg.get(Preferences.USR_SHOWPATCHGREMINDER, true)) {
                UiDesk.asyncExec(new Runnable() {

                    public void run() {
                        List<Reminder> list = Reminder.findOpenRemindersResponsibleFor(CoreHub.actUser, false,
                                (Patient) ev.getObject(), true);
                        if (list.size() != 0) {
                            StringBuilder sb = new StringBuilder();
                            for (Reminder r : list) {
                                sb.append(r.getSubject() + "\n");
                                sb.append(r.getMessage() + "\n\n");
                            }
                            SWTHelper.alert(Messages.ReminderView_importantRemindersCaption, sb.toString());
                        }
                    }
                });
            }
        }
    };

    private ElexisEventListener eeli_user = new ElexisUiEventListenerImpl(Anwender.class,
            ElexisEvent.EVENT_USER_CHANGED) {

        public void runInUi(ElexisEvent ev) {
            refreshUserConfiguration();

            if (bVisible) {
                cv.notify(CommonViewer.Message.update);
            }

        }
    };

    public ReminderView() {
        qbe = new Query<>(Reminder.class, null, null, Reminder.TABLENAME,
                new String[] { Reminder.FLD_DUE, Reminder.FLD_PRIORITY, Reminder.FLD_ACTION_TYPE });
    }

    @Override
    public void createPartControl(final Composite parent) {
        Composite content = new Composite(parent, SWT.NONE);
        content.setLayout(new GridLayout(1, false));
        Composite header = new Composite(content, SWT.NONE);
        GridLayout gl_header = new GridLayout(2, false);
        gl_header.horizontalSpacing = 0;
        gl_header.marginWidth = 0;
        gl_header.marginHeight = 0;
        header.setLayout(gl_header);
        header.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

        txtSearch = new Text(header, SWT.SEARCH);
        txtSearch.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        txtSearch.setMessage(Messages.ReminderView_txtSearch_message);
        txtSearch.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                filter.setFilterText(txtSearch.getText());
                cv.notify(CommonViewer.Message.update_keeplabels);
            }
        });

        Label btnClear = new Label(header, SWT.NONE);
        btnClear.setImage(Images.IMG_CLEAR.getImage());
        btnClear.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseDown(MouseEvent e) {
                txtSearch.setText(StringConstants.EMPTY);
                filter.setFilterText(null);
                cv.notify(CommonViewer.Message.update_keeplabels);
            }
        });

        reminderLabelProvider.updateUserConfiguration();

        ReminderViewCommonContentProvider contentProvider = new ReminderViewCommonContentProvider();
        vc = new ViewerConfigurer(contentProvider, reminderLabelProvider, null,
                new ViewerConfigurer.DefaultButtonProvider(),
                new SimpleWidgetProvider(SimpleWidgetProvider.TYPE_LAZYLIST, SWT.MULTI, cv));

        makeActions(contentProvider);

        ViewMenus menu = new ViewMenus(getViewSite());
        menu.createToolbar(reloadAction, newReminderAction, toggleAutoSelectPatientAction);
        menu.createMenu(createActionList());

        if (CoreHub.acl.request(AccessControlDefaults.ADMIN_VIEW_ALL_REMINDERS)) {
            showOthersRemindersAction.setEnabled(true);
            showOthersRemindersAction.setChecked(CoreHub.userCfg.get(Preferences.USR_REMINDEROTHERS, false));
        } else {
            showOthersRemindersAction.setEnabled(false);
        }
        cv.create(vc, content, SWT.NONE, getViewSite());
        cv.addDoubleClickListener(new CommonViewer.DoubleClickListener() {
            public void doubleClicked(final PersistentObject obj, final CommonViewer cv) {
                Reminder reminder = (Reminder) obj;
                AcquireLockBlockingUi.aquireAndRun(reminder, new ILockHandler() {
                    @Override
                    public void lockAcquired() {
                        ReminderDetailDialog rdd = new ReminderDetailDialog(UiDesk.getTopShell(), (Reminder) obj);
                        int retVal = rdd.open();
                        if (retVal == Dialog.OK) {
                            ElexisEventDispatcher.getInstance()
                                    .fire(new ElexisEvent(reminder, getClass(), ElexisEvent.EVENT_UPDATE));
                        }
                    }

                    @Override
                    public void lockFailed() {
                        cv.notify(CommonViewer.Message.update);
                    }
                });

            }
        });

        List<IContributionItem> popupMenuActionList = new ArrayList<>();
        popupMenuActionList.add(new ReminderStatusSubMenu(cv));
        popupMenuActionList.add(new ActionContributionItem(deleteReminderAction));
        popupMenuActionList.add(new ActionContributionItem(selectPatientAction));
        popupMenuActionList.add(new Separator());
        popupMenuActionList.addAll(createActionList());
        menu.createViewerContextMenu(cv.getViewerWidget(), popupMenuActionList);
        cv.getViewerWidget().addFilter(filter);
        GlobalEventDispatcher.addActivationListener(this, getViewSite().getPart());

        cv.getViewerWidget().addSelectionChangedListener(new ISelectionChangedListener() {

            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                selectPatientAction.setEnabled(selection.size() <= 1);
                selectPatientAction.reflectRight();
                if (autoSelectPatient && selectPatientAction.isEnabled()) {
                    selectPatientAction.doRun();
                }
            }
        });
    }

    private List<IContributionItem> createActionList() {
        Action labelFilter = new Action("Anzeige filtern") {
        };
        labelFilter.setEnabled(false);

        Action labelResponsibility = new Action("Anzeige erweitern") {
        };
        labelResponsibility.setEnabled(false);

        Action labelSorter = new Action("Anzeige sortieren") {
        };
        labelSorter.setEnabled(false);

        MenuManager typeFilterSubMenu = new MenuManager("Nach Aktionstyp");
        List<IContributionItem> ca = ViewMenus.convertActionsToContributionItems((filterActionType));
        for (IContributionItem iContributionItem : ca) {
            typeFilterSubMenu.add(iContributionItem);
        }
        return Arrays.asList(new ActionContributionItem(newReminderAction), null,
                new ActionContributionItem(labelSorter), new ActionContributionItem(sortByDueDate), null,
                new ActionContributionItem(labelFilter),
                new ActionContributionItem(showOnlyOwnDueReminderToggleAction), typeFilterSubMenu, null,
                new ActionContributionItem(labelResponsibility),
                new ActionContributionItem(showSelfCreatedReminderAction),
                new ActionContributionItem(showOthersRemindersAction), null);
    }

    private void refreshUserConfiguration() {
        boolean bChecked = CoreHub.userCfg.get(Preferences.USR_REMINDERSOPEN, true);
        showOnlyOwnDueReminderToggleAction.setChecked(bChecked);
        showSelfCreatedReminderAction.setChecked(CoreHub.userCfg.get(Preferences.USR_REMINDEROWN, false));
        toggleAutoSelectPatientAction
                .setChecked(CoreHub.userCfg.get(Preferences.USR_REMINDER_AUTO_SELECT_PATIENT, false));

        // get state from user's configuration
        showOthersRemindersAction.setChecked(CoreHub.userCfg.get(Preferences.USR_REMINDEROTHERS, false));

        // update action's access rights
        showOthersRemindersAction.reflectRight();

        reminderLabelProvider.updateUserConfiguration();
    }

    @Override
    public void setFocus() {
    }

    @Override
    public void dispose() {
        GlobalEventDispatcher.removeActivationListener(this, getViewSite().getPart());
        CoreHub.userCfg.set(Preferences.USR_REMINDERSOPEN, showOnlyOwnDueReminderToggleAction.isChecked());
    }

    private Images determineActionTypeImage(Type actionType) {
        switch (actionType) {
        case PRINT:
        case PRINT_DRUG_STICKER:
            return Images.IMG_PRINTER;
        case MAKE_APPOINTMENT:
            return Images.IMG_CALENDAR;
        case DISPENSE_MEDICATION:
            return Images.IMG_PILL;
        case PROCESS_SERVICE_RECORDING:
            return Images.IMG_MONEY;
        case CHECK_LAB_RESULT:
        case READ_DOCUMENT:
            return Images.IMG_EYE_WO_SHADOW;
        case SEND_DOCUMENT:
            return Images.IMG_MAIL_SEND;
        default:
            return Images.IMG_EMPTY_TRANSPARENT;
        }
    }

    private void makeActions(final ReminderViewCommonContentProvider contentProvider) {
        newReminderAction = new Action(Messages.ReminderView_newReminderAction) { //$NON-NLS-1$
            {
                setImageDescriptor(Images.IMG_NEW.getImageDescriptor());
                setToolTipText(Messages.ReminderView_newReminderToolTip); //$NON-NLS-1$
            }

            @Override
            public void run() {
                ReminderDetailDialog erd = new ReminderDetailDialog(getViewSite().getShell(), null);
                int retVal = erd.open();
                if (retVal == Dialog.OK) {
                    Reminder reminder = erd.getReminder();
                    CoreHub.getLocalLockService().acquireLock(reminder);
                    CoreHub.getLocalLockService().releaseLock(reminder);
                }
                cv.notify(CommonViewer.Message.update_keeplabels);
            }
        };
        deleteReminderAction = new Action(Messages.ReminderView_deleteAction) {
            {
                setImageDescriptor(Images.IMG_DELETE.getImageDescriptor());
                setToolTipText(Messages.ReminderView_deleteToolTip);
            }

            @Override
            public void run() {
                Object[] selections = cv.getSelection();
                if (selections != null && selections.length == 1 && selections[0] instanceof Reminder) {
                    Reminder r = (Reminder) selections[0];
                    LockResponse lockResponse = CoreHub.getLocalLockService().acquireLock(r);
                    if (lockResponse.isOk()) {
                        r.delete();
                        CoreHub.getLocalLockService().releaseLock(r);
                    } else {
                        LockResponseHelper.showInfo(lockResponse, r, null);
                    }

                    cv.notify(CommonViewer.Message.update_keeplabels);
                }
            }

            @Override
            public boolean isEnabled() {
                Object[] sel = cv.getSelection();
                return (sel != null && sel.length == 1 && sel[0] instanceof Reminder);
            }
        };
        sortByDueDate = new Action("by due date", Action.AS_CHECK_BOX) {

            int state = 0;

            @Override
            public void run() {

                if (state == 0) {
                    contentProvider.setComparator(new Comparator<Reminder>() {
                        @Override
                        public int compare(Reminder o1, Reminder o2) {
                            return TimeTool.compare(o2.getDateDue(), o1.getDateDue());
                        }
                    });
                    state = 1;
                    sortByDueDate.setText("by due date ascending");
                    sortByDueDate.setChecked(true);
                } else if (state == 1) {
                    contentProvider.setComparator(new Comparator<Reminder>() {
                        @Override
                        public int compare(Reminder o1, Reminder o2) {
                            return TimeTool.compare(o1.getDateDue(), o2.getDateDue());
                        }
                    });
                    state = 2;
                    sortByDueDate.setText("by due date descending");
                    sortByDueDate.setChecked(true);
                } else if (state == 2) {
                    contentProvider.setComparator(null);
                    state = 0;
                    sortByDueDate.setText("by due date");
                    sortByDueDate.setChecked(false);
                }

                cv.notify(CommonViewer.Message.update_keeplabels);
            }
        };

        showOnlyOwnDueReminderToggleAction = new Action(Messages.ReminderView_onlyDueAction, Action.AS_CHECK_BOX) { //$NON-NLS-1$
            {
                setToolTipText(Messages.ReminderView_onlyDueToolTip); //$NON-NLS-1$
            }

            @Override
            public void run() {
                showOnlyDueReminders = showOnlyOwnDueReminderToggleAction.isChecked();
                CoreHub.userCfg.set(Preferences.USR_REMINDERSOPEN, showOnlyDueReminders);
                cv.notify(CommonViewer.Message.update_keeplabels);
            }
        };
        showSelfCreatedReminderAction = new Action(Messages.ReminderView_myRemindersAction, Action.AS_CHECK_BOX) { //$NON-NLS-1$
            {
                setToolTipText(Messages.ReminderView_myRemindersToolTip); //$NON-NLS-1$
            }

            @Override
            public void run() {
                showSelfCreatedReminders = showSelfCreatedReminderAction.isChecked();
                CoreHub.userCfg.set(Preferences.USR_REMINDEROWN, showSelfCreatedReminders);
                cv.notify(CommonViewer.Message.update_keeplabels);
            }
        };
        showOthersRemindersAction = new RestrictedAction(AccessControlDefaults.ADMIN_VIEW_ALL_REMINDERS,
                Messages.ReminderView_foreignAction, Action.AS_CHECK_BOX) {
            {
                setToolTipText(Messages.ReminderView_foreignTooltip);
                setImageDescriptor(Images.IMG_ACHTUNG.getImageDescriptor());
            }

            @Override
            public void doRun() {
                showAllReminders = showOthersRemindersAction.isChecked();
                CoreHub.userCfg.set(Preferences.USR_REMINDEROTHERS, showAllReminders);
                cv.notify(CommonViewer.Message.update_keeplabels);
            }
        };

        selectPatientAction = new RestrictedAction(AccessControlDefaults.PATIENT_DISPLAY,
                Messages.ReminderView_activatePatientAction, Action.AS_UNSPECIFIED) {
            {
                setImageDescriptor(Images.IMG_PERSON.getImageDescriptor());
                setToolTipText(Messages.ReminderView_activatePatientTooltip);
            }

            public void doRun() {
                Object[] sel = cv.getSelection();
                if (sel != null && sel.length > 1) {
                    SWTHelper.showInfo(Messages.ReminderView_onePatOnly,
                            Messages.ReminderView_onlyOnePatientForActivation);
                } else if (sel != null && sel.length > 0) {
                    Reminder reminder = (Reminder) sel[0];
                    Patient patient = reminder.getKontakt();
                    Anwender creator = reminder.getCreator();
                    if (patient != null) {
                        if (!patient.getId().equals(creator.getId())) {
                            ElexisEventDispatcher.fireSelectionEvent(patient);
                        }
                    }
                }
            }

            @Override
            public boolean isEnabled() {
                Object[] sel = cv.getSelection();
                if (sel != null && sel.length == 1 && sel[0] instanceof Reminder) {
                    Reminder reminder = (Reminder) sel[0];
                    return reminder.isPatientRelated();
                }
                return false;
            }
        };

        toggleAutoSelectPatientAction = new Action(Messages.ReminderView_activatePatientAction,
                Action.AS_CHECK_BOX) {
            {
                setImageDescriptor(Images.IMG_PERSON.getImageDescriptor());
                setToolTipText(Messages.ReminderView_toggleSelectPatientActionTooltip);
                setChecked(autoSelectPatient);
            }

            @Override
            public void run() {
                autoSelectPatient = toggleAutoSelectPatientAction.isChecked();
                CoreHub.userCfg.set(Preferences.USR_REMINDER_AUTO_SELECT_PATIENT, autoSelectPatient);
            }
        };

        reloadAction = new Action(Messages.PatHeuteView_reloadAction) { //$NON-NLS-1$
            {
                setImageDescriptor(Images.IMG_REFRESH.getImageDescriptor());
                setToolTipText(Messages.PatHeuteView_reloadToolTip); //$NON-NLS-1$
            }

            @Override
            public void run() {
                heartbeat();
            }
        };

        for (int i = 0; i < Type.values().length; i++) {
            Type type = Type.values()[i];
            filterActionType[i] = new Action(type.getLocaleText(), Action.AS_CHECK_BOX) {
                @Override
                public void run() {
                    if (isChecked()) {
                        filterActionSet.add(type.numericValue());
                    } else {
                        filterActionSet.remove(type.numericValue());
                    }
                    cv.notify(CommonViewer.Message.update_keeplabels);
                }
            };
            filterActionType[i].setChecked(filterActionSet.contains(type.numericValue()));
            filterActionType[i].setImageDescriptor(determineActionTypeImage(type).getImageDescriptor());
        }
    }

    public void activation(final boolean mode) {
        /* egal */
    }

    public void visible(final boolean mode) {
        bVisible = mode;
        if (mode) {
            ElexisEventDispatcher.getInstance().addListeners(eeli_pat, eeli_user, eeli_reminder);
            CoreHub.heart.addListener(this);
            heartbeat();
            refreshUserConfiguration();
        } else {
            ElexisEventDispatcher.getInstance().removeListeners(eeli_pat, eeli_user, eeli_reminder);
            CoreHub.heart.removeListener(this);
        }
    }

    public void heartbeat() {
        long highestLastUpdate = PersistentObject.getHighestLastUpdate(Reminder.TABLENAME);
        if (highestLastUpdate > cvHighestLastUpdate) {
            cv.notify(CommonViewer.Message.update);
            cvHighestLastUpdate = highestLastUpdate;
        }
    }

    private class ReminderLabelProvider extends DefaultLabelProvider implements IColorProvider, IFontProvider {

        private Font boldFont;
        private Color colorDue;
        private Color colorOverdue;
        private Color colorOpen;

        public Color getBackground(final Object element) {
            if (element instanceof Reminder) {
                Reminder reminder = (Reminder) element;
                switch (reminder.getDueState()) {
                case 1:
                    return colorDue;
                case 2:
                    return colorOverdue;
                default:
                    ProcessStatus processStatus = reminder.getProcessStatus();
                    if (ProcessStatus.OPEN == processStatus) {
                        return colorOpen;
                    }
                    return null;
                }
            }
            return UiDesk.getColor(UiDesk.COL_BLACK);
        }

        public void updateUserConfiguration() {
            Settings cfg = CoreHub.userCfg.getBranch(Preferences.USR_REMINDERCOLORS, true);
            colorDue = UiDesk.getColorFromRGB(cfg.get(ProcessStatus.DUE.getLocaleText(), "FFFFFF")); //$NON-NLS-1$;
            colorOverdue = UiDesk.getColorFromRGB(cfg.get(ProcessStatus.OVERDUE.getLocaleText(), "FF0000")); //$NON-NLS-1$
            colorOpen = UiDesk.getColorFromRGB(cfg.get(ProcessStatus.OPEN.getLocaleText(), "00FF00")); //$NON-NLS-1$
        }

        public Color getForeground(final Object element) {
            if (element instanceof Reminder) {
                Reminder reminder = (Reminder) element;
                Priority prio = reminder.getPriority();
                if (Priority.LOW == prio) {
                    return UiDesk.getColor(UiDesk.COL_GREY);
                }
                return null;
            }

            return UiDesk.getColor(UiDesk.COL_WHITE);
        }

        @Override
        public Image getColumnImage(Object element, int columnIndex) {
            if (element instanceof Reminder) {
                Reminder reminder = (Reminder) element;

                ProcessStatus status = reminder.getStatus();
                if (ProcessStatus.CLOSED == status) {
                    return Images.IMG_TICK.getImage();
                }

                Type actionType = reminder.getActionType();
                return determineActionTypeImage(actionType).getImage();
            }
            return null;
        }

        @Override
        public String getColumnText(Object element, int column) {
            if (element instanceof Reminder) {
                Reminder reminder = (Reminder) element;
                ProcessStatus status = reminder.getStatus();
                if (ProcessStatus.ON_HOLD == status) {
                    return "[" + status.getLocaleText() + "] " + super.getText(element);
                }
            }
            return super.getText(element);
        }

        @Override
        public Font getFont(Object element) {
            if (element instanceof Reminder) {
                Reminder reminder = (Reminder) element;
                if (boldFont == null) {
                    Display disp = Display.getCurrent();
                    Font defaultFont = cv.getViewerWidget().getControl().getFont();
                    FontDescriptor boldDescriptor = FontDescriptor.createFrom(defaultFont).setStyle(SWT.BOLD);
                    boldFont = boldDescriptor.createFont(disp);
                }
                Priority prio = reminder.getPriority();
                if (Priority.HIGH == prio) {
                    return boldFont;
                }
            }
            return null;
        }
    }

    private class ReminderFilter extends ViewerFilter {

        private String filterText;

        @Override
        public boolean select(final Viewer viewer, final Object parentElement, final Object element) {

            if (element instanceof Reminder) {
                Reminder check = (Reminder) element;
                if (showOnlyOwnDueReminderToggleAction.isChecked()) {
                    int determineDueState = Reminder.determineDueState(check.getDateDue());
                    if (determineDueState == 0) {
                        return false;
                    }
                }
                Patient act = ElexisEventDispatcher.getSelectedPatient();
                String patientId = (act != null) ? act.getId() : "INVALID_ID";
                String[] vals = check.get(true, Reminder.FLD_SUBJECT, Reminder.FLD_MESSAGE, Reminder.FLD_KONTAKT_ID,
                        Reminder.FLD_VISIBILITY);
                if (!vals[2].equals(patientId)) {
                    Visibility vis = Visibility.byNumericSafe(vals[3]);
                    if (vis != Visibility.ALWAYS && vis != Visibility.POPUP_ON_LOGIN) {
                        // other (non-selected patient) and not marked always visible
                        return false;
                    }
                }

                if (filterText != null && filterText.length() > 0) {
                    if (!StringUtils.containsIgnoreCase(vals[0], filterText)
                            && !StringUtils.containsIgnoreCase(vals[1], filterText)) {
                        return false;
                    }
                }
            }
            return true;
        }

        public void setFilterText(String text) {
            filterText = text;
        }
    }

    private class ReminderViewCommonContentProvider extends CommonContentProviderAdapter {

        private Comparator<Reminder> comparator;

        @Override
        public Object[] getElements(final Object inputElement) {
            // Display reminders only if one is logged in
            if (CoreHub.actUser == null) {
                return new Object[0];
            }

            SortedSet<Reminder> reminders = new TreeSet<Reminder>();

            if (showAllReminders && CoreHub.acl.request(AccessControlDefaults.ADMIN_VIEW_ALL_REMINDERS)) {
                qbe.clear();
                reminders.addAll(qbe.execute());
            } else {
                reminders.addAll(Reminder.findOpenRemindersResponsibleFor(CoreHub.actUser, showOnlyDueReminders,
                        null, false));

                if (showSelfCreatedReminders) {
                    qbe.clear();
                    qbe.add(Reminder.FLD_CREATOR, Query.EQUALS, CoreHub.actUser.getId());

                    reminders.addAll(qbe.execute());
                }
            }

            if (filterActionSet.size() > 0) {
                reminders.removeIf(p -> !(filterActionSet.contains(p.getActionType().numericValue())));
            }

            // split into sublists
            List<Reminder> patientRelatedReminders = new ArrayList<>();
            List<Reminder> patientRelatedRemindersCurrentPatient = new ArrayList<>();
            List<Reminder> otherReminders = new ArrayList<>();

            Patient currentPatient = ElexisEventDispatcher.getSelectedPatient();
            for (Reminder reminder : reminders) {
                if (reminder.isPatientRelated()) {
                    if (currentPatient != null
                            && reminder.get(Reminder.FLD_KONTAKT_ID).equals(currentPatient.getId())) {
                        patientRelatedRemindersCurrentPatient.add(reminder);
                    } else {
                        patientRelatedReminders.add(reminder);
                    }
                } else {
                    otherReminders.add(reminder);
                }
            }

            if (comparator != null) {
                Collections.sort(patientRelatedReminders, comparator);
                Collections.sort(patientRelatedRemindersCurrentPatient, comparator);
                Collections.sort(otherReminders, comparator);
            }

            List<Object> resultList = new ArrayList<>();
            resultList.add("------------ Aktueller Patient");
            resultList.addAll(patientRelatedRemindersCurrentPatient);
            resultList.add("------------ Allgemein");
            resultList.addAll(otherReminders);
            resultList.add("------------ Patientenbezogen (nicht aktueller Patient, immer anzeigen)");
            resultList.addAll(patientRelatedReminders);

            return resultList.toArray();
        }

        public void setComparator(Comparator<Reminder> comparator) {
            this.comparator = comparator;
        }

    }
}