de.instanttouch.ui.scaffolding.swt.viewer.SnakeTreeViewer.java Source code

Java tutorial

Introduction

Here is the source code for de.instanttouch.ui.scaffolding.swt.viewer.SnakeTreeViewer.java

Source

/*******************************************************************************
 * Copyright (c) 2014 Joachim Tessmer.
 * 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:
 *     Joachim Tessmer - initial API and implementation
 ******************************************************************************/
package de.instanttouch.ui.scaffolding.swt.viewer;

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

import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.PlatformUI;

import de.instantouch.model.base.SnakeString;
import de.instantouch.model.base.SnakeType;
import de.instanttouch.api.model.ISnakeModification;
import de.instanttouch.api.model.ISnakeTypeListener;
import de.instanttouch.ui.scaffolding.swt.action.SnakeAction;
import de.instanttouch.ui.scaffolding.swt.action.SnakeActionRegistry;
import de.instanttouch.ui.scaffolding.swt.action.SnakeOpenAction;
import de.instanttouch.ui.scaffolding.swt.dnd.ISnakeDnDContainer;
import de.instanttouch.ui.scaffolding.swt.dnd.SnakeDragSource;
import de.instanttouch.ui.scaffolding.swt.util.SnakeRefreshJob;

public class SnakeTreeViewer extends TreeViewer implements ISnakeDnDContainer {
    protected SnakeAction doubleClickAction = new SnakeOpenAction("open type dialog");

    protected SnakeAction selectAction = null;
    private Job updateJob = null;

    public SnakeTreeViewer(Composite parent, int style) {
        super(parent, style);
        init();
    }

    private void init() {
        setLabelProvider(new SnakeLabelProvider());
        setContentProvider(new SnakeTreeContentProvider());

        addDoubleClickListener(new IDoubleClickListener() {

            @Override
            public void doubleClick(DoubleClickEvent event) {
                if (null != doubleClickAction) {
                    ISelection selection = getSelection();
                    if (selection instanceof ITreeSelection) {
                        ITreeSelection treeSelection = (ITreeSelection) selection;
                        Object selected = treeSelection.getFirstElement();
                        if (selected instanceof SnakeType) {
                            if (selected != getInput() && doubleClickAction != null) {
                                if (selectAction != null) {
                                    selectAction.setInput(null);
                                    selectAction.run();
                                }

                                doubleClickAction.setInput((SnakeType) selected);
                                doubleClickAction.run();
                                refresh();
                            }
                        }
                    }
                }
            }
        });

        addSelectionChangedListener(new ISelectionChangedListener() {

            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                if (null != selectAction) {
                    ISelection selection = getSelection();
                    if (selection instanceof ITreeSelection) {
                        ITreeSelection treeSelection = (ITreeSelection) selection;
                        Object selected = treeSelection.getFirstElement();
                        if (selected instanceof SnakeType) {
                            selected = selected != getInput() ? selected : null;
                            if (selectAction != null) {
                                selectAction.setInput((SnakeType) selected);
                                selectAction.run();
                                refresh();
                            }
                        }
                    }
                }
            }
        });

        final IMenuListener menuListener = new IMenuListener() {

            @Override
            public void menuAboutToShow(IMenuManager manager) {
                final Object selected;
                if (getSelection() instanceof TreeSelection) {
                    selected = ((TreeSelection) getSelection()).getFirstElement();
                } else {
                    selected = null;
                }

                if (selected instanceof SnakeType) {
                    SnakeType type = (SnakeType) selected;
                    for (SnakeAction action : SnakeActionRegistry.getAllAvailableActions(type)) {
                        if (action.getTarget() != null) {
                            // todo check that workbenchpart matches
                        }
                        action.setInput(type);
                        manager.add(action);
                    }
                }

                manager.updateAll(true);

            }
        };

        PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {

            @Override
            public void run() {
                MenuManager menuManager = new MenuManager();
                menuManager.setRemoveAllWhenShown(true);
                Menu menu = menuManager.createContextMenu(getControl());
                getControl().setMenu(menu);

                menuManager.addMenuListener(menuListener);
            }
        });

    }

    public void setInput(SnakeType type) {
        super.setInput(type);
    }

    public SnakeAction getDoubleClickAction() {
        return doubleClickAction;
    }

    public void setDoubleClickAction(SnakeAction doubleClickAction) {
        this.doubleClickAction = doubleClickAction;
    }

    public void setSelectAction(SnakeAction selectAction) {
        this.selectAction = selectAction;
    }

    @Override
    public void refresh() {
        if (updateJob == null) {
            updateJob = new SnakeRefreshJob("refresh tree view") {

                @Override
                public void refresh() {
                    if (!getTree().isDisposed()) {
                        SnakeTreeViewer.super.refresh();
                    }
                }
            };
            updateJob.setSystem(true);
        }
        updateJob.schedule();

    }

    @Override
    public void addFilter(ViewerFilter filter) {
        if (filter instanceof SnakeViewerFilter) {
            SnakeViewerFilter jdsiFilter = (SnakeViewerFilter) filter;
            SnakeString pattern = jdsiFilter.getPattern();
            if (pattern != null) {

                ISnakeTypeListener listener = new ISnakeTypeListener() {

                    @Override
                    public void onChange(ISnakeModification modification) {
                        refresh();
                    }

                };

                pattern.addListener(listener);
            }
        }

        super.addFilter(filter);
    }

    @Override
    public SnakeType getFirstChild() {
        SnakeType type = null;
        Object selected = null;
        if (getSelection() instanceof TreeSelection) {
            selected = ((TreeSelection) getSelection()).getFirstElement();
        } else {
            selected = null;
        }

        if (selected instanceof SnakeType) {
            type = (SnakeType) selected;
        }
        return type;
    }

    @Override
    public List<SnakeType> getAllSelected() {
        List<SnakeType> all = new ArrayList<SnakeType>();

        if (getSelection() instanceof TreeSelection) {
            TreeSelection treeSelection = (TreeSelection) getSelection();

            for (Object selected : treeSelection.toList()) {
                if (selected instanceof SnakeType) {
                    SnakeType type = (SnakeType) selected;
                    all.add(type);
                }
            }

        }
        return all;
    }

    @Override
    public Viewer getViewer() {
        return this;
    }

    public void startDragSupport() {
        new SnakeDragSource(this);
    }

    public void select(SnakeType jdsiType) {
        // TODO Auto-generated method stub

    }

}