ContextHelp now in new module net.sourceforge.phpeclipse.phphelp
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / phpeditor / php / PHPCompletionProcessor.java
index c7ad06a..159d8fc 100644 (file)
@@ -20,12 +20,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.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.CompletionProposal;
 import org.eclipse.jface.text.contentassist.ContextInformation;
 import org.eclipse.jface.text.contentassist.ICompletionProposal;
 import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
@@ -34,6 +37,8 @@ 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;
 
 /**
  * Example PHP completion processor.
@@ -112,43 +117,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 +286,21 @@ 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 +311,33 @@ 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();
+        }
+      }
+      
       // concatenate arrays
-      IJavaCompletionProposal[] total = new IJavaCompletionProposal[templateResults.length]; // +results.length ];
+      IJavaCompletionProposal[] total;
+      total = new IJavaCompletionProposal[templateResults.length + identifierResults.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);
       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 +429,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
    * Method declared on IContentAssistProcessor
    */
   public char[] getCompletionProposalAutoActivationCharacters() {
-    return new char[] { '$' };
+    return null; // new char[] { '$' };
   }
 
   /* (non-Javadoc)