eu.numberfour.n4js.ui.navigator.N4JSProjectExplorerLabelProvider.java Source code

Java tutorial

Introduction

Here is the source code for eu.numberfour.n4js.ui.navigator.N4JSProjectExplorerLabelProvider.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.navigator;

import org.eclipse.core.resources.IFolder;
import org.eclipse.jdt.ui.ProblemsLabelDecorator;
import org.eclipse.jdt.ui.ProblemsLabelDecorator.ProblemsLabelChangedEvent;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.model.WorkbenchLabelProvider;

import com.google.inject.Inject;

import eu.numberfour.n4js.ui.ImageDescriptorCache.ImageRef;
import eu.numberfour.n4js.ui.navigator.internal.N4JSProjectExplorerHelper;
import eu.numberfour.n4js.ui.utils.UIUtils;
import eu.numberfour.n4js.ui.workingsets.WorkingSet;
import eu.numberfour.n4js.ui.workingsets.WorkingSetLabelProvider;
import eu.numberfour.n4js.ui.workingsets.WorkingSetManager;
import eu.numberfour.n4js.ui.workingsets.WorkingSetManagerBroker;
import eu.numberfour.n4js.utils.Arrays2;

/**
 * Label provider extension for the N4JS specific Project Explorer view.
 */
public class N4JSProjectExplorerLabelProvider extends LabelProvider implements IStyledLabelProvider {

    private static final Image SRC_FOLDER_IMG = ImageRef.SRC_FOLDER.asImage().orNull();
    private static final Image WORKING_SET_IMG = ImageRef.WORKING_SET.asImage().orNull();

    @Inject
    private N4JSProjectExplorerHelper helper;

    @Inject
    private WorkingSetManagerBroker workingSetManagerBroker;

    private final ILabelProvider delegate;
    private final ProblemsLabelDecorator decorator;
    private final ILabelProviderListener workingSetLabelProviderListener;
    private final WorkbenchLabelProvider workbenchLabelProvider;

    /**
     * Sole constructor.
     */
    public N4JSProjectExplorerLabelProvider() {
        decorator = new N4JSProjectExplorerProblemsDecorator();
        workbenchLabelProvider = new WorkbenchLabelProvider();
        delegate = new DecoratingLabelProvider(workbenchLabelProvider, decorator);
        workingSetLabelProviderListener = new ILabelProviderListener() {

            @Override
            public void labelProviderChanged(final LabelProviderChangedEvent event) {
                final LabelProviderChangedEvent wrapperEvent = createWorkingSetWrapperEvent(event);
                if (null != wrapperEvent) {
                    UIUtils.getDisplay().asyncExec(() -> fireLabelProviderChanged(wrapperEvent));
                }
            }

        };
        delegate.addListener(workingSetLabelProviderListener);
    }

    @Override
    public String getText(final Object element) {
        if (element instanceof WorkingSet) {
            return WorkingSetLabelProvider.INSTANCE.getText(element);
        } else {
            return delegate.getText(element);
        }
    }

    @Override
    public Image getImage(final Object element) {

        if (element instanceof WorkingSet) {
            return decorator.decorateImage(WORKING_SET_IMG, element);
        }

        if (element instanceof IFolder) {
            final IFolder folder = (IFolder) element;
            if (helper.isSourceFolder(folder) || helper.isOutputFolder(folder)) {
                return decorator.decorateImage(SRC_FOLDER_IMG, element);
            }
        }

        return delegate.getImage(element);
    }

    @Override
    public void dispose() {
        super.dispose();
        delegate.removeListener(workingSetLabelProviderListener);
    }

    @Override
    public StyledString getStyledText(final Object element) {
        if (element instanceof WorkingSet) {
            return WorkingSetLabelProvider.INSTANCE.getStyledText(element);
        }
        return workbenchLabelProvider.getStyledText(element);
    }

    /**
     * Creates a wrapper label provider change event with all visible {@link IWorkingSet working sets} if the working
     * set mode is enabled in the {@code Project Explorer}. Otherwise returns with {@code null}.
     *
     * @param event
     *            the original event.
     * @return a wrapper event with all visible working sets (if any) to trigger viewer refresh, or {@code null} if no
     *         viewer refresh is needed.
     */
    private LabelProviderChangedEvent createWorkingSetWrapperEvent(final LabelProviderChangedEvent event) {
        if (event instanceof ProblemsLabelChangedEvent && workingSetManagerBroker.isWorkingSetTopLevel()) {
            final WorkingSetManager manager = workingSetManagerBroker.getActiveManager();
            if (null != manager) {
                final WorkingSet[] workingSets = manager.getWorkingSets();
                if (!Arrays2.isEmpty(workingSets)) {
                    return new LabelProviderChangedEvent(delegate, workingSets);
                }
            }
        }
        return null;
    }

}