/******************************************************************************* * 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: Klaus Hartlage - www.eclipseproject.de ******************************************************************************/ package net.sourceforge.phpeclipse.actions; import net.sourceforge.phpdt.internal.compiler.parser.Scanner; 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.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.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.ide.IDE; public class PHPOpenIncludeEditorAction extends ActionDelegate implements IEditorActionDelegate { private IWorkbenchWindow fWindow; private PHPEditor fEditor; private IProject fProject; 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 getWikiFile(IProject project, IFileEditorInput editorInput, String relativeFilename) { // IContainer container = getWorkingLocation(editorInput); // String fullPath = project.getLocation().toString(); Path path = new Path(relativeFilename); IFile file = project.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()); int pos = selection.getOffset(); // System.out.println(selection.getText()); String relativeFilename = getPHPIncludeText(doc, pos); // System.out.println(word); if (relativeFilename != null && !relativeFilename.equals("")) { IFile file = getWikiFile(fProject, (IFileEditorInput) fEditor .getEditorInput(), relativeFilename); try { // createNewFileIfNeeded(file); // if // (WikiPlugin.getDefault().getPreferenceStore().getBoolean(WikiConstants.REUSE_EDITOR)) // { // saveIfNeeded(); // getActivePage().reuseEditor(reusableEditor, new // FileEditorInput(file)); // } else { IDE.openEditor(getActivePage(), file, true); // redrawText(); // } } catch (Exception e) { // WikiPlugin.getDefault().logAndReport(WikiPlugin.getResourceString(WikiConstants.RESOURCE_WIKI_ERROR_DIALOGUE_OPEN_WIKI_FILE_TITLE), // WikiPlugin.getResourceString(WikiConstants.RESOURCE_WIKI_ERROR_DIALOGUE_OPEN_WIKI_FILE_TEXT), // 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 ""; } }