diff --git a/plugins/c9.ide.ui/forms.js b/plugins/c9.ide.ui/forms.js index bf0628be..6d32005f 100644 --- a/plugins/c9.ide.ui/forms.js +++ b/plugins/c9.ide.ui/forms.js @@ -244,8 +244,8 @@ define(function(require, exports, module) { label: name + ":", skin: "checkbox_black", onafterchange: function(e) { - if (options.path) - settings.set(options.path, e.value); + if (options.checkboxPath) + settings.set(options.checkboxPath, e.value); if (options.onchange) options.onchange({ value: e.value, type: "checkbox" }); }, diff --git a/plugins/c9.ide.ui/lib/dropdown.js b/plugins/c9.ide.ui/lib/dropdown.js index 7b01da9b..f6ef2b33 100644 --- a/plugins/c9.ide.ui/lib/dropdown.js +++ b/plugins/c9.ide.ui/lib/dropdown.js @@ -315,6 +315,62 @@ apf.dropdown = function(struct, tagName) { this.$setStyleClass(this.oSlider, e.value); }); + + this.$propHandlers["value"] = function(value) { + var items = this.items || this.childNodes; + for (var i = 0; i < items.length; i++) { + var x = items[i]; + var itemValue = x.value; + if (itemValue == undefined && x.getAttribute) + itemValue = x.getAttribute("value"); + if (isValueEqual(value, itemValue)) { + this.$setLabel(x.caption || (x.getAttribute && x.getAttribute("caption")) || value); + return; + } + } + }; + + function isValueEqual(v1, v2) { + if (v1 == v2) return true; + if (typeof v1 != "object" && typeof v2 != "object") + return v1 + "" == v2 + ""; + } + + this.$updateChildren = function() { + var items = this.items; + var children = this.childNodes; + if (items) { + for (var i = 0; i < items.length; i++) { + var item = items[i]; + var ch = children[i]; + if (!ch) { + ch = new apf.item(item); + this.appendChild(ch); + ch.item = item; + } else if (ch.item != item) { + ch.item = item; + ch.setAttribute("value", item.value); + ch.setAttribute("caption", item.caption); + } + } + + while (i < children.length) { + children[i].destroy(true, true); + } + } + + this.$int = this.$container; + for (var i = 0; i < children.length; i++) { + ch = children[i]; + if (ch.$pHtmlNode != this.$int) + ch.dispatchEvent("DOMNodeInsertedIntoDocument", {}); + if (isValueEqual(ch.getAttribute("value"), this.value)) + ch.$ext && ch.$ext.classList.add("selected"); + else + ch.$ext && ch.$ext.classList.remove("selected"); + } + }; + // *** Public methods *** // /* @@ -342,6 +398,7 @@ apf.dropdown = function(struct, tagName) { return false; this.isOpen = true; + this.$updateChildren(); this.$propHandlers["maxitems"].call(this, this.xmlRoot && this.each ? this.getTraverseNodes().length : this.childNodes.length); //@todo apf3.0 count element nodes @@ -402,24 +459,8 @@ apf.dropdown = function(struct, tagName) { return false; }; - - this.load = function(data, options) { - if (typeof data == "string" || options) { - debugger - } - this.data = data; - }; - this.select = function(value) { - var caption = ""; - this.childNodes.some(function(x) { - if (x.getAttribute("value") == value) { - caption = x.getAttribute("caption") || value; - return true; - } - }); - this.$setLabel(caption); - "afterselect" + this.setValue(value); }; // *** Private methods and event handlers *** // @@ -433,30 +474,6 @@ apf.dropdown = function(struct, tagName) { !value ? [] : [this.$baseCSSname + "Initial"]); }; - this.addEventListener("afterselect", function(e) { - debugger - // if (!e) e = event; - - // this.slideUp(); - // if (!this.isOpen) - // this.$setStyleClass(this.$ext, "", [this.$baseCSSname + "Over"]); - - // this.$setLabel(e.selection.length - // ? this.$applyBindRule("caption", this.selected) - // : ""); - }); - - function setMaxCount() { - if (this.isOpen == 2) - this.slideDown(); - } - - this.addEventListener("afterload", setMaxCount); - this.addEventListener("xmlupdate", function() { - setMaxCount.call(this); - this.$setLabel(this.$applyBindRule("caption", this.selected)); - }); - // Private functions this.$blur = function() { this.slideUp(); @@ -482,20 +499,39 @@ apf.dropdown = function(struct, tagName) { this.addEventListener("popuphide", this.slideUp); + this.load = this.setChildren = function(data) { - + this.items = data; + if (this.isOpen) + this.$updateChildren(); }; - this.setValue = function() { - + this.change = + this.setValue = function(value) { + if (this.value != value) { + this.setAttribute("value", value); + this.dispatchEvent("afterchange", { value: value }); + } }; // *** Keyboard Support *** // + this.getSelectedNode = function() { + if (!this.isOpen) + this.$updateChildren(); + var items = this.childNodes; + for (var i = 0; i < items.length; i++) { + var x = items[i]; + var itemValue = x.value; + if (itemValue == undefined && x.getAttribute) + itemValue = x.getAttribute("value"); + if (isValueEqual(this.value, itemValue)) { + return x; + } + } + }; this.addEventListener("keydown", function(e) { - debugger var key = e.keyCode; - var node; switch (key) { @@ -504,19 +540,13 @@ apf.dropdown = function(struct, tagName) { break; case 38: //UP - if (e.altKey) { - this.slideToggle(e.htmlEvent); - return; - } - - if (!this.selected) - return; - - node = this.getNextTraverseSelected(this.caret - || this.selected, false); - + if (e.altKey) + return this.slideToggle(e.htmlEvent); + node = this.getSelectedNode(); if (node) - this.select(node); + node = node.previousSibling; + if (node) + this.select(node.value); break; case 40: //DOWN @@ -524,18 +554,11 @@ apf.dropdown = function(struct, tagName) { this.slideToggle(e.htmlEvent); return; } - - if (!this.selected) { - node = this.getFirstTraverseNode(); - if (!node) - return; - } - else - node = this.getNextTraverseSelected(this.selected, true); - + node = this.getSelectedNode(); if (node) - this.select(node); - + node = node.nextSibling; + if (node) + this.select(node.value); break; default: if (key == 9 || !this.xmlRoot) return; @@ -549,14 +572,6 @@ apf.dropdown = function(struct, tagName) { this.lookup.str += String.fromCharCode(key); - var caption, nodes = this.getTraverseNodes(); - for (var i = 0; i < nodes.length; i++) { - caption = this.$applyBindRule("caption", nodes[i]); - if (caption && caption.indexOf(this.lookup.str) > -1) { - this.select(nodes[i]); - return; - } - } return; } diff --git a/plugins/c9.ide.ui/lib/flexbox.js b/plugins/c9.ide.ui/lib/flexbox.js index eac3e101..7bc2470d 100644 --- a/plugins/c9.ide.ui/lib/flexbox.js +++ b/plugins/c9.ide.ui/lib/flexbox.js @@ -864,8 +864,6 @@ apf.vbox = function(struct, tagName) { var ooffset = this.$vbox ? "offsetHeight" : "offsetWidth"; var getDiff = this.$vbox ? "getWidthDiff" : "getHeightDiff"; var ogetDiff = this.$vbox ? "getHeightDiff" : "getWidthDiff"; - var inner = this.$vbox ? "getHtmlInnerWidth" : "getHtmlInnerHeight"; - var oinner = this.$vbox ? "getHtmlInnerHeight" : "getHtmlInnerWidth"; var borders = this.$vbox ? "getVerBorders" : "getHorBorders"; var nodes = this.childNodes, hNodes = [], fW = 0, max = 0; diff --git a/plugins/c9.ide.ui/lib/menu/menu.js b/plugins/c9.ide.ui/lib/menu/menu.js index b8363083..a878d740 100644 --- a/plugins/c9.ide.ui/lib/menu/menu.js +++ b/plugins/c9.ide.ui/lib/menu/menu.js @@ -1383,7 +1383,7 @@ apf.item = function(struct, tagName) { }; this.select = function() { - this.parentNode.select(this.group, this.value || this.caption); + this.parentNode.select(this.group, this.value != undefined ? this.value : this.caption); }; this.check = function() { @@ -1455,7 +1455,7 @@ apf.item = function(struct, tagName) { if (this.type == "radio") - this.parentNode.select(this.group, this.value || this.caption); + this.parentNode.select(this.group, this.value != undefined ? this.value : this.caption); else if (this.type == "check") { this.setProperty("checked", !this.checked); @@ -1474,7 +1474,7 @@ apf.item = function(struct, tagName) { this.parentNode.hide();//true not focus?/ this.parentNode.dispatchEvent("itemclick", { - value: this.value || this.caption, + value: this.value != undefined ? this.value : this.caption, relatedNode: this, checked: this.checked, selected: this.selected diff --git a/plugins/c9.ide.ui/lib_apf.js b/plugins/c9.ide.ui/lib_apf.js index 5cca0533..7c339795 100644 --- a/plugins/c9.ide.ui/lib_apf.js +++ b/plugins/c9.ide.ui/lib_apf.js @@ -2736,10 +2736,6 @@ apf.plane = { function getCover(){ var obj = document.createElement("DIV"); - if (!_self.options || !_self.options.customCover) - return obj; - - debugger return obj; } @@ -3324,31 +3320,6 @@ apf.getHtmlInnerHeight = function(oHtml) { - (parseInt(apf.getStyle(oHtml, "borderBottomWidth")) || 0)); }; -/** - * Returns the viewport of a window. - * - * @param {WindowImplementation} [win] The window to take the measurements of. - * @returns {Object} Viewport object with x, y, w, and h properties. - */ -apf.getViewPort = function(win) { - win = win || window; - var doc = (!win.document.compatMode - || win.document.compatMode == "CSS1Compat") - //documentElement for an iframe - ? win.document.html || win.document.documentElement - : win.document.body; - - // Returns viewport size excluding scrollbars - return { - x: win.pageXOffset || doc.scrollLeft, - y: win.pageYOffset || doc.scrollTop, - width: win.innerWidth || doc.clientWidth, - height: win.innerHeight || doc.clientHeight - }; -}; - - - @@ -3766,70 +3737,6 @@ apf.visibilitymanager = function(){ return false; } - - this.permanent = function(amlNode, show, hide) { - var state = amlNode.$ext && (amlNode.$ext.offsetHeight || amlNode.$ext.offsetWidth); - function check(e) { - var newState = amlNode.$ext && (amlNode.$ext.offsetHeight || amlNode.$ext.offsetWidth); - if (newState == state) - return; - - if (newState) show(); - else hide(); - - state = newState; - } - - //Set events on the parent tree - /*var p = amlNode; - while (p) { - p.addEventListener("prop.visible", check); - p = p.parentNode || p.$parentNode; - }*/ - - function cleanup(setInsertion) { - var p = amlNode; - while (p) { - p.removeEventListener("prop.visible", check); - p.removeEventListener("DOMNodeRemoved", remove); - p.removeEventListener("DOMNodeRemovedFromDocument", remove); - if (setInsertion) - p.addEventListener("DOMNodeInserted", add); - p = p.parentNode || p.$parentNode; - } - - check(); - } - - function remove(e) { - if (e.currentTarget != this) - return; - - cleanup(e.name == "DOMNodeRemoved"); - } - - function add(){ - //Set events on the parent tree - var p = amlNode; - while (p) { - p.addEventListener("prop.visible", check); - p.addEventListener("DOMNodeRemoved", remove); - p.addEventListener("DOMNodeRemovedFromDocument", remove); - p.removeEventListener("DOMNodeInserted", add); - p = p.parentNode || p.$parentNode; - } - - check(); - } - - add(); - - return state; - } - - this.removePermanent = function(amlNode) { - - } }; @@ -10522,7 +10429,6 @@ apf.__CONTENTEDITABLE__ = 1 << 24; apf.__GUIELEMENT__ = 1 << 15; -apf.__VALIDATION__ = 1 << 6; @@ -10644,12 +10550,6 @@ apf.GuiElement = function(){ this.minwidth = 0; this.minheight = 0; - /*this.minwidth = 5; - this.minheight = 5; - this.maxwidth = 10000; - this.maxheight = 10000;*/ - - this.$booleanProperties["disable-keyboard"] = true; this.$booleanProperties["visible"] = true; @@ -10667,7 +10567,7 @@ apf.GuiElement = function(){ this.$supportedProperties.push( "focussable", "zindex", "disabled", "tabindex", "disable-keyboard", "contextmenu", "visible", "autosize", - "loadaml", "actiontracker", "alias", + "loadaml", "alias", "width", "left", "top", "height", "tooltip" ); @@ -10721,13 +10621,7 @@ apf.GuiElement = function(){ } }); - this.implement( - - apf.Anchoring - - - - ); + this.implement(apf.Anchoring); // **** Convenience functions for gui nodes **** // @@ -10910,16 +10804,8 @@ apf.GuiElement = function(){ this.addEventListener("DOMNodeInsertedIntoDocument", function(e) { var x = this.$aml; - // will $pHtmlNode be deprecated soon? - // check used to be: - //if (!this.$pHtmlNode && this.parentNode) - if (this.parentNode) { - if (this.localName == "item" - && this.parentNode.hasFeature(apf.__MULTISELECT__)) //special case for item nodes, using multiselect rendering - this.$pHtmlNode = this.parentNode.$container; - else - this.$pHtmlNode = this.parentNode.$int; //@todo apf3.0 change this in the mutation events - } + if (this.parentNode) + this.$pHtmlNode = this.parentNode.$int; if (!this.$pHtmlNode) //@todo apf3.0 retry on DOMNodeInserted return; @@ -10959,28 +10845,6 @@ apf.GuiElement = function(){ this.maxwidth = apf.getCoord(hasPres && parseInt(this.$getOption(type, "maxwidth")), 10000); if (this.maxheight == undefined) this.maxheight = apf.getCoord(hasPres && parseInt(this.$getOption(type, "maxheight")), 10000); - - //--#ifdef __WITH_CONTENTEDITABLE - //@todo slow?? - if (this.minwidth || this.minheight || this.maxwidth != 10000 || this.maxheight != 10000) { - var diff = apf.getDiff(this.$ext); - if (this.minwidth) - this.$ext.style.minWidth = Math.max(0, this.minwidth - diff[0]) + "px"; - if (this.minheight) - this.$ext.style.minHeight = Math.max(0, this.minheight - diff[1]) + "px"; - if (this.maxwidth != 10000) - this.$ext.style.maxWidth = Math.max(0, this.maxwidth - diff[0]) + "px"; - if (this.maxheight != 10000) - this.$ext.style.maxHeight = Math.max(0, this.maxheight - diff[1]) + "px"; - - if (this.$altExt && apf.isGecko) { - this.$altExt.style.minHeight = this.$ext.style.minHeight; - this.$altExt.style.maxHeight = this.$ext.style.maxHeight; - this.$altExt.style.minWidth = this.$ext.style.minWidth; - this.$altExt.style.maxWidth = this.$ext.style.maxWidth; - } - } - //--#endif } if (this.$loadAml) @@ -11292,49 +11156,6 @@ apf.GuiElement.propHandlers = { "contextmenu": function(value) { this.contextmenus = [value]; }, - - - - /** - * @attribute {String} actiontracker Sets or gets the name of the [[apf.actiontracker action tracker]] that - * is used for this element and its children. If the actiontracker doesn't - * exist yet, it is created. - * - * #### Example - * - * In this example, the list uses a different action tracker than the two - * textboxes which determine their actiontracker based on the one that - * is defined on the bar. - * - * ```xml - * - * - * - * - * - * - * ``` - */ - "actiontracker": function(value) { - if (!value) { - this.$at = null; - } - else if (typeof value == "object") { - this.$at = value; - } - else { - - this.$at = typeof value == "string" && self[value] - ? apf.nameserver.get("actiontracker", value) || self[value].getActionTracker() - : apf.setReference(value, - apf.nameserver.register("actiontracker", - value, new apf.actiontracker())); - - if (!this.$at.name) - this.$at.name = value; - - } - }, }; @@ -11344,13 +11165,9 @@ apf.GuiElement.propHandlers = { if (apf.isO3) return; var prot = apf.XhtmlElement.prototype; - //prot.implement(apf.Interactive); prot.implement( - apf.Anchoring - ); - prot.$drawn = true; prot.$setLayout = apf.GuiElement.prototype.$setLayout; @@ -11902,11 +11719,6 @@ apf.Presentation = function(){ this.$setStyleClass(this.oFocus || this.$ext, "", [this.$baseCSSname + "Focus"]); }; - // *** Caching *** // - /* - this.$setClearMessage = function(msg) {}; - this.$updateClearMessage = function(){} - this.$removeClearMessage = function(){};*/ }).call(apf.Presentation.prototype = new apf.GuiElement()); apf.config.$inheritProperties["skinset"] = 1; @@ -11917,114 +11729,6 @@ apf.config.$inheritProperties["skinset"] = 1; - -apf.__VALIDATION__ = 1 << 6; - - - -//if checkequal then notnull = true -apf.validator = { - macro: { - - - //var temp - "pattern" : "value.match(", - "pattern_" : ")", - "custom" : "(", - "custom_" : ")", - "min" : "parseInt(value) >= ", - "max" : "parseInt(value) <= ", - "maxlength" : "value.toString().length <= ", - "minlength" : "value.toString().length >= ", - "notnull" : "value.toString().length > 0", - "checkequal" : "!(temp = ", - "checkequal_" : ").isValid() || temp.getValue() == value" - }, - - compile: function(options) { - var m = this.macro, s = ["var temp, valid = true; \ - if (!validityState) \ - validityState = new apf.validator.validityState(); "]; - - if (options.required) { - s.push("if (checkRequired && (!value || value.toString().trim().length == 0)) {\ - validityState.$reset();\ - validityState.valueMissing = true;\ - valid = false;\ - }") - } - - s.push("validityState.$reset();\ - if (value) {"); - - for (prop in options) { - if (!m[prop]) continue; - s.push("if (!(", m[prop], options[prop], m[prop + "_"] || "", ")){\ - validityState.$set('", prop, "');\ - valid = false;\ - }"); - } - - s.push("};validityState.valid = valid; return validityState;"); - return new Function('value', 'checkRequired', 'validityState', s.join("")); - } -}; - -/** - * Object containing information about the validation state. It contains - * properties that specify whether a certain validation was passed. - * Remarks: - * This is part of {@link http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#validitystatethe HTML 5 specification}. - */ -apf.validator.validityState = function(){ - this.valueMissing = false, - this.typeMismatch = false, - this.patternMismatch = false, - this.tooLong = false, - this.rangeUnderflow = false, - this.rangeOverflow = false, - this.stepMismatch = false, - this.customError = false, - this.valid = true, - - this.$reset = function(){ - for (var prop in this) { - if (prop.substr(0,1) == "$") - continue; - this[prop] = false; - } - this.valid = true; - }, - - this.$set = function(type) { - switch (type) { - case "min" : this.rangeUnderflow = true; break; - case "max" : this.rangeOverflow = true; break; - case "minlength" : this.tooShort = true; break; - case "maxlength" : this.tooLong = true; break; - case "pattern" : this.patternMismatch = true; break; - case "datatype" : this.typeMismatch = true; break; - case "notnull" : this.typeMismatch = true; break; - case "checkequal" : this.typeMismatch = true; break; - } - } -}; - - -apf.GuiElement.propHandlers["required"] = -apf.GuiElement.propHandlers["pattern"] = -apf.GuiElement.propHandlers["min"] = -apf.GuiElement.propHandlers["max"] = -apf.GuiElement.propHandlers["maxlength"] = -apf.GuiElement.propHandlers["minlength"] = -apf.GuiElement.propHandlers["notnull"] = -apf.GuiElement.propHandlers["checkequal"] = -apf.GuiElement.propHandlers["validtest"] = function(value, prop) { - debugger -} - - - require("./lib/dropdown")(apf); @@ -14063,45 +13767,6 @@ apf.GuiElement.propHandlers["draggable"] = function(value) { - - - -apf.__MEDIA__ = 1 << 20; - - - - - - - - - - -apf.__TRANSACTION__ = 1 << 3; - - - - - - - - - - -apf.__XFORMS__ = 1 << 17; - - - - - - - - - - - - - /** * Object representing the window of the AML application. The semantic is * similar to that of a window in the browser, except that this window is not @@ -14135,14 +13800,6 @@ apf.window = function(){ return "[apf.window]"; }; - /** - * Retrieves the primary {@link apf.actiontracker action tracker} of the application. - */ - this.getActionTracker = function(){ - return this.$at - }; - - /** * Show the browser window. */ @@ -14420,20 +14077,7 @@ apf.window = function(){ } if (!node) - this.$focus(apf.document.documentElement);//return false;// - - /*@todo get this back from SVN - var node, list = amlNode.$tabList; - for (var i = 0; i < list.length; i++) { - node = list[i]; - if (node.focussable !== false && node.$focussable === true - && (ignoreVisible || node.$ext.offsetHeight)) { - this.$focus(node, e, true); - return; - } - } - - this.$focus(apf.document.documentElement);*/ + this.$focus(apf.document.documentElement); } }; @@ -14463,7 +14107,6 @@ apf.window = function(){ do { node = node.parentNode; } while (node && !node.$isWindowContainer); - //(!node.$focussable || node.focussable === false) return node || apf.document.documentElement; } @@ -14757,14 +14400,6 @@ apf.window = function(){ || apf.window.activeElement.$focusParent != amlNode) apf.window.$focusLast(amlNode, {mouse: true, ctrlKey: e.ctrlKey}); } -// else { -// if (!apf.config.allowBlur || amlNode != apf.document.documentElement) -// apf.window.$focusDefault(amlNode, {mouse: true, ctrlKey: e.ctrlKey}); -// } - } - else { - // Disabled this to prevent menus from becoming unclickable - // apf.window.$focusDefault(amlNode, {mouse: true, ctrlKey: e.ctrlKey}); } @@ -14778,10 +14413,6 @@ apf.window = function(){ amlNode: amlNode || apf.document.documentElement }); - //Non IE/ iPhone selection handling - if (apf.isIE || apf.isIphone) - return; - var canSelect = !((!apf.document && (!apf.isParsingPartial || amlNode) || apf.dragMode) && !ta[e.target && e.target.tagName]); @@ -14794,10 +14425,9 @@ apf.window = function(){ || amlNode.$isTextInput && amlNode.$isTextInput(e) && amlNode.disabled < 1; - //(!amlNode.canHaveChildren || !apf.isChildOf(amlNode.$int, e.srcElement)) if (!apf.config.allowSelect && !isTextInput && amlNode.nodeType != amlNode.NODE_PROCESSING_INSTRUCTION - && !amlNode.textselect) //&& (!amlNode.$int || amlNode.$focussable) //getElementsByTagNameNS(apf.ns.xhtml, "*").length + && !amlNode.textselect) canSelect = false; } @@ -15089,21 +14719,6 @@ apf.window = function(){ apf.document = {}; this.init = function(strAml) { - - if (apf.actiontracker) { - this.$at = new apf.actiontracker(); - this.$at.name = "default"; - - apf.nameserver.register("actiontracker", "default", this.$at); - - } - - - - - - - //Put this in callback in between the two phases @@ -17103,6 +16718,7 @@ apf.button = function(struct, tagName) { this.change = this.setValue = function(value) { this.setProperty("value", value, false, true); + this.dispatchEvent("afterchange", { value: value }); }; /** @@ -18287,6 +17903,7 @@ apf.colorbox = function(struct, tagName) { this.change = this.setValue = function(value) { this.setProperty("value", value, false, true); + this.dispatchEvent("afterchange", { value: value }); }; /** @@ -19579,6 +19196,7 @@ apf.progressbar = function(struct, tagName) { this.change = this.setValue = function(value) { this.setProperty("value", value, false, true); + this.dispatchEvent("afterchange", { value: value }); }; /** @@ -19930,6 +19548,7 @@ apf.radiobutton = function(struct, tagName) { this.change = this.setValue = function(value) { this.setProperty("value", value, false, true); + this.dispatchEvent("afterchange", { value: value }); }; /** @@ -20228,6 +19847,7 @@ apf.$group = apf.group = function(struct, tagName) { this.change = this.setValue = function(value) { this.setProperty("value", value); + this.dispatchEvent("afterchange", { value: value }); }; /** @@ -20677,18 +20297,9 @@ apf.spinner = function(struct, tagName) { this.addEventListener("keyup", function(e) { if (this.realtime) - this.setProperty("value", this.oInput.value); + this.change(parseInt(this.oInput.value)); }, true); - - this.increment = function() { - this.change(parseInt(this.oInput.value) + 1); - }; - - this.decrement = function() { - this.change(parseInt(this.oInput.value) - 1); - }; - /** * @event click Fires when the user presses a mousebutton while over this element and then lets the mousebutton go. */ @@ -21537,10 +21148,6 @@ apf.text = function(struct, tagName) { this.$scrollArea.scrollTop = this.$scrollArea.scrollHeight; }; - this.$eachHandler = function(value) { - debugger - }; - this.addEventListener("prop.each", this.$eachHandler); this.addEventListener("$clear", function(){ this.$container.innerHTML = ""; @@ -22127,7 +21734,8 @@ apf.textbox = function(struct, tagName) { */ this.change = this.setValue = function(value) { - return this.setProperty("value", value, false, true); + this.setProperty("value", value, false, true); + this.dispatchEvent("afterchange", { value: value }); }; /**