ch.elexis.dialogs.OrderImportDialog.java Source code

Java tutorial

Introduction

Here is the source code for ch.elexis.dialogs.OrderImportDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2005-2009, 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:
 *    D. Lutz - initial implementation
 *    
 *******************************************************************************/
package ch.elexis.dialogs;

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

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TableViewerEditor;
import org.eclipse.jface.viewers.TableViewerFocusCellManager;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.Table;

import ch.elexis.actions.ScannerEvents;
import ch.elexis.data.Artikel;
import ch.elexis.data.Bestellung;
import ch.elexis.text.ElexisText;
import ch.elexis.util.SWTHelper;
import ch.rgw.tools.StringTool;

/*
 * @author Daniel Lutz
 *
 */
public class OrderImportDialog extends TitleAreaDialog {
    private static final String ALLE_MARKIEREN = " Alle markieren ";
    private static final int DIFF_SPINNER_MIN = 1;
    private static final int DIFF_SPINNER_DEFAULT = 1;

    /**
     * Order to act on
     */
    private List<OrderElement> orderElements;

    private Spinner diffSpinner;
    private ElexisText eanText;

    private TableViewer viewer;

    private Color verifiedColor;
    private Font boldFont;

    public OrderImportDialog(Shell parentShell, Bestellung bestellung) {
        super(parentShell);

        setShellStyle(getShellStyle() | SWT.SHELL_TRIM);

        orderElements = new ArrayList<OrderElement>();
        List<Bestellung.Item> items = bestellung.asList();
        for (Bestellung.Item item : items) {
            OrderElement orderElement = new OrderElement(item.art, item.num);
            orderElements.add(orderElement);
        }
    }

    public OrderImportDialog(Shell parentShell, List<Bestellung.Item> items) {
        super(parentShell);

        setShellStyle(getShellStyle() | SWT.SHELL_TRIM);

        orderElements = new ArrayList<OrderElement>();
        for (Bestellung.Item item : items) {
            OrderElement orderElement = new OrderElement(item.art, item.num);
            orderElements.add(orderElement);
        }
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        Composite mainArea = new Composite(parent, SWT.NONE);
        mainArea.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
        mainArea.setLayout(new GridLayout());

        Composite scannerArea = new Composite(mainArea, SWT.NONE);
        scannerArea.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
        scannerArea.setLayout(new GridLayout());

        Group scannerGroup = new Group(scannerArea, SWT.NONE);
        scannerGroup.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
        scannerGroup.setLayout(new GridLayout(4, false));
        scannerGroup.setText("Einlesen mit Barcode-Scanner");

        diffSpinner = new Spinner(scannerGroup, SWT.NONE);
        diffSpinner.setMinimum(DIFF_SPINNER_MIN);
        diffSpinner.setSelection(DIFF_SPINNER_DEFAULT);

        Label eanLabel = new Label(scannerGroup, SWT.NONE);
        eanLabel.setText("EAN:");
        eanText = new ElexisText(scannerGroup, SWT.NONE);
        eanText.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));

        eanText.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.character == SWT.CR) {
                    applyScanner();
                }
            }
        });

        Button button = new Button(scannerGroup, SWT.PUSH);
        button.setText("bernehmen");
        button.addSelectionListener(new SelectionListener() {
            public void widgetSelected(SelectionEvent e) {
                applyScanner();
            }

            public void widgetDefaultSelected(SelectionEvent e) {
                // do nothing
            }
        });

        Composite tableArea = new Composite(mainArea, SWT.NONE);
        tableArea.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
        tableArea.setLayout(new GridLayout());

        viewer = new TableViewer(tableArea, SWT.FULL_SELECTION);
        Table table = viewer.getTable();
        table.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
        table.setLinesVisible(true);
        table.setHeaderVisible(true);

        verifiedColor = table.getDisplay().getSystemColor(SWT.COLOR_DARK_GREEN);
        boldFont = createBoldFont(table.getFont());

        final TableViewerFocusCellManager mgr = new TableViewerFocusCellManager(viewer,
                new FocusCellOwnerDrawHighlighter(viewer));
        ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(viewer) {
            protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
                return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
                        || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
                        || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED
                                && (event.keyCode == SWT.CR || event.character == ' '))
                        || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
            }
        };

        TableViewerEditor.create(viewer, mgr, actSupport,
                ColumnViewerEditor.TABBING_HORIZONTAL | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
                        | ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);

        createViewerColumns();

        viewer.setContentProvider(new ViewerContentProvider());
        viewer.setInput(this);

        Composite cButtons = new Composite(mainArea, SWT.NONE);
        cButtons.setLayout(new GridLayout(2, false));
        final Button clickAllButton = new Button(cButtons, SWT.PUSH);
        clickAllButton.setText(ALLE_MARKIEREN);
        clickAllButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                boolean bv = true;
                if (clickAllButton.getText().equals(ALLE_MARKIEREN)) {
                    bv = true;
                    clickAllButton.setText("Alle demarkieren");
                } else {
                    bv = false;
                    clickAllButton.setText(ALLE_MARKIEREN);
                }

                for (OrderElement oe : orderElements) {
                    oe.setVerified(bv);
                }
                viewer.refresh(true);
            }

        });
        Button importButton = new Button(cButtons, SWT.PUSH);
        GridData gd = new GridData(SWT.RIGHT, SWT.CENTER, false, false);
        importButton.setLayoutData(gd);
        importButton.setText("Lagerbestnde anpassen");
        importButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                doImport();
            }
        });
        cButtons.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
        return mainArea;
    }

    private Font createBoldFont(Font baseFont) {
        FontData fd = baseFont.getFontData()[0];
        Font font = new Font(baseFont.getDevice(), fd.getName(), fd.getHeight(), fd.getStyle() | SWT.BOLD);
        return font;
    }

    private void createViewerColumns() {
        TableViewerColumn column;

        final CheckboxCellEditor checkboxCellEditor = new CheckboxCellEditor(viewer.getTable());
        final TextCellEditor textCellEditor = new TextCellEditor(viewer.getTable());

        /* OK (checkbox column) */
        column = new TableViewerColumn(viewer, SWT.LEFT);
        column.getColumn().setText("OK");
        column.getColumn().setWidth(50);
        column.setLabelProvider(new CheckboxLabelProvider());
        column.setEditingSupport(new EditingSupport(viewer) {
            public boolean canEdit(Object element) {
                return true;
            }

            public CellEditor getCellEditor(Object element) {
                return checkboxCellEditor;
            }

            public Object getValue(Object element) {
                if (element instanceof OrderElement) {
                    OrderElement orderElement = (OrderElement) element;
                    return new Boolean(orderElement.isVerified());
                } else {
                    return null;
                }
            }

            public void setValue(Object element, Object value) {
                if (element instanceof OrderElement) {
                    OrderElement orderElement = (OrderElement) element;
                    if (value instanceof Boolean) {
                        Boolean bValue = (Boolean) value;
                        orderElement.setVerified(bValue.booleanValue());
                    }
                    viewer.update(orderElement, null);
                }
            }
        });

        /* Amount */
        column = new TableViewerColumn(viewer, SWT.LEFT);
        column.getColumn().setText("Geliefert");
        column.getColumn().setWidth(60);
        column.setLabelProvider(new AmountLabelProvider());
        column.setEditingSupport(new EditingSupport(viewer) {
            public boolean canEdit(Object element) {
                return true;
            }

            public CellEditor getCellEditor(Object element) {
                return textCellEditor;
            }

            public Object getValue(Object element) {
                if (element instanceof OrderElement) {
                    OrderElement orderElement = (OrderElement) element;
                    return orderElement.getAmountAsString();
                } else {
                    return null;
                }
            }

            public void setValue(Object element, Object value) {
                if (element instanceof OrderElement) {
                    OrderElement orderElement = (OrderElement) element;
                    if (value instanceof String) {
                        String text = (String) value;
                        try {
                            int amount = Integer.parseInt(text);
                            orderElement.setAmount(amount);
                            orderElement.setVerified(true);
                        } catch (NumberFormatException ex) {
                            // ignore invalid value
                        }
                    }
                    viewer.update(orderElement, null);
                }
            }
        });

        /* Amount */
        column = new TableViewerColumn(viewer, SWT.LEFT);
        column.getColumn().setText("Lager");
        column.getColumn().setWidth(60);
        column.setLabelProvider(new StockLabelProvider());

        /* Pharamcode */
        column = new TableViewerColumn(viewer, SWT.LEFT);
        column.getColumn().setText("Pharmacode");
        column.getColumn().setWidth(80);
        column.setLabelProvider(new PharamcodeLabelProvider());

        /* EAN */
        column = new TableViewerColumn(viewer, SWT.LEFT);
        column.getColumn().setText("EAN");
        column.getColumn().setWidth(110);
        column.setLabelProvider(new EANLabelProvider());

        /* Description */
        column = new TableViewerColumn(viewer, SWT.LEFT);
        column.getColumn().setText("Beschreibung");
        column.getColumn().setWidth(300);
        column.setLabelProvider(new DescriptionLabelProvider());

    }

    @Override
    public void create() {
        super.create();
        setTitle("Bestellung im Lager einbuchen");
        setMessage(
                "Bitte berprfen Sie alle bestellten Artikel." + " berprfte Artikel werden grn angezeigt."
                        + " Bei der Anpassung der Lagerbestnde werden nur jene Artikel"
                        + " bercksichtigt, bei denen unter \"OK\" ein Haken gesetzt ist.");
        // setTitleImage(...));
        getShell().setText("Bestellung im Lager einbuchen");
    }

    // Replace OK/Cancel buttons by a close button
    protected void createButtonsForButtonBar(Composite parent) {
        // Create Close button
        createButton(parent, IDialogConstants.OK_ID, "Schliessen", false);
    }

    @Override
    protected void okPressed() {
        super.okPressed();
    }

    // update the table according to the input from the scanner
    private void applyScanner() {
        int diff = diffSpinner.getSelection();

        String ean = eanText.getText().trim();
        // remove silly characters from scanner
        ean = ean.replaceAll(new Character(SWT.CR).toString(), "");
        ean = ean.replaceAll(new Character(SWT.LF).toString(), "");
        ean = ean.replaceAll(new Character((char) 0).toString(), "");

        eanText.setText("");
        diffSpinner.setSelection(DIFF_SPINNER_DEFAULT);

        OrderElement orderElement = findOrderElementByEAN(ean);
        if (orderElement != null) {
            int newAmount = orderElement.getAmount() + diff;
            updateOrderElement(orderElement, newAmount);
        } else {
            ScannerEvents.beep();
            SWTHelper.alert("Artikel nicht bestellt",
                    "Dieser Artikel wurde nicht bestellt. Der Bestand kann nicht automatisch angepasst werden.");
        }
    }

    private OrderElement findOrderElementByEAN(String ean) {
        if (ean == null) {
            return null;
        }

        for (OrderElement orderElement : orderElements) {
            if (orderElement.getArtikel().getEAN().equals(ean)) {
                return orderElement;
            }
        }

        // not found
        return null;
    }

    private void updateOrderElement(OrderElement orderElement, int newAmount) {
        orderElement.setAmount(newAmount);
        orderElement.setVerified(true);
        viewer.update(orderElement, null);
    }

    // read in verified order
    public void doImport() {
        try {
            for (OrderElement orderElement : orderElements) {
                if (orderElement.isVerified()) {
                    Artikel artikel = orderElement.getArtikel();
                    int diff = orderElement.getAmount();
                    int oldAmount = artikel.getIstbestand();
                    int newAmount = oldAmount + diff;
                    artikel.setIstbestand(newAmount);

                    // reset ordered information
                    Boolean alreadyOrdered = artikel.getExt(Bestellung.ISORDERED).equalsIgnoreCase("true");
                    if (alreadyOrdered) {
                        artikel.setExt(Bestellung.ISORDERED, "false");
                    }

                    // reset amount
                    orderElement.setAmount(0);
                    orderElement.setVerified(false);
                }
            }
        } catch (Exception ex) {
            SWTHelper.showError("Fehler bei Anpassung der Bestnde",
                    "Bestnde konnten teilweise nicht korrekt angepasst werden.");
        }

        viewer.refresh();
    }

    class ViewerContentProvider implements IStructuredContentProvider {
        public Object[] getElements(Object inputElement) {
            return orderElements.toArray();
        }

        public void dispose() {
            // do nothing
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            // do nothing
        }
    }

    class BaseLabelProvider extends ColumnLabelProvider {
        public Color getForeground(Object element) {
            Color color = null;

            if (element instanceof OrderElement) {
                OrderElement orderElement = (OrderElement) element;
                if (orderElement.isVerified()) {
                    color = OrderImportDialog.this.verifiedColor;
                }
            }

            return color;
        }

        public Font getFont(Object element) {
            Font font = null;

            if (element instanceof OrderElement) {
                OrderElement orderElement = (OrderElement) element;
                if (orderElement.isVerified() && orderElement.getAmount() > 0) {
                    font = OrderImportDialog.this.boldFont;
                }
            }

            return font;
        }
    }

    class CheckboxLabelProvider extends BaseLabelProvider {
        public String getText(Object element) {
            String text = "";

            if (element instanceof OrderElement) {
                OrderElement orderElement = (OrderElement) element;
                if (orderElement.isVerified()) {
                    text = "X";
                }
            }

            return text;
        }
    }

    class AmountLabelProvider extends BaseLabelProvider {
        public String getText(Object element) {
            String text = "";

            if (element instanceof OrderElement) {
                OrderElement orderElement = (OrderElement) element;
                text = orderElement.getAmountAsString();
            }

            return text;
        }
    }

    class StockLabelProvider extends BaseLabelProvider {
        public String getText(Object element) {
            String text = "";

            if (element instanceof OrderElement) {
                OrderElement orderElement = (OrderElement) element;
                text = new Integer(orderElement.getArtikel().getIstbestand()).toString();
            }

            return text;
        }
    }

    class PharamcodeLabelProvider extends BaseLabelProvider {
        public String getText(Object element) {
            String text = "";

            if (element instanceof OrderElement) {
                OrderElement orderElement = (OrderElement) element;
                text = orderElement.artikel.getPharmaCode();
            }

            return text;
        }
    }

    class EANLabelProvider extends BaseLabelProvider {
        public String getText(Object element) {
            String text = "";

            if (element instanceof OrderElement) {
                OrderElement orderElement = (OrderElement) element;
                text = orderElement.artikel.getExt("EAN");
                if (StringTool.isNothing(text)) {
                    text = orderElement.artikel.getEAN();
                }
            }

            return text;
        }
    }

    class DescriptionLabelProvider extends BaseLabelProvider {
        public String getText(Object element) {
            String text = "";

            if (element instanceof OrderElement) {
                OrderElement orderElement = (OrderElement) element;
                text = orderElement.artikel.getName();
            }

            return text;
        }
    }

    class OrderElement {
        private boolean verified = false;

        private Artikel artikel;
        private int amount;

        OrderElement(Artikel artikel, int amount) {
            this.artikel = artikel;
            this.amount = amount;
        }

        int getAmount() {
            return amount;
        }

        /**
         * Set new amount. Sets verified to true.
         * 
         * @param amount
         *            the new amount
         */
        void setAmount(int amount) {
            this.amount = amount;
        }

        Artikel getArtikel() {
            return artikel;
        }

        String getAmountAsString() {
            return new Integer(amount).toString();
        }

        boolean isVerified() {
            return verified;
        }

        void setVerified(boolean verified) {
            this.verified = verified;
        }
    }
}