/**
* 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.
*/
package org.python.pydev.parser;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.python.pydev.core.IPyEdit;
import org.python.pydev.shared_core.editor.IBaseEditor;
import org.python.pydev.shared_core.parsing.BaseParserManager;
import org.python.pydev.shared_core.parsing.IParser;
/**
* This is the class that manager the PyParser and its interaction with the PyEdit
*
* It's available from 1.3.2 onwards because a single parser may be bounded to multiple editors, so, when the input
* of a given editor changes, its parser may become the same parser that another editor already contained.
*
* This class needs to know about:
* 1. When an editor has its input set
* 2. When an editor is disposed (so, its input no longer exists)
*
* The idea is that a PyParser only exists if it has some input binded, and if there's no input bounded, it is disposed.
*
* It's a singleton because it needs to manage multiple editors and their inputs. It is responsible for setting the
* parser in each PyEdit.
*
* @author Fabio
*/
public class PyParserManager extends BaseParserManager {
// -------------------------------------------------------------------------------------------- preferences stuff...
public static final String USE_PYDEV_ANALYSIS_ONLY_ON_DOC_SAVE = "USE_PYDEV_ONLY_ON_DOC_SAVE";
public static final String PYDEV_ELAPSE_BEFORE_ANALYSIS = "PYDEV_ELAPSE_BEFORE_ANALYSIS";
private IPreferenceStore prefs;
// ---------------------------------------------------------------------------------------------- singleton stuff...
private static PyParserManager pyParserManager;
public static synchronized PyParserManager getPyParserManager(IPreferenceStore prefs) {
if (pyParserManager == null) {
pyParserManager = new PyParserManager(prefs);
}
return pyParserManager;
}
public static synchronized void setPyParserManager(PyParserManager pyParserManager) {
PyParserManager.pyParserManager = pyParserManager;
}
/**
* Constructor
*
* @param prefs the prefs to get to the parser
*/
private PyParserManager(IPreferenceStore prefs) {
super();
Assert.isNotNull(prefs); //in this constructor the prefs may never be null!
//Override the default to deal with pydev preferences.
this.prefs = prefs;
this.millisBeforeAnalysis = prefs.getInt(PYDEV_ELAPSE_BEFORE_ANALYSIS);
this.useOnlyOnSave = prefs.getBoolean(USE_PYDEV_ANALYSIS_ONLY_ON_DOC_SAVE);
//singleton: private constructor
IPropertyChangeListener prefListener = new IPropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent event) {
String property = event.getProperty();
if (property.equals(USE_PYDEV_ANALYSIS_ONLY_ON_DOC_SAVE)
|| property.equals(PYDEV_ELAPSE_BEFORE_ANALYSIS)) {
//reset the caches
millisBeforeAnalysis = PyParserManager.this.prefs.getInt(PYDEV_ELAPSE_BEFORE_ANALYSIS);
useOnlyOnSave = PyParserManager.this.prefs.getBoolean(USE_PYDEV_ANALYSIS_ONLY_ON_DOC_SAVE);
//and set the needed parsers
boolean useAnalysisOnlyOnDocSave = useAnalysisOnlyOnDocSave();
synchronized (lock) {
for (IParser parser : parsers.keySet()) {
parser.resetTimeoutPreferences(useAnalysisOnlyOnDocSave);
}
}
}
}
};
this.prefs.addPropertyChangeListener(prefListener);
}
@Override
protected IParser createParser(IBaseEditor edit) {
return new PyParser((IPyEdit) edit);
}
}