Improved auto completion
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / phpeditor / php / PHPCompletionProcessor.java
index c7ad06a..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,13 +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 org.eclipse.jface.text.BadLocationException;
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+import net.sourceforge.phpeclipse.phpeditor.PHPContentOutlinePage;
+import net.sourceforge.phpeclipse.phpeditor.PHPEditor;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.ITextViewer;
 import org.eclipse.jface.text.TextPresentation;
-import org.eclipse.jface.text.contentassist.CompletionProposal;
-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;
@@ -34,6 +35,7 @@ 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.ui.IEditorPart;
 
 /**
  * Example PHP completion processor.
@@ -112,43 +114,125 @@ 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;
+  //    }
+  //  }
+
   protected final static String[] fgProposals = PHPFunctionNames.FUNCTION_NAMES;
-  //    {
-  //      "array",
-  //      "break",
-  //      "class",
-  //      "continue",
-  //      "do",
-  //      "echo",
-  //      "else",
-  //      "elseif",
-  //      "endfor",
-  //      "endif",
-  //      "for",
-  //      "if",
-  //      "while",
-  //      "endwhile",
-  //      "switch",
-  //      "case",
-  //      "endswitch",
-  //      "return",
-  //      "define",
-  //      "include",
-  //      "include_once",
-  //      "require",
-  //      "require_once",
-  //      "function",
-  //      "new",
-  //      "old_function",
-  //      "default",
-  //      "global",
-  //      "static",
-  //      "foreach",
-  //      "endforeach",
-  //      "extends",
-  //      "empty",
-  //      "isset",
-  //      "var" };
 
   protected IContextInformationValidator fValidator = new Validator();
   private TemplateEngine fTemplateEngine;
@@ -199,26 +283,22 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
 
   private ICompletionProposal[] internalComputeCompletionProposals(ITextViewer viewer, int offset, int contextOffset) {
     IDocument document = viewer.getDocument();
+    Object[] identifiers = null;
     if (offset > 0) {
-      try {
-        ICompletionProposal[] result;
-        char character = document.getChar(offset - 1);
-        if (character == '$') {
-          //viewer.  .getActivePage().getActiveEditor();
-          result = new ICompletionProposal[fgProposals.length];
-          for (int i = 0; i < fgProposals.length; i++) {
-            IContextInformation info = new ContextInformation(fgProposals[i], MessageFormat.format(PHPEditorMessages.getString("CompletionProcessor.Proposal.ContextInfo.pattern"), new Object[] { fgProposals[i] })); //$NON-NLS-1$
-            result[i] = new CompletionProposal(fgProposals[i], offset, 0, fgProposals[i].length(), null, fgProposals[i], info, MessageFormat.format(PHPEditorMessages.getString("CompletionProcessor.Proposal.hoverinfo.pattern"), new Object[] { fgProposals[i] })); //$NON-NLS-1$
-          }
-          return result;
-        }
-      } catch (BadLocationException e) {
-        return new ICompletionProposal[0];
+
+      PHPEditor editor = null;
+      PHPContentOutlinePage outlinePage = null;
+
+      IEditorPart targetEditor = PHPeclipsePlugin.getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+      if (targetEditor != null && (targetEditor instanceof PHPEditor)) {
+        editor = (PHPEditor) targetEditor;
+        outlinePage = editor.getfOutlinePage();
+        identifiers = outlinePage.getVariables();
       }
     }
 
     if (fTemplateEngine != null) {
-      IJavaCompletionProposal[] results;
+      ICompletionProposal[] results;
       //      try {
       fTemplateEngine.reset();
       fTemplateEngine.complete(viewer, offset); //, unit);
@@ -229,15 +309,47 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
 
       IJavaCompletionProposal[] templateResults = fTemplateEngine.getResults();
 
+      IJavaCompletionProposal[] identifierResults = new IJavaCompletionProposal[0];
+      if (identifiers != null) {
+        IdentifierEngine identifierEngine;
+        String proposal;
+        // int j = 0;
+        //        for (int i = templateResults.length; i < templateResults.length + variables.length; i++) {
+        //          proposal = (String) variables[j++];
+        //          IContextInformation info = new ContextInformation(proposal, MessageFormat.format(PHPEditorMessages.getString("CompletionProcessor.Proposal.ContextInfo.pattern"), new Object[] { proposal })); //$NON-NLS-1$
+        //          results[i] = new VariablesCompletionProposal(proposal, offset, 0, proposal.length(), null, proposal, info, MessageFormat.format(PHPEditorMessages.getString("CompletionProcessor.Proposal.hoverinfo.pattern"), new Object[] { proposal })); //$NON-NLS-1$
+        //        }
+
+        ContextType contextType = ContextTypeRegistry.getInstance().getContextType("php"); //$NON-NLS-1$
+        if (contextType != null) {
+          identifierEngine = new IdentifierEngine(contextType);
+          identifierEngine.complete(viewer, offset, identifiers);
+          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 = new IJavaCompletionProposal[templateResults.length]; // +results.length ];
+      IJavaCompletionProposal[] total;
+      total = new IJavaCompletionProposal[templateResults.length + identifierResults.length + builtinResults.length];
       System.arraycopy(templateResults, 0, total, 0, templateResults.length);
-      //      System.arraycopy(results, 0, total, templateResults.length, results.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);
-
       /*
        * Order here and not in result collector to make sure that the order
        * applies to all proposals and not just those of the compilation unit. 
@@ -329,7 +441,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
    * Method declared on IContentAssistProcessor
    */
   public char[] getCompletionProposalAutoActivationCharacters() {
-    return new char[] { '$' };
+    return null; // new char[] { '$' };
   }
 
   /* (non-Javadoc)