diff --git a/plugins/c9.core/settings.js b/plugins/c9.core/settings.js index 4ef877d1..94d526e0 100644 --- a/plugins/c9.core/settings.js +++ b/plugins/c9.core/settings.js @@ -50,6 +50,7 @@ define(function(require, exports, module) { var KEYS = Object.keys(PATH); var saveToCloud = {}; + var defaults = {}; var model = {}; var cache = {}; var diff = 0; // TODO should we allow this to be undefined and get NaN in timestamps? @@ -67,7 +68,7 @@ define(function(require, exports, module) { if (!json) { // Load from TEMPLATE if (options.settings == "defaults" || testing) - json = TEMPLATE; + json = util.cloneObject(TEMPLATE); // Load from parsed settings in the index file else if (options.settings) { json = options.settings; @@ -80,7 +81,7 @@ define(function(require, exports, module) { try { json[type] = JSON.parse(json[type]); } catch (e) { - json[type] = TEMPLATE[type]; + json[type] = util.cloneObject(TEMPLATE[type]); } } } @@ -91,8 +92,13 @@ define(function(require, exports, module) { KEYS.forEach(function(type) { if (!skipCloud[type] && json) return --count; - fs.readFile(PATH[type], function(err, data) { - if (!json) json = {}; + if (!json) + json = {}; + if (type == "state" && debugMode) + return done(null, localStorage["debugState" + c9.projectName]); + fs.readFile(PATH[type], done); + + function done(err, data) { try { json[type] = err ? {} : JSON.parse(data); } catch (e) { @@ -103,7 +109,7 @@ define(function(require, exports, module) { if (--count === 0) loadSettings(json); - }); + } }); if (count > 0) return; @@ -214,59 +220,31 @@ define(function(require, exports, module) { } function read(json, isReset) { - try { - if (testing) throw "testing"; - + KEYS.forEach(function(type) { + if (json[type]) + model[type] = json[type]; + }); + + if (resetSettings) { + var query = (resetSettings == 1 + ? "user|state" : resetSettings).split("|"); + resetSettings = false; + query.forEach(function(type) { + model[type] = util.cloneObject(TEMPLATE[type]); + }); + } + + if (testing) { KEYS.forEach(function(type) { - if (json[type]) - model[type] = json[type]; - }); - - if (resetSettings) { - var query = (resetSettings == 1 - ? "user|state" : resetSettings).split("|"); - query.forEach(function(type) { - model[type] = TEMPLATE[type]; - }); - } - - } catch (e) { - KEYS.forEach(function(type) { - model[type] = TEMPLATE[type]; + model[type] = util.cloneObject(TEMPLATE[type]); }); } - if (!c9.debug && !testing) { - try { - emit("read", { - model: model, - ext: plugin, - reset: isReset - }); - } catch (e) { - console.error("Error loading settings, reseting to defaults"); - console.error(e); - fs.writeFile(PATH.project - + ".broken", JSON.stringify(json), function() {}); - - KEYS.forEach(function(type) { - model[type] = TEMPLATE[type]; - }); - - emit("read", { - model: model, - ext: plugin, - reset: isReset - }); - } - } - else { - emit("read", { - model: model, - ext: plugin, - reset: isReset - }); - } + emit("read", { + model: model, + ext: plugin, + reset: isReset + }); if (inited) return; @@ -328,7 +306,7 @@ define(function(require, exports, module) { } function setDefaults(path, attr) { - var node = getNode(path) || set(path, {}, true, true) && getNode(path); + var node = getNode(path, true) || set(path, {}, true, true) && getNode(path, true); var changed; attr.forEach(function(a) { @@ -405,7 +383,7 @@ define(function(require, exports, module) { key = "json()"; } - var hash = model; + var hash = isDefault ? defaults : model; if (!parts.every(function(part) { if (!hash[part] && checkDefined) return false; hash = hash[part] || (hash[part] = {}); @@ -474,31 +452,37 @@ define(function(require, exports, module) { return parseFloat(double); } - function getNode(query) { - return get(query, true); + function getNode(query, isDefault) { + return get(query, true, isDefault); } - function get(query, isNode) { + function getUnsafe(query, isNode, isDefault) { var parts = query.split("/"); if (!isNode && parts[parts.length - 1].charAt(0) !== "@") parts.push("json()"); - var hash = model; + var hash = isDefault == true ? {} : model; parts.every(function(part) { hash = hash[part]; return hash; }); - + if (hash === undefined) { + hash = isDefault == false ? {} : defaults; + parts.every(function(part) { + hash = hash[part]; + return hash; + }); + } + return hash; + } + + function get(query, isNode, isDefault) { + var hash = getUnsafe(query, isNode, isDefault); return hash === undefined ? "" : hash; } function exist(query) { - var parts = query.split("/"); - var hash = model; - return parts.every(function(part) { - hash = hash[part]; - return hash; - }); + return getUnsafe(query, true) != undefined; } function reset(query) { @@ -506,10 +490,10 @@ define(function(require, exports, module) { var info = {}; query.split("|").forEach(function(type) { - info[type] = TEMPLATE[type]; + info[type] = util.cloneObject(TEMPLATE[type]); }); - read(model, true); + read(info, true); saveToFile(); } diff --git a/plugins/c9.ide.ace/ace.js b/plugins/c9.ide.ace/ace.js index 42b572b0..ab9d0ecf 100644 --- a/plugins/c9.ide.ace/ace.js +++ b/plugins/c9.ide.ace/ace.js @@ -246,7 +246,7 @@ define(function(require, exports, module) { ["wrapToView", true, BOOL, "wrapmodeViewport"], // Ace - ["fontSize", "12", NUMBER, "fontsize"], + ["fontSize", 12, NUMBER, "fontsize"], ["fontFamily", font, STRING, "fontfamily"], ["antialiasedfonts", false, BOOL], ["overwrite", false, BOOL, "overwrite"], @@ -257,17 +257,17 @@ define(function(require, exports, module) { ["showInvisibles", false, BOOL, "showinvisibles"], ["showPrintMargin", true, BOOL, "showprintmargin"], ["displayIndentGuides", true, BOOL, "showindentguides"], - ["printMarginColumn", "80", NUMBER, "printmargincolumn"], + ["printMarginColumn", 80, NUMBER, "printmargincolumn"], ["behavioursEnabled", true, BOOL, "behaviors"], ["wrapBehavioursEnabled", false, BOOL, "wrapbehaviors"], - ["scrollSpeed", "2", NUMBER, "scrollspeed"], + ["scrollSpeed", 2, NUMBER, "scrollspeed"], ["showGutter", true, BOOL, "gutter"], ["showLineNumbers", true, STRING], ["showFoldWidgets", true, BOOL, "folding"], ["fadeFoldWidgets", true, BOOL, "fadefoldwidgets"], ["highlightSelectedWord", true, BOOL, "highlightselectedword"], ["animatedScroll", true, BOOL, "animatedscroll"], - ["scrollPastEnd", "0.5", NUMBER], + ["scrollPastEnd", 0.5, NUMBER], ["mergeUndoDeltas", "off", STRING], ["theme", defaultThemes[skin], STRING, "theme"] ]; diff --git a/plugins/c9.ide.collab/notifications/bubble.js b/plugins/c9.ide.collab/notifications/bubble.js index 879d7670..be1010c0 100644 --- a/plugins/c9.ide.collab/notifications/bubble.js +++ b/plugins/c9.ide.collab/notifications/bubble.js @@ -29,7 +29,7 @@ define(function(require, exports, module) { loaded = true; settings.on("read", function() { - settings.setDefaults("user/collab", [["showbubbles", "true"]]); + settings.setDefaults("user/collab", [["showbubbles", true]]); }); prefs.add({ diff --git a/plugins/c9.ide.configuration/configure.js b/plugins/c9.ide.configuration/configure.js index 2b066a5c..4d98fee9 100644 --- a/plugins/c9.ide.configuration/configure.js +++ b/plugins/c9.ide.configuration/configure.js @@ -302,16 +302,36 @@ define(function(require, exports, module) { openTab("~/.c9/styles.css", css, "css"); } + function stringifySettings(query) { + var model = settings.get(query, true); + var defaults = settings.get(query, true, true); + var merged = merge({}, defaults, model); + function merge(result) { + var args = arguments; + for (var i = 1; i < args.length; i++) { + var o = args[i]; + for (var key in o) { + if (!o[key] || typeof o[key] !== "object") { + result[key] = o[key]; + } else { + if (!result[key] || typeof result[key] != "object") + result[key] = {}; + merge(result[key], o[key]); + } + } + } + return result; + } + return util.stableStringify(merged, null, 4) + .replace(/ "(true|false)"/g, " $1"); + } + function editProjectSettings() { - var value = JSON.stringify(settings.model.project, 0, " ") - .replace(/"true"/g, "true") - .replace(/"false"/g, "false"); + var value = stringifySettings("project"); openTab(settings.paths.project, value, "javascript"); } function editUserSettings() { - var value = JSON.stringify(settings.model.user, 0, " ") - .replace(/"true"/g, "true") - .replace(/"false"/g, "false"); + var value = stringifySettings("user"); openTab(settings.paths.user, value, "javascript"); } diff --git a/plugins/c9.ide.console/console.js b/plugins/c9.ide.console/console.js index 3aa30085..992c9bd1 100644 --- a/plugins/c9.ide.console/console.js +++ b/plugins/c9.ide.console/console.js @@ -75,9 +75,9 @@ define(function(require, module, exports) { settings.on("read", function(e) { // Defaults settings.setDefaults("state/console", [ - ["expanded", "true"], - ["maximized", "false"], - ["height", "153"] + ["expanded", true], + ["maximized", false], + ["height", 153] ]); // Height diff --git a/plugins/c9.ide.editors/metadata.js b/plugins/c9.ide.editors/metadata.js index 51f149a6..d9fee162 100644 --- a/plugins/c9.ide.editors/metadata.js +++ b/plugins/c9.ide.editors/metadata.js @@ -112,8 +112,8 @@ define(function(require, exports, module) { settings.on("read", function(e) { settings.setDefaults("user/metadata", [ - // ["enabled", "true"], - ["undolimit", "100"], + // ["enabled", true], + ["undolimit", 100], ]); }, plugin); diff --git a/plugins/c9.ide.panels/panel.js b/plugins/c9.ide.panels/panel.js index f5f28bbd..4744da23 100644 --- a/plugins/c9.ide.panels/panel.js +++ b/plugins/c9.ide.panels/panel.js @@ -73,7 +73,7 @@ define(function(require, module, exports) { settings.on("read", function() { settings.setDefaults(xpath, [ ["name", plugin.name], - ["enabled", "true"] + ["enabled", true] ]); // Start disabled diff --git a/plugins/c9.ide.preferences/general.js b/plugins/c9.ide.preferences/general.js index 79517aad..78cc1636 100644 --- a/plugins/c9.ide.preferences/general.js +++ b/plugins/c9.ide.preferences/general.js @@ -61,13 +61,13 @@ define(function(require, exports, module) { caption: "Reset to Defaults", width: 140, onclick: function() { - confirm("Reset Settings", + confirm("Reset User Settings", "Are you sure you want to reset your settings?", "By resetting your settings to their " + "defaults you will lose all custom settings. " + "Cloud9 will return to it's original configuration", function() { - settings.reset(); + settings.reset("user"); }, function() {}, { yes: "Reset settings", no: "Cancel" }); } diff --git a/plugins/c9.ide.run.build/gui.js b/plugins/c9.ide.run.build/gui.js index 7a72b69c..55e66947 100644 --- a/plugins/c9.ide.run.build/gui.js +++ b/plugins/c9.ide.run.build/gui.js @@ -61,7 +61,7 @@ define(function(require, module, exports) { // Settings settings.on("read", function() { settings.setDefaults("project/build", [ - ["saveall", "true"], + ["saveall", true], ["builder", "auto"] ]); settings.setDefaults("user/build", [ diff --git a/plugins/c9.ide.run.debug/breakpoints.js b/plugins/c9.ide.run.debug/breakpoints.js index 30b3f6ff..0b304d3d 100644 --- a/plugins/c9.ide.run.debug/breakpoints.js +++ b/plugins/c9.ide.run.debug/breakpoints.js @@ -201,7 +201,7 @@ define(function(require, exports, module) { // restore the breakpoints from the IDE settings settings.on("read", function (e) { settings.setDefaults("user/breakpoints", [ - ["active", "true"] + ["active", true] ]); var bps = settings.getJson("state/breakpoints"); @@ -483,7 +483,7 @@ define(function(require, exports, module) { codebox = new apf.codebox({ skin: "simplebox", "class": "dark", - focusselect: "true", + focusselect: true, htmlNode: hInput, "initial-message": "Your Expression" }); diff --git a/plugins/c9.ide.run.debug/debuggers/debugger.js b/plugins/c9.ide.run.debug/debuggers/debugger.js index 593f9049..34ac8b85 100644 --- a/plugins/c9.ide.run.debug/debuggers/debugger.js +++ b/plugins/c9.ide.run.debug/debuggers/debugger.js @@ -58,8 +58,8 @@ define(function(require, exports, module) { settings.on("read", function() { settings.setDefaults("user/debug", [ - ["pause", "0"], - ["autoshow", "true"] + ["pause", 0], + ["autoshow", true] ]); pauseOnBreaks = settings.getNumber("user/debug/@pause"); diff --git a/plugins/c9.ide.run.debug/debuggers/gdb/gdbdebugger.js b/plugins/c9.ide.run.debug/debuggers/gdb/gdbdebugger.js index cad04d87..ab026d7d 100755 --- a/plugins/c9.ide.run.debug/debuggers/gdb/gdbdebugger.js +++ b/plugins/c9.ide.run.debug/debuggers/gdb/gdbdebugger.js @@ -58,7 +58,7 @@ define(function(require, exports, module) { settings.on("read", function() { settings.setDefaults("user/debug", [ - ["autoshow", "true"] + ["autoshow", true] ]); }); diff --git a/plugins/c9.ide.run/gui.js b/plugins/c9.ide.run/gui.js index 33f9f0fb..2a326d3d 100644 --- a/plugins/c9.ide.run/gui.js +++ b/plugins/c9.ide.run/gui.js @@ -536,9 +536,9 @@ define(function(require, module, exports) { // settings settings.on("read", function(e) { settings.setDefaults("user/runconfig", [ - ["saveallbeforerun", "true"], - ["debug", "true"], - ["showruncfglist", "false"] + ["saveallbeforerun", true], + ["debug", true], + ["showruncfglist", false] ]); if (!settings.getBool("project/run/configs/@inited")) { diff --git a/plugins/c9.ide.run/output.js b/plugins/c9.ide.run/output.js index 0bb1b30a..a27c4370 100644 --- a/plugins/c9.ide.run/output.js +++ b/plugins/c9.ide.run/output.js @@ -129,8 +129,8 @@ define(function(require, exports, module) { ["backgroundColor", colors[0]], ["foregroundColor", colors[1]], ["selectionColor", colors[2]], - ["nosavequestion", "false"], - ["keepOutput", "false"] + ["nosavequestion", false], + ["keepOutput", false] ]); setSettings(); @@ -1037,13 +1037,13 @@ define(function(require, exports, module) { tab.close(); if (question.dontAsk) - settings.set("user/output/nosavequestion", "true"); + settings.set("user/output/nosavequestion", true); }, function() { // No // do nothing; allow user to set a name if (question.dontAsk) - settings.set("user/output/nosavequestion", "true"); + settings.set("user/output/nosavequestion", true); }, { showDontAsk: true, yes: "Close", no: "Cancel" }); return false; diff --git a/plugins/c9.ide.terminal/terminal.js b/plugins/c9.ide.terminal/terminal.js index 77b9208f..ffd9185b 100644 --- a/plugins/c9.ide.terminal/terminal.js +++ b/plugins/c9.ide.terminal/terminal.js @@ -249,8 +249,8 @@ define(function(require, exports, module) { ["selectionColor", colors[2]], ["antialiasedfonts", colors[3]], ["fontfamily", "Ubuntu Mono, Menlo, Consolas, monospace"], // Monaco, - ["fontsize", "12"], - ["blinking", "false"], + ["fontsize", 12], + ["blinking", false], ["scrollback", 1000] ]); diff --git a/plugins/c9.ide.tree/favorites.js b/plugins/c9.ide.tree/favorites.js index c9e385db..54e44037 100644 --- a/plugins/c9.ide.tree/favorites.js +++ b/plugins/c9.ide.tree/favorites.js @@ -481,10 +481,10 @@ define(function(require, exports, module) { var init = false; settings.on("read", function() { settings.setDefaults("state/projecttree", [ - ["showfs", startEmpty ? "false" : "true"] + ["showfs", startEmpty ? false : true] ]); settings.setDefaults("user/projecttree", [ - ["scope", "false"] + ["scope", false] ]); if (settings.getBool("state/projecttree/@showfs")) diff --git a/plugins/c9.ide.watcher/gui.js b/plugins/c9.ide.watcher/gui.js index f7c296a3..aab71037 100644 --- a/plugins/c9.ide.watcher/gui.js +++ b/plugins/c9.ide.watcher/gui.js @@ -47,8 +47,8 @@ define(function(require, exports, module) { settings.on("read", function(e) { settings.setDefaults("user/general", [ - ["automerge", "false"], - ["confirmmerge", "true"] + ["automerge", false], + ["confirmmerge", true] ]); });