ch.elexis.views.codesystems.BlockDetailDisplay.java Source code

Java tutorial

Introduction

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

import java.util.List;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.DropTargetListener;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.statushandlers.StatusManager;

import ch.elexis.Desk;
import ch.elexis.Hub;
import ch.elexis.StringConstants;
import ch.elexis.actions.ElexisEventDispatcher;
import ch.elexis.commands.CreateEigenleistungUi;
import ch.elexis.commands.EditEigenleistungUi;
import ch.elexis.core.icons.Images;
import ch.elexis.data.Eigenleistung;
import ch.elexis.data.ICodeElement;
import ch.elexis.data.IVerrechenbar;
import ch.elexis.data.Leistungsblock;
import ch.elexis.data.Mandant;
import ch.elexis.data.PersistentObject;
import ch.elexis.data.Query;
import ch.elexis.status.ElexisStatus;
import ch.elexis.util.Log;
import ch.elexis.util.SWTHelper;
import ch.elexis.util.ViewMenus;
import ch.elexis.views.IDetailDisplay;
import ch.rgw.tools.StringTool;

public class BlockDetailDisplay implements IDetailDisplay {
    ScrolledForm form;
    FormToolkit tk;
    Text tName;
    Combo cbMandant;
    ListViewer lLst;
    Button bNew, bEigen;
    List<Mandant> lMandanten;
    private static Log log = Log.get("BlockDetail"); //$NON-NLS-1$
    private Action removeLeistung, moveUpAction, moveDownAction, editAction;
    IViewSite site;

    public Composite createDisplay(final Composite parent, final IViewSite site) {
        tk = Desk.getToolkit();
        this.site = site;
        form = tk.createScrolledForm(parent);
        Composite body = form.getBody();
        body.setBackground(parent.getBackground());
        body.setLayout(new GridLayout(2, false));
        tk.createLabel(body, Messages.getString("BlockDetailDisplay.name")).setBackground(parent.getBackground()); //$NON-NLS-1$
        tName = tk.createText(body, "", SWT.BORDER); //$NON-NLS-1$
        tName.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
        tk.createLabel(body, StringConstants.MANDATOR).setBackground(parent.getBackground());
        cbMandant = new Combo(body, SWT.NONE);
        cbMandant.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
        tk.adapt(cbMandant);
        Query<Mandant> qm = new Query<Mandant>(Mandant.class);
        lMandanten = qm.execute();
        cbMandant.add(Messages.getString("BlockDetailDisplay.all")); //$NON-NLS-1$
        for (PersistentObject m : lMandanten) {
            cbMandant.add(m.getLabel());
        }
        cbMandant.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent e) {
                int idx = cbMandant.getSelectionIndex();
                Leistungsblock lb = (Leistungsblock) ElexisEventDispatcher.getSelected(Leistungsblock.class);
                if (idx > 0) {
                    PersistentObject m = lMandanten.get(idx - 1);
                    lb.set(Leistungsblock.MANDANT_ID, m.getId());
                } else {
                    lb.set(Leistungsblock.MANDANT_ID, StringConstants.EMPTY);
                }

            }

        });
        Group gList = new Group(body, SWT.BORDER);
        gList.setText(Messages.getString("BlockDetailDisplay.services")); //$NON-NLS-1$
        gList.setLayoutData(SWTHelper.getFillGridData(2, true, 1, true));
        gList.setLayout(new FillLayout());
        tk.adapt(gList);
        lLst = new ListViewer(gList, SWT.NONE);
        tk.adapt(lLst.getControl(), true, true);

        lLst.setContentProvider(new IStructuredContentProvider() {
            public void dispose() {
            }

            public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {
            }

            public Object[] getElements(final Object inputElement) {
                Leistungsblock lb = (Leistungsblock) ElexisEventDispatcher.getSelected(Leistungsblock.class);
                if (lb == null) {
                    return new Object[0];
                }
                List<ICodeElement> lst = lb.getElements();
                if (lst == null) {
                    return new Object[0];
                }
                return lst.toArray();
            }

        });
        lLst.setLabelProvider(new LabelProvider() {

            @Override
            public String getText(final Object element) {
                ICodeElement v = (ICodeElement) element;
                return v.getCode() + StringConstants.SPACE + v.getText();
            }

        });
        final TextTransfer textTransfer = TextTransfer.getInstance();
        Transfer[] types = new Transfer[] { textTransfer };
        lLst.addDropSupport(DND.DROP_COPY, types, new DropTargetListener() {
            public void dragEnter(final DropTargetEvent event) {
                event.detail = DND.DROP_COPY;
            }

            public void dragLeave(final DropTargetEvent event) {
            }

            public void dragOperationChanged(final DropTargetEvent event) {
            }

            public void dragOver(final DropTargetEvent event) {
            }

            public void drop(final DropTargetEvent event) {
                String drp = (String) event.data;
                String[] dl = drp.split(","); //$NON-NLS-1$
                for (String obj : dl) {
                    PersistentObject dropped = Hub.poFactory.createFromString(obj);
                    if (dropped instanceof ICodeElement) {
                        Leistungsblock lb = (Leistungsblock) ElexisEventDispatcher
                                .getSelected(Leistungsblock.class);
                        if (lb != null) {
                            lb.addElement((ICodeElement) dropped);
                            lLst.refresh();
                            ElexisEventDispatcher.reload(Leistungsblock.class);
                        }
                    }
                }

            }

            public void dropAccept(final DropTargetEvent event) {
                // TODO Automatisch erstellter Methoden-Stub

            }

        });
        bNew = tk.createButton(body, Messages.getString("BlockDetailDisplay.addPredefinedServices"), SWT.PUSH); //$NON-NLS-1$
        bNew.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
        bNew.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent e) {
                try {
                    site.getPage().showView(LeistungenView.ID);
                } catch (Exception ex) {
                    ElexisStatus status = new ElexisStatus(ElexisStatus.ERROR, Hub.PLUGIN_ID,
                            ElexisStatus.CODE_NONE, "Fehler beim Starten des Leistungscodes " + ex.getMessage(), ex,
                            ElexisStatus.LOG_ERRORS);
                    StatusManager.getManager().handle(status, StatusManager.SHOW);
                }
            }
        });

        bEigen = tk.createButton(body, Messages.getString("BlockDetailDisplay.addSelfDefinedServices"), SWT.PUSH); //$NON-NLS-1$
        bEigen.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
        bEigen.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                try {
                    // execute the command
                    IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
                            .getActiveWorkbenchWindow().getService(IHandlerService.class);

                    handlerService.executeCommand(CreateEigenleistungUi.COMMANDID, null);
                } catch (Exception ex) {
                    throw new RuntimeException(CreateEigenleistungUi.COMMANDID, ex);
                }
                lLst.refresh();
            }
        });
        makeActions();
        ViewMenus menus = new ViewMenus(site);
        menus.createControlContextMenu(lLst.getControl(), new ViewMenus.IMenuPopulator() {
            public IAction[] fillMenu() {
                IVerrechenbar iv = (IVerrechenbar) ((IStructuredSelection) lLst.getSelection()).getFirstElement();
                if (iv instanceof Eigenleistung) {
                    return new IAction[] { moveUpAction, moveDownAction, null, removeLeistung, editAction };
                } else {
                    return new IAction[] { moveUpAction, moveDownAction, null, removeLeistung };
                }

            }
        });
        // menus.createViewerContextMenu(lLst,moveUpAction,moveDownAction,null,removeLeistung,editAction);
        lLst.setInput(site);
        return body;
    }

    public Class<? extends PersistentObject> getElementClass() {
        return Leistungsblock.class;
    }

    public void display(final Object obj) {
        if (obj == null) {
            bNew.setEnabled(false);
            tName.setText(StringConstants.EMPTY);
            cbMandant.select(0);
        } else {
            Leistungsblock lb = (Leistungsblock) obj;
            tName.setText(lb.get(Messages.getString("BlockDetailDisplay.name"))); //$NON-NLS-1$
            String mId = lb.get(Leistungsblock.MANDANT_ID);
            int sel = 0;
            if (!StringTool.isNothing(mId)) {
                String[] items = cbMandant.getItems();
                sel = StringTool.getIndex(items, Mandant.load(mId).getLabel());
            }
            cbMandant.select(sel);
            bNew.setEnabled(true);
        }
        lLst.refresh(true);
    }

    public String getTitle() {
        return Messages.getString("BlockDetailDisplay.blocks"); //$NON-NLS-1$
    }

    private void makeActions() {
        removeLeistung = new Action(Messages.getString("BlockDetailDisplay.remove")) { //$NON-NLS-1$
            @Override
            public void run() {
                Leistungsblock lb = (Leistungsblock) ElexisEventDispatcher.getSelected(Leistungsblock.class);
                if (lb != null) {
                    IStructuredSelection sel = (IStructuredSelection) lLst.getSelection();
                    Object o = sel.getFirstElement();
                    if (o != null) {
                        lb.removeElement((ICodeElement) o);
                        lLst.refresh();
                    }
                }
            }
        };
        moveUpAction = new Action(Messages.getString("BlockDetailDisplay.moveUp")) { //$NON-NLS-1$
            @Override
            public void run() {
                moveElement(-1);
            }
        };
        moveDownAction = new Action(Messages.getString("BlockDetailDisplay.moveDown")) { //$NON-NLS-1$
            @Override
            public void run() {
                moveElement(1);
            }
        };
        editAction = new Action(Messages.getString("BlockDetailDisplay.changeAction")) { //$NON-NLS-1$
            {
                setImageDescriptor(Images.IMG_EDIT.getImageDescriptor());
                setToolTipText(Messages.getString("BlockDetailDisplay.changeActionTooltip")); //$NON-NLS-1$
            }

            @Override
            public void run() {
                IStructuredSelection sel = (IStructuredSelection) lLst.getSelection();
                PersistentObject parameter = (PersistentObject) sel.getFirstElement();
                EditEigenleistungUi.executeWithParams(parameter);
            }
        };
    }

    private void moveElement(final int off) {
        Leistungsblock lb = (Leistungsblock) ElexisEventDispatcher.getSelected(Leistungsblock.class);
        if (lb != null) {
            IStructuredSelection sel = (IStructuredSelection) lLst.getSelection();
            Object o = sel.getFirstElement();
            if (o != null) {
                lb.moveElement((ICodeElement) o, off);
                lLst.refresh();
            }
        }

    }
}