/******************************************************************************* * Copyright (c) 2000, 2002 IBM Corp. and others. All rights reserved. This * program and the accompanying materials are made available under the terms of * the Common Public License v1.0 which accompanies this distribution, and is * available at http://www.eclipse.org/legal/cpl-v10.html * * Contributors: www.phpeclipse.de ******************************************************************************/ package net.sourceforge.phpeclipse.actions; import java.io.File; import java.util.List; import net.sourceforge.phpdt.internal.ui.viewsupport.ListContentProvider; import net.sourceforge.phpeclipse.PHPeclipsePlugin; import net.sourceforge.phpeclipse.phpeditor.PHPEditor; 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.ui.IEditorActionDelegate; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.actions.ActionDelegate; import org.eclipse.ui.dialogs.ListSelectionDialog; public class PHPOpenAllIncludesEditorAction extends ActionDelegate implements IEditorActionDelegate { private IWorkbenchWindow fWindow; private PHPEditor fEditor; private IProject fProject; private IncludesScanner fIncludesScanner; public void dispose() { } public void init(IWorkbenchWindow window) { this.fWindow = window; } public void selectionChanged(IAction action, ISelection selection) { if (!selection.isEmpty()) { if (selection instanceof TextSelection) { action.setEnabled(true); } else if (fWindow.getActivePage() != null && fWindow.getActivePage().getActivePart() != null) { // } } } private IWorkbenchPage getActivePage() { IWorkbenchWindow workbenchWindow = fEditor.getEditorSite() .getWorkbenchWindow(); IWorkbenchPage page = workbenchWindow.getActivePage(); return page; } public 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; } public void run(IAction action) { if (fEditor == null) { IEditorPart targetEditor = fWindow.getActivePage() .getActiveEditor(); if (targetEditor != null && (targetEditor instanceof PHPEditor)) { fEditor = (PHPEditor) targetEditor; } } 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()); fIncludesScanner = new IncludesScanner(fProject, (IFileEditorInput) fEditor.getEditorInput()); int pos = selection.getOffset(); // System.out.println(selection.getText()); String filename = getPHPIncludeText(doc, pos); if (filename != null && !filename.equals("")) { try { IFile file = fIncludesScanner.getIncludeFile(filename); fIncludesScanner.addFile(file); } catch (Exception e) { // ignore } try { List list = fIncludesScanner.getList(); 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) { } } } } public void setActiveEditor(IAction action, IEditorPart targetEditor) { if (targetEditor != null && (targetEditor instanceof PHPEditor)) { fEditor = (PHPEditor) targetEditor; } } private String getPHPIncludeText(IDocument doc, int pos) { Point word = null; int start = -1; int end = -1; try { int position = pos; char character; while (position >= 0) { character = doc.getChar(position); if ((character == '\"') || (character == '\'') || (character == '\r') || (character == '\n')) break; --position; } start = position; position = pos; int length = doc.getLength(); while (position < length) { character = doc.getChar(position); if ((character == '\"') || (character == '\'') || (character == '\r') || (character == '\n')) break; ++position; } start++; end = position; if (end > start) word = new Point(start, end - start); } catch (BadLocationException x) { } if (word != null) { try { return doc.get(word.x, word.y); } catch (BadLocationException e) { } } return ""; } }