/* * generated by Xtext */ package org.eclipselabs.spray.xtext.ui.contentassist; import java.net.MalformedURLException; import java.net.URL; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceVisitor; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.jface.viewers.StyledString; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.ColorDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.dialogs.ElementListSelectionDialog; import org.eclipse.xtext.Assignment; import org.eclipse.xtext.Keyword; import org.eclipse.xtext.RuleCall; import org.eclipse.xtext.resource.IEObjectDescription; import org.eclipse.xtext.scoping.IGlobalScopeProvider; import org.eclipse.xtext.scoping.IScope; import org.eclipse.xtext.ui.editor.contentassist.ConfigurableCompletionProposal; import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext; import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor; import org.eclipse.xtext.ui.editor.contentassist.ReplacementTextApplier; import org.eclipselabs.spray.mm.spray.SprayPackage; import org.eclipselabs.spray.xtext.api.IConstants; import org.eclipselabs.spray.xtext.services.SprayGrammarAccess; import org.eclipselabs.spray.xtext.ui.labeling.SprayDescriptionLabelProvider; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import com.google.inject.Inject; import com.google.inject.name.Named; /** * see http://www.eclipse.org/Xtext/documentation/latest/xtext.html#contentAssist on how to customize content assistant */ public class SprayProposalProvider extends AbstractSprayProposalProvider { @Inject private IWorkspaceRoot root; @Inject @Named(IConstants.NAME_VALID_ICON_FILE_EXTENSIONS) private Set validIconFileExtensions; @Inject private IGlobalScopeProvider globalScopeProvider; @Inject private SprayDescriptionLabelProvider descriptionLabelProvider; @Inject private SprayGrammarAccess grammar; private static final Set<String> FILTERED_KEYWORDS = Sets.newHashSet("text", "line", "class", "behavior"); @Override public void completeMetaClass_Icon(EObject model, Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) { URI uri = model.eResource().getURI(); if (!uri.isPlatformResource()) { return; } final String projectName = uri.segment(1); IPath iconFolderPath = new Path(projectName).append("icons"); IFolder folder = root.getFolder(iconFolderPath); if (!folder.exists()) { return; } try { folder.accept(new IResourceVisitor() { @Override public boolean visit(IResource resource) { if (resource instanceof IFile) { IFile file = (IFile) resource; if (validIconFileExtensions.contains(file.getFileExtension())) { final String proposalText = "\"" + file.getFullPath().removeFirstSegments(2).toString() + "\""; final StyledString displayString = new StyledString(file.getFullPath().removeFirstSegments(2).toString()); final Image image = getImage(file.getLocation()); ICompletionProposal proposal = doCreateProposal(proposalText, displayString, image, 0, context); acceptor.accept(proposal); } } return true; } }); } catch (CoreException e) { ; // ignore } } protected Image getImage(IPath path) { URL url = null; try { url = path.toFile().toURL(); } catch (MalformedURLException e) { return null; } final Image image = ImageDescriptor.createFromURL(url).createImage(); return image; } @Override public void complete_RGBColor(EObject model, RuleCall ruleCall, final ContentAssistContext context, ICompletionProposalAcceptor acceptor) { ConfigurableCompletionProposal pickColor = (ConfigurableCompletionProposal) createCompletionProposal("Pick color...", context); if (pickColor != null) { pickColor.setTextApplier(new ReplacementTextApplier() { @Override public String getActualReplacementString(ConfigurableCompletionProposal proposal) { Display display = context.getViewer().getTextWidget().getDisplay(); ColorDialog colorDialog = new ColorDialog(display.getActiveShell()); RGB newColor = colorDialog.open(); return "RGB(" + newColor.red + "," + newColor.green + "," + newColor.blue + ")"; } }); pickColor.setPriority(600); acceptor.accept(pickColor); } } public void complete_Import(final EObject model, RuleCall ruleCall, final ContentAssistContext context, ICompletionProposalAcceptor acceptor) { ConfigurableCompletionProposal proposal = (ConfigurableCompletionProposal) createCompletionProposal("Select element...", context); if (proposal == null) return; proposal.setTextApplier(new ReplacementTextApplier() { @Override public String getActualReplacementString(ConfigurableCompletionProposal proposal) { Display display = context.getViewer().getTextWidget().getDisplay(); ElementListSelectionDialog dialog = new ElementListSelectionDialog(display.getActiveShell(), descriptionLabelProvider); dialog.setTitle("Select element to import"); dialog.setBlockOnOpen(true); dialog.setFilter("*" + context.getPrefix()); IScope globalElementScope = globalScopeProvider.getScope(model.eResource(), SprayPackage.Literals.META_CLASS__TYPE, null); dialog.setElements(Iterables.toArray(globalElementScope.getAllElements(), Object.class)); dialog.open(); String result = dialog.getFirstResult() != null ? ((IEObjectDescription) dialog.getFirstResult()).getQualifiedName().toString() : null; if (result == null) { result = context.getPrefix(); } else { result += ";"; } return result; } }); proposal.setPriority(600); acceptor.accept(proposal); }; @Override public void completeKeyword(Keyword keyword, ContentAssistContext contentAssistContext, ICompletionProposalAcceptor acceptor) { if (FILTERED_KEYWORDS.contains(keyword.getValue())) { // don't propose keyword return; } super.completeKeyword(keyword, contentAssistContext, acceptor); } }