com.siteview.mde.internal.ui.shared.target.StyledBundleLabelProvider.java Source code

Java tutorial

Introduction

Here is the source code for com.siteview.mde.internal.ui.shared.target.StyledBundleLabelProvider.java

Source

/*******************************************************************************
 * Copyright (c) 2009, 2010 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package com.siteview.mde.internal.ui.shared.target;

import com.ibm.icu.text.MessageFormat;
import java.net.URI;
import org.eclipse.core.runtime.*;
import org.eclipse.equinox.frameworkadmin.BundleInfo;
import org.eclipse.equinox.internal.p2.metadata.TranslationSupport;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.*;
import com.siteview.mde.internal.core.ifeature.IFeatureModel;
import com.siteview.mde.internal.core.target.*;
import com.siteview.mde.internal.core.target.provisional.*;
import com.siteview.mde.internal.ui.MDEPlugin;
import com.siteview.mde.internal.ui.MDEPluginImages;
import com.siteview.mde.internal.ui.shared.target.TargetLocationsGroup.IUWrapper;
import com.siteview.mde.internal.ui.util.SharedLabelProvider;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;

/**
 * Provides labels for resolved bundles, bundle information objects, and bundle containers.
 * 
 * @since 3.5
 */
public class StyledBundleLabelProvider extends StyledCellLabelProvider implements ILabelProvider {

    private boolean fShowVersion = true;
    private boolean fAppendResolvedVariables = false;
    private TranslationSupport fTranslations;

    /**
     * Creates a label provider.
     * 
     * @param showVersion whether version information should be shown in labels
     * @param appendResolvedVariables whether locations with variables should be shown
     *  with variables resolved, in addition to unresolved
     */
    public StyledBundleLabelProvider(boolean showVersion, boolean appendResolvedVariables) {
        MDEPlugin.getDefault().getLabelProvider().connect(this);
        fShowVersion = showVersion;
        fAppendResolvedVariables = appendResolvedVariables;
        fTranslations = TranslationSupport.getInstance();
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.StyledCellLabelProvider#dispose()
     */
    public void dispose() {
        MDEPlugin.getDefault().getLabelProvider().disconnect(this);
        super.dispose();
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.StyledCellLabelProvider#update(org.eclipse.jface.viewers.ViewerCell)
     */
    public void update(ViewerCell cell) {
        Object element = cell.getElement();
        StyledString styledString = getStyledString(element);
        cell.setText(styledString.toString());
        cell.setStyleRanges(styledString.getStyleRanges());
        cell.setImage(getImage(element));
        super.update(cell);
    }

    private StyledString getStyledString(Object element) {
        StyledString styledString = new StyledString();
        if (element instanceof BundleInfo) {
            appendBundleInfo(styledString, ((BundleInfo) element));
        } else if (element instanceof NameVersionDescriptor) {
            appendBundleInfo(styledString, new BundleInfo(((NameVersionDescriptor) element).getId(),
                    ((NameVersionDescriptor) element).getVersion(), null, BundleInfo.NO_LEVEL, false));
        } else if (element instanceof IResolvedBundle) {
            IResolvedBundle bundle = ((IResolvedBundle) element);
            if (bundle.getStatus().isOK()) {
                appendBundleInfo(styledString, bundle.getBundleInfo());
            } else {
                // TODO Better error message for missing bundles
                styledString.append(bundle.getStatus().getMessage());
            }
        } else if (element instanceof IStatus) {
            styledString.append(((IStatus) element).getMessage());
        } else if (element instanceof IPath) {
            styledString.append(((IPath) element).removeFirstSegments(1).toString());
        } else if (element instanceof IFeatureModel) {
            // Use a bundle info to reuse existing code
            appendBundleInfo(styledString, new BundleInfo(((IFeatureModel) element).getFeature().getId(),
                    ((IFeatureModel) element).getFeature().getVersion(), null, BundleInfo.NO_LEVEL, false));
        } else if (element instanceof FeatureBundleContainer) {
            FeatureBundleContainer container = (FeatureBundleContainer) element;
            styledString.append(container.getFeatureId());
            String version = container.getFeatureVersion();
            if (version != null) {
                styledString.append(' ');
                styledString.append('[', StyledString.QUALIFIER_STYLER);
                styledString.append(version, StyledString.QUALIFIER_STYLER);
                styledString.append(']', StyledString.QUALIFIER_STYLER);
            }
            if (fAppendResolvedVariables) {
                appendLocation(styledString, container, true);
            }
            appendLocation(styledString, container, false);
            appendBundleCount(styledString, container);
        } else if (element instanceof DirectoryBundleContainer) {
            DirectoryBundleContainer container = (DirectoryBundleContainer) element;
            try {
                styledString.append(container.getLocation(false));
            } catch (CoreException e) {
                // TODO:
            }
            if (fAppendResolvedVariables) {
                appendLocation(styledString, container, true);
            }
            appendBundleCount(styledString, container);
        } else if (element instanceof ProfileBundleContainer) {
            ProfileBundleContainer container = (ProfileBundleContainer) element;
            try {
                styledString.append(container.getLocation(false));
            } catch (CoreException e) {
                // TODO:
            }
            if (fAppendResolvedVariables) {
                appendLocation(styledString, container, true);
            }
            appendBundleCount(styledString, container);
        } else if (element instanceof IUBundleContainer) {
            IUBundleContainer container = (IUBundleContainer) element;
            URI[] repos = container.getRepositories();
            if (repos == null || repos.length == 0) {
                styledString.append(Messages.BundleContainerTable_8);
            } else {
                styledString.append(repos[0].toString());
            }
            appendBundleCount(styledString, container);
        } else if (element instanceof IUWrapper) {
            styledString = getStyledString(((IUWrapper) element).getIU());
        } else if (element instanceof IInstallableUnit) {
            IInstallableUnit iu = (IInstallableUnit) element;
            String name = fTranslations.getIUProperty(iu, IInstallableUnit.PROP_NAME);
            if (name == null) {
                name = iu.getId();
            }
            styledString.append(name);
            styledString.append(' ');
            styledString.append(iu.getVersion().toString(), StyledString.QUALIFIER_STYLER);
        } else if (element instanceof String) {
            styledString.append((String) element);
        } else {
            styledString.append(element.toString());
        }
        return styledString;
    }

    /**
     * Generates a styled string for a bundle information object.
     * 
     * @param styledString string to append to
     * @param info element to append
     */
    private void appendBundleInfo(StyledString styledString, BundleInfo info) {
        styledString.append(info.getSymbolicName());
        if (fShowVersion) {
            String version = info.getVersion();
            if (version != null && !version.equals(BundleInfo.EMPTY_VERSION)) {
                styledString.append(' ');
                styledString.append('(', StyledString.QUALIFIER_STYLER);
                styledString.append(version, StyledString.QUALIFIER_STYLER);
                styledString.append(')', StyledString.QUALIFIER_STYLER);
            }
        }
    }

    /**
     * Appends the container location to the string.
     * 
     * @param styledString label to append to
     * @param container container to append
     * @param resolved whether to resolve the location
     */
    private void appendLocation(StyledString styledString, AbstractBundleContainer container, boolean resolved) {
        try {
            String location = container.getLocation(resolved);
            styledString.append(" - ", StyledString.DECORATIONS_STYLER); //$NON-NLS-1$
            styledString.append(location, StyledString.DECORATIONS_STYLER);
        } catch (CoreException e) {
        }
    }

    /**
     * Appends a label describing the number of bundles included (ex. 5 of 10 plug-ins).
     * 
     * @param styledString label to append to
     * @param container bundle container to check for inclusions
     */
    private void appendBundleCount(StyledString styledString, IBundleContainer container) {
        if (!container.isResolved() || (!container.getStatus().isOK() && !container.getStatus().isMultiStatus())
                || container.getBundles() == null) {
            return;
        }
        int bundleCount = container.getBundles().length;
        String bundleCountString = Integer.toString(bundleCount);

        styledString.append(' ');
        styledString.append(
                MessageFormat.format(Messages.BundleContainerTable_10, new String[] { bundleCountString }),
                StyledString.COUNTER_STYLER);
    }

    /**
     * Returns an image for the given object or <code>null</code> if none.
     * 
     * @param element 
     * @return image or <code>null</code>
     */
    public Image getImage(Object element) {
        if (element instanceof IResolvedBundle) {

            IResolvedBundle bundle = (IResolvedBundle) element;
            int flag = 0;
            if (bundle.getStatus().getSeverity() == IStatus.WARNING
                    || bundle.getStatus().getSeverity() == IStatus.INFO) {
                flag = SharedLabelProvider.F_WARNING;
            } else if (bundle.getStatus().getSeverity() == IStatus.ERROR) {
                flag = SharedLabelProvider.F_ERROR;
            }

            if (bundle.getStatus().getSeverity() == IStatus.ERROR
                    && bundle.getStatus().getCode() == IResolvedBundle.STATUS_FEATURE_DOES_NOT_EXIST) {
                // Missing features are represented by resolved bundles in the tree
                return MDEPlugin.getDefault().getLabelProvider().get(MDEPluginImages.DESC_FEATURE_OBJ, flag);
            } else if (bundle.isFragment()) {
                return MDEPlugin.getDefault().getLabelProvider().get(MDEPluginImages.DESC_FRAGMENT_OBJ, flag);
            } else if (bundle.isSourceBundle()) {
                return MDEPlugin.getDefault().getLabelProvider().get(MDEPluginImages.DESC_PLUGIN_MF_OBJ, flag);
            } else {
                return MDEPlugin.getDefault().getLabelProvider().get(MDEPluginImages.DESC_PLUGIN_OBJ, flag);
            }
        } else if (element instanceof BundleInfo) {
            return MDEPlugin.getDefault().getLabelProvider().get(MDEPluginImages.DESC_PLUGIN_OBJ);
        } else if (element instanceof NameVersionDescriptor) {
            if (((NameVersionDescriptor) element).getType() == NameVersionDescriptor.TYPE_FEATURE) {
                return MDEPlugin.getDefault().getLabelProvider().get(MDEPluginImages.DESC_FEATURE_OBJ);
            } else if (((NameVersionDescriptor) element).getType() == NameVersionDescriptor.TYPE_PLUGIN) {
                return MDEPlugin.getDefault().getLabelProvider().get(MDEPluginImages.DESC_PLUGIN_OBJ);
            }
        } else if (element instanceof IStatus) {
            int severity = ((IStatus) element).getSeverity();
            if (severity == IStatus.WARNING || severity == IStatus.INFO) {
                return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_WARN_TSK);
            } else if (severity == IStatus.ERROR) {
                return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_ERROR_TSK);
            }
        } else if (element instanceof IPath) {
            return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
        } else if (element instanceof IFeatureModel) {
            return MDEPlugin.getDefault().getLabelProvider().get(MDEPluginImages.DESC_FEATURE_OBJ);
        } else if (element instanceof IBundleContainer) {
            int flag = 0;
            IBundleContainer container = (IBundleContainer) element;
            if (container.isResolved()) {
                IStatus status = container.getStatus();
                if (status.getSeverity() == IStatus.WARNING || status.getSeverity() == IStatus.INFO) {
                    flag = SharedLabelProvider.F_WARNING;
                } else if (status.getSeverity() == IStatus.ERROR) {
                    flag = SharedLabelProvider.F_ERROR;
                }
            }
            if (element instanceof FeatureBundleContainer) {
                return MDEPlugin.getDefault().getLabelProvider().get(MDEPluginImages.DESC_FEATURE_OBJ, flag);
            } else if (element instanceof DirectoryBundleContainer) {
                ImageDescriptor image = PlatformUI.getWorkbench().getSharedImages()
                        .getImageDescriptor(ISharedImages.IMG_OBJ_FOLDER);
                return MDEPlugin.getDefault().getLabelProvider().get(image, flag);
            } else if (element instanceof ProfileBundleContainer) {
                return MDEPlugin.getDefault().getLabelProvider().get(MDEPluginImages.DESC_PRODUCT_DEFINITION, flag);
            } else if (element instanceof IUBundleContainer) {
                return MDEPlugin.getDefault().getLabelProvider().get(MDEPluginImages.DESC_REPOSITORY_OBJ, flag);
            }
        } else if (element instanceof IUWrapper) {
            return getImage(((IUWrapper) element).getIU());
        } else if (element instanceof IInstallableUnit) {
            return MDEPlugin.getDefault().getLabelProvider().get(MDEPluginImages.DESC_NOREF_FEATURE_OBJ);
        }
        return null;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
     */
    public String getText(Object element) {
        StyledString string = getStyledString(element);
        return string.getString();
    }
}