* Added browser like links (Ctrl+Mouseclick on identifier; same as F3 shortcut)
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / actions / PHPOpenDeclarationEditorAction.java
index 2dd8a72..e689c33 100644 (file)
@@ -7,52 +7,23 @@
  **********************************************************************************************************************************/
 package net.sourceforge.phpeclipse.actions;
 
-import java.io.File;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-import net.sourceforge.phpeclipse.PHPeclipsePlugin;
-import net.sourceforge.phpeclipse.builder.IdentifierIndexManager;
-import net.sourceforge.phpeclipse.builder.PHPIdentifierLocation;
 import net.sourceforge.phpeclipse.phpeditor.PHPEditor;
-import net.sourceforge.phpeclipse.phpeditor.php.PHPWordExtractor;
 
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Path;
 import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.ITextSelection;
 import org.eclipse.jface.text.TextSelection;
 import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.graphics.Point;
+import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.ui.IEditorActionDelegate;
 import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IFileEditorInput;
 import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.actions.ActionDelegate;
-import org.eclipse.ui.dialogs.ListSelectionDialog;
-import org.eclipse.ui.internal.dialogs.ListContentProvider;
 
 public class PHPOpenDeclarationEditorAction extends ActionDelegate implements IEditorActionDelegate {
-
   private IWorkbenchWindow fWindow;
 
   private PHPEditor fEditor;
 
-  private IProject fProject;
-
-  private boolean isIncludeString;
-
-  public void dispose() {
-  }
-
   public void init(IWorkbenchWindow window) {
     this.fWindow = window;
   }
@@ -67,6 +38,12 @@ public class PHPOpenDeclarationEditorAction extends ActionDelegate implements IE
     }
   }
 
+  private boolean checkEnabled(IStructuredSelection selection) {
+    if (selection.isEmpty())
+      return false;
+    return true;
+  }
   public void run(IAction action) {
     if (fEditor == null) {
       IEditorPart targetEditor = fWindow.getActivePage().getActiveEditor();
@@ -75,153 +52,9 @@ public class PHPOpenDeclarationEditorAction extends ActionDelegate implements IE
       }
     }
     if (fEditor != null) {
-      // determine the current Project from a (file-based) Editor
-      IFile f = ((IFileEditorInput) fEditor.getEditorInput()).getFile();
-      fProject = f.getProject();
-      //      System.out.println(fProject.toString());
-
       ITextSelection selection = (ITextSelection) fEditor.getSelectionProvider().getSelection();
-      IDocument doc = fEditor.getDocumentProvider().getDocument(fEditor.getEditorInput());
-      int pos = selection.getOffset();
-      //  System.out.println(selection.getText());
-      String identifierOrInclude = getIdentifierOrInclude(doc, pos);
-      //      System.out.println(word);
-      if (identifierOrInclude != null && !identifierOrInclude.equals("")) {
-        if (isIncludeString) {
-          openIncludeFile(identifierOrInclude);
-        } else {
-          openIdentifierDeclaration(f, identifierOrInclude);
-        }
-      }
-    }
-  }
-
-  /**
-   * @param filename
-   */
-  private void openIncludeFile(String filename) {
-    if (filename != null && !filename.equals("")) {
-      try {
-        IFile file = getIncludeFile(fProject, (IFileEditorInput) fEditor.getEditorInput(), filename);
-        if (file != null && file.exists()) {
-          PHPeclipsePlugin.getDefault().openFileInTextEditor(file.getLocation().toString());
-          return;
-        }
-      } catch (Exception e) {
-        // ignore
-      }
-
-      try {
-
-        IdentifierIndexManager indexManager = PHPeclipsePlugin.getDefault().getIndexManager(fProject);
-        //            filename = StringUtil.replaceRegExChars(filename);
-        List list = indexManager.getFileList(filename);
-        if (list != null && list.size() > 0) {
-          //String workspaceLocation = PHPeclipsePlugin.getWorkspace().getRoot().getLocation().toString();
-          String workspaceLocation = fProject.getLocation().toString() + File.separatorChar;
-
-          ListSelectionDialog listSelectionDialog = new ListSelectionDialog(PHPeclipsePlugin.getDefault().getWorkbench()
-              .getActiveWorkbenchWindow().getShell(), list, new ListContentProvider(), new LabelProvider(),
-              "Select the includes to open.");
-          listSelectionDialog.setTitle("Multiple includes found");
-          if (listSelectionDialog.open() == Window.OK) {
-            Object[] locations = listSelectionDialog.getResult();
-            if (locations != null) {
-              try {
-                for (int i = 0; i < locations.length; i++) {
-                  //                    PHPIdentifierLocation location = (PHPIdentifierLocation)
-                  // locations[i];
-                  String openFilename = workspaceLocation + ((String) locations[i]);
-                  PHPeclipsePlugin.getDefault().openFileInTextEditor(openFilename);
-                }
-              } catch (CoreException e) {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-              }
-            }
-          }
-
-        }
-      } catch (Exception e) {
-      }
-
-    }
-    return;
-  }
-
-  /**
-   * @param f
-   * @param identiifer
-   */
-  private void openIdentifierDeclaration(IFile f, String identiifer) {
-    if (identiifer != null && !identiifer.equals("")) {
-      IdentifierIndexManager indexManager = PHPeclipsePlugin.getDefault().getIndexManager(fProject);
-      List locationsList = indexManager.getLocations(identiifer);
-      if (locationsList != null && locationsList.size() > 0) {
-
-        //          String workspaceLocation = PHPeclipsePlugin.getWorkspace().getRoot()
-        //              .getLocation().toString();
-
-        String workspaceLocation = fProject.getLocation().toString() + File.separatorChar;
-        // TODO show all entries of the list in a dialog box
-        // at the moment always the first entry will be opened
-        if (locationsList.size() > 1) {
-          // determine all includes:
-          IncludesScanner includesScanner = new IncludesScanner(fProject, (IFileEditorInput) fEditor.getEditorInput());
-          includesScanner.addFile(f);
-          Set exactIncludeSet = includesScanner.getSet();
-
-          PHPIdentifierLocation includeName;
-          for (int i = 0; i < locationsList.size(); i++) {
-            includeName = (PHPIdentifierLocation) locationsList.get(i);
-            if (exactIncludeSet.contains(includeName.getFilename())) {
-              includeName.setMatch(PHPIdentifierLocation.EXACT_MATCH);
-            } else {
-              includeName.setMatch(PHPIdentifierLocation.UNDEFINED_MATCH);
-            }
-          }
-          Collections.sort(locationsList);
-
-          ListSelectionDialog listSelectionDialog = new ListSelectionDialog(PHPeclipsePlugin.getDefault().getWorkbench()
-              .getActiveWorkbenchWindow().getShell(), locationsList, new ListContentProvider(), new LabelProvider(),
-              "Select the resources to open.");
-          listSelectionDialog.setTitle("Multiple declarations found");
-          if (listSelectionDialog.open() == Window.OK) {
-            Object[] locations = listSelectionDialog.getResult();
-            if (locations != null) {
-              try {
-                for (int i = 0; i < locations.length; i++) {
-                  PHPIdentifierLocation location = (PHPIdentifierLocation) locations[i];
-                  String filename = workspaceLocation + location.getFilename();
-                  //                                   System.out.println(filename);
-                  if (location.getOffset() >= 0) {
-                    PHPeclipsePlugin.getDefault().openFileAndGotoOffset(filename, location.getOffset(), identiifer.length());
-                  } else {
-                    PHPeclipsePlugin.getDefault().openFileAndFindString(filename, identiifer);
-                  }
-                }
-              } catch (CoreException e) {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-              }
-            }
-          }
-        } else {
-          try {
-            PHPIdentifierLocation location = (PHPIdentifierLocation) locationsList.get(0);
-            String filename = workspaceLocation + location.getFilename();
-            //                                 System.out.println(filename);
-            if (location.getOffset() >= 0) {
-              PHPeclipsePlugin.getDefault().openFileAndGotoOffset(filename, location.getOffset(), identiifer.length());
-            } else {
-              PHPeclipsePlugin.getDefault().openFileAndFindString(filename, identiifer);
-            }
-          } catch (CoreException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-          }
-        }
-      }
+      OpenDeclarationEditorAction openAction = new OpenDeclarationEditorAction(fEditor);
+      openAction.openSelectedElement(selection);
     }
   }
 
@@ -231,103 +64,4 @@ public class PHPOpenDeclarationEditorAction extends ActionDelegate implements IE
     }
   }
 
-  private String getIdentifierOrInclude(IDocument doc, int pos) {
-    //    private String getPHPIncludeText(IDocument doc, int pos) {
-    Point word = null;
-    int start = -1;
-    int end = -1;
-    isIncludeString = false;
-    try {
-      //    try to find an include string
-      int position = pos;
-      char character = ' ';
-
-      while (position >= 0) {
-        character = doc.getChar(position);
-        if ((character == '\"') || (character == '\'') || (character == '\r') || (character == '\n'))
-          break;
-        --position;
-      }
-      if ((character == '\"') || (character == '\'')) {
-        start = position;
-
-        position = pos;
-        int length = doc.getLength();
-        character = ' ';
-        while (position < length) {
-          character = doc.getChar(position);
-          if ((character == '\"') || (character == '\'') || (character == '\r') || (character == '\n'))
-            break;
-          ++position;
-        }
-        if ((character == '\"') || (character == '\'')) {
-          start++;
-          end = position;
-
-          if (end > start) {
-            word = new Point(start, end - start); // include name found
-            isIncludeString = true;
-          }
-        }
-      }
-
-      // try to find an identifier
-      if (word == null) {
-        word = PHPWordExtractor.findWord(doc, pos); // identifier found
-        isIncludeString = false;
-      }
-    } catch (BadLocationException x) {
-    }
-
-    if (word != null) {
-      try {
-        return doc.get(word.x, word.y);
-      } catch (BadLocationException e) {
-      }
-    }
-    return "";
-  }
-
-  //    
-  //    
-  //    Point word = PHPWordExtractor.findWord(doc, pos);
-  //    if (word != null) {
-  //      try {
-  //        return doc.get(word.x, word.y);
-  //      } catch (BadLocationException e) {
-  //      }
-  //    }
-  //    return "";
-  //  }
-  private IContainer getWorkingLocation(IFileEditorInput editorInput) {
-    if (editorInput == null || editorInput.getFile() == null) {
-      return null;
-    }
-    return editorInput.getFile().getParent();
-  }
-
-  private IFile getIncludeFile(IProject project, IFileEditorInput editorInput, String relativeFilename) {
-    IContainer container = getWorkingLocation(editorInput);
-    String fullPath = project.getLocation().toString();
-    IFile file = null;
-    if (relativeFilename.startsWith("../")) {
-      Path path = new Path(relativeFilename);
-      file = container.getFile(path);
-      return file;
-    }
-    int index = relativeFilename.lastIndexOf('/');
-
-    if (index >= 0) {
-      Path path = new Path(relativeFilename);
-      file = project.getFile(path);
-      if (file.exists()) {
-        return file;
-      }
-    }
-
-    Path path = new Path(relativeFilename);
-    file = container.getFile(path);
-
-    return file;
-  }
 }
\ No newline at end of file