ch.elexis.views.KonsDetailView.java Source code

Java tutorial

Introduction

Here is the source code for ch.elexis.views.KonsDetailView.java

Source

/*******************************************************************************
 * Copyright (c) 2006-2011, 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.text.MessageFormat;
import java.util.Hashtable;
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.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.ISaveablePart2;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Hyperlink;
import org.eclipse.ui.part.ViewPart;

import ch.elexis.Desk;
import ch.elexis.Hub;
import ch.elexis.StringConstants;
import ch.elexis.actions.ElexisEvent;
import ch.elexis.actions.ElexisEventDispatcher;
import ch.elexis.actions.ElexisEventListener;
import ch.elexis.actions.ElexisEventListenerImpl;
import ch.elexis.actions.GlobalActions;
import ch.elexis.actions.GlobalEventDispatcher;
import ch.elexis.actions.GlobalEventDispatcher.IActivationListener;
import ch.elexis.admin.AccessControlDefaults;
import ch.elexis.core.data.ISticker;
import ch.elexis.core.icons.Images;
import ch.elexis.data.Anwender;
import ch.elexis.data.Artikel;
import ch.elexis.data.Fall;
import ch.elexis.data.Konsultation;
import ch.elexis.data.Mandant;
import ch.elexis.data.Patient;
import ch.elexis.data.Rechnungssteller;
import ch.elexis.data.Sticker;
import ch.elexis.dialogs.AssignStickerDialog;
import ch.elexis.dialogs.KontaktSelektor;
import ch.elexis.text.EnhancedTextField;
import ch.elexis.util.Extensions;
import ch.elexis.util.IKonsExtension;
import ch.elexis.util.Log;
import ch.elexis.util.SWTHelper;
import ch.elexis.util.ViewMenus;
import ch.rgw.tools.TimeTool;
import ch.rgw.tools.VersionedResource;
import ch.rgw.tools.VersionedResource.ResourceItem;

/**
 * Behandlungseintrag, Diagnosen und Verrechnung Dg und Verrechnung knnen wie Drag&Drop aus den
 * entsprechenden Listen.Views auf die Felder gezogen werden.
 * 
 * @author gerry
 * 
 */
public class KonsDetailView extends ViewPart implements ElexisEventListener, IActivationListener, ISaveablePart2 {
    private static final String NO_CONS_SELECTED = Messages.getString("KonsDetailView.NoConsSelected"); //$NON-NLS-1$
    public static final String ID = "ch.elexis.Konsdetail"; //$NON-NLS-1$
    public static final String CFG_VERTRELATION = "vertrelation"; //$NON-NLS-1$
    static final String ICON = "consult_view"; //$NON-NLS-1$
    static Log log = Log.get("Detail"); //$NON-NLS-1$
    Hashtable<String, IKonsExtension> hXrefs;
    EnhancedTextField text;
    private Label lBeh, lVersion;
    Hyperlink hlMandant;
    Combo cbFall;
    private Konsultation actKons;
    FormToolkit tk;
    Form form;
    Patient actPat;
    Color defaultBackground;

    private DiagnosenDisplay dd;
    private VerrechnungsDisplay vd;
    private Action versionBackAction, purgeAction, saveAction;
    Action versionFwdAction, assignStickerAction;
    int displayedVersion;
    Font emFont;
    Composite cDesc;
    Composite cEtiketten;
    private int[] sashWeights = null;
    private SashForm sash;

    private final ElexisEventListenerImpl eeli_pat = new ElexisEventListenerImpl(Patient.class) {
        @Override
        public void catchElexisEvent(final ElexisEvent ev) {
            Patient pat = (Patient) ev.getObject();
            if (pat != null) {
                if (!pat.equals(actPat)) {
                    setPatient(pat);
                    Konsultation b = pat.getLetzteKons(false);
                    if (b == null) {
                        ElexisEventDispatcher.getInstance()
                                .fire(new ElexisEvent(null, Konsultation.class, ElexisEvent.EVENT_DESELECTED));
                    } else {
                        if (actKons == null) {
                            ElexisEventDispatcher.fireSelectionEvent(b);
                        } else if (!actKons.getId().equals(b.getId())) {
                            ElexisEventDispatcher.fireSelectionEvent(b);
                        }
                    }
                }
            }
        }
    };

    private final ElexisEventListenerImpl eeli_user = new ElexisEventListenerImpl(Anwender.class,
            ElexisEvent.EVENT_USER_CHANGED) {
        @Override
        public void runInUi(ElexisEvent ev) {
            adaptMenus();
        }
    };

    @Override
    public void saveState(IMemento memento) {
        int[] w = sash.getWeights();
        memento.putString(CFG_VERTRELATION,
                Integer.toString(w[0]) + StringConstants.COMMA + Integer.toString(w[1]));
        super.saveState(memento);
    }

    @Override
    public void createPartControl(final Composite p) {
        org.eclipse.swt.graphics.Image icon = Desk.getImage(ICON);
        if (icon != null) {
            setTitleImage(icon);
        }
        sash = new SashForm(p, SWT.VERTICAL);

        tk = Desk.getToolkit();
        form = tk.createForm(sash);
        form.getBody().setLayout(new GridLayout(1, true));
        form.setText(NO_CONS_SELECTED);
        cEtiketten = new Composite(form.getBody(), SWT.NONE);
        cEtiketten.setLayout(new RowLayout(SWT.HORIZONTAL));
        cEtiketten.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
        cDesc = new Composite(form.getBody(), SWT.NONE);
        cDesc.setLayout(new RowLayout(SWT.HORIZONTAL));
        cDesc.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
        lBeh = tk.createLabel(cDesc, NO_CONS_SELECTED);
        emFont = Desk.getFont("Helvetica", 11, SWT.BOLD); //$NON-NLS-1$
        lBeh.setFont(emFont);
        defaultBackground = p.getBackground();
        // lBeh.setBackground();
        hlMandant = tk.createHyperlink(cDesc, "--", SWT.NONE); //$NON-NLS-1$
        hlMandant.addHyperlinkListener(new HyperlinkAdapter() {

            @Override
            public void linkActivated(HyperlinkEvent e) {
                KontaktSelektor ksl = new KontaktSelektor(getSite().getShell(), Mandant.class,
                        Messages.getString("KonsDetailView.SelectMandatorCaption"), //$NON-NLS-1$
                        Messages.getString("KonsDetailView.SelectMandatorBody"),
                        new String[] { Mandant.FLD_SHORT_LABEL, Mandant.FLD_NAME1, Mandant.FLD_NAME2 }); //$NON-NLS-1$
                if (ksl.open() == Dialog.OK) {
                    actKons.setMandant((Mandant) ksl.getSelection());
                    setKons(actKons);
                }
            }

        });
        hlMandant.setBackground(p.getBackground());

        cbFall = new Combo(form.getBody(), SWT.SINGLE);
        cbFall.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent e) {
                Fall[] faelle = (Fall[]) cbFall.getData();
                int i = cbFall.getSelectionIndex();
                if (i > -1 && i < faelle.length) {
                    Fall nFall = faelle[i];

                    Fall actFall = null;
                    String fallId = "";
                    if (actKons != null) {
                        actFall = actKons.getFall();
                        fallId = actFall.getId();
                    }

                    if (!nFall.getId().equals(fallId)) {
                        if (!nFall.isOpen()) {
                            SWTHelper.alert(Messages.getString("KonsDetailView.CaseClosedCaption"), //$NON-NLS-1$
                                    Messages.getString("KonsDetailView.CaseClosedBody")); //$NON-NLS-1$
                        } else {
                            MessageDialog msd = new MessageDialog(getViewSite().getShell(),
                                    Messages.getString("KonsDetailView.ChangeCaseCaption"), //$NON-NLS-1$
                                    Images.IMG_LOGO48.getImage(),
                                    MessageFormat.format(
                                            Messages.getString("KonsDetailView.ConfirmChangeConsToCase"),
                                            new Object[] { actFall.getLabel(), nFall.getLabel() }),
                                    MessageDialog.QUESTION, new String[] { Messages.getString("KonsDetailView.Yes"), //$NON-NLS-1$
                                            Messages.getString("KonsDetailView.No") }, //$NON-NLS-1$
                                    0);
                            if (msd.open() == 0) {
                                actKons.setFall(nFall);
                                setKons(actKons);
                            }
                        }
                    }
                }
            }

        });
        GridData gdFall = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
        cbFall.setLayoutData(gdFall);

        lVersion = tk.createLabel(form.getBody(), Messages.getString("KonsDetailView.actual")); //$NON-NLS-1$
        GridData gdVer = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
        lVersion.setLayoutData(gdVer);

        text = new EnhancedTextField(form.getBody());
        hXrefs = new Hashtable<String, IKonsExtension>();
        @SuppressWarnings("unchecked")
        List<IKonsExtension> xrefs = Extensions.getClasses("ch.elexis.KonsExtension", "KonsExtension"); //$NON-NLS-1$ //$NON-NLS-2$
        for (IKonsExtension x : xrefs) {
            String provider = x.connect(text);
            hXrefs.put(provider, x);
        }
        text.setXrefHandlers(hXrefs);
        GridData gd = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL | GridData.GRAB_VERTICAL
                | GridData.GRAB_HORIZONTAL);
        text.setLayoutData(gd);
        tk.adapt(text);
        SashForm bf = new SashForm(sash, SWT.HORIZONTAL);

        Composite botleft = tk.createComposite(bf);
        botleft.setLayout(new GridLayout(1, false));
        Composite botright = tk.createComposite(bf);
        botright.setLayout(new GridLayout(1, false));

        dd = new DiagnosenDisplay(getSite().getPage(), botleft, SWT.NONE);
        dd.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
        vd = new VerrechnungsDisplay(getSite().getPage(), botright, SWT.NONE);
        vd.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
        getSite().registerContextMenu(ID + ".VerrechnungsDisplay", vd.contextMenuManager, vd.viewer);
        getSite().setSelectionProvider(vd.viewer);

        makeActions();
        ViewMenus menu = new ViewMenus(getViewSite());
        if (Hub.acl.request(AccessControlDefaults.AC_PURGE)) {
            menu.createMenu(versionFwdAction, versionBackAction, GlobalActions.neueKonsAction,
                    GlobalActions.delKonsAction, GlobalActions.redateAction, assignStickerAction, purgeAction);
        } else {
            menu.createMenu(versionFwdAction, versionBackAction, GlobalActions.neueKonsAction,
                    GlobalActions.delKonsAction, GlobalActions.redateAction, assignStickerAction);
        }
        sash.setWeights(sashWeights == null ? new int[] { 80, 20 } : sashWeights);

        menu.createToolbar(GlobalActions.neueKonsAction, saveAction);
        GlobalEventDispatcher.addActivationListener(this, this);
        text.connectGlobalActions(getViewSite());
        adaptMenus();
        setKons((Konsultation) ElexisEventDispatcher.getSelected(Konsultation.class));
    }

    @Override
    public void init(IViewSite site, IMemento memento) throws PartInitException {

        if (memento == null) {
            sashWeights = new int[] { 80, 20 };
        } else {
            String state = memento.getString(CFG_VERTRELATION);
            if (state == null) {
                state = "80,20"; //$NON-NLS-1$
            }
            String[] sw = state.split(StringConstants.COMMA);
            sashWeights = new int[] { Integer.parseInt(sw[0]), Integer.parseInt(sw[1]) };
        }
        super.init(site, memento);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.part.WorkbenchPart#dispose()
     */
    @Override
    public void dispose() {
        GlobalEventDispatcher.removeActivationListener(this, this);
        text.disconnectGlobalActions(getViewSite());
        emFont.dispose();
        super.dispose();
    }

    /** Aktuellen patient setzen */
    private void setPatient(Patient pat) {
        for (Control cc : cEtiketten.getChildren()) {
            cc.dispose();
        }
        if (pat == null) {
            pat = ElexisEventDispatcher.getSelectedPatient();
        }
        actPat = pat;
        if (pat != null) {
            form.setText(pat.getPersonalia());
            List<ISticker> etis = pat.getStickers();
            if (etis != null && etis.size() > 0) {
                // Point size = form.getHead().getSize();
                for (ISticker et : etis) {
                    if (et != null) {
                        ((Sticker) et).createForm(cEtiketten);
                    }
                }
            }
            Fall[] faelle = pat.getFaelle();
            cbFall.removeAll();
            cbFall.setData(faelle);
            for (Fall f : faelle) {
                cbFall.add(f.getLabel());
            }
        }
        form.layout();
    }

    @Override
    public void setFocus() {
        text.setFocus();
    }

    /**
     * Aktuelle Konsultation setzen.
     */
    private void setKons(final Konsultation b) {

        if (actKons != null && text.isDirty()) {
            actKons.updateEintrag(text.getContentsAsXML(), false);
        }

        if (b != null) {
            /*
             * System.out.println("setKons: " + b.getLabel()); Fall fall = b.getFall();
             * System.out.println(fall.getLabel()); Patient oat = fall.getPatient();
             * System.out.println(oat.getLabel());
             */
            Fall act = b.getFall();
            setPatient(act.getPatient());
            setKonsText(b, b.getHeadVersion());

            Fall[] faelle = (Fall[]) cbFall.getData();
            for (int i = 0; i < faelle.length; i++) {
                if (faelle[i].getId().equals(act.getId())) {
                    cbFall.select(i);
                    break;
                }
            }
            cbFall.setEnabled(act.isOpen());
            Mandant m = b.getMandant();
            lBeh.setText(Messages.getString("KonsDetailView.ConsOfDate") + " " + b.getDatum()); //$NON-NLS-1$
            StringBuilder sb = new StringBuilder();
            if (m == null) {
                sb.append(Messages.getString("KonsDetailView.NotYours")); //$NON-NLS-1$
            } else {
                Rechnungssteller rs = m.getRechnungssteller();
                if (rs.getId().equals(m.getId())) {
                    sb.append("(").append(m.getLabel()).append(")"); //$NON-NLS-1$ //$NON-NLS-2$
                } else {
                    sb.append("(").append(m.getLabel()).append("/").append( //$NON-NLS-1$ //$NON-NLS-2$
                            rs.getLabel()).append(")"); //$NON-NLS-1$
                }
            }
            hlMandant.setText(sb.toString());
            hlMandant.setEnabled(Hub.acl.request(AccessControlDefaults.KONS_REASSIGN));
            dd.setDiagnosen(b);
            vd.setLeistungen(b);
            // ElexisEventDispatcher.fireSelectionEvent(b);
            if (b.isEditable(false)) {
                // text.getControl().
                text.setEnabled(true);
                text.setToolTipText("");
                lBeh.setForeground(Desk.getColor(Desk.COL_BLACK));
                lBeh.setBackground(defaultBackground);
            } else {
                // text.setEnabled(false);
                text.setToolTipText("Konsultation geschlossen oder nicht von Ihnen");
                lBeh.setForeground(Desk.getColor(Desk.COL_GREY60));
                lBeh.setBackground(Desk.getColor(Desk.COL_GREY20));
            }

        } else {
            form.setText(NO_CONS_SELECTED);
            lBeh.setText("-"); //$NON-NLS-1$
            hlMandant.setText("--"); //$NON-NLS-1$
            hlMandant.setEnabled(false);
            lVersion.setText(""); //$NON-NLS-1$
            // cbFall.removeAll();
            dd.clear();
            vd.clear();
            text.setText(""); //$NON-NLS-1$
            text.setEnabled(false);
        }
        actKons = b;
        cDesc.layout();
    }

    void setKonsText(final Konsultation b, final int version) {
        String ntext = ""; //$NON-NLS-1$
        if ((version >= 0) && (version <= b.getHeadVersion())) {
            VersionedResource vr = b.getEintrag();
            ResourceItem entry = vr.getVersion(version);
            ntext = entry.data;
            StringBuilder sb = new StringBuilder();
            sb.append("rev. ").append(version).append(Messages.getString("KonsDetailView.of")).append( //$NON-NLS-1$ //$NON-NLS-2$
                    new TimeTool(entry.timestamp).toString(TimeTool.FULL_GER)).append(" (").append(entry.remark) //$NON-NLS-1$
                    .append(")"); //$NON-NLS-1$
            lVersion.setText(sb.toString());
        } else {
            lVersion.setText(""); //$NON-NLS-1$
        }
        text.setText(ntext);
        text.setKons(b);
        displayedVersion = version;
        versionBackAction.setEnabled(version != 0);
        versionFwdAction.setEnabled(version != b.getHeadVersion());
    }

    private void makeActions() {

        purgeAction = new Action(Messages.getString("KonsDetailView.PurgeOldEntries")) { //$NON-NLS-1$

            @Override
            public void run() {
                actKons.purgeEintrag();
                ElexisEventDispatcher.fireSelectionEvent(actKons);
            }

        };
        versionBackAction = new Action(Messages.getString("KonsDetailView.PreviousEntry")) { //$NON-NLS-1$

            @Override
            public void run() {
                if (actKons == null) {
                    return;
                }
                if (MessageDialog.openConfirm(getViewSite().getShell(),
                        Messages.getString("KonsDetailView.ReplaceKonsTextCaption"), //$NON-NLS-1$
                        Messages.getString("KonsDetailView.ReplaceKonsTextBody"))) { //$NON-NLS-1$
                    setKonsText(actKons, displayedVersion - 1);
                    text.setDirty(true);
                }
            }

        };
        versionFwdAction = new Action(Messages.getString("KonsDetailView.nextEntry")) { //$NON-NLS-1$
            @Override
            public void run() {
                if (actKons == null) {
                    return;
                }
                if (MessageDialog.openConfirm(getViewSite().getShell(),
                        Messages.getString("KonsDetailView.ReplaceKonsTextCaption"), //$NON-NLS-1$
                        Messages.getString("KonsDetailView.ReplaceKonsTextBody2"))) { //$NON-NLS-1$
                    setKonsText(actKons, displayedVersion + 1);
                    text.setDirty(true);
                }
            }
        };
        saveAction = new Action(Messages.getString("KonsDetailView.SaveEntry")) { //$NON-NLS-1$
            {
                setImageDescriptor(Images.IMG_DISK.getImageDescriptor());
                setToolTipText(Messages.getString("KonsDetailView.SaveExplicit")); //$NON-NLS-1$
            }

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

        versionFwdAction.setImageDescriptor(Images.IMG_NEXT.getImageDescriptor());
        versionBackAction.setImageDescriptor(Images.IMG_PREVIOUS.getImageDescriptor());
        purgeAction.setImageDescriptor(Images.IMG_DELETE.getImageDescriptor());
        assignStickerAction = new Action("Sticker...") {
            {
                setToolTipText("Der Konsultation einer Sticker zuweisen");
            }

            @Override
            public void run() {
                AssignStickerDialog asd = new AssignStickerDialog(getViewSite().getShell(), actKons);
                asd.open();
            }
        };
    }

    public void save() {
        if (actKons != null) {
            actKons.updateEintrag(text.getContentsAsXML(), false);
            log.log("saved.", Log.DEBUGMSG); //$NON-NLS-1$
            setKons(actKons);
        } else {
            log.log(getClass().getName() + " save() actKons == null", Log.WARNINGS);
        }
    }

    public void activation(final boolean mode) {
        if ((mode == false) && (text.isDirty())) {
            if (actKons != null) {
                actKons.updateEintrag(text.getContentsAsXML(), false);
                log.log("saved.", Log.DEBUGMSG); //$NON-NLS-1$
            }
            text.setDirty(false);
        } else {
            setKons((Konsultation) ElexisEventDispatcher.getInstance().getSelected(Konsultation.class));
        }

    }

    public void visible(final boolean mode) {
        if (mode == true) {
            ElexisEventDispatcher.getInstance().addListeners(this, eeli_pat, eeli_user);
            adaptMenus();
            eeli_pat.catchElexisEvent(ElexisEvent.createPatientEvent());
        } else {
            ElexisEventDispatcher.getInstance().removeListeners(this, eeli_pat, eeli_user);
        }

    }

    public void adaptMenus() {
        vd.tVerr.getMenu().setEnabled(Hub.acl.request(AccessControlDefaults.LSTG_VERRECHNEN));
        GlobalActions.delKonsAction.setEnabled(Hub.acl.request(AccessControlDefaults.KONS_DELETE));
        GlobalActions.neueKonsAction.setEnabled(Hub.acl.request(AccessControlDefaults.KONS_CREATE));
    }

    /*
     * 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 addToVerechnung(Artikel artikel) {
        vd.addPersistentObject(artikel);
    }

    /**
     * Konsultation event
     */
    public void catchElexisEvent(final ElexisEvent ev) {
        Desk.syncExec(new Runnable() {
            public void run() {
                switch (ev.getType()) {
                case ElexisEvent.EVENT_DELETE:
                    if ((actKons != null) && actKons.equals(ev.getObject())) {
                        setKons(null);
                    }
                    break;
                case ElexisEvent.EVENT_UPDATE:
                    if ((ev.getObject() != null) && (actKons != null)
                            && (ev.getObject().getId().equals(actKons.getId()))) {
                        setKons((Konsultation) ev.getObject());
                    }
                    break;
                case ElexisEvent.EVENT_DESELECTED:
                    setKons(null);
                    break;

                case ElexisEvent.EVENT_SELECTED:
                    setKons((Konsultation) ev.getObject());
                    break;
                }
            }
        });
    }

    final private ElexisEvent eetemplate = new ElexisEvent(null, Konsultation.class,
            ElexisEvent.EVENT_CREATE | ElexisEvent.EVENT_DELETE | ElexisEvent.EVENT_DESELECTED
                    | ElexisEvent.EVENT_RELOAD | ElexisEvent.EVENT_SELECTED | ElexisEvent.EVENT_UPDATE);

    public ElexisEvent getElexisEventFilter() {
        return eetemplate;
    }
}