package org.pdtextensions.semanticanalysis.ui.contentassist; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.dltk.core.ICodeAssist; import org.eclipse.dltk.core.IModelElement; import org.eclipse.dltk.core.IType; import org.eclipse.dltk.core.index2.search.ISearchEngine.MatchRule; import org.eclipse.dltk.core.search.IDLTKSearchScope; import org.eclipse.dltk.core.search.SearchEngine; import org.eclipse.dltk.internal.ui.editor.EditorUtility; import org.eclipse.dltk.ui.DLTKPluginImages; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.window.Window; import org.eclipse.php.internal.core.model.PHPModelAccess; import org.eclipse.php.internal.ui.editor.PHPStructuredEditor; import org.eclipse.php.internal.ui.editor.PHPStructuredTextViewer; import org.eclipse.php.internal.ui.editor.contentassist.PHPCompletionProposal; import org.eclipse.php.internal.ui.editor.contentassist.UseStatementInjector; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.ElementListSelectionDialog; import org.pdtextensions.core.log.Logger; @SuppressWarnings("restriction") public class InjectUseStatementCompletionProposal extends PHPCompletionProposal { private IType type = null; public InjectUseStatementCompletionProposal(String replacementString, int replacementOffset, int replacementLength, Image image, String displayString, int relevance) { super(replacementString, replacementOffset, replacementLength, image, displayString, relevance); } public Image getImage() { return DLTKPluginImages.get(DLTKPluginImages.IMG_OBJS_IMPDECL); } @Override public void apply(ITextViewer viewer, char trigger, int stateMask, int offset) { IDocument document = viewer.getDocument(); PHPStructuredEditor textEditor = (PHPStructuredEditor) ((PHPStructuredTextViewer) viewer) .getTextEditor(); if (textEditor instanceof PHPStructuredEditor) { IModelElement editorElement = ((PHPStructuredEditor) textEditor) .getModelElement(); if (editorElement != null) { IModelElement input = EditorUtility.getEditorInputModelElement(textEditor, false); if (input instanceof ICodeAssist) { try { int repOffset = getReplacementOffset(); int length = getReplacementLength(); IDLTKSearchScope scope = SearchEngine.createSearchScope(input.getScriptProject()); String type = document.get(repOffset, length); IType[] types = PHPModelAccess.getDefault().findTypes(null, type, MatchRule.EXACT, 0, 0, scope, new NullProgressMonitor()); if (types.length == 1) { this.type = types[0]; UseStatementInjector injector = new UseStatementInjector(this); injector.inject(document, viewer, offset); } else if (types.length > 1) { Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); ElementListSelectionDialog dialog = new ElementListSelectionDialog(shell, new TypeLabelProvider()); dialog.setElements(types); if (dialog.open() == Window.OK) { Object[] result = dialog.getResult(); if (result != null && result.length == 1) { this.type = (IType) result[0]; UseStatementInjector injector = new UseStatementInjector(this); injector.inject(document, viewer, offset); } } } } catch (BadLocationException e) { Logger.logException(e); } } } } } public IModelElement getModelElement() { return type; }; private static class TypeLabelProvider extends LabelProvider { @Override public String getText(Object element) { if (element instanceof IType) { return ((IType)element).getFullyQualifiedName("\\"); } return super.getText(element); } @Override public Image getImage(Object element) { return DLTKPluginImages.get(DLTKPluginImages.IMG_OBJS_CLASS); } } }