/*
* 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);
}
}