improved PHP parser
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / ui / text / template / DeclarationProposal.java
index 4d95555..9723320 100644 (file)
@@ -5,29 +5,31 @@
 package net.sourceforge.phpdt.internal.ui.text.template;
 
 import net.sourceforge.phpdt.internal.corext.phpdoc.PHPDocUtil;
-import net.sourceforge.phpdt.internal.corext.template.TemplateContext;
 import net.sourceforge.phpdt.internal.corext.template.TemplateMessages;
-import net.sourceforge.phpdt.internal.corext.template.php.PHPUnitContext;
+import net.sourceforge.phpdt.internal.corext.template.php.JavaContext;
 import net.sourceforge.phpdt.internal.ui.PHPUiImages;
 import net.sourceforge.phpdt.internal.ui.text.link.LinkedPositionManager;
 import net.sourceforge.phpdt.internal.ui.text.link.LinkedPositionUI;
 import net.sourceforge.phpeclipse.PHPeclipsePlugin;
 import net.sourceforge.phpeclipse.builder.PHPIdentifierLocation;
 
+import org.eclipse.core.resources.IProject;
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.IRegion;
 import org.eclipse.jface.text.ITextViewer;
 import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.jface.text.templates.TemplateContext;
 import org.eclipse.swt.graphics.Image;
-//import org.eclipse.jdt.internal.ui.text.link.LinkedPositionManager;
-//import org.eclipse.jdt.internal.ui.text.link.LinkedPositionUI;
-//import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
+//import net.sourceforge.phpdt.internal.ui.text.link.LinkedPositionManager;
+//import net.sourceforge.phpdt.internal.ui.text.link.LinkedPositionUI;
+//import net.sourceforge.phpdt.internal.ui.util.ExceptionHandler;
 
 /**
  * A PHP identifier proposal.
  */
-public class DeclarationProposal extends AbstractProposal {//implements IPHPCompletionProposal {
+public class DeclarationProposal extends AbstractProposal { //implements IPHPCompletionProposal {
+  private IProject fProject;
   private final TemplateContext fContext;
   private final PHPIdentifierLocation fLocation;
 
@@ -36,10 +38,10 @@ public class DeclarationProposal extends AbstractProposal {//implements IPHPComp
   //  private final Image fImage_fun;
   //  private final Image fImage_var;
   private final IRegion fRegion;
-//  private IRegion fSelectedRegion; // initialized by apply()
+  //  private IRegion fSelectedRegion; // initialized by apply()
 
-  private final String fTemplate;
-//  private final ITextViewer fViewer;
+  private final String fIdentifierName;
+  //  private final ITextViewer fViewer;
 
   /**
    * Creates a template proposal with a template and its context.
@@ -48,20 +50,19 @@ public class DeclarationProposal extends AbstractProposal {//implements IPHPComp
    * @param image     the icon of the proposal.
    */
   public DeclarationProposal(
-    String template,
+      IProject project,
+    String identifierName,
     PHPIdentifierLocation location,
     TemplateContext context,
     IRegion region,
     ITextViewer viewer) {
-       super(viewer);
+    super(viewer);
     //    Image image_fun,
     //    Image image_var) {
-    fTemplate = template;
+    fProject = project;
+    fIdentifierName = identifierName;
     fLocation = location;
     fContext = context;
-//    fViewer = viewer;
-    //    fImage_fun = image_fun;
-    //    fImage_var = image_var;
     fRegion = region;
   }
 
@@ -76,9 +77,20 @@ public class DeclarationProposal extends AbstractProposal {//implements IPHPComp
       int start = fRegion.getOffset();
       int end = fRegion.getOffset() + fRegion.getLength();
 
-      // insert template string
-      //  String templateString = fTemplate; // fTemplateBuffer.getString();   
-      document.replace(start, end - start, fTemplate);
+      switch (fLocation.getType()) {
+        case PHPIdentifierLocation.FUNCTION :
+          document.replace(start, end - start, fIdentifierName + "()");
+          break;
+        case PHPIdentifierLocation.CONSTRUCTOR :
+          document.replace(start, end - start, fIdentifierName + "()");
+          break;
+        case PHPIdentifierLocation.METHOD :
+          document.replace(start, end - start, fIdentifierName + "()");
+          break;
+
+        default :
+          document.replace(start, end - start, fIdentifierName);
+      }
 
       // translate positions
       LinkedPositionManager manager = new LinkedPositionManager(document);
@@ -97,8 +109,20 @@ public class DeclarationProposal extends AbstractProposal {//implements IPHPComp
       //                       }
 
       LinkedPositionUI editor = new LinkedPositionUI(fViewer, manager);
-      editor.setFinalCaretOffset(fTemplate.length() + start);
-      //   editor.setFinalCaretOffset(getCaretOffset(fTemplateBuffer) + start);
+      switch (fLocation.getType()) {
+        case PHPIdentifierLocation.FUNCTION :
+          editor.setFinalCaretOffset(fIdentifierName.length() + start + 1);
+          break;
+        case PHPIdentifierLocation.CONSTRUCTOR :
+          editor.setFinalCaretOffset(fIdentifierName.length() + start + 1);
+          break;
+        case PHPIdentifierLocation.METHOD :
+          editor.setFinalCaretOffset(fIdentifierName.length() + start + 1);
+          break;
+
+        default :
+          editor.setFinalCaretOffset(fIdentifierName.length() + start);
+      }
       editor.enter();
 
       fSelectedRegion = editor.getSelectedRegion();
@@ -118,10 +142,18 @@ public class DeclarationProposal extends AbstractProposal {//implements IPHPComp
    */
   public String getAdditionalProposalInfo() {
     StringBuffer hoverInfoBuffer = new StringBuffer();
-    String workspaceLocation = PHPeclipsePlugin.getWorkspace().getRoot().getLocation().toString();
+//    String workspaceLocation = PHPeclipsePlugin.getWorkspace().getRoot().getLocation().toString();
+    String workspaceLocation;
+    if (fProject!=null) {
+      workspaceLocation = fProject.getLocation().toString()+'/';
+    } else {
+      // should never happen?
+      workspaceLocation = PHPeclipsePlugin.getWorkspace()
+      .getRoot().getLocation().toString();
+    }
     String filename = workspaceLocation + fLocation.getFilename();
     PHPDocUtil.appendPHPDoc(hoverInfoBuffer, filename, fLocation);
-    return textToHTML(hoverInfoBuffer.toString());
+    return hoverInfoBuffer.toString();
   }
 
   /*
@@ -135,8 +167,17 @@ public class DeclarationProposal extends AbstractProposal {//implements IPHPComp
    * @see ICompletionProposal#getDisplayString()
    */
   public String getDisplayString() {
-    return fTemplate + TemplateMessages.getString("TemplateProposal.delimiter") + fTemplate; // $NON-NLS-1$ //$NON-NLS-1$
-    //         return fTemplate.getName() + ObfuscatorMessages.getString("TemplateProposal.delimiter") + fTemplate.getDescription(); // $NON-NLS-1$ //$NON-NLS-1$
+//    String workspaceLocation = PHPeclipsePlugin.getWorkspace().getRoot().getLocation().toString();
+    String workspaceLocation;
+    if (fProject!=null) {
+      workspaceLocation = fProject.getLocation().toString()+'/';
+    } else {
+      // should never happen?
+      workspaceLocation = PHPeclipsePlugin.getWorkspace()
+      .getRoot().getLocation().toString();
+    }
+    String filename = workspaceLocation + fLocation.getFilename();
+    return fIdentifierName + TemplateMessages.getString("TemplateProposal.delimiter") + PHPDocUtil.getUsage(filename, fLocation) + TemplateMessages.getString("TemplateProposal.delimiter") + filename; // $NON-NLS-1$ //$NON-NLS-1$
   }
 
   /*
@@ -146,40 +187,45 @@ public class DeclarationProposal extends AbstractProposal {//implements IPHPComp
     switch (fLocation.getType()) {
       case PHPIdentifierLocation.FUNCTION :
         return PHPUiImages.get(PHPUiImages.IMG_FUN);
-                       case PHPIdentifierLocation.CLASS :
-                               return PHPUiImages.get(PHPUiImages.IMG_CLASS);
-                       case PHPIdentifierLocation.METHOD :
-                               return PHPUiImages.get(PHPUiImages.IMG_FUN);
-                       case PHPIdentifierLocation.DEFINE :
-                               return PHPUiImages.get(PHPUiImages.IMG_DEFINE);
-                       case PHPIdentifierLocation.VARIABLE :
-                               return PHPUiImages.get(PHPUiImages.IMG_VAR);
+      case PHPIdentifierLocation.CLASS :
+        return PHPUiImages.get(PHPUiImages.IMG_CLASS);
+      case PHPIdentifierLocation.CONSTRUCTOR :
+        return PHPUiImages.get(PHPUiImages.IMG_CLASS);
+      case PHPIdentifierLocation.METHOD :
+        return PHPUiImages.get(PHPUiImages.IMG_FUN);
+      case PHPIdentifierLocation.DEFINE :
+        return PHPUiImages.get(PHPUiImages.IMG_DEFINE);
+      case PHPIdentifierLocation.VARIABLE :
+        return PHPUiImages.get(PHPUiImages.IMG_VAR);
+      case PHPIdentifierLocation.GLOBAL_VARIABLE :
+        return PHPUiImages.get(PHPUiImages.IMG_VAR);
     }
     return PHPUiImages.get(PHPUiImages.IMG_FUN);
-  }
+  } 
 
   /*
    * @see IJavaCompletionProposal#getRelevance()
    */
   public int getRelevance() {
 
-    if (fContext instanceof PHPUnitContext) {
-      PHPUnitContext context = (PHPUnitContext) fContext;
+    if (fContext instanceof JavaContext) {
+      JavaContext context = (JavaContext) fContext;
       switch (context.getCharacterBeforeStart()) {
         // high relevance after whitespace
         case ' ' :
         case '\r' :
         case '\n' :
         case '\t' :
-          return 90;
-
+          return 80;
+        case '>' : // ->
+        case ':' : // ::
+          return 85;
         default :
           return 0;
       }
     } else {
-      return 90;
+      return 80;
     }
   }
 
-
 }
\ No newline at end of file