/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.felix.sigil.eclipse.ui.util;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.Set;
import org.apache.felix.sigil.common.model.IModelElement;
import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
import org.apache.felix.sigil.common.model.osgi.IPackageExport;
import org.apache.felix.sigil.common.model.osgi.IPackageImport;
import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
import org.apache.felix.sigil.common.repository.IBundleRepository;
import org.apache.felix.sigil.eclipse.SigilCore;
import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
import org.apache.felix.sigil.eclipse.ui.SigilUI;
import org.eclipse.core.resources.IResource;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.osgi.framework.Version;
public class ModelLabelProvider extends LabelProvider
{
private volatile Set<? extends IModelElement> unresolvedElements = null;
public Image getImage(Object element)
{
boolean unresolved = (unresolvedElements == null) ? false
: unresolvedElements.contains(element);
if (element instanceof ISigilBundle || element instanceof IBundleModelElement)
{
return findBundle();
}
else if (element instanceof IRequiredBundle)
{
boolean optional = ((IRequiredBundle) element).isOptional();
return findRequiredBundle(optional, unresolved);
}
else if (element instanceof IPackageImport)
{
boolean optional = ((IPackageImport) element).isOptional();
return findPackageImport(optional, unresolved);
}
else if (element instanceof IPackageExport)
{
return findPackageExport();
}
else if (element instanceof IPackageFragmentRoot)
{
IPackageFragmentRoot root = (IPackageFragmentRoot) element;
try
{
if (root.getKind() == IPackageFragmentRoot.K_SOURCE)
{
return findPackage();
}
else
{
return findBundle();
}
}
catch (JavaModelException e)
{
SigilCore.error("Failed to inspect package fragment root", e);
}
}
else if (element instanceof IClasspathEntry)
{
return findPackage();
}
else if (element instanceof IBundleRepository)
{
IBundleRepository rep = (IBundleRepository) element;
IRepositoryModel config = SigilCore.getRepositoryModel(rep);
return config.getType().getIcon();
}
else if (element instanceof Throwable) {
return PlatformUI.getWorkbench().getSharedImages().getImage(
ISharedImages.IMG_OBJS_ERROR_TSK);
}
return null;
}
public String getText(Object element)
{
if (element instanceof ISigilBundle)
{
ISigilBundle bundle = (ISigilBundle) element;
return bundle.getBundleInfo().getSymbolicName() + " "
+ bundle.getBundleInfo().getVersion();
}
if (element instanceof IBundleModelElement)
{
IBundleModelElement bundle = (IBundleModelElement) element;
return bundle.getSymbolicName();
}
if (element instanceof IRequiredBundle)
{
IRequiredBundle req = (IRequiredBundle) element;
return req.getSymbolicName() + " " + req.getVersions();
}
if (element instanceof IPackageImport)
{
IPackageImport req = (IPackageImport) element;
return req.getPackageName() + " " + req.getVersions();
}
if (element instanceof IPackageExport)
{
IPackageExport pe = (IPackageExport) element;
Version rawVersion = pe.getRawVersion();
return rawVersion != null ? pe.getPackageName() + " " + rawVersion
: pe.getPackageName();
}
if (element instanceof IResource)
{
IResource resource = (IResource) element;
return resource.getName();
}
if (element instanceof IPackageFragment)
{
IPackageFragment f = (IPackageFragment) element;
return f.getElementName();
}
if (element instanceof IPackageFragmentRoot)
{
IPackageFragmentRoot f = (IPackageFragmentRoot) element;
try
{
return f.getUnderlyingResource().getName();
}
catch (JavaModelException e)
{
return "unknown";
}
}
if (element instanceof IClasspathEntry)
{
IClasspathEntry cp = (IClasspathEntry) element;
return cp.getPath().toString();
}
if (element instanceof IBundleRepository)
{
IBundleRepository rep = (IBundleRepository) element;
IRepositoryModel config = SigilCore.getRepositoryModel(rep);
return config.getName();
}
if ( element instanceof Throwable ) {
Throwable t = (Throwable) element;
ByteArrayOutputStream buf = new ByteArrayOutputStream();
PrintStream print = new PrintStream(buf);
t.printStackTrace(print);
print.flush();
return buf.toString();
}
return element.toString();
}
private Image findPackage()
{
return cacheImage("icons/package.gif");
}
private Image findPackageImport(boolean optional, boolean unresolved)
{
String path;
if (optional)
{
path = unresolved ? "icons/import-package-optional-error.gif"
: "icons/import-package-optional.gif";
}
else
{
path = unresolved ? "icons/import-package-error.gif"
: "icons/import-package.gif";
}
return cacheImage(path);
}
private Image findPackageExport()
{
return cacheImage("icons/export-package.gif");
}
private Image findBundle()
{
return cacheImage("icons/bundle.gif");
}
private Image findRequiredBundle(boolean optional, boolean unresolved)
{
String path;
if (optional)
{
path = unresolved ? "icons/require-bundle-optional-error.gif"
: "icons/require-bundle-optional.gif";
}
else
{
path = unresolved ? "icons/require-bundle-error.gif"
: "icons/require-bundle.gif";
}
return cacheImage(path);
}
private static Image cacheImage(String path)
{
return SigilUI.cacheImage(path, ModelLabelProvider.class.getClassLoader());
}
public void setUnresolvedElements(Set<? extends IModelElement> elements)
{
this.unresolvedElements = elements;
}
}