ch.elexis.core.ui.dialogs.KontaktSelektor.java Source code

Java tutorial

Introduction

Here is the source code for ch.elexis.core.ui.dialogs.KontaktSelektor.java

Source

/*******************************************************************************
 * Copyright (c) 2005-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.dialogs;

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

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;

import ch.elexis.core.constants.StringConstants;
import ch.elexis.core.data.events.ElexisEventDispatcher;
import ch.elexis.core.ui.UiDesk;
import ch.elexis.core.ui.actions.FlatDataLoader;
import ch.elexis.core.ui.actions.PersistentObjectLoader;
import ch.elexis.core.ui.actions.PersistentObjectLoader.QueryFilter;
import ch.elexis.core.ui.dialogs.provider.KontaktSelektorLabelProvider;
import ch.elexis.core.ui.util.SWTHelper;
import ch.elexis.core.ui.util.viewers.CommonViewer;
import ch.elexis.core.ui.util.viewers.CommonViewer.DoubleClickListener;
import ch.elexis.core.ui.util.viewers.DefaultControlFieldProvider;
import ch.elexis.core.ui.util.viewers.SimpleWidgetProvider;
import ch.elexis.core.ui.util.viewers.ViewerConfigurer;
import ch.elexis.data.BezugsKontakt;
import ch.elexis.data.Fall;
import ch.elexis.data.Kontakt;
import ch.elexis.data.Organisation;
import ch.elexis.data.Patient;
import ch.elexis.data.PersistentObject;
import ch.elexis.data.Person;
import ch.elexis.data.Query;
import ch.rgw.tools.StringTool;
import ch.rgw.tools.TimeTool;

public class KontaktSelektor extends TitleAreaDialog implements DoubleClickListener {

    // Name, Vorname, gebdat, strasse, plz, ort, tel, zusatz, fax, email
    public static final int HINTSIZE = 12;

    public static final int HINT_NAME = 0;
    public static final int HINT_FIRSTNAME = 1;
    public static final int HINT_BIRTHDATE = 2;
    public static final int HINT_STREET = 3;
    public static final int HINT_ZIP = 4;
    public static final int HINT_PLACE = 5;
    public static final int HINT_PHONE = 6;
    public static final int HINT_ADD = 7;
    public static final int HINT_FAX = 8;
    public static final int HINT_MAIL = 9;
    public static final int HINT_SEX = 10;
    public static final int HINT_PATIENT = 11;

    // private Class clazz;
    CommonViewer cv;
    ViewerConfigurer vc;
    private final String title;
    private final String message;
    private Object selection;
    Button bAll, bPersons, bOrgs;
    KontaktFilter fp;
    FilterButtonAdapter fba;
    String[] hints;
    // int type;

    boolean showBezugsKontakt = false;
    String extraText = null;
    private ListViewer bezugsKontaktViewer = null;
    private boolean isSelecting = false;
    private final PersistentObjectLoader kl;
    private boolean enableEmptyField = false;

    private Class targetClass;

    @SuppressWarnings("unchecked")
    public KontaktSelektor(Shell parentShell, Class which, String title, String message, String[] orderFields) {
        super(parentShell);
        targetClass = which;
        cv = new CommonViewer();
        fba = new FilterButtonAdapter();
        this.title = title;
        this.message = message;

        kl = new FlatDataLoader(cv, new Query<Kontakt>(which));
        kl.setOrderFields(orderFields);
        fp = new KontaktFilter(0);
    }

    public KontaktSelektor(Shell parentShell, Class<? extends PersistentObject> which, String t, String m,
            boolean showBezugsKontakt, String... orderFields) {
        this(parentShell, which, t, m, orderFields);

        this.showBezugsKontakt = showBezugsKontakt;
    }

    public KontaktSelektor(Shell parentShell, Class<? extends PersistentObject> which, String t, String m,
            String extra, String... orderFields) {
        this(parentShell, which, t, m, orderFields);
        extraText = extra;
    }

    @Override
    public boolean close() {
        cv.removeDoubleClickListener(this);
        cv.dispose();
        return super.close();
    }

    /**
     * Provide a few hints in case the user clicks "Neu erstellen". The hints is an array of up to
     * 10 Strings as used in KontaktErfassenDialog
     * 
     * @param hints
     *            Name, Vorname, gebdat, strasse, plz, ort, tel, zusatz, fax, email
     */
    public void setHints(String[] h) {
        this.hints = h;
        for (int i = 0; i < hints.length; i++) { // make KontaktErfassenDialog
            // happy
            if (hints[i] == null) {
                hints[i] = "";
            }
        }
        if (!StringTool.isNothing(hints[HINT_BIRTHDATE])) {
            TimeTool tt = new TimeTool();
            if (tt.set(hints[HINT_BIRTHDATE])) {
                hints[HINT_BIRTHDATE] = tt.toString(TimeTool.DATE_GER);
            } else {
                hints[HINT_BIRTHDATE] = StringTool.leer;
            }
        }
        if (!StringTool.isNothing(hints[HINT_SEX])) {
            if (hints[HINT_SEX].toLowerCase().startsWith("m")) {
                hints[HINT_SEX] = Person.MALE;
            } else {
                hints[HINT_SEX] = Person.FEMALE;
            }
        }
    }

    /*
     * (Kein Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse
     * .swt.widgets.Composite)
     */
    @Override
    protected Control createDialogArea(final Composite parent) {
        // SashForm ret=new SashForm(parent,SWT.NONE);
        Composite ret = new Composite(parent, SWT.NONE);
        ret.setLayout(new GridLayout());
        ret.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));

        if (showBezugsKontakt) {
            new Label(ret, SWT.NONE).setText("Bezugskontakte");
            bezugsKontaktViewer = new ListViewer(ret, SWT.SINGLE);
            bezugsKontaktViewer.getControl().setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));

            bezugsKontaktViewer.setContentProvider(new IStructuredContentProvider() {
                public Object[] getElements(Object inputElement) {
                    Patient patient = ElexisEventDispatcher.getSelectedPatient();
                    if (patient != null) {
                        ArrayList<PersistentObject> elements = new ArrayList<PersistentObject>();
                        ArrayList<String> addedKontakte = new ArrayList<String>();

                        // add the patient itself
                        elements.add(patient);
                        addedKontakte.add(patient.getId());

                        List<BezugsKontakt> bezugsKontakte = patient.getBezugsKontakte();
                        if (bezugsKontakte != null) {
                            for (BezugsKontakt bezugsKontakt : bezugsKontakte) {
                                elements.add(bezugsKontakt);
                                addedKontakte.add(bezugsKontakt.get("otherID"));
                            }
                        }

                        // required contacts of biling system
                        Fall[] faelle = patient.getFaelle();
                        for (Fall fall : faelle) {
                            String reqs = fall.getRequirements();
                            if (reqs != null) {
                                for (String req : reqs.split(";")) {
                                    final String[] r = req.split(":");

                                    // no valid entry
                                    if (r.length < 2) {
                                        continue;
                                    }

                                    // only consider contacts
                                    if (r[1].equals("K")) {
                                        String kontaktID = fall.getInfoString(r[0]);
                                        if (!kontaktID.startsWith("**ERROR")) {
                                            Kontakt kontakt = Kontakt.load(kontaktID);
                                            if (kontakt.isValid()) {
                                                elements.add(kontakt);
                                                addedKontakte.add(kontakt.getId());
                                            }
                                        }
                                    }
                                }
                            }
                        }

                        return elements.toArray();
                    }

                    return new Object[] {};
                }

                public void dispose() {
                    // nothing to do
                }

                public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
                    // nothing to do
                }
            });
            bezugsKontaktViewer.setLabelProvider(new KontaktSelektorLabelProvider());
            bezugsKontaktViewer.setInput(this);
            bezugsKontaktViewer.addSelectionChangedListener(new ISelectionChangedListener() {
                public void selectionChanged(SelectionChangedEvent event) {
                    if (isSelecting) {
                        return;
                    }

                    IStructuredSelection sel = (IStructuredSelection) cv.getViewerWidget().getSelection();
                    if (sel.size() > 0) {
                        isSelecting = true;
                        cv.getViewerWidget().setSelection(new StructuredSelection(), false);
                        isSelecting = false;
                    }
                }
            });
        } else {
            bezugsKontaktViewer = null;
        }

        if (showBezugsKontakt) {
            new Label(ret, SWT.NONE).setText("Andere Kontakte");
        }
        if (extraText != null) {
            new Label(ret, SWT.WRAP).setText(extraText);
        }
        vc = new ViewerConfigurer(
                // new LazyContentProvider(cv,dataloader, null),
                kl, new KontaktSelektorLabelProvider(),
                new DefaultControlFieldProvider(cv, new String[] { Messages.KontaktSelector_abbreviation,
                        Messages.KontaktSelector_expression1, Messages.KontaktSelector_birthDate }),
                new ViewerConfigurer.ButtonProvider() {

                    public Button createButton(final Composite parent) {
                        Button ret = new Button(parent, SWT.PUSH);
                        ret.setText("Neu erstellen...");
                        ret.addSelectionListener(new SelectionAdapter() {

                            @Override
                            public void widgetSelected(SelectionEvent e) {
                                if (hints == null) {
                                    hints = new String[3];
                                    hints[0] = vc.getControlFieldProvider().getValues()[1];
                                }
                                KontaktErfassenDialog ked = new KontaktErfassenDialog(parent.getShell(), hints);
                                ked.open();
                                selection = ked.getResult();
                                okPressed();
                                // cv.getViewerWidget().refresh();
                                // cv.getViewerWidget().setSelection(new
                                // StructuredSelection(kr), true);
                            }

                        });
                        return ret;
                    }

                    public boolean isAlwaysEnabled() {
                        return false;
                    }
                }, new SimpleWidgetProvider(SimpleWidgetProvider.TYPE_LAZYLIST, SWT.NONE, cv));
        Composite types = new Composite(ret, SWT.BORDER);
        types.setLayout(new FillLayout());
        types.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
        bAll = new Button(types, SWT.RADIO);
        bPersons = new Button(types, SWT.RADIO);
        bOrgs = new Button(types, SWT.RADIO);
        bAll.setText("Alle");
        bPersons.setText("Personen");
        bOrgs.setText("Organisationen");
        bAll.addSelectionListener(fba);
        bPersons.addSelectionListener(fba);
        bOrgs.addSelectionListener(fba);
        initContactTypeSelection();

        cv.create(vc, ret, SWT.NONE, "1");
        GridData gd = SWTHelper.getFillGridData(1, true, 1, true);
        gd.heightHint = 100;
        cv.getViewerWidget().getControl().setLayoutData(gd);
        setTitle(title);
        setMessage(message);
        vc.getContentProvider().startListening();
        cv.addDoubleClickListener(this);
        // cv.getViewerWidget().addFilter(filter);
        kl.addQueryFilter(fp);

        if (showBezugsKontakt) {
            cv.getViewerWidget().addSelectionChangedListener(new ISelectionChangedListener() {
                public void selectionChanged(SelectionChangedEvent event) {
                    if (isSelecting) {
                        return;
                    }

                    if (bezugsKontaktViewer != null) {
                        IStructuredSelection sel = (IStructuredSelection) bezugsKontaktViewer.getSelection();
                        if (sel.size() > 0) {
                            isSelecting = true;
                            bezugsKontaktViewer.setSelection(new StructuredSelection(), false);
                            isSelecting = false;
                        }
                    }
                }
            });
        }
        return ret;
    }

    private void initContactTypeSelection() {
        if (Person.class.isAssignableFrom(targetClass)) {
            bPersons.setSelection(true);
        } else if (Organisation.class.isAssignableFrom(targetClass)) {
            bOrgs.setSelection(true);
        } else {
            bAll.setSelection(true);
        }

    }

    public Object getSelection() {
        return selection;
    }

    @Override
    public void create() {
        super.create();
        getShell().setText(Messages.KontaktSelector_title);
    }

    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        if (enableEmptyField) {
            parent.setLayout(new GridLayout(3, false));
            Button btnClear = createButton(parent, IDialogConstants.NO_ID, Messages.KontaktSelector_clearField,
                    false);
            btnClear.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    selection = null;
                    vc.getContentProvider().stopListening();
                    close();
                }
            });
        } else {
            parent.setLayout(new GridLayout(2, false));
        }

        createButton(parent, IDialogConstants.OK_ID, "OK", false);
        createButton(parent, IDialogConstants.CANCEL_ID, "Cancel", false);
    }

    /*
     * (Kein Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.Dialog#cancelPressed()
     */
    @Override
    protected void cancelPressed() {
        selection = null;
        vc.getContentProvider().stopListening();
        super.cancelPressed();
    }

    private Object getBezugsKontaktSelection() {
        Object bezugsKontakt = null;

        if (bezugsKontaktViewer != null) {
            IStructuredSelection sel = (IStructuredSelection) bezugsKontaktViewer.getSelection();
            if (sel.size() > 0) {
                bezugsKontakt = sel.getFirstElement();
            }
        }

        return bezugsKontakt;
    }

    /*
     * (Kein Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.Dialog#okPressed()
     */
    @Override
    protected void okPressed() {

        Object bKSel = getBezugsKontaktSelection();
        if (bKSel instanceof Kontakt) {
            selection = bKSel;
        } else if (bKSel instanceof BezugsKontakt) {
            BezugsKontakt bezugsKontakt = (BezugsKontakt) bKSel;
            Kontakt kontakt = Kontakt.load(bezugsKontakt.get("otherID"));
            if (kontakt.exists()) {
                selection = kontakt;
            }
        } else {
            if (selection == null) {
                Object[] sel = cv.getSelection();
                if ((sel != null) && (sel.length > 0)) {
                    selection = sel[0];
                } else {
                    Table tbl = (Table) cv.getViewerWidget().getControl();
                    tbl.setSelection(0);
                    if (cv.getSelection().length > 0) {
                        selection = cv.getSelection()[0];
                    }
                }
            }
        }
        vc.getContentProvider().stopListening();
        cv.removeDoubleClickListener(this);
        super.okPressed();
    }

    public void doubleClicked(PersistentObject obj, CommonViewer cv) {
        okPressed();
    }

    class FilterButtonAdapter extends SelectionAdapter {
        @Override
        public void widgetSelected(SelectionEvent e) {
            if (((Button) e.getSource()).getSelection()) {
                if (bPersons.getSelection()) {
                    fp.setType(1);
                } else if (bOrgs.getSelection()) {
                    fp.setType(2);
                } else {
                    fp.setType(0);
                }
                cv.notify(CommonViewer.Message.update);
            }
        }
    }

    static class KontaktFilter implements QueryFilter {
        int type;

        KontaktFilter(int t) {
            type = t;
        }

        void setType(int t) {
            type = t;
        }

        public void apply(Query<? extends PersistentObject> qbe) {
            if (type == 1) {
                qbe.add(Kontakt.FLD_IS_PERSON, Query.EQUALS, StringConstants.ONE);
            } else if (type == 2) {
                qbe.add(Kontakt.FLD_IS_PERSON, Query.EQUALS, StringConstants.ZERO);
            }
            qbe.orderBy(false, new String[] { Kontakt.FLD_NAME1, Kontakt.FLD_NAME2 });
        }

    }

    public static Kontakt showInSync(Class<? extends Kontakt> clazz, String title, String message, String extra) {
        InSync rn = new InSync(clazz, title, message, extra, null);
        UiDesk.getDisplay().syncExec(rn);
        return rn.ret;

    }

    public static Kontakt showInSync(Class<? extends Kontakt> clazz, String title, String message) {
        InSync rn = new InSync(clazz, title, message, null, null);
        UiDesk.getDisplay().syncExec(rn);
        return rn.ret;

    }

    public static Kontakt showInSync(Class<? extends Kontakt> clazz, String title, String message, String extra,
            String[] hints) {
        InSync rn = new InSync(clazz, title, message, extra, hints);
        UiDesk.getDisplay().syncExec(rn);
        return rn.ret;

    }

    public static Kontakt showInSync(Class<? extends Kontakt> clazz, String title, String message, String[] hints) {
        InSync rn = new InSync(clazz, title, message, null, hints);
        UiDesk.getDisplay().syncExec(rn);
        return rn.ret;

    }

    private static class InSync implements Runnable {
        Kontakt ret;
        String title, message;
        Class<? extends Kontakt> clazz;
        String extra;
        String[] hints;
        private String[] orderFields;

        InSync(Class<? extends Kontakt> clazz, String title, String message, String extra, String[] hints,
                String... orderFields) {
            this.title = title;
            this.message = message;
            this.clazz = clazz;
            this.extra = extra;
            this.hints = hints;
            this.orderFields = orderFields;
            if (orderFields == null) {
                this.orderFields = new String[] { Kontakt.FLD_NAME1, Kontakt.FLD_NAME2, Kontakt.FLD_STREET,
                        Kontakt.FLD_PLACE };
            }
        }

        public void run() {
            Shell shell = UiDesk.getDisplay().getActiveShell();
            KontaktSelektor ksl = new KontaktSelektor(shell, clazz, title, message, extra, orderFields);
            if (hints != null) {
                ksl.setHints(hints);
            }
            if (ksl.open() == Dialog.OK) {
                ret = (Kontakt) ksl.getSelection();
            } else {
                ret = null;
            }
        }

    }

    public void enableEmptyFieldButton() {
        enableEmptyField = true;
    }
}