Java tutorial
/******************************************************************************* * 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; } }