melnorme.lang.ide.ui.navigator.LangNavigatorLabelProvider.java Source code

Java tutorial

Introduction

Here is the source code for melnorme.lang.ide.ui.navigator.LangNavigatorLabelProvider.java

Source

/*******************************************************************************
 * Copyright (c) 2015 Bruno Medeiros and other Contributors.
 * 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:
 *     Bruno Medeiros - initial API and implementation
 *******************************************************************************/
package melnorme.lang.ide.ui.navigator;

import static melnorme.lang.ide.ui.views.StylerHelpers.fgColor;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.ui.model.IWorkbenchAdapter;

import _org.eclipse.jdt.ui.ProblemsLabelDecorator;
import melnorme.lang.ide.core.project_model.view.BundleErrorElement;
import melnorme.lang.ide.core.project_model.view.BundleModelElementKind.BundleModelElementsSwitcher;
import melnorme.lang.ide.core.project_model.view.DependenciesContainer;
import melnorme.lang.ide.core.project_model.view.RawDependencyElement;
import melnorme.lang.ide.ui.LangImages;
import melnorme.lang.ide.ui.LangUIPlugin;
import melnorme.lang.ide.ui.navigator.NavigatorElementsSwitcher;
import melnorme.lang.ide.ui.views.AbstractLangLabelProvider;
import melnorme.util.swt.jface.resources.CompositeImageDescriptorExt.Corner;
import melnorme.util.swt.jface.resources.DecoratedImageDescriptor;
import melnorme.util.swt.jface.resources.ImageDescriptorRegistry;
import melnorme.utilbox.collections.ArrayList2;

public abstract class LangNavigatorLabelProvider extends AbstractLangLabelProvider {

    protected final ArrayList2<ILabelDecorator> labelDecorators = new ArrayList2<>();
    protected final ImageDescriptorRegistry registry;

    public LangNavigatorLabelProvider() {
        super();
        this.registry = init_getImageRegistry();
        ProblemsLabelDecorator problemsLabelDecorator = new ProblemsLabelDecorator(registry);
        problemsLabelDecorator.addListener(new ILabelProviderListener() {
            @Override
            public void labelProviderChanged(LabelProviderChangedEvent event) {
                LangNavigatorLabelProvider.this.fireLabelProviderChanged(event);
            }
        });
        this.labelDecorators.add(problemsLabelDecorator);
    }

    protected ImageDescriptorRegistry init_getImageRegistry() {
        return LangUIPlugin.getDefault().getImageDescriptorRegistry();
    }

    @Override
    public void dispose() {
        for (ILabelDecorator labelDecorator : labelDecorators) {
            labelDecorator.dispose();
        }
    }

    /* ----------------- text ----------------- */

    @Override
    public StyledString getStyledText(Object element) {
        return getStyledString_switcher().switchElement(element);
    }

    protected abstract DefaultGetStyledStringSwitcher getStyledString_switcher();

    public static abstract class DefaultGetStyledStringSwitcher implements NavigatorElementsSwitcher<StyledString> {

        @Override
        public StyledString visitProject(IProject project) {
            return null;
        }

        @Override
        public StyledString visitManifestFile(IFile element) {
            return null;
        }

        @Override
        public StyledString visitBuildTargetsElement(BuildTargetsContainer buildTargetsElement) {
            return new StyledString(buildTargetsElement.getText());
        }

        @Override
        public StyledString visitBuildTarget(BuildTargetElement buildTarget) {
            return new StyledString(buildTarget.getTargetDisplayName());
        }

    }

    public abstract class BundleModelGetStyledStringSwitcher implements BundleModelElementsSwitcher<StyledString> {

        @Override
        public StyledString visitErrorElement2(BundleErrorElement element) {
            return new StyledString(element.errorDescription);
        }

        @Override
        public StyledString visitDepContainer(DependenciesContainer element) {
            return new StyledString("Dependencies");
        }

        @Override
        public StyledString visitRawDepElement(RawDependencyElement element) {
            StyledString baseString = new StyledString(element.getElementName());
            appendBundleRef(baseString, null, element.getDependencyRef().getVersion());
            return baseString;
        }

    }

    protected RGB ANNOTATION_FG = new RGB(120, 120, 200);

    protected StyledString appendBundleRef(StyledString baseString, String bundleName, String bundleVersion) {
        String bundleNameString = bundleName == null ? "" : bundleName + " ";
        String versionString = bundleVersion == null ? "?" : bundleVersion;
        String bundleRefString = " [" + bundleNameString + versionString + "]";
        return baseString.append(bundleRefString, fgColor(ANNOTATION_FG));
    }

    /* ----------------- image ----------------- */

    @Override
    public Image getImage(Object element) {
        Image baseImage = getBaseImage(element);
        return decorateImage(baseImage, element);
    }

    public Image getBaseImage(Object element) {
        ImageDescriptor baseImage = getBaseImage_switcher().switchElement(element);
        if (baseImage != null) {
            return registry.get(baseImage);
        }

        if (element instanceof IResource) {
            IResource resource = (IResource) element;
            return registry.get(getWorkbenchImageDescriptor(resource));
        }
        return null;
    }

    protected abstract DefaultGetImageSwitcher getBaseImage_switcher();

    public static abstract class DefaultGetImageSwitcher implements NavigatorElementsSwitcher<ImageDescriptor> {

        @Override
        public ImageDescriptor visitBuildTargetsElement(BuildTargetsContainer buildTargetsElement) {
            return LangImages.BUILD_TARGETS_ELEM.getDescriptor();
        }

        @Override
        public ImageDescriptor visitBuildTarget(BuildTargetElement buildTarget) {
            ImageDescriptor baseImage = LangImages.BUILD_TARGET.getDescriptor();

            boolean normalEnabled = buildTarget.getBuildTarget().isNormalBuildEnabled();
            boolean autoEnabled = buildTarget.getBuildTarget().isAutoBuildEnabled();

            if (normalEnabled && autoEnabled) {
                return new DecoratedImageDescriptor(baseImage, LangImages.OVR_BUILD_BOTH_CHECKED,
                        Corner.BOTTOM_RIGHT);
            }
            if (normalEnabled) {
                return new DecoratedImageDescriptor(baseImage, LangImages.OVR_BUILD_NORMAL_CHECKED,
                        Corner.BOTTOM_RIGHT);
            }
            if (autoEnabled) {
                return new DecoratedImageDescriptor(baseImage, LangImages.OVR_BUILD_AUTO_CHECKED,
                        Corner.BOTTOM_RIGHT);
            }
            return baseImage;
        }

        @Override
        public ImageDescriptor visitManifestFile(IFile element) {
            return null;
        }

    }

    public static abstract class BundleModelGetImageSwitcher
            implements BundleModelElementsSwitcher<ImageDescriptor> {

        @Override
        public ImageDescriptor visitDepContainer(DependenciesContainer element) {
            return LangImages.NAV_Library;
        }

        @Override
        public ImageDescriptor visitRawDepElement(RawDependencyElement element) {
            return LangImages.NAV_Package;
        }

        @Override
        public ImageDescriptor visitErrorElement2(BundleErrorElement element) {
            return LangImages.NAV_Error;
        }

    }

    protected ImageDescriptor getWorkbenchImageDescriptor(IAdaptable adaptable) {
        IWorkbenchAdapter workbenchAdapter = (IWorkbenchAdapter) adaptable.getAdapter(IWorkbenchAdapter.class);
        if (workbenchAdapter == null) {
            return null;
        }
        ImageDescriptor descriptor = workbenchAdapter.getImageDescriptor(adaptable);

        return descriptor;
    }

    protected Image decorateImage(Image image, Object element) {
        for (ILabelDecorator labelDecorator : labelDecorators) {
            image = labelDecorator.decorateImage(image, element);
        }
        return image;
    }

}