ch.elexis.core.ui.views.textsystem.PlatzhalterView.java Source code

Java tutorial

Introduction

Here is the source code for ch.elexis.core.ui.views.textsystem.PlatzhalterView.java

Source

/*******************************************************************************
 * Copyright (c) 2007-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 API and implementation
 ******************************************************************************/
package ch.elexis.core.ui.views.textsystem;

import java.util.List;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceAdapter;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.part.ViewPart;

import ch.elexis.core.data.constants.ExtensionPointConstantsData;
import ch.elexis.core.data.interfaces.IDataAccess;
import ch.elexis.core.data.interfaces.IDataAccess.Element;
import ch.elexis.core.data.util.Extensions;
import ch.elexis.core.data.util.SortedList;
import ch.elexis.core.ui.views.TextView;

public class PlatzhalterView extends ViewPart {
    public static final String ID = "ch.elexis.views.textsystem.Platzhalterview"; //$NON-NLS-1$

    private TreeViewer viewer;

    class PlatzhalterContentProvider implements ITreeContentProvider {

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

        public void dispose() {
        }

        public Object[] getElements(Object inputElement) {
            return ((List<?>) inputElement).toArray();
        }

        public Object[] getChildren(Object parentElement) {
            PlatzhalterTreeData entry = (PlatzhalterTreeData) parentElement;
            List<PlatzhalterTreeData> childrenList = entry.getChildren();
            return childrenList.toArray(new PlatzhalterTreeData[childrenList.size()]);
        }

        public Object getParent(Object element) {
            PlatzhalterTreeData entry = (PlatzhalterTreeData) element;
            return entry.getParent();
        }

        public boolean hasChildren(Object element) {
            return getChildren(element).length > 0;
        }
    }

    private class PlatzhalterLabelProvider extends CellLabelProvider {
        @Override
        public String getToolTipText(Object element) {
            PlatzhalterTreeData data = (PlatzhalterTreeData) element;
            if (data != null) {
                return data.getDescription();
            }
            return null;
        }

        @Override
        public Point getToolTipShift(Object object) {
            return new Point(5, 5);
        }

        @Override
        public int getToolTipDisplayDelayTime(Object object) {
            return 500;
        }

        @Override
        public int getToolTipTimeDisplayed(Object object) {
            return 5000;
        }

        @Override
        public void update(ViewerCell cell) {
            PlatzhalterTreeData data = (PlatzhalterTreeData) cell.getElement();
            if (data != null) {
                cell.setText(data.getName());
            }
        }
    };

    /**
     * Copy selected key to clipboard
     */
    private void copyToClipboard() {
        String key = getSelectedKey();
        if (key != null) {
            Clipboard clipboard = new Clipboard(getViewSite().getShell().getDisplay());
            clipboard.setContents(new Object[] { key }, new Transfer[] { TextTransfer.getInstance() });
            clipboard.dispose();
        }
    }

    /**
     * Returns the key of the selection or null
     */
    private String getSelectedKey() {
        TreeItem[] items = viewer.getTree().getSelection();
        if (items != null && items.length > 0) {
            String key = ((PlatzhalterTreeData) items[0].getData()).getKey();
            if (key != null && key.length() > 0) {
                return key;
            }
        }
        return null;
    }

    @Override
    public void createPartControl(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayout(new GridLayout(1, false));

        Text txtInfo = new Text(composite, SWT.MULTI | SWT.READ_ONLY | SWT.BORDER | SWT.WRAP);
        txtInfo.setText(Messages.PlatzhalterView_message_Info);
        GridDataFactory.fillDefaults().grab(true, false).applyTo(txtInfo);

        viewer = new TreeViewer(composite);
        GridDataFactory.fillDefaults().grab(true, true).applyTo(viewer.getTree());

        viewer.setLabelProvider(new PlatzhalterLabelProvider());
        viewer.setContentProvider(new PlatzhalterContentProvider());
        viewer.setInput(getTreeData());
        ColumnViewerToolTipSupport.enableFor(viewer, ToolTip.NO_RECREATE);

        // Popup-Menu "Kopieren"
        MenuManager popupMenuManager = new MenuManager();
        Menu menu = popupMenuManager.createContextMenu(viewer.getTree());
        viewer.getTree().setMenu(menu);

        final Action copyAction = new Action(Messages.PlatzhalterView_menu_copy) {
            @Override
            public String getId() {
                return "copyId"; //$NON-NLS-1$
            }

            @Override
            public void run() {
                copyToClipboard();
            }
        };
        popupMenuManager.add(copyAction);

        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                copyAction.setEnabled(getSelectedKey() != null);
            }
        });

        // CTRL+C
        viewer.getTree().addKeyListener(new KeyAdapter() {
            private final static int C = 99;

            private boolean isActive(final int stateMask, final int keyCode) {
                boolean modifiersOk = true;
                if ((stateMask & SWT.CTRL) == 0) {
                    modifiersOk = false;
                }
                return modifiersOk && keyCode == C;
            }

            @Override
            public void keyPressed(KeyEvent e) {
                if (isActive(e.stateMask, e.keyCode)) {
                    copyToClipboard();
                }
            }
        });

        // Doubleclick
        viewer.getTree().addMouseListener(new MouseAdapter() {
            @Override
            public void mouseDoubleClick(MouseEvent e) {
                String key = getSelectedKey();
                if (key != null) {
                    for (IViewReference viewRef : getViewSite().getPage().getViewReferences()) {
                        if (TextView.ID.equals(viewRef.getId())) {
                            TextView txtView = (TextView) viewRef.getPart(false);
                            if (txtView != null) {
                                txtView.getTextContainer().getPlugin().insertText((Object) null, key, SWT.LEFT);
                            }
                        }
                    }
                }
            }
        });

        // Drag & Drop
        DragSource dragSource = new DragSource(viewer.getTree(), DND.DROP_COPY);
        dragSource.setTransfer(new Transfer[] { TextTransfer.getInstance() });
        dragSource.addDragListener(new DragSourceAdapter() {
            public void dragStart(DragSourceEvent event) {
                event.doit = getSelectedKey() != null;
            }

            public void dragSetData(DragSourceEvent event) {
                if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
                    String key = getSelectedKey();
                    if (key != null) {
                        event.data = key;
                    }
                }
            }
        });
    }

    /**
     * Retourniert Liste aller Platzhalter als Tree
     * 
     * @return
     */
    @SuppressWarnings("unchecked")
    private SortedList<PlatzhalterTreeData> getTreeData() {
        PlatzhalterTreeData root = new PlatzhalterTreeData("Root", "", ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

        // Basis Platzhalter
        PlatzhalterProperties props = new PlatzhalterProperties();
        root.addChildren(props.getList());

        // DataAccess TextPlaceHolder implementations
        List<IConfigurationElement> textPlaceHolderList = Extensions
                .getExtensions(ExtensionPointConstantsData.DATA_ACCESS, "TextPlaceHolder");//$NON-NLS-1$ //$NON-NLS-2$
        for (IConfigurationElement iConfigurationElement : textPlaceHolderList) {
            boolean found = false;
            String name = iConfigurationElement.getAttribute("name");
            String type = iConfigurationElement.getAttribute("type");
            String typeName = type.substring(type.lastIndexOf('.') + 1);
            if (name != null && type != null) {
                PlatzhalterTreeData treeData = root.getChild(typeName);
                if (treeData != null) {
                    PlatzhalterTreeData childData = treeData.getChild(name);
                    if (childData != null) {
                        found = true;
                    }
                }
            }
            if (!found) {
                PlatzhalterTreeData treeData = root.getChild(typeName);
                if (treeData == null) {
                    treeData = new PlatzhalterTreeData(typeName, "", "");
                }
                treeData.addChild(new PlatzhalterTreeData(name, "[" + typeName + "." + name + "]", ""));
            }
        }

        // IDataAccess Implementations
        List<IDataAccess> dataAccessList = Extensions.getClasses(ExtensionPointConstantsData.DATA_ACCESS,
                "DataAccess", "class");//$NON-NLS-1$ //$NON-NLS-2$
        for (IDataAccess dataAccess : dataAccessList) {
            PlatzhalterTreeData treeData = new PlatzhalterTreeData(dataAccess.getName(), "", //$NON-NLS-1$
                    dataAccess.getDescription());
            if (dataAccess.getList() != null) {
                for (Element element : dataAccess.getList()) {
                    treeData.addChild(new PlatzhalterTreeData(element.getName(), element.getPlaceholder(),
                            element.getName()));
                }
            }
            root.addChild(treeData);
        }

        return root.getChildren();
    }

    @Override
    public void setFocus() {
        viewer.getTree().setFocus();
    }

}