[Pydev-cvs] org.python.pydev/src/org/python/pydev/editorinput PySourceLocatorPrefs.java, NONE, 1.1
Brought to you by:
fabioz
From: Fabio Z. <fa...@us...> - 2008-09-28 12:48:29
|
Update of /cvsroot/pydev/org.python.pydev/src/org/python/pydev/editorinput In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4313/src/org/python/pydev/editorinput Modified Files: PySourceLocatorBase.java PyOpenEditor.java Added Files: PySourceLocatorPrefs.java Log Message: Synching to latest changes: Pydev <ul> <li><strong>Editor</strong>: Cursor settings no longer overridden</li> <li><strong>Code-completion</strong>: If __all__ is defined with runtime elements (and not only in a single assign statement), it's ignored for code-completion purposes</li> <li><strong>Debugger</strong>: Pythonpath the same in debug and regular modes (sys.path[0] is the same directory as the file run)</li> <li><strong>Debugger</strong>: Persist choices done in the debugger when files from the debugger are not found</li> <li><strong>Interpreter config</strong>: "email" automatically added to the "forced builtins"</li> <li><strong>Parser</strong>: Correctly recognizing absolute import with 3 or more levels</li> <li><strong>Syntax check</strong>: Option to do only on active editor</li> </ul> Also: tabs changed for spaces --- NEW FILE: PySourceLocatorPrefs.java --- package org.python.pydev.editorinput; import java.io.File; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IPath; import org.eclipse.jface.preference.IPreferenceStore; import org.python.pydev.core.docutils.StringUtils; import org.python.pydev.plugin.PydevPlugin; import org.python.pydev.plugin.PydevPrefs; /** * Class used to deal with the source locator prefs (even though they're edited in the SourceLocatorPrefsPage that's in * org.python.pydev.debug * * @author Fabio */ public class PySourceLocatorPrefs { /** * Constant used to define that a path should not be asked for (so, the translation will return nothing and * the user won't be bothered by that) */ public static final String DONTASK = "DONTASK"; /** * Checks if a translation path passed is valid. * * @param translation the translation path entered by the user * @return null if it's valid or the error message to be shown to the user */ public static String isValid(String[] translation) { if(translation.length != 2){ return "Input must have 2 elements."; } if(translation[1].equals(DONTASK)){ return null; } if(!new File(translation[1]).exists()){ return StringUtils.format("The file: %s does not exist and doesn't match 'DONTASK'.", translation[1]); } return null; } /** * @see #addPathTranslation(String) -- with toOSString for each path and a comma separator */ public static void addPathTranslation(IPath path, IPath location) { addPathTranslation(new String[]{path.toOSString(), location.toOSString()}); } /** * Any request to the passed path translation will be ignored. * @param path the path that should have the translation ignored (silently) */ public static void setIgnorePathTranslation(IPath path) { addPathTranslation(new String[]{path.toOSString(), DONTASK}); } /** * Adds a path to the translation table. * * @param translation the translation path to be added. * E.g.: * path asked, new path -- means that a request for the "path asked" should return the "new path" * path asked, DONTASK -- means that if some request for that file was asked it should silently ignore it * * E.g.: * c:\foo\c.py,c:\temp\c.py * c:\foo\c.py,DONTASK */ private static void addPathTranslation(String[] translation){ String valid = isValid(translation); if(valid != null){ throw new RuntimeException(valid); } IPreferenceStore store = PydevPlugin.getDefault().getPreferenceStore(); String available = store.getString(PydevPrefs.SOURCE_LOCATION_PATHS); if(available == null || available.trim().length() == 0){ available = StringUtils.join(",", translation); }else{ String pathAsked = translation[0].trim(); String existent = getPathTranslation(pathAsked); if(existent != null){ String[] splitted = StringUtils.split(available, '\n'); for(int i=0;i<splitted.length;i++){ String s = splitted[i]; String initialPart = StringUtils.split(s, ',')[0].trim(); if(initialPart.equals(pathAsked)){ splitted[i] = StringUtils.join(",", translation); break; } } available = StringUtils.join("\n", splitted); }else{ available += "\n"; available += StringUtils.join(",", translation); } } store.putValue(PydevPrefs.SOURCE_LOCATION_PATHS, available); } /** * @see #getPathTranslation(String) -- with toOSString from path. */ public static String getPathTranslation(IPath pathToTranslate){ return getPathTranslation(pathToTranslate.toOSString()); } /** * Translates a path given the current translation settings * * @param pathToTranslate the path to be translated * @return the translated path or DONTASK or null if no translation path was found for it */ public static String getPathTranslation(String pathToTranslate){ pathToTranslate = pathToTranslate.trim(); IPreferenceStore store = PydevPlugin.getDefault().getPreferenceStore(); String available = store.getString(PydevPrefs.SOURCE_LOCATION_PATHS); if(available == null || available.trim().length() == 0){ return null; //nothing available }else{ String[] splitted = StringUtils.split(available, '\n'); for (String string : splitted) { String[] translation = StringUtils.split(string, ','); if(translation.length == 2){ if(translation[0].trim().equals(pathToTranslate)){ return translation[1].trim(); } } } } return null; } /** * @param words words to be gotten as string * @return a string with all the passed words separated by '\n' */ public static String wordsAsString(List<String[]> words){ StringBuffer buf = new StringBuffer(); for (String[] string : words) { buf.append(string[0].trim()); buf.append(','); buf.append(string[1].trim()); buf.append('\n'); } return buf.toString(); } /** * @param string the string that has to be returned as a list of strings * @return an array of strings from the passed string (reverse logic from wordsAsString) */ public static List<String[]> stringAsWords(String string){ ArrayList<String[]> strs = new ArrayList<String[]>(); for(String str: StringUtils.split(string, '\n')){ strs.add(StringUtils.split(str, ',')); } return strs; } } Index: PyOpenEditor.java =================================================================== RCS file: /cvsroot/pydev/org.python.pydev/src/org/python/pydev/editorinput/PyOpenEditor.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** PyOpenEditor.java 6 Aug 2008 16:23:18 -0000 1.1 --- PyOpenEditor.java 28 Sep 2008 12:45:45 -0000 1.2 *************** *** 24,114 **** public class PyOpenEditor { ! /** ! * Opens some editor from an editor input (See PySourceLocatorBase for obtaining it) ! * ! * @param file the editor input ! * @return the part correspondent to the editor ! * @throws PartInitException ! */ ! public static IEditorPart openEditorInput(IEditorInput file) throws PartInitException { ! final IWorkbench workbench = PydevPlugin.getDefault().getWorkbench(); ! if(workbench == null){ ! throw new RuntimeException("workbench cannot be null"); ! } ! ! IWorkbenchWindow activeWorkbenchWindow = workbench.getActiveWorkbenchWindow(); ! if(activeWorkbenchWindow == null){ ! throw new RuntimeException("activeWorkbenchWindow cannot be null (we have to be in a ui thread for this to work)"); ! } ! ! IWorkbenchPage wp = activeWorkbenchWindow.getActivePage(); ! ! // File is inside the workspace ! return IDE.openEditor(wp, file, PyEdit.EDITOR_ID); ! } ! /** ! * Opens some editor from an IFile ! * ! * @see #openEditorInput(IEditorInput) ! */ ! public static IEditorPart doOpenEditor(IFile f) { ! if (f == null) ! return null; ! ! try { ! FileEditorInput file = new FileEditorInput(f); ! return openEditorInput(file); ! ! } catch (Exception e) { ! PydevPlugin.log(IStatus.ERROR, "Unexpected error opening path " + f.toString(), e); ! return null; ! } ! } ! ! ! /** ! * Utility function that opens an editor on a given path. ! * ! * @return part that is the editor ! * @see #openEditorInput(IEditorInput) ! */ ! public static IEditorPart doOpenEditor(IPath path) { ! if (path == null){ ! return null; ! } ! ! try { ! IEditorInput file = PySourceLocatorBase.createEditorInput(path); ! return openEditorInput(file); ! ! } catch (Exception e) { ! PydevPlugin.log(IStatus.ERROR, "Unexpected error opening path " + path.toString(), e); ! return null; ! } ! } ! /** ! * Utility function that opens an editor on a given path within a zip file. ! * ! * @return part that is the editor ! * @see #openEditorInput(IEditorInput) ! */ ! public static IEditorPart doOpenEditor(File zipFile, String zipFilePath) { ! if (zipFile == null || zipFilePath == null){ ! return null; ! } ! ! try { ! IEditorInput file = new PydevZipFileEditorInput(new PydevZipFileStorage(zipFile, zipFilePath)); ! return openEditorInput(file); ! ! } catch (Exception e) { ! PydevPlugin.log(IStatus.ERROR, "Unexpected error opening zip file " + zipFile.getAbsolutePath()+ " - "+zipFilePath, e); ! return null; ! } ! } } --- 24,114 ---- public class PyOpenEditor { ! /** ! * Opens some editor from an editor input (See PySourceLocatorBase for obtaining it) ! * ! * @param file the editor input ! * @return the part correspondent to the editor ! * @throws PartInitException ! */ ! public static IEditorPart openEditorInput(IEditorInput file) throws PartInitException { ! final IWorkbench workbench = PydevPlugin.getDefault().getWorkbench(); ! if(workbench == null){ ! throw new RuntimeException("workbench cannot be null"); ! } ! ! IWorkbenchWindow activeWorkbenchWindow = workbench.getActiveWorkbenchWindow(); ! if(activeWorkbenchWindow == null){ ! throw new RuntimeException("activeWorkbenchWindow cannot be null (we have to be in a ui thread for this to work)"); ! } ! ! IWorkbenchPage wp = activeWorkbenchWindow.getActivePage(); ! ! // File is inside the workspace ! return IDE.openEditor(wp, file, PyEdit.EDITOR_ID); ! } ! /** ! * Opens some editor from an IFile ! * ! * @see #openEditorInput(IEditorInput) ! */ ! public static IEditorPart doOpenEditor(IFile f) { ! if (f == null) ! return null; ! ! try { ! FileEditorInput file = new FileEditorInput(f); ! return openEditorInput(file); ! ! } catch (Exception e) { ! PydevPlugin.log(IStatus.ERROR, "Unexpected error opening path " + f.toString(), e); ! return null; ! } ! } ! ! ! /** ! * Utility function that opens an editor on a given path. ! * ! * @return part that is the editor ! * @see #openEditorInput(IEditorInput) ! */ ! public static IEditorPart doOpenEditor(IPath path) { ! if (path == null){ ! return null; ! } ! ! try { ! IEditorInput file = new PySourceLocatorBase().createEditorInput(path); ! return openEditorInput(file); ! ! } catch (Exception e) { ! PydevPlugin.log(IStatus.ERROR, "Unexpected error opening path " + path.toString(), e); ! return null; ! } ! } ! /** ! * Utility function that opens an editor on a given path within a zip file. ! * ! * @return part that is the editor ! * @see #openEditorInput(IEditorInput) ! */ ! public static IEditorPart doOpenEditor(File zipFile, String zipFilePath) { ! if (zipFile == null || zipFilePath == null){ ! return null; ! } ! ! try { ! IEditorInput file = new PydevZipFileEditorInput(new PydevZipFileStorage(zipFile, zipFilePath)); ! return openEditorInput(file); ! ! } catch (Exception e) { ! PydevPlugin.log(IStatus.ERROR, "Unexpected error opening zip file " + zipFile.getAbsolutePath()+ " - "+zipFilePath, e); ! return null; ! } ! } } Index: PySourceLocatorBase.java =================================================================== RCS file: /cvsroot/pydev/org.python.pydev/src/org/python/pydev/editorinput/PySourceLocatorBase.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** PySourceLocatorBase.java 6 Aug 2008 16:23:18 -0000 1.1 --- PySourceLocatorBase.java 28 Sep 2008 12:45:45 -0000 1.2 *************** *** 41,58 **** */ public class PySourceLocatorBase { ! ! /** ! * This method will try to find the most likely file that matches the given path, ! * considering: ! * - The workspace files ! * - The open editors ! * ! * and if all fails, it'll still ask the user which path should be used. ! * ! * ! * @param path ! * @return ! */ ! public static IEditorInput createEditorInput(IPath path) { return createEditorInput(path, true); } --- 41,58 ---- */ public class PySourceLocatorBase { ! ! /** ! * This method will try to find the most likely file that matches the given path, ! * considering: ! * - The workspace files ! * - The open editors ! * ! * and if all fails, it'll still ask the user which path should be used. ! * ! * ! * @param path ! * @return ! */ ! public IEditorInput createEditorInput(IPath path) { return createEditorInput(path, true); } *************** *** 63,67 **** * @return a workspace file that matches the given file. */ ! public static IFile getWorkspaceFile(File file) { IFile[] files = getWorkspaceFiles(file); return selectWorkspaceFile(files); --- 63,67 ---- * @return a workspace file that matches the given file. */ ! public IFile getWorkspaceFile(File file) { IFile[] files = getWorkspaceFiles(file); return selectWorkspaceFile(files); *************** *** 73,77 **** * @return a workspace file that matches the given file. */ ! public static IFile[] getWorkspaceFiles(File file) { IWorkspace workspace= ResourcesPlugin.getWorkspace(); IPath location= Path.fromOSString(file.getAbsolutePath()); --- 73,77 ---- * @return a workspace file that matches the given file. */ ! public IFile[] getWorkspaceFiles(File file) { IWorkspace workspace= ResourcesPlugin.getWorkspace(); IPath location= Path.fromOSString(file.getAbsolutePath()); *************** *** 98,112 **** * @return the editor input found or none if None was available for the given path */ ! private static IEditorInput createEditorInput(IPath path, boolean askIfDoesNotExist) { IEditorInput edInput = null; IWorkspace w = ResourcesPlugin.getWorkspace(); - - //let's start with the 'easy' way - IFile fileForLocation = w.getRoot().getFileForLocation(path); - if(fileForLocation != null && fileForLocation.exists()){ - return new FileEditorInput(fileForLocation); - } - IFile files[] = w.getRoot().findFilesForLocation(path); --- 98,121 ---- * @return the editor input found or none if None was available for the given path */ ! private IEditorInput createEditorInput(IPath path, boolean askIfDoesNotExist) { ! String pathTranslation = PySourceLocatorPrefs.getPathTranslation(path); ! if(pathTranslation != null){ ! if(!pathTranslation.equals(PySourceLocatorPrefs.DONTASK)){ ! //change it for the registered translation ! path = Path.fromOSString(pathTranslation); ! }else{ ! //DONTASK!! ! askIfDoesNotExist = false; ! } ! } ! IEditorInput edInput = null; IWorkspace w = ResourcesPlugin.getWorkspace(); + //let's start with the 'easy' way + IFile fileForLocation = w.getRoot().getFileForLocation(path); + if(fileForLocation != null && fileForLocation.exists()){ + return new FileEditorInput(fileForLocation); + } IFile files[] = w.getRoot().findFilesForLocation(path); *************** *** 118,129 **** }else if(askIfDoesNotExist){ ! //here we can do one more thing: if the file matches some opened editor, let's use it... ! //(this is done because when debugging, we don't want to be asked over and over ! //for the same file) ! IEditorInput input = getEditorInputFromExistingEditors(systemFile.getName()); ! if(input != null){ return input; } ! //this is the last resort... First we'll try to check for a 'good' match, //and if there's more than one we'll ask it to the user --- 127,138 ---- }else if(askIfDoesNotExist){ ! //here we can do one more thing: if the file matches some opened editor, let's use it... ! //(this is done because when debugging, we don't want to be asked over and over ! //for the same file) ! IEditorInput input = getEditorInputFromExistingEditors(systemFile.getName()); ! if(input != null){ return input; } ! //this is the last resort... First we'll try to check for a 'good' match, //and if there's more than one we'll ask it to the user *************** *** 131,147 **** IFile iFile = selectWorkspaceFile(likelyFiles.toArray(new IFile[0])); if(iFile != null){ return new FileEditorInput(iFile); } //ok, ask the user for any file in the computer ! input = selectFilesystemFileForPath(path); if(input != null){ return input; } } }else{ //file exists IFile workspaceFile = selectWorkspaceFile(files); if(workspaceFile != null){ ! edInput = new FileEditorInput(workspaceFile); } } --- 140,161 ---- IFile iFile = selectWorkspaceFile(likelyFiles.toArray(new IFile[0])); if(iFile != null){ + PySourceLocatorPrefs.addPathTranslation(path, iFile.getLocation()); return new FileEditorInput(iFile); } //ok, ask the user for any file in the computer ! PydevFileEditorInput pydevFileEditorInput = selectFilesystemFileForPath(path); ! input = pydevFileEditorInput; if(input != null){ + PySourceLocatorPrefs.addPathTranslation(path, pydevFileEditorInput.getPath()); return input; } + + PySourceLocatorPrefs.setIgnorePathTranslation(path); } }else{ //file exists IFile workspaceFile = selectWorkspaceFile(files); if(workspaceFile != null){ ! edInput = new FileEditorInput(workspaceFile); } } *************** *** 154,212 **** * @return an editor input from an existing editor available */ ! private static IEditorInput getEditorInputFromExistingEditors(final String matchName) { ! final Tuple<IWorkbenchWindow, IEditorInput> workbenchAndReturn = new Tuple<IWorkbenchWindow, IEditorInput>(PlatformUI.getWorkbench().getActiveWorkbenchWindow(), null); ! Runnable r = new Runnable(){ ! public void run() { ! IWorkbenchWindow workbenchWindow = workbenchAndReturn.o1; ! if(workbenchWindow == null){ ! workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); ! } ! if(workbenchWindow == null){ ! return; ! } ! ! IWorkbenchPage activePage = workbenchWindow.getActivePage(); ! if(activePage == null){ ! return; ! } ! ! IEditorReference[] editorReferences = activePage.getEditorReferences(); ! for (IEditorReference editorReference : editorReferences) { ! IEditorPart editor = editorReference.getEditor(false); ! if(editor != null){ ! if(editor instanceof PyEdit){ ! PyEdit pyEdit = (PyEdit) editor; ! IEditorInput editorInput = pyEdit.getEditorInput(); ! if(editorInput instanceof IPathEditorInput){ ! IPathEditorInput pathEditorInput = (IPathEditorInput) editorInput; ! IPath localPath = pathEditorInput.getPath(); ! if(localPath != null){ ! String considerName = localPath.segment(localPath.segmentCount()-1); ! if(matchName.equals(considerName)){ ! workbenchAndReturn.o2 = editorInput; ! return; ! } ! } ! }else{ ! File editorFile = pyEdit.getEditorFile(); ! if(editorFile != null){ ! if(editorFile.getName().equals(matchName)){ ! workbenchAndReturn.o2 = editorInput; ! return; ! } ! } ! } ! } ! } ! } ! } ! }; ! ! ! if(workbenchAndReturn.o1 == null){ //not ui-thread Display.getDefault().syncExec(r); }else{ --- 168,226 ---- * @return an editor input from an existing editor available */ ! private IEditorInput getEditorInputFromExistingEditors(final String matchName) { ! final Tuple<IWorkbenchWindow, IEditorInput> workbenchAndReturn = new Tuple<IWorkbenchWindow, IEditorInput>(PlatformUI.getWorkbench().getActiveWorkbenchWindow(), null); ! Runnable r = new Runnable(){ ! public void run() { ! IWorkbenchWindow workbenchWindow = workbenchAndReturn.o1; ! if(workbenchWindow == null){ ! workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); ! } ! if(workbenchWindow == null){ ! return; ! } ! ! IWorkbenchPage activePage = workbenchWindow.getActivePage(); ! if(activePage == null){ ! return; ! } ! ! IEditorReference[] editorReferences = activePage.getEditorReferences(); ! for (IEditorReference editorReference : editorReferences) { ! IEditorPart editor = editorReference.getEditor(false); ! if(editor != null){ ! if(editor instanceof PyEdit){ ! PyEdit pyEdit = (PyEdit) editor; ! IEditorInput editorInput = pyEdit.getEditorInput(); ! if(editorInput instanceof IPathEditorInput){ ! IPathEditorInput pathEditorInput = (IPathEditorInput) editorInput; ! IPath localPath = pathEditorInput.getPath(); ! if(localPath != null){ ! String considerName = localPath.segment(localPath.segmentCount()-1); ! if(matchName.equals(considerName)){ ! workbenchAndReturn.o2 = editorInput; ! return; ! } ! } ! }else{ ! File editorFile = pyEdit.getEditorFile(); ! if(editorFile != null){ ! if(editorFile.getName().equals(matchName)){ ! workbenchAndReturn.o2 = editorInput; ! return; ! } ! } ! } ! } ! } ! } ! } ! }; ! ! ! if(workbenchAndReturn.o1 == null){ //not ui-thread Display.getDefault().syncExec(r); }else{ *************** *** 214,221 **** } ! return workbenchAndReturn.o2; ! } --- 228,235 ---- } ! return workbenchAndReturn.o2; ! } *************** *** 223,227 **** * This is the last resort... pointing to some filesystem file to get the editor for some path. */ ! private static IEditorInput selectFilesystemFileForPath(final IPath path) { final List<String> l = new ArrayList<String>(); Runnable r = new Runnable(){ --- 237,241 ---- * This is the last resort... pointing to some filesystem file to get the editor for some path. */ ! protected PydevFileEditorInput selectFilesystemFileForPath(final IPath path) { final List<String> l = new ArrayList<String>(); Runnable r = new Runnable(){ *************** *** 254,258 **** * be a match to some path (use only as an almost 'last-resort'). */ ! private static List<IFile> getLikelyFiles(IPath path, IWorkspace w) { List<IFile> ret = new ArrayList<IFile>(); try { --- 268,272 ---- * be a match to some path (use only as an almost 'last-resort'). */ ! private List<IFile> getLikelyFiles(IPath path, IWorkspace w) { List<IFile> ret = new ArrayList<IFile>(); try { *************** *** 268,272 **** * Used to recursively get the likely files given the first set of containers */ ! private static void getLikelyFiles(IPath path, List<IFile> ret, IResource[] resources) throws CoreException { String strPath = path.removeFileExtension().lastSegment().toLowerCase(); //this will return something as 'foo' --- 282,286 ---- * Used to recursively get the likely files given the first set of containers */ ! private void getLikelyFiles(IPath path, List<IFile> ret, IResource[] resources) throws CoreException { String strPath = path.removeFileExtension().lastSegment().toLowerCase(); //this will return something as 'foo' *************** *** 291,295 **** * @return the editor input that'll open the passed file. */ ! private static IEditorInput createEditorInput(File file) { IFile[] workspaceFile= getWorkspaceFiles(file); if (workspaceFile != null && workspaceFile.length > 0){ --- 305,309 ---- * @return the editor input that'll open the passed file. */ ! private IEditorInput createEditorInput(File file) { IFile[] workspaceFile= getWorkspaceFiles(file); if (workspaceFile != null && workspaceFile.length > 0){ *************** *** 309,313 **** * @return a new array of IFile with only the files that actually exist. */ ! private static IFile[] filterNonExistentFiles(IFile[] files){ if (files == null) return null; --- 323,327 ---- * @return a new array of IFile with only the files that actually exist. */ ! private IFile[] filterNonExistentFiles(IFile[] files){ if (files == null) return null; *************** *** 330,334 **** * selection or if the user cancelled it. */ ! private static IFile selectWorkspaceFile(final IFile[] files) { if(files == null || files.length == 0){ return null; --- 344,348 ---- * selection or if the user cancelled it. */ ! private IFile selectWorkspaceFile(final IFile[] files) { if(files == null || files.length == 0){ return null; |