/** * angular-ui-ace - This directive allows you to add ACE editor elements. * @version v0.2.3 - 2015-01-29 * @link http://angular-ui.github.com * @license MIT */ "use strict"; angular.module("ui.ace", []).constant("uiAceConfig", {}).directive("uiAce", ["uiAceConfig", function (a) { if (angular.isUndefined(window.ace)) throw new Error("ui-ace need ace to work... (o rly?)"); var b = function (a, b, c) { if (angular.isDefined(c.workerPath)) { var d = window.ace.require("ace/config"); d.set("workerPath", c.workerPath) } angular.isDefined(c.require) && c.require.forEach(function (a) { window.ace.require(a) }), angular.isDefined(c.showGutter) && a.renderer.setShowGutter(c.showGutter), angular.isDefined(c.useWrapMode) && b.setUseWrapMode(c.useWrapMode), angular.isDefined(c.showInvisibles) && a.renderer.setShowInvisibles(c.showInvisibles), angular.isDefined(c.showIndentGuides) && a.renderer.setDisplayIndentGuides(c.showIndentGuides), angular.isDefined(c.useSoftTabs) && b.setUseSoftTabs(c.useSoftTabs), angular.isDefined(c.showPrintMargin) && a.setShowPrintMargin(c.showPrintMargin), angular.isDefined(c.disableSearch) && c.disableSearch && a.commands.addCommands([{ name: "unfind", bindKey: { win: "Ctrl-F", mac: "Command-F" }, exec: function () { return !1 }, readOnly: !0 }]), angular.isString(c.theme) && a.setTheme("ace/theme/" + c.theme), angular.isString(c.mode) && b.setMode("ace/mode/" + c.mode), angular.isDefined(c.firstLineNumber) && (angular.isNumber(c.firstLineNumber) ? b.setOption("firstLineNumber", c.firstLineNumber) : angular.isFunction(c.firstLineNumber) && b.setOption("firstLineNumber", c.firstLineNumber())); var e, f; if (angular.isDefined(c.advanced)) for (e in c.advanced) f = { name: e, value: c.advanced[e] }, a.setOption(f.name, f.value); if (angular.isDefined(c.rendererOptions)) for (e in c.rendererOptions) f = { name: e, value: c.rendererOptions[e] }, a.renderer.setOption(f.name, f.value); angular.forEach(c.callbacks, function (b) { angular.isFunction(b) && b(a) }) }; return { restrict: "EA", require: "?ngModel", link: function (c, d, e, f) { var g, h, i = a.ace || {}, j = angular.extend({}, i, c.$eval(e.uiAce)), k = window.ace.edit(d[0]), l = k.getSession(), m = function () { var a = arguments[0], b = Array.prototype.slice.call(arguments, 1); angular.isDefined(a) && c.$evalAsync(function () { if (!angular.isFunction(a)) throw new Error("ui-ace use a function as callback."); a(b) }) }, n = { onChange: function (a) { return function (b) { var d = l.getValue(); !f || d === f.$viewValue || c.$$phase || c.$root.$$phase || c.$evalAsync(function () { f.$setViewValue(d) }), m(a, b, k) } }, onBlur: function (a) { return function () { m(a, k) } } }; e.$observe("readonly", function (a) { k.setReadOnly(!!a || "" === a) }), f && (f.$formatters.push(function (a) { if (angular.isUndefined(a) || null === a) return ""; if (angular.isObject(a) || angular.isArray(a)) throw new Error("ui-ace cannot use an object or an array as a model"); return a }), f.$render = function () { l.setValue(f.$viewValue) }); var o = function (a, d) { a !== d && (j = angular.extend({}, i, c.$eval(e.uiAce)), j.callbacks = [j.onLoad], j.onLoad !== i.onLoad && j.callbacks.unshift(i.onLoad), l.removeListener("change", g), g = n.onChange(j.onChange), l.on("change", g), k.removeListener("blur", h), h = n.onBlur(j.onBlur), k.on("blur", h), b(k, l, j)) }; c.$watch(e.uiAce, o, !0), o(i), d.on("$destroy", function () { k.session.$stopWorker(), k.destroy() }), c.$watch(function () { return [d[0].offsetWidth, d[0].offsetHeight] }, function () { k.resize(), k.renderer.updateFull() }, !0) } } }]);