diff --git a/Makefile.dryice.js b/Makefile.dryice.js
index d544aad6..1d258db7 100755
--- a/Makefile.dryice.js
+++ b/Makefile.dryice.js
@@ -309,6 +309,8 @@ var buildAce = function(options) {
for(var key in defaults)
if (!options.hasOwnProperty(key))
options[key] = defaults[key];
+
+ generateThemesModule(options.themes);
addSuffix(options);
@@ -487,6 +489,15 @@ var detectTextModules = function(input, source) {
detectTextModules.onRead = true;
copy.filter.addDefines = detectTextModules;
+function generateThemesModule(themes) {
+ var themelist = [
+ 'define(function(require, exports, module) {',
+ '\n\nmodule.exports.themes = ' + JSON.stringify(themes, null, ' '),
+ ';\n\n});'
+ ].join('');
+ fs.writeFileSync('./lib/ace/ext/themelist_utils/themes.js', themelist, 'utf8');
+}
+
function inlineTextModules(text) {
var lastDep = "";
return text.replace(/, *['"]ace\/requirejs\/text!(.*?)['"]|= *require\(['"](?:ace|[.\/]+)\/requirejs\/text!(.*?)['"]\)/g, function(_, dep, call) {
diff --git a/demo/show_keyboard_shortcuts.html b/demo/show_keyboard_shortcuts.html
new file mode 100644
index 00000000..c55902f6
--- /dev/null
+++ b/demo/show_keyboard_shortcuts.html
@@ -0,0 +1,46 @@
+
+
+
+
+
+ Editor
+
+
+
+
+Editor.prototype.showKeyboardShortcuts = function () {
+ showKeyboardShortcuts(this);
+};
+editor.commands.addCommands([{
+ name: "showKeyboardShortcuts",
+ bindKey: {win: "Ctrl-Alt-h", mac: "Command-Alt-h"},
+ exec: function(editor, line) {
+ editor.showKeyboardShortcuts();
+ }
+}]);
+
+
+
+
+
+
+
+
diff --git a/demo/show_settings_menu.html b/demo/show_settings_menu.html
new file mode 100644
index 00000000..72de2357
--- /dev/null
+++ b/demo/show_settings_menu.html
@@ -0,0 +1,47 @@
+
+
+
+
+
+ Editor
+
+
+
+
+Editor.prototype.showSettingsMenu = function () {
+ showSettingsMenu(this);
+};
+editor.commands.addCommands([{
+ name: "showSettingsMenu",
+ bindKey: {win: "Ctrl-q", mac: "Command-q"},
+ exec: function(editor, line) {
+ editor.showSettingsMenu();
+ },
+ readOnly: true
+}]);
+
+
+
+
+
+
+
+
diff --git a/lib/ace/commands/default_commands.js b/lib/ace/commands/default_commands.js
index 88621eaf..909aa843 100644
--- a/lib/ace/commands/default_commands.js
+++ b/lib/ace/commands/default_commands.js
@@ -42,6 +42,15 @@ function bindKey(win, mac) {
}
exports.commands = [{
+ name: "showSettingsMenu",
+ bindKey: bindKey("Ctrl-,", "Command-,"),
+ exec: function (editor) {
+ config.loadModule("ace/ext/show_keyboard_shortcuts", function (e) {
+ e(editor);
+ });
+ },
+ readOnly: true
+}, {
name: "selectall",
bindKey: bindKey("Ctrl-A", "Command-A"),
exec: function(editor) { editor.selectAll(); },
diff --git a/lib/ace/edit_session.js b/lib/ace/edit_session.js
index 60b0d4a2..23c568ee 100644
--- a/lib/ace/edit_session.js
+++ b/lib/ace/edit_session.js
@@ -1612,7 +1612,18 @@ var EditSession = function(text, mode) {
this.getWrapLimit = function() {
return this.$wrapLimit;
};
-
+
+ /**
+ * Sets the line length for soft wrap in the editor. Lines will break
+ * at a minimum of the given length minus 20 chars and at a maximum
+ * of the given number of chars.
+ * @param {number} limit The maximum line length in chars, for soft
+ * wrapping lines.
+ */
+ this.setWrapLimit = function (limit) {
+ this.setWrapLimitRange(limit - 20, limit);
+ };
+
/**
* Returns an object that defines the minimum and maximum of the wrap limit; it looks something like this:
*
diff --git a/lib/ace/editor.js b/lib/ace/editor.js
index 14174422..fb8e9dd7 100644
--- a/lib/ace/editor.js
+++ b/lib/ace/editor.js
@@ -118,6 +118,7 @@ var Editor = function(renderer, session) {
}
};
+
/**
* Returns the keyboard handler, such as "vim" or "windows".
*
@@ -168,6 +169,7 @@ var Editor = function(renderer, session) {
selection.removeEventListener("changeSelection", this.$onSelectionChange);
}
+
this.session = session;
this.$onDocumentChange = this.onDocumentChange.bind(this);
@@ -339,6 +341,14 @@ var Editor = function(renderer, session) {
this.renderer.unsetStyle(style);
};
+ /**
+ * Gets the current font size of the editor text.
+ */
+ this.getFontSize = function () {
+ return getComputedStyle(
+ this.container).getPropertyValue('font-size');
+ };
+
/**
* Set a new font size (in pixels) for the editor text.
* @param {String} size A font size ( _e.g._ "12px")
@@ -2187,6 +2197,8 @@ var Editor = function(renderer, session) {
this.renderer.removeEventListener("beforeRender", onBeforeRender);
};
};
+
+
this.$resetCursorStyle = function() {
var style = this.$cursorStyle || "ace";
diff --git a/lib/ace/ext/menu_tools/add_editor_menu_options.js b/lib/ace/ext/menu_tools/add_editor_menu_options.js
new file mode 100644
index 00000000..9e000685
--- /dev/null
+++ b/lib/ace/ext/menu_tools/add_editor_menu_options.js
@@ -0,0 +1,103 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Distributed under the BSD license:
+ *
+ * Copyright (c) 2013 Matthew Christopher Kastor-Inare III, Atropa Inc. Intl
+ * All rights reserved.
+ *
+ * Contributed to Ajax.org under the BSD license.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Ajax.org B.V. nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/*jslint
+ indent: 4,
+ maxerr: 50,
+ white: true,
+ browser: true,
+ vars: true
+*/
+/*global
+ define,
+ require
+*/
+
+/**
+ * Add Editor Menu Options
+ * @fileOverview Add Editor Menu Options
+ * The menu options property needs to be added to the editor
+ * so that the settings menu can know about options for
+ * selection elements and track which option is selected.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ */
+
+define(function(require, exports, module) {
+'use strict';
+
+/**
+ * The menu options property needs to be added to the editor
+ * so that the settings menu can know about options for
+ * selection elements and track which option is selected.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ * @param {ace.Editor} editor An instance of the ace editor.
+ */
+module.exports.addEditorMenuOptions = function addEditorMenuOptions (editor) {
+ var modelist = require('../modelist');
+ var themelist = require('../themelist');
+ editor.menuOptions = {
+ "setNewLineMode" : [{
+ "textContent" : "unix",
+ "value" : "unix"
+ }, {
+ "textContent" : "windows",
+ "value" : "windows"
+ }, {
+ "textContent" : "auto",
+ "value" : "auto"
+ }
+ ],
+ "setTheme" : [],
+ "setMode" : []
+ };
+
+ editor.menuOptions.setTheme = themelist.themes.map(function (theme) {
+ return {
+ 'textContent' : theme.desc,
+ 'value' : theme.theme
+ };
+ });
+
+ editor.menuOptions.setMode = modelist.modes.map(function (mode) {
+ return {
+ 'textContent' : mode.name,
+ 'value' : mode.mode
+ };
+ });
+};
+
+
+});
\ No newline at end of file
diff --git a/lib/ace/ext/menu_tools/element_generator.js b/lib/ace/ext/menu_tools/element_generator.js
new file mode 100644
index 00000000..e1cf405d
--- /dev/null
+++ b/lib/ace/ext/menu_tools/element_generator.js
@@ -0,0 +1,157 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Distributed under the BSD license:
+ *
+ * Copyright (c) 2013 Matthew Christopher Kastor-Inare III, Atropa Inc. Intl
+ * All rights reserved.
+ *
+ * Contributed to Ajax.org under the BSD license.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Ajax.org B.V. nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/*jslint
+ indent: 4,
+ maxerr: 50,
+ white: true,
+ browser: true,
+ vars: true
+*/
+/*global
+ define,
+ require
+*/
+
+/**
+ * Element Generator
+ * @fileOverview Element Generator
+ * Contains methods for generating elements.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ */
+
+define(function(require, exports, module) {
+'use strict';
+/**
+ * Creates a DOM option element
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ * @param {object} obj An object containing properties to add to the dom
+ * element. If one of those properties is named `selected` then it will be
+ * added as an attribute on the element instead.
+ */
+module.exports.createOption = function createOption (obj) {
+ var attribute;
+ var el = document.createElement('option');
+ for(attribute in obj) {
+ if(obj.hasOwnProperty(attribute)) {
+ if(attribute === 'selected') {
+ el.setAttribute(attribute, obj[attribute]);
+ } else {
+ el[attribute] = obj[attribute];
+ }
+ }
+ }
+ return el;
+};
+/**
+ * Creates a DOM checkbox element.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ * @param {string} id The id of the element.
+ * @param {boolean} checked Whether or not the element is checked.
+ * @param {string} clss The class of the element.
+ * @returns {DOMElement} Returns a checkbox element reference.
+ */
+module.exports.createCheckbox = function createCheckbox (id, checked, clss) {
+ var el = document.createElement('input');
+ el.setAttribute('type', 'checkbox');
+ el.setAttribute('id', id);
+ el.setAttribute('name', id);
+ el.setAttribute('value', checked);
+ el.setAttribute('class', clss);
+ if(checked) {
+ el.setAttribute('checked', 'checked');
+ }
+ return el;
+};
+/**
+ * Creates a DOM text input element.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ * @param {string} id The id of the element.
+ * @param {string} value The default value of the input element.
+ * @param {string} clss The class of the element.
+ * @returns {DOMElement} Returns an input element reference.
+ */
+module.exports.createInput = function createInput (id, value, clss) {
+ var el = document.createElement('input');
+ el.setAttribute('type', 'text');
+ el.setAttribute('id', id);
+ el.setAttribute('name', id);
+ el.setAttribute('value', value);
+ el.setAttribute('class', clss);
+ return el;
+};
+/**
+ * Creates a DOM label element.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ * @param {string} text The label text.
+ * @param {string} labelFor The id of the element being labeled.
+ * @returns {DOMElement} Returns a label element reference.
+ */
+module.exports.createLabel = function createLabel (text, labelFor) {
+ var el = document.createElement('label');
+ el.setAttribute('for', labelFor);
+ el.textContent = text;
+ return el;
+};
+/**
+ * Creates a DOM selection element.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ * @param {string} id The id of the element.
+ * @param {string} values An array of objects suitable for `createOption`
+ * @param {string} clss The class of the element.
+ * @returns {DOMElement} Returns a selection element reference.
+ * @see ace/ext/element_generator.createOption
+ */
+module.exports.createSelection = function createSelection (id, values, clss) {
+ var el = document.createElement('select');
+ el.setAttribute('id', id);
+ el.setAttribute('name', id);
+ el.setAttribute('class', clss);
+ values.forEach(function (item) {
+ el.appendChild(module.exports.createOption(item));
+ });
+ return el;
+};
+
+});
\ No newline at end of file
diff --git a/lib/ace/ext/menu_tools/generate_settings_menu.js b/lib/ace/ext/menu_tools/generate_settings_menu.js
new file mode 100644
index 00000000..cc81fa44
--- /dev/null
+++ b/lib/ace/ext/menu_tools/generate_settings_menu.js
@@ -0,0 +1,272 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Distributed under the BSD license:
+ *
+ * Copyright (c) 2013 Matthew Christopher Kastor-Inare III, Atropa Inc. Intl
+ * All rights reserved.
+ *
+ * Contributed to Ajax.org under the BSD license.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Ajax.org B.V. nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/*jslint
+ indent: 4,
+ maxerr: 50,
+ white: true,
+ browser: true,
+ vars: true
+*/
+/*global
+ define
+*/
+
+/**
+ * Generates the settings menu
+ * @fileOverview Generates the settings menu.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ */
+
+define(function(require, exports, module) {
+'use strict';
+/**
+ * Generates an interactive menu with settings useful to end users.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ * @param {ace.Editor} editor An instance of the ace editor.
+ */
+module.exports.generateSettingsMenu = function generateSettingsMenu (editor) {
+ var addEditorMenuOptions = require('./add_editor_menu_options').addEditorMenuOptions;
+ var getSetFunctions = require('./get_set_functions').getSetFunctions;
+ /**
+ * container for dom elements that will go in the menu.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ */
+ var elements = [];
+ /**
+ * Sorts the menu entries (elements var) so they'll appear in alphabetical order
+ * the sort is performed based on the value of the contains property
+ * of each element. Since this is an `array.sort` the array is sorted
+ * in place.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ */
+ function cleanupElementsList() {
+ elements.sort(function (a, b) {
+ var x = a.getAttribute('contains');
+ var y = b.getAttribute('contains');
+ return x.localeCompare(y);
+ });
+ }
+ /**
+ * Wraps all dom elements contained in the elements var with a single
+ * div.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ */
+ function wrapElements() {
+ var topmenu = document.createElement('div');
+ topmenu.setAttribute('id', 'settingsmenu');
+ elements.forEach(function (element) {
+ topmenu.appendChild(element);
+ });
+ return topmenu;
+ }
+ /**
+ * Creates a new menu entry.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ * @param {object} obj This is a reference to the object containing the
+ * set function. It is used to set up event listeners for when the
+ * menu options change.
+ * @param {string} clss Maps to the class of the dom element. This is
+ * the name of the object containing the set function e.g. `editor`,
+ * `session`, `renderer`.
+ * @param {string} item This is the set function name. It maps to the
+ * id of the dom element (check, select, input) and to the "contains"
+ * attribute of the div holding both the element and its label.
+ * @param {mixed} val This is the value of the setting. It is mapped to
+ * the dom element's value, checked, or selected option accordingly.
+ */
+ function createNewEntry(obj, clss, item, val) {
+ var egen = require('./element_generator');
+ var el;
+ var div = document.createElement('div');
+ div.setAttribute('contains', item);
+ div.setAttribute('class', 'menuEntry');
+ div.setAttribute('style', 'clear: both;');
+
+ div.appendChild(egen.createLabel(
+ item.replace(
+ /^set/, ''
+ ).replace(
+ /([A-Z])/g, ' $1'
+ ).trim(),
+ item
+ ));
+
+ if(Array.isArray(val)) {
+ el = egen.createSelection(item, val, clss);
+ el.addEventListener('change', function (e) {
+ try{
+ editor.menuOptions[e.target.id].forEach(function (x) {
+ if(x.textContent !== e.target.textContent) {
+ delete x.selected;
+ }
+ });
+ // editor.session['setMode']('ace/mode/javascript')
+ obj[e.target.id](e.target.value);
+ } catch (err) {
+ throw new Error(err);
+ }
+ });
+ } else if(typeof val === 'boolean') {
+ el = egen.createCheckbox(item, val, clss);
+ el.addEventListener('change', function (e) {
+ try{
+ // renderer['setHighlightGutterLine'](true);
+ obj[e.target.id](!!e.target.checked);
+ } catch (err) {
+ throw new Error(err);
+ }
+ });
+ } else {
+ // this aids in giving the ability to specify settings through
+ // post and get requests.
+ // /ace_editor.html?setMode=ace/mode/html&setOverwrite=true
+ el = egen.createInput(item, val, clss);
+ el.addEventListener('blur', function (e) {
+ try{
+ if(e.target.value === 'true') {
+ obj[e.target.id](true);
+ } else if(e.target.value === 'false') {
+ obj[e.target.id](false);
+ } else {
+ obj[e.target.id](e.target.value);
+ }
+ } catch (err) {
+ throw new Error(err);
+ }
+ });
+ }
+ el.style.cssText = 'float:right;';
+ div.appendChild(el);
+ return div;
+ }
+ /**
+ * Generates selection fields for the menu and populates their options
+ * using information from `editor.menuOptions`
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ * @param {string} item The set function name.
+ * @param {object} esr A reference to the object having the set function.
+ * @param {string} clss The name of the object containing the set function.
+ * @param {string} fn The matching get function's function name.
+ * @returns {DOMElement} Returns a dom element containing a selection
+ * element populated with options. The option whose value matches that
+ * returned from `esr[fn]()` will be selected.
+ */
+ function makeDropdown(item, esr, clss, fn) {
+ var val = editor.menuOptions[item];
+ val = val.map(function (valuex) {
+ if(valuex.value === esr[fn]()) {
+ valuex.selected = 'selected';
+ } else if(valuex.value === esr.$modeId) {
+ // is mode
+ valuex.selected = 'selected';
+ }
+ return valuex;
+ });
+ return createNewEntry(esr, clss, item, val);
+ }
+ /**
+ * Processes the set functions returned from `getSetFunctions`. First it
+ * checks for menu options defined in `editor.menuOptions`. If no
+ * options are specified then it checks whether there is a get function
+ * (replace set with get) for the setting. When either of those
+ * conditions are met it will attempt to create a new entry for the
+ * settings menu and push it into the elements array defined above.
+ * It can only do so for get functions which return
+ * strings, numbers, and booleans. A special case is written in for
+ * `getMode` where it looks at the returned objects `$id` property and
+ * forwards that through instead. Other special cases could be written
+ * in but that would get a bit ridiculous.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ * @param {object} setObj An item from the array returned by
+ * `getSetFunctions`.
+ */
+ function handleSet (setObj) {
+ var item = setObj.functionName;
+ var esr = setObj.parentObj;
+ var clss = setObj.parentName;
+ var val;
+ var fn = item.replace(/^set/, 'get');
+ if(editor.menuOptions[item] !== undefined) {
+ // has options for select element
+ elements.push(makeDropdown(item, esr, clss, fn));
+ } else if(typeof esr[fn] === 'function') {
+ // has get function
+ try {
+ val = esr[fn]();
+ if(typeof val === 'object') {
+ // setMode takes a string, getMode returns an object
+ // the $id property of that object is the string
+ // which may be given to setMode...
+ val = val.$id;
+ }
+ // the rest of the get functions return strings,
+ // booleans, or numbers.
+ elements.push(
+ createNewEntry(esr, clss, item, val)
+ );
+ } catch (e) {
+ // if there are errors it is because the element
+ // does not belong in the settings menu
+ }
+ }
+ }
+ addEditorMenuOptions(editor);
+ // gather the set functions
+ getSetFunctions(editor).forEach(function (setObj) {
+ // populate the elements array with good stuff.
+ handleSet(setObj);
+ });
+ // sort the menu entries in the elements list so people can find
+ // the settings in alphabetical order.
+ cleanupElementsList();
+ // dump the entries from the elements list and wrap them up in a div
+ return wrapElements();
+};
+
+});
\ No newline at end of file
diff --git a/lib/ace/ext/menu_tools/get_editor_keyboard_shortcuts.js b/lib/ace/ext/menu_tools/get_editor_keyboard_shortcuts.js
new file mode 100644
index 00000000..96f830e6
--- /dev/null
+++ b/lib/ace/ext/menu_tools/get_editor_keyboard_shortcuts.js
@@ -0,0 +1,95 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Distributed under the BSD license:
+ *
+ * Copyright (c) 2013 Matthew Christopher Kastor-Inare III, Atropa Inc. Intl
+ * All rights reserved.
+ *
+ * Contributed to Ajax.org under the BSD license.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Ajax.org B.V. nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/*jslint
+ indent: 4,
+ maxerr: 50,
+ white: true,
+ browser: true,
+ vars: true
+*/
+/*global
+ define,
+ require
+*/
+
+/**
+ * Get Editor Keyboard Shortcuts
+ * @fileOverview Get Editor Keyboard Shortcuts
+ * Gets a map of keyboard shortcuts to command names for the current platform.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ */
+
+define(function(require, exports, module) {
+"use strict";
+/**
+ * Gets a map of keyboard shortcuts to command names for the current platform.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ * @param {ace.Editor} editor An editor instance.
+ * @returns {Array} Returns an array of objects representing the keyboard
+ * shortcuts for the given editor.
+ * @example
+ * var getKbShortcuts = require('./get_keyboard_shortcuts');
+ * console.log(getKbShortcuts(editor));
+ * // [
+ * // {'command' : aCommand, 'key' : 'Control-d'},
+ * // {'command' : aCommand, 'key' : 'Control-d'}
+ * // ]
+ */
+module.exports.getEditorKeybordShortcuts = function getEditorKeybordShortcuts (editor) {
+ var commands = editor.commands.byName;
+ var commandName;
+ var key;
+ var platform = editor.commands.platform;
+ var kb = [];
+ for (commandName in commands) {
+ try {
+ key = commands[commandName].bindKey[platform];
+ if (key) {
+ kb.push({
+ 'command' : commandName,
+ 'key' : key
+ });
+ }
+ } catch (e) {
+ // errors on properties without bindKey we don't want them
+ // so the errors don't need handling.
+ }
+ }
+ return kb;
+};
+
+});
\ No newline at end of file
diff --git a/lib/ace/ext/menu_tools/get_set_functions.js b/lib/ace/ext/menu_tools/get_set_functions.js
new file mode 100644
index 00000000..ba5a757b
--- /dev/null
+++ b/lib/ace/ext/menu_tools/get_set_functions.js
@@ -0,0 +1,155 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Distributed under the BSD license:
+ *
+ * Copyright (c) 2013 Matthew Christopher Kastor-Inare III, Atropa Inc. Intl
+ * All rights reserved.
+ *
+ * Contributed to Ajax.org under the BSD license.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Ajax.org B.V. nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/*jslint
+ indent: 4,
+ maxerr: 50,
+ white: true,
+ browser: true,
+ vars: true
+*/
+/*global
+ define
+*/
+
+/**
+ * Get Set Functions
+ * @fileOverview Get Set Functions
+ * Gets various functions for setting settings.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ */
+
+define(function(require, exports, module) {
+'use strict';
+/**
+ * Generates a list of set functions for the settings menu.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ * @param {object} editor The editor instance
+ * @return {array} Returns an array of objects. Each object contains the
+ * following properties: functionName, parentObj, and parentName. The
+ * function name will be the name of a method beginning with the string
+ * `set` which was found. The parent object will be a reference to the
+ * object having the method matching the function name. The parent name
+ * will be a string representing the identifier of the parent object e.g.
+ * `editor`, `session`, or `renderer`.
+ */
+module.exports.getSetFunctions = function getSetFunctions (editor) {
+ /**
+ * Output array. Will hold the objects described above.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ */
+ var out = [];
+ /**
+ * This object provides a map between the objects which will be
+ * traversed and the parent name which will appear in the output.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ */
+ var my = {
+ 'editor' : editor,
+ 'session' : editor.session,
+ 'renderer' : editor.renderer
+ };
+ /**
+ * This array will hold the set function names which have already been
+ * found so that they are not added to the output multiple times.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ */
+ var opts = [];
+ /**
+ * This is a list of set functions which will not appear in the settings
+ * menu. I don't know what to do with setKeyboardHandler. When I tried
+ * to use it, it didn't appear to be working. Someone who knows better
+ * could remove it from this list and add it's options to
+ * add_editor_menu_options.js
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ */
+ var skip = [
+ 'setOption',
+ 'setUndoManager',
+ 'setDocument',
+ 'setValue',
+ 'setBreakpoints',
+ 'setScrollTop',
+ 'setScrollLeft',
+ 'setSelectionStyle',
+ 'setWrapLimitRange',
+ 'setKeyboardHandler'
+ ];
+
+
+ /**
+ * This will search the objects mapped to the `my` variable above. When
+ * it finds a set function in the object that is not listed in the
+ * `skip` list or the `opts` list it will push a new object to the
+ * output array.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ */
+ [
+ 'renderer',
+ 'session',
+ 'editor'
+ ].forEach(function (esra) {
+ var fn;
+ var esr = my[esra];
+ var clss = esra;
+ for(fn in esr) {
+ if(skip.indexOf(fn) === -1) {
+ if(/^set/.test(fn) && opts.indexOf(fn) === -1) {
+ // found set function
+ opts.push(fn);
+ out.push({
+ 'functionName' : fn,
+ 'parentObj' : esr,
+ 'parentName' : clss
+ });
+ }
+ }
+ }
+ });
+ return out;
+};
+
+});
\ No newline at end of file
diff --git a/lib/ace/ext/menu_tools/overlay_page.js b/lib/ace/ext/menu_tools/overlay_page.js
new file mode 100644
index 00000000..0e18d20e
--- /dev/null
+++ b/lib/ace/ext/menu_tools/overlay_page.js
@@ -0,0 +1,116 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Distributed under the BSD license:
+ *
+ * Copyright (c) 2013 Matthew Christopher Kastor-Inare III, Atropa Inc. Intl
+ * All rights reserved.
+ *
+ * Contributed to Ajax.org under the BSD license.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Ajax.org B.V. nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/*jslint
+ indent: 4,
+ maxerr: 50,
+ white: true,
+ browser: true,
+ vars: true
+*/
+/*global
+ define,
+ require
+*/
+
+/**
+ * Overlay Page
+ * @fileOverview Overlay Page
+ * Generates an overlay for displaying menus. The overlay is an absolutely
+ * positioned div.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ */
+
+define(function(require, exports, module) {
+'use strict';
+
+/**
+ * Generates an overlay for displaying menus. The overlay is an absolutely
+ * positioned div.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ * @param {DOMElement} contentElement Any element which may be presented inside
+ * a div.
+ * @param {string|number} top absolute position value.
+ * @param {string|number} right absolute position value.
+ * @param {string|number} bottom absolute position value.
+ * @param {string|number} left absolute position value.
+ */
+module.exports.overlayPage = function overlayPage (editor, contentElement, top, right, bottom, left) {
+ top = (top) ? 'top: ' + top + ';' : '';
+ bottom = (bottom) ? 'bottom: ' + bottom + ';' : '';
+ right = (right) ? 'right: ' + right + ';' : '';
+ left = (left) ? 'left: ' + left + ';' : '';
+
+ var closer = document.createElement('div');
+ var contentContainer = document.createElement('div');
+
+ function documentEscListener (e) {
+ if (e.keyCode === 27) {
+ closer.click();
+ }
+ }
+
+ closer.style.cssText = 'margin: 0; padding: 0; ' +
+ 'position: fixed; top:0; bottom:0; left:0; right:0;' +
+ 'z-index: 9990; ' +
+ 'background-color: rgba(0, 0, 0, 0.2);';
+ closer.addEventListener('click', function () {
+ document.removeEventListener('keydown', documentEscListener);
+ closer.parentNode.removeChild(closer);
+ editor.focus();
+ closer = null;
+ });
+ // click closer if esc key is pressed
+ document.addEventListener('keydown', documentEscListener);
+
+ contentContainer.style.cssText = 'margin: 0; padding: 0; ' +
+ 'position: absolute;' +
+ top + right + bottom + left +
+ 'z-index: 9991; ' +
+ 'box-shadow: rgba(126, 126, 126, 0.25) -20px 10px 25px; ' +
+ 'background-color: rgba(255, 255, 255, 0.6);' +
+ 'color: black; overflow: auto;';
+ contentContainer.addEventListener('click', function (e) {
+ e.stopPropagation();
+ });
+
+ contentContainer.appendChild(contentElement);
+ closer.appendChild(contentContainer);
+ document.body.appendChild(closer);
+ editor.blur();
+};
+
+});
\ No newline at end of file
diff --git a/lib/ace/ext/show_keyboard_shortcuts.js b/lib/ace/ext/show_keyboard_shortcuts.js
new file mode 100644
index 00000000..d7405aa7
--- /dev/null
+++ b/lib/ace/ext/show_keyboard_shortcuts.js
@@ -0,0 +1,95 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Distributed under the BSD license:
+ *
+ * Copyright (c) 2013 Matthew Christopher Kastor-Inare III, Atropa Inc. Intl
+ * All rights reserved.
+ *
+ * Contributed to Ajax.org under the BSD license.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Ajax.org B.V. nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/*jslint
+ indent: 4,
+ maxerr: 50,
+ white: true,
+ browser: true,
+ vars: true
+*/
+/*global
+ define,
+ require
+*/
+
+/**
+ * Show Keyboard Shortcuts
+ * @fileOverview Show Keyboard Shortcuts
+ * Generates a menu which displays the keyboard shortcuts.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ */
+
+define(function(require, exports, module) {
+ "use strict";
+ var Editor = require("ace/editor").Editor;
+ /**
+ * Generates a menu which displays the keyboard shortcuts.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ * @param {ace.Editor} editor An instance of the ace editor.
+ */
+ function showKeyboardShortcuts (editor) {
+ // make sure the menu isn't open already.
+ if(!document.getElementById('kbshortcutmenu')) {
+ var overlayPage = require('./menu_tools/overlay_page').overlayPage;
+ var getEditorKeybordShortcuts = require('./menu_tools/get_editor_keyboard_shortcuts').getEditorKeybordShortcuts;
+ var kb = getEditorKeybordShortcuts(editor);
+ var el = document.createElement('div');
+ var commands = kb.reduce(function (previous, current) {
+ return previous + '' + current.command + ' : ' +
+ current.key + '
';
+ }, '');
+
+ el.id = 'kbshortcutmenu';
+ el.innerHTML = 'Keyboard Shortcuts
' + commands + '';
+ el.style.cssText = 'margin:0; padding:0;';
+ overlayPage(editor, el, '0', '0', '0', null);
+ }
+ };
+ module.exports.init = function (editor) {
+ Editor.prototype.showKeyboardShortcuts = function () {
+ showKeyboardShortcuts(this);
+ };
+ editor.commands.addCommands([{
+ name: "showKeyboardShortcuts",
+ bindKey: {win: "Ctrl-Alt-h", mac: "Command-Alt-h"},
+ exec: function(editor, line) {
+ editor.showKeyboardShortcuts();
+ }
+ }]);
+ };
+
+});
\ No newline at end of file
diff --git a/lib/ace/ext/show_settings_menu.js b/lib/ace/ext/show_settings_menu.js
new file mode 100644
index 00000000..15eb8027
--- /dev/null
+++ b/lib/ace/ext/show_settings_menu.js
@@ -0,0 +1,94 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Distributed under the BSD license:
+ *
+ * Copyright (c) 2013 Matthew Christopher Kastor-Inare III, Atropa Inc. Intl
+ * All rights reserved.
+ *
+ * Contributed to Ajax.org under the BSD license.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Ajax.org B.V. nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/*jslint
+ indent: 4,
+ maxerr: 50,
+ white: true,
+ browser: true,
+ vars: true
+*/
+/*global
+ define,
+ require,
+ getComputedStyle
+*/
+
+/**
+ * Show Settings Menu
+ * @fileOverview Show Settings Menu
+ * Displays an interactive settings menu mostly generated on the fly based on
+ * the current state of the editor.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ */
+
+define(function(require, exports, module) {
+ "use strict";
+ /**
+ * This displays the settings menu if it is not already being shown.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ * @param {ace.Editor} editor An instance of the ace editor.
+ */
+ function showSettingsMenu (editor) {
+ var overlayPage = require('./menu_tools/overlay_page').overlayPage;
+ var generateSettingsMenu = require(
+ './menu_tools/generate_settings_menu').generateSettingsMenu;
+ // make sure the menu isn't open already.
+ if(!document.getElementById('settingsmenu')) {
+ overlayPage(editor, generateSettingsMenu(editor), '0', '0', '0');
+ }
+ }
+ /**
+ * Initializes the settings menu extension. It adds the showSettingsMenu
+ * method to the given editor object and adds the showSettingsMenu command
+ * to the editor with appropriate keyboard shortcuts.
+ * @param {ace.Editor} editor An instance of the Editor.
+ */
+ module.exports.init = function (editor) {
+ var Editor = require("ace/editor").Editor;
+ Editor.prototype.showSettingsMenu = function () {
+ showSettingsMenu(this);
+ };
+ editor.commands.addCommands([{
+ name: "showSettingsMenu",
+ bindKey: {win: "Ctrl-q", mac: "Command-q"},
+ exec: function(editor, line) {
+ editor.showSettingsMenu();
+ },
+ readOnly: true
+ }]);
+ };
+});
\ No newline at end of file
diff --git a/lib/ace/ext/themelist.js b/lib/ace/ext/themelist.js
new file mode 100644
index 00000000..9610e691
--- /dev/null
+++ b/lib/ace/ext/themelist.js
@@ -0,0 +1,88 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Distributed under the BSD license:
+ *
+ * Copyright (c) 2013 Matthew Christopher Kastor-Inare III, Atropa Inc. Intl
+ * All rights reserved.
+ *
+ * Contributed to Ajax.org under the BSD license.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Ajax.org B.V. nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/*jslint
+ indent: 4,
+ maxerr: 50,
+ white: true,
+ browser: true,
+ vars: true
+*/
+/*global
+ define,
+ require
+*/
+
+/**
+ * Generates a list of themes available when ace was built.
+ * @fileOverview Generates a list of themes available when ace was built.
+ * @author
+ * Matthew Christopher Kastor-Inare III
+ * ☭ Hial Atropa!! ☭
+ */
+
+define(function(require, exports, module) {
+"use strict";
+
+/**
+ * An array containing information about available themes.
+ */
+module.exports.themes = require('ace/ext/themelist_utils/themes').themes;
+
+/**
+ * Creates a theme description.
+ * @param {string} name The file name of the theme.
+ * @returns {ThemeDescription} Returns a theme description object which has
+ * three properties: the name gives the filename, the desc gives a menu
+ * friendly name, and the theme gives the string to set the theme with
+ * `setTheme`
+ */
+module.exports.ThemeDescription = function(name) {
+ this.name = name;
+ this.desc = name.split('_'
+ ).map(
+ function (namePart) {
+ return namePart[0].toUpperCase() + namePart.slice(1);
+ }
+ ).join(' ');
+ this.theme = "ace/theme/" + name;
+};
+
+module.exports.themesByName = {};
+
+module.exports.themes = module.exports.themes.map(function (name) {
+ module.exports.themesByName[name] = new module.exports.ThemeDescription(name);
+ return module.exports.themesByName[name];
+});
+
+});
+
diff --git a/lib/ace/ext/themelist_utils/themes.js b/lib/ace/ext/themelist_utils/themes.js
new file mode 100644
index 00000000..6b20770a
--- /dev/null
+++ b/lib/ace/ext/themelist_utils/themes.js
@@ -0,0 +1,36 @@
+define(function(require, exports, module) {
+
+module.exports.themes = [
+ "ambiance",
+ "chaos",
+ "chrome",
+ "clouds",
+ "clouds_midnight",
+ "cobalt",
+ "crimson_editor",
+ "dawn",
+ "dreamweaver",
+ "eclipse",
+ "github",
+ "idle_fingers",
+ "kr_theme",
+ "merbivore",
+ "merbivore_soft",
+ "monokai",
+ "mono_industrial",
+ "pastel_on_dark",
+ "solarized_dark",
+ "solarized_light",
+ "terminal",
+ "textmate",
+ "tomorrow",
+ "tomorrow_night",
+ "tomorrow_night_blue",
+ "tomorrow_night_bright",
+ "tomorrow_night_eighties",
+ "twilight",
+ "vibrant_ink",
+ "xcode"
+];
+
+});
\ No newline at end of file