eu.numberfour.n4js.ui.preferences.ExternalLibraryTreeContentProvider.java Source code

Java tutorial

Introduction

Here is the source code for eu.numberfour.n4js.ui.preferences.ExternalLibraryTreeContentProvider.java

Source

/**
 * Copyright (c) 2016 NumberFour AG.
 * 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:
 *   NumberFour AG - Initial API and implementation
 */
package eu.numberfour.n4js.ui.preferences;

import static com.google.common.collect.FluentIterable.from;

import java.io.File;
import java.net.URI;

import org.eclipse.jface.viewers.ILazyTreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;

import com.google.common.base.Optional;
import com.google.common.collect.Iterables;
import com.google.inject.Inject;

import eu.numberfour.n4js.external.ExternalLibraryWorkspace;
import eu.numberfour.n4js.projectModel.IN4JSCore;
import eu.numberfour.n4js.projectModel.IN4JSProject;

/**
 * Lazy tree content provider implementation for the external libraries preference page's viewer.
 */
public class ExternalLibraryTreeContentProvider implements ILazyTreeContentProvider {

    private Optional<TreeViewer> treeViewerRef;

    @Inject
    private ExternalLibraryWorkspace externalLibraryWorkspace;

    @Inject
    private IN4JSCore core;

    @Override
    public void dispose() {
        // Nothing to dispose.
    }

    @Override
    public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {
        if (viewer instanceof TreeViewer) {
            this.treeViewerRef = Optional.of((TreeViewer) viewer);
        } else {
            this.treeViewerRef = Optional.absent();
        }
    }

    @Override
    public void updateElement(final Object parent, final int index) {
        if (treeViewerRef.isPresent()) {
            final TreeViewer treeViewer = treeViewerRef.get();
            if (parent instanceof Iterable) {
                final Object child = Iterables.get((Iterable<?>) parent, index);
                treeViewer.replace(parent, index, child);
                if (child instanceof URI) {
                    treeViewer.setChildCount(child, Iterables.size(getProjects((URI) child)));
                }
            } else if (parent instanceof URI) {
                final IN4JSProject child = Iterables.get(getProjects((URI) parent), index);
                treeViewer.replace(parent, index, child);
            }
        }
    }

    @Override
    public void updateChildCount(final Object element, final int currentChildCount) {
        if (treeViewerRef.isPresent()) {
            final TreeViewer treeViewer = treeViewerRef.get();
            if (element instanceof Iterable) {
                treeViewer.setChildCount(element, Iterables.size((Iterable<?>) element));
            } else if (element instanceof URI) {
                treeViewer.setChildCount(element, Iterables.size(getProjects((URI) element)));
            } else {
                treeViewer.setChildCount(element, 0);
            }
        }
    }

    @Override
    public Object getParent(final Object element) {
        return null;
    }

    private Iterable<IN4JSProject> getProjects(URI location) {
        return from(externalLibraryWorkspace.getProjects(location)).filter(p -> p.exists())
                .transform(p -> core.findProject(convertUri(p.getLocationURI())).orNull())
                .filter(IN4JSProject.class).filter(p -> p.exists() && p.isExternal());
    }

    private org.eclipse.emf.common.util.URI convertUri(URI uri) {
        return org.eclipse.emf.common.util.URI.createFileURI(new File(uri).getAbsolutePath());
    }

}