/** * Copyright (c) 2005-2013 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ /* * Author: atotic * Created on Apr 12, 2004 */ package org.python.pydev.editor.actions; import java.io.File; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.ui.actions.OpenAction; import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.ui.texteditor.ITextEditor; import org.python.pydev.core.log.Log; import org.python.pydev.editor.codecompletion.revisited.PythonPathHelper; import org.python.pydev.editor.codecompletion.revisited.javaintegration.AbstractJavaClassModule; import org.python.pydev.editor.codecompletion.revisited.javaintegration.JavaDefinition; import org.python.pydev.editor.codecompletion.revisited.visitors.Definition; import org.python.pydev.editor.model.ItemPointer; import org.python.pydev.editorinput.PyOpenEditor; import org.python.pydev.shared_core.io.FileUtils; import org.python.pydev.shared_core.string.StringUtils; import org.python.pydev.shared_core.structure.Location; import org.python.pydev.shared_ui.EditorUtils; import org.python.pydev.ui.filetypes.FileTypesPreferencesPage; /** * Opens an editor and selects text in it. * * Inspired by org.eclipse.jdt.ui.actions.OpenAction, but simplifies all handling in a single class. */ public class PyOpenAction extends Action { public IEditorPart editor; public PyOpenAction() { } public static void showInEditor(ITextEditor textEdit, Location start, Location end) { EditorUtils.showInEditor(textEdit, start, end); } public void run(ItemPointer p, IProject project) { run(p, project, null); } public void run(ItemPointer p, IProject project, IWorkbenchPartSite site) { editor = null; Object file = p.file; String zipFilePath = p.zipFilePath; Definition definition = p.definition; if (file instanceof File) { File f = (File) file; String filename = f.getName(); if (PythonPathHelper.isValidSourceFile(filename) || filename.indexOf('.') == -1 || //treating files without any extension! (zipFilePath != null && PythonPathHelper.isValidSourceFile(zipFilePath))) { //Keep on going as we were going... } else if (definition instanceof JavaDefinition) { if (site == null) { site = EditorUtils.getSite(); } if (site == null) { Log.log("Unable to open JavaDefinition because we have no active site."); } //note that it will only be able to find a java definition if JDT is actually available //so, we don't have to care about JDTNotAvailableExceptions here. JavaDefinition javaDefinition = (JavaDefinition) definition; OpenAction openAction = new OpenAction(site); StructuredSelection selection = new StructuredSelection(new Object[] { javaDefinition.javaElement }); openAction.run(selection); } else { String message; boolean giveError = true; if (definition != null && definition.module instanceof AbstractJavaClassModule) { AbstractJavaClassModule module = (AbstractJavaClassModule) definition.module; message = "The definition was found at: " + f.toString() + "\n" + "as the java module: " + module.getName(); } else { if (FileTypesPreferencesPage.isValidDll(filename)) { if (f.exists()) { //It's a pyd or dll, let's check if it was a cython module to open it... File parentFile = f.getParentFile(); File newFile = new File(parentFile, StringUtils.stripExtension(f.getName()) + "." + "pyx"); if (!newFile.exists()) { newFile = new File(parentFile, StringUtils.stripExtension(f.getName()) + "." + "pxd"); } if (!newFile.exists()) { newFile = new File(parentFile, StringUtils.stripExtension(f.getName()) + "." + "pxi"); } if (newFile.exists()) { giveError = false; file = newFile; } } } message = "The definition was found at: " + f.toString() + "\n" + "(which cannot be opened because it is a compiled extension)"; } if (giveError) { MessageDialog.openInformation(EditorUtils.getShell(), "Compiled Extension file", message); return; } } } if (zipFilePath != null) { //currently, only open zip file editor = PyOpenEditor.doOpenEditor((File) file, zipFilePath); } else if (file instanceof IFile) { IFile f = (IFile) file; editor = PyOpenEditor.doOpenEditor(f); } else if (file instanceof IPath) { IPath path = (IPath) file; editor = PyOpenEditor.doOpenEditor(path, project); } else if (file instanceof File) { String absPath = FileUtils.getFileAbsolutePath((File) file); IPath path = Path.fromOSString(absPath); editor = PyOpenEditor.doOpenEditor(path, project); } if (editor instanceof ITextEditor && p.start.line >= 0) { EditorUtils.showInEditor((ITextEditor) editor, p.start, p.end); } } public void run(ItemPointer p) { run(p, null); } }