diff --git a/src/brackets.js b/src/brackets.js index 1f7e4895b97..598cdf9b111 100644 --- a/src/brackets.js +++ b/src/brackets.js @@ -317,7 +317,8 @@ define(function (require, exports, module) { $target.is("input[type=number]") || $target.is("input[type=password]") || $target.is("input:not([type])") || // input with no type attribute defaults to text - $target.is("textarea"); + $target.is("textarea") || + $target.is("select"); if (!isTextField) { e.preventDefault(); diff --git a/src/document/Document.js b/src/document/Document.js index 810523c7de7..25fca049db0 100644 --- a/src/document/Document.js +++ b/src/document/Document.js @@ -134,6 +134,13 @@ define(function (require, exports, module) { * @type {FileUtils.LINE_ENDINGS_CRLF|FileUtils.LINE_ENDINGS_LF} */ Document.prototype._lineEndings = null; + + /** + * Whether this document's language was forced (manually selected) or not. + * If true, the language will not change when _updateLanguage() is called. + * @type {boolean} + */ + Document.prototype._languageWasForced = false; /** Add a ref to keep this Document alive */ Document.prototype.addRef = function () { @@ -423,14 +430,35 @@ define(function (require, exports, module) { Document.prototype.getLanguage = function () { return this.language; }; + + /** + * Overrides the default language of this document and sets it to the given + * language. + * @param {?Language} language The language to be set for this document; if + * null, the language will be set back to the default. + */ + Document.prototype.forceLanguage = function (language) { + if (language) { + var oldLanguage = this.language; + this._languageWasForced = true; + this.language = language; + $(this).triggerHandler("languageChanged", [oldLanguage, this.language]); + } else { // if language was null, reset to default language + this._languageWasForced = false; + this._updateLanguage(); + } + }; /** - * Updates the language according to the file extension + * Updates the language according to the file extension. If the current + * language was forced (set manually by user), don't change it. */ Document.prototype._updateLanguage = function () { + if (this._languageWasForced) { + return; + } var oldLanguage = this.language; this.language = LanguageManager.getLanguageForPath(this.file.fullPath); - if (oldLanguage && oldLanguage !== this.language) { $(this).triggerHandler("languageChanged", [oldLanguage, this.language]); } diff --git a/src/editor/EditorStatusBar.js b/src/editor/EditorStatusBar.js index 176086963a6..f02e7ba3fca 100644 --- a/src/editor/EditorStatusBar.js +++ b/src/editor/EditorStatusBar.js @@ -32,16 +32,20 @@ define(function (require, exports, module) { "use strict"; // Load dependent modules - var AppInit = require("utils/AppInit"), - EditorManager = require("editor/EditorManager"), - Editor = require("editor/Editor").Editor, - KeyEvent = require("utils/KeyEvent"), - StatusBar = require("widgets/StatusBar"), - Strings = require("strings"), - StringUtils = require("utils/StringUtils"); + var AppInit = require("utils/AppInit"), + CollectionUtils = require("utils/CollectionUtils"), + DefaultDialogs = require("widgets/DefaultDialogs"), + Dialogs = require("widgets/Dialogs"), + EditorManager = require("editor/EditorManager"), + Editor = require("editor/Editor").Editor, + KeyEvent = require("utils/KeyEvent"), + LanguageManager = require("language/LanguageManager"), + StatusBar = require("widgets/StatusBar"), + Strings = require("strings"), + StringUtils = require("utils/StringUtils"); /* StatusBar indicators */ - var $languageInfo, + var $languageSelect, $cursorInfo, $fileInfo, $indentType, @@ -50,7 +54,11 @@ define(function (require, exports, module) { function _updateLanguageInfo(editor) { - $languageInfo.text(editor.document.getLanguage().getName()); + var lang = editor.document.getLanguage(); + $languageSelect.empty(); + $("