blob: 39ac5e09936bc7d920b361f3772dcafaed2b7397 [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2009, 2012 SpringSource, a division of VMware, Inc.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.virgo.ide.ui.editors.text;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.ResourceBundle;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.pde.core.IBaseModel;
import org.eclipse.pde.internal.core.ibundle.IBundleModel;
import org.eclipse.pde.internal.ui.PDEPluginImages;
import org.eclipse.pde.internal.ui.editor.PDEFormEditor;
import org.eclipse.pde.internal.ui.editor.PDESourcePage;
import org.eclipse.swt.graphics.Image;
import org.eclipse.virgo.ide.bundlerepository.domain.OsgiVersion;
import org.eclipse.virgo.ide.bundlerepository.domain.PackageExport;
import org.eclipse.virgo.ide.manifest.core.IHeaderConstants;
import org.eclipse.virgo.ide.runtime.core.artefacts.Artefact;
import org.eclipse.virgo.ide.runtime.core.artefacts.IArtefact;
import org.eclipse.virgo.ide.runtime.core.provisioning.RepositoryUtils;
import org.osgi.framework.Constants;
/**
* @author Christian Dupuis
* @author Leo Dos Santos
*/
public class BundleManifestContentAssistProcessor extends AbstractPdeManifestContentAssistProcessor {
private IJavaProject fJP;
public BundleManifestContentAssistProcessor(PDESourcePage sourcePage) {
super(sourcePage);
}
static {
List<String> headers = new ArrayList<String>(Arrays.asList(fHeader));
ResourceBundle bundle = ResourceBundle.getBundle("org.eclipse.virgo.ide.ui.editors.text.headers");
Enumeration<String> values = bundle.getKeys();
while (values.hasMoreElements()) {
headers.add(values.nextElement());
}
Collections.sort(headers);
fHeader = headers.toArray(new String[headers.size()]);
}
@Override
protected ICompletionProposal[] computeHeader(String currentValue, int startOffset, int offset) {
ArrayList<BundleTypeCompletionProposal> completions = new ArrayList<BundleTypeCompletionProposal>();
IBaseModel model = this.fSourcePage.getInputContext().getModel();
if (model instanceof IBundleModel && !((IBundleModel) model).isFragmentModel()) {
}
for (String element : fHeader) {
if (element.regionMatches(true, 0, currentValue, 0, currentValue.length()) && this.fHeaders.get(element) == null) {
BundleTypeCompletionProposal proposal = new BundleTypeCompletionProposal(element + ": ", getImage(F_TYPE_HEADER), //$NON-NLS-1$
element, startOffset, currentValue.length());
proposal.setAdditionalProposalInfo(getJavaDoc(element));
completions.add(proposal);
}
}
return completions.toArray(new ICompletionProposal[completions.size()]);
}
@Override
protected final boolean shouldStoreSet(String header) {
if (header.equalsIgnoreCase(IHeaderConstants.IMPORT_BUNDLE) || header.equalsIgnoreCase(IHeaderConstants.IMPORT_LIBRARY)
|| header.equalsIgnoreCase(IHeaderConstants.EXPORT_TEMPLATE) || header.equalsIgnoreCase(IHeaderConstants.IMPORT_TEMPLATE)
|| header.equalsIgnoreCase(IHeaderConstants.EXCLUDED_IMPORTS) || header.equalsIgnoreCase(IHeaderConstants.EXCLUDED_EXPORTS)
|| header.equalsIgnoreCase(IHeaderConstants.UNVERSIONED_IMPORTS)) {
return true;
}
return super.shouldStoreSet(header);
}
@Override
protected ICompletionProposal[] computeValue(IDocument doc, int startOffset, int offset) throws BadLocationException {
String value = doc.get(startOffset, offset - startOffset);
int lineNum = doc.getLineOfOffset(startOffset) - 1;
int index;
while ((index = value.indexOf(':')) == -1 || value.length() - 1 != index && value.charAt(index + 1) == '=') {
int startLine = doc.getLineOffset(lineNum);
value = doc.get(startLine, offset - startLine);
lineNum--;
}
int length = value.length();
if (value.regionMatches(true, 0, IHeaderConstants.IMPORT_BUNDLE, 0, Math.min(length, IHeaderConstants.IMPORT_BUNDLE.length()))) {
return handleImportBundleCompletion(value.substring(IHeaderConstants.IMPORT_BUNDLE.length() + 1), offset);
}
if (value.regionMatches(true, 0, IHeaderConstants.IMPORT_LIBRARY, 0, Math.min(length, IHeaderConstants.IMPORT_LIBRARY.length()))) {
return handleImportLibraryCompletion(value.substring(IHeaderConstants.IMPORT_LIBRARY.length() + 1), offset);
}
if (value.regionMatches(true, 0, IHeaderConstants.IMPORT_TEMPLATE, 0, Math.min(length, IHeaderConstants.IMPORT_TEMPLATE.length()))) {
return handleImportPackageCompletion(value.substring(IHeaderConstants.IMPORT_TEMPLATE.length() + 1), offset);
}
if (value.regionMatches(true, 0, IHeaderConstants.EXPORT_TEMPLATE, 0, Math.min(length, IHeaderConstants.EXPORT_TEMPLATE.length()))) {
return handleExportPackageCompletion(value.substring(IHeaderConstants.EXPORT_TEMPLATE.length() + 1), offset);
}
if (value.regionMatches(true, 0, IHeaderConstants.EXCLUDED_IMPORTS, 0, Math.min(length, IHeaderConstants.EXCLUDED_IMPORTS.length()))) {
return handleImportPackageCompletion(value.substring(IHeaderConstants.EXCLUDED_IMPORTS.length() + 1), offset);
}
if (value.regionMatches(true, 0, IHeaderConstants.EXCLUDED_EXPORTS, 0, Math.min(length, IHeaderConstants.EXCLUDED_EXPORTS.length()))) {
return handleExportPackageCompletion(value.substring(IHeaderConstants.EXCLUDED_EXPORTS.length() + 1), offset);
}
if (value.regionMatches(true, 0, IHeaderConstants.UNVERSIONED_IMPORTS, 0, Math.min(length, IHeaderConstants.UNVERSIONED_IMPORTS.length()))) {
return handleImportPackageCompletion(value.substring(IHeaderConstants.UNVERSIONED_IMPORTS.length() + 1), offset);
}
return super.computeValue(doc, startOffset, offset);
}
@Override
protected ICompletionProposal[] handleImportPackageCompletion(String currentValue, int offset) {
int comma = currentValue.lastIndexOf(',');
int semicolon = currentValue.lastIndexOf(';');
String value = comma != -1 ? currentValue.substring(comma + 1) : currentValue;
if (comma > semicolon || comma == semicolon) {
HashSet set = (HashSet) this.fHeaders.get(Constants.IMPORT_PACKAGE);
if (set == null) {
set = parseHeaderForValues(currentValue, offset);
}
value = removeLeadingSpaces(value);
int length = value.length();
set.remove(value);
ArrayList<BundleTypeCompletionProposal> completions = new ArrayList<BundleTypeCompletionProposal>();
Set<PackageExport> packages = RepositoryUtils.getImportPackageProposals(getProject(), value);
for (PackageExport proposal : packages) {
if (!set.contains(proposal.getName())) {
completions.add(
new BundleTypeCompletionProposal(proposal.getName(), getImage(F_TYPE_PKG), proposal.getName(), offset - length, length));
set.add(proposal.getName());
}
}
ICompletionProposal[] proposals = completions.toArray(new ICompletionProposal[completions.size()]);
sortCompletions(proposals);
return proposals;
}
int equals = currentValue.lastIndexOf('=');
if (equals == -1 || semicolon > equals) {
String[] validAtts = new String[] { Constants.VERSION_ATTRIBUTE, Constants.RESOLUTION_DIRECTIVE };
Integer[] validTypes = new Integer[] { new Integer(F_TYPE_ATTRIBUTE), new Integer(F_TYPE_DIRECTIVE) };
return handleAttrsAndDirectives(value, initializeNewList(validAtts), initializeNewList(validTypes), offset);
}
String attributeValue = removeLeadingSpaces(currentValue.substring(semicolon + 1));
if (Constants.RESOLUTION_DIRECTIVE.regionMatches(true, 0, attributeValue, 0, Constants.RESOLUTION_DIRECTIVE.length())) {
return matchValueCompletion(currentValue.substring(equals + 1),
new String[] { Constants.RESOLUTION_MANDATORY, Constants.RESOLUTION_OPTIONAL }, new int[] { F_TYPE_VALUE, F_TYPE_VALUE }, offset,
"RESOLUTION_");
}
if (Constants.VERSION_ATTRIBUTE.regionMatches(true, 0, attributeValue, 0, Constants.VERSION_ATTRIBUTE.length())) {
String pluginId = removeLeadingSpaces(currentValue.substring(comma == -1 ? 0 : comma + 1, semicolon));
return getPackageVersionCompletions(pluginId, removeLeadingSpaces(currentValue.substring(equals + 1)), offset);
}
return new ICompletionProposal[0];
}
@SuppressWarnings("unchecked")
@Override
protected ICompletionProposal[] handleFragmentHostCompletion(String currentValue, int offset) {
int comma = currentValue.lastIndexOf(',');
int semicolon = currentValue.lastIndexOf(';');
String value = comma != -1 ? currentValue.substring(comma + 1) : currentValue;
if (comma > semicolon || comma == semicolon) {
Set<String> set = (HashSet<String>) this.fHeaders.get(Constants.REQUIRE_BUNDLE);
if (set == null) {
set = parseHeaderForValues(currentValue, offset);
}
value = removeLeadingSpaces(value);
int length = value.length();
set.remove(value);
ArrayList<BundleTypeCompletionProposal> completions = new ArrayList<BundleTypeCompletionProposal>();
Set<Artefact> bundles = RepositoryUtils.getImportBundleProposals(getProject(), value);
for (IArtefact proposal : bundles) {
if (!set.contains(proposal.getSymbolicName())) {
completions.add(new BundleTypeCompletionProposal(proposal.getSymbolicName(), getImage(F_TYPE_BUNDLE), proposal.getSymbolicName(),
offset - length, length));
set.add(proposal.getSymbolicName());
}
}
ICompletionProposal[] proposals = completions.toArray(new ICompletionProposal[completions.size()]);
sortCompletions(proposals);
return proposals;
}
int equals = currentValue.lastIndexOf('=');
if (equals == -1 || semicolon > equals) {
return matchValueCompletion(removeLeadingSpaces(currentValue.substring(semicolon + 1)),
new String[] { Constants.BUNDLE_VERSION_ATTRIBUTE }, new int[] { F_TYPE_ATTRIBUTE }, offset);
}
String attributeValue = removeLeadingSpaces(currentValue.substring(semicolon + 1));
if (Constants.BUNDLE_VERSION_ATTRIBUTE.regionMatches(true, 0, attributeValue, 0, Constants.BUNDLE_VERSION_ATTRIBUTE.length())) {
String pluginId = removeLeadingSpaces(currentValue.substring(comma == -1 ? 0 : comma + 1, semicolon));
return getSpringBundleVersionCompletions(pluginId, removeLeadingSpaces(currentValue.substring(equals + 1)), offset);
}
return new ICompletionProposal[0];
}
private ICompletionProposal[] handleImportLibraryCompletion(String currentValue, int offset) {
int comma = currentValue.lastIndexOf(',');
int semicolon = currentValue.lastIndexOf(';');
String value = comma != -1 ? currentValue.substring(comma + 1) : currentValue;
if (comma > semicolon || comma == semicolon) {
HashSet set = (HashSet) this.fHeaders.get(IHeaderConstants.IMPORT_LIBRARY);
if (set == null) {
set = parseHeaderForValues(currentValue, offset);
}
value = removeLeadingSpaces(value);
int length = value.length();
set.remove(value);
ArrayList<BundleTypeCompletionProposal> completions = new ArrayList<BundleTypeCompletionProposal>();
Set<Artefact> libraries = RepositoryUtils.getImportLibraryProposals(getProject(), value);
for (IArtefact proposal : libraries) {
if (!set.contains(proposal.getSymbolicName())) {
completions.add(new BundleTypeCompletionProposal(proposal.getSymbolicName(), getImage(F_TYPE_LIB), proposal.getSymbolicName(),
offset - length, length));
set.add(proposal.getSymbolicName());
}
}
ICompletionProposal[] proposals = completions.toArray(new ICompletionProposal[completions.size()]);
sortCompletions(proposals);
return proposals;
}
int equals = currentValue.lastIndexOf('=');
if (equals == -1 || semicolon > equals) {
String[] validAtts = new String[] { Constants.VERSION_ATTRIBUTE, Constants.RESOLUTION_DIRECTIVE, IHeaderConstants.PROMOTES_DIRECTIVE };
Integer[] validTypes = new Integer[] { new Integer(F_TYPE_ATTRIBUTE), new Integer(F_TYPE_DIRECTIVE), new Integer(F_TYPE_DIRECTIVE) };
return handleAttrsAndDirectives(value, initializeNewList(validAtts), initializeNewList(validTypes), offset);
}
String attributeValue = removeLeadingSpaces(currentValue.substring(semicolon + 1));
if (Constants.RESOLUTION_DIRECTIVE.regionMatches(true, 0, attributeValue, 0, Constants.RESOLUTION_DIRECTIVE.length())) {
return matchValueCompletion(currentValue.substring(equals + 1),
new String[] { Constants.RESOLUTION_MANDATORY, Constants.RESOLUTION_OPTIONAL }, new int[] { F_TYPE_VALUE, F_TYPE_VALUE }, offset,
"RESOLUTION_");
}
if (IHeaderConstants.PROMOTES_DIRECTIVE.regionMatches(true, 0, attributeValue, 0, IHeaderConstants.PROMOTES_DIRECTIVE.length())) {
return handleTrueFalseValue(currentValue.substring(equals + 1), offset);
}
if (Constants.VERSION_ATTRIBUTE.regionMatches(true, 0, attributeValue, 0, Constants.VERSION_ATTRIBUTE.length())) {
String pluginId = removeLeadingSpaces(currentValue.substring(comma == -1 ? 0 : comma + 1, semicolon));
return getLibraryVersionCompletions(pluginId, removeLeadingSpaces(currentValue.substring(equals + 1)), offset);
}
return new ICompletionProposal[0];
}
private ICompletionProposal[] handleImportBundleCompletion(String currentValue, int offset) {
int comma = currentValue.lastIndexOf(',');
int semicolon = currentValue.lastIndexOf(';');
String value = comma != -1 ? currentValue.substring(comma + 1) : currentValue;
if (comma > semicolon || comma == semicolon) {
HashSet set = (HashSet) this.fHeaders.get(IHeaderConstants.IMPORT_BUNDLE);
if (set == null) {
set = parseHeaderForValues(currentValue, offset);
}
value = removeLeadingSpaces(value);
int length = value.length();
set.remove(value);
ArrayList<BundleTypeCompletionProposal> completions = new ArrayList<BundleTypeCompletionProposal>();
Set<Artefact> bundles = RepositoryUtils.getImportBundleProposals(getProject(), value);
for (IArtefact proposal : bundles) {
if (!set.contains(proposal.getSymbolicName())) {
completions.add(new BundleTypeCompletionProposal(proposal.getSymbolicName(), getImage(F_TYPE_BUNDLE), proposal.getSymbolicName(),
offset - length, length));
set.add(proposal.getSymbolicName());
}
}
ICompletionProposal[] proposals = completions.toArray(new ICompletionProposal[completions.size()]);
sortCompletions(proposals);
return proposals;
}
int equals = currentValue.lastIndexOf('=');
if (equals == -1 || semicolon > equals) {
String[] validAtts = new String[] { Constants.VERSION_ATTRIBUTE, Constants.RESOLUTION_DIRECTIVE };
Integer[] validTypes = new Integer[] { new Integer(F_TYPE_ATTRIBUTE), new Integer(F_TYPE_DIRECTIVE) };
return handleAttrsAndDirectives(value, initializeNewList(validAtts), initializeNewList(validTypes), offset);
}
String attributeValue = removeLeadingSpaces(currentValue.substring(semicolon + 1));
if (Constants.RESOLUTION_DIRECTIVE.regionMatches(true, 0, attributeValue, 0, Constants.RESOLUTION_DIRECTIVE.length())) {
return matchValueCompletion(currentValue.substring(equals + 1),
new String[] { Constants.RESOLUTION_MANDATORY, Constants.RESOLUTION_OPTIONAL }, new int[] { F_TYPE_VALUE, F_TYPE_VALUE }, offset,
"RESOLUTION_");
}
if (Constants.VERSION_ATTRIBUTE.regionMatches(true, 0, attributeValue, 0, Constants.VERSION_ATTRIBUTE.length())) {
String pluginId = removeLeadingSpaces(currentValue.substring(comma == -1 ? 0 : comma + 1, semicolon));
return getSpringBundleVersionCompletions(pluginId, removeLeadingSpaces(currentValue.substring(equals + 1)), offset);
}
return new ICompletionProposal[0];
}
@Override
protected ICompletionProposal[] handleRequireBundleCompletion(String currentValue, int offset) {
int comma = currentValue.lastIndexOf(',');
int semicolon = currentValue.lastIndexOf(';');
String value = comma != -1 ? currentValue.substring(comma + 1) : currentValue;
if (comma > semicolon || comma == semicolon) {
HashSet set = (HashSet) this.fHeaders.get(Constants.REQUIRE_BUNDLE);
if (set == null) {
set = parseHeaderForValues(currentValue, offset);
}
value = removeLeadingSpaces(value);
int length = value.length();
set.remove(value);
ArrayList<BundleTypeCompletionProposal> completions = new ArrayList<BundleTypeCompletionProposal>();
Set<Artefact> bundles = RepositoryUtils.getImportBundleProposals(getProject(), value);
for (IArtefact proposal : bundles) {
if (!set.contains(proposal.getSymbolicName())) {
completions.add(new BundleTypeCompletionProposal(proposal.getSymbolicName(), getImage(F_TYPE_BUNDLE), proposal.getSymbolicName(),
offset - length, length));
set.add(proposal.getSymbolicName());
}
}
ICompletionProposal[] proposals = completions.toArray(new ICompletionProposal[completions.size()]);
sortCompletions(proposals);
return proposals;
}
int equals = currentValue.lastIndexOf('=');
if (equals == -1 || semicolon > equals) {
String[] validAttrs = new String[] { Constants.BUNDLE_VERSION_ATTRIBUTE, Constants.RESOLUTION_DIRECTIVE, Constants.VISIBILITY_DIRECTIVE };
Integer[] validTypes = new Integer[] { new Integer(F_TYPE_ATTRIBUTE), new Integer(F_TYPE_DIRECTIVE), new Integer(F_TYPE_DIRECTIVE) };
return handleAttrsAndDirectives(value, initializeNewList(validAttrs), initializeNewList(validTypes), offset);
}
String attributeValue = removeLeadingSpaces(currentValue.substring(semicolon + 1));
if (Constants.VISIBILITY_DIRECTIVE.regionMatches(true, 0, attributeValue, 0, Constants.VISIBILITY_DIRECTIVE.length())) {
return matchValueCompletion(currentValue.substring(equals + 1),
new String[] { Constants.VISIBILITY_PRIVATE, Constants.VISIBILITY_REEXPORT }, new int[] { F_TYPE_VALUE, F_TYPE_VALUE }, offset,
"VISIBILITY_");
}
if (Constants.RESOLUTION_DIRECTIVE.regionMatches(true, 0, attributeValue, 0, Constants.RESOLUTION_DIRECTIVE.length())) {
return matchValueCompletion(currentValue.substring(equals + 1),
new String[] { Constants.RESOLUTION_MANDATORY, Constants.RESOLUTION_OPTIONAL }, new int[] { F_TYPE_VALUE, F_TYPE_VALUE }, offset,
"RESOLUTION_");
}
if (Constants.BUNDLE_VERSION_ATTRIBUTE.regionMatches(true, 0, attributeValue, 0, Constants.RESOLUTION_DIRECTIVE.length())) {
String pluginId = removeLeadingSpaces(currentValue.substring(comma == -1 ? 0 : comma + 1, semicolon));
return getSpringBundleVersionCompletions(pluginId, removeLeadingSpaces(currentValue.substring(equals + 1)), offset);
}
return new ICompletionProposal[0];
}
private IProject getProject() {
if (this.fJP == null) {
IProject project = ((PDEFormEditor) this.fSourcePage.getEditor()).getCommonProject();
this.fJP = JavaCore.create(project);
}
return this.fJP.getProject();
}
private ICompletionProposal[] getSpringBundleVersionCompletions(String bundleId, String existingValue, int offset) {
bundleId = getSymbolicName(bundleId);
Set<Artefact> bundles = RepositoryUtils.getImportBundleProposals(getProject(), bundleId);
if (bundles.size() > 0) {
ArrayList<BundleTypeCompletionProposal> proposals = new ArrayList<BundleTypeCompletionProposal>(bundles.size());
for (IArtefact element : bundles) {
if (element.getSymbolicName().equalsIgnoreCase(bundleId)) {
List<String> proposalValues = getVersionProposals(element.getVersion());
for (String proposalValue : proposalValues) {
if (proposalValue.regionMatches(0, existingValue, 0, existingValue.length())) {
proposals.add(new BundleTypeCompletionProposal(proposalValue.substring(existingValue.length()), getImage(F_TYPE_VALUE),
proposalValue, offset, 0));
}
}
}
}
return proposals.toArray(new ICompletionProposal[proposals.size()]);
} else if (existingValue.length() == 0) {
return new ICompletionProposal[] { new BundleTypeCompletionProposal("\"\"", getImage(F_TYPE_VALUE), "\"\"", offset, 0) };
}
return new ICompletionProposal[0];
}
private ICompletionProposal[] getLibraryVersionCompletions(String libraryId, String existingValue, int offset) {
libraryId = getSymbolicName(libraryId);
Set<Artefact> libraries = RepositoryUtils.getImportLibraryProposals(getProject(), libraryId);
if (libraries.size() > 0) {
ArrayList<BundleTypeCompletionProposal> proposals = new ArrayList<BundleTypeCompletionProposal>(libraries.size());
for (IArtefact element : libraries) {
if (element.getSymbolicName().equalsIgnoreCase(libraryId)) {
List<String> proposalValues = getVersionProposals(element.getVersion());
for (String proposalValue : proposalValues) {
if (proposalValue.regionMatches(0, existingValue, 0, existingValue.length())) {
proposals.add(new BundleTypeCompletionProposal(proposalValue.substring(existingValue.length()), getImage(F_TYPE_VALUE),
proposalValue, offset, 0));
}
}
}
}
return proposals.toArray(new ICompletionProposal[proposals.size()]);
} else if (existingValue.length() == 0) {
return new ICompletionProposal[] { new BundleTypeCompletionProposal("\"\"", getImage(F_TYPE_VALUE), "\"\"", offset, 0) };
}
return new ICompletionProposal[0];
}
private ICompletionProposal[] getPackageVersionCompletions(String packageId, String existingValue, int offset) {
Set<String> proposedVersions = new HashSet<String>();
boolean wildcard = packageId.endsWith(".*");
packageId = getSymbolicName(packageId);
Set<PackageExport> packages = RepositoryUtils.getImportPackageProposals(getProject(), packageId);
if (packages.size() > 0) {
ArrayList<BundleTypeCompletionProposal> proposals = new ArrayList<BundleTypeCompletionProposal>(packages.size());
for (PackageExport element : packages) {
if (wildcard || element.getName().equalsIgnoreCase(packageId)) {
List<String> proposalValues = getVersionProposals(element.getVersion());
for (String proposalValue : proposalValues) {
if (!proposedVersions.contains(proposalValue) && proposalValue.regionMatches(0, existingValue, 0, existingValue.length())) {
proposedVersions.add(proposalValue);
proposals.add(new BundleTypeCompletionProposal(proposalValue.substring(existingValue.length()), getImage(F_TYPE_VALUE),
proposalValue, offset, 0));
}
}
}
}
return proposals.toArray(new ICompletionProposal[proposals.size()]);
} else if (existingValue.length() == 0) {
return new ICompletionProposal[] { new BundleTypeCompletionProposal("\"\"", getImage(F_TYPE_VALUE), "\"\"", offset, 0) };
}
return new ICompletionProposal[0];
}
private List<String> getVersionProposals(OsgiVersion version) {
Set<String> versionStrings = new LinkedHashSet<String>();
versionStrings.add(version.toString());
List<String> versions = new ArrayList<String>();
for (String ver : RepositoryUtils.getVersionProposals(versionStrings)) {
versions.add(new StringBuilder().append("\"").append(ver).append("\"").toString());
}
return versions;
}
private String getSymbolicName(String string) {
if (string.endsWith(".*")) {
string = string.substring(0, string.length() - 2);
}
int ix = string.indexOf(';');
if (ix > 0) {
return string.substring(0, ix);
}
return string;
}
@Override
public Image getImage(int type) {
if (type >= 0 && type < F_TOTAL_TYPES) {
if (this.fImages[type] == null) {
switch (type) {
case F_TYPE_LIB:
return this.fImages[type] = PDEPluginImages.DESC_JAR_LIB_OBJ.createImage();
case F_TYPE_BUNDLE:
return this.fImages[type] = PDEPluginImages.DESC_BUNDLE_OBJ.createImage();
}
} else {
return this.fImages[type];
}
}
return super.getImage(type);
}
}