Improved auto completion
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / phpeditor / php / PHPCompletionProcessor.java
index 159d8fc..a96712b 100644 (file)
@@ -11,7 +11,6 @@ Contributors:
 **********************************************************************/
 package net.sourceforge.phpeclipse.phpeditor.php;
 
-import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -20,16 +19,15 @@ import net.sourceforge.phpdt.internal.corext.template.ContextType;
 import net.sourceforge.phpdt.internal.corext.template.ContextTypeRegistry;
 import net.sourceforge.phpdt.internal.ui.text.java.IJavaCompletionProposal;
 import net.sourceforge.phpdt.internal.ui.text.java.JavaCompletionProposalComparator;
+import net.sourceforge.phpdt.internal.ui.text.template.BuiltInEngine;
 import net.sourceforge.phpdt.internal.ui.text.template.IdentifierEngine;
 import net.sourceforge.phpdt.internal.ui.text.template.TemplateEngine;
 import net.sourceforge.phpeclipse.PHPeclipsePlugin;
 import net.sourceforge.phpeclipse.phpeditor.PHPContentOutlinePage;
 import net.sourceforge.phpeclipse.phpeditor.PHPEditor;
-import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.ITextViewer;
 import org.eclipse.jface.text.TextPresentation;
-import org.eclipse.jface.text.contentassist.ContextInformation;
 import org.eclipse.jface.text.contentassist.ICompletionProposal;
 import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
 import org.eclipse.jface.text.contentassist.IContextInformation;
@@ -37,7 +35,6 @@ import org.eclipse.jface.text.contentassist.IContextInformationExtension;
 import org.eclipse.jface.text.contentassist.IContextInformationPresenter;
 import org.eclipse.jface.text.contentassist.IContextInformationValidator;
 import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
 import org.eclipse.ui.IEditorPart;
 
 /**
@@ -117,123 +114,123 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
     }
   };
 
-//  public final class VariablesCompletionProposal implements IJavaCompletionProposal {
-//    private String fDisplayString;
-//    private String fReplacementString;
-//    private int fReplacementOffset;
-//    private int fReplacementLength;
-//    private int fCursorPosition;
-//    private Image fImage;
-//    private IContextInformation fContextInformation;
-//    private String fAdditionalProposalInfo;
-//
-//    /**
-//     * Creates a new completion proposal based on the provided information.  The replacement string is
-//     * considered being the display string too. All remaining fields are set to <code>null</code>.
-//     *
-//     * @param replacementString the actual string to be inserted into the document
-//     * @param replacementOffset the offset of the text to be replaced
-//     * @param replacementLength the length of the text to be replaced
-//     * @param cursorPosition the position of the cursor following the insert relative to replacementOffset
-//     */
-//    public VariablesCompletionProposal(
-//      String replacementString,
-//      int replacementOffset,
-//      int replacementLength,
-//      int cursorPosition) {
-//      this(replacementString, replacementOffset, replacementLength, cursorPosition, null, null, null, null);
-//    }
-//
-//    /**
-//     * Creates a new completion proposal. All fields are initialized based on the provided information.
-//     *
-//     * @param replacementString the actual string to be inserted into the document
-//     * @param replacementOffset the offset of the text to be replaced
-//     * @param replacementLength the length of the text to be replaced
-//     * @param cursorPosition the position of the cursor following the insert relative to replacementOffset
-//     * @param image the image to display for this proposal
-//     * @param displayString the string to be displayed for the proposal
-//     * @param contentInformation the context information associated with this proposal
-//     * @param additionalProposalInfo the additional information associated with this proposal
-//     */
-//    public VariablesCompletionProposal(
-//      String replacementString,
-//      int replacementOffset,
-//      int replacementLength,
-//      int cursorPosition,
-//      Image image,
-//      String displayString,
-//      IContextInformation contextInformation,
-//      String additionalProposalInfo) {
-//      //      Assert.isNotNull(replacementString);
-//      //      Assert.isTrue(replacementOffset >= 0);
-//      //      Assert.isTrue(replacementLength >= 0);
-//      //      Assert.isTrue(cursorPosition >= 0);
-//
-//      fReplacementString = replacementString;
-//      fReplacementOffset = replacementOffset;
-//      fReplacementLength = replacementLength;
-//      fCursorPosition = cursorPosition;
-//      fImage = image;
-//      fDisplayString = displayString;
-//      fContextInformation = contextInformation;
-//      fAdditionalProposalInfo = additionalProposalInfo;
-//    }
-//
-//    /*
-//     * @see ICompletionProposal#apply
-//     */
-//    public void apply(IDocument document) {
-//      try {
-//        document.replace(fReplacementOffset, fReplacementLength, fReplacementString);
-//      } catch (BadLocationException x) {
-//        // ignore
-//      }
-//    }
-//
-//    /*
-//     * @see ICompletionProposal#getSelection
-//     */
-//    public Point getSelection(IDocument document) {
-//      return new Point(fReplacementOffset + fCursorPosition, 0);
-//    }
-//
-//    /*
-//     * @see ICompletionProposal#getContextInformation()
-//     */
-//    public IContextInformation getContextInformation() {
-//      return fContextInformation;
-//    }
-//
-//    /*
-//     * @see ICompletionProposal#getImage()
-//     */
-//    public Image getImage() {
-//      return fImage;
-//    }
-//
-//    /*
-//     * @see ICompletionProposal#getDisplayString()
-//     */
-//    public String getDisplayString() {
-//      if (fDisplayString != null)
-//        return fDisplayString;
-//      return fReplacementString;
-//    }
-//
-//    /*
-//     * @see ICompletionProposal#getAdditionalProposalInfo()
-//     */
-//    public String getAdditionalProposalInfo() {
-//      return fAdditionalProposalInfo;
-//    }
-//    /**
-//    * Returns the relevance of the proposal.
-//    */
-//    public int getRelevance() {
-//      return 0;
-//    }
-//  }
+  //  public final class VariablesCompletionProposal implements IJavaCompletionProposal {
+  //    private String fDisplayString;
+  //    private String fReplacementString;
+  //    private int fReplacementOffset;
+  //    private int fReplacementLength;
+  //    private int fCursorPosition;
+  //    private Image fImage;
+  //    private IContextInformation fContextInformation;
+  //    private String fAdditionalProposalInfo;
+  //
+  //    /**
+  //     * Creates a new completion proposal based on the provided information.  The replacement string is
+  //     * considered being the display string too. All remaining fields are set to <code>null</code>.
+  //     *
+  //     * @param replacementString the actual string to be inserted into the document
+  //     * @param replacementOffset the offset of the text to be replaced
+  //     * @param replacementLength the length of the text to be replaced
+  //     * @param cursorPosition the position of the cursor following the insert relative to replacementOffset
+  //     */
+  //    public VariablesCompletionProposal(
+  //      String replacementString,
+  //      int replacementOffset,
+  //      int replacementLength,
+  //      int cursorPosition) {
+  //      this(replacementString, replacementOffset, replacementLength, cursorPosition, null, null, null, null);
+  //    }
+  //
+  //    /**
+  //     * Creates a new completion proposal. All fields are initialized based on the provided information.
+  //     *
+  //     * @param replacementString the actual string to be inserted into the document
+  //     * @param replacementOffset the offset of the text to be replaced
+  //     * @param replacementLength the length of the text to be replaced
+  //     * @param cursorPosition the position of the cursor following the insert relative to replacementOffset
+  //     * @param image the image to display for this proposal
+  //     * @param displayString the string to be displayed for the proposal
+  //     * @param contentInformation the context information associated with this proposal
+  //     * @param additionalProposalInfo the additional information associated with this proposal
+  //     */
+  //    public VariablesCompletionProposal(
+  //      String replacementString,
+  //      int replacementOffset,
+  //      int replacementLength,
+  //      int cursorPosition,
+  //      Image image,
+  //      String displayString,
+  //      IContextInformation contextInformation,
+  //      String additionalProposalInfo) {
+  //      //      Assert.isNotNull(replacementString);
+  //      //      Assert.isTrue(replacementOffset >= 0);
+  //      //      Assert.isTrue(replacementLength >= 0);
+  //      //      Assert.isTrue(cursorPosition >= 0);
+  //
+  //      fReplacementString = replacementString;
+  //      fReplacementOffset = replacementOffset;
+  //      fReplacementLength = replacementLength;
+  //      fCursorPosition = cursorPosition;
+  //      fImage = image;
+  //      fDisplayString = displayString;
+  //      fContextInformation = contextInformation;
+  //      fAdditionalProposalInfo = additionalProposalInfo;
+  //    }
+  //
+  //    /*
+  //     * @see ICompletionProposal#apply
+  //     */
+  //    public void apply(IDocument document) {
+  //      try {
+  //        document.replace(fReplacementOffset, fReplacementLength, fReplacementString);
+  //      } catch (BadLocationException x) {
+  //        // ignore
+  //      }
+  //    }
+  //
+  //    /*
+  //     * @see ICompletionProposal#getSelection
+  //     */
+  //    public Point getSelection(IDocument document) {
+  //      return new Point(fReplacementOffset + fCursorPosition, 0);
+  //    }
+  //
+  //    /*
+  //     * @see ICompletionProposal#getContextInformation()
+  //     */
+  //    public IContextInformation getContextInformation() {
+  //      return fContextInformation;
+  //    }
+  //
+  //    /*
+  //     * @see ICompletionProposal#getImage()
+  //     */
+  //    public Image getImage() {
+  //      return fImage;
+  //    }
+  //
+  //    /*
+  //     * @see ICompletionProposal#getDisplayString()
+  //     */
+  //    public String getDisplayString() {
+  //      if (fDisplayString != null)
+  //        return fDisplayString;
+  //      return fReplacementString;
+  //    }
+  //
+  //    /*
+  //     * @see ICompletionProposal#getAdditionalProposalInfo()
+  //     */
+  //    public String getAdditionalProposalInfo() {
+  //      return fAdditionalProposalInfo;
+  //    }
+  //    /**
+  //    * Returns the relevance of the proposal.
+  //    */
+  //    public int getRelevance() {
+  //      return 0;
+  //    }
+  //  }
 
   protected final static String[] fgProposals = PHPFunctionNames.FUNCTION_NAMES;
 
@@ -288,7 +285,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
     IDocument document = viewer.getDocument();
     Object[] identifiers = null;
     if (offset > 0) {
-   
+
       PHPEditor editor = null;
       PHPContentOutlinePage outlinePage = null;
 
@@ -299,6 +296,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
         identifiers = outlinePage.getVariables();
       }
     }
+
     if (fTemplateEngine != null) {
       ICompletionProposal[] results;
       //      try {
@@ -329,12 +327,26 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
           identifierResults = identifierEngine.getResults();
         }
       }
-      
+
+      IJavaCompletionProposal[] builtinResults = new IJavaCompletionProposal[0];
+      if (PHPFunctionNames.FUNCTION_NAMES != null) {
+        BuiltInEngine builtinEngine;
+        String proposal;
+
+        ContextType contextType = ContextTypeRegistry.getInstance().getContextType("php"); //$NON-NLS-1$
+        if (contextType != null) {
+          builtinEngine = new BuiltInEngine(contextType);
+          builtinEngine.complete(viewer, offset, PHPFunctionNames.FUNCTION_NAMES);
+          builtinResults = builtinEngine.getResults();
+        }
+      }
+
       // concatenate arrays
       IJavaCompletionProposal[] total;
-      total = new IJavaCompletionProposal[templateResults.length + identifierResults.length];
+      total = new IJavaCompletionProposal[templateResults.length + identifierResults.length + builtinResults.length];
       System.arraycopy(templateResults, 0, total, 0, templateResults.length);
       System.arraycopy(identifierResults, 0, total, templateResults.length, identifierResults.length);
+      System.arraycopy(builtinResults, 0, total, templateResults.length + identifierResults.length, builtinResults.length);
       results = total;
 
       fNumberOfComputedResults = (results == null ? 0 : results.length);