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

Java tutorial

Introduction

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

Source

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

import java.text.MessageFormat;
import java.util.List;

import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridLayout;
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.TableColumn;
import org.eclipse.swt.widgets.TableItem;

import ch.elexis.core.data.events.ElexisEventDispatcher;
import ch.elexis.core.model.ISticker;
import ch.elexis.core.ui.data.UiSticker;
import ch.elexis.core.ui.locks.AcquireLockBlockingUi;
import ch.elexis.core.ui.locks.ILockHandler;
import ch.elexis.core.ui.util.SWTHelper;
import ch.elexis.data.PersistentObject;
import ch.elexis.data.Sticker;

public class AssignStickerDialog extends TitleAreaDialog {
    PersistentObject mine;
    TableViewer viewer;
    StickerViewerComparator comparator;
    List<Sticker> alleEtiketten;
    List<ISticker> mineEtiketten;

    public AssignStickerDialog(Shell shell, PersistentObject obj) {
        super(shell);
        mine = obj;
        mineEtiketten = mine.getStickers();
        alleEtiketten = Sticker.getStickersForClass(mine.getClass());
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        Composite ret = new Composite(parent, SWT.NONE);
        ret.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
        ret.setLayout(new GridLayout());
        Label lbl = new Label(ret, SWT.WRAP);
        lbl.setText(Messages.AssignStickerDialog_PleaseConfirm); //$NON-NLS-1$

        viewer = new TableViewer(ret, SWT.CHECK | SWT.FULL_SELECTION);
        viewer.getTable().setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
        viewer.getTable().setHeaderVisible(true);
        viewer.setContentProvider(ArrayContentProvider.getInstance());
        viewer.setInput(alleEtiketten);
        createColumns();
        comparator = new StickerViewerComparator();
        viewer.setComparator(comparator);
        checkAlreadySelected();

        return ret;
    }

    private void checkAlreadySelected() {
        TableItem[] tableItems = viewer.getTable().getItems();
        for (TableItem item : tableItems) {
            if (mineEtiketten.contains(item.getData())) {
                item.setChecked(true);
            }
        }
    }

    private void createColumns() {
        // first column - label
        TableViewerColumn col = new TableViewerColumn(viewer, SWT.NONE);
        col.getColumn().setText(Messages.AssignStickerDialog_StickerName);
        col.getColumn().setWidth(300);
        col.getColumn().addSelectionListener(getSelectionAdapter(col.getColumn(), 0));
        col.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                Sticker s = (Sticker) element;
                return s.getLabel();
            }

            @Override
            public Color getBackground(Object element) {
                Sticker s = (Sticker) element;
                UiSticker uiSticker = new UiSticker(s);
                return uiSticker.getBackground();
            }

            @Override
            public Color getForeground(Object element) {
                Sticker s = (Sticker) element;
                UiSticker uiSticker = new UiSticker(s);
                return uiSticker.getForeground();
            }
        });

        // second column - value
        col = new TableViewerColumn(viewer, SWT.NONE);
        col.getColumn().setText(Messages.AssignStickerDialog_StickerWert);
        col.getColumn().setWidth(50);
        col.getColumn().addSelectionListener(getSelectionAdapter(col.getColumn(), 1));
        col.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                Sticker s = (Sticker) element;
                return s.getWert() + "";
            }

            @Override
            public Color getBackground(Object element) {
                Sticker s = (Sticker) element;
                UiSticker uiSticker = new UiSticker(s);
                return uiSticker.getBackground();
            }

            @Override
            public Color getForeground(Object element) {
                Sticker s = (Sticker) element;
                UiSticker uiSticker = new UiSticker(s);
                return uiSticker.getForeground();
            }
        });
    }

    private SelectionAdapter getSelectionAdapter(final TableColumn column, final int index) {
        SelectionAdapter selectionAdapter = new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                comparator.setColumn(index);
                viewer.getTable().setSortDirection(comparator.getDirection());
                viewer.getTable().setSortColumn(column);
                viewer.refresh();
            }
        };
        return selectionAdapter;
    }

    @Override
    public void create() {
        super.create();
        setTitle("Sticker"); //$NON-NLS-1$
        setMessage(MessageFormat.format(Messages.AssignStickerDialog_enterStickers, mine.getLabel())); //$NON-NLS-1$
        getShell().setText("Elexis Sticker"); //$NON-NLS-1$
    }

    @Override
    protected void okPressed() {

        AcquireLockBlockingUi.aquireAndRun(mine, new ILockHandler() {
            @Override
            public void lockFailed() {

            }

            @Override
            public void lockAcquired() {
                TableItem[] tableItems = viewer.getTable().getItems();
                for (TableItem it : tableItems) {
                    Sticker et = (Sticker) it.getData();
                    if (it.getChecked()) {
                        if (!mineEtiketten.contains(et)) {
                            mine.addSticker(et);
                        }
                    } else {
                        if (mineEtiketten.contains(et)) {
                            mine.removeSticker(et);
                        }
                    }
                }
                ElexisEventDispatcher.update(mine);
                closeDialog(true);
            }
        });

    }

    private void closeDialog(boolean withOk) {
        if (withOk) {
            super.okPressed();
        } else {
            super.cancelPressed();
        }
    }

    class StickerViewerComparator extends ViewerComparator {
        private int propertyIndex;
        private boolean direction = true;
        private Sticker s1;
        private Sticker s2;

        public StickerViewerComparator() {
            this.propertyIndex = 0;
        }

        @Override
        public int compare(Viewer viewer, Object e1, Object e2) {
            if (e1 instanceof Sticker && e2 instanceof Sticker) {
                s1 = (Sticker) e1;
                s2 = (Sticker) e2;
                int rc = 0;

                switch (propertyIndex) {
                case 0:
                    String label1 = s1.getLabel().toLowerCase();
                    String label2 = s2.getLabel().toLowerCase();
                    rc = label1.compareTo(label2);
                    break;
                case 1:
                    Integer wert1 = s1.getWert();
                    Integer wert2 = s2.getWert();
                    rc = wert1.compareTo(wert2);
                    break;
                default:
                    break;
                }

                // If descending order, flip the direction
                if (direction) {
                    rc = -rc;
                }
                return rc;
            }
            return 0;
        }

        /**
         * for sort direction
         * 
         * @return SWT.DOWN or SWT.UP
         */
        public int getDirection() {
            return direction ? SWT.DOWN : SWT.UP;
        }

        public void setColumn(int column) {
            if (column == this.propertyIndex) {
                // Same column as last sort; toggle the direction
                direction = !direction;
            } else {
                // New column; do an ascending sort
                this.propertyIndex = column;
                direction = true;
            }
        }

    }

}