package bndtools.model.repo; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.Collections; import java.util.List; import org.bndtools.api.ILogger; import org.bndtools.api.Logger; import org.bndtools.core.ui.icons.Icons; import org.bndtools.utils.jface.HyperlinkStyler; import org.bndtools.utils.repos.RepoUtils; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.StyledCellLabelProvider; import org.eclipse.jface.viewers.StyledString; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.plugin.AbstractUIPlugin; import aQute.bnd.build.Project; import aQute.bnd.service.Actionable; import aQute.bnd.service.IndexProvider; import aQute.bnd.service.RepositoryPlugin; import bndtools.Plugin; public class RepositoryTreeLabelProvider extends StyledCellLabelProvider implements ILabelProvider { private static final ILogger logger = Logger.getLogger(RepositoryTreeLabelProvider.class); final Image arrowImg = AbstractUIPlugin.imageDescriptorFromPlugin(Plugin.PLUGIN_ID, "icons/arrow_down.png").createImage(); final Image localRepoImg = AbstractUIPlugin.imageDescriptorFromPlugin(Plugin.PLUGIN_ID, "icons/database.png").createImage(); final Image remoteRepoImg = AbstractUIPlugin.imageDescriptorFromPlugin(Plugin.PLUGIN_ID, "icons/database_link.png").createImage(); final Image bundleImg = Icons.desc("bundle").createImage(); final Image matchImg = AbstractUIPlugin.imageDescriptorFromPlugin(Plugin.PLUGIN_ID, "icons/star-small.png").createImage(); final Image projectImg = PlatformUI.getWorkbench().getSharedImages().getImage(IDE.SharedImages.IMG_OBJ_PROJECT); private final boolean showRepoId; public RepositoryTreeLabelProvider(boolean showRepoId) { this.showRepoId = showRepoId; } @Override public void update(ViewerCell cell) { Object element = cell.getElement(); int index = cell.getColumnIndex(); if (element instanceof RepositoryPlugin) { if (index == 0) { RepositoryPlugin repo = (RepositoryPlugin) element; cell.setText(repo.getName()); Image image; if (RepoUtils.isWorkspaceRepo(repo)) image = projectImg; else if (isRemoteRepo((RepositoryPlugin) element)) image = remoteRepoImg; else image = localRepoImg; cell.setImage(image); } } else if (element instanceof Project) { if (index == 0) { @SuppressWarnings("resource") Project project = (Project) element; StyledString label = new StyledString(project.getName()); if (showRepoId) label.append(" [Workspace]", StyledString.QUALIFIER_STYLER); cell.setText(label.getString()); cell.setStyleRanges(label.getStyleRanges()); cell.setImage(projectImg); } } else if (element instanceof ProjectBundle) { if (index == 0) { StyledString label = new StyledString(((ProjectBundle) element).getBsn()); if (showRepoId) label.append(" [Workspace]", StyledString.QUALIFIER_STYLER); cell.setText(label.getString()); cell.setStyleRanges(label.getStyleRanges()); cell.setImage(bundleImg); } } else if (element instanceof RepositoryBundle) { if (index == 0) { RepositoryBundle bundle = (RepositoryBundle) element; StyledString label = new StyledString(bundle.getText()); if (showRepoId) label.append(" [" + bundle.getRepo().getName() + "]", StyledString.QUALIFIER_STYLER); cell.setText(label.getString()); cell.setStyleRanges(label.getStyleRanges()); cell.setImage(bundleImg); } } else if (element instanceof RepositoryBundleVersion) { if (index == 0) { RepositoryBundleVersion bundleVersion = (RepositoryBundleVersion) element; String versionText = bundleVersion.getText(); if (versionText.contains(" \u21E9")) { versionText = versionText.replaceAll(" \u21E9", ""); cell.setImage(arrowImg); } StyledString styledString = new StyledString(versionText, StyledString.COUNTER_STYLER); cell.setText(styledString.getString()); cell.setStyleRanges(styledString.getStyleRanges()); } } else if (element instanceof RepositoryResourceElement) { RepositoryResourceElement resourceElem = (RepositoryResourceElement) element; StyledString label = new StyledString(); label.append(resourceElem.getIdentity()).append(" "); label.append(resourceElem.getVersionString(), StyledString.COUNTER_STYLER); cell.setText(label.getString()); cell.setStyleRanges(label.getStyleRanges()); cell.setImage(matchImg); } else if (element instanceof ContinueSearchElement) { StyledString label = new StyledString("Continue Search on JPM4J.org...", new HyperlinkStyler()); cell.setText(label.getString()); cell.setStyleRanges(label.getStyleRanges()); } else if (element != null) { // Catch-all cell.setText(element.toString()); } } private static boolean isRemoteRepo(RepositoryPlugin repository) { List< ? > locations = Collections.emptyList(); if (repository instanceof IndexProvider) { try { locations = ((IndexProvider) repository).getIndexLocations(); } catch (Exception e) { logger.logError("Unable to get repository index list", e); } } for (Object locationObj : locations) { try { URI location; if (locationObj instanceof URI) location = (URI) locationObj; else if (locationObj instanceof URL) location = ((URL) locationObj).toURI(); else return false; String protocol = location.getScheme(); if ("http".equals(protocol) || "https".equals(protocol)) return true; } catch (URISyntaxException e) { return false; } } return false; } @Override public void dispose() { super.dispose(); arrowImg.dispose(); localRepoImg.dispose(); remoteRepoImg.dispose(); bundleImg.dispose(); matchImg.dispose(); } @Override public Image getImage(Object element) { Image img = null; if (element instanceof RepositoryPlugin) { RepositoryPlugin repo = (RepositoryPlugin) element; if (RepoUtils.isWorkspaceRepo(repo)) img = projectImg; else img = isRemoteRepo(repo) ? remoteRepoImg : localRepoImg; } else if (element instanceof Project) { img = projectImg; } else if (element instanceof ProjectBundle) { img = bundleImg; } else if (element instanceof RepositoryBundle) { img = bundleImg; } return img; } @Override public String getText(Object element) { try { if (element instanceof Actionable) { return ((Actionable) element).title(); } else if (element instanceof RepositoryPlugin) { return ((RepositoryPlugin) element).getName(); } else if (element instanceof Project) { Project project = (Project) element; return project.getName(); } else if (element instanceof ProjectBundle) { return ((ProjectBundle) element).getBsn(); } } catch (Exception e) { // just take the default } return null; } /** * Return the text to be shown as a tooltip. * <p/> * TODO allow markdown to be used. Not sure how to create a rich text tooltip though. Would also be nice if we could * copy/paste from the tooltip like in the JDT. */ @Override public String getToolTipText(Object element) { try { if (element instanceof Actionable) return ((Actionable) element).tooltip(); } catch (Exception e) { // ignore, use default } return null; } }