misc
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / phpeditor / php / PHPCompletionProcessor.java
index 8ea69f7..939bd77 100644 (file)
@@ -7,7 +7,6 @@
 
  Contributors:
  IBM Corporation - Initial implementation
- Klaus Hartlage - www.eclipseproject.de
  **********************************************************************/
 package net.sourceforge.phpeclipse.phpeditor.php;
 
@@ -18,29 +17,15 @@ import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.Map;
 import java.util.SortedMap;
 
-import net.sourceforge.phpdt.core.IBuffer;
 import net.sourceforge.phpdt.core.ICompilationUnit;
-import net.sourceforge.phpdt.core.IJavaProject;
-import net.sourceforge.phpdt.core.JavaModelException;
 import net.sourceforge.phpdt.core.ToolFactory;
 import net.sourceforge.phpdt.core.compiler.ITerminalSymbols;
 import net.sourceforge.phpdt.core.compiler.InvalidInputException;
-import net.sourceforge.phpdt.internal.compiler.IProblemFactory;
-import net.sourceforge.phpdt.internal.compiler.SourceElementParser;
-import net.sourceforge.phpdt.internal.compiler.impl.CompilerOptions;
 import net.sourceforge.phpdt.internal.compiler.parser.Scanner;
-import net.sourceforge.phpdt.internal.compiler.problem.DefaultProblemFactory;
-import net.sourceforge.phpdt.internal.core.CompilationUnit;
-import net.sourceforge.phpdt.internal.core.CompilationUnitStructureRequestor;
-import net.sourceforge.phpdt.internal.core.JavaModelManager;
-import net.sourceforge.phpdt.internal.core.JavaProject;
-import net.sourceforge.phpdt.internal.corext.template.ContextType;
-import net.sourceforge.phpdt.internal.corext.template.ContextTypeRegistry;
-import net.sourceforge.phpdt.internal.corext.template.php.CompilationUnitContextType;
-import net.sourceforge.phpdt.internal.corext.template.php.PHPUnitContext;
+import net.sourceforge.phpdt.internal.corext.template.php.JavaContext;
+import net.sourceforge.phpdt.internal.corext.template.php.JavaContextType;
 import net.sourceforge.phpdt.internal.ui.PHPUiImages;
 import net.sourceforge.phpdt.internal.ui.text.java.IPHPCompletionProposal;
 import net.sourceforge.phpdt.internal.ui.text.java.PHPCompletionProposalComparator;
@@ -48,15 +33,14 @@ 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.SQLProposal;
-import net.sourceforge.phpdt.internal.ui.text.template.TemplateEngine;
+import net.sourceforge.phpdt.internal.ui.text.template.contentassist.TemplateEngine;
 import net.sourceforge.phpdt.ui.IWorkingCopyManager;
-import net.sourceforge.phpeclipse.IPreferenceConstants;
 import net.sourceforge.phpeclipse.PHPeclipsePlugin;
 import net.sourceforge.phpeclipse.builder.IdentifierIndexManager;
-import net.sourceforge.phpeclipse.internal.compiler.ast.CompilationUnitDeclaration;
-import net.sourceforge.phpeclipse.overlaypages.Util;
 import net.sourceforge.phpeclipse.phpeditor.PHPEditor;
 import net.sourceforge.phpeclipse.phpeditor.PHPSyntaxRdr;
+import net.sourceforge.phpeclipse.ui.IPreferenceConstants;
+import net.sourceforge.phpeclipse.ui.overlaypages.Util;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
@@ -72,7 +56,9 @@ import org.eclipse.jface.text.contentassist.IContextInformation;
 import org.eclipse.jface.text.contentassist.IContextInformationExtension;
 import org.eclipse.jface.text.contentassist.IContextInformationPresenter;
 import org.eclipse.jface.text.contentassist.IContextInformationValidator;
+import org.eclipse.jface.text.templates.TemplateContextType;
 import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
 import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.IFileEditorInput;
 
@@ -204,7 +190,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
   public PHPCompletionProcessor(IEditorPart editor) {
     fEditor = editor;
     fManager = PHPeclipsePlugin.getDefault().getWorkingCopyManager();
-    ContextType contextType = ContextTypeRegistry.getInstance().getContextType(
+    TemplateContextType contextType = PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType(
         "php"); //$NON-NLS-1$
     if (contextType != null)
       fTemplateEngine = new TemplateEngine(contextType);
@@ -244,7 +230,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
   }
 
   private int getLastToken(ITextViewer viewer, int completionPosition,
-      PHPUnitContext context, TableName tableName) {
+      JavaContext context, TableName tableName) {
     IDocument document = viewer.getDocument();
     int start = context.getStart();
     int end = context.getEnd();
@@ -528,7 +514,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
 
   private ICompletionProposal[] internalComputeCompletionProposals(
       ITextViewer viewer, int offset, int contextOffset) {
-
+    ICompilationUnit unit= fManager.getWorkingCopy(fEditor.getEditorInput());
     IDocument document = viewer.getDocument();
     Object[] identifiers = null;
     IFile file = null;
@@ -539,19 +525,25 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
         editor = (PHPEditor) fEditor;
         file = ((IFileEditorInput) editor.getEditorInput()).getFile();
         project = file.getProject();
-        //        outlinePage = editor.getfOutlinePage();
-        // TODO: get the identifiers from the new model
-        //        if (outlinePage instanceof PHPContentOutlinePage) {
-        //          identifiers = ((PHPContentOutlinePage) outlinePage).getVariables();
-        //        }
       }
     }
     
-    ContextType phpContextType = ContextTypeRegistry.getInstance()
-        .getContextType("php"); //$NON-NLS-1$
-    ((CompilationUnitContextType) phpContextType).setContextParameters(
-        document, offset, 0);
-    PHPUnitContext context = (PHPUnitContext) phpContextType.createContext();
+    Point selection= viewer.getSelectedRange();
+
+       // remember selected text
+       String selectedText= null;
+       if (selection.y != 0) {
+               try {
+                       selectedText= document.get(selection.x, selection.y);
+               } catch (BadLocationException e) {}
+       }
+
+    JavaContextType phpContextType = (JavaContextType)PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType(
+    "php"); //$NON-NLS-1$
+//    ((CompilationUnitContextType) phpContextType).setContextParameters(
+//        document, offset, 0);
+    JavaContext context = (JavaContext) phpContextType.createContext(document, offset,selection.y,unit);
+    context.setVariable("selection", selectedText); //$NON-NLS-1$
     String prefix = context.getKey();
     TableName sqlTable = new TableName();
     int lastSignificantToken = getLastToken(viewer, offset, context, sqlTable);
@@ -565,17 +557,17 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
       ICompletionProposal[] results;
       if (!emptyPrefix) {
         fTemplateEngine.reset();
-        fTemplateEngine.complete(viewer, offset); //, unit);
+        fTemplateEngine.complete(viewer, offset, unit);
         templateResults = fTemplateEngine.getResults();
       }
       IPHPCompletionProposal[] identifierResults = new IPHPCompletionProposal[0];
       if ((!useClassMembers) && identifiers != null) {
         IdentifierEngine identifierEngine;
-        ContextType contextType = ContextTypeRegistry.getInstance()
-            .getContextType("php"); //$NON-NLS-1$
+        JavaContextType contextType = (JavaContextType)PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType(
+        "php"); //$NON-NLS-1$
         if (contextType != null) {
           identifierEngine = new IdentifierEngine(contextType);
-          identifierEngine.complete(viewer, offset, identifiers);
+          identifierEngine.complete(viewer, offset, identifiers,unit);
           identifierResults = identifierEngine.getResults();
         }
       }
@@ -583,15 +575,15 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
       IPHPCompletionProposal[] declarationResults = new IPHPCompletionProposal[0];
       if (project != null) {
         DeclarationEngine declarationEngine;
-        ContextType contextType = ContextTypeRegistry.getInstance()
-            .getContextType("php"); //$NON-NLS-1$
+        JavaContextType contextType = (JavaContextType)PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType(
+        "php"); //$NON-NLS-1$
         if (contextType != null) {
           IdentifierIndexManager indexManager = PHPeclipsePlugin.getDefault()
               .getIndexManager(project);
           SortedMap sortedMap = indexManager.getIdentifierMap();
           declarationEngine = new DeclarationEngine(project, contextType,
               lastSignificantToken, file);
-          declarationEngine.complete(viewer, offset, sortedMap);
+          declarationEngine.complete(viewer, offset, sortedMap,unit);
           declarationResults = declarationEngine.getResults();
         }
       }
@@ -601,103 +593,17 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
       if ((!useClassMembers) && syntaxbuffer != null) {
         BuiltInEngine builtinEngine;
         String proposal;
-        ContextType contextType = ContextTypeRegistry.getInstance()
-            .getContextType("php"); //$NON-NLS-1$
+        JavaContextType contextType = (JavaContextType)PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType(
+        "php"); //$NON-NLS-1$
         if (contextType != null) {
           builtinEngine = new BuiltInEngine(contextType);
-          builtinEngine.complete(viewer, offset, syntaxbuffer);
+          builtinEngine.complete(viewer, offset, syntaxbuffer, unit);
           builtinResults = builtinEngine.getResults();
         }
       }
       IPHPCompletionProposal[] sqlResults = new IPHPCompletionProposal[0];
       if (project != null) {
-        // Get The Database bookmark from the Quantum SQL plugin:
-        BookmarkCollection sqlBookMarks = BookmarkCollection.getInstance();
-        if (sqlBookMarks != null) {
-          String bookmarkString = Util.getMiscProjectsPreferenceValue(project,
-              IPreferenceConstants.PHP_BOOKMARK_DEFAULT);
-          if (bookmarkString != null && !bookmarkString.equals("")) {
-            Bookmark bookmark = sqlBookMarks.find(bookmarkString);
-            ArrayList sqlList = new ArrayList();
-            if (bookmark != null && !bookmark.isConnected()) {
-              new ConnectionUtil().connect(bookmark, null);
-            }
-            if (bookmark != null && bookmark.isConnected()) {
-              try {
-                Connection connection = bookmark.getConnection();
-                DatabaseMetaData metaData = connection.getMetaData();
-
-                if (metaData != null) {
-                  int start = context.getStart();
-                  int end = context.getEnd();
-                  String foundSQLTableName = sqlTable.getTableName();
-                  String tableName;
-                  String columnName;
-                  String prefixWithoutDollar = prefix;
-                  boolean isDollarPrefix = false;
-                  if (prefix.length() > 0 && prefix.charAt(0) == '$') {
-                    prefixWithoutDollar = prefix.substring(1);
-                    isDollarPrefix = true;
-                  }
-                  IRegion region = new Region(start, end - start);
-                  ResultSet set;
-                  if (!isDollarPrefix) {
-                    set = metaData.getTables(null, null, prefixWithoutDollar
-                        + "%", null);
-                    while (set.next()) {
-                      //                  String tempSchema = set.getString("TABLE_SCHEM");
-                      //                  tempSchema = (tempSchema == null) ? "" :
-                      // tempSchema.trim();
-                      tableName = set.getString("TABLE_NAME");
-                      tableName = (tableName == null) ? "" : tableName.trim();
-                      if (tableName != null && tableName.length() > 0) {
-                        sqlList.add(new SQLProposal(tableName, context, region,
-                            viewer, PHPUiImages.get(PHPUiImages.IMG_TABLE)));
-                      }
-                    }
-                    set.close();
-                  }
-                  set = metaData.getColumns(null, null, "%",
-                      prefixWithoutDollar + "%");
-                  SQLProposal sqlProposal;
-                  while (set.next()) {
-                    columnName = set.getString("COLUMN_NAME");
-                    columnName = (columnName == null) ? "" : columnName.trim();
-                    tableName = set.getString("TABLE_NAME");
-                    tableName = (tableName == null) ? "" : tableName.trim();
-                    if (tableName != null && tableName.length() > 0
-                        && columnName != null && columnName.length() > 0) {
-                      if (isDollarPrefix) {
-                        sqlProposal = new SQLProposal(tableName, "$"
-                            + columnName, context, region, viewer, PHPUiImages
-                            .get(PHPUiImages.IMG_COLUMN));
-                      } else {
-                        sqlProposal = new SQLProposal(tableName, columnName,
-                            context, region, viewer, PHPUiImages
-                                .get(PHPUiImages.IMG_COLUMN));
-                      }
-                      if (tableName.equals(foundSQLTableName)) {
-                        sqlProposal.setRelevance(90);
-                      } else if (tableName.indexOf(foundSQLTableName) >= 0) {
-                        sqlProposal.setRelevance(75);
-                      }
-                      sqlList.add(sqlProposal);
-                    }
-                  }
-                  set.close();
-                  sqlResults = new IPHPCompletionProposal[sqlList.size()];
-                  for (int i = 0; i < sqlList.size(); i++) {
-                    sqlResults[i] = (SQLProposal) sqlList.get(i);
-                  }
-                }
-              } catch (NotConnectedException e) {
-                // ignore this - not mission critical
-              } catch (SQLException e) {
-                e.printStackTrace();
-              }
-            }
-          }
-        }
+        sqlResults = getSQLProposals(viewer, project, context, prefix, sqlTable, sqlResults);
       }
       // concatenate the result arrays
       IPHPCompletionProposal[] total;
@@ -726,6 +632,106 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
     return new IPHPCompletionProposal[0];
   }
 
+  /**
+   * @param viewer
+   * @param project
+   * @param context
+   * @param prefix
+   * @param sqlTable
+   * @param sqlResults
+   * @return
+   */
+  private IPHPCompletionProposal[] getSQLProposals(ITextViewer viewer, IProject project, JavaContext context, String prefix, TableName sqlTable, IPHPCompletionProposal[] sqlResults) {
+    // Get The Database bookmark from the Quantum SQL plugin:
+    BookmarkCollection sqlBookMarks = BookmarkCollection.getInstance();
+    if (sqlBookMarks != null) {
+      String bookmarkString = Util.getMiscProjectsPreferenceValue(project,
+          IPreferenceConstants.PHP_BOOKMARK_DEFAULT);
+      if (bookmarkString != null && !bookmarkString.equals("")) {
+        Bookmark bookmark = sqlBookMarks.find(bookmarkString);
+        ArrayList sqlList = new ArrayList();
+        if (bookmark != null && !bookmark.isConnected()) {
+          new ConnectionUtil().connect(bookmark, null);
+        }
+        if (bookmark != null && bookmark.isConnected()) {
+          try {
+            Connection connection = bookmark.getConnection();
+            DatabaseMetaData metaData = connection.getMetaData();
+
+            if (metaData != null) {
+              int start = context.getStart();
+              int end = context.getEnd();
+              String foundSQLTableName = sqlTable.getTableName();
+              String tableName;
+              String columnName;
+              String prefixWithoutDollar = prefix;
+              boolean isDollarPrefix = false;
+              if (prefix.length() > 0 && prefix.charAt(0) == '$') {
+                prefixWithoutDollar = prefix.substring(1);
+                isDollarPrefix = true;
+              }
+              IRegion region = new Region(start, end - start);
+              ResultSet set;
+              if (!isDollarPrefix) {
+                set = metaData.getTables(null, null, prefixWithoutDollar
+                    + "%", null);
+                while (set.next()) {
+                  //                  String tempSchema = set.getString("TABLE_SCHEM");
+                  //                  tempSchema = (tempSchema == null) ? "" :
+                  // tempSchema.trim();
+                  tableName = set.getString("TABLE_NAME");
+                  tableName = (tableName == null) ? "" : tableName.trim();
+                  if (tableName != null && tableName.length() > 0) {
+                    sqlList.add(new SQLProposal(tableName, context, region,
+                        viewer, PHPUiImages.get(PHPUiImages.IMG_TABLE)));
+                  }
+                }
+                set.close();
+              }
+              set = metaData.getColumns(null, null, "%",
+                  prefixWithoutDollar + "%");
+              SQLProposal sqlProposal;
+              while (set.next()) {
+                columnName = set.getString("COLUMN_NAME");
+                columnName = (columnName == null) ? "" : columnName.trim();
+                tableName = set.getString("TABLE_NAME");
+                tableName = (tableName == null) ? "" : tableName.trim();
+                if (tableName != null && tableName.length() > 0
+                    && columnName != null && columnName.length() > 0) {
+                  if (isDollarPrefix) {
+                    sqlProposal = new SQLProposal(tableName, "$"
+                        + columnName, context, region, viewer, PHPUiImages
+                        .get(PHPUiImages.IMG_COLUMN));
+                  } else {
+                    sqlProposal = new SQLProposal(tableName, columnName,
+                        context, region, viewer, PHPUiImages
+                            .get(PHPUiImages.IMG_COLUMN));
+                  }
+                  if (tableName.equals(foundSQLTableName)) {
+                    sqlProposal.setRelevance(90);
+                  } else if (tableName.indexOf(foundSQLTableName) >= 0) {
+                    sqlProposal.setRelevance(75);
+                  }
+                  sqlList.add(sqlProposal);
+                }
+              }
+              set.close();
+              sqlResults = new IPHPCompletionProposal[sqlList.size()];
+              for (int i = 0; i < sqlList.size(); i++) {
+                sqlResults[i] = (SQLProposal) sqlList.get(i);
+              }
+            }
+          } catch (NotConnectedException e) {
+            // ignore this - not mission critical
+          } catch (SQLException e) {
+            e.printStackTrace();
+          }
+        }
+      }
+    }
+    return sqlResults;
+  }
+
   private int guessContextInformationPosition(ITextViewer viewer, int offset) {
     int contextPosition = offset;
     IDocument document = viewer.getDocument();