📄 pydevplugin.java
字号:
package org.python.pydev.plugin;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectNature;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.templates.ContextTypeRegistry;
import org.eclipse.jface.text.templates.persistence.TemplateStore;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
import org.eclipse.ui.editors.text.EditorsUI;
import org.eclipse.ui.editors.text.templates.ContributionContextTypeRegistry;
import org.eclipse.ui.editors.text.templates.ContributionTemplateStore;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.ui.texteditor.ChainedPreferenceStore;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.python.copiedfromeclipsesrc.PydevFileEditorInput;
import org.python.pydev.core.ICallback;
import org.python.pydev.core.IInterpreterManager;
import org.python.pydev.core.IPythonNature;
import org.python.pydev.core.REF;
import org.python.pydev.core.Tuple;
import org.python.pydev.core.bundle.BundleInfo;
import org.python.pydev.core.bundle.IBundleInfo;
import org.python.pydev.core.bundle.ImageCache;
import org.python.pydev.core.log.Log;
import org.python.pydev.editor.PyEdit;
import org.python.pydev.editor.codecompletion.revisited.PythonPathHelper;
import org.python.pydev.editor.codecompletion.shell.AbstractShell;
import org.python.pydev.editor.templates.PyContextType;
import org.python.pydev.plugin.nature.PythonNature;
import org.python.pydev.plugin.nature.SystemPythonNature;
import org.python.pydev.pyunit.ITestRunListener;
import org.python.pydev.pyunit.PyUnitTestRunner;
import org.python.pydev.ui.interpreters.JythonInterpreterManager;
import org.python.pydev.ui.interpreters.PythonInterpreterManager;
/**
* The main plugin class - initialized on startup - has resource bundle for internationalization - has preferences
*/
public class PydevPlugin extends AbstractUIPlugin implements Preferences.IPropertyChangeListener {
public static final String version ="1.3.9";
// ----------------- SINGLETON THINGS -----------------------------
public static IBundleInfo info;
public static IBundleInfo getBundleInfo(){
if(PydevPlugin.info == null){
PydevPlugin.info = new BundleInfo(PydevPlugin.getDefault().getBundle());
}
return PydevPlugin.info;
}
public static void setBundleInfo(IBundleInfo b){
PydevPlugin.info = b;
}
// ----------------- END BUNDLE INFO THINGS --------------------------
private static IInterpreterManager pythonInterpreterManager;
public static void setPythonInterpreterManager(IInterpreterManager interpreterManager) {
PydevPlugin.pythonInterpreterManager = interpreterManager;
}
public static IInterpreterManager getPythonInterpreterManager() {
return getPythonInterpreterManager(false);
}
public static IInterpreterManager getPythonInterpreterManager(boolean haltOnStub) {
return pythonInterpreterManager;
}
private static IInterpreterManager jythonInterpreterManager;
public static void setJythonInterpreterManager(IInterpreterManager interpreterManager) {
PydevPlugin.jythonInterpreterManager = interpreterManager;
}
public static IInterpreterManager getJythonInterpreterManager() {
return getJythonInterpreterManager(false);
}
public static IInterpreterManager getJythonInterpreterManager(boolean haltOnStub) {
return jythonInterpreterManager;
}
// ----------------- END SINGLETON THINGS --------------------------
/**
* returns the interpreter manager for a given nature
* @param nature the nature from where we want to get the associated interpreter manager
*
* @return the interpreter manager
*/
public static IInterpreterManager getInterpreterManager(IPythonNature nature) {
try {
if (nature.isJython()) {
return jythonInterpreterManager;
} else if (nature.isPython()) {
return pythonInterpreterManager;
}
} catch (Exception e) {
throw new RuntimeException(e);
}
throw new RuntimeException("Unable to get the interpreter manager for the nature passed.");
}
private static PydevPlugin plugin; //The shared instance.
private ResourceBundle resourceBundle; //Resource bundle.
/** The template store. */
private TemplateStore fStore;
/** The context type registry. */
private ContributionContextTypeRegistry fRegistry = null;
/** Key to store custom templates. */
private static final String CUSTOM_TEMPLATES_PY_KEY = "org.python.pydev.editor.templates.PyTemplatePreferencesPage";
public static final String DEFAULT_PYDEV_SCOPE = "org.python.pydev";
/**
* The constructor.
*/
public PydevPlugin() {
super();
plugin = this;
}
public void start(BundleContext context) throws Exception {
super.start(context);
try {
resourceBundle = ResourceBundle.getBundle("org.python.pydev.PyDevPluginResources");
} catch (MissingResourceException x) {
resourceBundle = null;
}
final Preferences preferences = plugin.getPluginPreferences();
preferences.addPropertyChangeListener(this);
//set them temporarily
//setPythonInterpreterManager(new StubInterpreterManager(true));
//setJythonInterpreterManager(new StubInterpreterManager(false));
//changed: the interpreter manager is always set in the initialization (initialization
//has some problems if that's not done).
setPythonInterpreterManager(new PythonInterpreterManager(preferences));
setJythonInterpreterManager(new JythonInterpreterManager(preferences));
//restore the nature for all python projects
new Job("PyDev: Restoring projects python nature"){
protected IStatus run(IProgressMonitor monitor) {
try{
IProject[] projects = getWorkspace().getRoot().getProjects();
for (int i = 0; i < projects.length; i++) {
IProject project = projects[i];
try {
if (project.isOpen() && project.hasNature(PythonNature.PYTHON_NATURE_ID)) {
PythonNature.addNature(project, monitor, null, null);
}
} catch (Exception e) {
PydevPlugin.log(e);
}
}
}catch(Throwable t){
t.printStackTrace();
}
return Status.OK_STATUS;
}
}.schedule();
}
public static boolean isPythonInterpreterInitialized() {
return true;
}
public static boolean isJythonInterpreterInitialized() {
return true;
}
/**
* This is called when the plugin is being stopped.
*
* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
*/
public void stop(BundleContext context) throws Exception {
try {
//stop the running shells
AbstractShell.shutdownAllShells();
Preferences preferences = plugin.getPluginPreferences();
preferences.removePropertyChangeListener(this);
//save the natures (code completion stuff).
IProject[] projects = getWorkspace().getRoot().getProjects();
for (int i = 0; i < projects.length; i++) {
try {
IProject project = projects[i];
if (project.isOpen()){
IProjectNature n = project.getNature(PythonNature.PYTHON_NATURE_ID);
if(n instanceof PythonNature){
PythonNature nature = (PythonNature) n;
nature.saveAstManager();
}
}
} catch (CoreException e) {
PydevPlugin.log(e);
}
}
} finally{
super.stop(context);
}
}
public static PydevPlugin getDefault() {
return plugin;
}
public static String getPluginID() {
return PydevPlugin.getBundleInfo().getPluginID();
}
/**
* Returns the workspace instance.
*/
public static IWorkspace getWorkspace() {
return ResourcesPlugin.getWorkspace();
}
public static Status makeStatus(int errorLevel, String message, Throwable e) {
return new Status(errorLevel, getPluginID(), errorLevel, message, e);
}
/**
* Returns the string from the plugin's resource bundle, or 'key' if not found.
*/
public static String getResourceString(String key) {
ResourceBundle bundle = plugin.getResourceBundle();
try {
return bundle.getString(key);
} catch (MissingResourceException e) {
return key;
}
}
public ResourceBundle getResourceBundle() {
return resourceBundle;
}
public void propertyChange(Preferences.PropertyChangeEvent event) {
// System.out.println( event.getProperty()
// + "\n\told setting: "
// + event.getOldValue()
// + "\n\tnew setting: "
// + event.getNewValue());
}
public static void log(String message, Throwable e) {
log(IStatus.ERROR, message, e);
}
public static void log(int errorLevel, String message, Throwable e) {
log(errorLevel, message, e, true);
}
public static void log(String message, Throwable e, boolean printToConsole) {
log(IStatus.ERROR, message, e, printToConsole);
}
public static void logInfo(Exception e) {
log(IStatus.INFO, e.getMessage(), e, true);
}
/**
* @param errorLevel IStatus.[OK|INFO|WARNING|ERROR]
*/
public static void log(int errorLevel, String message, Throwable e, boolean printToConsole) {
if(printToConsole){
if(errorLevel == IStatus.ERROR){
System.out.println("Error received...");
}else{
System.out.println("Log received...");
}
System.out.println(message);
System.err.println(message);
if(e != null){
e.printStackTrace();
}
}
try {
Status s = new Status(errorLevel, getPluginID(), errorLevel, message, e);
getDefault().getLog().log(s);
} catch (Exception e1) {
//logging should not fail!
}
}
public static void log(IStatus status) {
getDefault().getLog().log(status);
}
public static void log(Throwable e) {
log(e, true);
}
public static void log(Throwable e, boolean printToConsole) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -