X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/7a654f8d43fdb43d78b63d90528bed6e86b608cc..6746dc89c47ed01b165cc1152533605f97eb8e8d:/ext-all-debug.js diff --git a/ext-all-debug.js b/ext-all-debug.js index 674494ad..ba428b54 100644 --- a/ext-all-debug.js +++ b/ext-all-debug.js @@ -1,9 +1,23 @@ +/* + +This file is part of Ext JS 4 + +Copyright (c) 2011 Sencha Inc + +Contact: http://www.sencha.com/contact + +GNU General Public License Usage +This file may be used under the terms of the GNU General Public License version 3.0 as published by the Free Software Foundation and appearing in the file LICENSE included in the packaging of this file. Please review the following information to ensure the GNU General Public License version 3.0 requirements will be met: http://www.gnu.org/copyleft/gpl.html. + +If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact. + +*/ (function() { var global = this, objectPrototype = Object.prototype, - toString = Object.prototype.toString, + toString = objectPrototype.toString, enumerables = true, enumerablesTest = { toString: 1 }, i; @@ -122,13 +136,6 @@ }; } - if (!superclass) { - Ext.Error.raise({ - sourceClass: 'Ext', - sourceMethod: 'extend', - msg: 'Attempting to extend from a class which has not been loaded on the page.' - }); - } var F = function() {}, @@ -222,11 +229,6 @@ return 'object'; } - Ext.Error.raise({ - sourceClass: 'Ext', - sourceMethod: 'typeOf', - msg: 'Failed to determine the type of the specified value "' + value + '". This is most likely a bug.' - }); }, @@ -247,7 +249,8 @@ isObject: (toString.call(null) === '[object Object]') ? function(value) { - return value !== null && value !== undefined && toString.call(value) === '[object Object]' && value.nodeType === undefined; + + return value !== null && value !== undefined && toString.call(value) === '[object Object]' && value.ownerDocument === undefined; } : function(value) { return toString.call(value) === '[object Object]'; @@ -292,7 +295,7 @@ isElement: function(value) { - return value ? value.nodeType !== undefined : false; + return value ? value.nodeType === 1 : false; }, @@ -372,7 +375,7 @@ var i = 0; do { - uniqueGlobalNamespace = 'ExtSandbox' + (++i); + uniqueGlobalNamespace = 'ExtBox' + (++i); } while (Ext.global[uniqueGlobalNamespace] !== undefined); Ext.global[uniqueGlobalNamespace] = Ext; @@ -404,7 +407,7 @@ (function() { -var version = '4.0.0', Version; +var version = '4.0.2', Version; Ext.Version = Version = Ext.extend(Object, { @@ -592,6 +595,7 @@ Ext.String = { * Convert certain characters (&, <, >, and ') to their HTML character equivalents for literal display in web pages. * @param {String} value The string to encode * @return {String} The encoded text + * @method */ htmlEncode: (function() { var entities = { @@ -729,6 +733,26 @@ Ext.Number = { }, + snap : function(value, increment, minValue, maxValue) { + var newValue = value, + m; + + if (!(increment && value)) { + return value; + } + m = value % increment; + if (m !== 0) { + newValue -= m; + if (m * 2 >= increment) { + newValue += increment; + } else if (m * 2 < -increment) { + newValue -= increment; + } + } + return Ext.Number.constrain(newValue, minValue, maxValue); + }, + + toFixed: function(value, precision) { if (isToFixedBroken) { precision = precision || 0; @@ -760,6 +784,34 @@ Ext.num = function() { var arrayPrototype = Array.prototype, slice = arrayPrototype.slice, + supportsSplice = function () { + var array = [], + lengthBefore, + j = 20; + + if (!array.splice) { + return false; + } + + + + + while (j--) { + array.push("A"); + } + + array.splice(15, 0, "F", "F", "F", "F", "F","F","F","F","F","F","F","F","F","F","F","F","F","F","F","F","F"); + + lengthBefore = array.length; + array.splice(13, 0, "XXX"); + + if (lengthBefore+1 != array.length) { + return false; + } + + + return true; + }(), supportsForEach = 'forEach' in arrayPrototype, supportsMap = 'map' in arrayPrototype, supportsIndexOf = 'indexOf' in arrayPrototype, @@ -772,6 +824,7 @@ Ext.num = function() { }(), supportsSliceOnNodeList = true, ExtArray; + try { if (typeof document !== 'undefined') { @@ -781,6 +834,99 @@ Ext.num = function() { supportsSliceOnNodeList = false; } + function fixArrayIndex (array, index) { + return (index < 0) ? Math.max(0, array.length + index) + : Math.min(array.length, index); + } + + + function replaceSim (array, index, removeCount, insert) { + var add = insert ? insert.length : 0, + length = array.length, + pos = fixArrayIndex(array, index); + + + if (pos === length) { + if (add) { + array.push.apply(array, insert); + } + } else { + var remove = Math.min(removeCount, length - pos), + tailOldPos = pos + remove, + tailNewPos = tailOldPos + add - remove, + tailCount = length - tailOldPos, + lengthAfterRemove = length - remove, + i; + + if (tailNewPos < tailOldPos) { + for (i = 0; i < tailCount; ++i) { + array[tailNewPos+i] = array[tailOldPos+i]; + } + } else if (tailNewPos > tailOldPos) { + for (i = tailCount; i--; ) { + array[tailNewPos+i] = array[tailOldPos+i]; + } + } + + if (add && pos === lengthAfterRemove) { + array.length = lengthAfterRemove; + array.push.apply(array, insert); + } else { + array.length = lengthAfterRemove + add; + for (i = 0; i < add; ++i) { + array[pos+i] = insert[i]; + } + } + } + + return array; + } + + function replaceNative (array, index, removeCount, insert) { + if (insert && insert.length) { + if (index < array.length) { + array.splice.apply(array, [index, removeCount].concat(insert)); + } else { + array.push.apply(array, insert); + } + } else { + array.splice(index, removeCount); + } + return array; + } + + function eraseSim (array, index, removeCount) { + return replaceSim(array, index, removeCount); + } + + function eraseNative (array, index, removeCount) { + array.splice(index, removeCount); + return array; + } + + function spliceSim (array, index, removeCount) { + var pos = fixArrayIndex(array, index), + removed = array.slice(index, fixArrayIndex(array, pos+removeCount)); + + if (arguments.length < 4) { + replaceSim(array, pos, removeCount); + } else { + replaceSim(array, pos, removeCount, slice.call(arguments, 3)); + } + + return removed; + } + + function spliceNative (array) { + return array.splice.apply(array, slice.call(arguments, 1)); + } + + var erase = supportsSplice ? eraseNative : eraseSim, + replace = supportsSplice ? replaceNative : replaceSim, + splice = supportsSplice ? spliceNative : spliceSim; + + + ExtArray = Ext.Array = { each: function(array, fn, scope, reverse) { @@ -915,9 +1061,6 @@ Ext.num = function() { every: function(array, fn, scope) { - if (!fn) { - Ext.Error.raise('Ext.Array.every must have a callback function passed as second argument.'); - } if (supportsEvery) { return array.every(fn, scope); } @@ -936,9 +1079,6 @@ Ext.num = function() { some: function(array, fn, scope) { - if (!fn) { - Ext.Error.raise('Ext.Array.some must have a callback function passed as second argument.'); - } if (supportsSome) { return array.some(fn, scope); } @@ -1032,7 +1172,7 @@ Ext.num = function() { var index = ExtArray.indexOf(array, item); if (index !== -1) { - array.splice(index, 1); + erase(array, index, 1); } return array; @@ -1081,8 +1221,8 @@ Ext.num = function() { } } - minArray = Ext.Array.unique(minArray); - arrays.splice(x, 1); + minArray = ExtArray.unique(minArray); + erase(arrays, x, 1); @@ -1116,7 +1256,7 @@ Ext.num = function() { for (i = 0,lnB = arrayB.length; i < lnB; i++) { for (j = 0; j < ln; j++) { if (clone[j] === arrayB[i]) { - clone.splice(j, 1); + erase(clone, j, 1); j--; ln--; } @@ -1127,6 +1267,11 @@ Ext.num = function() { }, + slice: function(array, begin, end) { + return slice.call(array, begin, end); + }, + + sort: function(array, sortFn) { if (supportsSort) { if (sortFn) { @@ -1249,48 +1394,61 @@ Ext.num = function() { } return sum; - } + }, + + + + erase: erase, + + + insert: function (array, index, items) { + return replace(array, index, 0, items); + }, + + replace: replace, + + + splice: splice }; - Ext.each = Ext.Array.each; + Ext.each = ExtArray.each; - Ext.Array.union = Ext.Array.merge; + ExtArray.union = ExtArray.merge; - Ext.min = Ext.Array.min; + Ext.min = ExtArray.min; - Ext.max = Ext.Array.max; + Ext.max = ExtArray.max; - Ext.sum = Ext.Array.sum; + Ext.sum = ExtArray.sum; - Ext.mean = Ext.Array.mean; + Ext.mean = ExtArray.mean; - Ext.flatten = Ext.Array.flatten; + Ext.flatten = ExtArray.flatten; - Ext.clean = Ext.Array.clean; + Ext.clean = ExtArray.clean; - Ext.unique = Ext.Array.unique; + Ext.unique = ExtArray.unique; - Ext.pluck = Ext.Array.pluck; + Ext.pluck = ExtArray.pluck; Ext.toArray = function() { return ExtArray.toArray.apply(ExtArray, arguments); - } + }; })(); - Ext.Function = { @@ -1325,22 +1483,21 @@ Ext.Function = { }; }, - + bind: function(fn, scope, args, appendArgs) { var method = fn, - applyArgs; + slice = Array.prototype.slice; return function() { var callArgs = args || arguments; if (appendArgs === true) { - callArgs = Array.prototype.slice.call(arguments, 0); + callArgs = slice.call(arguments, 0); callArgs = callArgs.concat(args); } else if (Ext.isNumber(appendArgs)) { - callArgs = Array.prototype.slice.call(arguments, 0); - applyArgs = [appendArgs, 0].concat(args); - Array.prototype.splice.apply(callArgs, applyArgs); + callArgs = slice.call(arguments, 0); + Ext.Array.insert(callArgs, appendArgs, args); } return method.apply(scope || window, callArgs); @@ -1577,15 +1734,6 @@ var ExtObject = Ext.Object = { matchedKeys = name.match(/(\[):?([^\]]*)\]/g); matchedName = name.match(/^([^\[]+)/); - if (!matchedName) { - Ext.Error.raise({ - sourceClass: "Ext.Object", - sourceMethod: "fromQueryString", - queryString: queryString, - recursive: recursive, - msg: 'Malformed query string given, failed parsing name from "' + part + '"' - }); - } name = matchedName[0]; keys = []; @@ -2674,13 +2822,6 @@ var Base = Ext.Base = function() {}; parentClass, methodName; if (!method.$owner) { - if (!method.caller) { - Ext.Error.raise({ - sourceClass: Ext.getClassName(this), - sourceMethod: "callParent", - msg: "Attempting to call a protected method from the public scope, which is not allowed" - }); - } method = method.caller; } @@ -2688,14 +2829,6 @@ var Base = Ext.Base = function() {}; parentClass = method.$owner.superclass; methodName = method.$name; - if (!(methodName in parentClass)) { - Ext.Error.raise({ - sourceClass: Ext.getClassName(this), - sourceMethod: methodName, - msg: "this.callParent() was called but there's no such method (" + methodName + - ") found in the parent class (" + (Ext.getClassName(parentClass) || 'Object') + ")" - }); - } return parentClass[methodName].apply(this, args || []); }, @@ -2717,22 +2850,6 @@ var Base = Ext.Base = function() {}; callOverridden: function(args) { var method = this.callOverridden.caller; - if (!method.$owner) { - Ext.Error.raise({ - sourceClass: Ext.getClassName(this), - sourceMethod: "callOverridden", - msg: "Attempting to call a protected method from the public scope, which is not allowed" - }); - } - - if (!method.$previous) { - Ext.Error.raise({ - sourceClass: Ext.getClassName(this), - sourceMethod: "callOverridden", - msg: "this.callOverridden was called in '" + method.$name + - "' but this method has never been overridden" - }); - } return method.$previous.apply(this, args || []); }, @@ -2769,11 +2886,6 @@ var Base = Ext.Base = function() {}; }; } - var className; - className = Ext.getClassName(this); - if (className) { - fn.displayName = className + '#' + name; - } fn.$owner = this; fn.$name = name; @@ -2795,7 +2907,6 @@ var Base = Ext.Base = function() {}; implement: function(members) { var prototype = this.prototype, name, i, member, previous; - var className = Ext.getClassName(this); for (name in members) { if (members.hasOwnProperty(name)) { member = members[name]; @@ -2803,9 +2914,6 @@ var Base = Ext.Base = function() {}; if (typeof member === 'function') { member.$owner = this; member.$name = name; - if (className) { - member.displayName = className + '#' + name; - } } prototype[name] = member; @@ -3090,13 +3198,14 @@ var Base = Ext.Base = function() {}; index = Ext.Array.indexOf(defaultPreprocessors, relativeName); if (index !== -1) { - defaultPreprocessors.splice(Math.max(0, index + offset), 0, name); + Ext.Array.splice(defaultPreprocessors, Math.max(0, index + offset), 0, name); } return this; } }); + Class.registerPreprocessor('extend', function(cls, data) { var extend = data.extend, base = Ext.Base, @@ -3163,6 +3272,7 @@ var Base = Ext.Base = function() {}; }, true); + Class.registerPreprocessor('statics', function(cls, data) { var statics = data.statics, name; @@ -3176,6 +3286,7 @@ var Base = Ext.Base = function() {}; delete data.statics; }); + Class.registerPreprocessor('inheritableStatics', function(cls, data) { var statics = data.inheritableStatics, inheritableStatics, @@ -3198,12 +3309,14 @@ var Base = Ext.Base = function() {}; delete data.inheritableStatics; }); + Class.registerPreprocessor('mixins', function(cls, data) { cls.mixin(data.mixins); delete data.mixins; }); + Class.registerPreprocessor('config', function(cls, data) { var prototype = cls.prototype; @@ -3317,20 +3430,11 @@ var Base = Ext.Base = function() {}; instantiators: [], - - instantiationCounts: {}, isCreated: function(className) { var i, ln, part, root, parts; - if (typeof className !== 'string' || className.length < 1) { - Ext.Error.raise({ - sourceClass: "Ext.ClassManager", - sourceMethod: "exist", - msg: "Invalid classname, must be a string and must not be empty" - }); - } if (this.classes.hasOwnProperty(className) || this.existCache.hasOwnProperty(className)) { return true; @@ -3362,13 +3466,6 @@ var Base = Ext.Base = function() {}; parseNamespace: function(namespace) { - if (typeof namespace !== 'string') { - Ext.Error.raise({ - sourceClass: "Ext.ClassManager", - sourceMethod: "parseNamespace", - msg: "Invalid namespace, must be a string" - }); - } var cache = this.namespaceParseCache; @@ -3516,10 +3613,6 @@ var Base = Ext.Base = function() {}; } if (alias && aliasToNameMap[alias] !== className) { - if (aliasToNameMap.hasOwnProperty(alias) && Ext.isDefined(Ext.global.console)) { - Ext.global.console.log("[Ext.ClassManager] Overriding existing alias: '" + alias + "' " + - "of: '" + aliasToNameMap[alias] + "' with: '" + className + "'. Be sure it's intentional."); - } aliasToNameMap[alias] = className; } @@ -3569,13 +3662,6 @@ var Base = Ext.Base = function() {}; create: function(className, data, createdFn) { var manager = this; - if (typeof className !== 'string') { - Ext.Error.raise({ - sourceClass: "Ext", - sourceMethod: "define", - msg: "Invalid class name '" + className + "' specified, must be a non-empty string" - }); - } data.$className = className; @@ -3641,18 +3727,7 @@ var Base = Ext.Base = function() {}; if (!className) { className = this.maps.aliasToName[alias]; - if (!className) { - Ext.Error.raise({ - sourceClass: "Ext", - sourceMethod: "createByAlias", - msg: "Cannot create an instance of unrecognized alias: " + alias - }); - } - if (Ext.global.console) { - Ext.global.console.warn("[Ext.Loader] Synchronously loading '" + className + "'; consider adding " + - "Ext.require('" + alias + "') above Ext.onReady"); - } Ext.syncRequire(className); } @@ -3670,13 +3745,6 @@ var Base = Ext.Base = function() {}; possibleName, cls; if (typeof name !== 'function') { - if ((typeof name !== 'string' || name.length < 1)) { - Ext.Error.raise({ - sourceClass: "Ext", - sourceMethod: "create", - msg: "Invalid class name or alias '" + name + "' specified, must be a non-empty string" - }); - } cls = this.get(name); } @@ -3708,37 +3776,13 @@ var Base = Ext.Base = function() {}; if (!cls) { - if (Ext.global.console) { - Ext.global.console.warn("[Ext.Loader] Synchronously loading '" + name + "'; consider adding " + - "Ext.require('" + ((possibleName) ? alias : name) + "') above Ext.onReady"); - } Ext.syncRequire(name); cls = this.get(name); } - if (!cls) { - Ext.Error.raise({ - sourceClass: "Ext", - sourceMethod: "create", - msg: "Cannot create an instance of unrecognized class name / alias: " + alias - }); - } - - if (typeof cls !== 'function') { - Ext.Error.raise({ - sourceClass: "Ext", - sourceMethod: "create", - msg: "'" + name + "' is a singleton and cannot be instantiated" - }); - } - - if (!this.instantiationCounts[name]) { - this.instantiationCounts[name] = 0; - } - this.instantiationCounts[name]++; return this.getInstantiator(args.length)(cls, args); }, @@ -3814,7 +3858,7 @@ var Base = Ext.Base = function() {}; index = Ext.Array.indexOf(defaultPostprocessors, relativeName); if (index !== -1) { - defaultPostprocessors.splice(Math.max(0, index + offset), 0, name); + Ext.Array.splice(defaultPostprocessors, Math.max(0, index + offset), 0, name); } return this; @@ -3826,13 +3870,6 @@ var Base = Ext.Base = function() {}; names = [], name, alias, aliases, possibleName, regex, i, ln; - if (typeof expression !== 'string' || expression.length < 1) { - Ext.Error.raise({ - sourceClass: "Ext.ClassManager", - sourceMethod: "getNamesByExpression", - msg: "Expression " + expression + " is invalid, must be a non-empty string" - }); - } if (expression.indexOf('*') !== -1) { expression = expression.replace(/\*/g, '(.*?)'); @@ -3878,6 +3915,7 @@ var Base = Ext.Base = function() {}; } }; + Manager.registerPostprocessor('alias', function(name, cls, data) { var aliases = data.alias, widgetPrefix = 'widget.', @@ -3890,13 +3928,6 @@ var Base = Ext.Base = function() {}; for (i = 0, ln = aliases.length; i < ln; i++) { alias = aliases[i]; - if (typeof alias !== 'string') { - Ext.Error.raise({ - sourceClass: "Ext", - sourceMethod: "define", - msg: "Invalid alias of: '" + alias + "' for class: '" + name + "'; must be a valid string" - }); - } this.setAlias(cls, alias); } @@ -3913,11 +3944,13 @@ var Base = Ext.Base = function() {}; } }); + Manager.registerPostprocessor('singleton', function(name, cls, data, fn) { fn.call(this, name, new cls(), data); return false; }); + Manager.registerPostprocessor('alternateClassName', function(name, cls, data) { var alternates = data.alternateClassName, i, ln, alternate; @@ -3929,13 +3962,6 @@ var Base = Ext.Base = function() {}; for (i = 0, ln = alternates.length; i < ln; i++) { alternate = alternates[i]; - if (typeof alternate !== 'string') { - Ext.Error.raise({ - sourceClass: "Ext", - sourceMethod: "define", - msg: "Invalid alternate of: '" + alternate + "' for class: '" + name + "'; must be a valid string" - }); - } this.set(alternate, cls); } @@ -4028,6 +4054,7 @@ var Base = Ext.Base = function() {}; namespace: alias(Manager, 'createNamespaces') }); + Ext.createWidget = Ext.widget; @@ -4036,7 +4063,6 @@ var Base = Ext.Base = function() {}; Class.registerPreprocessor('className', function(cls, data) { if (data.$className) { cls.$className = data.$className; - cls.displayName = cls.$className; } }, true); @@ -4045,7 +4071,6 @@ var Base = Ext.Base = function() {}; })(Ext.Class, Ext.Function.alias); - (function(Manager, Class, flexSetter, alias) { var @@ -4203,7 +4228,7 @@ var Base = Ext.Base = function() {}; do { if (Manager.isCreated(requires[j])) { - requires.splice(j, 1); + Ext.Array.erase(requires, j, 1); } else { j++; @@ -4211,7 +4236,7 @@ var Base = Ext.Base = function() {}; } while (j < requires.length); if (item.requires.length === 0) { - this.queue.splice(i, 1); + Ext.Array.erase(this.queue, i, 1); item.callback.call(item.scope); this.refreshQueue(); break; @@ -4459,48 +4484,7 @@ var Base = Ext.Base = function() {}; this.refreshQueue(); } - if (this.numPendingFiles <= 1) { - window.status = "Finished loading all dependencies, onReady fired!"; - } - else { - window.status = "Loading dependencies, " + this.numPendingFiles + " files left..."; - } - - if (!this.syncModeEnabled && this.numPendingFiles === 0 && this.isLoading && !this.hasFileLoadError) { - var queue = this.queue, - requires, - i, ln, j, subLn, missingClasses = [], missingPaths = []; - - for (i = 0, ln = queue.length; i < ln; i++) { - requires = queue[i].requires; - for (j = 0, subLn = requires.length; j < ln; j++) { - if (this.isFileLoaded[requires[j]]) { - missingClasses.push(requires[j]); - } - } - } - - if (missingClasses.length < 1) { - return; - } - - missingClasses = Ext.Array.filter(missingClasses, function(item) { - return !this.requiresMap.hasOwnProperty(item); - }, this); - - for (i = 0,ln = missingClasses.length; i < ln; i++) { - missingPaths.push(this.classNameToFilePathMap[missingClasses[i]]); - } - - Ext.Error.raise({ - sourceClass: "Ext.Loader", - sourceMethod: "onFileLoaded", - msg: "The following classes are not declared even if their files have been " + - "loaded: '" + missingClasses.join("', '") + "'. Please check the source code of their " + - "corresponding files for possible typos: '" + missingPaths.join("', '") + "'" - }); - } }, @@ -4508,13 +4492,6 @@ var Base = Ext.Base = function() {}; this.numPendingFiles--; this.hasFileLoadError = true; - Ext.Error.raise({ - sourceClass: "Ext.Loader", - classToLoad: className, - loadPath: filePath, - loadingType: isSynchronous ? 'synchronous' : 'async', - msg: errorMessage - }); }, @@ -4612,6 +4589,7 @@ var Base = Ext.Base = function() {}; Loader.onReady(fn, scope, true, options); }; + Class.registerPreprocessor('loader', function(cls, data, continueFn) { var me = this, dependencies = [], @@ -4657,37 +4635,6 @@ var Base = Ext.Base = function() {}; return; } - var deadlockPath = [], - requiresMap = Loader.requiresMap, - detectDeadlock; - - - - if (className) { - requiresMap[className] = dependencies; - - detectDeadlock = function(cls) { - deadlockPath.push(cls); - - if (requiresMap[cls]) { - if (Ext.Array.contains(requiresMap[cls], className)) { - Ext.Error.raise({ - sourceClass: "Ext.Loader", - msg: "Deadlock detected while loading dependencies! '" + className + "' and '" + - deadlockPath[1] + "' " + "mutually require each other. Path: " + - deadlockPath.join(' -> ') + " -> " + deadlockPath[0] - }); - } - - for (i = 0, ln = requiresMap[cls].length; i < ln; i++) { - detectDeadlock(requiresMap[cls][i]); - } - } - }; - - detectDeadlock(className); - } - Loader.require(dependencies, function() { for (i = 0, ln = dependencyProperties.length; i < ln; i++) { @@ -4730,6 +4677,7 @@ var Base = Ext.Base = function() {}; Class.setDefaultPreprocessorPosition('loader', 'after', 'className'); + Manager.registerPostprocessor('uses', function(name, cls, data) { var uses = Ext.Array.from(data.uses), items = [], @@ -4757,6 +4705,9 @@ Ext.Error = Ext.extend(Error, { ignore: false, + + + raise: function(err){ err = err || {}; if (Ext.isString(err)) { @@ -4775,28 +4726,15 @@ Ext.Error = Ext.extend(Error, { } if (Ext.Error.handle(err) !== true) { - var global = Ext.global, - con = global.console, - msg = Ext.Error.prototype.toString.call(err), - noConsoleMsg = 'An uncaught error was raised: "' + msg + - '". Use Firebug or Webkit console for additional details.'; - - if (con) { - if (con.dir) { - con.warn('An uncaught error was raised with the following data:'); - con.dir(err); - } - else { - con.warn(noConsoleMsg); - } - if (con.error) { - con.error(msg); - } - } - else if (global.alert){ - global.alert(noConsoleMsg); - } - + var msg = Ext.Error.prototype.toString.call(err); + + Ext.log({ + msg: msg, + level: 'error', + dump: err, + stack: true + }); + throw new Ext.Error(err); } }, @@ -4808,11 +4746,20 @@ Ext.Error = Ext.extend(Error, { }, + name: 'Ext.Error', + + constructor: function(config){ if (Ext.isString(config)) { config = { msg: config }; } - Ext.apply(this, config); + + var me = this; + + Ext.apply(me, config); + + me.message = me.message || me.msg; + }, @@ -4829,6 +4776,9 @@ Ext.Error = Ext.extend(Error, { + + + Ext.JSON = new(function() { var useHasOwn = !! {}.hasOwnProperty, isNative = function() { @@ -4952,7 +4902,7 @@ Ext.JSON = new(function() { Ext.Error.raise({ sourceClass: "Ext.JSON", sourceMethod: "decode", - msg: "You're trying to decode and invalid JSON String: " + json + msg: "You're trying to decode an invalid JSON String: " + json }); } }; @@ -4986,15 +4936,23 @@ Ext.apply(Ext, { id: function(el, prefix) { + var me = this, + sandboxPrefix = ''; el = Ext.getDom(el, true) || {}; if (el === document) { - el.id = this.documentId; + el.id = me.documentId; } else if (el === window) { - el.id = this.windowId; + el.id = me.windowId; } if (!el.id) { - el.id = (prefix || "ext-gen") + (++Ext.idSeed); + if (me.isSandboxed) { + if (!me.uniqueGlobalNamespace) { + me.getUniqueGlobalNamespace(); + } + sandboxPrefix = me.uniqueGlobalNamespace + '-'; + } + el.id = sandboxPrefix + (prefix || "ext-gen") + (++Ext.idSeed); } return el.id; }, @@ -5091,6 +5049,7 @@ Ext.ns = Ext.namespace; window.undefined = window.undefined; + (function(){ var check = function(regex){ return regex.test(Ext.userAgent); @@ -5118,14 +5077,15 @@ window.undefined = window.undefined; isWindows = check(/windows|win32/), isMac = check(/macintosh|mac os x/), isLinux = check(/linux/), - scrollWidth = null; + scrollbarSize = null, + webKitVersion = isWebKit && (/webkit\/(\d+\.\d+)/.exec(Ext.userAgent)); try { document.execCommand("BackgroundImageCache", false, true); } catch(e) {} - Ext.setVersion('extjs', '4.0.0'); + Ext.setVersion('extjs', '4.0.2'); Ext.apply(Ext, { SSL_SECURE_URL : Ext.isSecure && isIE ? 'javascript:""' : 'about:blank', @@ -5254,6 +5214,9 @@ window.undefined = window.undefined; isMac : isMac, + webKitVersion: webKitVersion ? parseFloat(webKitVersion[1]) : -1, + + BLANK_IMAGE_URL : (isIE6 || isIE7) ? 'http:/' + '/www.sencha.com/s.gif' : 'data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', @@ -5291,27 +5254,37 @@ window.undefined = window.undefined; }, - getScrollBarWidth: function(force){ + getScrollbarSize: function (force) { if(!Ext.isReady){ return 0; } - if(force === true || scrollWidth === null){ + if(force === true || scrollbarSize === null){ - var cssClass = Ext.isIE9 ? '' : Ext.baseCSSPrefix + 'hide-offsets'; + var cssClass = Ext.isIE9 ? '' : Ext.baseCSSPrefix + 'hide-offsets', - var div = Ext.getBody().createChild('
'), - child = div.child('div', true); - var w1 = child.offsetWidth; + div = Ext.getBody().createChild('
'), + child = div.child('div', true), + w1 = child.offsetWidth; + div.setStyle('overflow', (Ext.isWebKit || Ext.isGecko) ? 'auto' : 'scroll'); - var w2 = child.offsetWidth; + + var w2 = child.offsetWidth, width = w1 - w2; div.remove(); + - scrollWidth = w1 - w2 + 2; + scrollbarSize = { width: width, height: width }; } - return scrollWidth; + + return scrollbarSize; + }, + + + getScrollBarWidth: function(force){ + var size = Ext.getScrollbarSize(force); + return size.width + 2; }, @@ -5328,7 +5301,7 @@ window.undefined = window.undefined; }, - destroyMembers : function(o, arg1, arg2, etc){ + destroyMembers : function(o){ for (var i = 1, a = arguments, len = a.length; i < len; i++) { Ext.destroy(o[a[i]]); delete o[a[i]]; @@ -5336,6 +5309,10 @@ window.undefined = window.undefined; }, + log : function (message) { + }, + + partition : function(arr, truth){ var ret = [[],[]]; Ext.each(arr, function(v, i, a) { @@ -5555,8 +5532,7 @@ Ext.application = function(config) { }, - number: - function(v, formatString) { + number: function(v, formatString) { if (!formatString) { return v; } @@ -5593,13 +5569,6 @@ Ext.application = function(config) { if (1 < psplit.length) { v = v.toFixed(psplit[1].length); } else if(2 < psplit.length) { - Ext.Error.raise({ - sourceClass: "Ext.util.Format", - sourceMethod: "number", - value: v, - formatString: formatString, - msg: "Invalid number format, should have no more than 1 decimal" - }); } else { v = v.toFixed(0); } @@ -5633,6 +5602,11 @@ Ext.application = function(config) { fnum = psplit[0] + dec + psplit[1]; } } + + if (neg) { + + neg = fnum.replace(/[^1-9]/g, '') !== ''; + } return (neg ? '-' : '') + formatString.replace(/[\d,?\.?]+/, fnum); }, @@ -5982,12 +5956,33 @@ Ext.supports = { { identity: 'RightMargin', - fn: function(doc, div, view) { - view = doc.defaultView; + fn: function(doc, div) { + var view = doc.defaultView; return !(view && view.getComputedStyle(div.firstChild.firstChild, null).marginRight != '0px'); } }, + + + { + identity: 'DisplayChangeInputSelectionBug', + fn: function() { + var webKitVersion = Ext.webKitVersion; + + return 0 < webKitVersion && webKitVersion < 533; + } + }, + + { + identity: 'DisplayChangeTextAreaSelectionBug', + fn: function() { + var webKitVersion = Ext.webKitVersion; + + + return 0 < webKitVersion && webKitVersion < 534.24; + } + }, + { identity: 'TransparentColor', @@ -6189,8 +6184,16 @@ Ext.supports = { return range && !!range.createContextualFragment; } - } + }, + + { + identity: 'WindowOnError', + fn: function () { + + return Ext.isIE || Ext.isGecko || Ext.webKitVersion >= 534.16; + } + } ] }; @@ -6491,13 +6494,6 @@ Ext.core.DomHelper = function(){ return el[rangeEl]; } } - Ext.Error.raise({ - sourceClass: 'Ext.core.DomHelper', - sourceMethod: 'insertHtml', - htmlToInsert: html, - targetElement: el, - msg: 'Illegal insertion point reached: "' + where + '"' - }); }, @@ -6976,11 +6972,6 @@ Ext.core.DomQuery = Ext.DomQuery = function(){ } if(!matched){ - Ext.Error.raise({ - sourceClass: 'Ext.DomQuery', - sourceMethod: 'compile', - msg: 'Error parsing selector. Parsing failed at "' + path + '"' - }); } } if(modeMatch[1]){ @@ -7014,11 +7005,6 @@ Ext.core.DomQuery = Ext.DomQuery = function(){ if(!cache[subPath]){ cache[subPath] = Ext.DomQuery.compile(subPath); if(!cache[subPath]){ - Ext.Error.raise({ - sourceClass: 'Ext.DomQuery', - sourceMethod: 'jsSelect', - msg: subPath + ' is not a valid selector' - }); } } var result = cache[subPath](root); @@ -7039,6 +7025,7 @@ Ext.core.DomQuery = Ext.DomQuery = function(){ var docEl = (el ? el.ownerDocument || el : 0).documentElement; return docEl ? docEl.nodeName !== "HTML" : false; }, + select : document.querySelectorAll ? function(path, root, type) { root = root || document; @@ -7520,9 +7507,6 @@ Ext.query = Ext.DomQuery.select; if (!unitPattern.test(size)) { - if (Ext.isDefined(Ext.global.console)) { - Ext.global.console.warn("Warning, size detected as NaN on Element.addUnits."); - } return size || ''; } return size; @@ -8108,11 +8092,11 @@ Ext.core.Element.addMethods({ cls = [], space = ((me.dom.className.replace(trimRe, '') == '') ? "" : " "), i, len, v; - if (!Ext.isDefined(className)) { + if (className === undefined) { return me; } - if (!Ext.isArray(className)) { + if (Object.prototype.toString.call(className) !== '[object Array]') { if (typeof className === 'string') { className = className.replace(trimRe, '').split(spacesRe); if (className.length === 1) { @@ -8142,10 +8126,10 @@ Ext.core.Element.addMethods({ removeCls : function(className){ var me = this, i, idx, len, cls, elClasses; - if (!Ext.isDefined(className)) { + if (className === undefined) { return me; } - if (!Ext.isArray(className)){ + if (Object.prototype.toString.call(className) !== '[object Array]') { className = className.replace(trimRe, '').split(spacesRe); } if (me.dom && me.dom.className) { @@ -8156,7 +8140,7 @@ Ext.core.Element.addMethods({ cls = cls.replace(trimRe, ''); idx = Ext.Array.indexOf(elClasses, cls); if (idx != -1) { - elClasses.splice(idx, 1); + Ext.Array.erase(elClasses, idx, 1); } } } @@ -8223,7 +8207,7 @@ Ext.core.Element.addMethods({ return view && view.getComputedStyle ? function(prop){ var el = this.dom, - v, cs, out, display; + v, cs, out, display, cleaner; if(el == document){ return null; @@ -8235,10 +8219,12 @@ Ext.core.Element.addMethods({ if(prop == 'marginRight' && out != '0px' && !supports.RightMargin){ + cleaner = Ext.core.Element.getRightMarginFixCleaner(el); display = this.getStyle('display'); el.style.display = 'inline-block'; out = view.getComputedStyle(el, '').marginRight; el.style.display = display; + cleaner(); } if(prop == 'backgroundColor' && out == 'rgba(0, 0, 0, 0)' && !supports.TransparentColor){ @@ -8300,8 +8286,7 @@ Ext.core.Element.addMethods({ if (!me.dom) { return me; } - - if (!Ext.isObject(prop)) { + if (typeof prop === 'string') { tmp = {}; tmp[prop] = value; prop = tmp; @@ -8654,7 +8639,8 @@ Ext.core.Element.addMethods({ setSize : function(width, height, animate){ var me = this; - if (Ext.isObject(width)){ + if (Ext.isObject(width)) { + animate = height; height = width.height; width = width.width; } @@ -8665,7 +8651,7 @@ Ext.core.Element.addMethods({ me.dom.style.height = me.addUnits(height); } else { - if (!Ext.isObject(animate)) { + if (animate === true) { animate = {}; } me.animate(Ext.applyIf({ @@ -10026,7 +10012,7 @@ Ext.CompositeElementLite.prototype = { d.parentNode.insertBefore(replacement, d); Ext.removeNode(d); } - this.elements.splice(index, 1, replacement); + Ext.Array.splice(this.elements, index, 1, replacement); } return this; }, @@ -10071,13 +10057,6 @@ Ext.core.Element.select = function(selector, root){ }else if(selector.length !== undefined){ els = selector; }else{ - Ext.Error.raise({ - sourceClass: "Ext.core.Element", - sourceMethod: "select", - selector: selector, - root: root, - msg: "Invalid selector specified: " + selector - }); } return new Ext.CompositeElementLite(els); }; @@ -10153,13 +10132,6 @@ Ext.require('Ext.util.DelayedTask', function() { listener; scope = scope || me.observable; - if (!fn) { - Ext.Error.raise({ - sourceClass: Ext.getClassName(this.observable), - sourceMethod: "addListener", - msg: "The specified callback function is undefined" - }); - } if (!me.isListening(fn, scope)) { listener = me.createListener(fn, scope, options); @@ -10251,7 +10223,7 @@ Ext.require('Ext.util.DelayedTask', function() { } - me.listeners.splice(index, 1); + Ext.Array.erase(me.listeners, index, 1); return true; } @@ -10519,7 +10491,7 @@ Ext.EventManager = { addListener: function(element, eventName, fn, scope, options){ - if (Ext.isObject(eventName)) { + if (typeof eventName !== 'string') { this.prepareListenerConfig(element, eventName); return; } @@ -10528,24 +10500,6 @@ Ext.EventManager = { bind, wrap; - if (!dom){ - Ext.Error.raise({ - sourceClass: 'Ext.EventManager', - sourceMethod: 'addListener', - targetElement: element, - eventName: eventName, - msg: 'Error adding "' + eventName + '\" listener for nonexistent element "' + element + '"' - }); - } - if (!fn) { - Ext.Error.raise({ - sourceClass: 'Ext.EventManager', - sourceMethod: 'addListener', - targetElement: element, - eventName: eventName, - msg: 'Error adding "' + eventName + '\" listener. The handler function is undefined.' - }); - } options = options || {}; @@ -10575,7 +10529,7 @@ Ext.EventManager = { removeListener : function(element, eventName, fn, scope) { - if (Ext.isObject(eventName)) { + if (typeof eventName !== 'string') { this.prepareListenerConfig(element, eventName, true); return; } @@ -10619,7 +10573,7 @@ Ext.EventManager = { } - cache.splice(i, 1); + Ext.Array.erase(cache, i, 1); } } }, @@ -10662,83 +10616,94 @@ Ext.EventManager = { createListenerWrap : function(dom, ename, fn, scope, options) { - options = !Ext.isObject(options) ? {} : options; + options = options || {}; - var f = ['if(!Ext) {return;}'], - gen; + var f, gen; - if(options.buffer || options.delay || options.freezeEvent) { - f.push('e = new Ext.EventObjectImpl(e, ' + (options.freezeEvent ? 'true' : 'false' ) + ');'); - } else { - f.push('e = Ext.EventObject.setEvent(e);'); - } + return function wrap(e, args) { + + if (!gen) { + f = ['if(!Ext) {return;}']; - if (options.delegate) { - f.push('var t = e.getTarget("' + options.delegate + '", this);'); - f.push('if(!t) {return;}'); - } else { - f.push('var t = e.target;'); - } + if(options.buffer || options.delay || options.freezeEvent) { + f.push('e = new Ext.EventObjectImpl(e, ' + (options.freezeEvent ? 'true' : 'false' ) + ');'); + } else { + f.push('e = Ext.EventObject.setEvent(e);'); + } - if (options.target) { - f.push('if(e.target !== options.target) {return;}'); - } + if (options.delegate) { + f.push('var t = e.getTarget("' + options.delegate + '", this);'); + f.push('if(!t) {return;}'); + } else { + f.push('var t = e.target;'); + } - if(options.stopEvent) { - f.push('e.stopEvent();'); - } else { - if(options.preventDefault) { - f.push('e.preventDefault();'); - } - if(options.stopPropagation) { - f.push('e.stopPropagation();'); - } - } + if (options.target) { + f.push('if(e.target !== options.target) {return;}'); + } - if(options.normalized === false) { - f.push('e = e.browserEvent;'); - } + if(options.stopEvent) { + f.push('e.stopEvent();'); + } else { + if(options.preventDefault) { + f.push('e.preventDefault();'); + } + if(options.stopPropagation) { + f.push('e.stopPropagation();'); + } + } - if(options.buffer) { - f.push('(wrap.task && clearTimeout(wrap.task));'); - f.push('wrap.task = setTimeout(function(){'); - } + if(options.normalized === false) { + f.push('e = e.browserEvent;'); + } - if(options.delay) { - f.push('wrap.tasks = wrap.tasks || [];'); - f.push('wrap.tasks.push(setTimeout(function(){'); - } + if(options.buffer) { + f.push('(wrap.task && clearTimeout(wrap.task));'); + f.push('wrap.task = setTimeout(function(){'); + } - - f.push('fn.call(scope || dom, e, t, options);'); + if(options.delay) { + f.push('wrap.tasks = wrap.tasks || [];'); + f.push('wrap.tasks.push(setTimeout(function(){'); + } - if(options.single) { - f.push('Ext.EventManager.removeListener(dom, ename, fn, scope);'); - } + + f.push('fn.call(scope || dom, e, t, options);'); - if(options.delay) { - f.push('}, ' + options.delay + '));'); - } + if(options.single) { + f.push('Ext.EventManager.removeListener(dom, ename, fn, scope);'); + } - if(options.buffer) { - f.push('}, ' + options.buffer + ');'); - } + if(options.delay) { + f.push('}, ' + options.delay + '));'); + } + + if(options.buffer) { + f.push('}, ' + options.buffer + ');'); + } - gen = Ext.functionFactory('e', 'options', 'fn', 'scope', 'ename', 'dom', 'wrap', 'args', f.join('\n')); + gen = Ext.functionFactory('e', 'options', 'fn', 'scope', 'ename', 'dom', 'wrap', 'args', f.join('\n')); + } - return function wrap(e, args) { gen.call(dom, e, options, fn, scope, ename, dom, wrap, args); }; }, getEventListenerCache : function(element, eventName) { + if (!element) { + return []; + } + var eventCache = this.getElementEventCache(element); return eventCache[eventName] || (eventCache[eventName] = []); }, getElementEventCache : function(element) { + if (!element) { + return {}; + } var elementCache = Ext.cache[this.getId(element)]; return elementCache.events || (elementCache.events = {}); }, @@ -10953,7 +10918,7 @@ Ext.EventManager.un = Ext.EventManager.removeListener; var bd = document.body || document.getElementsByTagName('body')[0], baseCSSPrefix = Ext.baseCSSPrefix, - cls = [], + cls = [baseCSSPrefix + 'body'], htmlCls = [], html; @@ -11229,6 +11194,44 @@ Ext.define('Ext.EventObjectImpl', { F11: 122, F12: 123, + + WHEEL_SCALE: (function () { + var scale; + + if (Ext.isGecko) { + + scale = 3; + } else if (Ext.isMac) { + + + + + if (Ext.isSafari && Ext.webKitVersion >= 532.0) { + + + + + + + scale = 120; + } else { + + + scale = 12; + } + + + + + + scale *= 3; + } else { + + scale = 120; + } + + return scale; + })(), clickRe: /(dbl)?click/, @@ -11394,16 +11397,58 @@ Ext.define('Ext.EventObjectImpl', { }, - getWheelDelta : function(){ - var event = this.browserEvent, - delta = 0; + correctWheelDelta : function (delta) { + var scale = this.WHEEL_SCALE, + ret = Math.round(delta / scale + 0.5); + + if (!ret && delta) { + ret = (delta < 0) ? -1 : 1; + } + + return ret; + }, + + + getWheelDeltas : function () { + var me = this, + event = me.browserEvent, + dx = 0, dy = 0; + + if (Ext.isDefined(event.wheelDeltaX)) { + dx = event.wheelDeltaX; + dy = event.wheelDeltaY; + } else if (event.wheelDelta) { + dy = event.wheelDelta; + } else if (event.detail) { + dy = -event.detail; - if (event.wheelDelta) { - delta = event.wheelDelta / 120; - } else if (event.detail){ - delta = -event.detail / 3; + + + if (dy > 100) { + dy = 3; + } else if (dy < -100) { + dy = -3; + } + + + + if (Ext.isDefined(event.axis) && event.axis === event.HORIZONTAL_AXIS) { + dx = dy; + dy = 0; + } } - return delta; + + return { + x: me.correctWheelDelta(dx), + y: me.correctWheelDelta(dy) + }; + }, + + + getWheelDelta : function(){ + var deltas = this.getWheelDeltas(); + + return deltas.y; }, @@ -11524,7 +11569,7 @@ Ext.define('Ext.EventObjectImpl', { return target; } - } + }; } else if (document.createEventObject) { var crazyIEButtons = { 0: 1, 1: 4, 2: 2 }; @@ -11652,7 +11697,6 @@ Ext.define('Ext.EventObjectImpl', { } function cannotInject (target, srcEvent) { - } return function (target) { @@ -11675,6 +11719,7 @@ Ext.EventObject = new Ext.EventObjectImpl(); (function(){ var doc = document, + activeElement = null, isCSS1 = doc.compatMode == "CSS1Compat", ELEMENT = Ext.core.Element, fly = function(el){ @@ -11685,6 +11730,26 @@ Ext.EventObject = new Ext.EventObjectImpl(); return _fly; }, _fly; + + + + if (!('activeElement' in doc) && doc.addEventListener) { + doc.addEventListener('focus', + function (ev) { + if (ev && ev.target) { + activeElement = (ev.target == doc) ? null : ev.target; + } + }, true); + } + + + function makeSelectionRestoreFn (activeEl, start, end) { + return function () { + activeEl.selectionStart = start; + activeEl.selectionEnd = end; + }; + } + Ext.apply(ELEMENT, { isAncestor : function(p, c) { var ret = false; @@ -11705,6 +11770,43 @@ Ext.EventObject = new Ext.EventObjectImpl(); return ret; }, + + getActiveElement: function () { + return doc.activeElement || activeElement; + }, + + + getRightMarginFixCleaner: function (target) { + var supports = Ext.supports, + hasInputBug = supports.DisplayChangeInputSelectionBug, + hasTextAreaBug = supports.DisplayChangeTextAreaSelectionBug; + + if (hasInputBug || hasTextAreaBug) { + var activeEl = doc.activeElement || activeElement, + tag = activeEl && activeEl.tagName, + start, + end; + + if ((hasTextAreaBug && tag == 'TEXTAREA') || + (hasInputBug && tag == 'INPUT' && activeEl.type == 'text')) { + if (ELEMENT.isAncestor(target, activeEl)) { + start = activeEl.selectionStart; + end = activeEl.selectionEnd; + + if (Ext.isNumber(start) && Ext.isNumber(end)) { + + + + + return makeSelectionRestoreFn(activeEl, start, end); + } + } + } + } + + return Ext.emptyFn; + }, + getViewWidth : function(full) { return full ? ELEMENT.getDocumentWidth() : ELEMENT.getViewportWidth(); }, @@ -11851,7 +11953,7 @@ Ext.EventObject = new Ext.EventObjectImpl(); Ext.each(element.options, function(opt){ if (opt.selected) { hasValue = opt.hasAttribute ? opt.hasAttribute('value') : opt.getAttributeNode('value').specified; - data += String.format("{0}={1}&", encoder(name), encoder(hasValue ? opt.value : opt.text)); + data += Ext.String.format("{0}={1}&", encoder(name), encoder(hasValue ? opt.value : opt.text)); } }); } else if (!(/file|undefined|reset|button/i.test(type))) { @@ -12169,11 +12271,6 @@ Ext.core.Element.addMethods({ el = Ext.get(el); if(!el || !el.dom){ - Ext.Error.raise({ - sourceClass: 'Ext.core.Element', - sourceMethod: 'getAlignVector', - msg: 'Attempted to align an element that doesn\'t exist' - }); } elRegion = el.getRegion(); @@ -12184,11 +12281,6 @@ Ext.core.Element.addMethods({ el = Ext.get(el); if(!el || !el.dom){ - Ext.Error.raise({ - sourceClass: 'Ext.core.Element', - sourceMethod: 'getAlignToXY', - msg: 'Attempted to align an element that doesn\'t exist' - }); } o = o || [0,0]; @@ -12223,14 +12315,6 @@ Ext.core.Element.addMethods({ m = p.match(/^([a-z]+)-([a-z]+)(\?)?$/); if(!m){ - Ext.Error.raise({ - sourceClass: 'Ext.core.Element', - sourceMethod: 'getAlignToXY', - el: el, - position: p, - offset: o, - msg: 'Attemmpted to align an element with an invalid position: "' + p + '"' - }); } p1 = m[1]; @@ -13104,7 +13188,7 @@ Ext.apply(Ext.CompositeElementLite.prototype, { Ext.removeNode(el); } } - els.splice(val, 1); + Ext.Array.erase(els, val, 1); } }); return this; @@ -13145,14 +13229,6 @@ Ext.core.Element.select = function(selector, unique, root){ }else if(selector.length !== undefined){ els = selector; }else{ - Ext.Error.raise({ - sourceClass: "Ext.core.Element", - sourceMethod: "select", - selector: selector, - unique: unique, - root: root, - msg: "Invalid selector specified: " + selector - }); } return (unique === true) ? new Ext.CompositeElement(els) : new Ext.CompositeElementLite(els); }; @@ -13163,7 +13239,6 @@ Ext.select = Ext.core.Element.select; - Ext.define('Ext.util.Observable', { @@ -13226,7 +13301,7 @@ Ext.define('Ext.util.Observable', { managedListeners = me.managedListeners = me.managedListeners || [], config; - if (Ext.isObject(ename)) { + if (typeof ename !== 'string') { options = ename; for (ename in options) { if (options.hasOwnProperty(ename)) { @@ -13251,16 +13326,15 @@ Ext.define('Ext.util.Observable', { }, - removeManagedListener : function(item, ename, fn, scope) { + removeManagedListener : function(item, ename, fn, scope) { var me = this, options, config, managedListeners, - managedListener, length, i; - if (Ext.isObject(ename)) { + if (typeof ename !== 'string') { options = ename; for (ename in options) { if (options.hasOwnProperty(ename)) { @@ -13273,14 +13347,9 @@ Ext.define('Ext.util.Observable', { } managedListeners = me.managedListeners ? me.managedListeners.slice() : []; - length = managedListeners.length; - for (i = 0; i < length; i++) { - managedListener = managedListeners[i]; - if (managedListener.item === item && managedListener.ename === ename && (!fn || managedListener.fn === fn) && (!scope || managedListener.scope === scope)) { - Ext.Array.remove(me.managedListeners, managedListener); - item.un(managedListener.ename, managedListener.fn, managedListener.scope); - } + for (i = 0, length = managedListeners.length; i < length; i++) { + me.removeManagedListenerItem(false, managedListeners[i], item, ename, fn, scope); } }, @@ -13298,20 +13367,23 @@ Ext.define('Ext.util.Observable', { if (queue) { queue.push(args); } - } else if (event && Ext.isObject(event) && event.bubble) { - if (event.fire.apply(event, args.slice(1)) === false) { - return false; - } - parent = me.getBubbleTarget && me.getBubbleTarget(); - if (parent && parent.isObservable) { - if (!parent.events[ename] || !Ext.isObject(parent.events[ename]) || !parent.events[ename].bubble) { - parent.enableBubble(ename); + } else if (event && event !== true) { + if (event.bubble) { + if (event.fire.apply(event, args.slice(1)) === false) { + return false; } - return parent.fireEvent.apply(parent, args); + parent = me.getBubbleTarget && me.getBubbleTarget(); + if (parent && parent.isObservable) { + if (!parent.events[ename] || parent.events[ename] === true || !parent.events[ename].bubble) { + parent.enableBubble(ename); + } + return parent.fireEvent.apply(parent, args); + } + } + else { + args.shift(); + ret = event.fire.apply(event, args); } - } else if (event && Ext.isObject(event)) { - args.shift(); - ret = event.fire.apply(event, args); } return ret; }, @@ -13322,7 +13394,7 @@ Ext.define('Ext.util.Observable', { config, event; - if (Ext.isObject(ename)) { + if (typeof ename !== 'string') { options = ename; for (ename in options) { if (options.hasOwnProperty(ename)) { @@ -13351,7 +13423,7 @@ Ext.define('Ext.util.Observable', { event, options; - if (Ext.isObject(ename)) { + if (typeof ename !== 'string') { options = ename; for (ename in options) { if (options.hasOwnProperty(ename)) { @@ -13364,7 +13436,7 @@ Ext.define('Ext.util.Observable', { } else { ename = ename.toLowerCase(); event = me.events[ename]; - if (event.isEvent) { + if (event && event.isEvent) { event.removeListener(fn, scope); } } @@ -13388,31 +13460,31 @@ Ext.define('Ext.util.Observable', { this.clearManagedListeners(); }, - purgeListeners : function() { - console.warn('Observable: purgeListeners has been deprecated. Please use clearListeners.'); - return this.clearListeners.apply(this, arguments); - }, clearManagedListeners : function() { var managedListeners = this.managedListeners || [], i = 0, - len = managedListeners.length, - managedListener; + len = managedListeners.length; for (; i < len; i++) { - managedListener = managedListeners[i]; - managedListener.item.un(managedListener.ename, managedListener.fn, managedListener.scope); + this.removeManagedListenerItem(true, managedListeners[i]); } this.managedListeners = []; }, - - purgeManagedListeners : function() { - console.warn('Observable: purgeManagedListeners has been deprecated. Please use clearManagedListeners.'); - return this.clearManagedListeners.apply(this, arguments); + + + removeManagedListenerItem: function(isClear, managedListener, item, ename, fn, scope){ + if (isClear || (managedListener.item === item && managedListener.ename === ename && (!fn || managedListener.fn === fn) && (!scope || managedListener.scope === scope))) { + managedListener.item.un(managedListener.ename, managedListener.fn, managedListener.scope); + if (!isClear) { + Ext.Array.remove(this.managedListeners, managedListener); + } + } }, + addEvents: function(o) { var me = this, @@ -13504,14 +13576,15 @@ Ext.define('Ext.util.Observable', { } } }, function() { - - - this.createAlias({ + on: 'addListener', + un: 'removeListener', + mon: 'addManagedListener', + mun: 'removeManagedListener' }); @@ -13611,13 +13684,13 @@ Ext.define('Ext.util.Observable', { i, len; for(i = 0, len = e.before.length; i < len; i++){ if(e.before[i].fn == fn && e.before[i].scope == scope){ - e.before.splice(i, 1); + Ext.Array.erase(e.before, i, 1); return; } } for(i = 0, len = e.after.length; i < len; i++){ if(e.after[i].fn == fn && e.after[i].scope == scope){ - e.after.splice(i, 1); + Ext.Array.erase(e.after, i, 1); return; } } @@ -13675,6 +13748,7 @@ Ext.define('Ext.util.Animate', { stopAnimation: function() { Ext.fx.Manager.stopAnimation(this.id); + return this; }, @@ -13682,6 +13756,7 @@ Ext.define('Ext.util.Animate', { Ext.fx.Manager.setFxDefaults(this.id, { concurrent: true }); + return this; }, @@ -13689,6 +13764,7 @@ Ext.define('Ext.util.Animate', { Ext.fx.Manager.setFxDefaults(this.id, { concurrent: false }); + return this; }, @@ -13698,11 +13774,13 @@ Ext.define('Ext.util.Animate', { getActiveAnimation: function() { return Ext.fx.Manager.getActiveAnimation(this.id); } +}, function(){ + + Ext.applyIf(Ext.core.Element.prototype, this.prototype); + + Ext.CompositeElementLite.importElementMethods(); }); - -Ext.applyIf(Ext.core.Element.prototype, Ext.util.Animate.prototype); - Ext.define('Ext.state.Provider', { mixins: { observable: 'Ext.util.Observable' @@ -13843,8 +13921,12 @@ Ext.define('Ext.util.HashMap', { observable: 'Ext.util.Observable' }, + constructor: function(config) { - var me = this; + config = config || {}; + + var me = this, + keyFn = config.keyFn; me.addEvents( @@ -13859,6 +13941,10 @@ Ext.define('Ext.util.HashMap', { me.mixins.observable.constructor.call(me, config); me.clear(true); + + if (keyFn) { + me.getKey = keyFn; + } }, @@ -14145,7 +14231,6 @@ Ext.define('Ext.Template', { /** * Compiles the template into an internal function, eliminating the RegEx overhead. * @return {Ext.Template} this - * @hide repeat doc */ compile: function() { var me = this, @@ -14260,78 +14345,73 @@ Ext.define('Ext.Template', { /** * @class Ext.ComponentQuery * @extends Object + * @singleton * * Provides searching of Components within Ext.ComponentManager (globally) or a specific * Ext.container.Container on the document with a similar syntax to a CSS selector. * * Components can be retrieved by using their {@link Ext.Component xtype} with an optional . prefix - + * + * - `component` or `.component` + * - `gridpanel` or `.gridpanel` * * An itemId or id must be prefixed with a # - * + * - `#myContainer` * * Attributes must be wrapped in brackets - * - * Member expressions from candidate Components may be tested. If the expression returns a truthy value, - * the candidate Component will be included in the query:

-var disabledFields = myFormPanel.query("{isDisabled()}");
-
+ * - `component[autoScroll]` + * - `panel[title="Test"]` + * + * Member expressions from candidate Components may be tested. If the expression returns a *truthy* value, + * the candidate Component will be included in the query: + * + * var disabledFields = myFormPanel.query("{isDisabled()}"); + * + * Pseudo classes may be used to filter results in the same way as in {@link Ext.DomQuery DomQuery}: + * + * // Function receives array and returns a filtered array. + * Ext.ComponentQuery.pseudos.invalid = function(items) { + * var i = 0, l = items.length, c, result = []; + * for (; i < l; i++) { + * if (!(c = items[i]).isValid()) { + * result.push(c); + * } + * } + * return result; + * }; + * + * var invalidFields = myFormPanel.query('field:invalid'); + * if (invalidFields.length) { + * invalidFields[0].getEl().scrollIntoView(myFormPanel.body); + * for (var i = 0, l = invalidFields.length; i < l; i++) { + * invalidFields[i].getEl().frame("red"); + * } + * } + * + * Default pseudos include: * - * Pseudo classes may be used to filter results in the same way as in {@link Ext.DomQuery DomQuery}:
-// Function receives array and returns a filtered array.
-Ext.ComponentQuery.pseudos.invalid = function(items) {
-    var i = 0, l = items.length, c, result = [];
-    for (; i < l; i++) {
-        if (!(c = items[i]).isValid()) {
-            result.push(c);
-        }
-    }
-    return result;
-};
-
-var invalidFields = myFormPanel.query('field:invalid');
-if (invalidFields.length) {
-    invalidFields[0].getEl().scrollIntoView(myFormPanel.body);
-    for (var i = 0, l = invalidFields.length; i < l; i++) {
-        invalidFields[i].getEl().frame("red");
-    }
-}
-
- *

- * Default pseudos include:
* - not - *

* * Queries return an array of components. * Here are some example queries. -

-    // retrieve all Ext.Panels in the document by xtype
-    var panelsArray = Ext.ComponentQuery.query('panel');
-
-    // retrieve all Ext.Panels within the container with an id myCt
-    var panelsWithinmyCt = Ext.ComponentQuery.query('#myCt panel');
-
-    // retrieve all direct children which are Ext.Panels within myCt
-    var directChildPanel = Ext.ComponentQuery.query('#myCt > panel');
-
-    // retrieve all gridpanels and listviews
-    var gridsAndLists = Ext.ComponentQuery.query('gridpanel, listview');
-
- -For easy access to queries based from a particular Container see the {@link Ext.container.Container#query}, -{@link Ext.container.Container#down} and {@link Ext.container.Container#child} methods. Also see -{@link Ext.Component#up}. - * @singleton + * + * // retrieve all Ext.Panels in the document by xtype + * var panelsArray = Ext.ComponentQuery.query('panel'); + * + * // retrieve all Ext.Panels within the container with an id myCt + * var panelsWithinmyCt = Ext.ComponentQuery.query('#myCt panel'); + * + * // retrieve all direct children which are Ext.Panels within myCt + * var directChildPanel = Ext.ComponentQuery.query('#myCt > panel'); + * + * // retrieve all grids and trees + * var gridsAndTrees = Ext.ComponentQuery.query('gridpanel, treepanel'); + * + * For easy access to queries based from a particular Container see the {@link Ext.container.Container#query}, + * {@link Ext.container.Container#down} and {@link Ext.container.Container#child} methods. Also see + * {@link Ext.Component#up}. */ Ext.define('Ext.ComponentQuery', { singleton: true, @@ -14610,17 +14690,21 @@ Ext.define('Ext.ComponentQuery', { }, /** - *

Returns an array of matched Components from within the passed root object.

- *

This method filters returned Components in a similar way to how CSS selector based DOM - * queries work using a textual selector string.

- *

See class summary for details.

- * @param selector The selector string to filter returned Components - * @param root

The Container within which to perform the query. If omitted, all Components - * within the document are included in the search.

- *

This parameter may also be an array of Components to filter according to the selector.

- * @returns {Array} The matched Components. + * Returns an array of matched Components from within the passed root object. + * + * This method filters returned Components in a similar way to how CSS selector based DOM + * queries work using a textual selector string. + * + * See class summary for details. + * + * @param {String} selector The selector string to filter returned Components + * @param {Ext.container.Container} root The Container within which to perform the query. + * If omitted, all Components within the document are included in the search. + * + * This parameter may also be an array of Components to filter according to the selector.

+ * @returns {[Ext.Component]} The matched Components. + * * @member Ext.ComponentQuery - * @method query */ query: function(selector, root) { var selectors = selector.split(','), @@ -14658,11 +14742,10 @@ Ext.define('Ext.ComponentQuery', { /** * Tests whether the passed Component matches the selector string. - * @param component The Component to test - * @param selector The selector string to test against. + * @param {Ext.Component} component The Component to test + * @param {String} selector The selector string to test against. * @return {Boolean} True if the Component matches the selector. * @member Ext.ComponentQuery - * @method query */ is: function(component, selector) { if (!selector) { @@ -14752,10 +14835,6 @@ Ext.define('Ext.ComponentQuery', { selector = selector.replace(selectorMatch[0], ''); break; // Break on match } - // Exhausted all matches: It's an error - if (i === (length - 1)) { - Ext.Error.raise('Invalid ComponentQuery selector: "' + arguments[0] + '"'); - } } } @@ -14814,8 +14893,6 @@ var longNames = allNames.filter(longNameFilter); //a new MixedCollection with the 2 people of age 24: var youngFolk = allNames.filter(ageFilter); - * @constructor - * @param {Object} config Config object */ Ext.define('Ext.util.Filter', { @@ -14823,7 +14900,7 @@ Ext.define('Ext.util.Filter', { /* End Definitions */ /** - * @cfg {String} property The property to filter on. Required unless a {@link #filter} is passed + * @cfg {String} property The property to filter on. Required unless a {@link #filterFn} is passed */ /** @@ -14851,7 +14928,11 @@ Ext.define('Ext.util.Filter', { * @cfg {String} root Optional root property. This is mostly useful when filtering a Store, in which case we set the * root to 'data' to make the filter pull the {@link #property} out of the data object of each item */ - + + /** + * Creates new Filter. + * @param {Object} config (optional) Config object + */ constructor: function(config) { Ext.apply(this, config); @@ -14929,16 +15010,76 @@ Ext.define('Ext.util.Filter', { /** * @class Ext.util.Sorter * @extends Object - * Represents a single sorter that can be applied to a Store + +Represents a single sorter that can be applied to a Store. The sorter is used +to compare two values against each other for the purpose of ordering them. Ordering +is achieved by specifying either: +- {@link #property A sorting property} +- {@link #sorterFn A sorting function} + +As a contrived example, we can specify a custom sorter that sorts by rank: + + Ext.define('Person', { + extend: 'Ext.data.Model', + fields: ['name', 'rank'] + }); + + Ext.create('Ext.data.Store', { + model: 'Person', + proxy: 'memory', + sorters: [{ + sorterFn: function(o1, o2){ + var getRank = function(o){ + var name = o.get('rank'); + if (name === 'first') { + return 1; + } else if (name === 'second') { + return 2; + } else { + return 3; + } + }, + rank1 = getRank(o1), + rank2 = getRank(o2); + + if (rank1 === rank2) { + return 0; + } + + return rank1 < rank2 ? -1 : 1; + } + }], + data: [{ + name: 'Person1', + rank: 'second' + }, { + name: 'Person2', + rank: 'third' + }, { + name: 'Person3', + rank: 'first' + }] + }); + + * @markdown */ Ext.define('Ext.util.Sorter', { /** - * @cfg {String} property The property to sort by. Required unless {@link #sorter} is provided + * @cfg {String} property The property to sort by. Required unless {@link #sorterFn} is provided. + * The property is extracted from the object directly and compared for sorting using the built in + * comparison operators. */ /** - * @cfg {Function} sorterFn A specific sorter function to execute. Can be passed instead of {@link #property} + * @cfg {Function} sorterFn A specific sorter function to execute. Can be passed instead of {@link #property}. + * This sorter function allows for any kind of custom/complex comparisons. + * The sorterFn receives two arguments, the objects being compared. The function should return: + * */ /** @@ -14962,9 +15103,6 @@ Ext.define('Ext.util.Sorter', { Ext.apply(me, config); - if (me.property == undefined && me.sorterFn == undefined) { - Ext.Error.raise("A Sorter requires either a property or a sorter function"); - } me.updateSortFunction(); }, @@ -15012,25 +15150,37 @@ Ext.define('Ext.util.Sorter', { * @return {Object} The root property of the object */ getRoot: function(item) { - return this.root == undefined ? item : item[this.root]; + return this.root === undefined ? item : item[this.root]; }, - // @TODO: Add docs for these three methods + /** + * Set the sorting direction for this sorter. + * @param {String} direction The direction to sort in. Should be either 'ASC' or 'DESC'. + */ setDirection: function(direction) { var me = this; me.direction = direction; me.updateSortFunction(); }, + /** + * Toggles the sorting direction for this sorter. + */ toggle: function() { var me = this; me.direction = Ext.String.toggle(me.direction, "ASC", "DESC"); me.updateSortFunction(); }, - updateSortFunction: function() { + /** + * Update the sort function for this sorter. + * @param {Function} fn (Optional) A new sorter function for this sorter. If not specified it will use the + * default sorting function. + */ + updateSortFunction: function(fn) { var me = this; - me.sort = me.createSortFunction(me.sorterFn || me.defaultSorterFn); + fn = fn || me.sorterFn || me.defaultSorterFn; + me.sort = me.createSortFunction(fn); } }); /** @@ -15250,9 +15400,6 @@ Ext.define('Ext.ElementLoader', { * class defaults. */ load: function(options) { - if (!this.target) { - Ext.Error.raise('A valid target is required when loading content'); - } options = Ext.apply({}, options); @@ -15275,9 +15422,6 @@ Ext.define('Ext.ElementLoader', { url: me.url }); - if (!options.url) { - Ext.Error.raise('You must specify the URL from which content should be loaded'); - } Ext.apply(options, { scope: me, @@ -15407,10 +15551,8 @@ Ext.define('Ext.ElementLoader', { /** * @class Ext.layout.Layout * @extends Object - * @private * Base Layout class - extended by ComponentLayout and ContainerLayout */ - Ext.define('Ext.layout.Layout', { /* Begin Definitions */ @@ -15426,12 +15568,12 @@ Ext.define('Ext.layout.Layout', { if (layout instanceof Ext.layout.Layout) { return Ext.createByAlias('layout.' + layout); } else { - if (Ext.isObject(layout)) { - type = layout.type; + if (!layout || typeof layout === 'string') { + type = layout || defaultType; + layout = {}; } else { - type = layout || defaultType; - layout = {}; + type = layout.type; } return Ext.createByAlias('layout.' + type, layout || {}); } @@ -15512,10 +15654,17 @@ Ext.define('Ext.layout.Layout', { * @param {Number} position The position within the target to render the item to */ renderItem : function(item, target, position) { + var me = this; if (!item.rendered) { + if (me.itemCls) { + item.addCls(me.itemCls); + } + if (me.owner.itemCls) { + item.addCls(me.owner.itemCls); + } item.render(target, position); - this.configureItem(item); - this.childrenChanged = true; + me.configureItem(item); + me.childrenChanged = true; } }, @@ -15560,19 +15709,9 @@ Ext.define('Ext.layout.Layout', { /** * @private * Applies itemCls + * Empty template method */ - configureItem: function(item) { - var me = this, - el = item.el, - owner = me.owner; - - if (me.itemCls) { - el.addCls(me.itemCls); - } - if (owner.itemCls) { - el.addCls(owner.itemCls); - } - }, + configureItem: Ext.emptyFn, // Placeholder empty functions for subclasses to extend onLayout : Ext.emptyFn, @@ -15590,6 +15729,7 @@ Ext.define('Ext.layout.Layout', { el = item.el, owner = me.owner; + // Clear managed dimensions flag when removed from the layout. if (item.rendered) { if (me.itemCls) { el.removeCls(me.itemCls); @@ -15598,6 +15738,12 @@ Ext.define('Ext.layout.Layout', { el.removeCls(owner.itemCls); } } + + // These flags are set at the time a child item is added to a layout. + // The layout must decide if it is managing the item's width, or its height, or both. + // See AbstractComponent for docs on these properties. + delete item.layoutManagedWidth; + delete item.layoutManagedHeight; }, /* @@ -15656,7 +15802,7 @@ Ext.define('Ext.layout.component.Component', { me.callParent(arguments); }, - beforeLayout : function(width, height, isSetSize, layoutOwner) { + beforeLayout : function(width, height, isSetSize, callingContainer) { this.callParent(arguments); var me = this, @@ -15667,14 +15813,11 @@ Ext.define('Ext.layout.component.Component', { ownerElChild = owner.el.child, layoutCollection; - /** - * Do not layout calculatedSized components for fixedLayouts unless the ownerCt == layoutOwner - * fixedLayouts means layouts which are never auto/auto in the sizing that comes from their ownerCt. - * Currently 3 layouts MAY be auto/auto (Auto, Border, and Box) - * The reason for not allowing component layouts is to stop component layouts from things such as Updater and - * form Validation. - */ - if (!isSetSize && !(Ext.isNumber(width) && Ext.isNumber(height)) && ownerCt && ownerCt.layout && ownerCt.layout.fixedLayout && ownerCt != layoutOwner) { + // Cache the size we began with so we can see if there has been any effect. + me.previousComponentSize = me.lastComponentSize; + + //Do not allow autoing of any dimensions which are fixed, unless we are being told to do so by the ownerCt's layout. + if (!isSetSize && ((!Ext.isNumber(width) && owner.isFixedWidth()) || (!Ext.isNumber(height) && owner.isFixedHeight())) && callingContainer !== ownerCt) { me.doContainerLayout(); return false; } @@ -15695,9 +15838,7 @@ Ext.define('Ext.layout.component.Component', { } if (isVisible && this.needsLayout(width, height)) { - me.rawWidth = width; - me.rawHeight = height; - return owner.beforeComponentLayout(width, height, isSetSize, layoutOwner); + return owner.beforeComponentLayout(width, height, isSetSize, callingContainer); } else { return false; @@ -15711,11 +15852,23 @@ Ext.define('Ext.layout.component.Component', { * @param {Mixed} height The new height to set. */ needsLayout : function(width, height) { - this.lastComponentSize = this.lastComponentSize || { - width: -Infinity, - height: -Infinity - }; - return (this.childrenChanged || this.lastComponentSize.width !== width || this.lastComponentSize.height !== height); + var me = this, + widthBeingChanged, + heightBeingChanged; + me.lastComponentSize = me.lastComponentSize || { + width: -Infinity, + height: -Infinity + }; + + // If autoWidthing, or an explicitly different width is passed, then the width is being changed. + widthBeingChanged = !Ext.isDefined(width) || me.lastComponentSize.width !== width; + + // If autoHeighting, or an explicitly different height is passed, then the height is being changed. + heightBeingChanged = !Ext.isDefined(height) || me.lastComponentSize.height !== height; + + + // isSizing flag added to prevent redundant layouts when going up the layout chain + return !me.isSizing && (me.childrenChanged || widthBeingChanged || heightBeingChanged); }, /** @@ -15817,22 +15970,32 @@ Ext.define('Ext.layout.component.Component', { doOwnerCtLayouts: function() { var owner = this.owner, ownerCt = owner.ownerCt, - ownerCtComponentLayout, ownerCtContainerLayout; + ownerCtComponentLayout, ownerCtContainerLayout, + curSize = this.lastComponentSize, + prevSize = this.previousComponentSize, + widthChange = (prevSize && curSize && curSize.width) ? curSize.width !== prevSize.width : true, + heightChange = (prevSize && curSize && curSize.height) ? curSize.height !== prevSize.height : true; - if (!ownerCt) { + + // If size has not changed, do not inform upstream layouts + if (!ownerCt || (!widthChange && !heightChange)) { return; } - + ownerCtComponentLayout = ownerCt.componentLayout; ownerCtContainerLayout = ownerCt.layout; if (!owner.floating && ownerCtComponentLayout && ownerCtComponentLayout.monitorChildren && !ownerCtComponentLayout.layoutBusy) { if (!ownerCt.suspendLayout && ownerCtContainerLayout && !ownerCtContainerLayout.layoutBusy) { - // AutoContainer Layout and Dock with auto in some dimension - if (ownerCtContainerLayout.bindToOwnerCtComponent === true) { + + // If the owning Container may be adjusted in any of the the dimension which have changed, perform its Component layout + if (((widthChange && !ownerCt.isFixedWidth()) || (heightChange && !ownerCt.isFixedHeight()))) { + // Set the isSizing flag so that the upstream Container layout (called after a Component layout) can omit this component from sizing operations + this.isSizing = true; ownerCt.doComponentLayout(); + this.isSizing = false; } - // Box Layouts + // Execute upstream Container layout else if (ownerCtContainerLayout.bindToOwnerCtContainer === true) { ownerCtContainerLayout.layout(); } @@ -15849,7 +16012,7 @@ Ext.define('Ext.layout.component.Component', { // Run the container layout if it exists (layout for child items) // **Unless automatic laying out is suspended, or the layout is currently running** - if (!owner.suspendLayout && layout && layout.isLayout && !layout.layoutBusy) { + if (!owner.suspendLayout && layout && layout.isLayout && !layout.layoutBusy && !layout.isAutoDock) { layout.layout(); } @@ -15940,27 +16103,27 @@ Ext.define('Ext.state.Manager', { }); /** * @class Ext.state.Stateful - * A mixin for being able to save the state of an object to an underlying + * A mixin for being able to save the state of an object to an underlying * {@link Ext.state.Provider}. */ Ext.define('Ext.state.Stateful', { - + /* Begin Definitions */ - + mixins: { observable: 'Ext.util.Observable' }, - + requires: ['Ext.state.Manager'], - + /* End Definitions */ - + /** * @cfg {Boolean} stateful *

A flag which causes the object to attempt to restore the state of * internal properties from a saved state on startup. The object must have - * a {@link #stateId} for state to be managed. - * Auto-generated ids are not guaranteed to be stable across page loads and + * a {@link #stateId} for state to be managed. + * Auto-generated ids are not guaranteed to be stable across page loads and * cannot be relied upon to save and restore the same state for a object.

*

For state saving to work, the state manager's provider must have been * set to an implementation of {@link Ext.state.Provider} which overrides the @@ -15981,7 +16144,7 @@ Ext.state.Manager.setProvider(new Ext.state.CookieProvider({ * object hash which represents the restorable state of the object.

*

The value yielded by getState is passed to {@link Ext.state.Manager#set} * which uses the configured {@link Ext.state.Provider} to save the object - * keyed by the {@link stateId}

. + * keyed by the {@link #stateId}

. *

During construction, a stateful object attempts to restore * its state by calling {@link Ext.state.Manager#get} passing the * {@link #stateId}

@@ -15994,13 +16157,13 @@ Ext.state.Manager.setProvider(new Ext.state.CookieProvider({ * {@link #beforestatesave} and {@link #statesave} events.

*/ stateful: true, - + /** * @cfg {String} stateId * The unique id for this object to use for state management purposes. *

See {@link #stateful} for an explanation of saving and restoring state.

*/ - + /** * @cfg {Array} stateEvents *

An array of events that, when fired, should trigger this object to @@ -16010,18 +16173,18 @@ Ext.state.Manager.setProvider(new Ext.state.CookieProvider({ *

See {@link #stateful} for an explanation of saving and * restoring object state.

*/ - + /** * @cfg {Number} saveBuffer A buffer to be applied if many state events are fired within * a short period. Defaults to 100. */ saveDelay: 100, - + autoGenIdRe: /^((\w+-)|(ext-comp-))\d{4,}$/i, - + constructor: function(config) { var me = this; - + config = config || {}; if (Ext.isDefined(config.stateful)) { me.stateful = config.stateful; @@ -16029,8 +16192,8 @@ Ext.state.Manager.setProvider(new Ext.state.CookieProvider({ if (Ext.isDefined(config.saveDelay)) { me.saveDelay = config.saveDelay; } - me.stateId = config.stateId; - + me.stateId = me.stateId || config.stateId; + if (!me.stateEvents) { me.stateEvents = []; } @@ -16048,7 +16211,7 @@ Ext.state.Manager.setProvider(new Ext.state.CookieProvider({ * provide custom state restoration. */ 'beforestaterestore', - + /** * @event staterestore * Fires after the state of the object is restored. @@ -16058,7 +16221,7 @@ Ext.state.Manager.setProvider(new Ext.state.CookieProvider({ * object. The method maybe overriden to provide custom state restoration. */ 'staterestore', - + /** * @event beforestatesave * Fires before the state of the object is saved to the configured state provider. Return false to stop the save. @@ -16069,7 +16232,7 @@ Ext.state.Manager.setProvider(new Ext.state.CookieProvider({ * has a null implementation. */ 'beforestatesave', - + /** * @event statesave * Fires after the state of the object is saved to the configured state provider. @@ -16087,7 +16250,7 @@ Ext.state.Manager.setProvider(new Ext.state.CookieProvider({ me.initState(); } }, - + /** * Initializes any state events for this object. * @private @@ -16095,7 +16258,7 @@ Ext.state.Manager.setProvider(new Ext.state.CookieProvider({ initStateEvents: function() { this.addStateEvents(this.stateEvents); }, - + /** * Add events that will trigger the state to be saved. * @param {String/Array} events The event name or an array of event names. @@ -16104,16 +16267,16 @@ Ext.state.Manager.setProvider(new Ext.state.CookieProvider({ if (!Ext.isArray(events)) { events = [events]; } - + var me = this, i = 0, len = events.length; - + for (; i < len; ++i) { me.on(events[i], me.onStateChange, me); } }, - + /** * This method is called when any of the {@link #stateEvents} are fired. * @private @@ -16121,7 +16284,7 @@ Ext.state.Manager.setProvider(new Ext.state.CookieProvider({ onStateChange: function(){ var me = this, delay = me.saveDelay; - + if (delay > 0) { if (!me.stateTask) { me.stateTask = Ext.create('Ext.util.DelayedTask', me.saveState, me); @@ -16131,7 +16294,7 @@ Ext.state.Manager.setProvider(new Ext.state.CookieProvider({ me.saveState(); } }, - + /** * Saves the state of the object to the persistence store. * @private @@ -16140,7 +16303,7 @@ Ext.state.Manager.setProvider(new Ext.state.CookieProvider({ var me = this, id, state; - + if (me.stateful !== false) { id = me.getStateId(); if (id) { @@ -16152,16 +16315,16 @@ Ext.state.Manager.setProvider(new Ext.state.CookieProvider({ } } }, - + /** * Gets the current state of the object. By default this function returns null, * it should be overridden in subclasses to implement methods for getting the state. * @return {Object} The current state */ getState: function(){ - return null; + return null; }, - + /** * Applies the state to the object. This should be overridden in subclasses to do * more complex state operations. By default it applies the state properties onto @@ -16173,7 +16336,7 @@ Ext.state.Manager.setProvider(new Ext.state.CookieProvider({ Ext.apply(this, state); } }, - + /** * Gets the state id for this object. * @return {String} The state id, null if not found. @@ -16181,13 +16344,13 @@ Ext.state.Manager.setProvider(new Ext.state.CookieProvider({ getStateId: function() { var me = this, id = me.stateId; - + if (!id) { id = me.autoGenIdRe.test(String(me.id)) ? null : me.id; } return id; }, - + /** * Initializes the state of the object upon construction. * @private @@ -16196,7 +16359,7 @@ Ext.state.Manager.setProvider(new Ext.state.CookieProvider({ var me = this, id = me.getStateId(), state; - + if (me.stateful !== false) { if (id) { state = Ext.state.Manager.get(id); @@ -16210,7 +16373,7 @@ Ext.state.Manager.setProvider(new Ext.state.CookieProvider({ } } }, - + /** * Destroys this stateful object. */ @@ -16220,18 +16383,16 @@ Ext.state.Manager.setProvider(new Ext.state.CookieProvider({ task.cancel(); } this.clearListeners(); - + } - + }); /** * @class Ext.AbstractManager * @extends Object - * @ignore * Base Manager class */ - Ext.define('Ext.AbstractManager', { /* Begin Definitions */ @@ -16310,9 +16471,6 @@ Ext.define('Ext.AbstractManager', { var type = config[this.typeName] || config.type || defaultType, Constructor = this.types[type]; - if (Constructor == undefined) { - Ext.Error.raise("The '" + type + "' type has not been registered with this manager"); - } return new Constructor(config); }, @@ -17183,11 +17341,11 @@ Ext.define('Ext.util.AbstractMixedCollection', { return me.add(myKey, myObj); } me.length++; - me.items.splice(index, 0, myObj); + Ext.Array.splice(me.items, index, 0, myObj); if (typeof myKey != 'undefined' && myKey !== null) { me.map[myKey] = myObj; } - me.keys.splice(index, 0, myKey); + Ext.Array.splice(me.keys, index, 0, myKey); me.fireEvent('add', index, myObj, myKey); return myObj; }, @@ -17215,12 +17373,12 @@ Ext.define('Ext.util.AbstractMixedCollection', { if (index < me.length && index >= 0) { me.length--; o = me.items[index]; - me.items.splice(index, 1); + Ext.Array.erase(me.items, index, 1); key = me.keys[index]; if (typeof key != 'undefined') { delete me.map[key]; } - me.keys.splice(index, 1); + Ext.Array.erase(me.keys, index, 1); me.fireEvent('remove', o, key); return o; } @@ -17504,7 +17662,6 @@ Ext.define("Ext.util.Sortable", { ], - sortRoot: null, initSortable: function() { @@ -17662,11 +17819,6 @@ Ext.define("Ext.util.Sortable", { getSorters: function() { return this.sorters.items; - }, - - - getSortState : function() { - return this.sortInfo; } }); @@ -17676,6 +17828,7 @@ Ext.define('Ext.util.MixedCollection', { sortable: 'Ext.util.Sortable' }, + constructor: function() { var me = this; me.callParent(arguments); @@ -17929,6 +18082,7 @@ Ext.define('Ext.LoadMask', { disabled: false, + constructor : function(el, config) { var me = this; @@ -18092,12 +18246,6 @@ Ext.define('Ext.ComponentLoader', { target = loader.getTarget(), items = []; - if (!target.isContainer) { - Ext.Error.raise({ - target: target, - msg: 'Components can only be loaded into a container' - }); - } try { items = Ext.decode(response.responseText); @@ -18239,12 +18387,17 @@ Ext.define('Ext.AbstractComponent', { return ++Ext.AbstractComponent.AUTO_ID; }, + + + + + @@ -18281,10 +18434,10 @@ Ext.define('Ext.AbstractComponent', { ui: 'default', - + uiCls: [], - + @@ -18351,11 +18504,12 @@ Ext.define('Ext.AbstractComponent', { trimRe: /^\s+|\s+$/g, spacesRe: /\s+/, + + - - maskOnDisable: true, + constructor : function(config) { var me = this, i, len; @@ -18418,7 +18572,7 @@ Ext.define('Ext.AbstractComponent', { me.plugins[i] = me.constructPlugin(me.plugins[i]); } } - + me.initComponent(); @@ -18429,6 +18583,9 @@ Ext.define('Ext.AbstractComponent', { me.mixins.state.constructor.call(me, config); + this.addStateEvents('resize'); + + if (me.plugins) { me.plugins = [].concat(me.plugins); for (i = 0, len = me.plugins.length; i < len; i++) { @@ -18440,22 +18597,86 @@ Ext.define('Ext.AbstractComponent', { if (me.renderTo) { me.render(me.renderTo); + + + } if (me.autoShow) { me.show(); } + + }, + + initComponent: Ext.emptyFn, + + + getState: function() { + var me = this, + layout = me.ownerCt ? (me.shadowOwnerCt || me.ownerCt).getLayout() : null, + state = { + collapsed: me.collapsed + }, + width = me.width, + height = me.height, + cm = me.collapseMemento, + anchors; + - if (Ext.isDefined(me.disabledClass)) { - if (Ext.isDefined(Ext.global.console)) { - Ext.global.console.warn('Ext.Component: disabledClass has been deprecated. Please use disabledCls.'); + + if (me.collapsed && cm) { + if (Ext.isDefined(cm.data.width)) { + width = cm.width; + } + if (Ext.isDefined(cm.data.height)) { + height = cm.height; } - me.disabledCls = me.disabledClass; - delete me.disabledClass; } - }, - initComponent: Ext.emptyFn, + + if (layout && me.flex) { + state.flex = me.flex; + state[layout.perpendicularPrefix] = me['get' + layout.perpendicularPrefixCap](); + } + + else if (layout && me.anchor) { + state.anchor = me.anchor; + anchors = me.anchor.split(' ').concat(null); + if (!anchors[0]) { + if (me.width) { + state.width = width; + } + } + if (!anchors[1]) { + if (me.height) { + state.height = height; + } + } + } + + else { + if (me.width) { + state.width = width; + } + if (me.height) { + state.height = height; + } + } + + + if (state.width == me.initialConfig.width) { + delete state.width; + } + if (state.height == me.initialConfig.height) { + delete state.height; + } + + + if (layout && layout.align && (layout.align.indexOf('stretch') !== -1)) { + delete state[layout.perpendicularPrefix]; + } + return state; + }, show: Ext.emptyFn, @@ -18538,7 +18759,6 @@ Ext.define('Ext.AbstractComponent', { return plugin; }, - initPlugin : function(plugin) { plugin.init(this); @@ -18612,7 +18832,6 @@ Ext.define('Ext.AbstractComponent', { onRender : function(container, position) { var me = this, el = me.el, - cls = me.initCls(), styles = me.initStyles(), renderTpl, renderData, i; @@ -18647,7 +18866,9 @@ Ext.define('Ext.AbstractComponent', { } } - el.addCls(cls); + me.setUI(me.ui); + + el.addCls(me.initCls()); el.setStyle(styles); @@ -18662,14 +18883,7 @@ Ext.define('Ext.AbstractComponent', { me.el = el; - - me.rendered = true; - me.addUIToElement(true); - - for (i = 0; i < me.uiCls.length; i++) { - me.addUIClsToElement(me.uiCls[i], true); - } - me.rendered = false; + me.initFrame(); renderTpl = me.initRenderTpl(); @@ -18679,10 +18893,8 @@ Ext.define('Ext.AbstractComponent', { } me.applyRenderSelectors(); - + me.rendered = true; - - me.setUI(me.ui); }, @@ -18723,6 +18935,18 @@ Ext.define('Ext.AbstractComponent', { frameCls: Ext.baseCSSPrefix + 'frame', + frameElementCls: { + tl: [], + tc: [], + tr: [], + ml: [], + mc: [], + mr: [], + bl: [], + bc: [], + br: [] + }, + frameTpl: [ '', '
{parent.baseCls}-{parent.ui}-{.}-tl" style="background-position: {tl}; padding-left: {frameWidth}px" role="presentation">', @@ -18768,18 +18992,18 @@ Ext.define('Ext.AbstractComponent', { '', '' ], - + initFrame : function() { if (Ext.supports.CSS3BorderRadius) { return false; } - + var me = this, frameInfo = me.getFrameInfo(), frameWidth = frameInfo.width, frameTpl = me.getFrameTpl(frameInfo.table); - + if (me.frame) { frameTpl.insertFirst(me.el, Ext.apply({}, { @@ -18796,7 +19020,7 @@ Ext.define('Ext.AbstractComponent', { me.frameBody = me.el.down('.' + me.frameCls + '-mc'); - + Ext.apply(me.renderSelectors, { frameTL: '.' + me.baseCls + '-tl', @@ -18811,12 +19035,12 @@ Ext.define('Ext.AbstractComponent', { }); } }, - + updateFrame: function() { if (Ext.supports.CSS3BorderRadius) { return false; } - + var me = this, wasTable = this.frameSize && this.frameSize.table, oldFrameTL = this.frameTL, @@ -18824,11 +19048,11 @@ Ext.define('Ext.AbstractComponent', { oldFrameML = this.frameML, oldFrameMC = this.frameMC, newMCClassName; - + this.initFrame(); - + if (oldFrameMC) { - if (me.frame) { + if (me.frame) { delete me.frameTL; delete me.frameTC; @@ -18838,26 +19062,26 @@ Ext.define('Ext.AbstractComponent', { delete me.frameMR; delete me.frameBL; delete me.frameBC; - delete me.frameBR; + delete me.frameBR; this.applyRenderSelectors(); - + newMCClassName = this.frameMC.dom.className; - + oldFrameMC.insertAfter(this.frameMC); this.frameMC.remove(); - + this.frameBody = this.frameMC = oldFrameMC; - + oldFrameMC.dom.className = newMCClassName; - + if (wasTable) { me.el.query('> table')[1].remove(); - } + } else { if (oldFrameTL) { oldFrameTL.remove(); @@ -18870,19 +19094,19 @@ Ext.define('Ext.AbstractComponent', { } else { - + } } else if (me.frame) { this.applyRenderSelectors(); } }, - + getFrameInfo: function() { if (Ext.supports.CSS3BorderRadius) { return false; } - + var me = this, left = me.el.getStyle('background-position-x'), top = me.el.getStyle('background-position-y'), @@ -18895,62 +19119,59 @@ Ext.define('Ext.AbstractComponent', { left = info[0]; top = info[1]; } - + if (parseInt(left, 10) >= 1000000 && parseInt(top, 10) >= 1000000) { max = Math.max; - + frameInfo = { table: left.substr(0, 3) == '110', - + vertical: top.substr(0, 3) == '110', - + top: max(left.substr(3, 2), left.substr(5, 2)), right: max(left.substr(5, 2), top.substr(3, 2)), bottom: max(top.substr(3, 2), top.substr(5, 2)), left: max(top.substr(5, 2), left.substr(3, 2)) }; - + frameInfo.width = max(frameInfo.top, frameInfo.right, frameInfo.bottom, frameInfo.left); me.el.setStyle('background-image', 'none'); - } - + } + if (me.frame === true && !frameInfo) { - Ext.Error.raise("You have set frame: true explicity on this component while it doesn't have any " + - "framing defined in the CSS template. In this case IE can't figure out what sizes " + - "to use and thus framing on this component will be disabled."); } - + me.frame = me.frame || !!frameInfo; me.frameSize = frameInfo || false; - + return frameInfo; }, - + getFramePositions: function(frameInfo) { var me = this, frameWidth = frameInfo.width, dock = me.dock, positions, tc, bc, ml, mr; - + if (frameInfo.vertical) { tc = '0 -' + (frameWidth * 0) + 'px'; bc = '0 -' + (frameWidth * 1) + 'px'; - + if (dock && dock == "right") { tc = 'right -' + (frameWidth * 0) + 'px'; bc = 'right -' + (frameWidth * 1) + 'px'; } - + positions = { tl: '0 -' + (frameWidth * 0) + 'px', tr: '0 -' + (frameWidth * 1) + 'px', @@ -18966,12 +19187,12 @@ Ext.define('Ext.AbstractComponent', { } else { ml = '-' + (frameWidth * 0) + 'px 0'; mr = 'right 0'; - + if (dock && dock == "bottom") { ml = 'left bottom'; mr = 'right bottom'; } - + positions = { tl: '0 -' + (frameWidth * 2) + 'px', tr: 'right -' + (frameWidth * 3) + 'px', @@ -18985,10 +19206,10 @@ Ext.define('Ext.AbstractComponent', { bc: '0 -' + (frameWidth * 1) + 'px' }; } - + return positions; }, - + getFrameTpl : function(table) { return table ? this.getTpl('frameTableTpl') : this.getTpl('frameTpl'); @@ -19021,174 +19242,228 @@ Ext.define('Ext.AbstractComponent', { return cls.concat(me.additionalCls); }, - + setUI: function(ui) { var me = this, oldUICls = Ext.Array.clone(me.uiCls), newUICls = [], + classes = [], cls, i; - + for (i = 0; i < oldUICls.length; i++) { cls = oldUICls[i]; - - me.removeClsWithUI(cls); + + classes = classes.concat(me.removeClsWithUI(cls, true)); newUICls.push(cls); } - + + if (classes.length) { + me.removeCls(classes); + } + me.removeUIFromElement(); - + me.ui = ui; - + me.addUIToElement(); + - + classes = []; for (i = 0; i < newUICls.length; i++) { cls = newUICls[i]; - - me.addClsWithUI(cls); + classes = classes.concat(me.addClsWithUI(cls, true)); + } + + if (classes.length) { + me.addCls(classes); } }, + - - addClsWithUI: function(cls) { + addClsWithUI: function(cls, skip) { var me = this, + classes = [], i; - + if (!Ext.isArray(cls)) { cls = [cls]; } - + for (i = 0; i < cls.length; i++) { if (cls[i] && !me.hasUICls(cls[i])) { me.uiCls = Ext.Array.clone(me.uiCls); me.uiCls.push(cls[i]); - me.addUIClsToElement(cls[i]); + + classes = classes.concat(me.addUIClsToElement(cls[i])); } } + + if (skip !== true) { + me.addCls(classes); + } + + return classes; }, + - - removeClsWithUI: function(cls) { + removeClsWithUI: function(cls, skip) { var me = this, + classes = [], i; - + if (!Ext.isArray(cls)) { cls = [cls]; } - + for (i = 0; i < cls.length; i++) { if (cls[i] && me.hasUICls(cls[i])) { me.uiCls = Ext.Array.remove(me.uiCls, cls[i]); - me.removeUIClsFromElement(cls[i]); + + classes = classes.concat(me.removeUIClsFromElement(cls[i])); } } + + if (skip !== true) { + me.removeCls(classes); + } + + return classes; }, - + hasUICls: function(cls) { var me = this, uiCls = me.uiCls || []; - + return Ext.Array.contains(uiCls, cls); }, - + addUIClsToElement: function(cls, force) { - var me = this; + var me = this, + result = [], + frameElementCls = me.frameElementCls; - me.addCls(Ext.baseCSSPrefix + cls); - me.addCls(me.baseCls + '-' + cls); - me.addCls(me.baseCls + '-' + me.ui + '-' + cls); + result.push(Ext.baseCSSPrefix + cls); + result.push(me.baseCls + '-' + cls); + result.push(me.baseCls + '-' + me.ui + '-' + cls); - if (!force && me.rendered && me.frame && !Ext.supports.CSS3BorderRadius) { + if (!force && me.frame && !Ext.supports.CSS3BorderRadius) { var els = ['tl', 'tc', 'tr', 'ml', 'mc', 'mr', 'bl', 'bc', 'br'], - i, el; - + classes, i, j, el; + for (i = 0; i < els.length; i++) { el = me['frame' + els[i].toUpperCase()]; - + classes = [me.baseCls + '-' + me.ui + '-' + els[i], me.baseCls + '-' + me.ui + '-' + cls + '-' + els[i]]; if (el && el.dom) { - el.addCls(me.baseCls + '-' + me.ui + '-' + els[i]); - el.addCls(me.baseCls + '-' + me.ui + '-' + cls + '-' + els[i]); + el.addCls(classes); + } else { + for (j = 0; j < classes.length; j++) { + if (Ext.Array.indexOf(frameElementCls[els[i]], classes[j]) == -1) { + frameElementCls[els[i]].push(classes[j]); + } + } } } } + + me.frameElementCls = frameElementCls; + + return result; }, - + removeUIClsFromElement: function(cls, force) { - var me = this; + var me = this, + result = [], + frameElementCls = me.frameElementCls; - me.removeCls(Ext.baseCSSPrefix + cls); - me.removeCls(me.baseCls + '-' + cls); - me.removeCls(me.baseCls + '-' + me.ui + '-' + cls); + result.push(Ext.baseCSSPrefix + cls); + result.push(me.baseCls + '-' + cls); + result.push(me.baseCls + '-' + me.ui + '-' + cls); - if (!force &&me.rendered && me.frame && !Ext.supports.CSS3BorderRadius) { + if (!force && me.frame && !Ext.supports.CSS3BorderRadius) { var els = ['tl', 'tc', 'tr', 'ml', 'mc', 'mr', 'bl', 'bc', 'br'], i, el; - + cls = me.baseCls + '-' + me.ui + '-' + cls + '-' + els[i]; for (i = 0; i < els.length; i++) { el = me['frame' + els[i].toUpperCase()]; if (el && el.dom) { - el.removeCls(me.baseCls + '-' + me.ui + '-' + cls + '-' + els[i]); + el.removeCls(cls); + } else { + Ext.Array.remove(frameElementCls[els[i]], cls); } } } + + me.frameElementCls = frameElementCls; + + return result; }, - + addUIToElement: function(force) { - var me = this; + var me = this, + frameElementCls = me.frameElementCls; me.addCls(me.baseCls + '-' + me.ui); - if (me.rendered && me.frame && !Ext.supports.CSS3BorderRadius) { + if (me.frame && !Ext.supports.CSS3BorderRadius) { var els = ['tl', 'tc', 'tr', 'ml', 'mc', 'mr', 'bl', 'bc', 'br'], - i, el; + i, el, cls; for (i = 0; i < els.length; i++) { el = me['frame' + els[i].toUpperCase()]; - + cls = me.baseCls + '-' + me.ui + '-' + els[i]; if (el) { - el.addCls(me.baseCls + '-' + me.ui + '-' + els[i]); + el.addCls(cls); + } else { + if (!Ext.Array.contains(frameElementCls[els[i]], cls)) { + frameElementCls[els[i]].push(cls); + } } } } }, - + removeUIFromElement: function() { - var me = this; + var me = this, + frameElementCls = me.frameElementCls; me.removeCls(me.baseCls + '-' + me.ui); - if (me.rendered && me.frame && !Ext.supports.CSS3BorderRadius) { + if (me.frame && !Ext.supports.CSS3BorderRadius) { var els = ['tl', 'tc', 'tr', 'ml', 'mc', 'mr', 'bl', 'bc', 'br'], - i, el; - + i, j, el, cls; + for (i = 0; i < els.length; i++) { el = me['frame' + els[i].toUpperCase()]; + cls = me.baseCls + '-' + me.ui + '-' + els[i]; + if (el) { - el.removeCls(me.baseCls + '-' + me.ui + '-' + els[i]); + el.removeCls(cls); + } else { + Ext.Array.remove(frameElementCls[els[i]], cls); } } } }, - + getElConfig : function() { var result = this.autoEl || {tag: 'div'}; result.id = this.id; @@ -19246,15 +19521,18 @@ Ext.define('Ext.AbstractComponent', { getTpl: function(name) { - var prototype = this.self.prototype, - ownerPrototype; + var me = this, + prototype = me.self.prototype, + ownerPrototype, + tpl; - if (this.hasOwnProperty(name)) { - if (!(this[name] instanceof Ext.XTemplate)) { - this[name] = Ext.ClassManager.dynInstantiate('Ext.XTemplate', this[name]); + if (me.hasOwnProperty(name)) { + tpl = me[name]; + if (tpl && !(tpl instanceof Ext.XTemplate)) { + me[name] = Ext.ClassManager.dynInstantiate('Ext.XTemplate', tpl); } - return this[name]; + return me[name]; } if (!(prototype[name] instanceof Ext.XTemplate)) { @@ -19262,8 +19540,11 @@ Ext.define('Ext.AbstractComponent', { do { if (ownerPrototype.hasOwnProperty(name)) { - ownerPrototype[name] = Ext.ClassManager.dynInstantiate('Ext.XTemplate', ownerPrototype[name]); - break; + tpl = ownerPrototype[name]; + if (tpl && !(tpl instanceof Ext.XTemplate)) { + ownerPrototype[name] = Ext.ClassManager.dynInstantiate('Ext.XTemplate', tpl); + break; + } } ownerPrototype = ownerPrototype.superclass; @@ -19340,13 +19621,17 @@ Ext.define('Ext.AbstractComponent', { initEvents : function() { var me = this, afterRenderEvents = me.afterRenderEvents, - property, listeners; + el, + property, + fn = function(listeners){ + me.mon(el, listeners); + }; if (afterRenderEvents) { for (property in afterRenderEvents) { if (afterRenderEvents.hasOwnProperty(property)) { - listeners = afterRenderEvents[property]; - if (me[property] && me[property].on) { - me.mon(me[property], listeners); + el = me[property]; + if (el && el.on) { + Ext.each(afterRenderEvents[property], fn); } } } @@ -19643,12 +19928,12 @@ Ext.define('Ext.AbstractComponent', { return me; }, - + onEnable: function() { if (this.maskOnDisable) { this.el.unmask(); - } + } }, @@ -19657,7 +19942,7 @@ Ext.define('Ext.AbstractComponent', { this.el.mask(); } }, - + isDisabled : function() { return this.disabled; @@ -19717,12 +20002,6 @@ Ext.define('Ext.AbstractComponent', { return me; }, - removeClass : function() { - if (Ext.isDefined(Ext.global.console)) { - Ext.global.console.warn('Ext.Component: removeClass has been deprecated. Please use removeCls.'); - } - return this.removeCls.apply(this, arguments); - }, addOverCls: function() { var me = this; @@ -19766,7 +20045,10 @@ Ext.define('Ext.AbstractComponent', { me.mon(me[element], listeners); } else { me.afterRenderEvents = me.afterRenderEvents || {}; - me.afterRenderEvents[element] = listeners; + if (!me.afterRenderEvents[element]) { + me.afterRenderEvents[element] = []; + } + me.afterRenderEvents[element].push(listeners); } } @@ -19774,6 +20056,24 @@ Ext.define('Ext.AbstractComponent', { }, + removeManagedListenerItem: function(isClear, managedListener, item, ename, fn, scope){ + var me = this, + element = managedListener.options ? managedListener.options.element : null; + + if (element) { + element = me[element]; + if (element && element.un) { + if (isClear || (managedListener.item === item && managedListener.ename === ename && (!fn || managedListener.fn === fn) && (!scope || managedListener.scope === scope))) { + element.un(managedListener.ename, managedListener.fn, managedListener.scope); + if (!isClear) { + Ext.Array.remove(me.managedListeners, managedListener); + } + } + } + } else { + return me.mixins.observable.removeManagedListenerItem.apply(me, arguments); + } + }, getBubbleTarget : function() { @@ -19857,13 +20157,39 @@ Ext.define('Ext.AbstractComponent', { return me; }, - setCalculatedSize : function(width, height, ownerCt) { + isFixedWidth: function() { + var me = this, + layoutManagedWidth = me.layoutManagedWidth; + + if (Ext.isDefined(me.width) || layoutManagedWidth == 1) { + return true; + } + if (layoutManagedWidth == 2) { + return false; + } + return (me.ownerCt && me.ownerCt.isFixedWidth()); + }, + + isFixedHeight: function() { + var me = this, + layoutManagedHeight = me.layoutManagedHeight; + + if (Ext.isDefined(me.height) || layoutManagedHeight == 1) { + return true; + } + if (layoutManagedHeight == 2) { + return false; + } + return (me.ownerCt && me.ownerCt.isFixedHeight()); + }, + + setCalculatedSize : function(width, height, callingContainer) { var me = this, layoutCollection; if (Ext.isObject(width)) { - ownerCt = width.ownerCt; + callingContainer = width.ownerCt; height = width.height; width = width.width; } @@ -19887,37 +20213,60 @@ Ext.define('Ext.AbstractComponent', { width: width, height: height, isSetSize: false, - ownerCt: ownerCt + ownerCt: callingContainer }; return me; } - me.doComponentLayout(width, height, false, ownerCt); + me.doComponentLayout(width, height, false, callingContainer); return me; }, - doComponentLayout : function(width, height, isSetSize, ownerCt) { + doComponentLayout : function(width, height, isSetSize, callingContainer) { var me = this, - componentLayout = me.getComponentLayout(); + componentLayout = me.getComponentLayout(), + lastComponentSize = componentLayout.lastComponentSize || { + width: undefined, + height: undefined + }; if (me.rendered && componentLayout) { - width = (width !== undefined) ? width : me.width; - height = (height !== undefined) ? height : me.height; + + + + if (!Ext.isDefined(width)) { + if (me.isFixedWidth()) { + width = Ext.isDefined(me.width) ? me.width : lastComponentSize.width; + } + } + + + if (!Ext.isDefined(height)) { + if (me.isFixedHeight()) { + height = Ext.isDefined(me.height) ? me.height : lastComponentSize.height; + } + } + if (isSetSize) { me.width = width; me.height = height; } - componentLayout.layout(width, height, isSetSize, ownerCt); + componentLayout.layout(width, height, isSetSize, callingContainer); } return me; }, + forceComponentLayout: function () { + this.doComponentLayout(); + }, + + setComponentLayout : function(layout) { var currentLayout = this.componentLayout; if (currentLayout && currentLayout.isLayout && currentLayout != layout) { @@ -19937,12 +20286,12 @@ Ext.define('Ext.AbstractComponent', { }, - afterComponentLayout: function(width, height, isSetSize, layoutOwner) { + afterComponentLayout: function(width, height, isSetSize, callingContainer) { this.fireEvent('resize', this, width, height); }, - beforeComponentLayout: function(width, height, isSetSize, layoutOwner) { + beforeComponentLayout: function(width, height, isSetSize, callingContainer) { return true; }, @@ -20083,15 +20432,15 @@ Ext.define('Ext.AbstractComponent', { me.ownerCt.remove(me, false); } - if (me.rendered) { - me.el.remove(); - } - me.onDestroy(); Ext.destroy(me.plugins); + if (me.rendered) { + me.el.remove(); + } + Ext.ComponentManager.unregister(me); me.fireEvent('destroy', me); @@ -20115,7 +20464,7 @@ Ext.define('Ext.AbstractComponent', { } } }, - + isDescendantOf: function(container) { return !!this.findParentBy(function(p){ @@ -20133,14 +20482,11 @@ Ext.define('Ext.AbstractComponent', { Ext.define('Ext.AbstractPlugin', { disabled: false, - + constructor: function(config) { - if (!config.cmp && Ext.global.console) { - Ext.global.console.warn("Attempted to attach a plugin "); - } Ext.apply(this, config); }, - + getCmp: function() { return this.cmp; }, @@ -20162,7 +20508,6 @@ Ext.define('Ext.AbstractPlugin', { } }); - Ext.define('Ext.data.Connection', { mixins: { observable: 'Ext.util.Observable' @@ -20418,12 +20763,6 @@ Ext.define('Ext.data.Connection', { url = this.setupUrl(options, url); - if (!url) { - Ext.Error.raise({ - options: options, - msg: 'No URL specified' - }); - } data = options.rawData || options.xmlData || jsonData || null; @@ -20631,9 +20970,20 @@ Ext.define('Ext.data.Connection', { onComplete : function(request) { var me = this, options = request.options, - result = me.parseStatus(request.xhr.status), - success = result.success, + result, + success, response; + + try { + result = me.parseStatus(request.xhr.status); + } catch (e) { + + result = { + success : false, + isException : false + }; + } + success = result.success; if (success) { response = me.createResponse(request); @@ -20789,13 +21139,13 @@ Ext.define('Ext.data.Association', { default: - Ext.Error.raise('Unknown Association type: "' + association.type + '"'); } } return association; } }, + constructor: function(config) { Ext.apply(this, config); @@ -20806,12 +21156,6 @@ Ext.define('Ext.data.Association', { associatedModel = types[associatedName], ownerProto; - if (ownerModel === undefined) { - Ext.Error.raise("The configured ownerModel was not valid (you tried " + ownerName + ")"); - } - if (associatedModel === undefined) { - Ext.Error.raise("The configured associatedModel was not valid (you tried " + associatedName + ")"); - } this.ownerModel = ownerModel; this.associatedModel = associatedModel; @@ -20929,21 +21273,19 @@ Ext.define('Ext.ModelManager', { Ext.regModel = function() { - if (Ext.isDefined(Ext.global.console)) { - Ext.global.console.warn('Ext.regModel has been deprecated. Models can now be created by extending Ext.data.Model: Ext.define("MyModel", {extend: "Ext.data.Model", fields: []});.'); - } return this.ModelManager.registerType.apply(this.ModelManager, arguments); }; }); Ext.define('Ext.app.Controller', { - mixins: { observable: 'Ext.util.Observable' }, + + onClassExtended: function(cls, data) { var className = Ext.getClassName(cls), match = className.match(/^(.*)\.controller\./); @@ -20983,6 +21325,7 @@ Ext.define('Ext.app.Controller', { } }, + constructor: function(config) { this.mixins.observable.constructor.call(this, config); @@ -21065,22 +21408,27 @@ Ext.define('Ext.app.Controller', { return cached; }, + control: function(selectors, listeners) { this.application.control(selectors, listeners, this); }, + getController: function(name) { return this.application.getController(name); }, + getStore: function(name) { return this.application.getStore(name); }, + getModel: function(model) { return this.application.getModel(model); }, + getView: function(view) { return this.application.getView(view); } @@ -21206,6 +21554,7 @@ Ext.define('Ext.data.Operation', { error: undefined, + constructor: function(config) { Ext.apply(this, config || {}); @@ -21364,6 +21713,7 @@ Ext.define('Ext.data.ResultSet', { + constructor: function(config) { Ext.apply(this, config); @@ -21386,6 +21736,7 @@ Ext.define('Ext.data.writer.Writer', { nameProperty: 'name', + constructor: function(config) { Ext.apply(this, config); }, @@ -21509,8 +21860,10 @@ Ext.define('Ext.util.Floating', { }, onFloatParentHide: function() { - this.showOnParentShow = this.isVisible(); - this.hide(); + if (this.hideOnParentHide !== false) { + this.showOnParentShow = this.isVisible(); + this.hide(); + } }, onFloatParentShow: function() { @@ -21559,23 +21912,27 @@ Ext.define('Ext.util.Floating', { doConstrain: function(constrainTo) { var me = this, - constrainEl, - vector, + vector = me.getConstrainVector(constrainTo), xy; + if (vector) { + xy = me.getPosition(); + xy[0] += vector[0]; + xy[1] += vector[1]; + me.setPosition(xy); + } + }, + + + + getConstrainVector: function(constrainTo){ + var me = this, + el; + if (me.constrain || me.constrainHeader) { - if (me.constrainHeader) { - constrainEl = me.header.el; - } else { - constrainEl = me.el; - } - vector = constrainEl.getConstrainVector(constrainTo || (me.floatParent && me.floatParent.getTargetEl()) || me.container); - if (vector) { - xy = me.getPosition(); - xy[0] += vector[0]; - xy[1] += vector[1]; - me.setPosition(xy); - } + el = me.constrainHeader ? me.header.el : me.el; + constrainTo = constrainTo || (me.floatParent && me.floatParent.getTargetEl()) || me.container; + return el.getConstrainVector(constrainTo); } }, @@ -21670,13 +22027,6 @@ Ext.define('Ext.layout.container.AbstractContainer', { type: 'container', - fixedLayout: true, - - - managedHeight: true, - - managedWidth: true, - bindToOwnerCtComponent: false, @@ -21685,37 +22035,6 @@ Ext.define('Ext.layout.container.AbstractContainer', { - isManaged: function(dimension) { - dimension = Ext.String.capitalize(dimension); - var me = this, - child = me, - managed = me['managed' + dimension], - ancestor = me.owner.ownerCt; - - if (ancestor && ancestor.layout) { - while (ancestor && ancestor.layout) { - if (managed === false || ancestor.layout['managed' + dimension] === false) { - managed = false; - break; - } - ancestor = ancestor.ownerCt; - } - } - return managed; - }, - - layout: function() { - var me = this, - owner = me.owner; - if (Ext.isNumber(owner.height) || owner.isViewport) { - me.managedHeight = false; - } - if (Ext.isNumber(owner.width) || owner.isViewport) { - me.managedWidth = false; - } - me.callParent(arguments); - }, - setItemSize: function(item, width, height) { if (Ext.isObject(width)) { @@ -22088,15 +22407,20 @@ Ext.define('Ext.layout.container.boxOverflow.None', { handleOverflow: Ext.emptyFn, clearOverflow: Ext.emptyFn, + + onRemove: Ext.emptyFn, getItem: function(item) { return this.layout.owner.getComponent(item); - } + }, + + onRemove: Ext.emptyFn }); Ext.define('Ext.util.KeyMap', { alternateClassName: 'Ext.KeyMap', + constructor: function(el, binding, eventName){ var me = this; @@ -22282,10 +22606,10 @@ Ext.define('Ext.util.KeyMap', { } }); - Ext.define('Ext.util.ClickRepeater', { extend: 'Ext.util.Observable', + constructor : function(el, config){ this.el = Ext.get(el); this.el.unselectable(); @@ -22490,6 +22814,8 @@ Ext.define('Ext.layout.component.Button', { ownerEl = owner.el, btnEl = owner.btnEl, btnInnerEl = owner.btnInnerEl, + btnIconEl = owner.btnIconEl, + sizeIconEl = (owner.icon || owner.iconCls) && (owner.iconAlign == "top" || owner.iconAlign == "bottom"), minWidth = owner.minWidth, maxWidth = owner.maxWidth, ownerWidth, btnFrameWidth, metrics; @@ -22510,11 +22836,16 @@ Ext.define('Ext.layout.component.Button', { ownerEl.setWidth(metrics.width + btnFrameWidth + me.adjWidth); btnEl.setWidth(metrics.width + btnFrameWidth); btnInnerEl.setWidth(metrics.width + btnFrameWidth); + + if (sizeIconEl) { + btnIconEl.setWidth(metrics.width + btnFrameWidth); + } } else { ownerEl.setWidth(null); btnEl.setWidth(null); btnInnerEl.setWidth(null); + btnIconEl.setWidth(null); } @@ -23014,9 +23345,6 @@ Ext.define('Ext.util.Offset', { }, equals: function(offset) { - if(!(offset instanceof this.statics())) { - Ext.Error.raise('Offset must be an instance of Ext.util.Offset'); - } return (this.x == offset.x && this.y == offset.y); }, @@ -23062,6 +23390,7 @@ Ext.define('Ext.util.KeyNav', { tab: 9 } }, + constructor: function(el, config){ this.setConfig(el, config || {}); @@ -23259,11 +23588,11 @@ Ext.define('Ext.fx.Queue', { } }); - Ext.define('Ext.fx.target.Target', { isAnimTarget: true, + constructor: function(target) { this.target = target; this.id = this.getId(); @@ -23813,6 +24142,7 @@ Ext.define('Ext.draw.Color', { Ext.define('Ext.dd.StatusProxy', { animRepair: false, + constructor: function(config){ Ext.apply(this, config); this.id = this.id || Ext.id(); @@ -23949,6 +24279,7 @@ Ext.define('Ext.dd.StatusProxy', { Ext.define('Ext.panel.Proxy', { alternateClassName: 'Ext.dd.PanelProxy', + constructor: function(panel, config){ @@ -24155,6 +24486,8 @@ Ext.define('Ext.layout.component.AbstractDock', { }, bodyBox: {} }; + + delete layout.isAutoDock; Ext.applyIf(info, me.getTargetInfo()); @@ -24200,6 +24533,8 @@ Ext.define('Ext.layout.component.AbstractDock', { if (layout && layout.isLayout) { layout.bindToOwnerCtComponent = true; + + layout.isAutoDock = layout.autoSize !== true; layout.layout(); @@ -24403,6 +24738,7 @@ Ext.define('Ext.layout.component.AbstractDock', { adjustAutoBox : function (box, index) { var info = this.info, + owner = this.owner, bodyBox = info.bodyBox, size = info.size, boxes = info.boxes, @@ -24433,33 +24769,43 @@ Ext.define('Ext.layout.component.AbstractDock', { box.y = bodyBox.y; if (!box.overlay) { bodyBox.y += box.height; + if (owner.isFixedHeight()) { + bodyBox.height -= box.height; + } else { + size.height += box.height; + } } - size.height += box.height; break; case 'bottom': + if (!box.overlay) { + if (owner.isFixedHeight()) { + bodyBox.height -= box.height; + } else { + size.height += box.height; + } + } box.y = (bodyBox.y + bodyBox.height); - size.height += box.height; break; case 'left': box.x = bodyBox.x; if (!box.overlay) { bodyBox.x += box.width; - if (autoSizedCtLayout) { - size.width += box.width; - } else { + if (owner.isFixedWidth()) { bodyBox.width -= box.width; + } else { + size.width += box.width; } } break; case 'right': if (!box.overlay) { - if (autoSizedCtLayout) { - size.width += box.width; - } else { + if (owner.isFixedWidth()) { bodyBox.width -= box.width; + } else { + size.width += box.width; } } box.x = (bodyBox.x + bodyBox.width); @@ -24648,6 +24994,13 @@ Ext.define('Ext.layout.component.AbstractDock', { configureItem : function(item, pos) { this.callParent(arguments); + if (item.dock == 'top' || item.dock == 'bottom') { + item.layoutManagedWidth = 1; + item.layoutManagedHeight = 2; + } else { + item.layoutManagedWidth = 2; + item.layoutManagedHeight = 1; + } item.addCls(Ext.baseCSSPrefix + 'docked'); item.addClsWithUI('docked-' + item.dock); @@ -24667,6 +25020,95 @@ Ext.define('Ext.layout.component.AbstractDock', { } }); +Ext.define('Ext.util.Memento', function () { + + function captureOne (src, target, prop) { + src[prop] = target[prop]; + } + + function removeOne (src, target, prop) { + delete src[prop]; + } + + function restoreOne (src, target, prop) { + var value = src[prop]; + if (value || src.hasOwnProperty(prop)) { + restoreValue(target, prop, value); + } + } + + function restoreValue (target, prop, value) { + if (Ext.isDefined(value)) { + target[prop] = value; + } else { + delete target[prop]; + } + } + + function doMany (doOne, src, target, props) { + if (src) { + if (Ext.isArray(props)) { + Ext.each(props, function (prop) { + doOne(src, target, prop); + }); + } else { + doOne(src, target, props); + } + } + } + + return { + + data: null, + + + target: null, + + + constructor: function (target, props) { + if (target) { + this.target = target; + if (props) { + this.capture(props); + } + } + }, + + + capture: function (props, target) { + doMany(captureOne, this.data || (this.data = {}), target || this.target, props); + }, + + + remove: function (props) { + doMany(removeOne, this.data, null, props); + }, + + + restore: function (props, clear, target) { + doMany(restoreOne, this.data, target || this.target, props); + if (clear !== false) { + this.remove(props); + } + }, + + + restoreAll: function (clear, target) { + var me = this, + t = target || this.target; + + Ext.Object.each(me.data, function (prop, value) { + restoreValue(t, prop, value); + }); + + if (clear !== false) { + delete me.data; + } + } + }; +}()); + + Ext.define('Ext.app.EventBus', { requires: [ 'Ext.util.Event' @@ -24709,7 +25151,9 @@ Ext.define('Ext.app.EventBus', { for (i = 0, ln = events.length; i < ln; i++) { event = events[i]; - return event.fire.apply(event, Array.prototype.slice.call(args, 1)); + if (event.fire.apply(event, Array.prototype.slice.call(args, 1)) === false) { + return false; + }; } } } @@ -24943,6 +25387,7 @@ Ext.define('Ext.data.reader.Reader', { isReader: true, + constructor: function(config) { var me = this; @@ -25063,8 +25508,7 @@ Ext.define('Ext.data.reader.Reader', { id = me.getId(node); - record = new Model(values, id); - record.raw = node; + record = new Model(values, id, node); records.push(record); if (me.implicitIncludes) { @@ -25143,7 +25587,6 @@ Ext.define('Ext.data.reader.Reader', { getResponseData: function(response) { - Ext.Error.raise("getResponseData must be implemented in the Ext.data.reader.Reader subclass"); }, @@ -25287,9 +25730,6 @@ Ext.define('Ext.data.reader.Json', { msg: 'Unable to parse the JSON returned by the server: ' + ex.toString() }); } - if (!data) { - Ext.Error.raise('JSON object not found'); - } return data; }, @@ -25379,7 +25819,6 @@ Ext.define('Ext.data.writer.Json', { request.params[root] = Ext.encode(data); } else { - Ext.Error.raise('Must specify a root when using encode'); } } else { @@ -25427,6 +25866,7 @@ Ext.define('Ext.data.proxy.Proxy', { isProxy: true, + constructor: function(config) { config = config || {}; @@ -25852,9 +26292,6 @@ Ext.define('Ext.data.proxy.Server', { var me = this, url = me.getUrl(request); - if (!url) { - Ext.Error.raise("You are using a ServerProxy but have not supplied it with a url."); - } if (me.noCache) { url = Ext.urlAppend(url, Ext.String.format("{0}={1}", me.cacheString, Ext.Date.now())); @@ -25870,7 +26307,6 @@ Ext.define('Ext.data.proxy.Server', { doRequest: function(operation, callback, scope) { - Ext.Error.raise("The doRequest function has not been implemented on your Ext.data.proxy.Server subclass. See src/data/ServerProxy.js for details"); }, @@ -26088,7 +26524,7 @@ Ext.define('Ext.data.Model', { Ext.ModelManager.onModelDefined(cls); }); - } + }; }, inheritableStatics: { @@ -26164,7 +26600,7 @@ Ext.define('Ext.data.Model', { dirty : false, - persistanceProperty: 'data', + persistenceProperty: 'data', evented: false, isModel: true, @@ -26180,7 +26616,8 @@ Ext.define('Ext.data.Model', { - constructor: function(data, id) { + + constructor: function(data, id, raw) { data = data || {}; var me = this, @@ -26194,6 +26631,9 @@ Ext.define('Ext.data.Model', { me.internalId = (id || id === 0) ? id : Ext.data.Model.id(me); + + + me.raw = raw; Ext.applyIf(me, { data: {} @@ -26202,7 +26642,11 @@ Ext.define('Ext.data.Model', { me.modified = {}; - me[me.persistanceProperty] = {}; + + if (me.persistanceProperty) { + me.persistenceProperty = me.persistanceProperty; + } + me[me.persistenceProperty] = {}; me.mixins.observable.constructor.call(me); @@ -26238,13 +26682,11 @@ Ext.define('Ext.data.Model', { } me.id = me.modelName + '-' + me.internalId; - - Ext.ModelManager.register(me); }, get: function(field) { - return this[this.persistanceProperty][field]; + return this[this.persistenceProperty][field]; }, @@ -26286,11 +26728,28 @@ Ext.define('Ext.data.Model', { } } currentValue = me.get(fieldName); - me[me.persistanceProperty][fieldName] = value; + me[me.persistenceProperty][fieldName] = value; if (field && field.persist && !me.isEqual(currentValue, value)) { - me.dirty = true; - me.modified[fieldName] = currentValue; + if (me.isModified(fieldName)) { + if (me.isEqual(modified[fieldName], value)) { + + + delete modified[fieldName]; + + + me.dirty = false; + for (key in modified) { + if (modified.hasOwnProperty(key)){ + me.dirty = true; + break; + } + } + } + } else { + me.dirty = true; + modified[fieldName] = currentValue; + } } if (!me.editing) { @@ -26313,7 +26772,7 @@ Ext.define('Ext.data.Model', { if (!me.editing) { me.editing = true; me.dirtySave = me.dirty; - me.dataSave = Ext.apply({}, me[me.persistanceProperty]); + me.dataSave = Ext.apply({}, me[me.persistenceProperty]); me.modifiedSave = Ext.apply({}, me.modified); } }, @@ -26325,7 +26784,7 @@ Ext.define('Ext.data.Model', { me.editing = false; me.modified = me.modifiedSave; - me[me.persistanceProperty] = me.dataSave; + me[me.persistenceProperty] = me.dataSave; me.dirty = me.dirtySave; delete me.modifiedSave; delete me.dataSave; @@ -26382,12 +26841,6 @@ Ext.define('Ext.data.Model', { }, me); }, - markDirty : function() { - if (Ext.isDefined(Ext.global.console)) { - Ext.global.console.warn('Ext.data.Model: markDirty has been deprecated. Use setDirty instead.'); - } - return this.setDirty.apply(this, arguments); - }, reject : function(silent) { @@ -26398,7 +26851,7 @@ Ext.define('Ext.data.Model', { for (field in modified) { if (modified.hasOwnProperty(field)) { if (typeof modified[field] != "function") { - me[me.persistanceProperty][field] = modified[field]; + me[me.persistenceProperty][field] = modified[field]; } } } @@ -26430,7 +26883,7 @@ Ext.define('Ext.data.Model', { copy : function(newId) { var me = this; - return new me.self(Ext.apply({}, me[me.persistanceProperty]), newId || me.internalId); + return new me.self(Ext.apply({}, me[me.persistenceProperty]), newId || me.internalId); }, @@ -26697,7 +27150,9 @@ Ext.define('Ext.Component', { DIRECTION_TOP: 'top', DIRECTION_RIGHT: 'right', DIRECTION_BOTTOM: 'bottom', - DIRECTION_LEFT: 'left' + DIRECTION_LEFT: 'left', + + VERTICAL_DIRECTION: /^(?:top|bottom)$/ }, @@ -26790,7 +27245,9 @@ Ext.define('Ext.Component', { me.el.setVisibilityMode(Ext.core.Element[me.hideMode.toUpperCase()]); } - me.setAutoScroll(me.autoScroll); + if (Ext.isDefined(me.autoScroll)) { + me.setAutoScroll(me.autoScroll); + } me.callParent(); if (!(me.x && me.y) && (me.pageX || me.pageY)) { @@ -27241,6 +27698,7 @@ Ext.define('Ext.Component', { me.container.remove(); } } + delete me.focusTask; me.callParent(); }, @@ -27259,7 +27717,10 @@ Ext.define('Ext.Component', { focusEl; if (delay) { - me.focusTask.delay(Ext.isNumber(delay) ? delay: 10, null, me, [selectText, false]); + if (!me.focusTask) { + me.focusTask = Ext.create('Ext.util.DelayedTask', me.focus); + } + me.focusTask.delay(Ext.isNumber(delay) ? delay : 10, null, me, [selectText, false]); return me; } @@ -27386,11 +27847,6 @@ Ext.define('Ext.Component', { return this.proxy; } -}, function() { - - - this.prototype.focusTask = Ext.create('Ext.util.DelayedTask', this.prototype.focus); - }); @@ -27440,11 +27896,6 @@ Ext.define('Ext.layout.container.Container', { } }, - afterLayout: function() { - this.owner.afterLayout(arguments); - this.callParent(arguments); - }, - getRenderedItems: function() { var me = this, @@ -27496,8 +27947,6 @@ Ext.define('Ext.layout.container.Auto', { type: 'autocontainer', - fixedLayout: false, - bindToOwnerCtComponent: true, @@ -27524,6 +27973,18 @@ Ext.define('Ext.layout.container.Auto', { me.setItemSize(items[i]); } } + }, + + configureItem: function(item) { + + + + if (this.type === 'autocontainer') { + item.layoutManagedHeight = 2; + item.layoutManagedWidth = 2; + } + + this.callParent(arguments); } }); @@ -27640,7 +28101,7 @@ Ext.define('Ext.container.AbstractContainer', { if (me.rendered && layout && !me.suspendLayout) { - if ((!Ext.isNumber(me.width) || !Ext.isNumber(me.height)) && me.componentLayout.type !== 'autocomponent') { + if (!me.isFixedWidth() || !me.isFixedHeight()) { if (me.componentLayout.layoutBusy !== true) { me.doComponentLayout(); @@ -27757,9 +28218,6 @@ Ext.define('Ext.container.AbstractContainer', { for (i = 0, ln = items.length; i < ln; i++) { item = items[i]; - if (!item) { - Ext.Error.raise("Trying to add a null item as a child of Container with itemId/id: " + me.getItemId()); - } if (index != -1) { item = me.add(index + i, item); @@ -27841,9 +28299,6 @@ Ext.define('Ext.container.AbstractContainer', { remove : function(comp, autoDestroy) { var me = this, c = me.getComponent(comp); - if (Ext.isDefined(Ext.global.console) && !c) { - console.warn("Attempted to remove a component that does not exist. Ext.container.Container: remove takes an argument of the component to remove. cmp.remove() is incorrect usage."); - } if (c && me.fireEvent('beforeremove', me, c) !== false) { me.doRemove(c, autoDestroy); @@ -27903,7 +28358,9 @@ Ext.define('Ext.container.AbstractContainer', { me.suspendLayout = false; - me.doLayout(); + if (len) { + me.doLayout(); + } return items; }, @@ -28412,6 +28869,10 @@ Ext.define('Ext.button.Button', { menuActiveCls: 'menu-active', + + + + ariaRole: 'button', @@ -28420,7 +28881,10 @@ Ext.define('Ext.button.Button', { '' + '' + ' tabIndex="{tabIndex}" role="link">' + - '{text}' + + '' + + '{text}' + + '' + + '' + '' + '' + '' + @@ -28428,7 +28892,10 @@ Ext.define('Ext.button.Button', { ' tabIndex="{tabIndex}" role="button" autocomplete="off">' + - '{text}' + + '' + + '{text}' + + '' + + '' + '' + '' + '' , @@ -28577,7 +29044,8 @@ Ext.define('Ext.button.Button', { Ext.applyIf(me.renderSelectors, { btnEl : me.href ? 'a' : 'button', btnWrap: 'em', - btnInnerEl: '.' + me.baseCls + '-inner' + btnInnerEl: '.' + me.baseCls + '-inner', + btnIconEl: '.'+ me.baseCls + '-icon' }); if (me.scale) { @@ -28685,13 +29153,17 @@ Ext.define('Ext.button.Button', { getHref: function() { - var me = this; - return me.href ? Ext.urlAppend(me.href, me.params + Ext.Object.toQueryString(Ext.apply(Ext.apply({}, me.baseParams)))) : false; + var me = this, + params = Ext.apply({}, me.baseParams); + + + params = Ext.apply(params, me.params); + return me.href ? Ext.urlAppend(me.href, Ext.Object.toQueryString(params)) : false; }, - setParams: function(p) { - this.params = p; + setParams: function(params) { + this.params = params; this.btnEl.dom.href = this.getHref(); }, @@ -28712,11 +29184,11 @@ Ext.define('Ext.button.Button', { setIconCls: function(cls) { var me = this, - btnInnerEl = me.btnInnerEl; - if (btnInnerEl) { + btnIconEl = me.btnIconEl; + if (btnIconEl) { - btnInnerEl.removeCls(me.iconCls); - btnInnerEl.addCls(cls || ''); + btnIconEl.removeCls(me.iconCls); + btnIconEl.addCls(cls || ''); me.setButtonCls(); } me.iconCls = cls; @@ -29228,6 +29700,10 @@ Ext.define('Ext.layout.container.boxOverflow.Menu', { me.menuItems = []; }, + + onRemove: function(comp){ + Ext.Array.remove(this.menuItems, comp); + }, handleOverflow: function(calculations, targetSize) { var me = this, @@ -29279,7 +29755,7 @@ Ext.define('Ext.layout.container.boxOverflow.Menu', { hideTrigger: function() { - if (this.menuTrigger != undefined) { + if (this.menuTrigger !== undefined) { this.menuTrigger.hide(); } }, @@ -29405,7 +29881,6 @@ Ext.define('Ext.layout.container.boxOverflow.Menu', { me.menu = Ext.create('Ext.menu.Menu', { - hideMode: 'offsets', listeners: { scope: me, beforeshow: me.beforeMenuShow @@ -29695,7 +30170,6 @@ Ext.define('Ext.util.Region', { return "Region[" + this.top + "," + this.right + "," + this.bottom + "," + this.left + "]"; }, - translateBy: function(x, y) { if (arguments.length == 1) { @@ -30593,8 +31067,6 @@ Ext.define('Ext.layout.container.Box', { bindToOwnerCtContainer: true, - fixedLayout: false, - availableSpaceOffset: 0, @@ -30636,11 +31108,12 @@ Ext.define('Ext.layout.container.Box', { getChildBox: function(child) { child = child.el || this.owner.getComponent(child).el; + var size = child.getBox(false, true); return { - left: child.getLeft(true), - top: child.getTop(true), - width: child.getWidth(), - height: child.getHeight() + left: size.left, + top: size.top, + width: size.width, + height: size.height }; }, @@ -30684,6 +31157,8 @@ Ext.define('Ext.layout.container.Box', { paddingPerpendicular = perpendicularOffset + padding[me.perpendicularRightBottom], availPerpendicularSize = mmax(0, perpendicularSize - paddingPerpendicular), + innerCtBorderWidth = me.innerCt.getBorderWidth(me.perpendicularLT + me.perpendicularRB), + isStart = me.pack == 'start', isCenter = me.pack == 'center', isEnd = me.pack == 'end', @@ -30900,7 +31375,7 @@ Ext.define('Ext.layout.container.Box', { - diff = mmax(availPerpendicularSize, maxSize) - me.innerCt.getBorderWidth(me.perpendicularLT + me.perpendicularRB) - calcs[perpendicularPrefix]; + diff = mmax(availPerpendicularSize, maxSize) - innerCtBorderWidth - calcs[perpendicularPrefix]; if (diff > 0) { calcs[me.perpendicularLeftTop] = perpendicularOffset + Math.round(diff / 2); } @@ -30923,6 +31398,13 @@ Ext.define('Ext.layout.container.Box', { } }; }, + + onRemove: function(comp){ + this.callParent(arguments); + if (this.overflowHandler) { + this.overflowHandler.onRemove(comp); + } + }, initOverflowHandler: function() { @@ -30935,7 +31417,7 @@ Ext.define('Ext.layout.container.Box', { } var handlerType = 'None'; - if (handler && handler.type != undefined) { + if (handler && handler.type !== undefined) { handlerType = handler.type; } @@ -30980,7 +31462,7 @@ Ext.define('Ext.layout.container.Box', { } if (results.recalculate) { - items = me.getVisibleItems(owner); + items = me.getVisibleItems(); calcs = me.calculateChildBoxes(items, targetSize); boxes = calcs.boxes; } @@ -31284,7 +31766,21 @@ Ext.define('Ext.layout.container.HBox', { perpendicularRB: 'b', perpendicularLeftTop: 'top', perpendicularRightBottom: 'bottom', - perpendicularPosition: 'y' + perpendicularPosition: 'y', + configureItem: function(item) { + if (item.flex) { + item.layoutManagedWidth = 1; + } else { + item.layoutManagedWidth = 2; + } + + if (this.align === 'stretch' || this.align === 'stretchmax') { + item.layoutManagedHeight = 1; + } else { + item.layoutManagedHeight = 2; + } + this.callParent(arguments); + } }); Ext.define('Ext.layout.container.VBox', { @@ -31327,7 +31823,21 @@ Ext.define('Ext.layout.container.VBox', { perpendicularRB: 'r', perpendicularLeftTop: 'left', perpendicularRightBottom: 'right', - perpendicularPosition: 'x' + perpendicularPosition: 'x', + configureItem: function(item) { + if (item.flex) { + item.layoutManagedHeight = 1; + } else { + item.layoutManagedHeight = 2; + } + + if (this.align === 'stretch' || this.align === 'stretchmax') { + item.layoutManagedWidth = 1; + } else { + item.layoutManagedWidth = 2; + } + this.callParent(arguments); + } }); Ext.define('Ext.FocusManager', { @@ -31666,10 +32176,14 @@ Ext.define('Ext.FocusManager', { if (!me.focusedCmp || !(parent = me.focusedCmp.up(':focusable'))) { me.focusEl.focus(); - return; + } else { + parent.focus(); } - parent.focus(); + + + + return true; }, navigateSiblings: function(e, source, parent) { @@ -32124,7 +32638,8 @@ Ext.define('Ext.toolbar.Toolbar', { type: me.layout } : me.layout || {}, { type: me.vertical ? 'vbox' : 'hbox', - align: me.vertical ? 'stretchmax' : 'middle' + align: me.vertical ? 'stretchmax' : 'middle', + clearInnerCtOnLayout: true }); if (me.vertical) { @@ -32273,25 +32788,28 @@ Ext.define('Ext.panel.AbstractPanel', { + - - + isPanel: true, componentLayout: 'dock', + + defaultDockWeights: { top: 1, left: 3, right: 5, bottom: 7 }, + renderTpl: ['
{bodyCls} {baseCls}-body-{ui} {parent.baseCls}-body-{parent.ui}-{.}" style="{bodyStyle}">
'], - + border: true, initComponent : function() { var me = this; - + me.addEvents( 'bodyresize' @@ -32304,17 +32822,17 @@ Ext.define('Ext.panel.AbstractPanel', { Ext.applyIf(me.renderSelectors, { body: '.' + me.baseCls + '-body' }); + - - + if (me.frame && me.border && me.bodyBorder === undefined) { me.bodyBorder = false; } if (me.frame && me.border && (me.bodyBorder === false || me.bodyBorder === 0)) { me.manageBodyBorders = true; } - + me.callParent(); }, @@ -32322,7 +32840,7 @@ Ext.define('Ext.panel.AbstractPanel', { initItems : function() { var me = this, items = me.dockedItems; - + me.callParent(); me.dockedItems = Ext.create('Ext.util.MixedCollection', false, me.getComponentId); if (items) { @@ -32381,13 +32899,13 @@ Ext.define('Ext.panel.AbstractPanel', { delete me.bodyStyle; return styles.length ? styles.join(';') : undefined; }, - + initBodyCls: function() { var me = this, cls = '', bodyCls = me.bodyCls; - + if (bodyCls) { Ext.each(bodyCls, function(v) { cls += " " + v; @@ -32396,7 +32914,7 @@ Ext.define('Ext.panel.AbstractPanel', { } return cls.length > 0 ? cls : undefined; }, - + initRenderData: function() { return Ext.applyIf(this.callParent(), { @@ -32432,7 +32950,10 @@ Ext.define('Ext.panel.AbstractPanel', { item.onAdded(me, i); me.onDockedAdd(item); } - if (me.rendered) { + + + me.componentLayout.childrenChanged = true; + if (me.rendered && !me.suspendLayout) { me.doComponentLayout(); } return items; @@ -32452,7 +32973,7 @@ Ext.define('Ext.panel.AbstractPanel', { var me = this, layout, hasLayout; - + if (!me.dockedItems.contains(item)) { return item; } @@ -32475,8 +32996,11 @@ Ext.define('Ext.panel.AbstractPanel', { if (hasLayout && !autoDestroy) { layout.afterRemove(item); } + + - if (!this.destroying) { + me.componentLayout.childrenChanged = true; + if (!me.destroying && !me.suspendLayout) { me.doComponentLayout(); } @@ -32486,9 +33010,7 @@ Ext.define('Ext.panel.AbstractPanel', { getDockedItems : function(cqSelector) { var me = this, - - - defaultWeight = { top: 1, left: 3, right: 5, bottom: 7 }, + defaultWeight = me.defaultDockWeights, dockedItems; if (me.dockedItems && me.dockedItems.items.length) { @@ -32501,7 +33023,6 @@ Ext.define('Ext.panel.AbstractPanel', { Ext.Array.sort(dockedItems, function(a, b) { - var aw = a.weight || defaultWeight[a.dock], bw = b.weight || defaultWeight[b.dock]; if (Ext.isNumber(aw) && Ext.isNumber(bw)) { @@ -32509,57 +33030,123 @@ Ext.define('Ext.panel.AbstractPanel', { } return 0; }); - + return dockedItems; } return []; }, - + addUIClsToElement: function(cls, force) { - var me = this; - - me.callParent(arguments); - + var me = this, + result = me.callParent(arguments), + classes = [Ext.baseCSSPrefix + cls, me.baseCls + '-body-' + cls, me.baseCls + '-body-' + me.ui + '-' + cls], + array, i; + if (!force && me.rendered) { - me.body.addCls(Ext.baseCSSPrefix + cls); - me.body.addCls(me.baseCls + '-body-' + cls); - me.body.addCls(me.baseCls + '-body-' + me.ui + '-' + cls); + if (me.bodyCls) { + me.body.addCls(me.bodyCls); + } else { + me.body.addCls(classes); + } + } else { + if (me.bodyCls) { + array = me.bodyCls.split(' '); + + for (i = 0; i < classes.length; i++) { + if (!Ext.Array.contains(array, classes[i])) { + array.push(classes[i]); + } + } + + me.bodyCls = array.join(' '); + } else { + me.bodyCls = classes.join(' '); + } } + + return result; }, - + removeUIClsFromElement: function(cls, force) { - var me = this; - - me.callParent(arguments); - + var me = this, + result = me.callParent(arguments), + classes = [Ext.baseCSSPrefix + cls, me.baseCls + '-body-' + cls, me.baseCls + '-body-' + me.ui + '-' + cls], + array, i; + if (!force && me.rendered) { - me.body.removeCls(Ext.baseCSSPrefix + cls); - me.body.removeCls(me.baseCls + '-body-' + cls); - me.body.removeCls(me.baseCls + '-body-' + me.ui + '-' + cls); + if (me.bodyCls) { + me.body.removeCls(me.bodyCls); + } else { + me.body.removeCls(classes); + } + } else { + if (me.bodyCls) { + array = me.bodyCls.split(' '); + + for (i = 0; i < classes.length; i++) { + Ext.Array.remove(array, classes[i]); + } + + me.bodyCls = array.join(' '); + } } + + return result; }, - + addUIToElement: function(force) { - var me = this; - + var me = this, + cls = me.baseCls + '-body-' + me.ui, + array; + me.callParent(arguments); - + if (!force && me.rendered) { - me.body.addCls(me.baseCls + '-body-' + me.ui); + if (me.bodyCls) { + me.body.addCls(me.bodyCls); + } else { + me.body.addCls(cls); + } + } else { + if (me.bodyCls) { + array = me.bodyCls.split(' '); + + if (!Ext.Array.contains(array, cls)) { + array.push(cls); + } + + me.bodyCls = array.join(' '); + } else { + me.bodyCls = cls; + } } }, - + removeUIFromElement: function() { - var me = this; - + var me = this, + cls = me.baseCls + '-body-' + me.ui, + array; + me.callParent(arguments); - + if (me.rendered) { - me.body.removeCls(me.baseCls + '-body-' + me.ui); + if (me.bodyCls) { + me.body.removeCls(me.bodyCls); + } else { + me.body.removeCls(cls); + } + } else { + if (me.bodyCls) { + array = me.bodyCls.split(' '); + Ext.Array.remove(array, cls); + me.bodyCls = array.join(' '); + } else { + me.bodyCls = cls; + } } }, @@ -32575,7 +33162,7 @@ Ext.define('Ext.panel.AbstractPanel', { ln = dockedItems.length, i = 0, item; - + for (; i < ln; i++) { item = dockedItems[i]; @@ -32583,11 +33170,11 @@ Ext.define('Ext.panel.AbstractPanel', { break; } } + - - return dockedItems.splice(0, i).concat(items).concat(dockedItems); + return Ext.Array.splice(dockedItems, 0, i).concat(items).concat(dockedItems); }, beforeDestroy: function(){ @@ -32601,7 +33188,7 @@ Ext.define('Ext.panel.AbstractPanel', { } this.callParent(); }, - + setBorder: function(border) { var me = this; me.border = (border !== undefined) ? border : true; @@ -32695,6 +33282,7 @@ Ext.define('Ext.panel.Header', { ariaRole : 'heading', focusable: false, viewBox: false, + flex : 1, autoSize: true, margins: '5 0 0 0', items: [ me.textConfig ], @@ -32713,6 +33301,7 @@ Ext.define('Ext.panel.Header', { xtype : 'component', ariaRole : 'heading', focusable: false, + flex : 1, renderTpl : ['{title}'], renderData: { title: me.title, @@ -32727,14 +33316,6 @@ Ext.define('Ext.panel.Header', { me.items.push(me.titleCmp); - me.items.push({ - xtype: 'component', - html : ' ', - flex : 1, - focusable: false - }); - - me.items = me.items.concat(me.tools); this.callParent(); }, @@ -32782,36 +33363,90 @@ Ext.define('Ext.panel.Header', { addUIClsToElement: function(cls, force) { - var me = this; - - me.callParent(arguments); + var me = this, + result = me.callParent(arguments), + classes = [me.baseCls + '-body-' + cls, me.baseCls + '-body-' + me.ui + '-' + cls], + array, i; if (!force && me.rendered) { - me.body.addCls(me.baseCls + '-body-' + cls); - me.body.addCls(me.baseCls + '-body-' + me.ui + '-' + cls); + if (me.bodyCls) { + me.body.addCls(me.bodyCls); + } else { + me.body.addCls(classes); + } + } else { + if (me.bodyCls) { + array = me.bodyCls.split(' '); + + for (i = 0; i < classes.length; i++) { + if (!Ext.Array.contains(array, classes[i])) { + array.push(classes[i]); + } + } + + me.bodyCls = array.join(' '); + } else { + me.bodyCls = classes.join(' '); + } } + + return result; }, removeUIClsFromElement: function(cls, force) { - var me = this; - - me.callParent(arguments); + var me = this, + result = me.callParent(arguments), + classes = [me.baseCls + '-body-' + cls, me.baseCls + '-body-' + me.ui + '-' + cls], + array, i; if (!force && me.rendered) { - me.body.removeCls(me.baseCls + '-body-' + cls); - me.body.removeCls(me.baseCls + '-body-' + me.ui + '-' + cls); + if (me.bodyCls) { + me.body.removeCls(me.bodyCls); + } else { + me.body.removeCls(classes); + } + } else { + if (me.bodyCls) { + array = me.bodyCls.split(' '); + + for (i = 0; i < classes.length; i++) { + Ext.Array.remove(array, classes[i]); + } + + me.bodyCls = array.join(' '); + } } + + return result; }, addUIToElement: function(force) { - var me = this; + var me = this, + array, cls; me.callParent(arguments); + cls = me.baseCls + '-body-' + me.ui; if (!force && me.rendered) { - me.body.addCls(me.baseCls + '-body-' + me.ui); + if (me.bodyCls) { + me.body.addCls(me.bodyCls); + } else { + me.body.addCls(cls); + } + } else { + if (me.bodyCls) { + array = me.bodyCls.split(' '); + + if (!Ext.Array.contains(array, cls)) { + array.push(cls); + } + + me.bodyCls = array.join(' '); + } else { + me.bodyCls = cls; + } } if (!force && me.titleCmp && me.titleCmp.rendered && me.titleCmp.textEl) { @@ -32821,12 +33456,26 @@ Ext.define('Ext.panel.Header', { removeUIFromElement: function() { - var me = this; + var me = this, + array, cls; me.callParent(arguments); + cls = me.baseCls + '-body-' + me.ui; if (me.rendered) { - me.body.removeCls(me.baseCls + '-body-' + me.ui); + if (me.bodyCls) { + me.body.removeCls(me.bodyCls); + } else { + me.body.removeCls(cls); + } + } else { + if (me.bodyCls) { + array = me.bodyCls.split(' '); + Ext.Array.remove(array, cls); + me.bodyCls = array.join(' '); + } else { + me.bodyCls = cls; + } } if (me.titleCmp && me.titleCmp.rendered && me.titleCmp.textEl) { @@ -33629,7 +34278,6 @@ Ext.require('Ext.fx.CubicBezier', function() { }); }); - Ext.define('Ext.draw.Draw', { @@ -33695,10 +34343,16 @@ Ext.define('Ext.draw.Draw', { } }, + path2string: function () { return this.join(",").replace(Ext.draw.Draw.pathToStringRE, "$1"); }, + + pathToString: function(arrayPath) { + return arrayPath.join(",").replace(Ext.draw.Draw.pathToStringRE, "$1"); + }, + parsePathString: function (pathString) { if (!pathString) { return null; @@ -33717,12 +34371,12 @@ Ext.define('Ext.draw.Draw', { b && params.push(+b); }); if (name == "m" && params.length > 2) { - data.push([b].concat(params.splice(0, 2))); + data.push([b].concat(Ext.Array.splice(params, 0, 2))); name = "l"; b = (b == "m") ? "l" : "L"; } while (params.length >= paramCounts[name]) { - data.push([b].concat(params.splice(0, paramCounts[name]))); + data.push([b].concat(Ext.Array.splice(params, 0, paramCounts[name]))); if (!paramCounts[name]) { break; } @@ -33753,10 +34407,7 @@ Ext.define('Ext.draw.Draw', { pathClone: function(pathArray) { var res = [], - j, - jj, - i, - ii; + j, jj, i, ii; if (!this.is(pathArray, "array") || !this.is(pathArray && pathArray[0], "array")) { pathArray = this.parsePathString(pathArray); } @@ -33779,80 +34430,93 @@ Ext.define('Ext.draw.Draw', { y = 0, mx = 0, my = 0, - start = 0, - i, - ii, - r, - pa, - j, - jj, - k, - kk; - if (pathArray[0][0] == "M") { + i = 0, + ln = pathArray.length, + r, pathSegment, j, ln2; + + if (ln && pathArray[0][0] == "M") { x = +pathArray[0][1]; y = +pathArray[0][2]; mx = x; my = y; - start++; + i++; res[0] = ["M", x, y]; } - for (i = start, ii = pathArray.length; i < ii; i++) { + for (; i < ln; i++) { r = res[i] = []; - pa = pathArray[i]; - if (pa[0] != pa[0].toUpperCase()) { - r[0] = pa[0].toUpperCase(); + pathSegment = pathArray[i]; + if (pathSegment[0] != pathSegment[0].toUpperCase()) { + r[0] = pathSegment[0].toUpperCase(); switch (r[0]) { + case "A": - r[1] = pa[1]; - r[2] = pa[2]; - r[3] = pa[3]; - r[4] = pa[4]; - r[5] = pa[5]; - r[6] = +(pa[6] + x); - r[7] = +(pa[7] + y); + r[1] = pathSegment[1]; + r[2] = pathSegment[2]; + r[3] = pathSegment[3]; + r[4] = pathSegment[4]; + r[5] = pathSegment[5]; + r[6] = +(pathSegment[6] + x); + r[7] = +(pathSegment[7] + y); break; + case "V": - r[1] = +pa[1] + y; + r[1] = +pathSegment[1] + y; break; + case "H": - r[1] = +pa[1] + x; + r[1] = +pathSegment[1] + x; break; case "M": - mx = +pa[1] + x; - my = +pa[2] + y; + + mx = +pathSegment[1] + x; + my = +pathSegment[2] + y; default: - for (j = 1, jj = pa.length; j < jj; j++) { - r[j] = +pa[j] + ((j % 2) ? x : y); + j = 1; + ln2 = pathSegment.length; + for (; j < ln2; j++) { + r[j] = +pathSegment[j] + ((j % 2) ? x : y); } } - } else { - for (k = 0, kk = pa.length; k < kk; k++) { - res[i][k] = pa[k]; + } + else { + j = 0; + ln2 = pathSegment.length; + for (; j < ln2; j++) { + res[i][j] = pathSegment[j]; } } switch (r[0]) { + case "Z": x = mx; y = my; break; + case "H": x = r[1]; break; + case "V": y = r[1]; break; + case "M": - mx = res[i][res[i].length - 2]; - my = res[i][res[i].length - 1]; + pathSegment = res[i]; + ln2 = pathSegment.length; + mx = pathSegment[ln2 - 2]; + my = pathSegment[ln2 - 1]; default: - x = res[i][res[i].length - 2]; - y = res[i][res[i].length - 1]; + pathSegment = res[i]; + ln2 = pathSegment.length; + x = pathSegment[ln2 - 2]; + y = pathSegment[ln2 - 1]; } } res.toString = this.path2string; return res; }, + pathToRelative: function (pathArray) { if (!this.is(pathArray, "array") || !this.is(pathArray && pathArray[0], "array")) { pathArray = this.parsePathString(pathArray); @@ -33942,9 +34606,9 @@ Ext.define('Ext.draw.Draw', { points[i].shift(); point = points[i]; while (point.length) { - points.splice(i++, 0, ["C"].concat(point.splice(0, 6))); + Ext.Array.splice(points, i++, 0, ["C"].concat(Ext.Array.splice(point, 0, 6))); } - points.splice(i, 1); + Ext.Array.erase(points, i, 1); ln = points.length; } seg = points[i]; @@ -33968,15 +34632,15 @@ Ext.define('Ext.draw.Draw', { pp[i].shift(); var pi = pp[i]; while (pi.length) { - pp.splice(i++, 0, ["C"].concat(pi.splice(0, 6))); + Ext.Array.splice(pp, i++, 0, ["C"].concat(Ext.Array.splice(pi, 0, 6))); } - pp.splice(i, 1); + Ext.Array.erase(pp, i, 1); ii = Math.max(p.length, p2.length || 0); } }, fixM = function (path1, path2, a1, a2, i) { if (path1 && path2 && path1[i][0] == "M" && path2[i][0] != "M") { - path2.splice(i, 0, ["M", a2.x, a2.y]); + Ext.Array.splice(path2, i, 0, ["M", a2.x, a2.y]); a1.bx = 0; a1.by = 0; a1.x = path1[i][1]; @@ -34175,27 +34839,8 @@ Ext.define('Ext.draw.Draw', { return newres; } }, - - rotatePoint: function (x, y, alpha, cx, cy) { - if (!alpha) { - return { - x: x, - y: y - }; - } - cx = cx || 0; - cy = cy || 0; - x = x - cx; - y = y - cy; - alpha = alpha * this.radian; - var cos = Math.cos(alpha), - sin = Math.sin(alpha); - return { - x: x * cos - y * sin + cx, - y: x * sin + y * cos + cy - }; - }, + rotateAndTranslatePath: function (sprite) { var alpha = sprite.rotation.degrees, cx = sprite.rotation.x, @@ -34232,7 +34877,28 @@ Ext.define('Ext.draw.Draw', { } return res; }, + + rotatePoint: function (x, y, alpha, cx, cy) { + if (!alpha) { + return { + x: x, + y: y + }; + } + cx = cx || 0; + cy = cy || 0; + x = x - cx; + y = y - cy; + alpha = alpha * this.radian; + var cos = Math.cos(alpha), + sin = Math.sin(alpha); + return { + x: x * cos - y * sin + cx, + y: x * sin + y * cos + cy + }; + }, + pathDimensions: function (path) { if (!path || !(path + "")) { return {x: 0, y: 0, width: 0, height: 0}; @@ -34242,13 +34908,10 @@ Ext.define('Ext.draw.Draw', { y = 0, X = [], Y = [], - p, - i, - ii, - xmin, - ymin, - dim; - for (i = 0, ii = path.length; i < ii; i++) { + i = 0, + ln = path.length, + p, xmin, ymin, dim; + for (; i < ln; i++) { p = path[i]; if (p[0] == "M") { x = p[1]; @@ -34274,42 +34937,50 @@ Ext.define('Ext.draw.Draw', { height: Math.max.apply(0, Y) - ymin }; }, - + + intersectInside: function(path, cp1, cp2) { + return (cp2[0] - cp1[0]) * (path[1] - cp1[1]) > (cp2[1] - cp1[1]) * (path[0] - cp1[0]); + }, + + intersectIntersection: function(s, e, cp1, cp2) { + var p = [], + dcx = cp1[0] - cp2[0], + dcy = cp1[1] - cp2[1], + dpx = s[0] - e[0], + dpy = s[1] - e[1], + n1 = cp1[0] * cp2[1] - cp1[1] * cp2[0], + n2 = s[0] * e[1] - s[1] * e[0], + n3 = 1 / (dcx * dpy - dcy * dpx); + + p[0] = (n1 * dpx - n2 * dcx) * n3; + p[1] = (n1 * dpy - n2 * dcy) * n3; + return p; + }, + intersect: function(subjectPolygon, clipPolygon) { - var cp1, cp2, s, e, point; - var inside = function(p) { - return (cp2[0]-cp1[0]) * (p[1]-cp1[1]) > (cp2[1]-cp1[1]) * (p[0]-cp1[0]); - }; - var intersection = function() { - var p = []; - var dcx = cp1[0]-cp2[0], - dcy = cp1[1]-cp2[1], - dpx = s[0]-e[0], - dpy = s[1]-e[1], - n1 = cp1[0]*cp2[1] - cp1[1]*cp2[0], - n2 = s[0]*e[1] - s[1]*e[0], - n3 = 1 / (dcx*dpy - dcy*dpx); - - p[0] = (n1*dpx - n2*dcx) * n3; - p[1] = (n1*dpy - n2*dcy) * n3; - return p; - }; - var outputList = subjectPolygon; - cp1 = clipPolygon[clipPolygon.length -1]; - for (var i = 0, l = clipPolygon.length; i < l; ++i) { + var me = this, + i = 0, + ln = clipPolygon.length, + cp1 = clipPolygon[ln - 1], + outputList = subjectPolygon, + cp2, s, e, point, ln2, inputList, j; + for (; i < ln; ++i) { cp2 = clipPolygon[i]; - var inputList = outputList; + inputList = outputList; outputList = []; - s = inputList[inputList.length -1]; - for (var j = 0, ln = inputList.length; j < ln; j++) { + s = inputList[inputList.length - 1]; + j = 0; + ln2 = inputList.length; + for (; j < ln2; j++) { e = inputList[j]; - if (inside(e)) { - if (!inside(s)) { - outputList.push(intersection()); + if (me.intersectInside(e, cp1, cp2)) { + if (!me.intersectInside(s, cp1, cp2)) { + outputList.push(me.intersectIntersection(s, e, cp1, cp2)); } outputList.push(e); - } else if (inside(s)) { - outputList.push(intersection()); + } + else if (me.intersectInside(s, cp1, cp2)) { + outputList.push(me.intersectIntersection(s, e, cp1, cp2)); } s = e; } @@ -34317,7 +34988,7 @@ Ext.define('Ext.draw.Draw', { } return outputList; }, - + curveDim: function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) { var a = (c2x - 2 * c1x + p1x) - (p2x - 2 * c2x + c1x), b = 2 * (c1x - p1x) - 2 * (c2x - c1x), @@ -34370,27 +35041,74 @@ Ext.define('Ext.draw.Draw', { }; }, - getAnchors: function (p1x, p1y, p2x, p2y, p3x, p3y, value) { + + getAnchors: function (prevX, prevY, curX, curY, nextX, nextY, value) { value = value || 4; - var l = Math.min(Math.sqrt(Math.pow(p1x - p2x, 2) + Math.pow(p1y - p2y, 2)) / value, Math.sqrt(Math.pow(p3x - p2x, 2) + Math.pow(p3y - p2y, 2)) / value), - a = Math.atan((p2x - p1x) / Math.abs(p2y - p1y)), - b = Math.atan((p3x - p2x) / Math.abs(p2y - p3y)), - pi = Math.PI; - a = p1y < p2y ? pi - a : a; - b = p3y < p2y ? pi - b : b; - var alpha = pi / 2 - ((a + b) % (pi * 2)) / 2; - alpha > pi / 2 && (alpha -= pi); - var dx1 = l * Math.sin(alpha + a), - dy1 = l * Math.cos(alpha + a), - dx2 = l * Math.sin(alpha + b), - dy2 = l * Math.cos(alpha + b), - out = { - x1: p2x - dx1, - y1: p2y + dy1, - x2: p2x + dx2, - y2: p2y + dy2 - }; - return out; + var M = Math, + PI = M.PI, + halfPI = PI / 2, + abs = M.abs, + sin = M.sin, + cos = M.cos, + atan = M.atan, + control1Length, control2Length, control1Angle, control2Angle, + control1X, control1Y, control2X, control2Y, alpha; + + + + control1Length = (curX - prevX) / value; + control2Length = (nextX - curX) / value; + + + + + + if ((curY >= prevY && curY >= nextY) || (curY <= prevY && curY <= nextY)) { + control1Angle = control2Angle = halfPI; + } else { + control1Angle = atan((curX - prevX) / abs(curY - prevY)); + if (prevY < curY) { + control1Angle = PI - control1Angle; + } + control2Angle = atan((nextX - curX) / abs(curY - nextY)); + if (nextY < curY) { + control2Angle = PI - control2Angle; + } + } + + + alpha = halfPI - ((control1Angle + control2Angle) % (PI * 2)) / 2; + if (alpha > halfPI) { + alpha -= PI; + } + control1Angle += alpha; + control2Angle += alpha; + + + control1X = curX - control1Length * sin(control1Angle); + control1Y = curY + control1Length * cos(control1Angle); + control2X = curX + control2Length * sin(control2Angle); + control2Y = curY + control2Length * cos(control2Angle); + + + + + + if ((curY > prevY && control1Y < prevY) || (curY < prevY && control1Y > prevY)) { + control1X += abs(prevY - control1Y) * (control1X - curX) / (control1Y - curY); + control1Y = prevY; + } + if ((curY > nextY && control2Y < nextY) || (curY < nextY && control2Y > nextY)) { + control2X -= abs(nextY - control2Y) * (control2X - curX) / (control2Y - curY); + control2Y = nextY; + } + + return { + x1: control1X, + y1: control1Y, + x2: control2X, + y2: control2Y + }; }, @@ -34586,23 +35304,25 @@ Ext.define('Ext.fx.PropertyHandler', { statics: { defaultHandler: { - pixelDefaults: ['width', 'height', 'top', 'left'], + pixelDefaultsRE: /width|height|top$|bottom$|left$|right$/i, unitRE: /^(-?\d*\.?\d*){1}(em|ex|px|in|cm|mm|pt|pc|%)*$/, + scrollRE: /^scroll/i, computeDelta: function(from, end, damper, initial, attr) { damper = (typeof damper == 'number') ? damper : 1; - var match = this.unitRE.exec(from), + var unitRE = this.unitRE, + match = unitRE.exec(from), start, units; if (match) { from = match[1]; units = match[2]; - if (!units && Ext.Array.contains(this.pixelDefaults, attr)) { + if (!this.scrollRE.test(attr) && !units && this.pixelDefaultsRE.test(attr)) { units = 'px'; } } from = +from || 0; - match = this.unitRE.exec(end); + match = unitRE.exec(end); if (match) { end = match[1]; units = match[2] || units; @@ -35148,9 +35868,10 @@ Ext.enableFx = true; - Ext.define('Ext.dd.DragDrop', { requires: ['Ext.dd.DragDropManager'], + + constructor: function(id, sGroup, config) { if(id) { this.init(id, sGroup, config); @@ -35372,7 +36093,6 @@ Ext.define('Ext.dd.DragDrop', { initTarget: function(id, sGroup, config) { - this.config = config || {}; @@ -35429,7 +36149,7 @@ Ext.define('Ext.dd.DragDrop', { this.onAvailable(); }, - + setPadding: function(iTop, iRight, iBot, iLeft) { if (!iRight && 0 !== iRight) { @@ -35788,6 +36508,8 @@ Ext.define('Ext.dd.DragDrop', { Ext.define('Ext.dd.DD', { extend: 'Ext.dd.DragDrop', requires: ['Ext.dd.DragDropManager'], + + constructor: function(id, sGroup, config) { if (id) { this.init(id, sGroup, config); @@ -35997,6 +36719,7 @@ Ext.define('Ext.dd.DDProxy', { dragElId: "ygddfdiv" }, + constructor: function(id, sGroup, config) { if (id) { this.init(id, sGroup, config); @@ -36156,6 +36879,7 @@ Ext.define('Ext.dd.DragSource', { repairHighlightColor: 'c3daf9', + constructor: function(el, config) { this.el = Ext.get(el); if(!this.dragData){ @@ -36480,7 +37204,8 @@ Ext.define('Ext.panel.Panel', { 'Ext.util.KeyMap', 'Ext.panel.DD', 'Ext.XTemplate', - 'Ext.layout.component.Dock' + 'Ext.layout.component.Dock', + 'Ext.util.Memento' ], alias: 'widget.panel', alternateClassName: 'Ext.Panel', @@ -36514,6 +37239,8 @@ Ext.define('Ext.panel.Panel', { floatable: true, + + collapsible: false, @@ -36540,24 +37267,41 @@ Ext.define('Ext.panel.Panel', { + initComponent: function() { var me = this, cls; me.addEvents( - + + "beforeexpand", + + + "beforecollapse", + + + "expand", + + + "collapse", + + 'titlechange', - + + 'iconchange' ); + + this.addStateEvents('expand', 'collapse'); + if (me.unstyled) { me.setUI('plain'); } if (me.frame) { - me.setUI('default-framed'); + me.setUI(me.ui + '-framed'); } me.callParent(); @@ -36584,7 +37328,7 @@ Ext.define('Ext.panel.Panel', { - + this.callParent(arguments); }, @@ -36651,7 +37395,7 @@ Ext.define('Ext.panel.Panel', { fbarDefaults, minButtonWidth = me.minButtonWidth; - function initToolbar (toolbar, pos) { + function initToolbar (toolbar, pos, useButtonAlign) { if (Ext.isArray(toolbar)) { toolbar = { xtype: 'toolbar', @@ -36665,11 +37409,21 @@ Ext.define('Ext.panel.Panel', { if (pos == 'left' || pos == 'right') { toolbar.vertical = true; } + + + if (useButtonAlign) { + toolbar.layout = Ext.applyIf(toolbar.layout || {}, { + + pack: { left:'start', center:'center' }[me.buttonAlign] || 'end' + }); + } return toolbar; } + + if (me.tbar) { me.addDocked(initToolbar(me.tbar, 'top')); @@ -36690,7 +37444,7 @@ Ext.define('Ext.panel.Panel', { if (me.fbar) { - fbar = initToolbar(me.fbar, 'bottom'); + fbar = initToolbar(me.fbar, 'bottom', true); fbar.ui = 'footer'; @@ -36706,12 +37460,7 @@ Ext.define('Ext.panel.Panel', { }; } - fbar = me.addDocked(fbar)[0]; - fbar.insert(0, { - flex: 1, - xtype: 'component', - focusable: false - }); + me.addDocked(fbar); me.fbar = null; } @@ -36798,28 +37547,16 @@ Ext.define('Ext.panel.Panel', { me.updateHeader(); - + me.callParent(arguments); + }, + + afterRender: function() { + var me = this; + me.callParent(arguments); if (me.collapsed) { me.collapsed = false; - topContainer = me.findLayoutController(); - if (!me.hidden && topContainer) { - topContainer.on({ - afterlayout: function() { - me.collapse(null, false, true); - }, - single: true - }); - } else { - me.afterComponentLayout = function() { - delete me.afterComponentLayout; - Ext.getClass(me).prototype.afterComponentLayout.apply(me, arguments); - me.collapse(null, false, true); - }; - } + me.collapse(null, false, true); } - - - me.callParent(arguments); }, @@ -37046,13 +37783,13 @@ Ext.define('Ext.panel.Panel', { } frameInfo = reExpander.getFrameInfo(); - + newSize = reExpander[getDimension]() + (frameInfo ? frameInfo[direction] : 0); reExpander.removeClsWithUI(me.collapsedCls); - reExpander.removeClsWithUI(me.collapsedCls + '-' + reExpander.dock); + reExpander.removeClsWithUI(me.collapsedCls + '-' + reExpander.dock); if (me.border && (!me.frame || (me.frame && Ext.supports.CSS3BorderRadius))) { reExpander.removeClsWithUI(me.collapsedCls + '-border-' + reExpander.dock); } @@ -37075,12 +37812,14 @@ Ext.define('Ext.panel.Panel', { cls: me.baseCls + '-collapsed-placeholder ' + ' ' + Ext.baseCSSPrefix + 'docked ' + me.baseCls + '-' + me.ui + '-collapsed', renderTo: me.el }; - reExpander[(reExpander.orientation == 'horizontal') ? 'tools' : 'items'] = [{ - xtype: 'tool', - type: 'expand-' + me.expandDirection, - handler: me.toggleCollapse, - scope: me - }]; + if (!me.hideCollapseTool) { + reExpander[(reExpander.orientation == 'horizontal') ? 'tools' : 'items'] = [{ + xtype: 'tool', + type: 'expand-' + me.expandDirection, + handler: me.toggleCollapse, + scope: me + }]; + } @@ -37110,9 +37849,17 @@ Ext.define('Ext.panel.Panel', { anim.to[collapseDimension] = newSize; + + + + + if (!me.collapseMemento) { + me.collapseMemento = new Ext.util.Memento(me); + } + me.collapseMemento.capture(['width', 'height', 'minWidth', 'minHeight']); + + me.savedFlex = me.flex; - me.savedMinWidth = me.minWidth; - me.savedMinHeight = me.minHeight; me.minWidth = 0; me.minHeight = 0; delete me.flex; @@ -37134,8 +37881,7 @@ Ext.define('Ext.panel.Panel', { i = 0, l = me.hiddenDocked.length; - me.minWidth = me.savedMinWidth; - me.minHeight = me.savedMinHeight; + me.collapseMemento.restore(['minWidth', 'minHeight']); me.body.hide(); for (; i < l; i++) { @@ -37156,6 +37902,13 @@ Ext.define('Ext.panel.Panel', { } + if (Ext.Component.VERTICAL_DIRECTION.test(me.expandDirection)) { + me.collapseMemento.restore('width'); + } else { + me.collapseMemento.restore('height'); + } + + if (me.collapseTool) { me.collapseTool.setType('expand-' + me.expandDirection); } @@ -37171,16 +37924,17 @@ Ext.define('Ext.panel.Panel', { expand: function(animate) { - if (!this.collapsed || this.fireEvent('beforeexpand', this, animate) === false) { + var me = this; + if (!me.collapsed || me.fireEvent('beforeexpand', me, animate) === false) { return false; } - var me = this, - i = 0, + + var i = 0, l = me.hiddenDocked.length, direction = me.expandDirection, height = me.getHeight(), width = me.getWidth(), - pos, anim, satisfyJSLint; + pos, anim; if (animate && me.collapseTool) { @@ -37297,7 +38051,7 @@ Ext.define('Ext.panel.Panel', { if (animate) { me.animate(anim); } else { - me.setSize(anim.to.width, anim.to.height); + me.setCalculatedSize(anim.to.width, anim.to.height); if (anim.to.x) { me.setLeft(anim.to.x); } @@ -37312,6 +38066,14 @@ Ext.define('Ext.panel.Panel', { afterExpand: function(animated) { var me = this; + + if (me.collapseMemento) { + + + + me.collapseMemento.restoreAll(); + } + me.setAutoScroll(me.initialConfig.autoScroll); @@ -37325,7 +38087,9 @@ Ext.define('Ext.panel.Panel', { delete me.suspendLayout; if (animated && me.ownerCt) { - me.ownerCt.doLayout(); + + + Ext.defer(me.ownerCt.doLayout, Ext.isIE6 ? 1 : 0, me); } if (me.resizer) { @@ -37562,6 +38326,7 @@ Ext.define('Ext.tip.Tip', { focusOnToFront: false, componentLayout: 'tip', + closeAction: 'hide', ariaRole: 'tooltip', @@ -37818,9 +38583,6 @@ Ext.define('Ext.tip.ToolTip', { me.tipAnchor = me.anchor.charAt(0); } else { m = me.defaultAlign.match(/^([a-z]+)-([a-z]+)(\?)?$/); - if (!m) { - Ext.Error.raise('The AnchorTip.defaultAlign value "' + me.defaultAlign + '" is invalid.'); - } me.tipAnchor = m[1].charAt(0); } @@ -38368,8 +39130,9 @@ Ext.define('Ext.tip.QuickTipManager', function() { requires: ['Ext.tip.QuickTip'], singleton: true, alternateClassName: 'Ext.QuickTips', + - init : function(autoRender){ + init : function (autoRender, config) { if (!tip) { if (!Ext.isReady) { Ext.onReady(function(){ @@ -38377,10 +39140,24 @@ Ext.define('Ext.tip.QuickTipManager', function() { }); return; } - tip = Ext.create('Ext.tip.QuickTip', { - disabled: disabled, - renderTo: autoRender !== false ? document.body : undefined - }); + + var tipConfig = Ext.apply({ disabled: disabled }, config), + className = tipConfig.className, + xtype = tipConfig.xtype; + + if (className) { + delete tipConfig.className; + } else if (xtype) { + className = 'widget.' + xtype; + delete tipConfig.xtype; + } + + if (autoRender !== false) { + tipConfig.renderTo = document.body; + + } + + tip = Ext.create(className || 'Ext.tip.QuickTip', tipConfig); } }, @@ -38478,8 +39255,9 @@ Ext.define('Ext.app.Application', { appFolder: 'app', - autoCreateViewport: true, + autoCreateViewport: false, + constructor: function(config) { config = config || {}; Ext.apply(this, config); @@ -38498,8 +39276,8 @@ Ext.define('Ext.app.Application', { this.eventbus = Ext.create('Ext.app.EventBus'); - var controllers = this.controllers, - ln = controllers.length, + var controllers = Ext.Array.from(this.controllers), + ln = controllers && controllers.length, i, controller; this.controllers = Ext.create('Ext.util.MixedCollection'); @@ -38874,25 +39652,25 @@ Ext.define('Ext.draw.CompositeSprite', { }, - hide: function(attrs) { + hide: function(redraw) { var i = 0, items = this.items, len = this.length; for (; i < len; i++) { - items[i].hide(); + items[i].hide(redraw); } return this; }, - show: function(attrs) { + show: function(redraw) { var i = 0, items = this.items, len = this.length; for (; i < len; i++) { - items[i].show(); + items[i].show(redraw); } return this; }, @@ -39031,7 +39809,6 @@ Ext.define('Ext.chart.theme.Theme', { return; } } - Ext.Error.raise('No theme found named "' + theme + '"'); } } }, @@ -39135,6 +39912,7 @@ function() { Ext.define('Ext.chart.Mask', { + constructor: function(config) { var me = this; @@ -39547,14 +40325,16 @@ Ext.define('Ext.draw.Surface', { zIndex: 0 }, - - + + + container: undefined, height: 352, width: 512, x: 0, y: 0, + constructor: function(config) { var me = this; config = config || {}; @@ -39630,17 +40410,16 @@ Ext.define('Ext.draw.Surface', { initBackground: function(config) { - var gradientId, - gradient, - backgroundSprite, - width = this.width, - height = this.height; + var me = this, + width = me.width, + height = me.height, + gradientId, gradient, backgroundSprite; if (config) { if (config.gradient) { gradient = config.gradient; gradientId = gradient.id; - this.addGradient(gradient); - this.background = this.add({ + me.addGradient(gradient); + me.background = me.add({ type: 'rect', x: 0, y: 0, @@ -39649,7 +40428,7 @@ Ext.define('Ext.draw.Surface', { fill: 'url(#' + gradientId + ')' }); } else if (config.fill) { - this.background = this.add({ + me.background = me.add({ type: 'rect', x: 0, y: 0, @@ -39658,7 +40437,7 @@ Ext.define('Ext.draw.Surface', { fill: config.fill }); } else if (config.image) { - this.background = this.add({ + me.background = me.add({ type: 'image', x: 0, y: 0, @@ -39943,7 +40722,9 @@ Ext.define('Ext.draw.Surface', { getPathellipse: function (el) { var a = el.attr; - return this.ellipsePath(a.x, a.y, a.radiusX, a.radiusY); + return this.ellipsePath(a.x, a.y, + a.radiusX || (a.width / 2) || 0, + a.radiusY || (a.height / 2) || 0); }, @@ -40115,6 +40896,7 @@ Ext.define('Ext.draw.Component', { }, true); if (me.rendered) { me.setSize(width, height); + me.surface.setSize(width, height); } else { me.surface.setSize(width, height); @@ -40406,6 +41188,7 @@ Ext.define('Ext.chart.Legend', { boxZIndex: 100, + constructor: function(config) { var me = this; if (config) { @@ -40597,7 +41380,6 @@ Ext.define('Ext.chart.Legend', { } }); - Ext.define('Ext.chart.Chart', { @@ -41237,10 +42019,7 @@ Ext.define('Ext.chart.Highlight', { opts = me.highlightCfg, surface = me.chart.surface, animate = me.chart.animate, - p, - from, - to, - pi; + p, from, to, pi; if (!me.highlight || !sprite || sprite._highlighted) { return; @@ -41250,8 +42029,7 @@ Ext.define('Ext.chart.Highlight', { } sprite._highlighted = true; if (!sprite._defaults) { - sprite._defaults = Ext.apply(sprite._defaults || {}, - sprite.attr); + sprite._defaults = Ext.apply({}, sprite.attr); from = {}; to = {}; for (p in opts) { @@ -41281,6 +42059,7 @@ Ext.define('Ext.chart.Highlight', { } sprite._from = from; sprite._to = to; + sprite._endStyle = to; } if (animate) { sprite._anim = Ext.create('Ext.fx.Anim', { @@ -41306,9 +42085,7 @@ Ext.define('Ext.chart.Highlight', { opts = me.highlightCfg, animate = me.chart.animate, i = 0, - obj, - p, - sprite; + obj, p, sprite; for (; i < len; i++) { if (!items[i]) { @@ -41330,6 +42107,8 @@ Ext.define('Ext.chart.Highlight', { } } if (animate) { + + sprite._endStyle = obj; sprite._anim = Ext.create('Ext.fx.Anim', { target: sprite, to: obj, @@ -41419,7 +42198,6 @@ Ext.define('Ext.chart.Label', { var me = this, chart = me.chart, gradients = chart.gradients, - gradient, items = me.items, animate = chart.animate, config = me.label, @@ -41429,24 +42207,28 @@ Ext.define('Ext.chart.Label', { group = me.labelsGroup, store = me.chart.store, len = store.getCount(), - ratio = items.length / len, - i, count, j, - k, gradientsCount = (gradients || 0) && gradients.length, - colorStopTotal, colorStopIndex, colorStop, - item, label, storeItem, - sprite, spriteColor, spriteBrightness, labelColor, + itemLength = (items || 0) && items.length, + ratio = itemLength / len, + gradientsCount = (gradients || 0) && gradients.length, Color = Ext.draw.Color, - colorString; + gradient, i, count, index, j, k, colorStopTotal, colorStopIndex, colorStop, item, label, + storeItem, sprite, spriteColor, spriteBrightness, labelColor, colorString; if (display == 'none') { return; } for (i = 0, count = 0; i < len; i++) { + index = 0; for (j = 0; j < ratio; j++) { item = items[count]; label = group.getAt(count); storeItem = store.getAt(i); + + + while(this.__excludes && this.__excludes[index]) { + index++; + } if (!item && label) { label.hide(true); @@ -41454,14 +42236,25 @@ Ext.define('Ext.chart.Label', { if (item && field[j]) { if (!label) { - label = me.onCreateLabel(storeItem, item, i, display, j, count); + label = me.onCreateLabel(storeItem, item, i, display, j, index); } - me.onPlaceLabel(label, storeItem, item, i, display, animate, j, count); + me.onPlaceLabel(label, storeItem, item, i, display, animate, j, index); if (config.contrast && item.sprite) { sprite = item.sprite; - colorString = sprite._to && sprite._to.fill || sprite.attr.fill; + + if (sprite._endStyle) { + colorString = sprite._endStyle.fill; + } + else if (sprite._to) { + colorString = sprite._to.fill; + } + else { + colorString = sprite.attr.fill; + } + colorString = colorString || sprite.attr.fill; + spriteColor = Color.fromString(colorString); if (colorString && !spriteColor) { @@ -41483,15 +42276,18 @@ Ext.define('Ext.chart.Label', { else { spriteBrightness = spriteColor.getGrayscale() / 255; } + if (label.isOutside) { + spriteBrightness = 1; + } labelColor = Color.fromString(label.attr.color || label.attr.fill).getHSL(); - - labelColor[2] = spriteBrightness > 0.5? 0.2 : 0.8; + labelColor[2] = spriteBrightness > 0.5 ? 0.2 : 0.8; label.setAttributes({ fill: String(Color.fromHSL.apply({}, labelColor)) }, true); } } count++; + index++; } } me.hideLabels(count); @@ -41686,6 +42482,7 @@ Ext.define('Ext.chart.axis.Abstract', { + constructor: function(config) { config = config || {}; @@ -41741,6 +42538,12 @@ Ext.define('Ext.chart.axis.Axis', { + + //@private force min/max values from store + + forceMinMax: false, + + dashSize: 3, @@ -41825,6 +42628,14 @@ Ext.define('Ext.chart.axis.Axis', { out = Ext.draw.Draw.snapEnds(min, max, me.majorTickSteps !== false ? (me.majorTickSteps +1) : me.steps); outfrom = out.from; outto = out.to; + if (me.forceMinMax) { + if (!isNaN(max)) { + out.to = max; + } + if (!isNaN(min)) { + out.from = min; + } + } if (!isNaN(me.maximum)) { @@ -42645,22 +43456,20 @@ Ext.define('Ext.chart.axis.Numeric', { alias: 'axis.numeric', constructor: function(config) { - var me = this, label, f; + var me = this, + hasLabel = !!(config.label && config.label.renderer), + label; + me.callParent([config]); label = me.label; if (me.roundToDecimal === false) { return; } - if (label.renderer) { - f = label.renderer; - label.renderer = function(v) { - return me.roundToDecimal( f(v), me.decimals ); - }; - } else { + if (!hasLabel) { label.renderer = function(v) { return me.roundToDecimal(v, me.decimals); }; - } + } }, roundToDecimal: function(v, dec) { @@ -42952,7 +43761,8 @@ Ext.define('Ext.data.AbstractStore', { constructor: function(config) { - var me = this; + var me = this, + filters; me.addEvents( @@ -42980,12 +43790,13 @@ Ext.define('Ext.data.AbstractStore', { ); Ext.apply(me, config); + me.removed = []; me.mixins.observable.constructor.apply(me, arguments); - me.model = Ext.ModelManager.getModel(config.model || me.model); + me.model = Ext.ModelManager.getModel(me.model); Ext.applyIf(me, { @@ -43006,7 +43817,7 @@ Ext.define('Ext.data.AbstractStore', { } - me.setProxy(config.proxy || me.proxy || me.model.getProxy()); + me.setProxy(me.proxy || me.model.getProxy()); if (me.id && !me.storeId) { me.storeId = me.id; @@ -43020,8 +43831,9 @@ Ext.define('Ext.data.AbstractStore', { me.mixins.sortable.initSortable.call(me); + filters = me.decodeFilters(me.filters); me.filters = Ext.create('Ext.util.MixedCollection'); - me.filters.addAll(me.decodeFilters(config.filters)); + me.filters.addAll(filters); }, @@ -43471,7 +44283,8 @@ Ext.define('Ext.data.Store', { config = config || {}; var me = this, - groupers = config.groupers, + groupers = config.groupers || me.groupers, + groupField = config.groupField || me.groupField, proxy, data; @@ -43506,10 +44319,10 @@ Ext.define('Ext.data.Store', { delete config.data; } - if (!groupers && config.groupField) { + if (!groupers && groupField) { groupers = [{ - property : config.groupField, - direction: config.groupDir + property : groupField, + direction: config.groupDir || me.groupDir }]; } delete config.groupers; @@ -43520,6 +44333,7 @@ Ext.define('Ext.data.Store', { this.callParent([config]); + if (me.groupers.items.length) { me.sort(me.groupers.items, 'prepend', false); } @@ -44140,7 +44954,7 @@ Ext.define('Ext.data.Store', { if (!options.addRecords) { delete me.snapshot; - me.data.clear(); + me.clearData(); } me.data.addAll(records); @@ -44344,9 +45158,6 @@ Ext.define('Ext.data.Store', { for (; i < end; i++) { if (!me.prefetchData.getByKey(i)) { satisfied = false; - if (end - i > me.pageSize) { - Ext.Error.raise("A single page prefetch could never satisfy this request."); - } break; } } @@ -44368,9 +45179,6 @@ Ext.define('Ext.data.Store', { record, i = start; - if (start > end) { - Ext.Error.raise("Start (" + start + ") was greater than end (" + end + ")"); - } if (start !== me.guaranteedStart && end !== me.guaranteedEnd) { me.guaranteedStart = start; @@ -44378,9 +45186,6 @@ Ext.define('Ext.data.Store', { for (; i <= end; i++) { record = me.prefetchData.getByKey(i); - if (!record) { - Ext.Error.raise("Record was not found and store said it was guaranteed"); - } range.push(record); } me.fireEvent('guaranteedrange', range, start, end); @@ -44420,16 +45225,6 @@ Ext.define('Ext.data.Store', { guaranteeRange: function(start, end, cb, scope) { - if (start && end) { - if (end - start > this.pageSize) { - Ext.Error.raise({ - start: start, - end: end, - pageSize: this.pageSize, - msg: "Requested a bigger range than the specified pageSize" - }); - } - } end = (end > this.totalCount) ? this.totalCount - 1 : end; @@ -44495,7 +45290,6 @@ Ext.define('Ext.data.Store', { sorters = me.getSorters(); start = me.guaranteedStart; end = me.guaranteedEnd; - range; if (sorters.length) { prefetchData.sort(sorters); @@ -46543,7 +47337,7 @@ Ext.define('Ext.chart.series.Bar', { }, - onPlaceLabel: function(label, storeItem, item, i, display, animate, index) { + onPlaceLabel: function(label, storeItem, item, i, display, animate, j, index) { var me = this, @@ -46577,6 +47371,7 @@ Ext.define('Ext.chart.series.Bar', { text: text }); + label.isOutside = false; if (column) { if (display == outside) { if (height + offsetY + attr.height > (yValue >= 0 ? zero - chartBBox.y : chartBBox.y + chartBBox.height - zero)) { @@ -46585,6 +47380,7 @@ Ext.define('Ext.chart.series.Bar', { } else { if (height + offsetY > attr.height) { display = outside; + label.isOutside = true; } } x = attr.x + groupBarWidth / 2; @@ -46602,6 +47398,7 @@ Ext.define('Ext.chart.series.Bar', { else { if (width + offsetX > attr.width) { display = outside; + label.isOutside = true; } } x = display == insideStart ? @@ -46730,12 +47527,32 @@ Ext.define('Ext.chart.series.Bar', { getLegendColor: function(index) { - var me = this; - return me.colorArrayStyle[index % me.colorArrayStyle.length]; + var me = this, + colorLength = me.colorArrayStyle.length; + + if (me.style && me.style.fill) { + return me.style.fill; + } else { + return me.colorArrayStyle[index % colorLength]; + } + }, + + highlightItem: function(item) { + this.callParent(arguments); + this.renderLabels(); + }, + + unHighlightItem: function() { + this.callParent(arguments); + this.renderLabels(); + }, + + cleanHighlights: function() { + this.callParent(arguments); + this.renderLabels(); } }); - Ext.define('Ext.chart.series.Column', { @@ -47153,7 +47970,6 @@ Ext.define('Ext.chart.series.Gauge', { - Ext.define('Ext.chart.series.Line', { @@ -47169,6 +47985,8 @@ Ext.define('Ext.chart.series.Line', { type: 'line', alias: 'series.line', + + selectionTolerance: 20, @@ -47186,6 +48004,9 @@ Ext.define('Ext.chart.series.Line', { smooth: false, + defaultSmoothness: 3, + + fill: false, constructor: function(config) { @@ -47277,7 +48098,8 @@ Ext.define('Ext.chart.series.Line', { markerGroup = me.markerGroup, enableShadows = chart.shadow, shadowGroups = me.shadowGroups, - shadowAttributes = this.shadowAttributes, + shadowAttributes = me.shadowAttributes, + smooth = me.smooth, lnsh = shadowGroups.length, dummyPath = ["M"], path = ["M"], @@ -47287,16 +48109,26 @@ Ext.define('Ext.chart.series.Line', { shadowBarAttr, xValues = [], yValues = [], + storeIndices = [], + numericAxis = true, + axisCount = 0, onbreak = false, markerStyle = me.markerStyle, seriesStyle = me.seriesStyle, seriesLabelStyle = me.seriesLabelStyle, colorArrayStyle = me.colorArrayStyle, colorArrayLength = colorArrayStyle && colorArrayStyle.length || 0, + posHash = { + 'left': 'right', + 'right': 'left', + 'top': 'bottom', + 'bottom': 'top' + }, + isNumber = Ext.isNumber, seriesIdx = me.seriesIdx, shadows, shadow, shindex, fromPath, fill, fillPath, rendererAttributes, x, y, prevX, prevY, firstY, markerCount, i, j, ln, axis, ends, marker, markerAux, item, xValue, yValue, coords, xScale, yScale, minX, maxX, minY, maxY, line, animation, endMarkerStyle, - endLineStyle, type, props, firstMarker; + endLineStyle, type, props, firstMarker, count, smoothPath, renderPath; if (!store || !store.getCount()) { @@ -47340,48 +48172,89 @@ Ext.define('Ext.chart.series.Line', { me.clipRect = [bbox.x, bbox.y, bbox.width, bbox.height]; - for (i = 0, ln = axes.length; i < ln; i++) { - axis = chart.axes.get(axes[i]); - if (axis) { - ends = axis.calcEnds(); - if (axis.position == 'top' || axis.position == 'bottom') { - minX = ends.from; - maxX = ends.to; + chart.axes.each(function(axis) { + + + + + if (axis.position == me.axis || axis.position != posHash[me.axis]) { + axisCount++; + if (axis.type != 'Numeric') { + numericAxis = false; + return; } - else { - minY = ends.from; - maxY = ends.to; + numericAxis = (numericAxis && axis.type == 'Numeric'); + if (axis) { + ends = axis.calcEnds(); + if (axis.position == 'top' || axis.position == 'bottom') { + minX = ends.from; + maxX = ends.to; + } + else { + minY = ends.from; + maxY = ends.to; + } } } + }); + + + + + if (numericAxis && axisCount == 1) { + numericAxis = false; } - if (me.xField && !Ext.isNumber(minX) - && (me.axis == 'bottom' || me.axis == 'top')) { - axis = Ext.create('Ext.chart.axis.Axis', { - chart: chart, - fields: [].concat(me.xField) - }).calcEnds(); - minX = axis.from; - maxX = axis.to; + + if (me.xField && !isNumber(minX)) { + if (me.axis == 'bottom' || me.axis == 'top') { + axis = Ext.create('Ext.chart.axis.Axis', { + chart: chart, + fields: [].concat(me.xField) + }).calcEnds(); + minX = axis.from; + maxX = axis.to; + } else if (numericAxis) { + axis = Ext.create('Ext.chart.axis.Axis', { + chart: chart, + fields: [].concat(me.xField), + forceMinMax: true + }).calcEnds(); + minX = axis.from; + maxX = axis.to; + } } - if (me.yField && !Ext.isNumber(minY) - && (me.axis == 'right' || me.axis == 'left')) { - axis = Ext.create('Ext.chart.axis.Axis', { - chart: chart, - fields: [].concat(me.yField) - }).calcEnds(); - minY = axis.from; - maxY = axis.to; + + if (me.yField && !isNumber(minY)) { + if (me.axis == 'right' || me.axis == 'left') { + axis = Ext.create('Ext.chart.axis.Axis', { + chart: chart, + fields: [].concat(me.yField) + }).calcEnds(); + minY = axis.from; + maxY = axis.to; + } else if (numericAxis) { + axis = Ext.create('Ext.chart.axis.Axis', { + chart: chart, + fields: [].concat(me.yField), + forceMinMax: true + }).calcEnds(); + minY = axis.from; + maxY = axis.to; + } } - + if (isNaN(minX)) { minX = 0; xScale = bbox.width / (store.getCount() - 1); } else { - xScale = bbox.width / (maxX - minX); + + + + xScale = bbox.width / ((maxX - minX) || (store.getCount() - 1)); } if (isNaN(minY)) { @@ -47389,30 +48262,31 @@ Ext.define('Ext.chart.series.Line', { yScale = bbox.height / (store.getCount() - 1); } else { - yScale = bbox.height / (maxY - minY); + + + + yScale = bbox.height / ((maxY - minY) || (store.getCount() - 1)); } - + store.each(function(record, i) { xValue = record.get(me.xField); yValue = record.get(me.yField); if (typeof yValue == 'undefined' || (typeof yValue == 'string' && !yValue)) { - if (Ext.isDefined(Ext.global.console)) { - Ext.global.console.warn("[Ext.chart.series.Line] Skipping a store element with an undefined value at ", record, xValue, yValue); - } return; } if (typeof xValue == 'string' || typeof xValue == 'object' - || (me.axis != 'top' && me.axis != 'bottom')) { + || (me.axis != 'top' && me.axis != 'bottom' && !numericAxis)) { xValue = i; } if (typeof yValue == 'string' || typeof yValue == 'object' - || (me.axis != 'left' && me.axis != 'right')) { + || (me.axis != 'left' && me.axis != 'right' && !numericAxis)) { yValue = i; } + storeIndices.push(i); xValues.push(xValue); yValues.push(yValue); }, me); @@ -47426,6 +48300,7 @@ Ext.define('Ext.chart.series.Line', { me.items = []; + count = 0; ln = xValues.length; for (i = 0; i < ln; i++) { xValue = xValues[i]; @@ -47476,7 +48351,7 @@ Ext.define('Ext.chart.series.Line', { } } if (showMarkers) { - marker = markerGroup.getAt(i); + marker = markerGroup.getAt(count++); if (!marker) { marker = Ext.chart.Shape[type](surface, Ext.apply({ group: [group, markerGroup], @@ -47506,12 +48381,13 @@ Ext.define('Ext.chart.series.Line', { }; } } + me.items.push({ series: me, value: [xValue, yValue], point: [x, y], sprite: marker, - storeItem: store.getAt(i) + storeItem: store.getAt(storeIndices[i]) }); prevX = x; prevY = y; @@ -47521,19 +48397,23 @@ Ext.define('Ext.chart.series.Line', { return; } - - if (me.smooth) { - path = Ext.draw.Draw.smooth(path, 6); + + if (smooth) { + smoothPath = Ext.draw.Draw.smooth(path, isNumber(smooth) ? smooth : me.defaultSmoothness); } + renderPath = smooth ? smoothPath : path; + if (chart.markerIndex && me.previousPath) { fromPath = me.previousPath; - fromPath.splice(1, 2); + if (!smooth) { + Ext.Array.erase(fromPath, 1, 2); + } } else { fromPath = path; } - + if (!me.line) { me.line = surface.add(Ext.apply({ @@ -47566,7 +48446,7 @@ Ext.define('Ext.chart.series.Line', { } } if (me.fill) { - fillPath = path.concat([ + fillPath = renderPath.concat([ ["L", x, bbox.y + bbox.height], ["L", bbox.x, bbox.y + bbox.height], ["L", bbox.x, firstY] @@ -47576,7 +48456,7 @@ Ext.define('Ext.chart.series.Line', { group: group, type: 'path', opacity: endLineStyle.opacity || 0.3, - fill: colorArrayStyle[seriesIdx % colorArrayLength] || endLineStyle.fill, + fill: endLineStyle.fill || colorArrayStyle[seriesIdx % colorArrayLength], path: dummyPath }); } @@ -47586,7 +48466,7 @@ Ext.define('Ext.chart.series.Line', { fill = me.fill; line = me.line; - rendererAttributes = me.renderer(line, false, { path: path }, i, store); + rendererAttributes = me.renderer(line, false, { path: renderPath }, i, store); Ext.apply(rendererAttributes, endLineStyle || {}, { stroke: endLineStyle.stroke || endLineStyle.fill }); @@ -47610,12 +48490,12 @@ Ext.define('Ext.chart.series.Line', { for(j = 0; j < lnsh; j++) { if (chart.markerIndex && me.previousPath) { me.onAnimate(shadows[j], { - to: { path: path }, + to: { path: renderPath }, from: { path: fromPath } }); } else { me.onAnimate(shadows[j], { - to: { path: path } + to: { path: renderPath } }); } } @@ -47625,38 +48505,31 @@ Ext.define('Ext.chart.series.Line', { me.onAnimate(me.fillPath, { to: Ext.apply({}, { path: fillPath, - fill: colorArrayStyle[seriesIdx % colorArrayLength] || endLineStyle.fill + fill: endLineStyle.fill || colorArrayStyle[seriesIdx % colorArrayLength] }, endLineStyle || {}) }); } if (showMarkers) { + count = 0; for(i = 0; i < ln; i++) { - item = markerGroup.getAt(i); - if (item) { - if (me.items[i]) { + if (me.items[i]) { + item = markerGroup.getAt(count++); + if (item) { rendererAttributes = me.renderer(item, store.getAt(i), item._to, i, store); me.onAnimate(item, { to: Ext.apply(rendererAttributes, endMarkerStyle || {}) }); - } else { - item.setAttributes(Ext.apply({ - hidden: true - }, item._to), true); } - } + } } - for(; i < markerCount; i++) { - item = markerGroup.getAt(i); + for(; count < markerCount; count++) { + item = markerGroup.getAt(count); item.hide(true); } - - - - } } else { - rendererAttributes = me.renderer(me.line, false, { path: path, hidden: false }, i, store); + rendererAttributes = me.renderer(me.line, false, { path: renderPath, hidden: false }, i, store); Ext.apply(rendererAttributes, endLineStyle || {}, { stroke: endLineStyle.stroke || endLineStyle.fill }); @@ -47668,7 +48541,7 @@ Ext.define('Ext.chart.series.Line', { shadows = me.line.shadows; for(j = 0; j < lnsh; j++) { shadows[j].setAttributes({ - path: path + path: renderPath }, true); } } @@ -47678,26 +48551,29 @@ Ext.define('Ext.chart.series.Line', { }, true); } if (showMarkers) { + count = 0; for(i = 0; i < ln; i++) { - item = markerGroup.getAt(i); - if (item) { - if (me.items[i]) { + if (me.items[i]) { + item = markerGroup.getAt(count++); + if (item) { rendererAttributes = me.renderer(item, store.getAt(i), item._to, i, store); item.setAttributes(Ext.apply(endMarkerStyle || {}, rendererAttributes || {}), true); - } else { - item.hide(true); } - } + } } - for(; i < markerCount; i++) { - item = markerGroup.getAt(i); + for(; count < markerCount; count++) { + item = markerGroup.getAt(count); item.hide(true); } } } if (chart.markerIndex) { - path.splice(1, 0, path[1], path[2]); + if (me.smooth) { + Ext.Array.erase(path, 1, 2); + } else { + Ext.Array.splice(path, 1, 0, path[1], path[2]); + } me.previousPath = path; } me.renderLabels(); @@ -48388,25 +49264,22 @@ Ext.define('Ext.chart.series.Pie', { shadowAttr = shadowAttributes[shindex]; shadow = shadowGroups[shindex].getAt(i); if (!shadow) { - shadow = chart.surface.add(Ext.apply({}, - { + shadow = chart.surface.add(Ext.apply({}, { type: 'path', group: shadowGroups[shindex], strokeLinejoin: "round" - }, - rendererAttributes, shadowAttr)); + }, rendererAttributes, shadowAttr)); } if (animate) { - rendererAttributes = me.renderer(shadow, store.getAt(i), Ext.apply({}, - rendererAttributes, shadowAttr), i, store); + shadowAttr = me.renderer(shadow, store.getAt(i), Ext.apply({}, rendererAttributes, shadowAttr), i, store); me.onAnimate(shadow, { - to: rendererAttributes + to: shadowAttr }); } else { - rendererAttributes = me.renderer(shadow, store.getAt(i), Ext.apply(shadowAttr, { + shadowAttr = me.renderer(shadow, store.getAt(i), Ext.apply(shadowAttr, { hidden: false }), i, store); - shadow.setAttributes(rendererAttributes, true); + shadow.setAttributes(shadowAttr, true); } shadows.push(shadow); } @@ -48937,7 +49810,7 @@ Ext.define('Ext.chart.series.Pie', { getLegendColor: function(index) { var me = this; - return me.colorArrayStyle[index % me.colorArrayStyle.length]; + return (me.colorSet && me.colorSet[index % me.colorSet.length]) || me.colorArrayStyle[index % me.colorArrayStyle.length]; } }); @@ -49413,9 +50286,6 @@ Ext.define('Ext.chart.series.Scatter', { yValue = record.get(me.yField); if (typeof yValue == 'undefined' || (typeof yValue == 'string' && !yValue)) { - if (Ext.isDefined(Ext.global.console)) { - Ext.global.console.warn("[Ext.chart.series.Scatter] Skipping a store element with an undefined value at ", record, xValue, yValue); - } return; } @@ -50003,7 +50873,6 @@ Ext.define('Ext.data.ArrayStore', { alias: 'store.array', uses: ['Ext.data.reader.Array'], - constructor: function(config) { config = config || {}; @@ -50065,6 +50934,7 @@ Ext.define('Ext.data.Batch', { pauseOnException: true, + constructor: function(config) { var me = this; @@ -50223,38 +51093,37 @@ Ext.define('Ext.data.BelongsToAssociation', { return function(options, scope) { options = options || {}; - var foreignKeyId = this.get(foreignKey), - instance, callbackFn; + var model = this, + foreignKeyId = model.get(foreignKey), + instance, + args; - if (this[instanceName] === undefined) { + if (model[instanceName] === undefined) { instance = Ext.ModelManager.create({}, associatedName); instance.set(primaryKey, foreignKeyId); if (typeof options == 'function') { options = { callback: options, - scope: scope || this + scope: scope || model }; } associatedModel.load(foreignKeyId, options); + model[instanceName] = associatedModel; + return associatedModel; } else { - instance = this[instanceName]; - + instance = model[instanceName]; + args = [instance]; + scope = scope || model; - if (typeof options == 'function') { - options.call(scope || this, instance); - } - - if (options.success) { - options.success.call(scope || this, instance); - } - - if (options.callback) { - options.callback.call(scope || this, instance); - } + + Ext.callback(options, scope, args); + Ext.callback(options.success, scope, args); + Ext.callback(options.failure, scope, args); + Ext.callback(options.callback, scope, args); return instance; } @@ -50457,9 +51326,6 @@ Ext.define('Ext.data.proxy.Direct', { i = 0, len; - if (!fn) { - Ext.Error.raise('No direct function specified for this proxy'); - } if (operation.allowWrite()) { request = writer.write(request); @@ -50535,8 +51401,9 @@ Ext.define('Ext.data.DirectStore', { requires: ['Ext.data.proxy.Direct'], - - constructor : function(config){ + + + constructor : function(config){ config = Ext.apply({}, config); if (!config.proxy) { var proxy = { @@ -50907,15 +51774,12 @@ Ext.define('Ext.data.JsonP', { request: function(options){ options = Ext.apply({}, options); - if (!options.url) { - Ext.Error.raise('A url must be specified for a JSONP request.'); - } var me = this, disableCaching = Ext.isDefined(options.disableCaching) ? options.disableCaching : me.disableCaching, cacheParam = options.disableCachingParam || me.disableCachingParam, id = ++me.statics().requestCount, - callbackName = 'callback' + id, + callbackName = options.callbackName || 'callback' + id, callbackKey = options.callbackKey || me.callbackKey, timeout = Ext.isDefined(options.timeout) ? options.timeout : me.timeout, params = Ext.apply({}, options.params), @@ -51059,47 +51923,41 @@ Ext.define('Ext.data.NodeInterface', { modelName = record.modelName, modelClass = mgr.getModel(modelName), idName = modelClass.prototype.idProperty, - instances = Ext.Array.filter(mgr.all.getArray(), function(item) { - return item.modelName == modelName; - }), - iln = instances.length, newFields = [], - i, instance, jln, j, newField; + i, newField, len; modelClass.override(this.getPrototypeBody()); newFields = this.applyFields(modelClass, [ - {name: idName, type: 'string', defaultValue: null}, - {name: 'parentId', type: 'string', defaultValue: null}, - {name: 'index', type: 'int', defaultValue: null}, - {name: 'depth', type: 'int', defaultValue: 0}, - {name: 'expanded', type: 'bool', defaultValue: false, persist: false}, - {name: 'checked', type: 'auto', defaultValue: null}, - {name: 'leaf', type: 'bool', defaultValue: false, persist: false}, - {name: 'cls', type: 'string', defaultValue: null, persist: false}, - {name: 'iconCls', type: 'string', defaultValue: null, persist: false}, - {name: 'root', type: 'boolean', defaultValue: false, persist: false}, - {name: 'isLast', type: 'boolean', defaultValue: false, persist: false}, - {name: 'isFirst', type: 'boolean', defaultValue: false, persist: false}, - {name: 'allowDrop', type: 'boolean', defaultValue: true, persist: false}, - {name: 'allowDrag', type: 'boolean', defaultValue: true, persist: false}, - {name: 'loaded', type: 'boolean', defaultValue: false, persist: false}, - {name: 'loading', type: 'boolean', defaultValue: false, persist: false}, - {name: 'href', type: 'string', defaultValue: null, persist: false}, - {name: 'hrefTarget',type: 'string', defaultValue: null, persist: false}, - {name: 'qtip', type: 'string', defaultValue: null, persist: false}, - {name: 'qtitle', type: 'string', defaultValue: null, persist: false} + {name: idName, type: 'string', defaultValue: null}, + {name: 'parentId', type: 'string', defaultValue: null}, + {name: 'index', type: 'int', defaultValue: null}, + {name: 'depth', type: 'int', defaultValue: 0}, + {name: 'expanded', type: 'bool', defaultValue: false, persist: false}, + {name: 'expandable', type: 'bool', defaultValue: true, persist: false}, + {name: 'checked', type: 'auto', defaultValue: null}, + {name: 'leaf', type: 'bool', defaultValue: false, persist: false}, + {name: 'cls', type: 'string', defaultValue: null, persist: false}, + {name: 'iconCls', type: 'string', defaultValue: null, persist: false}, + {name: 'root', type: 'boolean', defaultValue: false, persist: false}, + {name: 'isLast', type: 'boolean', defaultValue: false, persist: false}, + {name: 'isFirst', type: 'boolean', defaultValue: false, persist: false}, + {name: 'allowDrop', type: 'boolean', defaultValue: true, persist: false}, + {name: 'allowDrag', type: 'boolean', defaultValue: true, persist: false}, + {name: 'loaded', type: 'boolean', defaultValue: false, persist: false}, + {name: 'loading', type: 'boolean', defaultValue: false, persist: false}, + {name: 'href', type: 'string', defaultValue: null, persist: false}, + {name: 'hrefTarget', type: 'string', defaultValue: null, persist: false}, + {name: 'qtip', type: 'string', defaultValue: null, persist: false}, + {name: 'qtitle', type: 'string', defaultValue: null, persist: false} ]); - jln = newFields.length; + len = newFields.length; - for (i = 0; i < iln; i++) { - instance = instances[i]; - for (j = 0; j < jln; j++) { - newField = newFields[j]; - if (instance.get(newField.name) === undefined) { - instance.data[newField.name] = newField.defaultValue; - } + for (i = 0; i < len; ++i) { + newField = newFields[i]; + if (record.get(newField.name) === undefined) { + record.data[newField.name] = newField.defaultValue; } } } @@ -51261,7 +52119,12 @@ Ext.define('Ext.data.NodeInterface', { isExpandable : function() { - return this.get('expandable') || this.hasChildNodes(); + var me = this; + + if (me.get('expandable')) { + return !(me.isLeaf() || (me.isLoaded() && !me.hasChildNodes())); + } + return false; }, @@ -51354,7 +52217,7 @@ Ext.define('Ext.data.NodeInterface', { } - me.childNodes.splice(index, 1); + Ext.Array.erase(me.childNodes, index, 1); if (me.firstChild == node) { @@ -51423,7 +52286,8 @@ Ext.define('Ext.data.NodeInterface', { destroy : function(silent) { - var me = this; + var me = this, + options = me.destroyOptions; if (silent === true) { me.clear(true); @@ -51431,11 +52295,13 @@ Ext.define('Ext.data.NodeInterface', { n.destroy(true); }); me.childNodes = null; + delete me.destroyOptions; + me.callOverridden([options]); } else { + me.destroyOptions = silent; + me.remove(true); } - - me.callOverridden(); }, @@ -51479,7 +52345,7 @@ Ext.define('Ext.data.NodeInterface', { me.setFirstChild(node); } - me.childNodes.splice(refIndex, 0, node); + Ext.Array.splice(me.childNodes, refIndex, 0, node); node.parentNode = me; node.nextSibling = refNode; @@ -51740,7 +52606,7 @@ Ext.define('Ext.data.NodeInterface', { - me.fireEvent('beforeexpand', me, function(records) { + me.fireEvent('beforeexpand', me, function() { me.set('expanded', true); me.fireEvent('expand', me, me.childNodes, false); @@ -51787,15 +52653,14 @@ Ext.define('Ext.data.NodeInterface', { nodes[i].expand(recursive, function () { expanding--; if (callback && !expanding) { - Ext.callback(callback, scope || me, me.childNodes); + Ext.callback(callback, scope || me, [me.childNodes]); } }); } } if (!expanding && callback) { - Ext.callback(callback, scope || me, me.childNodes); - } + Ext.callback(callback, scope || me, [me.childNodes]); } }, @@ -51806,7 +52671,7 @@ Ext.define('Ext.data.NodeInterface', { if (!me.isLeaf()) { if (!me.collapsing && me.isExpanded()) { - me.fireEvent('beforecollapse', me, function(records) { + me.fireEvent('beforecollapse', me, function() { me.set('expanded', false); me.fireEvent('collapse', me, me.childNodes, false); @@ -51826,7 +52691,7 @@ Ext.define('Ext.data.NodeInterface', { } else { - Ext.callback(callback, scope || me, me.childNodes); + Ext.callback(callback, scope || me, [me.childNodes]); } }, @@ -51846,14 +52711,14 @@ Ext.define('Ext.data.NodeInterface', { nodes[i].collapse(recursive, function () { collapsing--; if (callback && !collapsing) { - Ext.callback(callback, scope || me, me.childNodes); + Ext.callback(callback, scope || me, [me.childNodes]); } }); } } if (!collapsing && callback) { - Ext.callback(callback, scope || me, me.childNodes); + Ext.callback(callback, scope || me, [me.childNodes]); } } }; @@ -51882,10 +52747,6 @@ Ext.define('Ext.data.NodeStore', { config = config || {}; Ext.apply(me, config); - if (Ext.isDefined(me.proxy)) { - Ext.Error.raise("A NodeStore cannot be bound to a proxy. Instead bind it to a record " + - "decorated with the NodeInterface by setting the node config."); - } config.proxy = {type: 'proxy'}; me.callParent([config]); @@ -52101,6 +52962,7 @@ Ext.define('Ext.data.Request', { url: undefined, + constructor: function(config) { Ext.apply(this, config); } @@ -52115,7 +52977,8 @@ Ext.define('Ext.data.Tree', { root: null, - + + constructor: function(root) { var me = this; @@ -52261,6 +53124,8 @@ Ext.define('Ext.data.TreeStore', { requires: ['Ext.data.Tree', 'Ext.data.NodeInterface', 'Ext.data.NodeStore'], + + clearOnLoad : true, @@ -52279,7 +53144,6 @@ Ext.define('Ext.data.TreeStore', { var me = this, root, fields; - config = Ext.apply({}, config); @@ -52293,23 +53157,6 @@ Ext.define('Ext.data.TreeStore', { me.tree = Ext.create('Ext.data.Tree'); - - me.tree.on({ - scope: me, - remove: me.onNodeRemove, - beforeexpand: me.onBeforeNodeExpand, - beforecollapse: me.onBeforeNodeCollapse, - append: me.onNodeAdded, - insert: me.onNodeAdded - }); - - me.onBeforeSort(); - - root = me.root; - if (root) { - delete me.root; - me.setRootNode(root); - } me.relayEvents(me.tree, [ @@ -52354,6 +53201,25 @@ Ext.define('Ext.data.TreeStore', { "rootchange" ]); + + me.tree.on({ + scope: me, + remove: me.onNodeRemove, + + + beforeexpand: me.onBeforeNodeExpand, + beforecollapse: me.onBeforeNodeCollapse, + append: me.onNodeAdded, + insert: me.onNodeAdded + }); + + me.onBeforeSort(); + + root = me.root; + if (root) { + delete me.root; + me.setRootNode(root); + } me.addEvents( @@ -52643,7 +53509,7 @@ Ext.define('Ext.data.TreeStore', { removeAll: function() { - this.getRootNode().destroy(); + this.getRootNode().destroy(true); this.fireEvent('clear', this); }, @@ -52690,7 +53556,6 @@ Ext.define('Ext.data.proxy.Client', { clear: function() { - Ext.Error.raise("The Ext.data.proxy.Client subclass that you are using has not defined a 'clear' function. See src/data/ClientProxy.js for details."); } }); @@ -52848,16 +53713,10 @@ Ext.define('Ext.data.proxy.WebStorage', { this.cache = {}; - if (this.getStorageObject() === undefined) { - Ext.Error.raise("Local Storage is not supported in this browser, please use another type of data proxy"); - } this.id = this.id || (this.store ? this.store.storeId : undefined); - if (this.id === undefined) { - Ext.Error.raise("No unique id was provided to the local storage proxy. See Ext.data.proxy.LocalStorage documentation for details"); - } this.initialize(); }, @@ -53160,7 +54019,6 @@ Ext.define('Ext.data.proxy.WebStorage', { getStorageObject: function() { - Ext.Error.raise("The getStorageObject function has not been defined in your Ext.data.proxy.WebStorage subclass"); } }); @@ -53311,54 +54169,33 @@ Ext.define('Ext.data.reader.Xml', { - - createAccessor: function() { - var selectValue = function(expr, root){ - var node = Ext.DomQuery.selectNode(expr, root), - val; - - - - }; - - return function(expr) { - var me = this; - - if (Ext.isEmpty(expr)) { - return Ext.emptyFn; - } - - if (Ext.isFunction(expr)) { - return expr; - } - - return function(root) { - var node = Ext.DomQuery.selectNode(expr, root), - val = me.getNodeValue(node); - - return Ext.isEmpty(val) ? null : val; - }; + createAccessor: function(expr) { + var me = this; + + if (Ext.isEmpty(expr)) { + return Ext.emptyFn; + } + + if (Ext.isFunction(expr)) { + return expr; + } + + return function(root) { + return me.getNodeValue(Ext.DomQuery.selectNode(expr, root)); }; - }(), + }, getNodeValue: function(node) { - var val; if (node && node.firstChild) { - val = node.firstChild.nodeValue; + return node.firstChild.nodeValue; } - return val || null; + return undefined; }, getResponseData: function(response) { var xml = response.responseXML; - if (!xml) { - Ext.Error.raise({ - response: response, - msg: 'XML data not found in the response' - }); - } return xml; }, @@ -53387,9 +54224,6 @@ Ext.define('Ext.data.reader.Xml', { extractData: function(root) { var recordName = this.record; - if (!recordName) { - Ext.Error.raise('Record is a required parameter'); - } if (recordName != root.nodeName) { root = Ext.DomQuery.select(recordName, root); @@ -53417,7 +54251,6 @@ Ext.define('Ext.data.reader.Xml', { } }); - Ext.define('Ext.data.writer.Xml', { @@ -53496,6 +54329,7 @@ Ext.define('Ext.direct.Event', { status: true, + constructor: function(config) { Ext.apply(this, config); @@ -53705,7 +54539,6 @@ Ext.define('Ext.direct.PollingProvider', { }); me.fireEvent('connect', me); } else if (!url) { - Ext.Error.raise('Error initializing PollingProvider, no url configured.'); } }, @@ -53818,7 +54651,8 @@ Ext.define('Ext.direct.Transaction', { }, - + + constructor: function(config){ var me = this; @@ -53950,7 +54784,6 @@ Ext.define('Ext.direct.RemotingProvider', { me.connected = true; me.fireEvent('connect', me); } else if(!me.url) { - Ext.Error.raise('Error initializing RemotingProvider, no url configured.'); } }, @@ -54450,6 +55283,37 @@ Ext.define('Ext.draw.SpriteDD', { Ext.define('Ext.draw.Sprite', { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + mixins: { observable: 'Ext.util.Observable', @@ -54543,7 +55407,7 @@ Ext.define('Ext.draw.Sprite', { me.draggable = true; if (!me.el) { - me.surface.createSprite(me); + me.surface.createSpriteElement(me); } me.dd = Ext.create('Ext.draw.SpriteDD', me, Ext.isBoolean(me.draggable) ? null : me.draggable); me.on('beforedestroy', me.dd.destroy, me.dd); @@ -54561,6 +55425,7 @@ Ext.define('Ext.draw.Sprite', { spriteAttrs = me.attr, attr, i, translate, translation, rotate, rotation, scale, scaling; + attrs = Ext.apply({}, attrs); for (attr in custom) { if (attrs.hasOwnProperty(attr) && typeof custom[attr] == "function") { Ext.apply(attrs, custom[attr].apply(me, [].concat(attrs[attr]))); @@ -54741,6 +55606,8 @@ Ext.define('Ext.draw.engine.Svg', { strokeOpacity: "stroke-opacity", strokeLinejoin: "stroke-linejoin" }, + + parsers: {}, minDefaults: { circle: { @@ -55144,6 +56011,12 @@ Ext.define('Ext.draw.engine.Svg', { el = sprite.el, group = sprite.group, sattr = sprite.attr, + parsers = me.parsers, + + + + gradientsMap = me.gradientsMap || {}, + safariFix = Ext.isSafari && !Ext.isStrict, groups, i, ln, attrs, font, key, style, name, rect; if (group) { @@ -55158,8 +56031,8 @@ Ext.define('Ext.draw.engine.Svg', { attrs = me.scrubAttrs(sprite) || {}; - sprite.bbox.plain = 0; - sprite.bbox.transform = 0; + sprite.bbox.plain = 0; + sprite.bbox.transform = 0; if (sprite.type == "circle" || sprite.type == "ellipse") { attrs.cx = attrs.cx || attrs.x; attrs.cy = attrs.cy || attrs.y; @@ -55168,10 +56041,13 @@ Ext.define('Ext.draw.engine.Svg', { attrs.rx = attrs.ry = attrs.r; } else if (sprite.type == "path" && attrs.d) { - attrs.d = Ext.draw.Draw.pathToAbsolute(attrs.d); + attrs.d = Ext.draw.Draw.pathToString(Ext.draw.Draw.pathToAbsolute(attrs.d)); } sprite.dirtyPath = false; + + + if (attrs['clip-rect']) { me.setClip(sprite, attrs); @@ -55192,9 +56068,22 @@ Ext.define('Ext.draw.engine.Svg', { } for (key in attrs) { if (attrs.hasOwnProperty(key) && attrs[key] != null) { - el.dom.setAttribute(key, String(attrs[key])); + + + + + + if (safariFix && ('color|stroke|fill'.indexOf(key) > -1) && (attrs[key] in gradientsMap)) { + attrs[key] = gradientsMap[attrs[key]]; + } + if (key in parsers) { + el.dom.setAttribute(key, parsers[key](attrs[key], sprite, me)); + } else { + el.dom.setAttribute(key, attrs[key]); + } } } + if (sprite.type == 'text') { me.tuneText(sprite, attrs); } @@ -55269,40 +56158,49 @@ Ext.define('Ext.draw.engine.Svg', { addGradient: function(gradient) { gradient = Ext.draw.Draw.parseGradient(gradient); - var ln = gradient.stops.length, + var me = this, + ln = gradient.stops.length, vector = gradient.vector, - gradientEl, - stop, - stopEl, - i; - if (gradient.type == "linear") { - gradientEl = this.createSvgElement("linearGradient"); - gradientEl.setAttribute("x1", vector[0]); - gradientEl.setAttribute("y1", vector[1]); - gradientEl.setAttribute("x2", vector[2]); - gradientEl.setAttribute("y2", vector[3]); - } - else { - gradientEl = this.createSvgElement("radialGradient"); - gradientEl.setAttribute("cx", gradient.centerX); - gradientEl.setAttribute("cy", gradient.centerY); - gradientEl.setAttribute("r", gradient.radius); - if (Ext.isNumber(gradient.focalX) && Ext.isNumber(gradient.focalY)) { - gradientEl.setAttribute("fx", gradient.focalX); - gradientEl.setAttribute("fy", gradient.focalY); + + + + usePlain = Ext.isSafari && !Ext.isStrict, + gradientEl, stop, stopEl, i, gradientsMap; + + gradientsMap = me.gradientsMap || {}; + + if (!usePlain) { + if (gradient.type == "linear") { + gradientEl = me.createSvgElement("linearGradient"); + gradientEl.setAttribute("x1", vector[0]); + gradientEl.setAttribute("y1", vector[1]); + gradientEl.setAttribute("x2", vector[2]); + gradientEl.setAttribute("y2", vector[3]); } - } - gradientEl.id = gradient.id; - this.getDefs().appendChild(gradientEl); - - for (i = 0; i < ln; i++) { - stop = gradient.stops[i]; - stopEl = this.createSvgElement("stop"); - stopEl.setAttribute("offset", stop.offset + "%"); - stopEl.setAttribute("stop-color", stop.color); - stopEl.setAttribute("stop-opacity",stop.opacity); - gradientEl.appendChild(stopEl); + else { + gradientEl = me.createSvgElement("radialGradient"); + gradientEl.setAttribute("cx", gradient.centerX); + gradientEl.setAttribute("cy", gradient.centerY); + gradientEl.setAttribute("r", gradient.radius); + if (Ext.isNumber(gradient.focalX) && Ext.isNumber(gradient.focalY)) { + gradientEl.setAttribute("fx", gradient.focalX); + gradientEl.setAttribute("fy", gradient.focalY); + } + } + gradientEl.id = gradient.id; + me.getDefs().appendChild(gradientEl); + for (i = 0; i < ln; i++) { + stop = gradient.stops[i]; + stopEl = me.createSvgElement("stop"); + stopEl.setAttribute("offset", stop.offset + "%"); + stopEl.setAttribute("stop-color", stop.color); + stopEl.setAttribute("stop-opacity",stop.opacity); + gradientEl.appendChild(stopEl); + } + } else { + gradientsMap['url(#' + gradient.id + ')'] = gradient.stops[0].color; } + me.gradientsMap = gradientsMap; }, @@ -55352,7 +56250,7 @@ Ext.define('Ext.draw.engine.Svg', { cls = cls.replace(me.trimRe, ''); idx = Ext.Array.indexOf(elClasses, cls); if (idx != -1) { - elClasses.splice(idx, 1); + Ext.Array.erase(elClasses, idx, 1); } } } @@ -55961,64 +56859,74 @@ Ext.define('Ext.draw.engine.Vml', { }, setSize: function(width, height) { - var me = this, - viewBox = me.viewBox, - scaleX, scaleY, items, i, len; + var me = this; width = width || me.width; height = height || me.height; me.width = width; me.height = height; - if (!me.el) { - return; - } + if (me.el) { + + if (width != undefined) { + me.el.setWidth(width); + } + if (height != undefined) { + me.el.setHeight(height); + } - - if (width != undefined) { - me.el.setWidth(width); - } - if (height != undefined) { - me.el.setHeight(height); + + me.applyViewBox(); + + me.callParent(arguments); } + }, + + setViewBox: function(x, y, width, height) { + this.callParent(arguments); + this.viewBox = { + x: x, + y: y, + width: width, + height: height + }; + this.applyViewBox(); + }, + + + applyViewBox: function() { + var me = this, + viewBox = me.viewBox, + width = me.width, + height = me.height, + viewBoxX, viewBoxY, viewBoxWidth, viewBoxHeight, + relativeHeight, relativeWidth, size; - if (viewBox && (width || height)) { - var viewBoxX = viewBox.x, - viewBoxY = viewBox.y, - viewBoxWidth = viewBox.width, - viewBoxHeight = viewBox.height, - relativeHeight = height / viewBoxHeight, - relativeWidth = width / viewBoxWidth, - size; + viewBoxX = viewBox.x; + viewBoxY = viewBox.y; + viewBoxWidth = viewBox.width; + viewBoxHeight = viewBox.height; + relativeHeight = height / viewBoxHeight; + relativeWidth = width / viewBoxWidth; + if (viewBoxWidth * relativeHeight < width) { viewBoxX -= (width - viewBoxWidth * relativeHeight) / 2 / relativeHeight; } if (viewBoxHeight * relativeWidth < height) { viewBoxY -= (height - viewBoxHeight * relativeWidth) / 2 / relativeWidth; } + size = 1 / Math.max(viewBoxWidth / width, viewBoxHeight / height); - + me.viewBoxShift = { dx: -viewBoxX, dy: -viewBoxY, scale: size }; - items = me.items.items; - for (i = 0, len = items.length; i < len; i++) { - me.transform(items[i]); - } + me.items.each(function(item) { + me.transform(item); + }); } - this.callParent(arguments); - }, - - setViewBox: function(x, y, width, height) { - this.callParent(arguments); - this.viewBox = { - x: x, - y: y, - width: width, - height: height - }; }, onAdd: function(item) { @@ -56388,18 +57296,27 @@ Ext.define('Ext.layout.container.Fit', { setItemBox : function(item, box) { var me = this; if (item && box.height > 0) { - if (me.isManaged('width') === true) { + if (!me.owner.isFixedWidth()) { box.width = undefined; } - if (me.isManaged('height') === true) { + if (!me.owner.isFixedHeight()) { box.height = undefined; } me.setItemSize(item, box.width, box.height); } + }, + + configureItem: function(item) { + + + + item.layoutManagedHeight = 0; + item.layoutManagedWidth = 0; + + this.callParent(arguments); } }); - Ext.define('Ext.layout.container.AbstractCard', { @@ -56514,38 +57431,38 @@ Ext.define('Ext.layout.container.AbstractCard', { }, - getNext: function(wrap) { - + getNext: function() { + var wrap = arguments[0]; var items = this.getLayoutItems(), index = Ext.Array.indexOf(items, this.activeItem); return items[index + 1] || (wrap ? items[0] : false); }, - next: function(anim, wrap) { - + next: function() { + var anim = arguments[0], wrap = arguments[1]; return this.setActiveItem(this.getNext(wrap), anim); }, - getPrev: function(wrap) { - + getPrev: function() { + var wrap = arguments[0]; var items = this.getLayoutItems(), index = Ext.Array.indexOf(items, this.activeItem); return items[index - 1] || (wrap ? items[items.length - 1] : false); }, - prev: function(anim, wrap) { - + prev: function() { + var anim = arguments[0], wrap = arguments[1]; return this.setActiveItem(this.getPrev(wrap), anim); } }); @@ -56553,28 +57470,28 @@ Ext.define('Ext.layout.container.AbstractCard', { Ext.define('Ext.selection.Model', { extend: 'Ext.util.Observable', - alternateClassName: 'Ext.AbstractStoreSelectionModel', + alternateClassName: 'Ext.AbstractSelectionModel', requires: ['Ext.data.StoreManager'], - + allowDeselect: false, selected: null, - - + + pruneRemoved: true, constructor: function(cfg) { var me = this; - + cfg = cfg || {}; Ext.apply(me, cfg); - + me.addEvents( 'selectionchange' @@ -56591,14 +57508,14 @@ Ext.define('Ext.selection.Model', { me.selected = Ext.create('Ext.util.MixedCollection'); - + me.callParent(arguments); }, bind : function(store, initial){ var me = this; - + if(!initial && me.store){ if(store !== me.store && me.store.autoDestroy){ me.store.destroy(); @@ -56625,32 +57542,46 @@ Ext.define('Ext.selection.Model', { } }, - selectAll: function(silent) { - var selections = this.store.getRange(), + + selectAll: function(suppressEvent) { + var me = this, + selections = me.store.getRange(), i = 0, - len = selections.length; - + len = selections.length, + start = me.getSelection().length; + + me.bulkChange = true; for (; i < len; i++) { - this.doSelect(selections[i], true, silent); + me.doSelect(selections[i], true, suppressEvent); } + delete me.bulkChange; + + me.maybeFireSelectionChange(me.getSelection().length !== start); }, - deselectAll: function() { - var selections = this.getSelection(), + + deselectAll: function(suppressEvent) { + var me = this, + selections = me.getSelection(), i = 0, - len = selections.length; - + len = selections.length, + start = me.getSelection().length; + + me.bulkChange = true; for (; i < len; i++) { - this.doDeselect(selections[i]); + me.doDeselect(selections[i], suppressEvent); } + delete me.bulkChange; + + me.maybeFireSelectionChange(me.getSelection().length !== start); }, - selectWithEvent: function(record, e) { + selectWithEvent: function(record, e, keepExisting) { var me = this; - + switch (me.selectionMode) { case 'MULTI': if (e.ctrlKey && me.isSelected(record)) { @@ -56660,7 +57591,7 @@ Ext.define('Ext.selection.Model', { } else if (e.ctrlKey) { me.doSelect(record, true, false); } else if (me.isSelected(record) && !e.shiftKey && !e.ctrlKey && me.selected.getCount() > 1) { - me.doSelect(record, false, false); + me.doSelect(record, keepExisting, false); } else { me.doSelect(record, false); } @@ -56693,22 +57624,22 @@ Ext.define('Ext.selection.Model', { tmp, dontDeselect, records = []; - + if (me.isLocked()){ return; } - + if (!keepExisting) { - me.clearSelections(); + me.deselectAll(true); } - + if (!Ext.isNumber(startRow)) { startRow = store.indexOf(startRow); - } + } if (!Ext.isNumber(endRow)) { endRow = store.indexOf(endRow); } - + if (startRow > endRow){ tmp = endRow; @@ -56727,7 +57658,7 @@ Ext.define('Ext.selection.Model', { } else { dontDeselect = (dir == 'up') ? startRow : endRow; } - + for (i = startRow; i <= endRow; i++){ if (selectedCount == (endRow - startRow + 1)) { if (i != dontDeselect) { @@ -56739,7 +57670,7 @@ Ext.define('Ext.selection.Model', { } me.doMultiSelect(records, true); }, - + select: function(records, keepExisting, suppressEvent) { this.doSelect(records, keepExisting, suppressEvent); @@ -56749,11 +57680,11 @@ Ext.define('Ext.selection.Model', { deselect: function(records, suppressEvent) { this.doDeselect(records, suppressEvent); }, - + doSelect: function(records, keepExisting, suppressEvent) { var me = this, record; - + if (me.locked) { return; } @@ -56774,17 +57705,24 @@ Ext.define('Ext.selection.Model', { change = false, i = 0, len, record; - + if (me.locked) { return; } - + records = !Ext.isArray(records) ? [records] : records; len = records.length; if (!keepExisting && selected.getCount() > 0) { + if (me.doDeselect(me.getSelection(), suppressEvent) === false) { + return; + } + + } + + function commit () { + selected.add(record); change = true; - me.doDeselect(me.getSelection(), true); } for (; i < len; i++) { @@ -56792,11 +57730,9 @@ Ext.define('Ext.selection.Model', { if (keepExisting && me.isSelected(record)) { continue; } - change = true; me.lastSelected = record; - selected.add(record); - me.onSelectChange(record, true, suppressEvent); + me.onSelectChange(record, true, suppressEvent, commit); } me.setLastFocused(record, suppressEvent); @@ -56807,38 +57743,49 @@ Ext.define('Ext.selection.Model', { doDeselect: function(records, suppressEvent) { var me = this, selected = me.selected, - change = false, i = 0, - len, record; - + len, record, + attempted = 0, + accepted = 0; + if (me.locked) { - return; + return false; } if (typeof records === "number") { records = [me.store.getAt(records)]; + } else if (!Ext.isArray(records)) { + records = [records]; + } + + function commit () { + ++accepted; + selected.remove(record); } - records = !Ext.isArray(records) ? [records] : records; len = records.length; + for (; i < len; i++) { record = records[i]; - if (selected.remove(record)) { + if (me.isSelected(record)) { if (me.lastSelected == record) { me.lastSelected = selected.last(); } - me.onSelectChange(record, false, suppressEvent); - change = true; + ++attempted; + me.onSelectChange(record, false, suppressEvent, commit); } } + - me.maybeFireSelectionChange(change && !suppressEvent); + me.maybeFireSelectionChange(accepted > 0 && !suppressEvent); + return accepted === attempted; }, doSingleSelect: function(record, suppressEvent) { var me = this, + changed = false, selected = me.selected; - + if (me.locked) { return; } @@ -56847,16 +57794,28 @@ Ext.define('Ext.selection.Model', { if (me.isSelected(record)) { return; } - if (selected.getCount() > 0) { - me.doDeselect(me.lastSelected, suppressEvent); + + function commit () { + me.bulkChange = true; + if (selected.getCount() > 0 && me.doDeselect(me.lastSelected, suppressEvent) === false) { + delete me.bulkChange; + return false; + } + delete me.bulkChange; + + selected.add(record); + me.lastSelected = record; + changed = true; } - selected.add(record); - me.lastSelected = record; - me.onSelectChange(record, true, suppressEvent); - if (!suppressEvent) { - me.setLastFocused(record); + + me.onSelectChange(record, true, suppressEvent, commit); + + if (changed) { + if (!suppressEvent) { + me.setLastFocused(record); + } + me.maybeFireSelectionChange(!suppressEvent); } - me.maybeFireSelectionChange(!suppressEvent); }, @@ -56866,7 +57825,7 @@ Ext.define('Ext.selection.Model', { me.lastFocused = record; me.onLastFocusChanged(recordBeforeLast, record, supressFocus); }, - + isFocused: function(record) { return record === this.getLastFocused(); @@ -56876,8 +57835,8 @@ Ext.define('Ext.selection.Model', { maybeFireSelectionChange: function(fireEvent) { - if (fireEvent) { - var me = this; + var me = this; + if (fireEvent && !me.bulkChange) { me.fireEvent('selectionchange', me, me.getSelection()); } }, @@ -56886,7 +57845,7 @@ Ext.define('Ext.selection.Model', { getLastSelected: function() { return this.lastSelected; }, - + getLastFocused: function() { return this.lastFocused; }, @@ -56924,7 +57883,7 @@ Ext.define('Ext.selection.Model', { record = Ext.isNumber(record) ? this.store.getAt(record) : record; return this.selected.indexOf(record) !== -1; }, - + hasSelection: function() { return this.selected.getCount() > 0; @@ -56957,7 +57916,7 @@ Ext.define('Ext.selection.Model', { } me.clearSelections(); - + if (me.store.indexOf(lastFocused) !== -1) { this.setLastFocused(lastFocused, true); @@ -56967,16 +57926,16 @@ Ext.define('Ext.selection.Model', { me.doSelect(toBeSelected, false, true); } - + me.maybeFireSelectionChange(change); }, + clearSelections: function() { - var me = this; - me.selected.clear(); - me.lastSelected = null; - me.setLastFocused(null); + this.selected.clear(); + this.lastSelected = null; + this.setLastFocused(null); }, @@ -56987,14 +57946,9 @@ Ext.define('Ext.selection.Model', { onStoreClear: function() { - var me = this, - selected = this.selected; - - if (selected.getCount > 0) { - selected.clear(); - me.lastSelected = null; - me.setLastFocused(null); - me.maybeFireSelectionChange(true); + if (this.selected.getCount > 0) { + this.clearSelections(); + this.maybeFireSelectionChange(true); } }, @@ -57004,7 +57958,7 @@ Ext.define('Ext.selection.Model', { onStoreRemove: function(store, record) { var me = this, selected = me.selected; - + if (me.locked || !me.pruneRemoved) { return; } @@ -57020,6 +57974,7 @@ Ext.define('Ext.selection.Model', { } }, + getCount: function() { return this.selected.getCount(); }, @@ -57057,25 +58012,31 @@ Ext.define('Ext.selection.Model', { Ext.define('Ext.selection.DataViewModel', { extend: 'Ext.selection.Model', - + requires: ['Ext.util.KeyNav'], deselectOnContainerClick: true, - + enableKeyNav: true, - + constructor: function(cfg){ this.addEvents( - 'deselect', + 'beforedeselect', + + + 'beforeselect', + + 'deselect', + 'select' ); this.callParent(arguments); }, - + bindComponent: function(view) { var me = this, eventListeners = { @@ -57105,15 +58066,15 @@ Ext.define('Ext.selection.DataViewModel', { this.deselectAll(); } }, - + initKeyNav: function(view) { var me = this; - + if (!view.rendered) { view.on('render', Ext.Function.bind(me.initKeyNav, me, [view], 0), me, {single: true}); return; } - + view.el.set({ tabIndex: -1 }); @@ -57125,7 +58086,7 @@ Ext.define('Ext.selection.DataViewModel', { scope: me }); }, - + onNavKey: function(step) { step = step || 1; var me = this, @@ -57133,42 +58094,39 @@ Ext.define('Ext.selection.DataViewModel', { selected = me.getSelection()[0], numRecords = me.view.store.getCount(), idx; - + if (selected) { idx = view.indexOf(view.getNode(selected)) + step; } else { idx = 0; } - + if (idx < 0) { idx = numRecords - 1; } else if (idx >= numRecords) { idx = 0; } - + me.select(idx); }, - onSelectChange: function(record, isSelected, suppressEvent) { + onSelectChange: function(record, isSelected, suppressEvent, commitFn) { var me = this, view = me.view, - allowSelect = true; - - if (isSelected) { - if (!suppressEvent) { - allowSelect = me.fireEvent('beforeselect', me, record) !== false; - } - if (allowSelect) { + eventName = isSelected ? 'select' : 'deselect'; + + if ((suppressEvent || me.fireEvent('before' + eventName, me, record)) !== false && + commitFn() !== false) { + + if (isSelected) { view.onItemSelect(record); - if (!suppressEvent) { - me.fireEvent('select', me, record); - } + } else { + view.onItemDeselect(record); } - } else { - view.onItemDeselect(record); + if (!suppressEvent) { - me.fireEvent('deselect', me, record); + me.fireEvent(eventName, me, record); } } } @@ -57178,6 +58136,7 @@ Ext.define('Ext.selection.DataViewModel', { Ext.define('Ext.state.CookieProvider', { extend: 'Ext.state.Provider', + constructor : function(config){ var me = this; me.path = "/"; @@ -57249,6 +58208,8 @@ Ext.define('Ext.state.CookieProvider', { } }); + + Ext.define('Ext.state.LocalStorageProvider', { @@ -57309,7 +58270,6 @@ Ext.define('Ext.state.LocalStorageProvider', { } catch (e) { return false; } - Ext.Error.raise('LocalStorage is not supported by the current browser'); } }); @@ -57378,25 +58338,25 @@ Ext.define('Ext.view.AbstractView', { 'Ext.DomQuery', 'Ext.selection.DataViewModel' ], - + inheritableStatics: { getRecord: function(node) { return this.getBoundView(node).getRecord(node); }, - + getBoundView: function(node) { return Ext.getCmp(node.boundView); } }, - + - + itemCls: Ext.baseCSSPrefix + 'dataview-item', - + @@ -57405,10 +58365,13 @@ Ext.define('Ext.view.AbstractView', { loadingText: 'Loading...', + loadMask: true, + + loadingUseMsg: true, - + @@ -57432,12 +58395,12 @@ Ext.define('Ext.view.AbstractView', { last: false, - + triggerEvent: 'itemclick', triggerCtEvent: 'containerclick', - + addCmpEvents: function() { - + }, @@ -57446,7 +58409,7 @@ Ext.define('Ext.view.AbstractView', { isDef = Ext.isDefined, itemTpl = me.itemTpl, memberFn = {}; - + if (itemTpl) { if (Ext.isArray(itemTpl)) { @@ -57456,53 +58419,22 @@ Ext.define('Ext.view.AbstractView', { memberFn = Ext.apply(memberFn, itemTpl.initialConfig); itemTpl = itemTpl.html; } - + if (!me.itemSelector) { me.itemSelector = '.' + me.itemCls; } - + itemTpl = Ext.String.format('
{1}
', me.itemCls, itemTpl); me.tpl = Ext.create('Ext.XTemplate', itemTpl, memberFn); } - if (!isDef(me.tpl) || !isDef(me.itemSelector)) { - Ext.Error.raise({ - sourceClass: 'Ext.view.View', - tpl: me.tpl, - itemSelector: me.itemSelector, - msg: "DataView requires both tpl and itemSelector configurations to be defined." - }); - } me.callParent(); if(Ext.isString(me.tpl) || Ext.isArray(me.tpl)){ me.tpl = Ext.create('Ext.XTemplate', me.tpl); } - - - if (isDef(me.overCls) || isDef(me.overClass)) { - if (Ext.isDefined(Ext.global.console)) { - Ext.global.console.warn('Ext.view.View: Using the deprecated overCls or overClass configuration. Use overItemCls instead.'); - } - me.overItemCls = me.overCls || me.overClass; - delete me.overCls; - delete me.overClass; - } - if (me.overItemCls) { - me.trackOver = true; - } - - if (isDef(me.selectedCls) || isDef(me.selectedClass)) { - if (Ext.isDefined(Ext.global.console)) { - Ext.global.console.warn('Ext.view.View: Using the deprecated selectedCls or selectedClass configuration. Use selectedItemCls instead.'); - } - me.selectedItemCls = me.selectedCls || me.selectedClass; - delete me.selectedCls; - delete me.selectedClass; - } - me.addEvents( 'beforerefresh', @@ -57522,45 +58454,62 @@ Ext.define('Ext.view.AbstractView', { me.store = Ext.data.StoreManager.lookup(me.store); } me.all = new Ext.CompositeElementLite(); - me.getSelectionModel().bindComponent(me); }, onRender: function() { var me = this, - loadingText = me.loadingText, - loadingHeight = me.loadingHeight, - undef; + mask = me.loadMask, + cfg = { + msg: me.loadingText, + msgCls: me.loadingCls, + useMsg: me.loadingUseMsg + }; me.callParent(arguments); - if (loadingText) { + + if (mask) { + if (Ext.isObject(mask)) { + cfg = Ext.apply(cfg, mask); + } - me.loadMask = Ext.create('Ext.LoadMask', me.floating ? me : me.ownerCt || me, { - msg: loadingText, - msgCls: me.loadingCls, - useMsg: me.loadingUseMsg, - listeners: { - beforeshow: function() { - me.getTargetEl().update(''); - me.getSelectionModel().deselectAll(); - me.all.clear(); - if (loadingHeight) { - me.setCalculatedSize(undef, loadingHeight); - } - }, - hide: function() { - if (loadingHeight) { - me.setHeight(me.height); - } - } - } + me.loadMask = Ext.create('Ext.LoadMask', me.floating ? me : me.ownerCt || me, cfg); + me.loadMask.on({ + scope: me, + beforeshow: me.onMaskBeforeShow, + hide: me.onMaskHide }); } }, + + onMaskBeforeShow: function(){ + var me = this; + me.getSelectionModel().deselectAll(); + me.all.clear(); + if (me.loadingHeight) { + me.setCalculatedSize(undefined, me.loadingHeight); + } + }, + + onMaskHide: function(){ + if (!this.destroying && this.loadingHeight) { + this.setHeight(this.height); + } + }, + + afterRender: function() { + this.callParent(arguments); + + + + + this.getSelectionModel().bindComponent(this); + }, + getSelectionModel: function(){ var me = this, mode = 'SINGLE'; @@ -57585,7 +58534,9 @@ Ext.define('Ext.view.AbstractView', { } if (!me.selModel.hasRelaySetup) { - me.relayEvents(me.selModel, ['selectionchange', 'beforeselect', 'select', 'deselect']); + me.relayEvents(me.selModel, [ + 'selectionchange', 'beforeselect', 'beforedeselect', 'select', 'deselect' + ]); me.selModel.hasRelaySetup = true; } @@ -57603,11 +58554,11 @@ Ext.define('Ext.view.AbstractView', { var me = this, el, records; - + if (!me.rendered) { return; } - + me.fireEvent('beforerefresh', me); el = me.getTargetEl(); records = me.store.getRange(); @@ -57623,7 +58574,7 @@ Ext.define('Ext.view.AbstractView', { me.all.fill(Ext.query(me.getItemSelector(), el.dom)); me.updateIndexes(0); } - + me.selModel.refresh(); me.hasSkippedEmptyText = true; me.fireEvent('refresh', me); @@ -57631,22 +58582,23 @@ Ext.define('Ext.view.AbstractView', { prepareData: function(data, index, record) { - if (record) { - Ext.apply(data, record.getAssociatedData()); + if (record) { + Ext.apply(data, record.getAssociatedData()); } return data; }, - + collectData : function(records, startIndex){ var r = [], i = 0, - len = records.length; + len = records.length, + record; for(; i < len; i++){ - r[r.length] = this.prepareData(records[i].data, startIndex + i, records[i]); + record = records[i]; + r[r.length] = this.prepareData(record[record.persistenceProperty], startIndex + i, record); } - return r; }, @@ -57661,11 +58613,9 @@ Ext.define('Ext.view.AbstractView', { onUpdate : function(ds, record){ var me = this, index = me.store.indexOf(record), - original, node; if (index > -1){ - original = me.all.elements[index]; node = me.bufferRender([record], index)[0]; me.all.replaceElement(index, node, true); @@ -57683,12 +58633,12 @@ Ext.define('Ext.view.AbstractView', { onAdd : function(ds, records, index) { var me = this, nodes; - + if (me.all.getCount() === 0) { me.refresh(); return; } - + nodes = me.bufferRender(records, index); me.doAdd(nodes, records, index); @@ -57698,21 +58648,22 @@ Ext.define('Ext.view.AbstractView', { }, doAdd: function(nodes, records, index) { - var n, a = this.all.elements; - if (index < this.all.getCount()) { - n = this.all.item(index).insertSibling(nodes, 'before', true); - a.splice.apply(a, [index, 0].concat(nodes)); - } + var all = this.all; + + if (index < all.getCount()) { + all.item(index).insertSibling(nodes, 'before', true); + } else { - n = this.all.last().insertSibling(nodes, 'after', true); - a.push.apply(a, nodes); - } + all.last().insertSibling(nodes, 'after', true); + } + + Ext.Array.insert(all.elements, index, nodes); }, - + onRemove : function(ds, record, index) { var me = this; - + me.doRemove(record, index); me.updateIndexes(index); if (me.store.getCount() === 0){ @@ -57720,7 +58671,7 @@ Ext.define('Ext.view.AbstractView', { } me.fireEvent('itemremove', record, index); }, - + doRemove: function(record, index) { this.all.removeElement(index, true); }, @@ -57753,11 +58704,11 @@ Ext.define('Ext.view.AbstractView', { bindStore : function(store, initial) { var me = this; - + if (!initial && me.store) { if (store !== me.store && me.store.autoDestroy) { me.store.destroy(); - } + } else { me.mun(me.store, { scope: me, @@ -57789,12 +58740,12 @@ Ext.define('Ext.view.AbstractView', { me.loadMask.bindStore(store); } } - + me.store = store; me.getSelectionModel().bind(store); - - if (store) { + + if (store && (!initial || store.getCount())) { me.refresh(true); } }, @@ -57810,7 +58761,7 @@ Ext.define('Ext.view.AbstractView', { findItemByChild: function(node){ return Ext.fly(node).findParent(this.getItemSelector(), this.getTargetEl()); }, - + findTargetByEvent: function(e) { return e.getTarget(this.getItemSelector(), this.getTargetEl()); @@ -57849,7 +58800,7 @@ Ext.define('Ext.view.AbstractView', { getRecord: function(node){ return this.store.data.getByKey(Ext.getDom(node).viewRecordId); }, - + isSelected : function(node) { @@ -57857,7 +58808,7 @@ Ext.define('Ext.view.AbstractView', { var r = this.getRecord(node); return this.selModel.isSelected(r); }, - + select: function(records, keepExisting, suppressEvent) { this.selModel.select(records, keepExisting, suppressEvent); @@ -57879,22 +58830,22 @@ Ext.define('Ext.view.AbstractView', { } return nodeInfo; }, - + getNodeByRecord: function(record) { var ns = this.all.elements, ln = ns.length, i = 0; - + for (; i < ln; i++) { if (ns[i].viewRecordId === record.internalId) { return ns[i]; } } - + return null; }, - + getNodes: function(start, end) { var ns = this.all.elements, @@ -57926,7 +58877,7 @@ Ext.define('Ext.view.AbstractView', { onDestroy : function() { var me = this; - + me.all.clear(); me.callParent(); me.bindStore(null); @@ -57944,7 +58895,7 @@ Ext.define('Ext.view.AbstractView', { var node = this.getNode(record); Ext.fly(node).removeCls(this.selectedItemCls); }, - + getItemSelector: function() { return this.itemSelector; } @@ -57958,31 +58909,39 @@ Ext.define('Ext.view.AbstractView', { - + getSelectionCount : function(){ - console.warn("DataView: getSelectionCount will be removed, please interact with the Ext.selection.DataViewModel"); + if (Ext.global.console) { + Ext.global.console.warn("DataView: getSelectionCount will be removed, please interact with the Ext.selection.DataViewModel"); + } return this.selModel.getSelection().length; }, - + getSelectedRecords : function(){ - console.warn("DataView: getSelectedRecords will be removed, please interact with the Ext.selection.DataViewModel"); + if (Ext.global.console) { + Ext.global.console.warn("DataView: getSelectedRecords will be removed, please interact with the Ext.selection.DataViewModel"); + } return this.selModel.getSelection(); }, - + select: function(records, keepExisting, supressEvents) { - console.warn("DataView: select will be removed, please access select through a DataView's SelectionModel, ie: view.getSelectionModel().select()"); + if (Ext.global.console) { + Ext.global.console.warn("DataView: select will be removed, please access select through a DataView's SelectionModel, ie: view.getSelectionModel().select()"); + } var sm = this.getSelectionModel(); return sm.select.apply(sm, arguments); }, - + clearSelections: function() { - console.warn("DataView: clearSelections will be removed, please access deselectAll through DataView's SelectionModel, ie: view.getSelectionModel().deselectAll()"); + if (Ext.global.console) { + Ext.global.console.warn("DataView: clearSelections will be removed, please access deselectAll through DataView's SelectionModel, ie: view.getSelectionModel().deselectAll()"); + } var sm = this.getSelectionModel(); return sm.deselectAll(); } - }); + }); }); }); @@ -58001,6 +58960,7 @@ Ext.define('Ext.Action', { + constructor : function(config){ this.initialConfig = config; this.itemId = config.itemId = (config.itemId || config.id || Ext.id()); @@ -58088,9 +59048,12 @@ Ext.define('Ext.Action', { callEach : function(fnName, args){ - var cs = this.items; - for(var i = 0, len = cs.length; i < len; i++){ - cs[i][fnName].apply(cs[i], args); + var items = this.items, + i = 0, + len = items.length; + + for(; i < len; i++){ + items[i][fnName].apply(items[i], args); } }, @@ -58102,7 +59065,7 @@ Ext.define('Ext.Action', { removeComponent : function(comp){ - this.items.remove(comp); + Ext.Array.remove(this.items, comp); }, @@ -58484,6 +59447,9 @@ Ext.define('Ext.Img', { }, + initRenderTpl: Ext.emptyFn, + + setSrc: function(src) { var me = this, img = me.el; @@ -58505,6 +59471,7 @@ Ext.define('Ext.Layer', { extend: 'Ext.core.Element', + constructor: function(config, existingEl) { config = config || {}; var me = this, @@ -59175,6 +60142,7 @@ Ext.define('Ext.ShadowPool', { Ext.define('Ext.Shadow', { requires: ['Ext.ShadowPool'], + constructor: function(config) { Ext.apply(this, config); if (typeof this.mode != "string") { @@ -59339,7 +60307,6 @@ Ext.define('Ext.Shadow', { } }); - Ext.define('Ext.button.Split', { @@ -59394,7 +60361,6 @@ Ext.define('Ext.button.Split', { } }); - Ext.define('Ext.button.Cycle', { @@ -59586,12 +60552,22 @@ Ext.define('Ext.container.ButtonGroup', { if (me.header) { + + delete me.header.items.items[0].flex; + + + me.suspendLayout = true; + me.header.insert(1, { + xtype: 'component', + ui : me.ui, + flex : 1 + }); me.header.insert(0, { xtype: 'component', ui : me.ui, - html : ' ', flex : 1 }); + me.suspendLayout = false; } me.callParent(arguments); @@ -59665,16 +60641,15 @@ Ext.define('Ext.container.Viewport', { el.setSize = Ext.emptyFn; el.dom.scroll = 'no'; me.allowDomMove = false; - - Ext.EventManager.onWindowResize(me.fireResize, me); me.renderTo = me.el; + me.width = Ext.core.Element.getViewportWidth(); + me.height = Ext.core.Element.getViewportHeight(); }, fireResize : function(w, h){ this.setSize(w, h); - } }); @@ -59684,6 +60659,8 @@ Ext.define('Ext.container.Viewport', { Ext.define('Ext.dd.DDTarget', { extend: 'Ext.dd.DragDrop', + + constructor: function(id, sGroup, config) { if (id) { this.initTarget(id, sGroup, config); @@ -59801,6 +60778,9 @@ Ext.define('Ext.dd.DragTracker', { 'mousemove', + 'beforedragstart', + + 'dragstart', @@ -59911,27 +60891,30 @@ Ext.define('Ext.dd.DragTracker', { this.startXY = this.lastXY = e.getXY(); this.startRegion = Ext.fly(this.dragTarget).getRegion(); - if (this.fireEvent('mousedown', this, e) !== false && this.onBeforeStart(e) !== false) { + if (this.fireEvent('mousedown', this, e) === false || + this.fireEvent('beforedragstart', this, e) === false || + this.onBeforeStart(e) === false) { + return; + } - - - this.mouseIsDown = true; + + + this.mouseIsDown = true; - - e.dragTracked = true; + + e.dragTracked = true; - if (this.preventDefault !== false) { - e.preventDefault(); - } - Ext.getDoc().on({ - scope: this, - mouseup: this.onMouseUp, - mousemove: this.onMouseMove, - selectstart: this.stopSelect - }); - if (this.autoStart) { - this.timer = Ext.defer(this.triggerStart, this.autoStart === true ? 1000 : this.autoStart, this, [e]); - } + if (this.preventDefault !== false) { + e.preventDefault(); + } + Ext.getDoc().on({ + scope: this, + mouseup: this.onMouseUp, + mousemove: this.onMouseMove, + selectstart: this.stopSelect + }); + if (this.autoStart) { + this.timer = Ext.defer(this.triggerStart, this.autoStart === true ? 1000 : this.autoStart, this, [e]); } }, @@ -59972,9 +60955,6 @@ Ext.define('Ext.dd.DragTracker', { this.mouseIsDown = false; - delete e.dragTracked; - - if (this.mouseIsOut) { this.mouseIsOut = false; this.onMouseOut(e); @@ -60000,6 +60980,9 @@ Ext.define('Ext.dd.DragTracker', { } delete this._constrainRegion; + + + delete Ext.EventObject.dragTracked; }, triggerStart: function(e) { @@ -60069,7 +61052,7 @@ Ext.define('Ext.dd.DragTracker', { }, getXY : function(constrain){ - return constrain ? this.constrainModes[constrain].call(this, this.lastXY) : this.lastXY; + return constrain ? this.constrainModes[constrain](this, this.lastXY) : this.lastXY; }, @@ -60082,9 +61065,9 @@ Ext.define('Ext.dd.DragTracker', { constrainModes: { - point: function(xy) { - var dr = this.dragRegion, - constrainTo = this.getConstrainRegion(); + point: function(me, xy) { + var dr = me.dragRegion, + constrainTo = me.getConstrainRegion(); if (!constrainTo) { @@ -60099,10 +61082,10 @@ Ext.define('Ext.dd.DragTracker', { }, - dragTarget: function(xy) { - var s = this.startXY, - dr = this.startRegion.copy(), - constrainTo = this.getConstrainRegion(), + dragTarget: function(me, xy) { + var s = me.startXY, + dr = me.startRegion.copy(), + constrainTo = me.getConstrainRegion(), adjust; @@ -60113,7 +61096,7 @@ Ext.define('Ext.dd.DragTracker', { - dr.translateBy.apply(dr, [xy[0]-s[0], xy[1]-s[1]]); + dr.translateBy(xy[0]-s[0], xy[1]-s[1]); if (dr.right > constrainTo.right) { @@ -60141,6 +61124,7 @@ Ext.define('Ext.dd.DragZone', { extend: 'Ext.dd.DragSource', + constructor : function(el, config){ this.callParent([el, config]); if (this.containerScroll) { @@ -60363,6 +61347,7 @@ Ext.define('Ext.dd.DropTarget', { extend: 'Ext.dd.DDTarget', requires: ['Ext.dd.ScrollManager'], + constructor : function(el, config){ this.el = Ext.get(el); @@ -60633,12 +61618,6 @@ Ext.define('Ext.flash.Component', { renderTpl: ['
'], initComponent: function() { - if (!('swfobject' in window)) { - Ext.Error.raise('The SWFObject library is not loaded. Ext.flash.Component requires SWFObject version 2.2 or later: http://code.google.com/p/swfobject/'); - } - if (!this.url) { - Ext.Error.raise('The "url" config is required for Ext.flash.Component'); - } this.callParent(); this.addEvents( @@ -60764,8 +61743,7 @@ Ext.define('Ext.form.action.Action', { - - + constructor: function(config) { if (config) { Ext.apply(this, config); @@ -60922,7 +61900,7 @@ Ext.define('Ext.form.action.Submit', { tag: 'input', type: 'hidden', name: name, - value: val + value: Ext.String.htmlEncode(val) }); } @@ -61022,6 +62000,7 @@ Ext.define('Ext.util.ComponentDragger', { autoStart: 500, + constructor: function(comp, config) { this.comp = comp; this.initialConstrainTo = config.constrainTo; @@ -61089,7 +62068,7 @@ Ext.define('Ext.util.ComponentDragger', { comp = (me.proxy && !me.comp.liveDrag) ? me.proxy : me.comp, offset = me.getOffset(me.constrain || me.constrainDelegate ? 'dragTarget' : null); - comp.setPosition.apply(comp, [me.startPosition[0] + offset[0], me.startPosition[1] + offset[1]]); + comp.setPosition(me.startPosition[0] + offset[0], me.startPosition[1] + offset[1]); }, onEnd: function(e) { @@ -61581,6 +62560,7 @@ Ext.define('Ext.layout.component.field.Field', { autoHeight: autoHeight, width: autoWidth ? owner.getBodyNaturalWidth() : width, height: height, + setOuterWidth: false, insets: { @@ -61618,9 +62598,9 @@ Ext.define('Ext.layout.component.field.Field', { if (autoWidth && autoHeight) { - me.setElementSize(owner.el, info.width, info.height); + me.setElementSize(owner.el, (info.setOuterWidth ? info.width : undef), info.height); } else { - me.setTargetSize(info.width, info.height); + me.setTargetSize((!autoWidth || info.setOuterWidth ? info.width : undef), info.height); } me.sizeBody(info); @@ -61694,6 +62674,8 @@ Ext.define('Ext.layout.component.field.Field', { if (info.autoWidth) { info.width += (!owner.labelEl ? 0 : owner.labelWidth + owner.labelPad); } + + info.setOuterWidth = true; }, adjustHorizInsets: function(owner, info) { if (owner.labelEl) { @@ -62054,8 +63036,8 @@ Ext.define('Ext.layout.container.Anchor', { components = me.getVisibleItems(owner), len = components.length, boxes = [], - box, newTargetSize, anchorWidth, anchorHeight, component, anchorSpec, calcWidth, calcHeight, - anchorsArray, anchor, i, el; + box, newTargetSize, component, anchorSpec, calcWidth, calcHeight, + i, el, cleaner; if (ownerWidth < 20 && ownerHeight < 20) { return; @@ -62072,46 +63054,27 @@ Ext.define('Ext.layout.container.Anchor', { } - if (owner.anchorSize) { - if (typeof owner.anchorSize == 'number') { - anchorWidth = owner.anchorSize; - } - else { - anchorWidth = owner.anchorSize.width; - anchorHeight = owner.anchorSize.height; - } - } - else { - anchorWidth = owner.initialConfig.width; - anchorHeight = owner.initialConfig.height; - } - - if (!Ext.supports.RightMargin) { + cleaner = Ext.core.Element.getRightMarginFixCleaner(target); target.addCls(Ext.baseCSSPrefix + 'inline-children'); } for (i = 0; i < len; i++) { component = components[i]; el = component.el; - anchor = component.anchor; - - if (!component.anchor && component.items && !Ext.isNumber(component.width) && !(Ext.isIE6 && Ext.isStrict)) { - component.anchor = anchor = me.defaultAnchor; - } - if (anchor) { - anchorSpec = component.anchorSpec; - - if (!anchorSpec) { - anchorsArray = anchor.split(' '); - component.anchorSpec = anchorSpec = { - right: me.parseAnchor(anchorsArray[0], component.initialConfig.width, anchorWidth), - bottom: me.parseAnchor(anchorsArray[1], component.initialConfig.height, anchorHeight) - }; + anchorSpec = component.anchorSpec; + if (anchorSpec) { + if (anchorSpec.right) { + calcWidth = me.adjustWidthAnchor(anchorSpec.right(ownerWidth) - el.getMargin('lr'), component); + } else { + calcWidth = undefined; + } + if (anchorSpec.bottom) { + calcHeight = me.adjustHeightAnchor(anchorSpec.bottom(ownerHeight) - el.getMargin('tb'), component); + } else { + calcHeight = undefined; } - calcWidth = anchorSpec.right ? me.adjustWidthAnchor(anchorSpec.right(ownerWidth) - el.getMargin('lr'), component) : undefined; - calcHeight = anchorSpec.bottom ? me.adjustHeightAnchor(anchorSpec.bottom(ownerHeight) - el.getMargin('tb'), component) : undefined; boxes.push({ component: component, @@ -62130,6 +63093,7 @@ Ext.define('Ext.layout.container.Anchor', { if (!Ext.supports.RightMargin) { target.removeCls(Ext.baseCSSPrefix + 'inline-children'); + cleaner(); } for (i = 0; i < len; i++) { @@ -62187,6 +63151,60 @@ Ext.define('Ext.layout.container.Anchor', { adjustHeightAnchor: function(value, comp) { return value; + }, + + configureItem: function(item) { + var me = this, + owner = me.owner, + anchor= item.anchor, + anchorsArray, + anchorSpec, + anchorWidth, + anchorHeight; + + if (!item.anchor && item.items && !Ext.isNumber(item.width) && !(Ext.isIE6 && Ext.isStrict)) { + item.anchor = anchor = me.defaultAnchor; + } + + + if (owner.anchorSize) { + if (typeof owner.anchorSize == 'number') { + anchorWidth = owner.anchorSize; + } + else { + anchorWidth = owner.anchorSize.width; + anchorHeight = owner.anchorSize.height; + } + } + else { + anchorWidth = owner.initialConfig.width; + anchorHeight = owner.initialConfig.height; + } + + if (anchor) { + + anchorsArray = anchor.split(' '); + item.anchorSpec = anchorSpec = { + right: me.parseAnchor(anchorsArray[0], item.initialConfig.width, anchorWidth), + bottom: me.parseAnchor(anchorsArray[1], item.initialConfig.height, anchorHeight) + }; + + if (anchorSpec.right) { + item.layoutManagedWidth = 1; + } else { + item.layoutManagedWidth = 2; + } + + if (anchorSpec.bottom) { + item.layoutManagedHeight = 1; + } else { + item.layoutManagedHeight = 2; + } + } else { + item.layoutManagedWidth = 2; + item.layoutManagedHeight = 2; + } + this.callParent(arguments); } }); @@ -62445,7 +63463,15 @@ Ext.define('Ext.window.Window', { if (me.closable) { keyMap = me.getKeyMap(); keyMap.on(27, me.onEsc, me); - keyMap.disable(); + + + keyMap.disable(); + + } + + if (!hidden) { + me.syncMonitorWindowResize(); + me.doConstrain(); } }, @@ -62457,22 +63483,25 @@ Ext.define('Ext.window.Window', { if (!me.header) { me.updateHeader(true); } + + + if (me.header) { + ddConfig = Ext.applyIf({ + el: me.el, + delegate: '#' + me.header.id + }, me.draggable); - ddConfig = Ext.applyIf({ - el: me.el, - delegate: '#' + me.header.id - }, me.draggable); + + if (me.constrain || me.constrainHeader) { + ddConfig.constrain = me.constrain; + ddConfig.constrainDelegate = me.constrainHeader; + ddConfig.constrainTo = me.constrainTo || me.container; + } - - if (me.constrain || me.constrainHeader) { - ddConfig.constrain = me.constrain; - ddConfig.constrainDelegate = me.constrainHeader; - ddConfig.constrainTo = me.constrainTo || me.container; + + me.dd = Ext.create('Ext.util.ComponentDragger', this, ddConfig); + me.relayEvents(me.dd, ['dragstart', 'drag', 'dragend']); } - - - me.dd = Ext.create('Ext.util.ComponentDragger', this, ddConfig); - me.relayEvents(me.dd, ['dragstart', 'drag', 'dragend']); }, @@ -62553,9 +63582,14 @@ Ext.define('Ext.window.Window', { afterShow: function(animateTarget) { var me = this, - size; + animating = animateTarget || me.animateTarget; + if (animating) { + + me.doConstrain(); + } + me.callParent(arguments); @@ -62563,10 +63597,11 @@ Ext.define('Ext.window.Window', { me.fitContainer(); } - if (me.monitorResize || me.constrain || me.constrainHeader) { - Ext.EventManager.onWindowResize(me.onWindowResize, me); + me.syncMonitorWindowResize(); + if (!animating) { + me.doConstrain(); } - me.doConstrain(); + if (me.keyMap) { me.keyMap.enable(); } @@ -62591,9 +63626,7 @@ Ext.define('Ext.window.Window', { var me = this; - if (me.monitorResize || me.constrain || me.constrainHeader) { - Ext.EventManager.removeResizeListener(me.onWindowResize, me); - } + me.syncMonitorWindowResize(); if (me.keyMap) { @@ -62671,6 +63704,7 @@ Ext.define('Ext.window.Window', { me.el.addCls(Ext.baseCSSPrefix + 'window-maximized'); me.container.addCls(Ext.baseCSSPrefix + 'window-maximized-ct'); + me.syncMonitorWindowResize(); me.setPosition(0, 0); me.fitContainer(); me.fireEvent('maximize', me); @@ -62717,6 +63751,7 @@ Ext.define('Ext.window.Window', { me.container.removeCls(Ext.baseCSSPrefix + 'window-maximized-ct'); + me.syncMonitorWindowResize(); me.doConstrain(); me.fireEvent('restore', me); } @@ -62724,6 +63759,29 @@ Ext.define('Ext.window.Window', { }, + syncMonitorWindowResize: function () { + var me = this, + currentlyMonitoring = me._monitoringResize, + + yes = me.monitorResize || me.constrain || me.constrainHeader || me.maximized, + + veto = me.hidden || me.destroying || me.isDestroyed; + + if (yes && !veto) { + + if (!currentlyMonitoring) { + + Ext.EventManager.onWindowResize(me.onWindowResize, me); + me._monitoringResize = true; + } + } else if (currentlyMonitoring) { + + Ext.EventManager.removeResizeListener(me.onWindowResize, me); + me._monitoringResize = false; + } + }, + + toggleMaximize: function() { return this[this.maximized ? 'restore': 'maximize'](); } @@ -63721,7 +64779,7 @@ Ext.define('Ext.window.MessageBox', { 'Ext.layout.container.HBox', 'Ext.ProgressBar' ], - + alternateClassName: 'Ext.MessageBox', alias: 'widget.messagebox', @@ -63793,7 +64851,7 @@ Ext.define('Ext.window.MessageBox', { wait: 'Loading...', alert: 'Attention' }, - + iconHeight: 35, makeButton: function(btnIdx) { @@ -63917,7 +64975,7 @@ Ext.define('Ext.window.MessageBox', { onPromptKey: function(textField, e) { var me = this, blur; - + if (e.keyCode === Ext.EventObject.RETURN || e.keyCode === 10) { if (me.msgButtons.ok.isVisible()) { blur = true; @@ -63926,7 +64984,7 @@ Ext.define('Ext.window.MessageBox', { me.msgButtons.yes.handler.call(me, me.msgButtons.yes); blur = true; } - + if (blur) { me.textField.blur(); } @@ -63948,7 +65006,7 @@ Ext.define('Ext.window.MessageBox', { delete me.defaultFocus; - + me.animateTarget = cfg.animateTarget || undefined; @@ -63964,6 +65022,7 @@ Ext.define('Ext.window.MessageBox', { me.width = initialWidth; me.render(Ext.getBody()); } else { + me.hidden = false; me.setSize(initialWidth, me.maxHeight); } me.setPosition(-10000, -10000); @@ -64058,7 +65117,7 @@ Ext.define('Ext.window.MessageBox', { show: function(cfg) { var me = this; - + me.reconfigure(cfg); me.addCls(cfg.cls); if (cfg.animateTarget) { @@ -64070,11 +65129,11 @@ Ext.define('Ext.window.MessageBox', { } return me; }, - + afterShow: function(){ if (this.animateTarget) { this.center(); - } + } this.callParent(arguments); }, @@ -64086,7 +65145,7 @@ Ext.define('Ext.window.MessageBox', { if (!Ext.isDefined(me.frameWidth)) { me.frameWidth = me.el.getWidth() - me.body.getWidth(); } - + icon.setHeight(iconHeight); @@ -64232,15 +65291,13 @@ Ext.define('Ext.window.MessageBox', { Ext.MessageBox = Ext.Msg = new this(); }); - - - Ext.define('Ext.form.Basic', { extend: 'Ext.util.Observable', alternateClassName: 'Ext.form.BasicForm', requires: ['Ext.util.MixedCollection', 'Ext.form.action.Load', 'Ext.form.action.Submit', - 'Ext.window.MessageBox', 'Ext.data.Errors'], + 'Ext.window.MessageBox', 'Ext.data.Errors', 'Ext.util.DelayedTask'], + constructor: function(owner, config) { var me = this, onItemAddOrRemove = me.onItemAddOrRemove; @@ -64262,6 +65319,8 @@ Ext.define('Ext.form.Basic', { me.paramOrder = me.paramOrder.split(/[\s,|]/); } + me.checkValidityTask = Ext.create('Ext.util.DelayedTask', me.checkValidity, me); + me.addEvents( 'beforeaction', @@ -64319,6 +65378,7 @@ Ext.define('Ext.form.Basic', { destroy: function() { this.clearListeners(); + this.checkValidityTask.cancel(); }, @@ -64351,8 +65411,9 @@ Ext.define('Ext.form.Basic', { delete this._boundItems; + if (me.initialized) { - me.onValidityChange(!me.hasInvalidField()); + me.checkValidityTask.delay(10); } }, @@ -65524,8 +66585,7 @@ Ext.define('Ext.form.FieldSet', { setExpanded: function(expanded) { var me = this, - checkboxCmp = me.checkboxCmp, - toggleCmp = me.toggleCmp; + checkboxCmp = me.checkboxCmp; expanded = !!expanded; @@ -65539,6 +66599,10 @@ Ext.define('Ext.form.FieldSet', { me.addCls(me.baseCls + '-collapsed'); } me.collapsed = !expanded; + if (expanded) { + + me.getComponentLayout().childrenChanged = true; + } me.doComponentLayout(); return me; }, @@ -66018,11 +67082,9 @@ Ext.define('Ext.form.field.Checkbox', { getSubmitValue: function() { - return this.checked ? this.inputValue : (this.uncheckedValue || null); - }, - - getModelData: function() { - return this.getSubmitData(); + var unchecked = this.uncheckedValue, + uncheckedVal = Ext.isDefined(unchecked) ? unchecked : null; + return this.checked ? this.inputValue : uncheckedVal; }, @@ -66152,9 +67214,9 @@ Ext.define('Ext.layout.component.field.Trigger', { Ext.define('Ext.view.View', { extend: 'Ext.view.AbstractView', - alternateClassName: 'Ext.view.View', + alternateClassName: 'Ext.DataView', alias: 'widget.dataview', - + inheritableStatics: { EventMap: { mousedown: 'MouseDown', @@ -66166,10 +67228,11 @@ Ext.define('Ext.view.View', { mouseout: 'MouseOut', mouseenter: 'MouseEnter', mouseleave: 'MouseLeave', - keydown: 'KeyDown' + keydown: 'KeyDown', + focus: 'Focus' } }, - + addCmpEvents: function() { this.addEvents( @@ -66234,7 +67297,7 @@ Ext.define('Ext.view.View', { 'containercontextmenu', 'containerkeydown', - + 'selectionchange', @@ -66243,13 +67306,15 @@ Ext.define('Ext.view.View', { }, afterRender: function(){ - var me = this, + var me = this, listeners; - + me.callParent(); listeners = { scope: me, + + freezeEvent: true, click: me.handleEvent, mousedown: me.handleEvent, mouseup: me.handleEvent, @@ -66259,43 +67324,59 @@ Ext.define('Ext.view.View', { mouseout: me.handleEvent, keydown: me.handleEvent }; - + me.mon(me.getTargetEl(), listeners); - + if (me.store) { me.bindStore(me.store, true); } }, - + handleEvent: function(e) { if (this.processUIEvent(e) !== false) { this.processSpecialEvent(e); } }, - + processItemEvent: Ext.emptyFn, processContainerEvent: Ext.emptyFn, processSpecialEvent: Ext.emptyFn, + - processUIEvent: function(e, type) { - type = type || e.type; + stillOverItem: function (event, overItem) { + var nowOver; + + + + + + + + if (overItem && typeof(overItem.offsetParent) === "object") { + + + nowOver = (event.type == 'mouseout') ? event.getRelatedTarget() : event.getTarget(); + return Ext.fly(overItem).contains(nowOver); + } + + return false; + }, + + processUIEvent: function(e) { var me = this, item = e.getTarget(me.getItemSelector(), me.getTargetEl()), map = this.statics().EventMap, - index, record; - + index, record, + type = e.type, + overItem = me.mouseOverItem, + newType; + if (!item) { - - - - - - - if (type == 'mouseover' && me.mouseOverItem && typeof me.mouseOverItem.offsetParent === "object" && Ext.fly(me.mouseOverItem).getRegion().contains(e.getPoint())) { - item = me.mouseOverItem; + if (type == 'mouseover' && me.stillOverItem(e, overItem)) { + item = overItem; } - + if (type == 'keydown') { record = me.getSelectionModel().getLastSelected(); @@ -66304,54 +67385,53 @@ Ext.define('Ext.view.View', { } } } - + if (item) { index = me.indexOf(item); if (!record) { record = me.getRecord(item); } - - if (me.processItemEvent(type, record, item, index, e) === false) { + + if (me.processItemEvent(record, item, index, e) === false) { return false; } - - type = me.isNewItemEvent(type, item, e); - if (type === false) { + + newType = me.isNewItemEvent(item, e); + if (newType === false) { return false; } - + if ( - (me['onBeforeItem' + map[type]](record, item, index, e) === false) || - (me.fireEvent('beforeitem' + type, me, record, item, index, e) === false) || - (me['onItem' + map[type]](record, item, index, e) === false) - ) { + (me['onBeforeItem' + map[newType]](record, item, index, e) === false) || + (me.fireEvent('beforeitem' + newType, me, record, item, index, e) === false) || + (me['onItem' + map[newType]](record, item, index, e) === false) + ) { return false; } - - me.fireEvent('item' + type, me, record, item, index, e); - } + + me.fireEvent('item' + newType, me, record, item, index, e); + } else { if ( - (me.processContainerEvent(type, e) === false) || + (me.processContainerEvent(e) === false) || (me['onBeforeContainer' + map[type]](e) === false) || (me.fireEvent('beforecontainer' + type, me, e) === false) || (me['onContainer' + map[type]](e) === false) ) { return false; } - + me.fireEvent('container' + type, me, e); } - + return true; }, - - isNewItemEvent: function(type, item, e) { + + isNewItemEvent: function (item, e) { var me = this, overItem = me.mouseOverItem, - contains, - isItem; - + type = e.type; + switch (type) { case 'mouseover': if (item === overItem) { @@ -66359,24 +67439,18 @@ Ext.define('Ext.view.View', { } me.mouseOverItem = item; return 'mouseenter'; - break; - + case 'mouseout': - - if (overItem && typeof overItem.offsetParent === "object") { - contains = Ext.fly(me.mouseOverItem).getRegion().contains(e.getPoint()); - isItem = Ext.fly(e.getTarget()).hasCls(me.itemSelector); - if (contains && isItem) { - return false; - } + + if (me.stillOverItem(e, overItem)) { + return false; } me.mouseOverItem = null; return 'mouseleave'; - break; } return type; }, - + onItemMouseEnter: function(record, item, index, e) { if (this.trackOver) { @@ -66394,19 +67468,21 @@ Ext.define('Ext.view.View', { onItemMouseDown: Ext.emptyFn, onItemMouseUp: Ext.emptyFn, + onItemFocus: Ext.emptyFn, onItemClick: Ext.emptyFn, onItemDblClick: Ext.emptyFn, onItemContextMenu: Ext.emptyFn, onItemKeyDown: Ext.emptyFn, onBeforeItemMouseDown: Ext.emptyFn, onBeforeItemMouseUp: Ext.emptyFn, + onBeforeItemFocus: Ext.emptyFn, onBeforeItemMouseEnter: Ext.emptyFn, onBeforeItemMouseLeave: Ext.emptyFn, onBeforeItemClick: Ext.emptyFn, onBeforeItemDblClick: Ext.emptyFn, onBeforeItemContextMenu: Ext.emptyFn, onBeforeItemKeyDown: Ext.emptyFn, - + onContainerMouseDown: Ext.emptyFn, onContainerMouseUp: Ext.emptyFn, @@ -66424,7 +67500,7 @@ Ext.define('Ext.view.View', { onBeforeContainerDblClick: Ext.emptyFn, onBeforeContainerContextMenu: Ext.emptyFn, onBeforeContainerKeyDown: Ext.emptyFn, - + highlightItem: function(item) { var me = this; @@ -66437,7 +67513,7 @@ Ext.define('Ext.view.View', { clearHighlight: function() { var me = this, highlighted = me.highlightedItem; - + if (highlighted) { Ext.fly(highlighted).removeCls(me.overItemCls); delete me.highlightedItem; @@ -66445,8 +67521,12 @@ Ext.define('Ext.view.View', { }, refresh: function() { - this.clearHighlight(); - this.callParent(arguments); + var me = this; + me.clearHighlight(); + me.callParent(arguments); + if (!me.isFixedHeight()) { + me.doComponentLayout(); + } } }); @@ -66977,7 +68057,7 @@ Ext.define('Ext.form.field.Picker', { mousedown: collapseIf, scope: me }); - + Ext.EventManager.onWindowResize(me.alignPicker, me); me.fireEvent('expand', me); me.onExpand(); } @@ -67030,7 +68110,7 @@ Ext.define('Ext.form.field.Picker', { doc.un('mousewheel', collapseIf, me); doc.un('mousedown', collapseIf, me); - + Ext.EventManager.removeResizeListener(me.alignPicker, me); me.fireEvent('collapse', me); me.onCollapse(); } @@ -67080,6 +68160,7 @@ Ext.define('Ext.form.field.Picker', { onDestroy : function(){ var me = this; + Ext.EventManager.removeResizeListener(me.alignPicker, me); Ext.destroy(me.picker, me.keyNav); me.callParent(); } @@ -67291,23 +68372,25 @@ Ext.define('Ext.form.field.Number', { var me = this, allowed; - this.callParent(); + me.callParent(); me.setMinValue(me.minValue); me.setMaxValue(me.maxValue); - allowed = me.baseChars + ''; - if (me.allowDecimals) { - allowed += me.decimalSeparator; - } - if (me.minValue < 0) { - allowed += '-'; - } - allowed = Ext.String.escapeRegex(allowed); - me.maskRe = new RegExp('[' + allowed + ']'); - if (me.autoStripChars) { - me.stripCharsRe = new RegExp('[^' + allowed + ']', 'gi'); + if (me.disableKeyFilter !== true) { + allowed = me.baseChars + ''; + if (me.allowDecimals) { + allowed += me.decimalSeparator; + } + if (me.minValue < 0) { + allowed += '-'; + } + allowed = Ext.String.escapeRegex(allowed); + me.maskRe = new RegExp('[' + allowed + ']'); + if (me.autoStripChars) { + me.stripCharsRe = new RegExp('[^' + allowed + ']', 'gi'); + } } }, @@ -67348,7 +68431,11 @@ Ext.define('Ext.form.field.Number', { }, rawToValue: function(rawValue) { - return this.fixPrecision(this.parseValue(rawValue)) || rawValue || null; + var value = this.fixPrecision(this.parseValue(rawValue)); + if (value === null) { + value = rawValue || null; + } + return value; }, valueToRaw: function(value) { @@ -67626,7 +68713,6 @@ Ext.define('Ext.toolbar.Paging', { total : totalCount, currentPage : store.currentPage, pageCount: Math.ceil(totalCount / store.pageSize), - fromRecord: ((store.currentPage - 1) * store.pageSize) + 1, toRecord: Math.min(store.currentPage * store.pageSize, totalCount) @@ -67665,17 +68751,17 @@ Ext.define('Ext.toolbar.Paging', { onPagingKeyDown : function(field, e){ - var k = e.getKey(), - pageData = this.getPageData(), + var me = this, + k = e.getKey(), + pageData = me.getPageData(), increment = e.shiftKey ? 10 : 1, - pageNum, - me = this; + pageNum; if (k == e.RETURN) { e.stopEvent(); pageNum = me.readPageFromInput(pageData); if (pageNum !== false) { - pageNum = Math.min(Math.max(1, pageNum), pageData.total); + pageNum = Math.min(Math.max(1, pageNum), pageData.pageCount); if(me.fireEvent('beforechange', me, pageNum) !== false){ me.store.loadPage(pageNum); } @@ -67715,9 +68801,8 @@ Ext.define('Ext.toolbar.Paging', { moveFirst : function(){ - var me = this; - if(me.fireEvent('beforechange', me, 1) !== false){ - me.store.loadPage(1); + if (this.fireEvent('beforechange', this, 1) !== false){ + this.store.loadPage(1); } }, @@ -67726,25 +68811,32 @@ Ext.define('Ext.toolbar.Paging', { var me = this, prev = me.store.currentPage - 1; - if(me.fireEvent('beforechange', me, prev) !== false){ - me.store.previousPage(); + if (prev > 0) { + if (me.fireEvent('beforechange', me, prev) !== false) { + me.store.previousPage(); + } } }, moveNext : function(){ - var me = this; - if(me.fireEvent('beforechange', me, me.store.currentPage + 1) !== false){ - me.store.nextPage(); + var me = this, + total = me.getPageData().pageCount, + next = me.store.currentPage + 1; + + if (next <= total) { + if (me.fireEvent('beforechange', me, next) !== false) { + me.store.nextPage(); + } } }, moveLast : function(){ var me = this, - last = this.getPageData().pageCount; + last = me.getPageData().pageCount; - if(me.fireEvent('beforechange', me, last) !== false){ + if (me.fireEvent('beforechange', me, last) !== false) { me.store.loadPage(last); } }, @@ -67754,7 +68846,7 @@ Ext.define('Ext.toolbar.Paging', { var me = this, current = me.store.currentPage; - if(me.fireEvent('beforechange', me, current) !== false){ + if (me.fireEvent('beforechange', me, current) !== false) { me.store.loadPage(current); } }, @@ -67843,13 +68935,17 @@ Ext.define('Ext.view.BoundList', { me.addCls(baseCls + '-floating'); } - - - me.tpl = Ext.create('Ext.XTemplate', - '
    ', - '
  • ' + me.getInnerTpl(me.displayField) + '
  • ', - '
' - ); + if (!me.tpl) { + + + me.tpl = Ext.create('Ext.XTemplate', + '
    ', + '
  • ' + me.getInnerTpl(me.displayField) + '
  • ', + '
' + ); + } else if (Ext.isString(me.tpl)) { + me.tpl = Ext.create('Ext.XTemplate', me.tpl); + } if (me.pageSize) { me.pagingToolbar = me.createPagingToolbar(); @@ -67905,14 +69001,14 @@ Ext.define('Ext.view.BoundList', { me.refreshed--; } }, - + initAria: function() { this.callParent(); - + var selModel = this.getSelectionModel(), mode = selModel.getSelectionMode(), actionEl = this.getActionEl(); - + if (mode !== 'SINGLE') { actionEl.dom.setAttribute('aria-multiselectable', true); @@ -68091,18 +69187,6 @@ Ext.define('Ext.form.field.ComboBox', { transform = me.transform, transformSelect, isLocalMode; - if (!store && !transform) { - Ext.Error.raise('Either a valid store, or a HTML select to transform, must be configured on the combo.'); - } - if (me.typeAhead && me.multiSelect) { - Ext.Error.raise('typeAhead and multiSelect are mutually exclusive options -- please remove one of them.'); - } - if (me.typeAhead && !me.editable) { - Ext.Error.raise('If typeAhead is enabled the combo must be editable: true -- please change one of those settings.'); - } - if (me.selectOnFocus && !me.editable) { - Ext.Error.raise('If selectOnFocus is enabled the combo must be editable: true -- please change one of those settings.'); - } this.addEvents( @@ -68331,12 +69415,19 @@ Ext.define('Ext.form.field.ComboBox', { if (!me.queryCaching || me.lastQuery !== queryString) { me.lastQuery = queryString; - store.clearFilter(!forceAll); + if (isLocalMode) { - if (!forceAll) { + + if (forceAll) { + store.clearFilter(); + } else { + + store.clearFilter(true); store.filter(me.displayField, queryString); } } else { + + store.load({ params: me.getParams(queryString) }); @@ -68363,8 +69454,13 @@ Ext.define('Ext.form.field.ComboBox', { getParams: function(queryString) { var p = {}, - pageSize = this.pageSize; - p[this.queryParam] = queryString; + pageSize = this.pageSize, + param = this.queryParam; + + if (param) { + p[param] = queryString; + } + if (pageSize) { p.start = 0; p.limit = pageSize; @@ -68430,6 +69526,10 @@ Ext.define('Ext.form.field.ComboBox', { me.doQueryTask.delay(me.queryDelay); } } + + if (me.enableKeyEvents) { + me.callParent(arguments); + } }, initEvents: function() { @@ -68437,7 +69537,9 @@ Ext.define('Ext.form.field.ComboBox', { me.callParent(); - me.mon(me.inputEl, 'keyup', me.onKeyUp, me); + if (!me.enableKeyEvents) { + me.mon(me.inputEl, 'keyup', me.onKeyUp, me); + } }, createPicker: function() { @@ -68455,7 +69557,8 @@ Ext.define('Ext.form.field.ComboBox', { store: me.store, displayField: me.displayField, focusOnToFront: false, - pageSize: me.pageSize + pageSize: me.pageSize, + tpl: me.tpl }, me.listConfig, me.defaultListConfig); picker = me.picker = Ext.create('Ext.view.BoundList', opts); @@ -68466,10 +69569,7 @@ Ext.define('Ext.form.field.ComboBox', { scope: me }); - me.mon(picker.getSelectionModel(), { - selectionChange: me.onListSelectionChange, - scope: me - }); + me.mon(picker.getSelectionModel(), 'selectionchange', me.onListSelectionChange, me); return picker; }, @@ -68478,32 +69578,37 @@ Ext.define('Ext.form.field.ComboBox', { this.alignPicker(); this.syncSelection(); }, - + onItemClick: function(picker, record){ var me = this, lastSelection = me.lastSelection, valueField = me.valueField, selected; - + if (!me.multiSelect && lastSelection) { selected = lastSelection[0]; - if (record.get(valueField) === selected.get(valueField)) { + if (selected && (record.get(valueField) === selected.get(valueField))) { me.collapse(); } - } + } }, onListSelectionChange: function(list, selectedRecords) { - var me = this; + var me = this, + isMulti = me.multiSelect, + hasRecords = selectedRecords.length > 0; if (!me.ignoreSelection && me.isExpanded) { - if (!me.multiSelect) { + if (!isMulti) { Ext.defer(me.collapse, 1, me); } - me.setValue(selectedRecords, false); - if (selectedRecords.length > 0) { + + if (isMulti || hasRecords) { + me.setValue(selectedRecords, false); + } + if (hasRecords) { me.fireEvent('select', me, selectedRecords); } me.inputEl.focus(); @@ -68767,11 +69872,10 @@ Ext.define('Ext.picker.Month', { - - width: 175, - - height: 195, - + width: 178, + + + smallCls: Ext.baseCSSPrefix + 'monthpicker-small', totalYears: 10, @@ -68805,7 +69909,9 @@ Ext.define('Ext.picker.Month', { 'yeardblclick' ); - + if (me.small) { + me.addCls(me.smallCls); + } me.setValue(me.value); me.activeYear = me.getYear(new Date().getFullYear() - 4, -4); this.callParent(); @@ -69492,6 +70598,7 @@ Ext.define('Ext.picker.Date', { renderTo: me.el, floating: true, shadow: false, + small: me.showToday === false, listeners: { scope: me, cancelclick: me.onCancelClick, @@ -70064,7 +71171,7 @@ Ext.define('Ext.form.field.Date', { format = Ext.String.format; return Ext.create('Ext.picker.Date', { - ownerCt: this.ownerCt, + ownerCt: me.ownerCt, renderTo: document.body, floating: true, hidden: true, @@ -70093,16 +71200,18 @@ Ext.define('Ext.form.field.Date', { }, onSelect: function(m, d) { - this.setValue(d); - this.fireEvent('select', this, d); - this.collapse(); + var me = this; + + me.setValue(d); + me.fireEvent('select', me, d); + me.collapse(); }, onExpand: function() { var me = this, value = me.getValue(); - me.picker.setValue(value instanceof Date ? value : new Date()); + me.picker.setValue(Ext.isDate(value) ? value : new Date()); }, @@ -70112,9 +71221,16 @@ Ext.define('Ext.form.field.Date', { beforeBlur : function(){ - var v = this.parseDate(this.getRawValue()); - if(v){ - this.setValue(v); + var me = this, + v = me.parseDate(me.getRawValue()), + focusTask = me.focusTask; + + if (focusTask) { + focusTask.cancel(); + } + + if (v) { + me.setValue(v); } } @@ -70248,7 +71364,6 @@ Ext.define("Ext.form.field.File", { text: me.buttonText, cls: Ext.baseCSSPrefix + 'form-file-btn', preventDefault: false, - ownerCt: me, style: me.buttonOnly ? '' : 'margin-left:' + me.buttonMargin + 'px' }, me.buttonConfig)); }, @@ -70857,7 +71972,7 @@ Ext.define('Ext.form.field.HtmlEditor', { getDocMarkup: function() { var me = this, h = me.iframeEl.getHeight() - me.iframePad * 2; - return Ext.String.format('', me.iframePad, h); + return Ext.String.format('', me.iframePad, h); }, @@ -71653,6 +72768,10 @@ Ext.define('Ext.form.field.Radio', { return this.checked ? this.inputValue : null; }, + getModelData: function() { + return this.getSubmitData(); + }, + onChange: function(newVal, oldVal) { var me = this; @@ -71704,7 +72823,7 @@ Ext.define('Ext.picker.Time', { componentCls: Ext.baseCSSPrefix + 'timepicker', - loadingText: '', + loadMask: false, initComponent: function() { var me = this, @@ -72021,7 +73140,11 @@ Ext.define('Ext.form.field.Time', { forceKeyDown: true, tab: function(e) { if (selectOnTab) { - this.selectHighlighted(e); + if(me.picker.highlightedItem) { + this.selectHighlighted(e); + } else { + me.collapse(); + } me.triggerBlur(); } @@ -72056,6 +73179,17 @@ Ext.define('Ext.form.field.Time', { }, + onChange: function() { + var me = this, + picker = me.picker; + + me.callParent(arguments); + if(picker) { + picker.clearHighlight(); + } + }, + + onListSelect: function(list, recordArray) { var me = this, record = recordArray[0], @@ -72073,13 +73207,17 @@ Ext.define('Ext.form.field.Time', { Ext.define('Ext.grid.CellEditor', { extend: 'Ext.Editor', constructor: function(config) { + config = Ext.apply({}, config); + if (config.field) { config.field.monitorTab = false; } - config.autoSize = { - width: 'boundEl' - }; - this.callParent(arguments); + if (!Ext.isDefined(config.autoSize)) { + config.autoSize = { + width: 'boundEl' + }; + } + this.callParent([config]); }, @@ -72133,23 +73271,24 @@ Ext.define('Ext.grid.ColumnLayout', { alias: 'layout.gridcolumn', type : 'column', + reserveOffset: false, + clearInnerCtOnLayout: false, - constructor: function() { - var me = this; - me.callParent(arguments); - if (!Ext.isDefined(me.availableSpaceOffset)) { - me.availableSpaceOffset = (Ext.getScrollBarWidth() - 2); - } - }, - beforeLayout: function() { var me = this, i = 0, items = me.getLayoutItems(), len = items.length, - item, returnValue; + item, returnValue, + s; + + + if (!Ext.isDefined(me.availableSpaceOffset)) { + s = me.owner.up('tablepanel').verticalScroller; + me.availableSpaceOffset = s ? s.width-1 : 0; + } returnValue = me.callParent(arguments); @@ -72219,7 +73358,7 @@ Ext.define('Ext.grid.ColumnLayout', { me.callParent(arguments); - if (me.align == 'stretchmax') { + if (!me.owner.hideHeaders && me.align == 'stretchmax') { for (; i < len; i++) { items[i].setPadding(); } @@ -72229,26 +73368,21 @@ Ext.define('Ext.grid.ColumnLayout', { updateInnerCtSize: function(tSize, calcs) { - var me = this, - extra = 0; + var me = this, + extra; - if (!me.isColumn && calcs.meta.tooNarrow) { - if ( - Ext.isWebKit || - Ext.isGecko || - (Ext.isIEQuirks && (Ext.isIE6 || Ext.isIE7 || Ext.isIE8)) - ) { - extra = 1; - - } else if (Ext.isIE6 || Ext.isIE7 || Ext.isIE8) { - extra = 2; + if (!me.isColumn) { + me.tooNarrow = calcs.meta.tooNarrow; + extra = (me.reserveOffset ? me.availableSpaceOffset : 0); + + if (calcs.meta.tooNarrow) { + tSize.width = calcs.meta.desiredSize + extra; + } else { + tSize.width += extra; } - - - extra++; - tSize.width = calcs.meta.desiredSize + (me.reserveOffset ? me.availableSpaceOffset : 0) + extra; } + return me.callParent(arguments); }, @@ -72314,6 +73448,24 @@ Ext.define('Ext.grid.LockingView', { return cols.concat(this.normalGrid.headerCt.getGridColumns()); }, + getEl: function(column){ + return this.getViewForColumn(column).getEl(); + }, + + getViewForColumn: function(column) { + var view = this.lockedView, + inLocked; + + view.headerCt.cascade(function(col){ + if (col === column) { + inLocked = true; + return false; + } + }); + + return inLocked ? view : this.normalView; + }, + onItemMouseEnter: function(view, record){ var me = this, locked = me.lockedView, @@ -72365,14 +73517,9 @@ Ext.define('Ext.grid.LockingView', { }, getCell: function(record, column){ - var view = this.lockedView, + var view = this.getViewForColumn(column), row; - - - if (view.getHeaderAtIndex(column) === -1) { - view = this.normalView; - } - + row = view.getNode(record); return Ext.fly(row).down(column.getCellSelector()); }, @@ -72385,6 +73532,10 @@ Ext.define('Ext.grid.LockingView', { return result; }, + addElListener: function(eventName, fn, scope){ + this.relayFn('addElListener', arguments); + }, + refreshNode: function(){ this.relayFn('refreshNode', arguments); }, @@ -72600,9 +73751,6 @@ Ext.define('Ext.grid.Lockable', { column.processed = true; if (column.locked) { - if (column.flex) { - Ext.Error.raise("Columns which are locked do NOT support a flex width. You must set a width on the " + columns[i].text + "column."); - } lockedWidth += column.width; lockedHeaders.push(column); } else { @@ -72958,60 +74106,79 @@ Ext.define('Ext.grid.Scroller', { weight: 110, cls: Ext.baseCSSPrefix + 'scroller', focusable: false, - - renderTpl: ['
'], - + reservedSpace: 0, + + renderTpl: [ + '
', + '
', + '
' + ], + initComponent: function() { var me = this, dock = me.dock, cls = Ext.baseCSSPrefix + 'scroller-vertical', - sizeProp = 'width', - - - - - - scrollbarWidth = Ext.getScrollBarWidth() + (Ext.isIE ? 1 : -1); + sizeProp = 'width'; me.offsets = {bottom: 0}; + me.scrollProp = 'scrollTop'; + me.vertical = true; if (dock === 'top' || dock === 'bottom') { cls = Ext.baseCSSPrefix + 'scroller-horizontal'; sizeProp = 'height'; + me.scrollProp = 'scrollLeft'; + me.vertical = false; + me.weight += 5; } - me[sizeProp] = scrollbarWidth; - + + me[sizeProp] = me.scrollerSize = Ext.getScrollbarSize()[sizeProp]; + me.cls += (' ' + cls); - + Ext.applyIf(me.renderSelectors, { - stretchEl: '.' + Ext.baseCSSPrefix + 'stretcher' + stretchEl: '.' + Ext.baseCSSPrefix + 'stretcher', + scrollEl: '.' + Ext.baseCSSPrefix + 'scroller-ct' }); me.callParent(); }, - - + + initRenderData: function () { + var me = this, + ret = me.callParent(arguments) || {}; + + ret.baseId = me.id; + + return ret; + }, + afterRender: function() { var me = this; me.callParent(); - me.ownerCt.on('afterlayout', me.onOwnerAfterLayout, me); - me.mon(me.el, 'scroll', me.onElScroll, me); + + me.mon(me.scrollEl, 'scroll', me.onElScroll, me); Ext.cache[me.el.id].skipGarbageCollection = true; }, - + + onAdded: function(container) { + + this.ownerGrid = container; + this.callParent(arguments); + }, + getSizeCalculation: function() { - var owner = this.getPanel(), - dock = this.dock, - elDom = this.el.dom, + var me = this, + owner = me.getPanel(), width = 1, height = 1, view, tbl; - - if (dock === 'top' || dock === 'bottom') { + + if (!me.vertical) { var items = owner.query('tableview'), center = items[1] || items[0]; - + if (!center) { return false; } @@ -73019,25 +74186,23 @@ Ext.define('Ext.grid.Scroller', { width = center.headerCt.getFullWidth(); - + if (Ext.isIEQuirks) { width--; } - - width--; - } else { + } else { view = owner.down('tableview:not([lockableInjected])'); - if (!view) { + if (!view || !view.el) { return false; } - tbl = view.el; + tbl = view.el.child('table', true); if (!tbl) { return false; } + - - height = tbl.dom.scrollHeight; + height = tbl.offsetHeight; } if (isNaN(width)) { width = 1; @@ -73050,64 +74215,124 @@ Ext.define('Ext.grid.Scroller', { height: height }; }, - + invalidate: function(firstPass) { - if (!this.stretchEl || !this.ownerCt) { + var me = this, + stretchEl = me.stretchEl; + + if (!stretchEl || !me.ownerCt) { return; } - var size = this.getSizeCalculation(), - elDom = this.el.dom; + + var size = me.getSizeCalculation(), + scrollEl = me.scrollEl, + elDom = scrollEl.dom, + reservedSpace = me.reservedSpace, + pos, + extra = 5; + if (size) { - this.stretchEl.setSize(size); - + stretchEl.setSize(size); + + size = me.el.getSize(true); + + if (me.vertical) { + size.width += extra; + size.height -= reservedSpace; + pos = 'left'; + } else { + size.width -= reservedSpace; + size.height += extra; + pos = 'top'; + } + + scrollEl.setSize(size); + elDom.style[pos] = (-extra) + 'px'; + elDom.scrollTop = elDom.scrollTop; } }, - onOwnerAfterLayout: function(owner, layout) { + afterComponentLayout: function() { + this.callParent(arguments); this.invalidate(); }, + restoreScrollPos: function () { + var me = this, + el = this.scrollEl, + elDom = el && el.dom; + + if (me._scrollPos !== null && elDom) { + elDom[me.scrollProp] = me._scrollPos; + me._scrollPos = null; + } + }, + + setReservedSpace: function (reservedSpace) { + var me = this; + if (me.reservedSpace !== reservedSpace) { + me.reservedSpace = reservedSpace; + me.invalidate(); + } + }, + + saveScrollPos: function () { + var me = this, + el = this.scrollEl, + elDom = el && el.dom; + + me._scrollPos = elDom ? elDom[me.scrollProp] : null; + }, + setScrollTop: function(scrollTop) { - if (this.el) { - var elDom = this.el.dom; + var el = this.scrollEl, + elDom = el && el.dom; + + if (elDom) { return elDom.scrollTop = Ext.Number.constrain(scrollTop, 0, elDom.scrollHeight - elDom.clientHeight); } }, setScrollLeft: function(scrollLeft) { - if (this.el) { - var elDom = this.el.dom; + var el = this.scrollEl, + elDom = el && el.dom; + + if (elDom) { return elDom.scrollLeft = Ext.Number.constrain(scrollLeft, 0, elDom.scrollWidth - elDom.clientWidth); } }, scrollByDeltaY: function(delta) { - if (this.el) { - var elDom = this.el.dom; + var el = this.scrollEl, + elDom = el && el.dom; + + if (elDom) { return this.setScrollTop(elDom.scrollTop + delta); } }, scrollByDeltaX: function(delta) { - if (this.el) { - var elDom = this.el.dom; + var el = this.scrollEl, + elDom = el && el.dom; + + if (elDom) { return this.setScrollLeft(elDom.scrollLeft + delta); } }, - - + + scrollToTop : function(){ this.setScrollTop(0); }, - + onElScroll: function(event, target) { this.fireEvent('bodyscroll', event, target); @@ -73135,17 +74360,17 @@ Ext.define('Ext.grid.PagingScroller', { percentageFromEdge: 0.35, - + scrollToLoadBuffer: 200, - + activePrefetch: true, - + chunkSize: 50, snapIncrement: 25, - + syncScroll: true, - + initComponent: function() { var me = this, ds = me.store; @@ -73153,8 +74378,7 @@ Ext.define('Ext.grid.PagingScroller', { ds.on('guaranteedrange', this.onGuaranteedRange, this); this.callParent(arguments); }, - - + onGuaranteedRange: function(range, start, end) { var me = this, ds = me.store, @@ -73163,7 +74387,7 @@ Ext.define('Ext.grid.PagingScroller', { if (range.length && me.visibleStart < range[0].index) { return; } - + ds.loadRecords(range); if (!me.firstLoad) { @@ -73178,19 +74402,19 @@ Ext.define('Ext.grid.PagingScroller', { me.syncTo(); } }, - + syncTo: function() { var me = this, pnl = me.getPanel(), store = pnl.store, - scrollerElDom = this.el.dom, + scrollerElDom = this.scrollEl.dom, rowOffset = me.visibleStart - store.guaranteedStart, scrollBy = rowOffset * me.rowHeight, scrollHeight = scrollerElDom.scrollHeight, clientHeight = scrollerElDom.clientHeight, scrollTop = scrollerElDom.scrollTop, useMaximum; - + if (Ext.isIE9 && Ext.isStrict) { @@ -73202,12 +74426,12 @@ Ext.define('Ext.grid.PagingScroller', { useMaximum = (scrollHeight - clientHeight - scrollTop <= 0); this.setViewScrollTop(scrollBy, useMaximum); }, - + getPageData : function(){ var panel = this.getPanel(), store = panel.store, totalCount = store.getTotalCount(); - + return { total : totalCount, currentPage : store.currentPage, @@ -73216,7 +74440,7 @@ Ext.define('Ext.grid.PagingScroller', { toRecord: Math.min(store.currentPage * store.pageSize, totalCount) }; }, - + onElScroll: function(e, t) { var me = this, panel = me.getPanel(), @@ -73243,8 +74467,7 @@ Ext.define('Ext.grid.PagingScroller', { me.visibleStart = visibleStart; me.visibleEnd = visibleEnd; - - + me.syncScroll = true; if (totalCount >= pageSize) { @@ -73273,29 +74496,29 @@ Ext.define('Ext.grid.PagingScroller', { store.prefetchPage(nextPage); } } - - + if (me.syncScroll) { me.syncTo(); } }, - + getSizeCalculation: function() { - var owner = this.ownerCt, + var owner = this.ownerGrid, view = owner.getView(), store = this.store, dock = this.dock, elDom = this.el.dom, width = 1, height = 1; - + if (!this.rowHeight) { this.rowHeight = view.el.down(view.getItemSelector()).getHeight(false, true); } - height = store.getTotalCount() * this.rowHeight; + + height = store[(!store.remoteFilter && store.isFiltered()) ? 'getCount' : 'getTotalCount']() * this.rowHeight; if (isNaN(width)) { width = 1; @@ -73308,7 +74531,7 @@ Ext.define('Ext.grid.PagingScroller', { height: height }; }, - + attemptLoad: function(start, end) { var me = this; if (!me.loadTask) { @@ -73316,18 +74539,18 @@ Ext.define('Ext.grid.PagingScroller', { } me.loadTask.delay(me.scrollToLoadBuffer, me.doAttemptLoad, me, [start, end]); }, - + cancelLoad: function() { if (this.loadTask) { this.loadTask.cancel(); } }, - + doAttemptLoad: function(start, end) { var store = this.getPanel().store; store.guaranteeRange(start, end); }, - + setViewScrollTop: function(scrollTop, useMax) { var owner = this.getPanel(), items = owner.query('tableview'), @@ -73338,12 +74561,12 @@ Ext.define('Ext.grid.PagingScroller', { calcScrollTop, maxScrollTop, scrollerElDom = this.el.dom; - + owner.virtualScrollTop = scrollTop; - + center = items[1] || items[0]; centerEl = center.el.dom; - + maxScrollTop = ((owner.store.pageSize * this.rowHeight) - centerEl.clientHeight); calcScrollTop = (scrollTop % ((owner.store.pageSize * this.rowHeight) + 1)); if (useMax) { @@ -73360,8 +74583,6 @@ Ext.define('Ext.grid.PagingScroller', { } }); - - Ext.define('Ext.panel.Table', { extend: 'Ext.panel.Panel', @@ -73398,6 +74619,8 @@ Ext.define('Ext.panel.Table', { + + sortableColumns: true, verticalScrollDock: 'right', @@ -73411,21 +74634,17 @@ Ext.define('Ext.panel.Table', { scrollerOwner: true, invalidateScrollerOnRefresh: true, + enableColumnMove: true, + + enableColumnResize: true, + + enableColumnHide: true, initComponent: function() { - if (!this.viewType) { - Ext.Error.raise("You must specify a viewType config."); - } - if (!this.store) { - Ext.Error.raise("You must specify a store config"); - } - if (this.headers) { - Ext.Error.raise("The headers config is not supported. Please specify columns instead."); - } var me = this, scroll = me.scroll, @@ -73437,8 +74656,13 @@ Ext.define('Ext.panel.Table', { border = me.border; - me.determineScrollbars = Ext.Function.createBuffered(me.determineScrollbars, 30); - me.injectView = Ext.Function.createBuffered(me.injectView, 30); + + + + + + + me.injectView = Ext.Function.createThrottled(me.injectView, 30, me); if (me.hideHeaders) { border = false; @@ -73462,6 +74686,7 @@ Ext.define('Ext.panel.Table', { sortable: me.sortableColumns, enableColumnMove: me.enableColumnMove, enableColumnResize: me.enableColumnResize, + enableColumnHide: me.enableColumnHide, border: border }); me.columns = headerCtCfg.items; @@ -73477,6 +74702,8 @@ Ext.define('Ext.panel.Table', { me.store = Ext.data.StoreManager.lookup(me.store); me.addEvents( + 'reconfigure', + 'scrollerhide', 'scrollershow' @@ -73528,13 +74755,7 @@ Ext.define('Ext.panel.Table', { } if (vertical) { - me.verticalScroller = me.verticalScroller || {}; - Ext.applyIf(me.verticalScroller, { - dock: me.verticalScrollDock, - xtype: me.verticalScrollerType, - store: me.store - }); - me.verticalScroller = Ext.ComponentManager.create(me.verticalScroller); + me.verticalScroller = Ext.ComponentManager.create(me.initVerticalScroller()); me.mon(me.verticalScroller, { bodyscroll: me.onVerticalScroll, scope: me @@ -73542,12 +74763,7 @@ Ext.define('Ext.panel.Table', { } if (horizontal) { - me.horizontalScroller = Ext.ComponentManager.create({ - xtype: 'gridscroller', - section: me, - dock: 'bottom', - store: me.store - }); + me.horizontalScroller = Ext.ComponentManager.create(me.initHorizontalScroller()); me.mon(me.horizontalScroller, { bodyscroll: me.onHorizontalScroll, scope: me @@ -73572,12 +74788,7 @@ Ext.define('Ext.panel.Table', { scope: me }); me.mon(view, { - refresh: { - fn: this.onViewRefresh, - scope: me, - buffer: 50 - }, - itemupdate: me.onViewItemUpdate, + refresh: me.onViewRefresh, scope: me }); this.relayEvents(view, [ @@ -73658,21 +74869,68 @@ Ext.define('Ext.panel.Table', { this.callParent(); }, - getState: function(){ - var state = { - columns: [] - }, - sorter = this.store.sorters.first(); - - this.headerCt.items.each(function(header){ - state.columns.push({ - id: header.headerId, - width: header.flex ? undefined : header.width, - hidden: header.hidden, - sortable: header.sortable - }); + + initHorizontalScroller: function () { + var me = this, + ret = { + xtype: 'gridscroller', + dock: 'bottom', + section: me, + store: me.store + }; + + return ret; + }, + + + initVerticalScroller: function () { + var me = this, + ret = me.verticalScroller || {}; + + Ext.applyIf(ret, { + xtype: me.verticalScrollerType, + dock: me.verticalScrollDock, + store: me.store }); + return ret; + }, + + getState: function(){ + var state = this.callParent(), + sorter = this.store.sorters.first(), + headers = this.headerCt.items.items, + header, + len = headers.length, + i = 0; + + state.columns = []; + for (; i < len; i++) { + header = headers[i]; + state.columns[i] = { + id: header.headerId + }; + + + + + if (header.hidden !== (header.initialConfig.hidden||header.self.prototype.hidden)) { + state.columns[i].hidden = header.hidden; + } + if (header.sortable !== header.initialConfig.sortable) { + state.columns[i].sortable = header.sortable; + } + if (header.flex) { + if (header.flex !== header.initialConfig.flex) { + state.columns[i].flex = header.flex; + } + } else { + if (header.width !== header.initialConfig.width) { + state.columns[i].width = header.width; + } + } + } + if (sorter) { state.sort = { property: sorter.property, @@ -73694,6 +74952,12 @@ Ext.define('Ext.panel.Table', { headerState, header; + headerCt.suspendLayout = true; + + + + this.callParent(arguments); + for (; i < length; ++i) { headerState = headers[i]; header = headerCt.down('gridcolumn[headerId=' + headerState.id + ']'); @@ -73701,17 +74965,32 @@ Ext.define('Ext.panel.Table', { if (i !== index) { headerCt.moveHeader(index, i); } - header.sortable = headerState.sortable; - if (Ext.isDefined(headerState.width)) { + + + + if (Ext.isDefined(headerState.hidden)) { + header.hidden = headerState.hidden; + } + if (Ext.isDefined(headerState.sortable)) { + header.sortable = headerState.sortable; + } + if (Ext.isDefined(headerState.flex)) { + delete header.width; + header.flex = headerState.flex; + } else if (Ext.isDefined(headerState.width)) { delete header.flex; + header.minWidth = headerState.width; if (header.rendered) { header.setWidth(headerState.width); } else { - header.minWidth = header.width = headerState.width; + header.width = headerState.width; } } - header.hidden = headerState.hidden; } + headerCt.suspendLayout = false; + + + headerCt.doLayout(); if (sorter) { if (store.remoteSort) { @@ -73739,6 +75018,7 @@ Ext.define('Ext.panel.Table', { if (!me.view) { sm = me.getSelectionModel(); me.view = me.createComponent(Ext.apply({}, me.viewConfig, { + deferRowRender: me.deferRowRender, xtype: me.viewType, store: me.store, headerCt: me.headerCt, @@ -73779,12 +75059,6 @@ Ext.define('Ext.panel.Table', { scroller.scrollByDeltaX(distance); } }, - - afterLayout: function() { - this.callParent(arguments); - this.injectView(); - }, - injectView: function() { @@ -73795,18 +75069,33 @@ Ext.define('Ext.panel.Table', { me.hasView = true; me.add(view); - - view.el.scroll = Ext.Function.bind(me.elScroll, me); - - - me.mon(view.el, { - mousewheel: me.onMouseWheel, - scope: me - }); + function viewReady () { + + view.el.scroll = Ext.Function.bind(me.elScroll, me); + + + me.mon(view.el, { + mousewheel: me.onMouseWheel, + scope: me + }); + if (!me.height) { + me.doComponentLayout(); + } + } + + if (view.rendered) { + viewReady(); + } else { + view.on({ + afterrender: viewReady, + single: true + }); + } } }, afterExpand: function() { + this.callParent(arguments); if (!this.hasView) { this.injectView(); @@ -73827,40 +75116,105 @@ Ext.define('Ext.panel.Table', { determineScrollbars: function() { var me = this, - viewElDom, - centerScrollWidth, - centerClientWidth, + box, + tableEl, + scrollWidth, + clientWidth, scrollHeight, - clientHeight; + clientHeight, + verticalScroller = me.verticalScroller, + horizontalScroller = me.horizontalScroller, + curScrollbars = (verticalScroller && verticalScroller.ownerCt === me ? 1 : 0) | + (horizontalScroller && horizontalScroller.ownerCt === me ? 2 : 0), + reqScrollbars = 0; + + + if (!me.collapsed && me.view && me.view.el && me.view.el.dom.firstChild) { + + + + box = me.layout.getLayoutTargetSize(); + clientWidth = box.width + ((curScrollbars & 1) ? verticalScroller.width : 0); + clientHeight = box.height + ((curScrollbars & 2) ? horizontalScroller.height : 0); - if (!me.collapsed && me.view && me.view.el) { - viewElDom = me.view.el.dom; - centerScrollWidth = me.headerCt.getFullWidth(); - centerClientWidth = viewElDom.offsetWidth; - if (me.verticalScroller && me.verticalScroller.el) { - scrollHeight = me.verticalScroller.getSizeCalculation().height; + + scrollWidth = (me.headerCt.query('[flex]').length && !me.headerCt.layout.tooNarrow) ? 0 : me.headerCt.getFullWidth(); + + + if (verticalScroller && verticalScroller.el) { + scrollHeight = verticalScroller.getSizeCalculation().height; } else { - scrollHeight = viewElDom.scrollHeight; + tableEl = me.view.el.child('table', true); + scrollHeight = tableEl ? tableEl.offsetHeight : 0; } - clientHeight = viewElDom.clientHeight; + + + if (scrollHeight > clientHeight) { + reqScrollbars = 1; - if (!me.collapsed && scrollHeight > clientHeight) { - me.showVerticalScroller(); - } else { - me.hideVerticalScroller(); + + if (horizontalScroller && ((clientWidth - scrollWidth) < verticalScroller.width)) { + reqScrollbars = 3; + } } - if (!me.collapsed && centerScrollWidth > (centerClientWidth + Ext.getScrollBarWidth() - 2)) { - me.showHorizontalScroller(); - } else { - me.hideHorizontalScroller(); + + else { + + + if (scrollWidth > clientWidth) { + reqScrollbars = 2; + + + if (verticalScroller && ((clientHeight - scrollHeight) < horizontalScroller.height)) { + reqScrollbars = 3; + } + } + } + + + if (reqScrollbars !== curScrollbars) { + + + me.suspendLayout = true; + if (reqScrollbars & 1) { + me.showVerticalScroller(); + } else { + me.hideVerticalScroller(); + } + if (reqScrollbars & 2) { + me.showHorizontalScroller(); + } else { + me.hideHorizontalScroller(); + } + me.suspendLayout = false; + + + + me.changingScrollBars = true; + me.doComponentLayout(me.getWidth(), me.getHeight(), false, me.ownerCt); + me.changingScrollBars = false; } } }, + afterComponentLayout: function() { + var me = this; + me.callParent(arguments); + + + me.injectView(); + + + if (!me.changingScrollBars) { + me.determineScrollbars(); + } + me.invalidateScroller(); + }, + onHeaderResize: function() { if (this.view && this.view.rendered) { this.determineScrollbars(); @@ -73868,12 +75222,34 @@ Ext.define('Ext.panel.Table', { } }, + afterCollapse: function() { + var me = this; + if (me.verticalScroller) { + me.verticalScroller.saveScrollPos(); + } + if (me.horizontalScroller) { + me.horizontalScroller.saveScrollPos(); + } + me.callParent(arguments); + }, + + afterExpand: function() { + var me = this; + me.callParent(arguments); + if (me.verticalScroller) { + me.verticalScroller.restoreScrollPos(); + } + if (me.horizontalScroller) { + me.horizontalScroller.restoreScrollPos(); + } + }, + hideHorizontalScroller: function() { var me = this; if (me.horizontalScroller && me.horizontalScroller.ownerCt === me) { - me.verticalScroller.offsets.bottom = 0; + me.verticalScroller.setReservedSpace(0); me.removeDocked(me.horizontalScroller, false); me.removeCls(me.horizontalScrollerPresentCls); me.fireEvent('scrollerhide', me.horizontalScroller, 'horizontal'); @@ -73886,7 +75262,7 @@ Ext.define('Ext.panel.Table', { var me = this; if (me.verticalScroller) { - me.verticalScroller.offsets.bottom = Ext.getScrollBarWidth() - 2; + me.verticalScroller.setReservedSpace(Ext.getScrollbarSize().height - 1); } if (me.horizontalScroller && me.horizontalScroller.ownerCt !== me) { me.addDocked(me.horizontalScroller); @@ -73897,14 +75273,9 @@ Ext.define('Ext.panel.Table', { hideVerticalScroller: function() { - var me = this, - headerCt = me.headerCt; + var me = this; - - if (headerCt && headerCt.layout.reserveOffset) { - headerCt.layout.reserveOffset = false; - headerCt.doLayout(); - } + me.setHeaderReserveOffset(false); if (me.verticalScroller && me.verticalScroller.ownerCt === me) { me.removeDocked(me.verticalScroller, false); me.removeCls(me.verticalScrollerPresentCls); @@ -73914,14 +75285,9 @@ Ext.define('Ext.panel.Table', { showVerticalScroller: function() { - var me = this, - headerCt = me.headerCt; + var me = this; - - if (headerCt && !headerCt.layout.reserveOffset) { - headerCt.layout.reserveOffset = true; - headerCt.doLayout(); - } + me.setHeaderReserveOffset(true); if (me.verticalScroller && me.verticalScroller.ownerCt !== me) { me.addDocked(me.verticalScroller); me.addCls(me.verticalScrollerPresentCls); @@ -73929,6 +75295,17 @@ Ext.define('Ext.panel.Table', { } }, + setHeaderReserveOffset: function (reserveOffset) { + var headerCt = this.headerCt, + layout = headerCt.layout; + + + if (layout && layout.reserveOffset !== reserveOffset) { + layout.reserveOffset = reserveOffset; + headerCt.doLayout(); + } + }, + invalidateScroller: function() { var me = this, @@ -73967,129 +75344,57 @@ Ext.define('Ext.panel.Table', { onMouseWheel: function(e) { var me = this, - browserEvent = e.browserEvent, vertScroller = me.getVerticalScroller(), horizScroller = me.getHorizontalScroller(), - scrollDelta = me.scrollDelta, - deltaY, deltaX, + scrollDelta = me.scrollDelta / -5, + deltas = e.getWheelDeltas(), + deltaX = scrollDelta * deltas.x, + deltaY = scrollDelta * deltas.y, vertScrollerEl, horizScrollerEl, - origScrollLeft, origScrollTop, - newScrollLeft, newScrollTop; + vertScrollerElDom, horizScrollerElDom, + horizontalCanScrollLeft, horizontalCanScrollRight, + verticalCanScrollDown, verticalCanScrollUp; - if (horizScroller) { - horizScrollerEl = horizScroller.el; + horizScrollerEl = horizScroller.scrollEl; if (horizScrollerEl) { - origScrollLeft = horizScrollerEl.dom.scrollLeft; + horizScrollerElDom = horizScrollerEl.dom; + horizontalCanScrollRight = horizScrollerElDom.scrollLeft !== horizScrollerElDom.scrollWidth - horizScrollerElDom.clientWidth; + horizontalCanScrollLeft = horizScrollerElDom.scrollLeft !== 0; } } if (vertScroller) { - vertScrollerEl = vertScroller.el; + vertScrollerEl = vertScroller.scrollEl; if (vertScrollerEl) { - origScrollTop = vertScrollerEl.dom.scrollTop; + vertScrollerElDom = vertScrollerEl.dom; + verticalCanScrollDown = vertScrollerElDom.scrollTop !== vertScrollerElDom.scrollHeight - vertScrollerElDom.clientHeight; + verticalCanScrollUp = vertScrollerElDom.scrollTop !== 0; } } - - if (browserEvent.wheelDeltaX || browserEvent.wheelDeltaY) { - deltaX = -browserEvent.wheelDeltaX / 120 * scrollDelta / 3; - deltaY = -browserEvent.wheelDeltaY / 120 * scrollDelta / 3; - if (horizScroller) { - newScrollLeft = horizScroller.scrollByDeltaX(deltaX); - } - if (vertScroller) { - newScrollTop = vertScroller.scrollByDeltaY(deltaY); - } - } else { - - if (browserEvent.axis && browserEvent.axis === 1) { - if (horizScroller) { - deltaX = -(scrollDelta * e.getWheelDelta()) / 3; - newScrollLeft = horizScroller.scrollByDeltaX(deltaX); - } - } else { - if (vertScroller) { - - deltaY = -(scrollDelta * e.getWheelDelta() / 3); - newScrollTop = vertScroller.scrollByDeltaY(deltaY); - } + if (horizScroller) { + if ((deltaX < 0 && horizontalCanScrollLeft) || (deltaX > 0 && horizontalCanScrollRight)) { + e.stopEvent(); + horizScroller.scrollByDeltaX(deltaX); } } - - - - if ((deltaX !== 0 && newScrollLeft !== origScrollLeft) || - (deltaY !== 0 && newScrollTop !== origScrollTop)) { - e.stopEvent(); + if (vertScroller) { + if ((deltaY < 0 && verticalCanScrollUp) || (deltaY > 0 && verticalCanScrollDown)) { + e.stopEvent(); + vertScroller.scrollByDeltaY(deltaY); + } } }, onViewRefresh: function() { - if (Ext.isIE) { - this.syncCellHeight(); - } this.determineScrollbars(); if (this.invalidateScrollerOnRefresh) { this.invalidateScroller(); } }, - onViewItemUpdate: function(record, index, tr) { - if (Ext.isIE) { - this.syncCellHeight([tr]); - } - }, - - - - - syncCellHeight: function(trs) { - var me = this, - i = 0, - tds, - j, tdsLn, - tr, td, - trsLn, - rowHeights = [], - cellHeights, - cellClsSelector = ('.' + Ext.baseCSSPrefix + 'grid-cell'); - - trs = trs || me.view.getNodes(); - - trsLn = trs.length; - - for (; i < trsLn; i++) { - tr = trs[i]; - tds = Ext.fly(tr).query(cellClsSelector); - tdsLn = tds.length; - cellHeights = []; - for (j = 0; j < tdsLn; j++) { - td = tds[j]; - cellHeights.push(td.clientHeight); - } - rowHeights.push(Ext.Array.max(cellHeights)); - } - - - for (i = 0; i < trsLn; i++) { - tr = trs[i]; - tdsLn = tr.childNodes.length; - for (j = 0; j < tdsLn; j++) { - td = Ext.fly(tr.childNodes[j]); - if (rowHeights[i]) { - if (td.is(cellClsSelector)) { - td.setHeight(rowHeights[i]); - } else { - td.down(cellClsSelector).setHeight(rowHeights[i]); - } - } - - } - } - }, - setScrollTop: function(top) { var me = this, @@ -74100,7 +75405,6 @@ Ext.define('Ext.panel.Table', { if (verticalScroller) { verticalScroller.setScrollTop(top); } - }, getScrollerOwner: function() { @@ -74113,18 +75417,20 @@ Ext.define('Ext.panel.Table', { scrollByDeltaY: function(deltaY) { - var rootCmp = this.getScrollerOwner(), - scrollerRight; - scrollerRight = rootCmp.down('gridscroller[dock=' + this.verticalScrollDock + ']'); - if (scrollerRight) { - scrollerRight.scrollByDeltaY(deltaY); + var verticalScroller = this.getVerticalScroller(); + + if (verticalScroller) { + verticalScroller.scrollByDeltaY(deltaY); } }, - scrollByDeltaX: function(deltaX) { - this.horizontalScroller.scrollByDeltaX(deltaX); + var horizontalScroller = this.getVerticalScroller(); + + if (horizontalScroller) { + horizontalScroller.scrollByDeltaX(deltaX); + } }, @@ -74176,7 +75482,9 @@ Ext.define('Ext.panel.Table', { } if (!this.selModel.hasRelaySetup) { - this.relayEvents(this.selModel, ['selectionchange', 'select', 'deselect']); + this.relayEvents(this.selModel, [ + 'selectionchange', 'beforeselect', 'beforedeselect', 'select', 'deselect' + ]); this.selModel.hasRelaySetup = true; } @@ -74202,21 +75510,9 @@ Ext.define('Ext.panel.Table', { onHorizontalScroll: function(event, target) { var owner = this.getScrollerOwner(), items = owner.query('tableview'), - i = 0, - len = items.length, - center, - centerEl, - centerScrollWidth, - centerClientWidth, - width; + center = items[1] || items[0]; - center = items[1] || items[0]; - centerEl = center.el.dom; - centerScrollWidth = centerEl.scrollWidth; - centerClientWidth = centerEl.offsetWidth; - width = this.horizontalScroller.getWidth(); - - centerEl.scrollLeft = target.scrollLeft; + center.el.dom.scrollLeft = target.scrollLeft; this.headerCt.el.dom.scrollLeft = target.scrollLeft; }, @@ -74233,30 +75529,32 @@ Ext.define('Ext.panel.Table', { me.getView().bindStore(store); }, + reconfigure: function(store, columns) { - var me = this; + var me = this, + headerCt = me.headerCt; if (me.lockable) { me.reconfigureLockable(store, columns); - return; - } - - if (columns) { - me.headerCt.removeAll(); - me.headerCt.add(columns); - } - if (store) { - store = Ext.StoreManager.lookup(store); - me.bindStore(store); } else { - me.getView().refresh(); + headerCt.suspendLayout = true; + headerCt.removeAll(); + if (columns) { + headerCt.add(columns); + } else { + headerCt.doLayout(); + } + if (store) { + store = Ext.StoreManager.lookup(store); + me.bindStore(store); + } else { + me.getView().refresh(); + } + if (columns) { + me.forceComponentLayout(); + } } - }, - - afterComponentLayout: function() { - this.callParent(arguments); - this.determineScrollbars(); - this.invalidateScroller(); + me.fireEvent('reconfigure', me); } }); @@ -74291,15 +75589,26 @@ Ext.define('Ext.view.Table', { getRowClass: null, initComponent: function() { - this.scrollState = {}; - this.selModel.view = this; - this.headerCt.view = this; - this.initFeatures(); - this.setNewTemplate(); - this.callParent(); - this.mon(this.store, { - load: this.onStoreLoad, - scope: this + var me = this; + + if (me.deferRowRender !== false) { + me.refresh = function() { + delete me.refresh; + setTimeout(function() { + me.refresh(); + }, 0); + }; + } + + me.scrollState = {}; + me.selModel.view = me; + me.headerCt.view = me; + me.initFeatures(); + me.tpl = '
'; + me.callParent(); + me.mon(me.store, { + load: me.onStoreLoad, + scope: me }); @@ -74315,31 +75624,40 @@ Ext.define('Ext.view.Table', { onStoreLoad: function(){ - if (this.invalidateScrollerOnRefresh) { + var me = this; + + if (me.invalidateScrollerOnRefresh) { if (Ext.isGecko) { - if (!this.scrollToTopTask) { - this.scrollToTopTask = Ext.create('Ext.util.DelayedTask', this.scrollToTop, this); + if (!me.scrollToTopTask) { + me.scrollToTopTask = Ext.create('Ext.util.DelayedTask', me.scrollToTop, me); } - this.scrollToTopTask.delay(1); + me.scrollToTopTask.delay(1); } else { - this.scrollToTop(); + me .scrollToTop(); } } }, scrollToTop: Ext.emptyFn, + + addElListener: function(eventName, fn, scope){ + this.mon(this, eventName, fn, scope, { + element: 'el' + }); + }, + getGridColumns: function() { - return this.headerCt.getGridColumns(); + return this.headerCt.getGridColumns(); }, - + getHeaderAtIndex: function(index) { return this.headerCt.getHeaderAtIndex(index); }, - + getCell: function(record, column) { var row = this.getNode(record); @@ -74356,20 +75674,24 @@ Ext.define('Ext.view.Table', { initFeatures: function() { - this.features = this.features || []; - var features = this.features, - ln = features.length, - i = 0; + var me = this, + i = 0, + features, + len; - this.featuresMC = Ext.create('Ext.util.MixedCollection'); - for (; i < ln; i++) { + me.features = me.features || []; + features = me.features; + len = features.length; + + me.featuresMC = Ext.create('Ext.util.MixedCollection'); + for (; i < len; i++) { if (!features[i].isFeature) { - features[i] = Ext.create('feature.'+features[i].ftype, features[i]); + features[i] = Ext.create('feature.' + features[i].ftype, features[i]); } - features[i].view = this; - this.featuresMC.add(features[i]); + features[i].view = me; + me.featuresMC.add(features[i]); } }, @@ -74387,12 +75709,15 @@ Ext.define('Ext.view.Table', { }, afterRender: function() { - this.callParent(); - this.mon(this.el, { - scroll: this.fireBodyScroll, - scope: this + var me = this; + + me.callParent(); + me.mon(me.el, { + scroll: me.fireBodyScroll, + scope: me }); - this.attachEventsForFeatures(); + me.el.unselectable(); + me.attachEventsForFeatures(); }, fireBodyScroll: function(e, t) { @@ -74402,8 +75727,9 @@ Ext.define('Ext.view.Table', { prepareData: function(data, idx, record) { - var orig = this.headerCt.prepareData(data, idx, record, this), - features = this.features, + var me = this, + orig = me.headerCt.prepareData(data, idx, record, me, me.ownerCt), + features = me.features, ln = features.length, i = 0, node, feature; @@ -74411,7 +75737,7 @@ Ext.define('Ext.view.Table', { for (; i < ln; i++) { feature = features[i]; if (feature.isFeature) { - Ext.apply(orig, feature.getAdditionalData(data, idx, record, orig, this)); + Ext.apply(orig, feature.getAdditionalData(data, idx, record, orig, me)); } } @@ -74442,24 +75768,6 @@ Ext.define('Ext.view.Table', { for (; j < jln; j++) { rowParams = {}; preppedRecords[j]['rowCls'] = this.getRowClass(records[j], j, rowParams, this.store); - if (rowParams.alt) { - Ext.Error.raise("The getRowClass alt property is no longer supported."); - } - if (rowParams.tstyle) { - Ext.Error.raise("The getRowClass tstyle property is no longer supported."); - } - if (rowParams.cells) { - Ext.Error.raise("The getRowClass cells property is no longer supported."); - } - if (rowParams.body) { - Ext.Error.raise("The getRowClass body property is no longer supported. Use the getAdditionalData method of the rowbody feature."); - } - if (rowParams.bodyStyle) { - Ext.Error.raise("The getRowClass bodyStyle property is no longer supported."); - } - if (rowParams.cols) { - Ext.Error.raise("The getRowClass cols property is no longer supported."); - } } } @@ -74477,18 +75785,29 @@ Ext.define('Ext.view.Table', { onHeaderResize: function(header, w, suppressFocus) { - var el = this.el; + var me = this, + el = me.el; + if (el) { - this.saveScrollState(); + me.saveScrollState(); + + + + + if (Ext.isIE6 || Ext.isIE7) { + if (header.el.hasCls(Ext.baseCSSPrefix + 'column-header-first')) { + w += 1; + } + } el.select('.' + Ext.baseCSSPrefix + 'grid-col-resizer-'+header.id).setWidth(w); - el.select('.' + Ext.baseCSSPrefix + 'grid-table-resizer').setWidth(this.headerCt.getFullWidth()); - this.restoreScrollState(); - this.setNewTemplate(); + el.select('.' + Ext.baseCSSPrefix + 'grid-table-resizer').setWidth(me.headerCt.getFullWidth()); + me.restoreScrollState(); + me.setNewTemplate(); if (!suppressFocus) { - this.el.focus(); + me.el.focus(); } } }, @@ -74515,10 +75834,12 @@ Ext.define('Ext.view.Table', { setNewTemplate: function() { - var columns = this.headerCt.getColumnsForTpl(true); - this.tpl = this.getTableChunker().getTableTpl({ + var me = this, + columns = me.headerCt.getColumnsForTpl(true); + + me.tpl = me.getTableChunker().getTableTpl({ columns: columns, - features: this.features + features: me.features }); }, @@ -74550,30 +75871,32 @@ Ext.define('Ext.view.Table', { onRowDeselect : function(rowIdx) { - this.removeRowCls(rowIdx, this.selectedItemCls); - this.removeRowCls(rowIdx, this.focusedItemCls); + var me = this; + + me.removeRowCls(rowIdx, me.selectedItemCls); + me.removeRowCls(rowIdx, me.focusedItemCls); }, - + onCellSelect: function(position) { var cell = this.getCellByPosition(position); if (cell) { cell.addCls(this.selectedCellCls); } }, - + onCellDeselect: function(position) { var cell = this.getCellByPosition(position); if (cell) { cell.removeCls(this.selectedCellCls); } - + }, - + onCellFocus: function(position) { this.focusCell(position); }, - + getCellByPosition: function(position) { var row = position.row, column = position.column, @@ -74582,8 +75905,8 @@ Ext.define('Ext.view.Table', { header = this.headerCt.getHeaderAtIndex(column), cellSelector, cell = false; - - if (header) { + + if (header && node) { cellSelector = header.getCellSelector(); cell = Ext.fly(node).down(cellSelector); } @@ -74593,30 +75916,32 @@ Ext.define('Ext.view.Table', { onRowFocus: function(rowIdx, highlight, supressFocus) { - var row = this.getNode(rowIdx); + var me = this, + row = me.getNode(rowIdx); if (highlight) { - this.addRowCls(rowIdx, this.focusedItemCls); + me.addRowCls(rowIdx, me.focusedItemCls); if (!supressFocus) { - this.focusRow(rowIdx); + me.focusRow(rowIdx); } } else { - this.removeRowCls(rowIdx, this.focusedItemCls); + me.removeRowCls(rowIdx, me.focusedItemCls); } }, focusRow: function(rowIdx) { - var row = this.getNode(rowIdx), - el = this.el, + var me = this, + row = me.getNode(rowIdx), + el = me.el, adjustment = 0, - panel = this.ownerCt, + panel = me.ownerCt, rowRegion, elRegion, record; - - if (row && this.el) { + + if (row && el) { elRegion = el.getRegion(); rowRegion = Ext.fly(row).getRegion(); @@ -74626,24 +75951,25 @@ Ext.define('Ext.view.Table', { } else if (rowRegion.bottom > elRegion.bottom) { adjustment = rowRegion.bottom - elRegion.bottom; } - record = this.getRecord(row); - rowIdx = this.store.indexOf(record); + record = me.getRecord(row); + rowIdx = me.store.indexOf(record); if (adjustment) { panel.scrollByDeltaY(adjustment); } - this.fireEvent('rowfocus', record, row, rowIdx); + me.fireEvent('rowfocus', record, row, rowIdx); } }, focusCell: function(position) { - var cell = this.getCellByPosition(position), - el = this.el, + var me = this, + cell = me.getCellByPosition(position), + el = me.el, adjustmentY = 0, adjustmentX = 0, elRegion = el.getRegion(), - panel = this.ownerCt, + panel = me.ownerCt, cellRegion, record; @@ -74673,7 +75999,7 @@ Ext.define('Ext.view.Table', { panel.scrollByDeltaX(adjustmentX); } el.focus(); - this.fireEvent('cellfocus', record, cell, position); + me.fireEvent('cellfocus', record, cell, position); } }, @@ -74708,46 +76034,18 @@ Ext.define('Ext.view.Table', { }, - refresh: function(firstPass) { - var me = this, - table; - - - me.setNewTemplate(); - - - - - if (me.rendered) { - table = me.el.child('table'); - if (table) { - table.removeAllListeners(); - } - } - - me.callParent(arguments); - - - if (me.rendered) { - - table = me.el.child('table'); - if (table) { - table.unselectable(); - } - - if (!firstPass) { - - me.el.focus(); - } - } + refresh: function() { + this.setNewTemplate(); + this.callParent(arguments); }, - processItemEvent: function(type, record, row, rowIndex, e) { + processItemEvent: function(record, row, rowIndex, e) { var me = this, cell = e.getTarget(me.cellSelector, row), cellIndex = cell ? cell.cellIndex : -1, map = me.statics().EventMap, selModel = me.getSelectionModel(), + type = e.type, result; if (type == 'keydown' && !cell && selModel.getCurrentPosition) { @@ -74781,15 +76079,15 @@ Ext.define('Ext.view.Table', { processSpecialEvent: function(e) { var me = this, - map = this.statics().EventMap, - features = this.features, + map = me.statics().EventMap, + features = me.features, ln = features.length, type = e.type, i, feature, prefix, featureTarget, beforeArgs, args, panel = me.ownerCt; - this.callParent(arguments); + me.callParent(arguments); if (type == 'mouseover' || type == 'mouseout') { return; @@ -74803,9 +76101,9 @@ Ext.define('Ext.view.Table', { prefix = feature.eventPrefix; - beforeArgs = feature.getFireEventArgs('before' + prefix + type, me, featureTarget); - args = feature.getFireEventArgs(prefix + type, me, featureTarget); - + beforeArgs = feature.getFireEventArgs('before' + prefix + type, me, featureTarget, e); + args = feature.getFireEventArgs(prefix + type, me, featureTarget, e); + if ( (me.fireEvent.apply(me, beforeArgs) === false) || @@ -74839,9 +76137,11 @@ Ext.define('Ext.view.Table', { expandToFit: function(header) { - var maxWidth = this.getMaxContentWidth(header); - delete header.flex; - header.setWidth(maxWidth); + if (header) { + var maxWidth = this.getMaxContentWidth(header); + delete header.flex; + header.setWidth(maxWidth); + } }, @@ -74863,12 +76163,13 @@ Ext.define('Ext.view.Table', { }, getPositionByEvent: function(e) { - var cellNode = e.getTarget(this.cellSelector), - rowNode = e.getTarget(this.itemSelector), - record = this.getRecord(rowNode), - header = this.getHeaderByCell(cellNode); + var me = this, + cellNode = e.getTarget(me.cellSelector), + rowNode = e.getTarget(me.itemSelector), + record = me.getRecord(rowNode), + header = me.getHeaderByCell(cellNode); - return this.getPosition(record, header); + return me.getPosition(record, header); }, getHeaderByCell: function(cell) { @@ -74883,13 +76184,14 @@ Ext.define('Ext.view.Table', { walkCells: function(pos, direction, e, preventWrap, verifierFn, scope) { - var row = pos.row, + var me = this, + row = pos.row, column = pos.column, - rowCount = this.store.getCount(), - firstCol = this.getFirstVisibleColumnIndex(), - lastCol = this.getLastVisibleColumnIndex(), + rowCount = me.store.getCount(), + firstCol = me.getFirstVisibleColumnIndex(), + lastCol = me.getLastVisibleColumnIndex(), newPos = {row: row, column: column}, - activeHeader = this.headerCt.getHeaderAtIndex(column); + activeHeader = me.headerCt.getHeaderAtIndex(column); if (!activeHeader || activeHeader.hidden) { @@ -74914,7 +76216,7 @@ Ext.define('Ext.view.Table', { } else { if (!e.ctrlKey) { - newPos.column = column + this.getRightGap(activeHeader); + newPos.column = column + me.getRightGap(activeHeader); } else { newPos.column = lastCol; } @@ -74936,7 +76238,7 @@ Ext.define('Ext.view.Table', { } else { if (!e.ctrlKey) { - newPos.column = column + this.getLeftGap(activeHeader); + newPos.column = column + me.getLeftGap(activeHeader); } else { newPos.column = firstCol; } @@ -75031,10 +76333,7 @@ Ext.define('Ext.view.Table', { beforeDestroy: function() { if (this.rendered) { - table = this.el.child('table'); - if (table) { - table.removeAllListeners(); - } + this.el.removeAllListeners(); } this.callParent(arguments); }, @@ -75091,11 +76390,17 @@ Ext.define('Ext.grid.View', { this.doStripeRows(index); }, + onUpdate: function(ds, record, operation) { + var index = ds.indexOf(record); + this.callParent(arguments); + this.doStripeRows(index, index); + }, - doStripeRows: function(startRow) { + + doStripeRows: function(startRow, endRow) { if (this.stripeRows) { - var rows = this.getNodes(startRow), + var rows = this.getNodes(startRow, endRow), rowsLn = rows.length, i = 0, row; @@ -75104,8 +76409,9 @@ Ext.define('Ext.grid.View', { row = rows[i]; row.className = row.className.replace(this.rowClsRe, ' '); + startRow++; - if (i % 2 === 1) { + if (startRow % 2 === 0) { row.className += (' ' + this.altRowCls); } } @@ -75183,6 +76489,10 @@ Ext.define('Ext.grid.RowEditor', { lastScrollTop: 0, border: false, + + + + hideMode: 'offsets', initComponent: function() { var me = this, @@ -75353,7 +76663,7 @@ Ext.define('Ext.grid.RowEditor', { } }, - onFieldAdd: function(hm, fieldId, column) { + onFieldAdd: function(map, fieldId, column) { var me = this, colIdx = me.editingPlugin.grid.headerCt.getHeaderIndex(column), field = column.getEditor({ xtype: 'displayfield' }); @@ -75361,24 +76671,26 @@ Ext.define('Ext.grid.RowEditor', { me.insert(colIdx, field); }, - onFieldRemove: function(hm, fieldId, column) { + onFieldRemove: function(map, fieldId, column) { var me = this, field = column.getEditor(), - fieldDom = field.el.dom; + fieldEl = field.el; me.remove(field, false); - fieldDom.parentNode.removeChild(fieldDom); + if (fieldEl) { + fieldEl.remove(); + } }, - onFieldReplace: function(hm, fieldId, column, oldColumn) { + onFieldReplace: function(map, fieldId, column, oldColumn) { var me = this; - me.onFieldRemove(hm, fieldId, oldColumn); + me.onFieldRemove(map, fieldId, oldColumn); }, clearFields: function() { var me = this, - hm = me.columns; - hm.each(function(fieldId) { - hm.removeAtKey(fieldId); + map = me.columns; + map.each(function(fieldId) { + map.removeAtKey(fieldId); }); }, @@ -75558,14 +76870,25 @@ Ext.define('Ext.grid.RowEditor', { } - field = column.getEditor(null, { xtype: 'displayfield' }); + field = column.getEditor(null, { + xtype: 'displayfield', + + + getModelData: function() { + return null; + } + }); field.margins = '0 0 0 2'; - field.setWidth(column.getWidth() - 2); + field.setWidth(column.getDesiredWidth() - 2); me.mon(field, 'change', me.onFieldChange, me); me.columns.add(field.id, column); + + if (me.isVisible() && me.context) { + me.renderColumnData(field, me.context.record); + } }, loadRecord: function(record) { @@ -75591,7 +76914,7 @@ Ext.define('Ext.grid.RowEditor', { view = grid.view, store = view.store, column = me.columns.get(field.id), - value = field.getRawValue(); + value = record.get(column.dataIndex); if (column.renderer) { @@ -75840,10 +77163,10 @@ Ext.define('Ext.grid.header.Container', { sortable: true, - + initComponent: function() { var me = this; - + me.headerCounter = 0; me.plugins = me.plugins || []; @@ -75857,7 +77180,7 @@ Ext.define('Ext.grid.header.Container', { me.reorderer = Ext.create('Ext.grid.plugin.HeaderReorderer'); if (!me.enableColumnResize) { me.resizer.disable(); - } + } if (!me.enableColumnMove) { me.reorderer.disable(); } @@ -75952,15 +77275,33 @@ Ext.define('Ext.grid.header.Container', { if (!this.isHeader) { var me = this, topHeaders = me.query('>gridcolumn:not([hidden])'), - viewEl; + viewEl, + firstHeaderEl, + lastHeaderEl; me.callParent(arguments); if (topHeaders.length) { - topHeaders[0].el.radioCls(me.firstHeaderCls); - topHeaders[topHeaders.length - 1].el.radioCls(me.lastHeaderCls); + firstHeaderEl = topHeaders[0].el; + if (firstHeaderEl !== me.pastFirstHeaderEl) { + if (me.pastFirstHeaderEl) { + me.pastFirstHeaderEl.removeCls(me.firstHeaderCls); + } + firstHeaderEl.addCls(me.firstHeaderCls); + me.pastFirstHeaderEl = firstHeaderEl; + } + + lastHeaderEl = topHeaders[topHeaders.length - 1].el; + if (lastHeaderEl !== me.pastLastHeaderEl) { + if (me.pastLastHeaderEl) { + me.pastLastHeaderEl.removeCls(me.lastHeaderCls); + } + lastHeaderEl.addCls(me.lastHeaderCls); + me.pastLastHeaderEl = lastHeaderEl + } } } + }, onHeaderShow: function(header) { @@ -76076,6 +77417,10 @@ Ext.define('Ext.grid.header.Container', { for (i = 0; i < len; i++) { itemToDisable = itemsToDisable[i]; if (!Ext.Array.contains(me.disabledMenuItems, itemToDisable)) { + + + + itemToDisable.disabled = false; itemToDisable[itemToDisable.menu ? 'disableCheckChange' : 'disable'](); me.disabledMenuItems.push(itemToDisable); } @@ -76174,6 +77519,7 @@ Ext.define('Ext.grid.header.Container', { if (!me.menu) { me.menu = Ext.create('Ext.menu.Menu', { + hideOnParentHide: false, items: me.getMenuItems(), listeners: { deactivate: me.onMenuDeactivate, @@ -76189,15 +77535,11 @@ Ext.define('Ext.grid.header.Container', { getMenuItems: function() { var me = this, - menuItems = [{ - itemId: 'columnItem', - text: me.columnsText, - cls: Ext.baseCSSPrefix + 'cols-icon', - menu: me.getColumnMenu(me) - }]; + menuItems = [], + hideableColumns = me.enableColumnHide ? me.getColumnMenu(me) : null; if (me.sortable) { - menuItems.unshift({ + menuItems = [{ itemId: 'ascItem', text: me.sortAscText, cls: 'xg-hmenu-sort-asc', @@ -76209,7 +77551,15 @@ Ext.define('Ext.grid.header.Container', { cls: 'xg-hmenu-sort-desc', handler: me.onSortDescClick, scope: me - },'-'); + }]; + }; + if (hideableColumns && hideableColumns.length) { + menuItems.push('-', { + itemId: 'columnItem', + text: me.columnsText, + cls: Ext.baseCSSPrefix + 'cols-icon', + menu: hideableColumns + }); } return menuItems; }, @@ -76275,14 +77625,27 @@ Ext.define('Ext.grid.header.Container', { headers = this.getGridColumns(flushCache), headersLn = headers.length, i = 0, - header; + header, + width; for (; i < headersLn; i++) { header = headers[i]; + + if (header.hidden) { + width = 0; + } else { + width = header.getDesiredWidth(); + + + + if ((i == 0) && (Ext.isIE6 || Ext.isIE7)) { + width += 1; + } + } cols.push({ dataIndex: header.dataIndex, align: header.align, - width: header.hidden ? 0 : header.getDesiredWidth(), + width: width, id: header.id, cls: header.tdCls, columnId: header.getItemId() @@ -76372,15 +77735,17 @@ Ext.define('Ext.grid.header.Container', { }, - prepareData: function(data, rowIdx, record, view) { + prepareData: function(data, rowIdx, record, view, panel) { var obj = {}, - headers = this.getGridColumns(), + headers = this.gridDataColumns || this.getGridColumns(), headersLn = headers.length, colIdx = 0, - header, value, + header, + headerId, + renderer, + value, metaData, - g = this.up('tablepanel'), - store = g.store; + store = panel.store; for (; colIdx < headersLn; colIdx++) { metaData = { @@ -76388,16 +77753,18 @@ Ext.define('Ext.grid.header.Container', { style: '' }; header = headers[colIdx]; + headerId = header.id; + renderer = header.renderer; value = data[header.dataIndex]; - if (Ext.isString(header.renderer)) { - header.renderer = Ext.util.Format[header.renderer]; + if (typeof renderer === "string") { + header.renderer = renderer = Ext.util.Format[renderer]; } - if (Ext.isFunction(header.renderer)) { - value = header.renderer.call( + if (typeof renderer === "function") { + value = renderer.call( header.scope || this.ownerCt, value, @@ -76411,20 +77778,15 @@ Ext.define('Ext.grid.header.Container', { ); } - if (metaData.css) { - - obj.cssWarning = true; - metaData.tdCls = metaData.css; - delete metaData.css; - } - obj[header.id+'-modified'] = record.isModified(header.dataIndex) ? Ext.baseCSSPrefix + 'grid-dirty-cell' : Ext.baseCSSPrefix + 'grid-clean-cell'; - obj[header.id+'-tdCls'] = metaData.tdCls; - obj[header.id+'-tdAttr'] = metaData.tdAttr; - obj[header.id+'-style'] = metaData.style; + + obj[headerId+'-modified'] = record.isModified(header.dataIndex) ? Ext.baseCSSPrefix + 'grid-dirty-cell' : ''; + obj[headerId+'-tdCls'] = metaData.tdCls; + obj[headerId+'-tdAttr'] = metaData.tdAttr; + obj[headerId+'-style'] = metaData.style; if (value === undefined || value === null || value === '') { value = ' '; } - obj[header.id] = value; + obj[headerId] = value; } return obj; }, @@ -76472,10 +77834,14 @@ Ext.define('Ext.grid.column.Column', { sortable: true, + + + + hideable: true, @@ -76507,7 +77873,7 @@ Ext.define('Ext.grid.column.Column', { var me = this, i, len; - + if (Ext.isDefined(me.header)) { me.text = me.header; delete me.header; @@ -76533,12 +77899,6 @@ Ext.define('Ext.grid.column.Column', { if (Ext.isDefined(me.columns)) { me.isGroupHeader = true; - if (me.dataIndex) { - Ext.Error.raise('Ext.grid.column.Column: Group header may not accept a dataIndex'); - } - if ((me.width && me.width !== Ext.grid.header.Container.prototype.defaultWidth) || me.flex) { - Ext.Error.raise('Ext.grid.column.Column: Group header does not support setting explicit widths or flexs. The group header width is calculated by the sum of its children.'); - } me.items = me.columns; @@ -76549,9 +77909,6 @@ Ext.define('Ext.grid.column.Column', { for (i = 0, len = me.items.length; i < len; i++) { me.width += me.items[i].width || Ext.grid.header.Container.prototype.defaultWidth; - if (me.items[i].flex) { - Ext.Error.raise('Ext.grid.column.Column: items of a grouped header do not support flexed values. Each item must explicitly define its width.'); - } } me.minWidth = me.width; @@ -76583,7 +77940,7 @@ Ext.define('Ext.grid.column.Column', { initRenderData: function() { var me = this; - + Ext.applyIf(me.renderData, { text: me.text, menuDisabled: me.menuDisabled @@ -76596,7 +77953,7 @@ Ext.define('Ext.grid.column.Column', { this.text = text; if (this.rendered) { this.textEl.update(text); - } + } }, @@ -76623,7 +77980,7 @@ Ext.define('Ext.grid.column.Column', { dblclick: me.onElDblClick, scope: me }); - + if (!Ext.isIE8 || !Ext.isStrict) { @@ -76654,22 +78011,32 @@ Ext.define('Ext.grid.column.Column', { siblings, len, i, oldWidth = me.getWidth(), - newWidth = 0; + newWidth = 0, + readyForSizing = true, + hidden, + sibling; if (width !== oldWidth) { if (headerCt.isGroupHeader) { - siblings = headerCt.items.items; len = siblings.length; - if (siblings[len - 1].rendered) { - - for (i = 0; i < len; i++) { - newWidth += (siblings[i] === me) ? width : siblings[i].getWidth(); + for (i = 0; i < len; i++) { + sibling = siblings[i]; + hidden = sibling.hidden; + if (!sibling.rendered && !hidden) { + readyForSizing = false; + break; + } + if (!hidden) { + newWidth += (sibling === me) ? width : sibling.getWidth(); } + } + + if (readyForSizing) { headerCt.minWidth = newWidth; headerCt.setWidth(newWidth); } @@ -76783,7 +78150,7 @@ Ext.define('Ext.grid.column.Column', { var me = this, idx, nextIdx; - + if (me.sortable) { idx = Ext.Array.indexOf(me.possibleSortStates, me.sortState); @@ -76973,12 +78340,12 @@ Ext.define('Ext.grid.column.Column', { isOnRightEdge: function(e) { return (this.el.getRight() - e.getXY()[0] <= this.handleWidth); } + - - - + + }); @@ -77051,9 +78418,12 @@ Ext.define('Ext.view.DropZone', { fireViewEvent: function() { - this.lock(); - var result = this.view.fireEvent.apply(this.view, arguments); - this.unlock(); + var me = this, + result; + + me.lock(); + result = me.view.fireEvent.apply(me.view, arguments); + me.unlock(); return result; }, @@ -77157,41 +78527,46 @@ Ext.define('Ext.view.DropZone', { onNodeOver: function(node, dragZone, e, data) { - if (!Ext.Array.contains(data.records, this.view.getRecord(node))) { - this.positionIndicator(node, data, e); + var me = this; + + if (!Ext.Array.contains(data.records, me.view.getRecord(node))) { + me.positionIndicator(node, data, e); } - return this.valid ? this.dropAllowed : this.dropNotAllowed; + return me.valid ? me.dropAllowed : me.dropNotAllowed; }, notifyOut: function(node, dragZone, e, data) { - this.callParent(arguments); - delete this.overRecord; - delete this.currentPosition; - if (this.indicator) { - this.indicator.hide(); + var me = this; + + me.callParent(arguments); + delete me.overRecord; + delete me.currentPosition; + if (me.indicator) { + me.indicator.hide(); } }, onContainerOver : function(dd, e, data) { - var v = this.view, - c = v.store.getCount(); + var me = this, + view = me.view, + count = view.store.getCount(); - if (c) { - this.positionIndicator(v.getNode(c - 1), data, e); + if (count) { + me.positionIndicator(view.getNode(count - 1), data, e); } else { - delete this.overRecord; - delete this.currentPosition; - this.getIndicator().setWidth(Ext.fly(v.el).getWidth()).showAt(0, 0); - this.valid = true; + delete me.overRecord; + delete me.currentPosition; + me.getIndicator().setWidth(Ext.fly(view.el).getWidth()).showAt(0, 0); + me.valid = true; } - return this.dropAllowed; + return me.dropAllowed; }, onContainerDrop : function(dd, e, data) { @@ -77212,23 +78587,18 @@ Ext.define('Ext.view.DropZone', { dropped = true; me.fireViewEvent('drop', node, data, me.overRecord, me.currentPosition); }, - performOperation; + performOperation = false; if (me.valid) { performOperation = me.fireViewEvent('beforedrop', node, data, me.overRecord, me.currentPosition, processDrop); - if (performOperation === 0) { - return; - } else if (performOperation !== false) { + if (performOperation !== false) { if (!dropped) { processDrop(); } - } else { - return false; } - } else { - return false; } + return performOperation; } }); @@ -77256,7 +78626,9 @@ Ext.define('Ext.grid.ViewDropZone', { } index = store.indexOf(record); - if (position == 'after') { + + + if (position !== 'before') { index++; } store.insert(index, data.records); @@ -77296,7 +78668,7 @@ Ext.define('Ext.grid.column.Action', { delete cfg.items; - this.callParent([cfg]); + me.callParent([cfg]); me.items = items; @@ -77310,7 +78682,7 @@ Ext.define('Ext.grid.column.Action', { meta.tdCls += ' ' + Ext.baseCSSPrefix + 'action-col-cell'; for (i = 0; i < l; i++) { item = items[i]; - v += '' + me.altText + ''; @@ -77327,19 +78699,23 @@ Ext.define('Ext.grid.column.Action', { processEvent : function(type, view, cell, recordIndex, cellIndex, e){ - var m = e.getTarget().className.match(this.actionIdRe), + var me = this, + match = e.getTarget().className.match(me.actionIdRe), item, fn; - if (m && (item = this.items[parseInt(m[1], 10)])) { - if (type == 'click') { - fn = item.handler; - if (fn || this.handler) { - fn.call(item.scope||this.scope||this, view, recordIndex, cellIndex, item, e); + if (match) { + item = me.items[parseInt(match[1], 10)]; + if (item) { + if (type == 'click') { + fn = item.handler || me.handler; + if (fn) { + fn.call(item.scope || me.scope || me, view, recordIndex, cellIndex, item, e); + } + } else if (type == 'mousedown' && item.stopSelection !== false) { + return false; } - } else if ((type == 'mousedown') && (item.stopSelection !== false)) { - return false; } } - return this.callParent(arguments); + return me.callParent(arguments); }, cascade: function(fn, scope) { @@ -77465,8 +78841,8 @@ Ext.define('Ext.grid.feature.Feature', { }, - getFireEventArgs: function(eventName, view, featureTarget) { - return [eventName, view, featureTarget]; + getFireEventArgs: function(eventName, view, featureTarget, e) { + return [eventName, view, featureTarget, e]; }, @@ -77560,13 +78936,18 @@ Ext.define('Ext.grid.feature.AbstractSummary', { }, - getColumnValue: function(column, data){ - var comp = Ext.getCmp(column.id), - value = data[column.dataIndex], - renderer = comp.summaryRenderer || comp.renderer; - + getColumnValue: function(column, summaryData){ + var comp = Ext.getCmp(column.id), + value = summaryData[column.id], + renderer = comp.summaryRenderer; + if (renderer) { - value = renderer.call(comp.scope || this, value, data, column.dataIndex); + value = renderer.call( + comp.scope || this, + value, + summaryData, + column.dataIndex + ); } return value; }, @@ -77850,7 +79231,7 @@ Ext.define('Ext.grid.feature.Grouping', { showGroupsText = me.showGroupsText, enableNoGroups = me.enableNoGroups, groupMenuItemClick = Ext.Function.bind(me.onGroupMenuItemClick, me), - groupToggleMenuItemClick = Ext.Function.bind(me.onGroupToggleMenuItemClick, me) + groupToggleMenuItemClick = Ext.Function.bind(me.onGroupToggleMenuItemClick, me); return function() { @@ -78069,14 +79450,14 @@ Ext.define('Ext.grid.feature.Grouping', { - getFireEventArgs: function(type, view, featureTarget) { + getFireEventArgs: function(type, view, featureTarget, e) { var returnArray = [type, view, featureTarget], groupBd = Ext.fly(featureTarget.nextSibling, '_grouping'), groupBdId = Ext.getDom(groupBd).id, prefix = view.id + '-gp-', groupName = groupBdId.substr(prefix.length); - returnArray.push(groupName); + returnArray.push(groupName, e); return returnArray; } @@ -78153,6 +79534,7 @@ Ext.define('Ext.grid.feature.GroupingSummary', { reader = store.proxy.reader, groups = me.summaryGroups, columns = me.view.headerCt.getColumnsForTpl(), + remote, i, length, fieldData, @@ -78171,8 +79553,7 @@ Ext.define('Ext.grid.feature.GroupingSummary', { reader.root = me.remoteRoot; reader.buildExtractors(true); Ext.Array.each(reader.getRoot(reader.rawData), function(value) { - data[value[groupField]] = value; - data[value[groupField]]._remote = true; + remoteData[value[groupField]] = value; }); reader.root = root; @@ -78185,8 +79566,15 @@ Ext.define('Ext.grid.feature.GroupingSummary', { for (key in fieldData) { if (fieldData.hasOwnProperty(key)) { - if (!data[key]._remote) { - data[key][comp.dataIndex] = fieldData[key]; + data[key][comp.id] = fieldData[key]; + } + } + + for (key in remoteData) { + if (remoteData.hasOwnProperty(key)) { + remote = remoteData[key][comp.dataIndex]; + if (remote !== undefined) { + data[key][comp.id] = remote; } } } @@ -78381,7 +79769,7 @@ Ext.define('Ext.grid.feature.Summary', { for (i = 0, length = columns.length; i < length; ++i) { comp = Ext.getCmp(columns[i].id); - data[comp.dataIndex] = me.getSummary(store, comp.summaryType, comp.dataIndex, false); + data[comp.id] = me.getSummary(store, comp.summaryType, comp.dataIndex, false); } return data; } @@ -78750,7 +80138,8 @@ Ext.define('Ext.grid.plugin.Editing', { me.grid = grid; me.view = grid.view; me.initEvents(); - me.initFieldAccessors(me.view.getGridColumns()); + me.mon(grid, 'reconfigure', me.onReconfigure, me); + me.onReconfigure(); grid.relayEvents(me, ['beforeedit', 'edit', 'validateedit']); @@ -78758,6 +80147,11 @@ Ext.define('Ext.grid.plugin.Editing', { grid.isEditable = true; grid.editingPlugin = grid.view.editingPlugin = me; }, + + + onReconfigure: function(){ + this.initFieldAccessors(this.view.getGridColumns()); + }, destroy: function() { @@ -79001,7 +80395,7 @@ Ext.define('Ext.grid.plugin.Editing', { Ext.define('Ext.grid.plugin.CellEditing', { alias: 'plugin.cellediting', extend: 'Ext.grid.plugin.Editing', - requires: ['Ext.grid.CellEditor'], + requires: ['Ext.grid.CellEditor', 'Ext.util.DelayedTask'], constructor: function() { @@ -79011,30 +80405,43 @@ Ext.define('Ext.grid.plugin.CellEditing', { this.editors = Ext.create('Ext.util.MixedCollection', false, function(editor) { return editor.editorId; }); + this.editTask = Ext.create('Ext.util.DelayedTask'); + }, + + onReconfigure: function(){ + this.editors.clear(); + this.callParent(); }, destroy: function() { var me = this; + me.editTask.cancel(); me.editors.each(Ext.destroy, Ext); me.editors.clear(); me.callParent(arguments); }, + + onBodyScroll: function() { + var ed = this.getActiveEditor(); + if (ed && ed.field) { + if (ed.field.triggerBlur) { + ed.field.triggerBlur(); + } else { + ed.field.blur(); + } + } + }, initCancelTriggers: function() { - var me = this; + var me = this, grid = me.grid, - view = grid.view; - - me.mon(view, { - mousewheel: { - element: 'el', - fn: me.cancelEdit, - scope: me - } - }); + view = grid.view; + + view.addElListener('mousewheel', me.cancelEdit, me); + me.mon(view, 'bodyscroll', me.onBodyScroll, me); me.mon(grid, { columnresize: me.cancelEdit, columnmove: me.cancelEdit, @@ -79073,13 +80480,13 @@ Ext.define('Ext.grid.plugin.CellEditing', { me.setActiveColumn(columnHeader); - Ext.defer(ed.startEdit, 15, ed, [me.getCell(record, columnHeader), value]); + me.editTask.delay(15, ed.startEdit, ed, [me.getCell(record, columnHeader), value]); } else { - me.grid.getView().el.focus((Ext.isWebKit || Ext.isIE) ? 10 : false); + me.grid.getView().getEl(columnHeader).focus((Ext.isWebKit || Ext.isIE) ? 10 : false); } }, @@ -79116,8 +80523,9 @@ Ext.define('Ext.grid.plugin.CellEditing', { }, getEditor: function(record, column) { - var editors = this.editors, - editorId = column.itemId || column.id, + var me = this, + editors = me.editors, + editorId = column.getItemId(), editor = editors.getByKey(editorId); if (editor) { @@ -79135,13 +80543,13 @@ Ext.define('Ext.grid.plugin.CellEditing', { field: editor }); } - editor.parentEl = this.grid.getEditorParent(); + editor.parentEl = me.grid.getEditorParent(); editor.on({ - scope: this, - specialkey: this.onSpecialKey, - complete: this.onEditComplete, - canceledit: this.cancelEdit + scope: me, + specialkey: me.onSpecialKey, + complete: me.onEditComplete, + canceledit: me.cancelEdit }); editors.add(editor); return editor; @@ -79169,25 +80577,40 @@ Ext.define('Ext.grid.plugin.CellEditing', { var me = this, grid = me.grid, sm = grid.getSelectionModel(), - dataIndex = me.getActiveColumn().dataIndex; + activeColumn = me.getActiveColumn(), + dataIndex; - me.setActiveEditor(null); - me.setActiveColumn(null); - me.setActiveRecord(null); - delete sm.wasEditing; + if (activeColumn) { + dataIndex = activeColumn.dataIndex; + + me.setActiveEditor(null); + me.setActiveColumn(null); + me.setActiveRecord(null); + delete sm.wasEditing; + + if (!me.validateEdit()) { + return; + } + + + if (value !== startValue) { + me.context.record.set(dataIndex, value); + + } else { + grid.getView().getEl(activeColumn).focus(); + } + me.context.value = value; + me.fireEvent('edit', me, me.context); + - if (!me.validateEdit()) { - return; } - me.context.record.set(dataIndex, value); - me.fireEvent('edit', me, me.context); }, cancelEdit: function() { var me = this, activeEd = me.getActiveEditor(), - viewEl = me.grid.getView().el; + viewEl = me.grid.getView().getEl(me.getActiveColumn()); me.setActiveEditor(null); me.setActiveColumn(null); @@ -79400,7 +80823,7 @@ Ext.define('Ext.grid.plugin.HeaderResizer', { resizeHeader = resizeHeader[resizeHeader.length - 1]; } - if (resizeHeader && !resizeHeader.fixed) { + if (resizeHeader && !(resizeHeader.fixed || this.disabled)) { this.activeHd = resizeHeader; overHeader.el.dom.style.cursor = this.eResizeCursor; } @@ -79724,38 +81147,47 @@ Ext.define('Ext.grid.plugin.RowEditing', { onColumnAdd: function(ct, column) { - var me = this, + if (column.isHeader) { + var me = this, + editor; + + me.initFieldAccessors(column); editor = me.getEditor(); - - me.initFieldAccessors(column); - if (editor && editor.onColumnAdd) { - editor.onColumnAdd(column); + + if (editor && editor.onColumnAdd) { + editor.onColumnAdd(column); + } } }, onColumnRemove: function(ct, column) { - var me = this, - editor = me.getEditor(); - - if (editor && editor.onColumnRemove) { - editor.onColumnRemove(column); + if (column.isHeader) { + var me = this, + editor = me.getEditor(); + + if (editor && editor.onColumnRemove) { + editor.onColumnRemove(column); + } + me.removeFieldAccessors(column); } - me.removeFieldAccessors(column); }, onColumnResize: function(ct, column, width) { - var me = this, - editor = me.getEditor(); - - if (editor && editor.onColumnResize) { - editor.onColumnResize(column, width); + if (column.isHeader) { + var me = this, + editor = me.getEditor(); + + if (editor && editor.onColumnResize) { + editor.onColumnResize(column, width); + } } }, onColumnHide: function(ct, column) { + var me = this, editor = me.getEditor(); @@ -79766,6 +81198,7 @@ Ext.define('Ext.grid.plugin.RowEditing', { onColumnShow: function(ct, column) { + var me = this, editor = me.getEditor(); @@ -79776,6 +81209,7 @@ Ext.define('Ext.grid.plugin.RowEditing', { onColumnMove: function(ct, column, fromIdx, toIdx) { + var me = this, editor = me.getEditor(); @@ -79796,6 +81230,8 @@ Ext.define('Ext.grid.property.Grid', { extend: 'Ext.grid.Panel', + alias: 'widget.propertygrid', + alternateClassName: 'Ext.grid.PropertyGrid', uses: [ @@ -79826,6 +81262,8 @@ Ext.define('Ext.grid.property.Grid', { nameField: 'name', + + enableColumnMove: false, columnLines: true, stripeRows: false, @@ -79847,7 +81285,7 @@ Ext.define('Ext.grid.property.Grid', { startEdit: function(record, column) { - Ext.grid.plugin.CellEditing.prototype.startEdit.call(this, record, me.headerCt.child('#' + me.valueField)); + return this.self.prototype.startEdit.call(this, record, me.headerCt.child('#' + me.valueField)); } })); @@ -79856,8 +81294,8 @@ Ext.define('Ext.grid.property.Grid', { onCellSelect: function(position) { if (position.column != 1) { position.column = 1; - Ext.selection.CellModel.prototype.onCellSelect.call(this, position); } + return this.self.prototype.onCellSelect.call(this, position); } }; me.customRenderers = me.customRenderers || {}; @@ -79894,7 +81332,7 @@ Ext.define('Ext.grid.property.Grid', { }; - this.store.on('update', me.onUpdate, me); + me.store.on('update', me.onUpdate, me); }, @@ -79905,12 +81343,12 @@ Ext.define('Ext.grid.property.Grid', { if (operation == Ext.data.Model.EDIT) { v = record.get(me.valueField); oldValue = record.modified.value; - if (me.fireEvent('beforepropertychange', me.source, record.id, v, oldValue) !== false) { + if (me.fireEvent('beforepropertychange', me.source, record.getId(), v, oldValue) !== false) { if (me.source) { - me.source[record.id] = v; + me.source[record.getId()] = v; } record.commit(); - me.fireEvent('propertychange', me.source, record.id, v, oldValue); + me.fireEvent('propertychange', me.source, record.getId(), v, oldValue); } else { record.reject(); } @@ -79924,7 +81362,7 @@ Ext.define('Ext.grid.property.Grid', { } else if (direction == 'right') { direction = 'down'; } - var pos = Ext.view.Table.prototype.walkCells.call(this, pos, direction, e, preventWrap, verifierFn, scope); + pos = Ext.view.Table.prototype.walkCells.call(this, pos, direction, e, preventWrap, verifierFn, scope); if (!pos.column) { pos.column = 1; } @@ -79935,7 +81373,7 @@ Ext.define('Ext.grid.property.Grid', { getCellEditor : function(record, column) { var me = this, - propName = record.get(me.nameField), + propName = record.get(me.nameField), val = record.get(me.valueField), editor = me.customEditors[propName]; @@ -79973,7 +81411,9 @@ Ext.define('Ext.grid.property.Grid', { destroyEditors: function (editors) { for (var ed in editors) { - Ext.destroy(editors[ed]); + if (editors.hasOwnProperty(ed)) { + Ext.destroy(editors[ed]); + } } }, @@ -80009,6 +81449,8 @@ Ext.define('Ext.grid.property.HeaderContainer', { extend: 'Ext.grid.header.Container', alternateClassName: 'Ext.grid.PropertyColumnModel', + + nameWidth: 115, nameText : 'Name', @@ -80019,27 +81461,27 @@ Ext.define('Ext.grid.property.HeaderContainer', { nameColumnCls: Ext.baseCSSPrefix + 'grid-property-name', + constructor : function(grid, store) { - - this.grid = grid; - this.store = store; - this.callParent([{ + var me = this; + + me.grid = grid; + me.store = store; + me.callParent([{ items: [{ - header: this.nameText, - width: 115, + header: me.nameText, + width: grid.nameColumnWidth || me.nameWidth, sortable: true, dataIndex: grid.nameField, - renderer: Ext.Function.bind(this.renderProp, this), + renderer: Ext.Function.bind(me.renderProp, me), itemId: grid.nameField, menuDisabled :true, - tdCls: this.nameColumnCls + tdCls: me.nameColumnCls }, { - header: this.valueText, - renderer: Ext.Function.bind(this.renderCell, this), - getEditor: function(record) { - return grid.getCellEditor(record, this); - }, + header: me.valueText, + renderer: Ext.Function.bind(me.renderCell, me), + getEditor: Ext.Function.bind(me.getCellEditor, me), flex: 1, fixed: true, dataIndex: grid.valueField, @@ -80048,6 +81490,10 @@ Ext.define('Ext.grid.property.HeaderContainer', { }] }]); }, + + getCellEditor: function(record){ + return this.grid.getCellEditor(record, this); + }, @@ -80059,16 +81505,16 @@ Ext.define('Ext.grid.property.HeaderContainer', { renderCell : function(val, meta, rec) { var me = this, - renderer = this.grid.customRenderers[rec.get(me.grid.nameField)], + renderer = me.grid.customRenderers[rec.get(me.grid.nameField)], result = val; if (renderer) { - return renderer.apply(this, arguments); + return renderer.apply(me, arguments); } if (Ext.isDate(val)) { - result = this.renderDate(val); + result = me.renderDate(val); } else if (Ext.isBoolean(val)) { - result = this.renderBool(val); + result = me.renderBool(val); } return Ext.util.Format.htmlEncode(result); }, @@ -80111,13 +81557,16 @@ Ext.define('Ext.grid.property.Store', { uses: ['Ext.data.reader.Reader', 'Ext.data.proxy.Proxy', 'Ext.data.ResultSet', 'Ext.grid.property.Property'], + constructor : function(grid, source){ - this.grid = grid; - this.source = source; - this.callParent([{ + var me = this; + + me.grid = grid; + me.source = source; + me.callParent([{ data: source, model: Ext.grid.property.Property, - proxy: this.getProxy() + proxy: me.getProxy() }]); }, @@ -80146,18 +81595,21 @@ Ext.define('Ext.grid.property.Store', { readRecords: function(dataObject) { var val, + propName, result = { records: [], success: true }; - for (var propName in dataObject) { - val = dataObject[propName]; - if (dataObject.hasOwnProperty(propName) && this.isEditableValue(val)) { - result.records.push(new Ext.grid.property.Property({ - name: propName, - value: val - }, propName)); + for (propName in dataObject) { + if (dataObject.hasOwnProperty(propName)) { + val = dataObject[propName]; + if (this.isEditableValue(val)) { + result.records.push(new Ext.grid.property.Property({ + name: propName, + value: val + }, propName)); + } } } result.total = result.count = result.records.length; @@ -80188,35 +81640,37 @@ Ext.define('Ext.grid.property.Store', { getProperty : function(row) { - return Ext.isNumber(row) ? this.store.getAt(row) : this.store.getById(row); + return Ext.isNumber(row) ? this.getAt(row) : this.getById(row); }, setValue : function(prop, value, create){ - var r = this.getRec(prop); - if (r) { - r.set('value', value); - this.source[prop] = value; + var me = this, + rec = me.getRec(prop); + + if (rec) { + rec.set('value', value); + me.source[prop] = value; } else if (create) { - this.source[prop] = value; - r = new Ext.grid.property.Property({name: prop, value: value}, prop); - this.store.add(r); + me.source[prop] = value; + rec = new Ext.grid.property.Property({name: prop, value: value}, prop); + me.add(rec); } }, remove : function(prop) { - var r = this.getRec(prop); - if(r) { - this.store.remove(r); + var rec = this.getRec(prop); + if (rec) { + this.callParent([rec]); delete this.source[prop]; } }, getRec : function(prop) { - return this.store.getById(prop); + return this.getById(prop); }, @@ -80428,7 +81882,7 @@ Ext.define('Ext.layout.container.Accordion', { extend: 'Ext.layout.container.VBox', alias: ['layout.accordion'], alternateClassName: 'Ext.layout.AccordionLayout', - + align: 'stretch', @@ -80470,7 +81924,7 @@ Ext.define('Ext.layout.container.Accordion', { me.callParent(arguments); if (me.fill) { - if (!me.owner.el.dom.style.height) { + if (!me.owner.el.dom.style.height || !me.getLayoutTargetSize().height) { return false; } } else { @@ -80509,7 +81963,6 @@ Ext.define('Ext.layout.container.Accordion', { delete comp.hideHeader; comp.collapsible = true; comp.title = comp.title || ' '; - comp.setBorder(false); comp.width = targetSize.width; @@ -80522,12 +81975,19 @@ Ext.define('Ext.layout.container.Accordion', { comp.collapsed = true; } - else if (comp.collapsed === false) { + else if (comp.hasOwnProperty('collapsed') && comp.collapsed === false) { comp.flex = 1; me.expandedItem = i; } else { comp.collapsed = true; } + + me.owner.mon(comp, { + show: me.onComponentShow, + beforeexpand: me.onComponentExpand, + beforecollapse: me.onComponentCollapse, + scope: me + }); } else { delete comp.flex; comp.animCollapse = me.initialAnimate; @@ -80546,10 +82006,10 @@ Ext.define('Ext.layout.container.Accordion', { comp.flex = 1; } } - + me.callParent(arguments); - + ln = renderedPanels.length; for (i = 0; i < ln; i++) { @@ -80560,24 +82020,13 @@ Ext.define('Ext.layout.container.Accordion', { comp.header.addCls(Ext.baseCSSPrefix + 'accordion-hd'); comp.body.addCls(Ext.baseCSSPrefix + 'accordion-body'); - - - if (me.fill) { - me.owner.mon(comp, { - show: me.onComponentShow, - beforeexpand: me.onComponentExpand, - beforecollapse: me.onComponentCollapse, - scope: me - }); - } } }, onLayout: function() { var me = this; - - me.updatePanelClasses(); - + + if (me.fill) { me.callParent(arguments); } else { @@ -80595,24 +82044,27 @@ Ext.define('Ext.layout.container.Accordion', { } } } - + me.updatePanelClasses(); + return me; }, - + updatePanelClasses: function() { var children = this.getLayoutItems(), ln = children.length, siblingCollapsed = true, i, child; - + for (i = 0; i < ln; i++) { child = children[i]; - if (!siblingCollapsed) { - child.header.addCls(Ext.baseCSSPrefix + 'accordion-hd-sibling-expanded'); + + if (siblingCollapsed) { + child.header.removeCls(Ext.baseCSSPrefix + 'accordion-hd-sibling-expanded'); } else { - child.header.removeCls(Ext.baseCSSPrefix + 'accordion-hd-sibling-expanded'); + child.header.addCls(Ext.baseCSSPrefix + 'accordion-hd-sibling-expanded'); } + if (i + 1 == ln && child.collapsed) { child.header.addCls(Ext.baseCSSPrefix + 'accordion-hd-last-collapsed'); } @@ -80641,7 +82093,7 @@ Ext.define('Ext.layout.container.Accordion', { me.setCollapsed(comp); } } - + me.animate = me.initialAnimate; me.layout(); me.animate = false; @@ -80663,7 +82115,7 @@ Ext.define('Ext.layout.container.Accordion', { if (expanded.length === 1 && expanded[0] === comp) { me.setExpanded(toExpand); } - + me.animate = me.initialAnimate; me.layout(); me.animate = false; @@ -80714,7 +82166,7 @@ Ext.define('Ext.layout.container.Accordion', { for (; i < len; i++) { - otherDocks[i].hidden = false; + otherDocks[i].show(); } @@ -80747,7 +82199,7 @@ Ext.define('Ext.resizer.Splitter', { ], baseCls: Ext.baseCSSPrefix + 'splitter', - collapsedCls: Ext.baseCSSPrefix + 'splitter-collapsed', + collapsedClsInternal: Ext.baseCSSPrefix + 'splitter-collapsed', collapsible: false, @@ -80762,6 +82214,8 @@ Ext.define('Ext.resizer.Splitter', { defaultSplitMax: 1000, + + width: 5, height: 5, @@ -80806,6 +82260,9 @@ Ext.define('Ext.resizer.Splitter', { me.tracker = Ext.create('Ext.resizer.SplitterTracker', { el: me.el }); + + + me.relayEvents(me.tracker, [ 'beforedragstart', 'dragstart', 'dragend' ]); }, getCollapseDirection: function() { @@ -80832,15 +82289,17 @@ Ext.define('Ext.resizer.Splitter', { }, getCollapseTarget: function() { - return this.collapseTarget.isComponent ? this.collapseTarget : this.collapseTarget == 'prev' ? this.previousSibling() : this.nextSibling(); + var me = this; + + return me.collapseTarget.isComponent ? me.collapseTarget : me.collapseTarget == 'prev' ? me.previousSibling() : me.nextSibling(); }, onTargetCollapse: function(target) { - this.el.addCls(this.collapsedCls); + this.el.addCls([this.collapsedClsInternal, this.collapsedCls]); }, onTargetExpand: function(target) { - this.el.removeCls(this.collapsedCls); + this.el.removeCls([this.collapsedClsInternal, this.collapsedCls]); }, toggleTargetCmp: function(e, t) { @@ -80881,8 +82340,6 @@ Ext.define('Ext.layout.container.Border', { bindToOwnerCtContainer: true, - fixedLayout: false, - percentageRe: /(\d+)%/, slideDirection: { @@ -80904,6 +82361,7 @@ Ext.define('Ext.layout.container.Border', { } + me.fixHeightConstraints(); me.shadowLayout.onLayout(); if (me.embeddedContainer) { me.embeddedContainer.layout.onLayout(); @@ -80940,11 +82398,14 @@ Ext.define('Ext.layout.container.Border', { }, renderItems: function(items, target) { - Ext.Error.raise('This should not be called'); }, renderItem: function(item) { - Ext.Error.raise('This should not be called'); + }, + + + getVisibleItems: function() { + return Ext.ComponentQuery.query(':not([slideOutAnim])', this.callParent(arguments)); }, initializeBorderLayout: function() { @@ -80983,9 +82444,6 @@ Ext.define('Ext.layout.container.Border', { me.setupState(comp); } } - if (!regions.center) { - Ext.Error.raise("You must specify a center region when defining a BorderLayout."); - } comp = regions.center; if (!comp.flex) { comp.flex = 1; @@ -81035,7 +82493,8 @@ Ext.define('Ext.layout.container.Border', { maintainFlex: true, layout: { type: 'hbox', - align: 'stretch' + align: 'stretch', + getVisibleItems: me.getVisibleItems } })); hBoxItems.push(regions.center); @@ -81089,7 +82548,8 @@ Ext.define('Ext.layout.container.Border', { el: me.getTarget(), layout: Ext.applyIf({ type: 'vbox', - align: 'stretch' + align: 'stretch', + getVisibleItems: me.getVisibleItems }, me.initialConfig) }); me.createItems(me.shadowContainer, vBoxItems); @@ -81116,6 +82576,17 @@ Ext.define('Ext.layout.container.Border', { } + + + + + Ext.each([me.splitters.north, me.splitters.south], function (splitter) { + if (splitter) { + splitter.on('beforedragstart', me.fixHeightConstraints, me); + } + }); + + if (horizontalFlex) { regions.center.flex -= horizontalFlex; } @@ -81173,7 +82644,6 @@ Ext.define('Ext.layout.container.Border', { me.borderLayoutInitialized = true; }, - setupState: function(comp){ var getState = comp.getState; comp.getState = function(){ @@ -81223,6 +82693,7 @@ Ext.define('Ext.layout.container.Border', { if (comp.collapseMode == 'mini') { comp.placeholder = resizer; + resizer.collapsedCls = comp.collapsedCls; } @@ -81235,6 +82706,30 @@ Ext.define('Ext.layout.container.Border', { }, + + fixHeightConstraints: function () { + var me = this, + ct = me.embeddedContainer, + maxHeight = 1e99, minHeight = -1; + + if (!ct) { + return; + } + + ct.items.each(function (item) { + if (Ext.isNumber(item.maxHeight)) { + maxHeight = Math.max(maxHeight, item.maxHeight); + } + if (Ext.isNumber(item.minHeight)) { + minHeight = Math.max(minHeight, item.minHeight); + } + }); + + ct.maxHeight = maxHeight; + ct.minHeight = minHeight; + }, + + onRegionVisibilityChange: function(comp){ this.splitters[comp.region][comp.hidden ? 'hide' : 'show'](); this.layout(); @@ -81292,7 +82787,7 @@ Ext.define('Ext.layout.container.Border', { baseCls: comp.baseCls + '-header', ui: comp.ui, indicateDrag: comp.draggable, - cls: Ext.baseCSSPrefix + 'region-collapsed-placeholder ' + Ext.baseCSSPrefix + 'region-collapsed-' + comp.collapseDirection + '-placeholder', + cls: Ext.baseCSSPrefix + 'region-collapsed-placeholder ' + Ext.baseCSSPrefix + 'region-collapsed-' + comp.collapseDirection + '-placeholder ' + comp.collapsedCls, listeners: comp.floatable ? { click: { fn: function(e) { @@ -81306,13 +82801,15 @@ Ext.define('Ext.layout.container.Border', { if ((Ext.isIE6 || Ext.isIE7 || (Ext.isIEQuirks)) && !horiz) { placeholder.width = 25; } - placeholder[horiz ? 'tools' : 'items'] = [{ - xtype: 'tool', - client: comp, - type: 'expand-' + oppositeDirection, - handler: me.onPlaceHolderToolClick, - scope: me - }]; + if (!comp.hideCollapseTool) { + placeholder[horiz ? 'tools' : 'items'] = [{ + xtype: 'tool', + client: comp, + type: 'expand-' + oppositeDirection, + handler: me.onPlaceHolderToolClick, + scope: me + }]; + } } placeholder = me.owner.createComponent(placeholder); if (comp.isXType('panel')) { @@ -81356,12 +82853,11 @@ Ext.define('Ext.layout.container.Border', { onBeforeRegionCollapse: function(comp, direction, animate) { var me = this, compEl = comp.el, + width, miniCollapse = comp.collapseMode == 'mini', shadowContainer = comp.shadowOwnerCt, shadowLayout = shadowContainer.layout, placeholder = comp.placeholder, - placeholderBox, - targetSize = shadowLayout.getLayoutTargetSize(), sl = me.owner.suspendLayout, scsl = shadowContainer.suspendLayout, isNorthOrWest = (comp.region == 'north' || comp.region == 'west'); @@ -81404,11 +82900,21 @@ Ext.define('Ext.layout.container.Border', { if (!placeholder.rendered) { shadowLayout.renderItem(placeholder, shadowLayout.innerCt); + + + + + + + if (comp.region == 'north' || comp.region == 'south') { + placeholder.setCalculatedSize(comp.getWidth()); + } else { + placeholder.setCalculatedSize(undefined, comp.getHeight()); + } } function afterCollapse() { - me.owner.suspendLayout = sl; shadowContainer.suspendLayout = scsl; @@ -81456,11 +82962,6 @@ Ext.define('Ext.layout.container.Border', { compEl.setLeftTop(-10000, -10000); shadowLayout.layout(); afterCollapse(); - - - if (Ext.isIE) { - placeholder.setCalculatedSize(placeholder.el.getWidth()); - } } return false; @@ -81783,15 +83284,13 @@ Ext.define('Ext.layout.container.Card', { + setActiveItem: function(newCard) { var me = this, owner = me.owner, oldCard = me.activeItem, newIndex; - - me.layoutBusy = true; - newCard = me.parseActiveItem(newCard); newIndex = owner.items.indexOf(newCard); @@ -81813,22 +83312,22 @@ Ext.define('Ext.layout.container.Card', { if (newCard.fireEvent('beforeactivate', newCard, oldCard) === false) { - me.layoutBusy = false; return false; } if (oldCard && oldCard.fireEvent('beforedeactivate', oldCard, newCard) === false) { - me.layoutBusy = false; return false; } - if (!me.sizeAllCards) { - me.setItemBox(newCard, me.getTargetBox()); - } - else { + if (me.sizeAllCards) { me.onLayout(); } + else { + me.setItemBox(newCard, me.getTargetBox()); + } + + me.owner.suspendLayout = true; if (oldCard) { if (me.hideInactive) { @@ -81838,26 +83337,29 @@ Ext.define('Ext.layout.container.Card', { } + me.owner.suspendLayout = false; if (newCard.hidden) { newCard.show(); + } else { + me.onLayout(); } newCard.fireEvent('activate', newCard, oldCard); - me.layoutBusy = false; - - if (!me.sizeAllCards) { - if (!owner.componentLayout.layoutBusy) { - me.onLayout(); - } - } return newCard; } - - me.layoutBusy = false; return false; - } -}); + }, + + configureItem: function(item) { + + + + item.layoutManagedHeight = 0; + item.layoutManagedWidth = 0; + + this.callParent(arguments); + }}); Ext.define('Ext.layout.container.Column', { @@ -81974,6 +83476,16 @@ Ext.define('Ext.layout.container.Column', { } } delete me.adjustmentPass; + }, + + configureItem: function(item) { + if (item.columnWidth) { + item.layoutManagedWidth = 1; + } else { + item.layoutManagedWidth = 2; + } + item.layoutManagedHeight = 2; + this.callParent(arguments); } }); @@ -82009,6 +83521,10 @@ Ext.define('Ext.layout.container.Table', { tableAttrs:null, + + + + renderItems: function(items) { var tbody = this.getTable().tBodies[0], rows = tbody.rows, @@ -82032,6 +83548,9 @@ Ext.define('Ext.layout.container.Table', { trEl = rows[rowIdx]; if (!trEl) { trEl = tbody.insertRow(rowIdx); + if (this.trAttrs) { + trEl.set(this.trAttrs); + } } @@ -82050,6 +83569,9 @@ Ext.define('Ext.layout.container.Table', { } + if (this.tdAttrs) { + tdEl.set(this.tdAttrs); + } tdEl.set({ colSpan: item.colspan || 1, rowSpan: item.rowspan || 1, @@ -82125,9 +83647,11 @@ Ext.define('Ext.layout.container.Table', { }); - rowspans[colIdx] = item.rowspan || 1; - colIdx += item.colspan || 1; - cellIdx++; + for (j = item.colspan || 1; j; --j) { + rowspans[colIdx] = item.rowspan || 1; + ++colIdx; + } + ++cellIdx; } return cells; @@ -82161,53 +83685,53 @@ Ext.define('Ext.menu.Item', { extend: 'Ext.Component', alias: 'widget.menuitem', alternateClassName: 'Ext.menu.TextItem', - + activeCls: Ext.baseCSSPrefix + 'menu-item-active', - + ariaRole: 'menuitem', - + canActivate: true, - + clickHideDelay: 1, - + destroyMenu: true, - + disabledCls: Ext.baseCSSPrefix + 'menu-item-disabled', + - - + - + hideOnClick: true, + + - - - + isMenuItem: true, + - - + menuAlign: 'tl-tr?', - + menuExpandDelay: 200, - + menuHideDelay: 200, + - - + renderTpl: [ '', '{text}', @@ -82222,14 +83746,14 @@ Ext.define('Ext.menu.Item', { '', '' ], - + maskOnDisable: false, + - - + activate: function() { var me = this; - + if (!me.activated && me.canActivate && me.rendered && !me.isDisabled() && me.isVisible()) { me.el.addCls(me.activeCls); me.focus(); @@ -82237,15 +83761,15 @@ Ext.define('Ext.menu.Item', { me.fireEvent('activate', me); } }, - + blur: function() { this.$focused = false; this.callParent(arguments); }, - + deactivate: function() { var me = this; - + if (me.activated) { me.el.removeCls(me.activeCls); me.blur(); @@ -82254,10 +83778,10 @@ Ext.define('Ext.menu.Item', { me.fireEvent('deactivate', me); } }, - + deferExpandMenu: function() { var me = this; - + if (!me.menu.rendered || !me.menu.isVisible()) { me.parentMenu.activeChild = me.menu; me.menu.parentItem = me; @@ -82265,20 +83789,20 @@ Ext.define('Ext.menu.Item', { me.menu.showBy(me, me.menuAlign); } }, - + deferHideMenu: function() { if (this.menu.isVisible()) { this.menu.hide(); } }, - + deferHideParentMenus: function() { Ext.menu.Manager.hideAll(); }, - + expandMenu: function(delay) { var me = this; - + if (me.menu) { clearTimeout(me.hideMenuTimer); if (delay === 0) { @@ -82288,95 +83812,95 @@ Ext.define('Ext.menu.Item', { } } }, - + focus: function() { this.$focused = true; this.callParent(arguments); }, - + getRefItems: function(deep){ var menu = this.menu, items; - + if (menu) { items = menu.getRefItems(deep); items.unshift(menu); - } - return items || []; + } + return items || []; }, - + hideMenu: function(delay) { var me = this; - + if (me.menu) { clearTimeout(me.expandMenuTimer); me.hideMenuTimer = Ext.defer(me.deferHideMenu, Ext.isNumber(delay) ? delay : me.menuHideDelay, me); } }, - + initComponent: function() { var me = this, prefix = Ext.baseCSSPrefix, cls = [prefix + 'menu-item']; - + me.addEvents( 'activate', - + 'click', - + 'deactivate' ); - + if (me.plain) { cls.push(prefix + 'menu-item-plain'); } - + if (me.cls) { cls.push(me.cls); } - + me.cls = cls.join(' '); - + if (me.menu) { me.menu = Ext.menu.Manager.get(me.menu); } - + me.callParent(arguments); }, - + onClick: function(e) { var me = this; - + if (!me.href) { e.stopEvent(); } - + if (me.disabled) { return; } - + if (me.hideOnClick) { me.deferHideParentMenusTimer = Ext.defer(me.deferHideParentMenus, me.clickHideDelay, me); } - + Ext.callback(me.handler, me.scope || me, [me, e]); me.fireEvent('click', me, e); - + if (!me.hideOnClick) { me.focus(); } }, - + onDestroy: function() { var me = this; - + clearTimeout(me.expandMenuTimer); clearTimeout(me.hideMenuTimer); clearTimeout(me.deferHideParentMenusTimer); - + if (me.menu) { delete me.menu.parentItem; delete me.menu.parentMenu; @@ -82387,80 +83911,70 @@ Ext.define('Ext.menu.Item', { } me.callParent(arguments); }, - + onRender: function(ct, pos) { var me = this, prefix = '.' + Ext.baseCSSPrefix; - + Ext.applyIf(me.renderData, { href: me.href || '#', hrefTarget: me.hrefTarget, icon: me.icon || Ext.BLANK_IMAGE_URL, - iconCls: me.iconCls, + iconCls: me.iconCls + (me.checkChangeDisabled ? ' ' + me.disabledCls : ''), menu: Ext.isDefined(me.menu), plain: me.plain, text: me.text }); - + Ext.applyIf(me.renderSelectors, { itemEl: prefix + 'menu-item-link', iconEl: prefix + 'menu-item-icon', textEl: prefix + 'menu-item-text', arrowEl: prefix + 'menu-item-arrow' }); - + me.callParent(arguments); }, - + setHandler: function(fn, scope) { this.handler = fn || null; this.scope = scope; }, - + setIconCls: function(iconCls) { var me = this; - + if (me.iconEl) { if (me.iconCls) { me.iconEl.removeCls(me.iconCls); } - + if (iconCls) { me.iconEl.addCls(iconCls); } } - + me.iconCls = iconCls; }, - + setText: function(text) { var me = this, - el = me.textEl || me.el, - newWidth; - - if (text && el) { - el.update(text); - - if (me.textEl) { - - newWidth = me.textEl.getWidth() + me.iconEl.getWidth() + 25 + (me.arrowEl ? me.arrowEl.getWidth() : 0); - if (newWidth > me.itemEl.getWidth()) { - me.parentMenu.setWidth(newWidth); - } - } - } else if (el) { - el.update(''); - } - + el = me.textEl || me.el; + me.text = text; + + if (me.rendered) { + el.update(text || ''); + + me.ownerCt.redoComponentLayout(); + } } }); - Ext.define('Ext.menu.CheckItem', { extend: 'Ext.menu.Item', alias: 'widget.menucheckitem', @@ -82510,7 +84024,9 @@ Ext.define('Ext.menu.CheckItem', { disableCheckChange: function() { var me = this; - me.iconEl.addCls(me.disabledCls); + if (me.iconEl) { + me.iconEl.addCls(me.disabledCls); + } me.checkChangeDisabled = true; }, @@ -82767,11 +84283,13 @@ Ext.define('Ext.menu.Menu', { floating: true, - constrain: false, + constrain: true, hidden: true, + hideMode: 'visibility', + ignoreParentClicks: false, @@ -82789,7 +84307,9 @@ Ext.define('Ext.menu.Menu', { initComponent: function() { var me = this, - prefix = Ext.baseCSSPrefix; + prefix = Ext.baseCSSPrefix, + cls = [prefix + 'menu'], + bodyCls = me.bodyCls ? [me.bodyCls] : []; me.addEvents( @@ -82808,14 +84328,12 @@ Ext.define('Ext.menu.Menu', { Ext.menu.Manager.register(me); - var cls = [prefix + 'menu']; if (me.plain) { cls.push(prefix + 'menu-plain'); } me.cls = cls.join(' '); - var bodyCls = me.bodyCls ? [me.bodyCls] : []; bodyCls.unshift(prefix + 'menu-body'); me.bodyCls = bodyCls.join(' '); @@ -82941,6 +84459,47 @@ Ext.define('Ext.menu.Menu', { } }, + clearStretch: function () { + + + if (this.rendered) { + this.items.each(function (item) { + + if (item.componentLayout) { + delete item.componentLayout.lastComponentSize; + } + if (item.el) { + item.el.setWidth(null); + } + }); + } + }, + + onAdd: function () { + var me = this; + + me.clearStretch(); + me.callParent(arguments); + + if (Ext.isIE6 || Ext.isIE7) { + + Ext.Function.defer(me.doComponentLayout, 10, me); + } + }, + + onRemove: function () { + this.clearStretch(); + this.callParent(arguments); + + }, + + redoComponentLayout: function () { + if (this.rendered) { + this.clearStretch(); + this.doComponentLayout(); + } + }, + getFocusEl: function() { return this.focusEl; @@ -82976,7 +84535,9 @@ Ext.define('Ext.menu.Menu', { lookupItemFromObject: function(cmp) { var me = this, - prefix = Ext.baseCSSPrefix; + prefix = Ext.baseCSSPrefix, + cls, + intercept; if (!cmp.isComponent) { if (!cmp.xtype) { @@ -82991,11 +84552,8 @@ Ext.define('Ext.menu.Menu', { } if (!cmp.isMenuItem && !cmp.dock) { - var cls = [ - prefix + 'menu-item', - prefix + 'menu-item-cmp' - ], - intercept = Ext.Function.createInterceptor; + cls = [prefix + 'menu-item', prefix + 'menu-item-cmp']; + intercept = Ext.Function.createInterceptor; cmp.focus = intercept(cmp.focus, function() { @@ -83131,32 +84689,44 @@ Ext.define('Ext.menu.Menu', { showBy: function(cmp, pos, off) { - var me = this; + var me = this, + xy, + region; if (me.floating && cmp) { me.layout.autoSize = true; - me.show(); + + + me.doAutoRender(); cmp = cmp.el || cmp; - var xy = me.el.getAlignToXY(cmp, pos || me.defaultAlign, off); + xy = me.el.getAlignToXY(cmp, pos || me.defaultAlign, off); if (me.floatParent) { - var r = me.floatParent.getTargetEl().getViewRegion(); - xy[0] -= r.x; - xy[1] -= r.y; + region = me.floatParent.getTargetEl().getViewRegion(); + xy[0] -= region.x; + xy[1] -= region.y; } me.showAt(xy); - me.doConstrain(); } return me; }, + + + showAt: function(){ + this.callParent(arguments); + if (this.floating) { + this.doConstrain(); + } + }, doConstrain : function() { var me = this, - y = this.el.getY(), + y = me.el.getY(), max, full, + vector, returnY = y, normalY, parentEl, scrollTop, viewHeight; delete me.height; @@ -83192,6 +84762,10 @@ Ext.define('Ext.menu.Menu', { me.iconSepEl.setHeight(me.layout.getRenderTarget().dom.scrollHeight); } } + vector = me.getConstrainVector(me.el.dom.parentNode); + if (vector) { + me.setPosition(me.getPosition()[0] + vector[0]); + } me.el.setY(returnY); } }); @@ -83279,6 +84853,8 @@ Ext.define('Ext.menu.Menu', { Ext.apply(me, { showSeparator: false, plain: true, + border: false, + bodyPadding: 0, items: Ext.applyIf({ cls: Ext.baseCSSPrefix + 'menu-date-item', id: me.pickerId, @@ -83332,37 +84908,6 @@ Ext.define('Ext.panel.Tool', { 'click' ); - var types = [ - 'close', - 'collapse', - 'down', - 'expand', - 'gear', - 'help', - 'left', - 'maximize', - 'minimize', - 'minus', - 'move', - 'next', - 'pin', - 'plus', - 'prev', - 'print', - 'refresh', - 'resize', - 'restore', - 'right', - 'save', - 'search', - 'toggle', - 'unpin', - 'up' - ]; - - if (me.id && Ext.Array.indexOf(types, me.id) > -1) { - Ext.global.console.warn('When specifying a tool you should use the type option, the id can conflict now that tool is a Component'); - } me.type = me.type || me.id; @@ -83516,6 +85061,12 @@ Ext.define('Ext.resizer.Resizer', { width : null, + heightIncrement : 0, + + + widthIncrement : 0, + + minHeight : 20, @@ -83650,6 +85201,8 @@ Ext.define('Ext.resizer.Resizer', { delegate: '.' + me.handleCls, dynamic: me.dynamic, preserveRatio: me.preserveRatio, + heightIncrement: me.heightIncrement, + widthIncrement: me.widthIncrement, minHeight: me.minHeight, maxHeight: me.maxHeight, minWidth: me.minWidth, @@ -83769,11 +85322,11 @@ Ext.define('Ext.resizer.Resizer', { var me = this, handle; if (Ext.isIE6) { - handle = me.east; + handle = me.east; if (handle) { handle.setHeight(me.el.getHeight()); } - handle = me.west; + handle = me.west; if (handle) { handle.setHeight(me.el.getHeight()); } @@ -83881,6 +85434,8 @@ Ext.define('Ext.resizer.ResizeTracker', { ratio, widthAdjust = 0, heightAdjust = 0, + snappedWidth, + snappedHeight, adjustX = 0, adjustY = 0, dragRatio, @@ -83946,15 +85501,48 @@ Ext.define('Ext.resizer.ResizeTracker', { }; + snappedWidth = Ext.Number.snap(newBox.width, me.widthIncrement); + snappedHeight = Ext.Number.snap(newBox.height, me.heightIncrement); + if (snappedWidth != newBox.width || snappedHeight != newBox.height){ + switch (region) { + case 'northeast': + newBox.y -= snappedHeight - newBox.height; + break; + case 'north': + newBox.y -= snappedHeight - newBox.height; + break; + case 'southwest': + newBox.x -= snappedWidth - newBox.width; + break; + case 'west': + newBox.x -= snappedWidth - newBox.width; + break; + case 'northwest': + newBox.x -= snappedWidth - newBox.width; + newBox.y -= snappedHeight - newBox.height; + } + newBox.width = snappedWidth; + newBox.height = snappedHeight; + } + + if (newBox.width < me.minWidth || newBox.width > me.maxWidth) { newBox.width = Ext.Number.constrain(newBox.width, me.minWidth, me.maxWidth); - newBox.x = me.lastX || newBox.x; + + + if (adjustX) { + newBox.x = box.x + (box.width - newBox.width); + } } else { me.lastX = newBox.x; } if (newBox.height < me.minHeight || newBox.height > me.maxHeight) { newBox.height = Ext.Number.constrain(newBox.height, me.minHeight, me.maxHeight); - newBox.y = me.lastY || newBox.y; + + + if (adjustY) { + newBox.y = box.y + (box.height - newBox.height); + } } else { me.lastY = newBox.y; } @@ -84050,6 +85638,8 @@ Ext.define('Ext.resizer.SplitterTracker', { extend: 'Ext.dd.DragTracker', requires: ['Ext.util.Region'], enabled: true, + + overlayCls: Ext.baseCSSPrefix + 'resizable-overlay', getPrevCmp: function() { var splitter = this.getSplitter(); @@ -84064,17 +85654,33 @@ Ext.define('Ext.resizer.SplitterTracker', { onBeforeStart: function(e) { - var prevCmp = this.getPrevCmp(), - nextCmp = this.getNextCmp(); + var me = this, + prevCmp = me.getPrevCmp(), + nextCmp = me.getNextCmp(), + collapseEl = me.getSplitter().collapseEl, + overlay; + + if (collapseEl && (e.getTarget() === me.getSplitter().collapseEl.dom)) { + return false; + } if (nextCmp.collapsed || prevCmp.collapsed) { return false; } - this.prevBox = prevCmp.getEl().getBox(); - this.nextBox = nextCmp.getEl().getBox(); - this.constrainTo = this.calculateConstrainRegion(); + overlay = me.overlay = Ext.getBody().createChild({ + cls: me.overlayCls, + html: ' ' + }); + overlay.unselectable(); + overlay.setSize(Ext.core.Element.getViewWidth(true), Ext.core.Element.getViewHeight(true)); + overlay.show(); + + + me.prevBox = prevCmp.getEl().getBox(); + me.nextBox = nextCmp.getEl().getBox(); + me.constrainTo = me.calculateConstrainRegion(); }, @@ -84085,16 +85691,15 @@ Ext.define('Ext.resizer.SplitterTracker', { calculateConstrainRegion: function() { - var splitter = this.getSplitter(), - topPad = 0, - bottomPad = 0, + var me = this, + splitter = me.getSplitter(), splitWidth = splitter.getWidth(), defaultMin = splitter.defaultSplitMin, orient = splitter.orientation, - prevBox = this.prevBox, - prevCmp = this.getPrevCmp(), - nextBox = this.nextBox, - nextCmp = this.getNextCmp(), + prevBox = me.prevBox, + prevCmp = me.getPrevCmp(), + nextBox = me.nextBox, + nextCmp = me.getNextCmp(), @@ -84144,16 +85749,17 @@ Ext.define('Ext.resizer.SplitterTracker', { } - return prevConstrainRegion.intersect(nextConstrainRegion); + return prevConstrainRegion.intersect(nextConstrainRegion); }, performResize: function(e) { - var offset = this.getOffset('dragTarget'), - splitter = this.getSplitter(), + var me = this, + offset = me.getOffset('dragTarget'), + splitter = me.getSplitter(), orient = splitter.orientation, - prevCmp = this.getPrevCmp(), - nextCmp = this.getNextCmp(), + prevCmp = me.getPrevCmp(), + nextCmp = me.getNextCmp(), owner = splitter.ownerCt, layout = owner.getLayout(); @@ -84164,13 +85770,13 @@ Ext.define('Ext.resizer.SplitterTracker', { if (prevCmp) { if (!prevCmp.maintainFlex) { delete prevCmp.flex; - prevCmp.setSize(this.prevBox.width + offset[0], prevCmp.getHeight()); + prevCmp.setSize(me.prevBox.width + offset[0], prevCmp.getHeight()); } } if (nextCmp) { if (!nextCmp.maintainFlex) { delete nextCmp.flex; - nextCmp.setSize(this.nextBox.width - offset[0], nextCmp.getHeight()); + nextCmp.setSize(me.nextBox.width - offset[0], nextCmp.getHeight()); } } @@ -84178,13 +85784,13 @@ Ext.define('Ext.resizer.SplitterTracker', { if (prevCmp) { if (!prevCmp.maintainFlex) { delete prevCmp.flex; - prevCmp.setSize(prevCmp.getWidth(), this.prevBox.height + offset[1]); + prevCmp.setSize(prevCmp.getWidth(), me.prevBox.height + offset[1]); } } if (nextCmp) { if (!nextCmp.maintainFlex) { delete nextCmp.flex; - nextCmp.setSize(prevCmp.getWidth(), this.nextBox.height - offset[1]); + nextCmp.setSize(prevCmp.getWidth(), me.nextBox.height - offset[1]); } } } @@ -84193,24 +85799,41 @@ Ext.define('Ext.resizer.SplitterTracker', { }, + + + endDrag: function () { + var me = this; + + if (me.overlay) { + me.overlay.remove(); + delete me.overlay; + } + + me.callParent(arguments); + }, + + onEnd: function(e) { - var splitter = this.getSplitter(); + var me = this, + splitter = me.getSplitter(); + splitter.removeCls(splitter.baseCls + '-active'); - this.performResize(); + me.performResize(); }, onDrag: function(e) { - var offset = this.getOffset('dragTarget'), - splitter = this.getSplitter(), + var me = this, + offset = me.getOffset('dragTarget'), + splitter = me.getSplitter(), splitEl = splitter.getEl(), orient = splitter.orientation; if (orient === "vertical") { - splitEl.setX(this.startRegion.left + offset[0]); + splitEl.setX(me.startRegion.left + offset[0]); } else { - splitEl.setY(this.startRegion.top + offset[1]); + splitEl.setY(me.startRegion.top + offset[1]); } }, @@ -84411,27 +86034,33 @@ Ext.define('Ext.selection.RowModel', { extend: 'Ext.selection.Model', alias: 'selection.rowmodel', requires: ['Ext.util.KeyNav'], - + deltaScroll: 5, - + enableKeyNav: true, - + constructor: function(){ this.addEvents( - 'deselect', + 'beforedeselect', + + 'beforeselect', + + + 'deselect', + 'select' ); - this.callParent(arguments); + this.callParent(arguments); }, bindComponent: function(view) { var me = this; - + me.views = me.views || []; me.views.push(view); me.bind(view.getStore(), true); @@ -84448,7 +86077,7 @@ Ext.define('Ext.selection.RowModel', { initKeyNav: function(view) { var me = this; - + if (!view.rendered) { view.on('render', Ext.Function.bind(me.initKeyNav, me, [view], 0), me, {single: true}); return; @@ -84496,7 +86125,7 @@ Ext.define('Ext.selection.RowModel', { onKeyEnd: function(e, t) { var me = this, last = me.store.getAt(me.store.getCount() - 1); - + if (last) { if (e.shiftKey) { me.selectRange(last, me.lastFocused || 0); @@ -84513,7 +86142,7 @@ Ext.define('Ext.selection.RowModel', { onKeyHome: function(e, t) { var me = this, first = me.store.getAt(0); - + if (first) { if (e.shiftKey) { me.selectRange(first, me.lastFocused || 0); @@ -84534,7 +86163,7 @@ Ext.define('Ext.selection.RowModel', { prevIdx, prevRecord, currRec; - + if (rowsVisible) { selIdx = me.lastFocused ? me.store.indexOf(me.lastFocused) : 0; prevIdx = selIdx - rowsVisible; @@ -84564,7 +86193,7 @@ Ext.define('Ext.selection.RowModel', { nextIdx, nextRecord, currRec; - + if (rowsVisible) { selIdx = me.lastFocused ? me.store.indexOf(me.lastFocused) : 0; nextIdx = selIdx + rowsVisible; @@ -84594,7 +86223,7 @@ Ext.define('Ext.selection.RowModel', { e.stopEvent(); var me = this, record = me.lastFocused; - + if (record) { if (me.isSelected(record)) { me.doDeselect(record, false); @@ -84613,7 +86242,7 @@ Ext.define('Ext.selection.RowModel', { view = me.views[0], idx = me.store.indexOf(me.lastFocused), record; - + if (idx > 0) { @@ -84652,7 +86281,7 @@ Ext.define('Ext.selection.RowModel', { view = me.views[0], idx = me.store.indexOf(me.lastFocused), record; - + if (idx + 1 < me.store.getCount()) { @@ -84678,21 +86307,21 @@ Ext.define('Ext.selection.RowModel', { } } }, - + scrollByDeltaX: function(delta) { var view = this.views[0], section = view.up(), hScroll = section.horizontalScroller; - + if (hScroll) { hScroll.scrollByDeltaX(delta); } }, - + onKeyLeft: function(e, t) { this.scrollByDeltaX(-this.deltaScroll); }, - + onKeyRight: function(e, t) { this.scrollByDeltaX(this.deltaScroll); }, @@ -84706,26 +86335,29 @@ Ext.define('Ext.selection.RowModel', { - onSelectChange: function(record, isSelected, suppressEvent) { + onSelectChange: function(record, isSelected, suppressEvent, commitFn) { var me = this, views = me.views, viewsLn = views.length, store = me.store, rowIdx = store.indexOf(record), + eventName = isSelected ? 'select' : 'deselect', i = 0; - - for (; i < viewsLn; i++) { - if (isSelected) { - views[i].onRowSelect(rowIdx, suppressEvent); - if (!suppressEvent) { - me.fireEvent('select', me, record, rowIdx); - } - } else { - views[i].onRowDeselect(rowIdx, suppressEvent); - if (!suppressEvent) { - me.fireEvent('deselect', me, record, rowIdx); + + if ((suppressEvent || me.fireEvent('before' + eventName, me, record, rowIdx)) !== false && + commitFn() !== false) { + + for (; i < viewsLn; i++) { + if (isSelected) { + views[i].onRowSelect(rowIdx, suppressEvent); + } else { + views[i].onRowDeselect(rowIdx, suppressEvent); } } + + if (!suppressEvent) { + me.fireEvent(eventName, me, record, rowIdx); + } } }, @@ -84737,7 +86369,7 @@ Ext.define('Ext.selection.RowModel', { store = this.store, rowIdx, i = 0; - + if (oldFocused) { rowIdx = store.indexOf(oldFocused); if (rowIdx != -1) { @@ -84756,7 +86388,7 @@ Ext.define('Ext.selection.RowModel', { } } }, - + onEditorTab: function(editingPlugin, e) { var me = this, view = me.views[0], @@ -84765,12 +86397,12 @@ Ext.define('Ext.selection.RowModel', { position = view.getPosition(record, header), direction = e.shiftKey ? 'left' : 'right', newPosition = view.walkCells(position, direction, e, this.preventWrap); - + if (newPosition) { editingPlugin.startEditByPosition(newPosition); } }, - + selectByPosition: function(position) { var record = this.store.getAt(position.row); this.select(record); @@ -84778,6 +86410,7 @@ Ext.define('Ext.selection.RowModel', { }); Ext.define('Ext.selection.CheckboxModel', { + alias: 'selection.checkboxmodel', extend: 'Ext.selection.RowModel', @@ -84888,8 +86521,9 @@ Ext.define('Ext.selection.CheckboxModel', { }, - onSelectChange: function(record, isSelected) { - this.callParent([record, isSelected]); + onSelectChange: function() { + this.callParent(arguments); + var hdSelectStatus = this.selected.getCount() === this.store.getCount(); this.toggleUiHeader(hdSelectStatus); @@ -84976,6 +86610,7 @@ Ext.define('Ext.slider.Thumb', { topZIndex: 10000, + constructor: function(config) { var me = this; @@ -85295,7 +86930,7 @@ Ext.define('Ext.slider.Multi', { var me = this, tipPlug, hasTip; - + me.thumbs = []; @@ -85367,7 +87002,7 @@ Ext.define('Ext.slider.Multi', { var thumbs = this.thumbs, ln = thumbs.length, zIndex, thumb, i; - + for (i = 0; i < ln; i++) { thumb = thumbs[i]; @@ -85421,7 +87056,7 @@ Ext.define('Ext.slider.Multi', { initEvents : function() { var me = this; - + me.mon(me.el, { scope : me, mousedown: me.onMouseDown, @@ -85440,7 +87075,7 @@ Ext.define('Ext.slider.Multi', { thumbs = me.thumbs, len = thumbs.length, local; - + if (me.disabled) { return; } @@ -85461,7 +87096,7 @@ Ext.define('Ext.slider.Multi', { onClickChange : function(local) { var me = this, thumb, index; - + if (local.top > me.clickRange[0] && local.top < me.clickRange[1]) { thumb = me.getNearest(local, 'left'); @@ -85507,13 +87142,13 @@ Ext.define('Ext.slider.Multi', { var me = this, k, val; - + if(me.disabled || me.thumbs.length !== 1) { e.preventDefault(); return; } k = e.getKey(); - + switch(k) { case e.UP: case e.RIGHT: @@ -85533,27 +87168,6 @@ Ext.define('Ext.slider.Multi', { }, - doSnap : function(value) { - var newValue = value, - inc = this.increment, - m; - - if (!(inc && value)) { - return value; - } - m = value % inc; - if (m !== 0) { - newValue -= m; - if (m * 2 >= inc) { - newValue += inc; - } else if (m * 2 < -inc) { - newValue -= inc; - } - } - return Ext.Number.constrain(newValue, this.minValue, this.maxValue); - }, - - afterRender : function() { var me = this, i = 0, @@ -85561,7 +87175,7 @@ Ext.define('Ext.slider.Multi', { len = thumbs.length, thumb, v; - + me.callParent(arguments); for (; i < len; i++) { @@ -85589,8 +87203,8 @@ Ext.define('Ext.slider.Multi', { normalizeValue : function(v) { var me = this; - - v = me.doSnap(v); + + v = Ext.Number.snap(v, this.increment, this.minValue, this.maxValue); v = Ext.util.Format.round(v, me.decimalPrecision); v = Ext.Number.constrain(v, me.minValue, me.maxValue); return v; @@ -85603,7 +87217,7 @@ Ext.define('Ext.slider.Multi', { thumbs = me.thumbs, len = thumbs.length, t; - + me.minValue = val; me.inputEl.dom.setAttribute('aria-valuemin', val); @@ -85621,7 +87235,7 @@ Ext.define('Ext.slider.Multi', { thumbs = me.thumbs, len = thumbs.length, t; - + me.maxValue = val; me.inputEl.dom.setAttribute('aria-valuemax', val); @@ -85686,7 +87300,7 @@ Ext.define('Ext.slider.Multi', { thumb, el, xy; - + me.callParent(); for (; i < len; i++) { @@ -85720,7 +87334,7 @@ Ext.define('Ext.slider.Multi', { len = thumbs.length, thumb, el; - + this.callParent(); for (; i < len; i++) { @@ -85793,7 +87407,7 @@ Ext.define('Ext.slider.Multi', { beforeDestroy : function() { var me = this; - + Ext.destroyMembers(me.innerEl, me.endEl, me.focusEl); Ext.each(me.thumbs, function(thumb) { Ext.destroy(thumb); @@ -86028,7 +87642,7 @@ Ext.define('Ext.tab.Tab', { tag: 'a', cls: me.baseCls + '-close-btn', href: '#', - html: me.closeText, + title: me.closeText }).on('click', Ext.EventManager.preventDefault); } @@ -86068,14 +87682,23 @@ Ext.define('Ext.tab.Tab', { if (me.fireEvent('beforeclose', me) !== false) { if (me.tabBar) { - me.tabBar.closeTab(me); + if (me.tabBar.closeTab(me) === false) { + + return; + } + } else { + + me.fireEvent('close', me); } - - me.fireEvent('close', me); } }, + fireClose: function(){ + this.fireEvent('close', this); + }, + + onEnterKey: function(e) { var me = this; @@ -86163,9 +87786,9 @@ Ext.define('Ext.tab.Bar', { 'change' ); - Ext.applyIf(this.renderSelectors, { - body : '.' + this.baseCls + '-body', - strip: '.' + this.baseCls + '-strip' + Ext.applyIf(me.renderSelectors, { + body : '.' + me.baseCls + '-body', + strip: '.' + me.baseCls + '-strip' }); me.callParent(arguments); @@ -86223,7 +87846,8 @@ Ext.define('Ext.tab.Bar', { onClick: function(e, target) { var tab = Ext.getCmp(target.id), - tabPanel = this.tabPanel; + tabPanel = this.tabPanel, + allowActive = true; target = e.getTarget(); @@ -86231,9 +87855,11 @@ Ext.define('Ext.tab.Bar', { if (tab.closable && target === tab.closeEl.dom) { tab.onCloseClick(); } else { - this.setActiveTab(tab); if (tabPanel) { + tabPanel.setActiveTab(tab.card); + } else { + this.setActiveTab(tab); } tab.focus(); } @@ -86242,20 +87868,28 @@ Ext.define('Ext.tab.Bar', { closeTab: function(tab) { - var card = tab.card, - tabPanel = this.tabPanel, + var me = this, + card = tab.card, + tabPanel = me.tabPanel, nextTab; + + if (card && card.fireEvent('beforeclose', card) === false) { + return false; + } - if (tab.active && this.items.getCount() > 1) { - nextTab = tab.next('tab') || this.items.items[0]; - this.setActiveTab(nextTab); + if (tab.active && me.items.getCount() > 1) { + nextTab = tab.next('tab') || me.items.items[0]; + me.setActiveTab(nextTab); if (tabPanel) { tabPanel.setActiveTab(nextTab.card); } } - this.remove(tab); + + tab.fireClose(); + me.remove(tab); if (tabPanel && card) { + card.fireEvent('close', card); tabPanel.remove(card); } @@ -86402,16 +88036,22 @@ Ext.define('Ext.tab.Panel', { onAdd: function(item, index) { - var me = this; - - item.tab = me.tabBar.insert(index, { - xtype: 'tab', - card: item, - disabled: item.disabled, - closable: item.closable, - hidden: item.hidden, - tabBar: me.tabBar - }); + var me = this, + cfg = item.tabConfig || {}, + defaultConfig = { + xtype: 'tab', + card: item, + disabled: item.disabled, + closable: item.closable, + hidden: item.hidden, + tabBar: me.tabBar + }; + + if (item.closeText) { + defaultConfig.closeText = item.closeText; + } + cfg = Ext.applyIf(cfg, defaultConfig); + item.tab = me.tabBar.insert(index, cfg); item.on({ scope : me, @@ -86534,7 +88174,8 @@ Ext.define('Ext.tree.Column', { checkboxText= '', formattedValue = origRenderer.apply(origScope, arguments), href = record.get('href'), - target = record.get('hrefTarget'); + target = record.get('hrefTarget'), + cls = record.get('cls'); while (record) { if (!record.isRoot() || (record.isRoot() && view.rootVisible)) { @@ -86556,17 +88197,17 @@ Ext.define('Ext.tree.Column', { } } if (record.isLast()) { - if (record.isLeaf() || (record.isLoaded() && !record.hasChildNodes())) { - buf.unshift(format(imgText, (elbowPrefix + 'end'), Ext.BLANK_IMAGE_URL)); - } else { + if (record.isExpandable()) { buf.unshift(format(imgText, (elbowPrefix + 'end-plus ' + expanderCls), Ext.BLANK_IMAGE_URL)); + } else { + buf.unshift(format(imgText, (elbowPrefix + 'end'), Ext.BLANK_IMAGE_URL)); } } else { - if (record.isLeaf() || (record.isLoaded() && !record.hasChildNodes())) { - buf.unshift(format(imgText, (treePrefix + 'elbow'), Ext.BLANK_IMAGE_URL)); - } else { + if (record.isExpandable()) { buf.unshift(format(imgText, (elbowPrefix + 'plus ' + expanderCls), Ext.BLANK_IMAGE_URL)); + } else { + buf.unshift(format(imgText, (treePrefix + 'elbow'), Ext.BLANK_IMAGE_URL)); } } } else { @@ -86582,6 +88223,9 @@ Ext.define('Ext.tree.Column', { if (href) { formattedValue = format('{2}', href, target, formattedValue); } + if (cls) { + metaData.tdCls += ' ' + cls; + } return buf.join("") + formattedValue; }; this.callParent(arguments); @@ -86795,14 +88439,9 @@ Ext.define('Ext.tree.View', { Ext.fly(children[relativeIndex + 1]).insertSibling(nodes, 'before', true); } + - - if (index < a.length) { - a.splice.apply(a, [index, 0].concat(nodes)); - } - else { - a.push.apply(a, nodes); - } + Ext.Array.insert(a, index, nodes); @@ -86833,7 +88472,7 @@ Ext.define('Ext.tree.View', { var me = this, animWrap; - if (!me.animate) { + if (!me.rendered || !me.animate) { return; } @@ -86908,7 +88547,7 @@ Ext.define('Ext.tree.View', { var me = this, animWrap; - if (!me.animate) { + if (!me.rendered || !me.animate) { return; } @@ -87064,7 +88703,9 @@ Ext.define('Ext.tree.Panel', { selType: 'treemodel', treeCls: Ext.baseCSSPrefix + 'tree-panel', - + + deferRowRender: false, + lines: true, @@ -87124,16 +88765,17 @@ Ext.define('Ext.tree.Panel', { } else if (!me.useArrows) { cls.push(Ext.baseCSSPrefix + 'tree-no-lines'); } - - if (!me.store || Ext.isObject(me.store) && !me.store.isStore) { + + if (Ext.isString(me.store)) { + me.store = Ext.StoreMgr.lookup(me.store); + } else if (!me.store || Ext.isObject(me.store) && !me.store.isStore) { me.store = Ext.create('Ext.data.TreeStore', Ext.apply({}, me.store || {}, { root: me.root, fields: me.fields, model: me.model, folderSort: me.folderSort })); - } - else if (me.root) { + } else if (me.root) { me.store = Ext.data.StoreManager.lookup(me.store); me.store.setRootNode(me.root); if (me.folderSort !== undefined) { @@ -87337,7 +88979,7 @@ Ext.define('Ext.tree.Panel', { keys = path.split(separator); last = keys.pop(); - me.expandPath(keys.join('/'), field, separator, function(success, node){ + me.expandPath(keys.join(separator), field, separator, function(success, node){ var doSuccess = false; if (success && node) { node = node.findChild(field, last); @@ -87354,6 +88996,7 @@ Ext.define('Ext.tree.Panel', { } }); + Ext.define('Ext.view.DragZone', { extend: 'Ext.dd.DragZone', containerScroll: false, @@ -87396,6 +89039,12 @@ Ext.define('Ext.view.DragZone', { onItemMouseDown: function(view, record, item, index, e) { if (!this.isPreventDrag(e, record, item, index)) { this.handleMouseDown(e); + + + + if (view.getSelectionModel().selectionMode == 'MULTI' && !e.ctrlKey && view.getSelectionModel().isSelected(record)) { + return false; + } } }, @@ -87436,7 +89085,7 @@ Ext.define('Ext.view.DragZone', { if (!selectionModel.isSelected(record) || e.hasModifier()) { - selectionModel.selectWithEvent(record, e); + selectionModel.selectWithEvent(record, e, true); } data.records = selectionModel.getSelection(); @@ -87598,10 +89247,10 @@ Ext.define('Ext.tree.ViewDropZone', { } - if (position === 'append' && targetNode.get('allowDrop') == false) { + if (position === 'append' && targetNode.get('allowDrop') === false) { return false; } - else if (position != 'append' && targetNode.parentNode.get('allowDrop') == false) { + else if (position != 'append' && targetNode.parentNode.get('allowDrop') === false) { return false; } @@ -87630,6 +89279,7 @@ Ext.define('Ext.tree.ViewDropZone', { this.queueExpand(targetNode); } + if (this.isValidDropPoint(node, position, dragZone, e, data)) { this.valid = true; this.currentPosition = position; @@ -87638,24 +89288,22 @@ Ext.define('Ext.tree.ViewDropZone', { indicator.setWidth(Ext.fly(node).getWidth()); indicatorY = Ext.fly(node).getY() - Ext.fly(view.el).getY() - 1; + if (position == 'before') { returnCls = targetNode.isFirst() ? Ext.baseCSSPrefix + 'tree-drop-ok-above' : Ext.baseCSSPrefix + 'tree-drop-ok-between'; indicator.showAt(0, indicatorY); - indicator.toFront(); - } - else if (position == 'after') { + dragZone.proxy.show(); + } else if (position == 'after') { returnCls = targetNode.isLast() ? Ext.baseCSSPrefix + 'tree-drop-ok-below' : Ext.baseCSSPrefix + 'tree-drop-ok-between'; indicatorY += Ext.fly(node).getHeight(); indicator.showAt(0, indicatorY); - indicator.toFront(); - } - else { + dragZone.proxy.show(); + } else { returnCls = Ext.baseCSSPrefix + 'tree-drop-ok-append'; indicator.hide(); } - } - else { + } else { this.valid = false; } @@ -87742,7 +89390,9 @@ Ext.define('Ext.tree.ViewDropZone', { Ext.Array.forEach(recordDomNodes, function(n) { - Ext.fly(n.firstChild ? n.firstChild : n).highlight(me.dropHighlightColor); + if (n) { + Ext.fly(n.firstChild ? n.firstChild : n).highlight(me.dropHighlightColor); + } }); } }; @@ -88244,7 +89894,7 @@ Ext.define('Ext.view.TableChunker', { '{[this.openTableWrap()]}', '', '', - '', + '', '', '', '',