package de.lynorics.eclipse.jangaroo.ui.contentassist; import java.util.Collections; import java.util.List; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.viewers.StyledString; import org.eclipse.swt.graphics.Image; import org.eclipse.xtext.naming.QualifiedName; import org.eclipse.xtext.nodemodel.util.NodeModelUtils; import org.eclipse.xtext.scoping.impl.ImportNormalizer; import org.eclipse.xtext.ui.editor.contentassist.ConfigurableCompletionProposal; import de.lynorics.eclipse.jangaroo.AS3ModelUtil; import de.lynorics.eclipse.jangaroo.aS3.Import; import de.lynorics.eclipse.jangaroo.aS3.Package; import de.lynorics.eclipse.jangaroo.aS3.directive; import de.lynorics.eclipse.jangaroo.scoping.AS3ImportedNamespaceScopeProvider; /** * @author mb0 */ public class AS3QualifiedCompletionProposal extends ConfigurableCompletionProposal { protected String quali; protected final EObject currentModel; private AS3ImportedNamespaceScopeProvider importedNamespaceScopeProvider; public AS3QualifiedCompletionProposal(String proposal, AS3ImportedNamespaceScopeProvider importedNamespaceScopeProvider, EObject currentModel, int replacementOffset, int replacementLength, int length, Image image, StyledString displayString) { super(proposal, replacementOffset, replacementLength, length, image, displayString, null, null); this.importedNamespaceScopeProvider = importedNamespaceScopeProvider; this.currentModel = currentModel; } @Override public void selected(ITextViewer viewer, boolean smartToggle) { super.selected(viewer, smartToggle); } public void checkImports() { String replacementString = getReplacementString(); QualifiedName qname = QualifiedName.create(replacementString.split("\\.")); for (ImportNormalizer norm:getImportNormalizers(currentModel)) { QualifiedName name = norm.deresolve(qname); if (name != null && name.getSegmentCount() == 1) { setReplacementString(name.toString()); return; } } quali = qname.skipLast(1).toString(); String newReplacement = qname.getLastSegment(); setReplacementString(newReplacement); setCursorPosition(getCursorPosition()-quali.length()-1); } protected List<ImportNormalizer> getImportNormalizers(EObject context) { if (importedNamespaceScopeProvider != null) { EObject current = context; while (current != null) { if (importedNamespaceScopeProvider.hasImports(current)) break; current = current.eContainer(); } return importedNamespaceScopeProvider.getImportResolvers(context, false); } return Collections.emptyList(); } @Override public void apply(IDocument document) { checkImports(); if (quali != null) { try { InsertImportCommand command = new InsertImportCommand(); int importOffset = command.getImportOffset(currentModel, quali); if (importOffset != -1) { command.apply(document, importOffset, quali + "." + getReplacementString()); return; } } catch (BadLocationException x) { // ignore } } super.apply(document); } }