Improved CodeCompletion with information from the project.index file.
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / phpeditor / php / PHPCompletionProcessor.java
index 893e0c1..c4ce375 100644 (file)
@@ -14,18 +14,24 @@ package net.sourceforge.phpeclipse.phpeditor.php;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.SortedMap;
 
 import net.sourceforge.phpdt.internal.corext.template.ContextType;
 import net.sourceforge.phpdt.internal.corext.template.ContextTypeRegistry;
 import net.sourceforge.phpdt.internal.ui.text.java.IPHPCompletionProposal;
 import net.sourceforge.phpdt.internal.ui.text.java.PHPCompletionProposalComparator;
 import net.sourceforge.phpdt.internal.ui.text.template.BuiltInEngine;
+import net.sourceforge.phpdt.internal.ui.text.template.DeclarationEngine;
 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.builder.IdentifierIndexManager;
+import net.sourceforge.phpeclipse.phpeditor.AbstractContentOutlinePage;
 import net.sourceforge.phpeclipse.phpeditor.PHPContentOutlinePage;
 import net.sourceforge.phpeclipse.phpeditor.PHPEditor;
 
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.ITextViewer;
 import org.eclipse.jface.text.TextPresentation;
@@ -37,6 +43,7 @@ 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;
+import org.eclipse.ui.IFileEditorInput;
 
 /**
  * Example PHP completion processor.
@@ -249,7 +256,16 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
 
     fComparator = new PHPCompletionProposalComparator();
   }
-  
+
+  /**
+   * Tells this processor to order the proposals alphabetically.
+   * 
+   * @param order <code>true</code> if proposals should be ordered.
+   */
+  public void orderProposalsAlphabetically(boolean order) {
+    fComparator.setOrderAlphabetically(order);
+  }
+
   /**
    * Sets this processor's set of characters triggering the activation of the
    * completion proposal computation.
@@ -257,7 +273,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
    * @param activationSet the activation set
    */
   public void setCompletionProposalAutoActivationCharacters(char[] activationSet) {
-    fProposalAutoActivationSet= activationSet;
+    fProposalAutoActivationSet = activationSet;
   }
   /* (non-Javadoc)
    * Method declared on IContentAssistProcessor
@@ -296,16 +312,21 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
   private ICompletionProposal[] internalComputeCompletionProposals(ITextViewer viewer, int offset, int contextOffset) {
     IDocument document = viewer.getDocument();
     Object[] identifiers = null;
+    IProject project = null;
     if (offset > 0) {
 
       PHPEditor editor = null;
-      PHPContentOutlinePage outlinePage = null;
+      AbstractContentOutlinePage outlinePage = null;
 
       IEditorPart targetEditor = PHPeclipsePlugin.getActiveWorkbenchWindow().getActivePage().getActiveEditor();
       if (targetEditor != null && (targetEditor instanceof PHPEditor)) {
         editor = (PHPEditor) targetEditor;
+        IFile f = ((IFileEditorInput) editor.getEditorInput()).getFile();
+        project = f.getProject();
         outlinePage = editor.getfOutlinePage();
-        identifiers = outlinePage.getVariables();
+        if (outlinePage instanceof PHPContentOutlinePage) {
+          identifiers = ((PHPContentOutlinePage) outlinePage).getVariables();
+        }
       }
     }
 
@@ -340,6 +361,23 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
         }
       }
 
+      IPHPCompletionProposal[] declarationResults = new IPHPCompletionProposal[0];
+      if (project != null) {
+        DeclarationEngine identifierEngine;
+        String proposal;
+
+        ContextType contextType = ContextTypeRegistry.getInstance().getContextType("php"); //$NON-NLS-1$
+        if (contextType != null) {
+          IdentifierIndexManager indexManager = PHPeclipsePlugin.getDefault().getIndexManager(project);
+          SortedMap sortedMap = indexManager.getIdentifierMap();
+
+          identifierEngine = new DeclarationEngine(contextType);
+          identifierEngine.complete(viewer, offset, sortedMap);
+          identifierResults = identifierEngine.getResults();
+        }
+      }
+
+      // built in function names from phpsyntax.xml
       IPHPCompletionProposal[] builtinResults = new IPHPCompletionProposal[0];
       if (PHPFunctionNames.FUNCTION_NAMES != null) {
         BuiltInEngine builtinEngine;
@@ -348,6 +386,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
         ContextType contextType = ContextTypeRegistry.getInstance().getContextType("php"); //$NON-NLS-1$
         if (contextType != null) {
           builtinEngine = new BuiltInEngine(contextType);
+          // TODO PHPFunctionNames.FUNCTION_NAMES should be taken from phpsyntax.xml
           builtinEngine.complete(viewer, offset, PHPFunctionNames.FUNCTION_NAMES);
           builtinResults = builtinEngine.getResults();
         }
@@ -355,10 +394,21 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
 
       // concatenate arrays
       IPHPCompletionProposal[] total;
-      total = new IPHPCompletionProposal[templateResults.length + identifierResults.length + builtinResults.length];
+      total =
+        new IPHPCompletionProposal[templateResults.length
+          + identifierResults.length
+          + builtinResults.length
+          + declarationResults.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);
+      System.arraycopy(
+        declarationResults,
+        0,
+        total,
+        templateResults.length + identifierResults.length + builtinResults.length,
+        declarationResults.length);
+
       results = total;
 
       fNumberOfComputedResults = (results == null ? 0 : results.length);
@@ -454,7 +504,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
    */
   public char[] getCompletionProposalAutoActivationCharacters() {
     return fProposalAutoActivationSet;
-//    return null; // new char[] { '$' };
+    //    return null; // new char[] { '$' };
   }
 
   /* (non-Javadoc)