/* * This file is part of the PDT Extensions eclipse plugin. * * (c) Robert Gruendler <r.gruendler@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ package org.pdtextensions.core.ui.contentassist; import org.eclipse.dltk.core.IMethod; import org.eclipse.dltk.core.IModelElement; import org.eclipse.dltk.core.ISourceModule; import org.eclipse.dltk.core.ISourceRange; import org.eclipse.dltk.core.ISourceReference; import org.eclipse.dltk.core.IType; import org.eclipse.dltk.core.ModelException; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.Region; import org.eclipse.jface.text.TextUtilities; import org.eclipse.php.internal.core.format.FormatterUtils; 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.swt.graphics.Image; import org.eclipse.ui.texteditor.ITextEditor; import org.pdtextensions.core.log.Logger; import org.pdtextensions.core.ui.codemanipulation.MethodStub; import org.pdtextensions.core.util.PDTFormatterUtils; /** * */ @SuppressWarnings("restriction") public class SuperclassMethodCompletionProposal extends PHPCompletionProposal { private final IMethod method; private boolean replacementComputed = false; /** * @param replacementString * @param replacementOffset * @param replacementLength * @param image * @param displayString * @param relevance * @param iMethod * @param iSourceModule */ public SuperclassMethodCompletionProposal(String replacementString, int replacementOffset, int replacementLength, Image image, String displayString, int relevance, IMethod iMethod, ISourceModule iSourceModule) { super(replacementString, replacementOffset, replacementLength, image, displayString, relevance); method = iMethod; } /* * (non-Javadoc) * * @see * org.eclipse.dltk.ui.text.completion.AbstractScriptCompletionProposal# * getReplacementString() */ @Override public String getReplacementString() { if (!replacementComputed) { return computeReplacementString(); } return super.getReplacementString(); } /* * (non-Javadoc) * * @see * org.eclipse.dltk.ui.text.completion.AbstractScriptCompletionProposal# * apply(org.eclipse.jface.text.ITextViewer, char, int, int) */ @Override public void apply(final ITextViewer viewer, char trigger, int stateMask, int offset) { super.apply(viewer, trigger, stateMask, offset); IModelElement modelElement = ((PHPStructuredEditor) ((PHPStructuredTextViewer) viewer).getTextEditor()) .getModelElement(); try { int off = viewer.getDocument().getLineInformationOfOffset(getReplacementOffset()).getOffset(); Region region = new Region(off, getReplacementString().length() + (offset - off)); PDTFormatterUtils.format(viewer.getDocument(), region, modelElement.getScriptProject().getProject()); ISourceModule module = modelElement.getAncestor(ISourceModule.class); module.makeConsistent(null); IModelElement elementAt = module.getElementAt(offset); ISourceRange sourceRange = (elementAt instanceof IType ? ((IType)elementAt).getMethod(method.getElementName()) : (IMethod)elementAt).getSourceRange(); String string = viewer.getDocument().get(sourceRange.getOffset(), sourceRange.getLength()); int pos = string.indexOf('{') + 1; while (Character.isWhitespace(string.charAt(pos))) { pos++; } viewer.getDocument().getLineInformationOfOffset(sourceRange.getOffset() + pos); setCursorPosition(sourceRange.getOffset() - getReplacementOffset() + pos); // usestatement injection must be added manually, // as the PDT injector uses the model element from the proposal // to inject the statements. in this case, the modelelement // is the method from the parent class, so nothing is being // injected... } catch (BadLocationException e) { Logger.logException(e); } catch (ModelException e) { Logger.logException(e); } } private String computeReplacementString() { ITextViewer viewer = getTextViewer(); IDocument document = viewer.getDocument(); ITextEditor textEditor = ((PHPStructuredTextViewer) viewer).getTextEditor(); try { if (textEditor instanceof PHPStructuredEditor) { IModelElement editorElement = ((PHPStructuredEditor) textEditor).getModelElement(); if (editorElement != null) { char indentChar = FormatterUtils.getFormatterCommonPreferences().getIndentationChar(document); String indent = String.valueOf(indentChar); String code = ""; code += MethodStub.getMethodStub(method.getElementName(), method, method, indent, TextUtilities.getDefaultLineDelimiter(document), true); return code; } } } catch (Exception e) { Logger.logException(e); } return ""; } }