org.eclipse.emf.compare.ide.ui.internal.logical.view.LogicalModelViewContentProvider.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.emf.compare.ide.ui.internal.logical.view.LogicalModelViewContentProvider.java

Source

/*******************************************************************************
 * Copyright (c) 2014 Obeo.
 * 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:
 *     Obeo - initial API and implementation
 *******************************************************************************/
package org.eclipse.emf.compare.ide.ui.internal.logical.view;

import com.google.common.collect.Sets;

import java.util.Collection;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IResource;
import org.eclipse.emf.compare.ide.ui.internal.logical.view.LogicalModelView.Presentation;
import org.eclipse.ui.model.WorkbenchContentProvider;

/**
 * ContentProvider for the logical model view.
 * 
 * @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a>
 */
public class LogicalModelViewContentProvider extends WorkbenchContentProvider {

    /** All models to display. */
    private Collection<IResource> leaves = Sets.newLinkedHashSet();

    /** The view associated with this content provider. */
    private LogicalModelView logicalModelView;

    /**
     * Default constructor.
     * 
     * @param logicalModelView
     *            the view associated with this content provider.
     */
    LogicalModelViewContentProvider(final LogicalModelView logicalModelView) {
        this.logicalModelView = logicalModelView;
    }

    /**
     * The models to display in the viewer.
     * 
     * @param leaves
     *            the models to display in the viewer.
     */
    public void setLeaves(Collection<IResource> leaves) {
        this.leaves.clear();
        this.leaves.addAll(leaves);
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.model.BaseWorkbenchContentProvider#hasChildren(java.lang.Object)
     */
    @Override
    public boolean hasChildren(Object element) {
        if (logicalModelView.getPresentation() == Presentation.LIST) {
            return false;
        }
        return !leaves.contains(element) && getChildren(element).length > 0;
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.model.BaseWorkbenchContentProvider#getChildren(java.lang.Object)
     */
    @Override
    public Object[] getChildren(Object element) {
        Object[] children = new Object[0];
        if (logicalModelView.getPresentation() == Presentation.LIST) {
            if (!leaves.contains(element)) {
                children = leaves.toArray();
            }
        } else if (logicalModelView.getPresentation() == Presentation.TREE) {
            if (element instanceof IContainer) {
                if (isParentOfALeaf((IContainer) element)) {
                    Object[] tmp = super.getChildren(element);
                    children = getChildren(tmp);
                }
            } else if (element instanceof Object[]) {
                Collection<Object> tmp = Sets.newLinkedHashSet();
                Object[] list = (Object[]) element;
                for (Object object : list) {
                    if (object instanceof IContainer && isParentOfALeaf((IContainer) object)) {
                        tmp.add(object);
                    } else if (leaves.contains(object)) {
                        tmp.add(object);
                    }
                }
                children = tmp.toArray();
            } else {
                children = super.getChildren(element);
            }
        }
        return children;
    }

    /**
     * Check if the given container is a parent of a model to display.
     * 
     * @param container
     *            the given container.
     * @return true if the given container is a parent of a model to display, false otherwise.
     */
    private boolean isParentOfALeaf(IContainer container) {
        for (IResource leaf : leaves) {
            if (container.getFullPath().isPrefixOf(leaf.getFullPath())) {
                return true;
            }
        }
        return false;
    }
}