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();
+ $("").val(lang.getId()).text(lang.getName())
+ .appendTo($languageSelect);
+ $languageSelect.val(lang.getId());
}
function _updateFileInfo(editor) {
@@ -147,8 +155,52 @@ define(function (require, exports, module) {
}
}
+ /**
+ * Setup and populate a custom