ch.elexis.views.BriefAuswahl.java Source code

Java tutorial

Introduction

Here is the source code for ch.elexis.views.BriefAuswahl.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.views;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.ISaveablePart2;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.part.ViewPart;

import ch.elexis.Desk;
import ch.elexis.Hub;
import ch.elexis.actions.ElexisEvent;
import ch.elexis.actions.ElexisEventDispatcher;
import ch.elexis.actions.ElexisEventListener;
import ch.elexis.actions.GlobalActions;
import ch.elexis.actions.GlobalEventDispatcher;
import ch.elexis.actions.GlobalEventDispatcher.IActivationListener;
import ch.elexis.data.Brief;
import ch.elexis.data.Fall;
import ch.elexis.data.Konsultation;
import ch.elexis.data.Kontakt;
import ch.elexis.data.Patient;
import ch.elexis.data.PersistentObject;
import ch.elexis.data.Query;
import ch.elexis.dialogs.DocumentSelectDialog;
import ch.elexis.dialogs.SelectFallDialog;
import ch.elexis.preferences.PreferenceConstants;
import ch.elexis.util.SWTHelper;
import ch.elexis.util.ViewMenus;
import ch.elexis.util.viewers.CommonViewer;
import ch.elexis.util.viewers.CommonViewer.DoubleClickListener;
import ch.elexis.util.viewers.DefaultContentProvider;
import ch.elexis.util.viewers.DefaultControlFieldProvider;
import ch.elexis.util.viewers.DefaultLabelProvider;
import ch.elexis.util.viewers.SimpleWidgetProvider;
import ch.elexis.util.viewers.ViewerConfigurer;
import ch.rgw.tools.ExHandler;
import ch.rgw.tools.TimeTool;

public class BriefAuswahl extends ViewPart implements ElexisEventListener, IActivationListener, ISaveablePart2 {

    public final static String ID = "ch.elexis.BriefAuswahlView"; //$NON-NLS-1$
    private final FormToolkit tk;
    private Form form;
    private Action briefNeuAction, briefLadenAction, editNameAction;
    private Action deleteAction;
    private ViewMenus menus;
    private ArrayList<sPage> pages = new ArrayList<sPage>();
    CTabFolder ctab;

    // private ViewMenus menu;
    // private IAction delBriefAction;
    public BriefAuswahl() {
        tk = Desk.getToolkit();
    }

    @Override
    public void createPartControl(final Composite parent) {
        StringBuilder sb = new StringBuilder();
        sb.append(Messages.getString("BriefAuswahlAllLetters")).append(Brief.UNKNOWN).append(",").append(Brief.AUZ) //$NON-NLS-1$
                .append(",").append(Brief.RP).append(",").append(Brief.LABOR);
        String cats = Hub.globalCfg.get(PreferenceConstants.DOC_CATEGORY, sb.toString());
        parent.setLayout(new GridLayout());

        form = tk.createForm(parent);
        form.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
        form.setBackground(parent.getBackground());

        // Grid layout with zero margins
        GridLayout slimLayout = new GridLayout();
        slimLayout.marginHeight = 0;
        slimLayout.marginWidth = 0;

        Composite body = form.getBody();
        body.setLayout(slimLayout);
        body.setBackground(parent.getBackground());

        ctab = new CTabFolder(body, SWT.BOTTOM);
        ctab.setLayout(slimLayout);
        ctab.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
        ctab.setBackground(parent.getBackground());
        makeActions();
        menus = new ViewMenus(getViewSite());

        for (String cat : cats.split(",")) {
            CTabItem ct = new CTabItem(ctab, SWT.NONE);
            ct.setText(cat);
            sPage page = new sPage(ctab, cat);
            pages.add(page);
            menus.createViewerContextMenu(page.cv.getViewerWidget(), editNameAction, deleteAction);
            ct.setData(page.cv);
            ct.setControl(page);
            page.cv.addDoubleClickListener(new DoubleClickListener() {
                @Override
                public void doubleClicked(PersistentObject obj, CommonViewer cv) {
                    briefLadenAction.run();
                }
            });
        }

        ctab.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                relabel();
            }

        });

        GlobalEventDispatcher.addActivationListener(this, this);
        menus.createMenu(briefNeuAction, briefLadenAction, editNameAction, deleteAction);
        menus.createToolbar(briefNeuAction, briefLadenAction, deleteAction);
        ctab.setSelection(0);
        relabel();
    }

    @Override
    public void dispose() {
        ElexisEventDispatcher.getInstance().removeListeners(this);
        GlobalEventDispatcher.removeActivationListener(this, this);

        for (sPage page : pages) {
            page.getCommonViewer().getConfigurer().getContentProvider().stopListening();
        }
    }

    @Override
    public void setFocus() {

    }

    public void relabel() {
        Desk.asyncExec(new Runnable() {
            public void run() {
                Patient pat = (Patient) ElexisEventDispatcher.getSelected(Patient.class);
                if (pat == null) {
                    form.setText(Messages.getString("BriefAuswahlNoPatientSelected")); //$NON-NLS-1$
                } else {
                    form.setText(pat.getLabel());
                    CTabItem sel = ctab.getSelection();
                    if (sel != null) {
                        CommonViewer cv = (CommonViewer) sel.getData();
                        cv.notify(CommonViewer.Message.update);
                    }
                }
            }
        });

    }

    class sPage extends Composite {
        private final CommonViewer cv;
        private final ViewerConfigurer vc;

        public CommonViewer getCommonViewer() {
            return cv;
        }

        sPage(final Composite parent, final String cat) {
            super(parent, SWT.NONE);
            setLayout(new GridLayout());
            cv = new CommonViewer();
            vc = new ViewerConfigurer(
                    new DefaultContentProvider(cv, Brief.class, new String[] { Brief.FLD_DATE }, true) {

                        @Override
                        public Object[] getElements(final Object inputElement) {
                            Patient actPat = (Patient) ElexisEventDispatcher.getSelected(Patient.class);
                            if (actPat != null) {
                                Query<Brief> qbe = new Query<Brief>(Brief.class);
                                qbe.add(Brief.FLD_PATIENT_ID, Query.EQUALS, actPat.getId());
                                if (cat.equals(Messages.getString("BriefAuswahlAllLetters2"))) { //$NON-NLS-1$
                                    qbe.add(Brief.FLD_TYPE, Query.NOT_EQUAL, Brief.TEMPLATE);
                                } else {
                                    qbe.add(Brief.FLD_TYPE, Query.EQUALS, cat);
                                }
                                cv.getConfigurer().getControlFieldProvider().setQuery(qbe);

                                List<Brief> list = qbe.execute();
                                return list.toArray();
                            } else {
                                return new Brief[0];
                            }
                        }

                    }, new DefaultLabelProvider(),
                    new DefaultControlFieldProvider(cv, new String[] { "Betreff=Titel" }),
                    new ViewerConfigurer.DefaultButtonProvider(),
                    new SimpleWidgetProvider(SimpleWidgetProvider.TYPE_LIST, SWT.V_SCROLL, cv));
            cv.create(vc, this, SWT.NONE, getViewSite());
            cv.getViewerWidget().setComparator(new ViewerComparator() {
                @Override
                public int compare(Viewer viewer, Object e1, Object e2) {
                    if (e1 instanceof Brief && e2 instanceof Brief) {
                        TimeTool bt1 = new TimeTool(((Brief) e1).getDatum());
                        TimeTool bt2 = new TimeTool(((Brief) e2).getDatum());
                        return bt2.compareTo(bt1);
                    }
                    return 0;
                }
            });
            vc.getContentProvider().startListening();
            Button bLoad = tk.createButton(this, Messages.getString("BriefAuswahlLoadButtonText"), SWT.PUSH); //$NON-NLS-1$
            bLoad.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(final SelectionEvent e) {
                    try {
                        TextView tv = (TextView) getViewSite().getPage().showView(TextView.ID);
                        Object[] o = cv.getSelection();
                        if ((o != null) && (o.length > 0)) {
                            Brief brief = (Brief) o[0];
                            if (tv.openDocument(brief) == false) {
                                SWTHelper.alert(Messages.getString("BriefAuswahlErrorHeading"), //$NON-NLS-1$
                                        Messages.getString("BriefAuswahlCouldNotLoadText")); //$NON-NLS-1$
                            }
                        } else {
                            tv.createDocument(null, null);
                        }
                    } catch (Throwable ex) {
                        ExHandler.handle(ex);
                    }
                }

            });
            bLoad.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));

        }
    }

    private void makeActions() {
        briefNeuAction = new Action(Messages.getString("BriefAuswahlNewButtonText")) { //$NON-NLS-1$
            @Override
            public void run() {
                Patient pat = ElexisEventDispatcher.getSelectedPatient();
                if (pat == null) {
                    MessageDialog.openInformation(Desk.getTopShell(),
                            Messages.getString("BriefAuswahlNoPatientSelected"),
                            Messages.getString("BriefAuswahlNoPatientSelected"));
                    return;
                }

                Fall selectedFall = (Fall) ElexisEventDispatcher.getSelected(Fall.class);
                if (selectedFall == null) {
                    SelectFallDialog sfd = new SelectFallDialog(Desk.getTopShell());
                    sfd.open();
                    if (sfd.result != null) {
                        ElexisEventDispatcher.fireSelectionEvent(sfd.result);
                    } else {
                        MessageDialog.openInformation(Desk.getTopShell(),
                                Messages.getString("TextView.NoCaseSelected"), //$NON-NLS-1$
                                Messages.getString("TextView.SaveNotPossibleNoCaseAndKonsSelected")); //$NON-NLS-1$
                        return;
                    }
                }

                Konsultation selectedKonsultation = (Konsultation) ElexisEventDispatcher
                        .getSelected(Konsultation.class);
                if (selectedKonsultation == null) {
                    Konsultation k = pat.getLetzteKons(false);
                    if (k == null) {
                        k = ((Fall) ElexisEventDispatcher.getSelected(Fall.class)).neueKonsultation();
                        k.setMandant(Hub.actMandant);
                    }
                    ElexisEventDispatcher.fireSelectionEvent(k);
                }

                TextView tv = null;
                try {
                    tv = (TextView) getSite().getPage().showView(TextView.ID /*
                                                                             * ,StringTool.unique
                                                                             * ("textView")
                                                                             * ,IWorkbenchPage
                                                                             * .VIEW_ACTIVATE
                                                                             */);
                    DocumentSelectDialog bs = new DocumentSelectDialog(getViewSite().getShell(), Hub.actMandant,
                            DocumentSelectDialog.TYPE_CREATE_DOC_WITH_TEMPLATE);
                    if (bs.open() == Dialog.OK) {
                        // trick: just supply a dummy address for creating the doc
                        Kontakt address = null;
                        if (DocumentSelectDialog.getDontAskForAddresseeForThisTemplate(bs.getSelectedDocument()))
                            address = Kontakt.load("-1");
                        tv.createDocument(bs.getSelectedDocument(), bs.getBetreff(), address);
                        tv.setName();
                        CTabItem sel = ctab.getSelection();
                        if (sel != null) {
                            CommonViewer cv = (CommonViewer) sel.getData();
                            cv.notify(CommonViewer.Message.update_keeplabels);
                        }

                    }
                } catch (Exception ex) {
                    ExHandler.handle(ex);
                }
            }
        };
        briefLadenAction = new Action(Messages.getString("BriefAuswahlOpenButtonText")) { //$NON-NLS-1$
            @Override
            public void run() {
                try {
                    TextView tv = (TextView) getViewSite().getPage().showView(TextView.ID);
                    CTabItem sel = ctab.getSelection();
                    if (sel != null) {
                        CommonViewer cv = (CommonViewer) sel.getData();
                        Object[] o = cv.getSelection();
                        if ((o != null) && (o.length > 0)) {
                            Brief brief = (Brief) o[0];
                            if (tv.openDocument(brief) == false) {
                                SWTHelper.alert(Messages.getString("BriefAuswahlErrorHeading"), //$NON-NLS-1$
                                        Messages.getString("BriefAuswahlCouldNotLoadText")); //$NON-NLS-1$
                            }
                        } else {
                            tv.createDocument(null, null);
                        }
                        cv.notify(CommonViewer.Message.update);
                    }
                } catch (PartInitException e) {
                    ExHandler.handle(e);
                }

            }
        };
        deleteAction = new Action(Messages.getString("BriefAuswahlDeleteButtonText")) { //$NON-NLS-1$
            @Override
            public void run() {
                CTabItem sel = ctab.getSelection();
                if ((sel != null) && SWTHelper.askYesNo(Messages.getString("BriefAuswahlDeleteConfirmHeading"), //$NON-NLS-1$
                        Messages.getString("BriefAuswahlDeleteConfirmText"))) { //$NON-NLS-1$
                    CommonViewer cv = (CommonViewer) sel.getData();
                    Object[] o = cv.getSelection();
                    if ((o != null) && (o.length > 0)) {
                        Brief brief = (Brief) o[0];
                        brief.delete();
                    }
                    cv.notify(CommonViewer.Message.update);
                }

            }
        };
        editNameAction = new Action(Messages.getString("BriefAuswahlRenameButtonText")) { //$NON-NLS-1$
            @Override
            public void run() {
                CTabItem sel = ctab.getSelection();
                if (sel != null) {
                    CommonViewer cv = (CommonViewer) sel.getData();
                    Object[] o = cv.getSelection();
                    if ((o != null) && (o.length > 0)) {
                        Brief brief = (Brief) o[0];
                        InputDialog id = new InputDialog(getViewSite().getShell(),
                                Messages.getString("BriefAuswahlNewSubjectHeading"), //$NON-NLS-1$
                                Messages.getString("BriefAuswahlNewSubjectText"), //$NON-NLS-1$
                                brief.getBetreff(), null);
                        if (id.open() == Dialog.OK) {
                            brief.setBetreff(id.getValue());
                        }
                    }
                    cv.notify(CommonViewer.Message.update);
                }
            }
        };
        /*
         * importAction=new Action("Importieren..."){ public void run(){
         * 
         * } };
         */
        briefLadenAction.setImageDescriptor(Hub.getImageDescriptor("rsc/document_text.png")); //$NON-NLS-1$
        briefLadenAction.setToolTipText(Messages.getString("BriefAuswahlOpenLetterForEdit")); //$NON-NLS-1$
        briefNeuAction.setImageDescriptor(Hub.getImageDescriptor("rsc/document__plus.png")); //$NON-NLS-1$
        briefNeuAction.setToolTipText(Messages.getString("BriefAuswahlCreateNewDocument")); //$NON-NLS-1$
        editNameAction.setImageDescriptor(Hub.getImageDescriptor("rsc/document__pencil.png")); //$NON-NLS-1$
        editNameAction.setToolTipText(Messages.getString("BriefAuswahlRenameDocument")); //$NON-NLS-1$
        deleteAction.setImageDescriptor(Hub.getImageDescriptor("rsc/document__minus.png")); //$NON-NLS-1$
        deleteAction.setToolTipText(Messages.getString("BriefAuswahlDeleteDocument")); //$NON-NLS-1$
    }

    public void activation(final boolean mode) {
        // TODO Auto-generated method stub

    }

    public void visible(final boolean mode) {
        if (mode == true) {
            ElexisEventDispatcher.getInstance().addListeners(this);
            relabel();
        } else {
            ElexisEventDispatcher.getInstance().removeListeners(this);
        }

    }

    /*
     * Die folgenden 6 Methoden implementieren das Interface ISaveablePart2 Wir bentigen das
     * Interface nur, um das Schliessen einer View zu verhindern, wenn die Perspektive fixiert ist.
     * Gibt es da keine einfachere Methode?
     */
    public int promptToSaveOnClose() {
        return GlobalActions.fixLayoutAction.isChecked() ? ISaveablePart2.CANCEL : ISaveablePart2.NO;
    }

    public void doSave(final IProgressMonitor monitor) { /* leer */
    }

    public void doSaveAs() { /* leer */
    }

    public boolean isDirty() {
        return true;
    }

    public boolean isSaveAsAllowed() {
        return false;
    }

    public boolean isSaveOnCloseNeeded() {
        return true;
    }

    public void catchElexisEvent(ElexisEvent ev) {
        relabel();
    }

    private static ElexisEvent template = new ElexisEvent(null, Patient.class,
            ElexisEvent.EVENT_SELECTED | ElexisEvent.EVENT_DESELECTED);

    public ElexisEvent getElexisEventFilter() {
        return template;
    }
}