org.eclipse.reddeer.gef.spy.view.GEFSpyView.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.reddeer.gef.spy.view.GEFSpyView.java

Source

/*******************************************************************************
 * Copyright (c) 2017 Red Hat, Inc and others.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Red Hat, Inc - initial API and implementation
 *******************************************************************************/
package org.eclipse.reddeer.gef.spy.view;

import java.util.List;

import org.eclipse.draw2d.IFigure;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeNode;
import org.eclipse.jface.viewers.TreeNodeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.reddeer.gef.handler.EditPartHandler;
import org.eclipse.reddeer.gef.lookup.ViewerLookup;
import org.eclipse.reddeer.gef.spy.TreeNodeExt;
import org.eclipse.reddeer.workbench.core.lookup.EditorPartLookup;

/**
 * GEFSpy View.
 * 
 * @author apodhrad
 *
 */
public class GEFSpyView extends ViewPart {

    private TreeViewer treeViewer;

    @Override
    public void createPartControl(Composite parent) {
        treeViewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
        treeViewer.setContentProvider(new TreeNodeContentProvider());
        treeViewer.setLabelProvider(new GEFSpyViewLabelProvider());

        refresh(treeViewer);
        hookRefreshAction();
        hookSelectAction();
    }

    /**
     * Gets tree viewer. 
     * 
     * @return tree viewer 
     */
    public TreeViewer getTreeViewer() {
        return treeViewer;
    }

    /**
     * Refreshes a given tree viewer with all edit parts (or figures) if a GEF editor is available. Otherwise, it throws
     * a warning about that.
     * 
     * @param treeViewer
     *            Tree viewer
     */
    protected void refresh(TreeViewer treeViewer) {
        EditPart editPart = null;

        try {
            IEditorPart editorPart = EditorPartLookup.getInstance().getEditor();
            editPart = ViewerLookup.getInstance().findGraphicalViewer(editorPart).getContents();
        } catch (Exception ex) {
            treeViewer.setInput(new TreeNode[] {});
            MessageDialog.openWarning(treeViewer.getControl().getShell(), "GEF View",
                    "No GEF editor was detected.");
            return;
        }

        treeViewer.setInput(createTree(editPart));
        treeViewer.refresh();
    }

    /**
     * Creates a tree for a given edit part.
     * 
     * @param editPart
     *            Edit part
     * @return Root node of created tree
     */
    protected TreeNode[] createTree(EditPart editPart) {
        TreeNodeExt root = new TreeNodeExt(editPart);
        createTree(root);
        return new TreeNode[] { root };
    }

    /**
     * Creates a tree for a given tree node according to its value (edit part/figure).
     * 
     * @param node
     *            Tree node
     */
    protected void createTree(TreeNodeExt node) {
        Object obj = node.getValue();
        if (obj instanceof EditPart) {
            EditPart editPart = (EditPart) obj;
            List<Object> children = editPart.getChildren();
            for (Object child : children) {
                TreeNodeExt newNode = new TreeNodeExt(child);
                createTree(newNode);
                node.addChild(newNode);
            }
            if (editPart instanceof GraphicalEditPart) {
                IFigure figure = ((GraphicalEditPart) editPart).getFigure();
                TreeNodeExt newNode = new TreeNodeExt(figure);
                createTree(newNode);
                node.addChild(newNode);
            }
        }
        if (obj instanceof IFigure) {
            IFigure figure = (IFigure) obj;
            List<Object> children = figure.getChildren();
            for (Object child : children) {
                TreeNodeExt newNode = new TreeNodeExt(child);
                createTree(newNode);
                node.addChild(newNode);
            }
        }
    }

    private void hookRefreshAction() {
        Action refreshAction = new Action() {
            public void run() {
                refresh(treeViewer);
            }
        };
        refreshAction.setText("Refresh");
        refreshAction.setToolTipText("Refresh");
        refreshAction.setImageDescriptor(
                PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_ELCL_SYNCED));

        IActionBars bars = getViewSite().getActionBars();
        bars.getToolBarManager().add(refreshAction);
        bars.getToolBarManager().add(new Separator());

    }

    private void hookSelectAction() {
        treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {

            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                ISelection selection = event.getSelection();
                Object obj = ((IStructuredSelection) selection).getFirstElement();
                if (obj instanceof TreeNode) {
                    Object treeObject = ((TreeNode) obj).getValue();
                    if (treeObject instanceof EditPart && ((EditPart) treeObject).isSelectable()) {
                        EditPartHandler.getInstance().select((EditPart) treeObject);
                    }
                }
            }
        });
    }

    @Override
    public void setFocus() {
        // we don't need any focus
    }

}