/** * 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. */ /* * Created on Aug 25, 2004 * * @author Fabio Zadrozny */ package org.python.pydev.editor.codecompletion; import org.eclipse.jface.preference.BooleanFieldEditor; import org.eclipse.jface.preference.FieldEditorPreferencePage; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.IntegerFieldEditor; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.python.pydev.plugin.PydevPlugin; import org.python.pydev.plugin.preferences.PydevPrefs; import org.python.pydev.shared_core.SharedCorePlugin; import org.python.pydev.shared_core.callbacks.ICallback; import org.python.pydev.shared_core.string.WrapAndCaseUtils; import org.python.pydev.shared_ui.field_editors.LabelFieldEditor; /** * The preferences for autocompletion should only be reactivated when the code completion feature gets better (more stable and precise). * * @author Fabio Zadrozny */ public class PyCodeCompletionPreferencesPage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage { public static final String USE_CODECOMPLETION = "USE_CODECOMPLETION"; public static final boolean DEFAULT_USE_CODECOMPLETION = true; public static final String ATTEMPTS_CODECOMPLETION = "ATTEMPTS_CODECOMPLETION"; public static final int DEFAULT_ATTEMPTS_CODECOMPLETION = 5; public static final String AUTOCOMPLETE_ON_DOT = "AUTOCOMPLETE_ON_DOT"; public static final boolean DEFAULT_AUTOCOMPLETE_ON_DOT = true; public static final String MAX_MILLIS_FOR_COMPLETION = "MAX_MILLIS_FOR_COMPLETION"; public static final int DEFAULT_MAX_MILLIS_FOR_COMPLETION = 5 * 1000; //Default is 5 seconds public static final String AUTOCOMPLETE_ON_ALL_ASCII_CHARS = "AUTOCOMPLETE_ON_ALL_ASCII_CHARS"; public static final boolean DEFAULT_AUTOCOMPLETE_ON_ALL_ASCII_CHARS = true; public static final String USE_AUTOCOMPLETE = "USE_AUTOCOMPLETE"; public static final boolean DEFAULT_USE_AUTOCOMPLETE = true; public static final String AUTOCOMPLETE_DELAY = "AUTOCOMPLETE_DELAY"; public static final int DEFAULT_AUTOCOMPLETE_DELAY = 0; public static final String AUTOCOMPLETE_ON_PAR = "AUTOCOMPLETE_ON_PAR"; public static final boolean DEFAULT_AUTOCOMPLETE_ON_PAR = false; public static final String APPLY_COMPLETION_ON_DOT = "APPLY_COMPLETION_ON_DOT"; public static final boolean DEFAULT_APPLY_COMPLETION_ON_DOT = false; public static final String APPLY_COMPLETION_ON_LPAREN = "APPLY_COMPLETION_ON_LPAREN"; public static final boolean DEFAULT_APPLY_COMPLETION_ON_LPAREN = false; public static final String APPLY_COMPLETION_ON_RPAREN = "APPLY_COMPLETION_ON_RPAREN"; public static final boolean DEFAULT_APPLY_COMPLETION_ON_RPAREN = false; public static final String ARGUMENTS_DEEP_ANALYSIS_N_CHARS = "DEEP_ANALYSIS_N_CHARS"; public static final int DEFAULT_ARGUMENTS_DEEP_ANALYSIS_N_CHARS = 1; public static final String USE_CODE_COMPLETION_ON_DEBUG_CONSOLES = "USE_CODE_COMPLETION_ON_DEBUG_CONSOLES"; public static final boolean DEFAULT_USE_CODE_COMPLETION_ON_DEBUG_CONSOLES = true; public static final String MATCH_BY_SUBSTRING_IN_CODE_COMPLETION = "MATCH_BY_SUBSTRING_IN_CODE_COMPLETION"; public static final boolean DEFAULT_MATCH_BY_SUBSTRING_IN_CODE_COMPLETION = true; public static final String PUT_LOCAL_IMPORTS_IN_TOP_OF_METHOD = "PUT_LOCAL_IMPORTS_IN_TOP_OF_METHOD"; public static final boolean DEFAULT_PUT_LOCAL_IMPORTS_IN_TOP_OF_METHOD = true; /** */ public PyCodeCompletionPreferencesPage() { super(GRID); setPreferenceStore(PydevPlugin.getDefault().getPreferenceStore()); } /* * (non-Javadoc) * * @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors() */ @Override protected void createFieldEditors() { Composite p = getFieldEditorParent(); addField(new IntegerFieldEditor(ATTEMPTS_CODECOMPLETION, "Maximum attempts to connect to shell (5 secs each):", p)); addField(new IntegerFieldEditor(AUTOCOMPLETE_DELAY, "Autocompletion delay: ", p)); String tooltip = WrapAndCaseUtils .wrap("Determines the number of chars in the qualifier request " + "for which constructs such as 'from xxx import yyy' should be " + "analyzed to get its actual token and if it maps to a method, its paramaters will be added in the completion.", 80); IntegerFieldEditor deepAnalysisFieldEditor = new IntegerFieldEditor(ARGUMENTS_DEEP_ANALYSIS_N_CHARS, "Minimum number of chars in qualifier for\ndeep analysis for parameters in 'from' imports:", p); addField(deepAnalysisFieldEditor); deepAnalysisFieldEditor.getLabelControl(p).setToolTipText(tooltip); deepAnalysisFieldEditor.getTextControl(p).setToolTipText(tooltip); addField(new BooleanFieldEditor(USE_CODECOMPLETION, "Use code completion?", p)); addField(new IntegerFieldEditor( MAX_MILLIS_FOR_COMPLETION, "Maximum millis for a code-completion request to complete?", p)); addField(new BooleanFieldEditor(USE_CODE_COMPLETION_ON_DEBUG_CONSOLES, "Use code completion on debug console sessions?", p)); addField(new LabelFieldEditor("LABEL_FIELD_EDITOR_CODE_COMPLETION_DEBUG_CONSOLE", "Note: only applied for new consoles.", p)); addField(new BooleanFieldEditor(AUTOCOMPLETE_ON_DOT, "Request completion on '.'?", p)); addField(new BooleanFieldEditor(AUTOCOMPLETE_ON_PAR, "Request completion on '('?", p)); addField(new BooleanFieldEditor(AUTOCOMPLETE_ON_ALL_ASCII_CHARS, "Request completion on all letter chars and '_'?", p)); addField(new BooleanFieldEditor(MATCH_BY_SUBSTRING_IN_CODE_COMPLETION, "Match substrings on code completion?", p)); addField(new BooleanFieldEditor(APPLY_COMPLETION_ON_DOT, "Apply completion on '.'?", p)); addField(new BooleanFieldEditor(APPLY_COMPLETION_ON_LPAREN, "Apply completion on '('?", p)); addField(new BooleanFieldEditor(APPLY_COMPLETION_ON_RPAREN, "Apply completion on ')'?", p)); addField(new BooleanFieldEditor(PUT_LOCAL_IMPORTS_IN_TOP_OF_METHOD, "Put local imports on top of method?", p)); addField(new LabelFieldEditor("LABEL_PUT_LOCAL_IMPORTS_IN_TOP_OF_METHOD_ALWAYS_THERE_0", "Note: in a code-completion with a local auto-import.", p)); addField(new LabelFieldEditor("LABEL_FIELD_EDITOR_NEW_LINE_ALWAYS_THERE_a", "", p)); addField(new LabelFieldEditor("LABEL_FIELD_EDITOR_NEW_LINE_ALWAYS_THERE_a", "", p)); addField(new LabelFieldEditor("LABEL_FIELD_EDITOR_NEW_LINE_ALWAYS_THERE_b", "", p)); addField(new LabelFieldEditor("LABEL_FIELD_EDITOR_NEW_LINE_ALWAYS_THERE_0", "Note: ENTER will always apply the completion.", p)); addField(new LabelFieldEditor("LABEL_FIELD_EDITOR_NEW_LINE_ALWAYS_THERE_0a", "", p)); addField(new LabelFieldEditor("LABEL_FIELD_EDITOR_NEW_LINE_ALWAYS_THERE_0b", "", p)); addField(new LabelFieldEditor("LABEL_FIELD_EDITOR_NEW_LINE_ALWAYS_THERE_0c", "", p)); addField(new LabelFieldEditor("LABEL_FIELD_EDITOR_NEW_LINE_ALWAYS_THERE_1", "Note 2: Shift + ENTER can be used if you want a new line\n" + "without applying a completion.", p)); addField(new LabelFieldEditor("LABEL_FIELD_EDITOR_NEW_LINE_ALWAYS_THERE_1a", "", p)); addField(new LabelFieldEditor("LABEL_FIELD_EDITOR_NEW_LINE_ALWAYS_THERE_1b", "", p)); addField(new LabelFieldEditor("LABEL_FIELD_EDITOR_NEW_LINE_ALWAYS_THERE_1c", "", p)); addField(new LabelFieldEditor("LABEL_FIELD_EDITOR_NEW_LINE_ALWAYS_THERE_2", "Note 3: Ctrl + ENTER can be used as a way to apply the completion\n" + "erasing the next chars from the current token.", p)); addField(new LabelFieldEditor("LABEL_FIELD_EDITOR_NEW_LINE_ALWAYS_THERE_2a", "", p)); addField(new LabelFieldEditor("LABEL_FIELD_EDITOR_NEW_LINE_ALWAYS_THERE_2b", "", p)); addField(new LabelFieldEditor("LABEL_FIELD_EDITOR_NEW_LINE_ALWAYS_THERE_2c", "", p)); } /* * (non-Javadoc) * * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench) */ @Override public void init(IWorkbench workbench) { } public static boolean useCodeCompletion() { return getPreferences().getBoolean(PyCodeCompletionPreferencesPage.USE_CODECOMPLETION); } public static boolean useCodeCompletionOnDebug() { return getPreferences().getBoolean(PyCodeCompletionPreferencesPage.USE_CODE_COMPLETION_ON_DEBUG_CONSOLES); } public static int getNumberOfConnectionAttempts() { if (SharedCorePlugin.inTestMode()) { return 20; } IPreferenceStore preferences = getPreferences(); int ret = preferences.getInt(PyCodeCompletionPreferencesPage.ATTEMPTS_CODECOMPLETION); if (ret < 2) { ret = 2; // at least 2 attempts! } return ret; } public static int getMaximumNumberOfMillisToCompleteCodeCompletionRequest() { int val = getPreferences().getInt(PyCodeCompletionPreferencesPage.MAX_MILLIS_FOR_COMPLETION); if (val <= 200) { //Never less than 200 millis val = 200; } if (val >= 120 * 1000) { //Never more than 2 minutes val = 120 * 1000; } return val; } public static boolean isToAutocompleteOnDot() { return getPreferences().getBoolean(PyCodeCompletionPreferencesPage.AUTOCOMPLETE_ON_DOT); } public static boolean isToAutocompleteOnPar() { return getPreferences().getBoolean(PyCodeCompletionPreferencesPage.AUTOCOMPLETE_ON_PAR); } public static boolean useAutocomplete() { return getPreferences().getBoolean(PyCodeCompletionPreferencesPage.USE_AUTOCOMPLETE); } public static boolean useAutocompleteOnAllAsciiChars() { return getPreferences().getBoolean(PyCodeCompletionPreferencesPage.AUTOCOMPLETE_ON_ALL_ASCII_CHARS); } public static int getAutocompleteDelay() { return getPreferences().getInt(PyCodeCompletionPreferencesPage.AUTOCOMPLETE_DELAY); } public static int getArgumentsDeepAnalysisNChars() { if (SharedCorePlugin.inTestMode()) { return 0; } return getPreferences().getInt(PyCodeCompletionPreferencesPage.ARGUMENTS_DEEP_ANALYSIS_N_CHARS); } public static boolean applyCompletionOnDot() { return getPreferences().getBoolean(PyCodeCompletionPreferencesPage.APPLY_COMPLETION_ON_DOT); } public static boolean applyCompletionOnLParen() { return getPreferences().getBoolean(PyCodeCompletionPreferencesPage.APPLY_COMPLETION_ON_LPAREN); } public static boolean applyCompletionOnRParen() { return getPreferences().getBoolean(PyCodeCompletionPreferencesPage.APPLY_COMPLETION_ON_RPAREN); } public static boolean getUseSubstringMatchInCodeCompletion() { return getPreferences().getBoolean(PyCodeCompletionPreferencesPage.MATCH_BY_SUBSTRING_IN_CODE_COMPLETION); } public static boolean getPutLocalImportsOnTopOfMethod() { return getPreferences().getBoolean(PyCodeCompletionPreferencesPage.PUT_LOCAL_IMPORTS_IN_TOP_OF_METHOD); } private static IPreferenceStore getPreferences() { if (SharedCorePlugin.inTestMode()) { //always create a new one for tests. return getPreferencesForTests.call(null); } return PydevPrefs.getPreferenceStore(); } public static ICallback<IPreferenceStore, Object> getPreferencesForTests; }