bitub.sgf.jreality.views.viewer.JRealitySceneGraphTreeViewer.java Source code

Java tutorial

Introduction

Here is the source code for bitub.sgf.jreality.views.viewer.JRealitySceneGraphTreeViewer.java

Source

/*
 * Copyright (c) 2012-2015 Bernold Kraft (Berlin, Germany).
 * 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:
 * Initial commit by bernold @ 28.02.2013.
 */
package bitub.sgf.jreality.views.viewer;

import java.util.List;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.edit.ui.dnd.LocalTransfer;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerDropAdapter;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.dnd.TransferData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.progress.UIJob;

import bitub.sgf.jreality.event.SceneChangeNotification;
import de.jreality.scene.SceneGraphComponent;
import de.jreality.scene.SceneGraphNode;
import de.jreality.scene.SceneGraphPath;
import de.jreality.util.EncompassFactory;
import de.jreality.util.SceneGraphUtility;

/**
 * <!-- begin-user-doc -->
 * <!-- end-user-doc -->
 * 
 * @generated NOT
 * @author bernold - 28.02.2013
 */
public class JRealitySceneGraphTreeViewer extends TreeViewer {
    /**
     * 
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated NOT
     * @author bernold - 30.08.2013
     */
    static class SceneGraphComponentDropListener extends ViewerDropAdapter {
        /**
         * <!-- begin-user-doc -->
         * <!-- end-user-doc -->
         * @generated NOT
         */
        public SceneGraphComponentDropListener(Viewer v) {
            super(v);
        }

        /**
         * <!-- begin-user-doc -->
         * <!-- end-user-doc -->
         * @generated NOT
         * @see org.eclipse.swt.dnd.DropTargetAdapter#drop(org.eclipse.swt.dnd.DropTargetEvent)
         */
        @Override
        public void drop(DropTargetEvent event) {
            //      Object source = event.getSource();      
            //      Object determineTarget = determineTarget(event);

            super.drop(event);
        }

        /**
         * <!-- begin-user-doc -->
         * <!-- end-user-doc -->
         * @generated NOT
         * @see org.eclipse.jface.viewers.ViewerDropAdapter#performDrop(java.lang.Object)
         */
        @Override
        public boolean performDrop(Object data) {
            if (data instanceof SceneGraphComponent)
                return true;

            return Platform.getAdapterManager().hasAdapter(data, SceneGraphComponent.class.getName());
        }

        /**
         * <!-- begin-user-doc -->
         * <!-- end-user-doc -->
         * @generated NOT
         * @see org.eclipse.jface.viewers.ViewerDropAdapter#validateDrop(java.lang.Object, int, org.eclipse.swt.dnd.TransferData)
         */
        @Override
        public boolean validateDrop(Object target, int operation, TransferData transferType) {
            return (target instanceof SceneGraphComponent)
                    && LocalSelectionTransfer.getTransfer().isSupportedType(transferType);
        }

        /**
         * <!-- begin-user-doc -->
         * <!-- end-user-doc -->
         * @generated NOT
         * @see org.eclipse.jface.viewers.ViewerDropAdapter#dropAccept(org.eclipse.swt.dnd.DropTargetEvent)
         */
        @Override
        public void dropAccept(DropTargetEvent event) {
            super.dropAccept(event);
        }

    }

    /**
     * 
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated NOT
     * @author bernold - 28.02.2013
     */
    public static class JRealitySceneNodeLabelProvider extends StyledCellLabelProvider {

        /**
         * <!-- begin-user-doc -->
         * <!-- end-user-doc -->
         * @generated NOT
         * @see org.eclipse.jface.viewers.StyledCellLabelProvider#update(org.eclipse.jface.viewers.ViewerCell)
         */
        @Override
        public void update(ViewerCell cell) {
            Object element = cell.getElement();
            cell.setText(((SceneGraphComponent) element).getName());
            super.update(cell);
        }

    }

    /**
     * 
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated NOT
     * @author bernold - 28.02.2013
     */
    public static class JRealitySceneTreeContentProvider implements ITreeContentProvider {
        SceneGraphComponent rootNode;

        /**
         * <!-- begin-user-doc -->
         * <!-- end-user-doc -->
         * 
         * @generated NOT
         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
         */
        @Override
        public void dispose() {
            rootNode = null;
        }

        /**
         * <!-- begin-user-doc -->
         * <!-- end-user-doc -->
         * 
         * @generated NOT
         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
         *      java.lang.Object, java.lang.Object)
         */
        @Override
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            assert newInput instanceof SceneGraphComponent;

            rootNode = (SceneGraphComponent) newInput;
        }

        /**
         * <!-- begin-user-doc -->
         * <!-- end-user-doc -->
         * 
         * @generated NOT
         * @see org.eclipse.jface.viewers.ITreeContentProvider#getElements(java.lang.Object)
         */
        @Override
        public Object[] getElements(Object inputElement) {
            return getChildren(inputElement);
        }

        /**
         * <!-- begin-user-doc -->
         * <!-- end-user-doc -->
         * 
         * @generated NOT
         * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
         */
        @Override
        public Object[] getChildren(Object parentElement) {
            return ((SceneGraphComponent) parentElement).getChildComponents().toArray();
        }

        /**
         * <!-- begin-user-doc -->
         * <!-- end-user-doc -->
         * 
         * @generated NOT
         * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
         */
        @Override
        public Object getParent(Object element) {
            return getParentMatch(rootNode, (SceneGraphComponent) element);
        }

        /**
         * 
         * <!-- begin-user-doc -->
         * Recursive search for parent node.
         * <!-- end-user-doc -->
         * @generated NOT
         * @param parent
         * @param x
         * @return
         */
        SceneGraphComponent getParentMatch(SceneGraphComponent parent, SceneGraphComponent x) {
            for (SceneGraphComponent s : parent.getChildComponents()) {
                if (s.equals(x))
                    return parent;

                SceneGraphComponent parentMatch = getParentMatch(s, x);
                if (null != parentMatch)
                    return parentMatch;
            }
            return null;
        }

        /**
         * <!-- begin-user-doc -->
         * <!-- end-user-doc -->
         * 
         * @generated NOT
         * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
         */
        @Override
        public boolean hasChildren(Object element) {
            return ((SceneGraphComponent) element).getChildComponentCount() > 0;
        }

    }

    /**
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * 
     * @generated NOT
     * @param parent
     * @param style
     */
    public JRealitySceneGraphTreeViewer(Composite parent, int style) {
        super(parent, style);
        adoptSceneTree(this);
    }

    /**
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * 
     * @generated NOT
     * @param tree
     */
    public static void adoptSceneTree(TreeViewer tree) {
        tree.setContentProvider(new JRealitySceneTreeContentProvider());
        tree.setLabelProvider(new JRealitySceneNodeLabelProvider());
        tree.addDropSupport(DND.DROP_COPY | DND.DROP_MOVE,
                new Transfer[] { LocalTransfer.getInstance(), LocalSelectionTransfer.getTransfer() },
                new SceneGraphComponentDropListener(tree));
    }

    /**
     * 
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated NOT
     * @param tree
     * @param notifier
     */
    public static void bind(final TreeViewer tree, final JRealityContentViewer notifier) {
        notifier.eAdapters().add(new AdapterImpl() {

            /**
             * <!-- begin-user-doc -->
             * <!-- end-user-doc -->
             * @generated NOT
             * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
             */
            @Override
            public void notifyChanged(Notification msg) {
                if (msg instanceof SceneChangeNotification) {

                    new UIJob(tree.getControl().getDisplay(), "Refreshing...") {

                        @Override
                        public IStatus runInUIThread(IProgressMonitor monitor) {
                            tree.refresh(true);
                            return Status.OK_STATUS;
                        }

                    }.schedule();
                }
            }
        });

        tree.addSelectionChangedListener(new ISelectionChangedListener() {

            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                Object firstElement = ((IStructuredSelection) event.getSelection()).getFirstElement();
                if (firstElement instanceof SceneGraphComponent) {

                    de.jreality.scene.Viewer viewer = notifier.getEmbeddedViewer();
                    EncompassFactory ec = new EncompassFactory();
                    ec.setAvatarPath(notifier.getAvatarPath());

                    List<SceneGraphPath> pathsBetween = SceneGraphUtility.getPathsBetween(viewer.getSceneRoot(),
                            (SceneGraphNode) firstElement);

                    ec.setScenePath(pathsBetween.get(0));

                    ec.setCameraPath(notifier.getCamaraPath());
                    ec.setMargin(1.0);
                    ec.setMetric(de.jreality.math.Pn.EUCLIDEAN);
                    ec.update();
                }
            }
        });
    }
}