package com.mobilesorcery.sdk.ui; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.bindings.keys.KeyStroke; import org.eclipse.jface.bindings.keys.ParseException; import org.eclipse.jface.fieldassist.ContentProposal; import org.eclipse.jface.fieldassist.ContentProposalAdapter; import org.eclipse.jface.fieldassist.IContentProposal; import org.eclipse.jface.fieldassist.IContentProposalProvider; import org.eclipse.jface.fieldassist.SimpleContentProposalProvider; import org.eclipse.jface.fieldassist.TextContentAdapter; import org.eclipse.swt.widgets.Text; import com.mobilesorcery.sdk.core.CoreMoSyncPlugin; import com.mobilesorcery.sdk.core.ParameterResolver; public class ParameterResolverContentProvider implements IContentProposalProvider { private ParameterResolver resolver; public ParameterResolverContentProvider(ParameterResolver resolver) { this.resolver = resolver; } @Override public IContentProposal[] getProposals(String contents, int position) { // Find last % sign boolean foundToken = false; char ch = '\0'; int ix = Math.min(position, contents.length() - 1); while (ix >= 0 && !foundToken) { ch = contents.charAt(ix); foundToken = ch == '%'; ix--; } // +1 to remove the % sign String potentialMatch = contents.substring(ix + 1, position); String match = foundToken ? potentialMatch : ""; String param = ParameterResolver.getParameter(potentialMatch); if (param == null) { return getPrefixProposals(match); } else { return getParameterProposals(potentialMatch); } } private IContentProposal[] getPrefixProposals(String match) { ArrayList<IContentProposal> filteredPrefixes = new ArrayList<IContentProposal>(); for (String prefix : resolver.listPrefixes()) { prefix = "%" + prefix + (prefix.endsWith(":") ? "" : "%"); if (prefix.startsWith(match)) { filteredPrefixes.add(new ContentProposal( prefix.substring(match.length()), prefix, null)); } } return filteredPrefixes.toArray(new IContentProposal[filteredPrefixes.size()]); } private IContentProposal[] getParameterProposals(String match) { String matchWithoutPerc = match.length() > 0 && match.charAt(0) == '%' ? match.substring(1) : match; String prefix = ParameterResolver.getPrefix(matchWithoutPerc); ArrayList<IContentProposal> filteredPrefixes = new ArrayList<IContentProposal>(); List<String> availableParams = resolver.listAvailableParameters(prefix); if (availableParams != null) { for (String availableParam : availableParams) { String completion = "%" + prefix + availableParam + "%"; if (completion.startsWith(match)) { filteredPrefixes.add(new ContentProposal( completion.substring(match.length()), completion, null)); } } } return filteredPrefixes.toArray(new IContentProposal[filteredPrefixes.size()]); } /** * Configures a text field to accept content proposals from a {@link ParameterResolver()} * @param text * @param resolver * @return */ public static ParameterResolverContentProvider createProposalProvider(Text text, ParameterResolver resolver) { ParameterResolverContentProvider provider = new ParameterResolverContentProvider(resolver); try { char[] autoActivationCharacters = new char[] { '%', ':' }; KeyStroke keyStroke = KeyStroke.getInstance("Ctrl+Space"); ContentProposalAdapter adapter = new ContentProposalAdapter( text, new TextContentAdapter(), provider, keyStroke, autoActivationCharacters); } catch (ParseException e) { CoreMoSyncPlugin.getDefault().log(e); } return provider; } }