From 04217e16d4707b15da0aed63ca937737cfdae328 Mon Sep 17 00:00:00 2001 From: Damien Churchill Date: Tue, 13 Oct 2009 16:21:28 +0000 Subject: [PATCH] big bunch of fixes to the M.O.M along with a couple to the O.M --- .../ui/web/js/Deluge.MultiOptionsManager.js | 199 +++++++----------- deluge/ui/web/js/Deluge.OptionsManager.js | 189 ++++++++--------- 2 files changed, 170 insertions(+), 218 deletions(-) diff --git a/deluge/ui/web/js/Deluge.MultiOptionsManager.js b/deluge/ui/web/js/Deluge.MultiOptionsManager.js index 550411d16..5b12a54fd 100644 --- a/deluge/ui/web/js/Deluge.MultiOptionsManager.js +++ b/deluge/ui/web/js/Deluge.MultiOptionsManager.js @@ -20,15 +20,15 @@ Copyright: 51 Franklin Street, Fifth Floor Boston, MA 02110-1301, USA. - In addition, as a special exception, the copyright holders give - permission to link the code of portions of this program with the OpenSSL - library. - You must obey the GNU General Public License in all respects for all of - the code used other than OpenSSL. If you modify file(s) with this - exception, you may extend this exception to your version of the file(s), - but you are not obligated to do so. If you do not wish to do so, delete - this exception statement from your version. If you delete this exception - statement from all source files in the program, then also delete it here. + In addition, as a special exception, the copyright holders give + permission to link the code of portions of this program with the OpenSSL + library. + You must obey the GNU General Public License in all respects for all of + the code used other than OpenSSL. If you modify file(s) with this + exception, you may extend this exception to your version of the file(s), + but you are not obligated to do so. If you do not wish to do so, delete + this exception statement from your version. If you delete this exception + statement from all source files in the program, then also delete it here. */ /** @@ -37,54 +37,11 @@ Copyright: * @class Deluge.MultiOptionsManager */ Deluge.MultiOptionsManager = Ext.extend(Deluge.OptionsManager, { - + constructor: function(config) { - config = config || {}; - this.options = {}; - this.binds = {}; - this.changed = {}; - this.defaults = (config && config['defaults']) || {}; - - this.addEvents({ - 'add': true, - 'changed': true, - 'reset': true - }); - this.on('changed', this.onChange, this); - - Deluge.MultiOptionsManager.superclass.constructor.call(this); - }, - - /** - * Add a set of default options and values to the options manager - * @param {String} id - * @param {Object} options The default options. - */ - addOptions: function(options) { - this.options[id] = options; - }, - - /** - * Binds a form field to the specified option. - * @param {String} option - * @param {Ext.form.Field} field - */ - bind: function(option, field) { - this.binds[option] = field; - this.binds[field] = option; - - switch (field.getXType()) { - case 'checkbox': - case 'radiogroup': - field.on('check', this.onFieldChange, this); - break; - case 'uxspinner': - field.on('spin', this.onFieldChange, this); - field.on('keypress', this.onFieldChange, this); - break; - default: - break; - } + this.currentId = null; + this.stored = {}; + Deluge.MultiOptionsManager.superclass.constructor.call(this, config); }, /** @@ -93,11 +50,22 @@ Deluge.MultiOptionsManager = Ext.extend(Deluge.OptionsManager, { */ changeId: function(id) { this.currentId = id; - for (var option in this.defaults) { + for (var option in this.options) { if (!this.binds[option]) continue; - this.binds[option].setValue(this.get(id, option)); + Ext.each(this.binds[option], function(bind) { + bind.setValue(this.get(id, option)); + }, this); } }, + + /** + * Changes all the changed values to be the default values + * @param {String} id + */ + commit: function(id) { + this.stored[id] = Ext.apply(this.stored[id], this.changed[id]); + this.reset(id); + }, /** * Get the value for an option @@ -105,27 +73,21 @@ Deluge.MultiOptionsManager = Ext.extend(Deluge.OptionsManager, { * @param {String|Array} [option] A single option or an array of options to return. * @returns {Object} the options value. */ - get: function(id, option) { - if (!option) { - var values = {}; - for (var key in this.defaults) { - values[key] = this.get(id, key); - } - return values; + get: function() { + var id = arguments[0]; + if (arguments.length == 2) { + var option = arguments[1]; + return (this.isDirty(id, option)) ? this.changed[id][option] : this.getDefault(id, option); } else { - return (this.hasChanged(id, option)) ? this.changed[id][option] : this.getDefault(id, option); + var options = {}; + Ext.each(arguments, function(option) { + if (option == id) return; + options[option] = (this.isDirty(id, option)) ? this.changed[id][option] : this.getDefault(id, option); + }, this); + return options; } }, - - /** - * Returns the changed values. - * @param {String} id - * @returns {Object} the changed options - */ - getChanged: function(id) { - return (this.changed[id]) ? this.changed[id] : {}; - }, - + /** * Get the default value for an option. * @param {String} id @@ -133,19 +95,28 @@ Deluge.MultiOptionsManager = Ext.extend(Deluge.OptionsManager, { * @returns {Object} the value of the option */ getDefault: function(id, option) { - return (this.hasOption(id, option)) ? this.options[id][option] : this.defaults[option]; + return (this.has(id, option)) ? this.stored[id][option] : this.options[option]; }, - + + /** + * Returns the dirty (changed) values. + * @param {String} id + * @returns {Object} the changed options + */ + getDirty: function(id) { + return (this.changed[id]) ? this.changed[id] : {}; + }, + /** * Check to see if the option has been changed. * @param {String} id * @param {String} option * @returns {Boolean} true if the option has been changed, else false. */ - hasChanged: function(id, option) { + isDirty: function(id, option) { return (this.changed[id] && !Ext.isEmpty(this.changed[id][option])); }, - + /** * Check to see if an id has had an option set to something other than the * default value. @@ -153,8 +124,8 @@ Deluge.MultiOptionsManager = Ext.extend(Deluge.OptionsManager, { * @param {String} option * @returns {Boolean} true if the id has an option, else false. */ - hasOption: function(id, option) { - return (this.options[id] && !Ext.isEmpty(this.options[id][option])); + has: function(id, option) { + return (this.stored[id] && !Ext.isEmpty(this.stored[id][option])); }, /** @@ -165,7 +136,7 @@ Deluge.MultiOptionsManager = Ext.extend(Deluge.OptionsManager, { if (!this.changed[id]) return; delete this.changed[id]; }, - + /** * Sets the value of specified option for the passed in id. * @param {String} id @@ -178,11 +149,11 @@ Deluge.MultiOptionsManager = Ext.extend(Deluge.OptionsManager, { this.set(id, key, option[key]); } } else { - if (!this.options[id]) this.options[id] = {}; - this.options[id][option] = value; + if (!this.changed[id]) this.changed[id] = {}; + this.changed[id][option] = value; } }, - + /** * Update the value for the specified option and id. * @param {String} id @@ -190,59 +161,51 @@ Deluge.MultiOptionsManager = Ext.extend(Deluge.OptionsManager, { * @param {Object} [value]; */ update: function(id, option, value) { - if (typeof value === undefined) { + if (value === undefined) { for (var key in option) { this.update(id, key, option[key]); } } else { if (!this.changed[id]) this.changed[id] = {}; + + var defaultValue = this.getDefault(id, option); + value = this.convertValueType(defaultValue, value); var oldValue = this.get(id, option); if (oldValue == value) return; - - var defaultValue = this.getDefault(id, option); + if (defaultValue == value) { - if (this.hasChanged(id, option)) delete this.changed[id][option]; + if (this.isDirty(id, option)) delete this.changed[id][option]; this.fireEvent('changed', id, option, value, oldValue); return; + } else { + this.changed[id][option] = value; + this.fireEvent('changed', id, option, value, oldValue); } - - if (Ext.type(defaultValue) != Ext.type(value)) { - switch (Ext.type(defaultValue)) { - case 'string': - value = String(value); - break; - case 'number': - value = Number(value); - break; - case 'boolean': - value = Boolean(value); - break; - } - } - - this.changed[id][option] = value; - this.fireEvent('changed', id, option, value, oldValue); } }, - - /* Event Handlers */ - + + /****************** + * Event Handlers * + ******************/ /** * Stops a form fields value from being blocked by the change functions * @param {Ext.form.Field} field * @private */ - onFieldChange: function(field) { - var option = this.binds[field]; - this.update(this.currentId, option, field.getValue()); + onFieldChange: function(field, event) { + this.update(this.currentId, field._doption, field.getValue()); }, - + onChange: function(id, option, newValue, oldValue) { // If we don't have a bind there's nothing to do. if (Ext.isEmpty(this.binds[option])) return; - - // Set the form field to the new value. - this.binds[option].setValue(newValue); + Ext.each(this.binds[option], function(bind) { + // The field is currently focused so we don't want to + // change it. + if (bind == this.focused) return; + // Set the form field to the new value. + bind.setValue(newValue); + }, this); } -}); \ No newline at end of file +}); diff --git a/deluge/ui/web/js/Deluge.OptionsManager.js b/deluge/ui/web/js/Deluge.OptionsManager.js index d4e812b52..33f95fb01 100644 --- a/deluge/ui/web/js/Deluge.OptionsManager.js +++ b/deluge/ui/web/js/Deluge.OptionsManager.js @@ -95,7 +95,7 @@ Deluge.OptionsManager = Ext.extend(Ext.util.Observable, { this.options = Ext.apply(this.options, this.changed); this.reset(); }, - + /** * Converts the value so it matches the originals type * @param {Mixed} oldValue The original value @@ -103,183 +103,172 @@ Deluge.OptionsManager = Ext.extend(Ext.util.Observable, { */ convertValueType: function(oldValue, value) { if (Ext.type(oldValue) != Ext.type(value)) { - switch (Ext.type(oldValue)) { - case 'string': - value = String(value); - break; - case 'number': - value = Number(value); - break; - case 'boolean': - if (Ext.type(value) == 'string') { - value = value.toLowerCase(); - value = (value == 'true' || newValue == '1' || value == 'on') ? true : false; - } else { - value = Boolean(value); + switch (Ext.type(oldValue)) { + case 'string': + value = String(value); + break; + case 'number': + value = Number(value); + break; + case 'boolean': + if (Ext.type(value) == 'string') { + value = value.toLowerCase(); + value = (value == 'true' || value == '1' || value == 'on') ? true : false; + } else { + value = Boolean(value); + } + break; } - break; } - } - return value; + return value; }, - + /** * Get the value for an option or options. * @param {String} [option] A single option or an array of options to return. * @returns {Object} the options value. */ get: function() { - if (arguments.length == 1) { - var option = arguments[0]; - return (this.isDirty(option)) ? this.changed[option] : this.options[option]; - } else { - var options = {}; - Ext.each(arguments, function(option) { - if (!this.has(option)) return; - options[option] = (this.isDirty(option)) ? this.changed[option] : this.options[option]; - }, this); - return options; - } + if (arguments.length == 1) { + var option = arguments[0]; + return (this.isDirty(option)) ? this.changed[option] : this.options[option]; + } else { + var options = {}; + Ext.each(arguments, function(option) { + if (!this.has(option)) return; + options[option] = (this.isDirty(option)) ? this.changed[option] : this.options[option]; + }, this); + return options; + } }, - + /** * Get the default value for an option or options. * @param {String|Array} [option] A single option or an array of options to return. * @returns {Object} the value of the option */ getDefault: function(option) { - return this.options[option]; + return this.options[option]; }, - + /** * Returns the dirty (changed) values. * @returns {Object} the changed options */ getDirty: function() { - return this.changed; + return this.changed; }, - + /** * @param {String} [option] The option to check * @returns {Boolean} true if the option has been changed from the default. */ isDirty: function(option) { - return !Ext.isEmpty(this.changed[option]); + return !Ext.isEmpty(this.changed[option]); }, - - /** - * Check to see if the option has been changed. - * @param {String} id - * @param {String} option - * @returns {Boolean} true if the option has been changed, else false. - */ - hasChanged: function(id, option) { - return (this.changed[id] && !Ext.isEmpty(this.changed[id][option])); - }, - + /** * Check to see if an option exists in the options manager * @param {String} option * @returns {Boolean} true if the option exists, else false. */ has: function(option) { - return (this.options[option]); + return (this.options[option]); }, /** * Reset the options back to the default values. - * @param {String} id */ reset: function() { - this.changed = {}; + this.changed = {}; }, - + /** * Sets the value of specified option(s) for the passed in id. * @param {String} option * @param {Object} value The value for the option */ set: function(option, value) { - if (typeof option == 'object') { - var options = option; - this.options = Ext.apply(this.options, options); - for (var option in options) { - this.onChange(option, options[option]); + if (typeof option == 'object') { + var options = option; + this.options = Ext.apply(this.options, options); + for (var option in options) { + this.onChange(option, options[option]); + } + } else { + this.options[option] = value; + this.onChange(option, value) } - } else { - this.options[option] = value; - this.onChange(option, value) - } }, - + /** * Update the value for the specified option and id. * @param {String|Object} option or options to update * @param {Object} [value]; */ update: function(option, value) { - if (typeof value === undefined) { - for (var key in option) { - this.update(key, option[key]); - } - } else { - var defaultValue = this.getDefault(option); - value = this.convertValueType(defaultValue, value); - - var oldValue = this.get(option); - if (oldValue == value) return; - - if (defaultValue == value) { - if (this.isDirty(option)) delete this.changed[option]; - this.fireEvent('changed', option, value, oldValue); - return; - } + if (value === undefined) { + for (var key in option) { + this.update(key, option[key]); + } + } else { + var defaultValue = this.getDefault(option); + value = this.convertValueType(defaultValue, value); - this.changed[option] = value; - this.fireEvent('changed', option, value, oldValue); - } + var oldValue = this.get(option); + if (oldValue == value) return; + + if (defaultValue == value) { + if (this.isDirty(option)) delete this.changed[option]; + this.fireEvent('changed', option, value, oldValue); + return; + } + + this.changed[option] = value; + this.fireEvent('changed', option, value, oldValue); + } }, - - /* Event Handlers */ + + /****************** + * Event Handlers * + ******************/ /** * Lets the option manager know when a field is blurred so if a value * so value changing operations can continue on that field. */ onFieldBlur: function(field, event) { - if (this.focused == field) { - this.focused = null; - } + if (this.focused == field) { + this.focused = null; + } }, - + /** * Stops a form fields value from being blocked by the change functions * @param {Ext.form.Field} field * @private */ onFieldChange: function(field, event) { - this.update(field._doption, field.getValue()); + this.update(field._doption, field.getValue()); }, - + /** * Lets the option manager know when a field is focused so if a value * changing operation is performed it won't change the value of the * field. */ onFieldFocus: function(field, event) { - this.focused = field; + this.focused = field; }, - - onChange: function(option, newValue, oldValue) { - // If we don't have a bind there's nothing to do. - if (Ext.isEmpty(this.binds[option])) return; - - Ext.each(this.binds[option], function(bind) { - // The field is currently focused so we don't want to - // change it. - if (bind == this.focused) return; - // Set the form field to the new value. - bind.setValue(newValue); - }, this) + onChange: function(option, newValue, oldValue) { + // If we don't have a bind there's nothing to do. + if (Ext.isEmpty(this.binds[option])) return; + Ext.each(this.binds[option], function(bind) { + // The field is currently focused so we don't want to + // change it. + if (bind == this.focused) return; + // Set the form field to the new value. + bind.setValue(newValue); + }, this); } });