| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696 | <!DOCTYPE html><html><head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <title>The source code</title>  <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />  <script type="text/javascript" src="../resources/prettify/prettify.js"></script>  <style type="text/css">    .highlight { display: block; background-color: #ddd; }  </style>  <script type="text/javascript">    function highlight() {      document.getElementById(location.hash.replace(/#/, "")).className = "highlight";    }  </script></head><body onload="prettyPrint(); highlight();">  <pre class="prettyprint lang-js"><span id='Ext-view-View'>/**</span> * A mechanism for displaying data using custom layout templates and formatting. * * The View uses an {@link Ext.XTemplate} as its internal templating mechanism, and is bound to an * {@link Ext.data.Store} so that as the data in the store changes the view is automatically updated * to reflect the changes. The view also provides built-in behavior for many common events that can * occur for its contained items including click, doubleclick, mouseover, mouseout, etc. as well as a * built-in selection model. **In order to use these features, an {@link #itemSelector} config must * be provided for the View to determine what nodes it will be working with.** * * The example below binds a View to a {@link Ext.data.Store} and renders it into an {@link Ext.panel.Panel}. * *     @example *     Ext.define('Image', { *         extend: 'Ext.data.Model', *         fields: [ *             { name:'src', type:'string' }, *             { name:'caption', type:'string' } *         ] *     }); * *     Ext.create('Ext.data.Store', { *         id:'imagesStore', *         model: 'Image', *         data: [ *             { src:'http://www.sencha.com/img/20110215-feat-drawing.png', caption:'Drawing & Charts' }, *             { src:'http://www.sencha.com/img/20110215-feat-data.png', caption:'Advanced Data' }, *             { src:'http://www.sencha.com/img/20110215-feat-html5.png', caption:'Overhauled Theme' }, *             { src:'http://www.sencha.com/img/20110215-feat-perf.png', caption:'Performance Tuned' } *         ] *     }); * *     var imageTpl = new Ext.XTemplate( *         '<tpl for=".">', *             '<div style="margin-bottom: 10px;" class="thumb-wrap">', *               '<img src="{src}" />', *               '<br/><span>{caption}</span>', *             '</div>', *         '</tpl>' *     ); * *     Ext.create('Ext.view.View', { *         store: Ext.data.StoreManager.lookup('imagesStore'), *         tpl: imageTpl, *         itemSelector: 'div.thumb-wrap', *         emptyText: 'No images available', *         renderTo: Ext.getBody() *     }); */Ext.define('Ext.view.View', {    extend: 'Ext.view.AbstractView',    alternateClassName: 'Ext.DataView',    alias: 'widget.dataview',    deferHighlight: (Ext.isIE6 || Ext.isIE7) ? 100 : 0,    inputTagRe: /^textarea$|^input$/i,    inheritableStatics: {        EventMap: {            mousedown: 'MouseDown',            mouseup: 'MouseUp',            click: 'Click',            dblclick: 'DblClick',            contextmenu: 'ContextMenu',            mouseover: 'MouseOver',            mouseout: 'MouseOut',            mouseenter: 'MouseEnter',            mouseleave: 'MouseLeave',            keydown: 'KeyDown',            focus: 'Focus'        }    },    initComponent: function() {        var me = this;        me.callParent();        if (me.deferHighlight){            me.setHighlightedItem =                Ext.Function.createBuffered(me.setHighlightedItem, me.deferHighlight, me);        }    },    addCmpEvents: function() {        this.addEvents(<span id='Ext-view-View-event-beforeitemmousedown'>            /**</span>             * @event beforeitemmousedown             * Fires before the mousedown event on an item is processed. Returns false to cancel the default action.             * @param {Ext.view.View} this             * @param {Ext.data.Model} record The record that belongs to the item             * @param {HTMLElement} item The item's element             * @param {Number} index The item's index             * @param {Ext.EventObject} e The raw event object             */            'beforeitemmousedown',<span id='Ext-view-View-event-beforeitemmouseup'>            /**</span>             * @event beforeitemmouseup             * Fires before the mouseup event on an item is processed. Returns false to cancel the default action.             * @param {Ext.view.View} this             * @param {Ext.data.Model} record The record that belongs to the item             * @param {HTMLElement} item The item's element             * @param {Number} index The item's index             * @param {Ext.EventObject} e The raw event object             */            'beforeitemmouseup',<span id='Ext-view-View-event-beforeitemmouseenter'>            /**</span>             * @event beforeitemmouseenter             * Fires before the mouseenter event on an item is processed. Returns false to cancel the default action.             * @param {Ext.view.View} this             * @param {Ext.data.Model} record The record that belongs to the item             * @param {HTMLElement} item The item's element             * @param {Number} index The item's index             * @param {Ext.EventObject} e The raw event object             */            'beforeitemmouseenter',<span id='Ext-view-View-event-beforeitemmouseleave'>            /**</span>             * @event beforeitemmouseleave             * Fires before the mouseleave event on an item is processed. Returns false to cancel the default action.             * @param {Ext.view.View} this             * @param {Ext.data.Model} record The record that belongs to the item             * @param {HTMLElement} item The item's element             * @param {Number} index The item's index             * @param {Ext.EventObject} e The raw event object             */            'beforeitemmouseleave',<span id='Ext-view-View-event-beforeitemclick'>            /**</span>             * @event beforeitemclick             * Fires before the click event on an item is processed. Returns false to cancel the default action.             * @param {Ext.view.View} this             * @param {Ext.data.Model} record The record that belongs to the item             * @param {HTMLElement} item The item's element             * @param {Number} index The item's index             * @param {Ext.EventObject} e The raw event object             */            'beforeitemclick',<span id='Ext-view-View-event-beforeitemdblclick'>            /**</span>             * @event beforeitemdblclick             * Fires before the dblclick event on an item is processed. Returns false to cancel the default action.             * @param {Ext.view.View} this             * @param {Ext.data.Model} record The record that belongs to the item             * @param {HTMLElement} item The item's element             * @param {Number} index The item's index             * @param {Ext.EventObject} e The raw event object             */            'beforeitemdblclick',<span id='Ext-view-View-event-beforeitemcontextmenu'>            /**</span>             * @event beforeitemcontextmenu             * Fires before the contextmenu event on an item is processed. Returns false to cancel the default action.             * @param {Ext.view.View} this             * @param {Ext.data.Model} record The record that belongs to the item             * @param {HTMLElement} item The item's element             * @param {Number} index The item's index             * @param {Ext.EventObject} e The raw event object             */            'beforeitemcontextmenu',<span id='Ext-view-View-event-beforeitemkeydown'>            /**</span>             * @event beforeitemkeydown             * Fires before the keydown event on an item is processed. Returns false to cancel the default action.             * @param {Ext.view.View} this             * @param {Ext.data.Model} record The record that belongs to the item             * @param {HTMLElement} item The item's element             * @param {Number} index The item's index             * @param {Ext.EventObject} e The raw event object. Use {@link Ext.EventObject#getKey getKey()} to retrieve the key that was pressed.             */            'beforeitemkeydown',<span id='Ext-view-View-event-itemmousedown'>            /**</span>             * @event itemmousedown             * Fires when there is a mouse down on an item             * @param {Ext.view.View} this             * @param {Ext.data.Model} record The record that belongs to the item             * @param {HTMLElement} item The item's element             * @param {Number} index The item's index             * @param {Ext.EventObject} e The raw event object             */            'itemmousedown',<span id='Ext-view-View-event-itemmouseup'>            /**</span>             * @event itemmouseup             * Fires when there is a mouse up on an item             * @param {Ext.view.View} this             * @param {Ext.data.Model} record The record that belongs to the item             * @param {HTMLElement} item The item's element             * @param {Number} index The item's index             * @param {Ext.EventObject} e The raw event object             */            'itemmouseup',<span id='Ext-view-View-event-itemmouseenter'>            /**</span>             * @event itemmouseenter             * Fires when the mouse enters an item.             * @param {Ext.view.View} this             * @param {Ext.data.Model} record The record that belongs to the item             * @param {HTMLElement} item The item's element             * @param {Number} index The item's index             * @param {Ext.EventObject} e The raw event object             */            'itemmouseenter',<span id='Ext-view-View-event-itemmouseleave'>            /**</span>             * @event itemmouseleave             * Fires when the mouse leaves an item.             * @param {Ext.view.View} this             * @param {Ext.data.Model} record The record that belongs to the item             * @param {HTMLElement} item The item's element             * @param {Number} index The item's index             * @param {Ext.EventObject} e The raw event object             */            'itemmouseleave',<span id='Ext-view-View-event-itemclick'>            /**</span>             * @event itemclick             * Fires when an item is clicked.             * @param {Ext.view.View} this             * @param {Ext.data.Model} record The record that belongs to the item             * @param {HTMLElement} item The item's element             * @param {Number} index The item's index             * @param {Ext.EventObject} e The raw event object             */            'itemclick',<span id='Ext-view-View-event-itemdblclick'>            /**</span>             * @event itemdblclick             * Fires when an item is double clicked.             * @param {Ext.view.View} this             * @param {Ext.data.Model} record The record that belongs to the item             * @param {HTMLElement} item The item's element             * @param {Number} index The item's index             * @param {Ext.EventObject} e The raw event object             */            'itemdblclick',<span id='Ext-view-View-event-itemcontextmenu'>            /**</span>             * @event itemcontextmenu             * Fires when an item is right clicked.             * @param {Ext.view.View} this             * @param {Ext.data.Model} record The record that belongs to the item             * @param {HTMLElement} item The item's element             * @param {Number} index The item's index             * @param {Ext.EventObject} e The raw event object             */            'itemcontextmenu',<span id='Ext-view-View-event-itemkeydown'>            /**</span>             * @event itemkeydown             * Fires when a key is pressed while an item is currently selected.             * @param {Ext.view.View} this             * @param {Ext.data.Model} record The record that belongs to the item             * @param {HTMLElement} item The item's element             * @param {Number} index The item's index             * @param {Ext.EventObject} e The raw event object. Use {@link Ext.EventObject#getKey getKey()} to retrieve the key that was pressed.             */            'itemkeydown',<span id='Ext-view-View-event-beforecontainermousedown'>            /**</span>             * @event beforecontainermousedown             * Fires before the mousedown event on the container is processed. Returns false to cancel the default action.             * @param {Ext.view.View} this             * @param {Ext.EventObject} e The raw event object             */            'beforecontainermousedown',<span id='Ext-view-View-event-beforecontainermouseup'>            /**</span>             * @event beforecontainermouseup             * Fires before the mouseup event on the container is processed. Returns false to cancel the default action.             * @param {Ext.view.View} this             * @param {Ext.EventObject} e The raw event object             */            'beforecontainermouseup',<span id='Ext-view-View-event-beforecontainermouseover'>            /**</span>             * @event beforecontainermouseover             * Fires before the mouseover event on the container is processed. Returns false to cancel the default action.             * @param {Ext.view.View} this             * @param {Ext.EventObject} e The raw event object             */            'beforecontainermouseover',<span id='Ext-view-View-event-beforecontainermouseout'>            /**</span>             * @event beforecontainermouseout             * Fires before the mouseout event on the container is processed. Returns false to cancel the default action.             * @param {Ext.view.View} this             * @param {Ext.EventObject} e The raw event object             */            'beforecontainermouseout',<span id='Ext-view-View-event-beforecontainerclick'>            /**</span>             * @event beforecontainerclick             * Fires before the click event on the container is processed. Returns false to cancel the default action.             * @param {Ext.view.View} this             * @param {Ext.EventObject} e The raw event object             */            'beforecontainerclick',<span id='Ext-view-View-event-beforecontainerdblclick'>            /**</span>             * @event beforecontainerdblclick             * Fires before the dblclick event on the container is processed. Returns false to cancel the default action.             * @param {Ext.view.View} this             * @param {Ext.EventObject} e The raw event object             */            'beforecontainerdblclick',<span id='Ext-view-View-event-beforecontainercontextmenu'>            /**</span>             * @event beforecontainercontextmenu             * Fires before the contextmenu event on the container is processed. Returns false to cancel the default action.             * @param {Ext.view.View} this             * @param {Ext.EventObject} e The raw event object             */            'beforecontainercontextmenu',<span id='Ext-view-View-event-beforecontainerkeydown'>            /**</span>             * @event beforecontainerkeydown             * Fires before the keydown event on the container is processed. Returns false to cancel the default action.             * @param {Ext.view.View} this             * @param {Ext.EventObject} e The raw event object. Use {@link Ext.EventObject#getKey getKey()} to retrieve the key that was pressed.             */            'beforecontainerkeydown',<span id='Ext-view-View-event-containermouseup'>            /**</span>             * @event containermouseup             * Fires when there is a mouse up on the container             * @param {Ext.view.View} this             * @param {Ext.EventObject} e The raw event object             */            'containermouseup',<span id='Ext-view-View-event-containermouseover'>            /**</span>             * @event containermouseover             * Fires when you move the mouse over the container.             * @param {Ext.view.View} this             * @param {Ext.EventObject} e The raw event object             */            'containermouseover',<span id='Ext-view-View-event-containermouseout'>            /**</span>             * @event containermouseout             * Fires when you move the mouse out of the container.             * @param {Ext.view.View} this             * @param {Ext.EventObject} e The raw event object             */            'containermouseout',<span id='Ext-view-View-event-containerclick'>            /**</span>             * @event containerclick             * Fires when the container is clicked.             * @param {Ext.view.View} this             * @param {Ext.EventObject} e The raw event object             */            'containerclick',<span id='Ext-view-View-event-containerdblclick'>            /**</span>             * @event containerdblclick             * Fires when the container is double clicked.             * @param {Ext.view.View} this             * @param {Ext.EventObject} e The raw event object             */            'containerdblclick',<span id='Ext-view-View-event-containercontextmenu'>            /**</span>             * @event containercontextmenu             * Fires when the container is right clicked.             * @param {Ext.view.View} this             * @param {Ext.EventObject} e The raw event object             */            'containercontextmenu',<span id='Ext-view-View-event-containerkeydown'>            /**</span>             * @event containerkeydown             * Fires when a key is pressed while the container is focused, and no item is currently selected.             * @param {Ext.view.View} this             * @param {Ext.EventObject} e The raw event object. Use {@link Ext.EventObject#getKey getKey()} to retrieve the key that was pressed.             */            'containerkeydown',<span id='Ext-view-View-event-selectionchange'>            /**</span>             * @event             * @inheritdoc Ext.selection.DataViewModel#selectionchange             */            'selectionchange',<span id='Ext-view-View-event-beforeselect'>            /**</span>             * @event             * @inheritdoc Ext.selection.DataViewModel#beforeselect             */            'beforeselect',<span id='Ext-view-View-event-beforedeselect'>            /**</span>             * @event             * @inheritdoc Ext.selection.DataViewModel#beforedeselect             */            'beforedeselect',<span id='Ext-view-View-event-select'>            /**</span>             * @event             * @inheritdoc Ext.selection.DataViewModel#select             */            'select',<span id='Ext-view-View-event-deselect'>            /**</span>             * @event             * @inheritdoc Ext.selection.DataViewModel#deselect             */            'deselect',<span id='Ext-view-View-event-focuschange'>            /**</span>             * @event             * @inheritdoc Ext.selection.DataViewModel#focuschange             */            'focuschange',            <span id='Ext-view-View-event-highlightitem'>            /**</span>             * @event highlightitem             * Fires when a node is highlighted using keyboard navigation, or mouseover.             * @param {Ext.view.View} view This View Component.             * @param {Ext.Element} node The highlighted node.             */            'highlightitem',            <span id='Ext-view-View-event-unhighlightitem'>            /**</span>             * @event unhighlightitem             * Fires when a node is unhighlighted using keyboard navigation, or mouseout.             * @param {Ext.view.View} view This View Component.             * @param {Ext.Element} node The previously highlighted node.             */            'unhighlightitem'        );    },    getFocusEl: function() {        return this.getTargetEl();    },    // private    afterRender: function(){        var me = this;        me.callParent();        me.mon(me.getTargetEl(), {            scope: me,            /*             * We need to make copies of this since some of the events fired here will end up triggering             * a new event to be called and the shared event object will be mutated. In future we should             * investigate if there are any issues with creating a new event object for each event that             * is fired.             */            freezeEvent: true,            click: me.handleEvent,            mousedown: me.handleEvent,            mouseup: me.handleEvent,            dblclick: me.handleEvent,            contextmenu: me.handleEvent,            mouseover: me.handleEvent,            mouseout: me.handleEvent,            keydown: me.handleEvent        });    },    handleEvent: function(e) {        var me = this,            key = e.type == 'keydown' && e.getKey();        if (me.processUIEvent(e) !== false) {            me.processSpecialEvent(e);        }        // After all listeners have processed the event, then unless the user is typing into an input field,        // prevent browser's default action on SPACE which is to focus the event's target element.        // Focusing causes the browser to attempt to scroll the element into view.        if (key === e.SPACE) {            if (!me.inputTagRe.test(e.getTarget().tagName)) {                e.stopEvent();            }        }    },    // Private template method    processItemEvent: Ext.emptyFn,    processContainerEvent: Ext.emptyFn,    processSpecialEvent: Ext.emptyFn,    /*     * Returns true if this mouseover/out event is still over the overItem.     */    stillOverItem: function (event, overItem) {        var nowOver;        // There is this weird bug when you hover over the border of a cell it is saying        // the target is the table.        // BrowserBug: IE6 & 7. If me.mouseOverItem has been removed and is no longer        // in the DOM then accessing .offsetParent will throw an "Unspecified error." exception.        // typeof'ng and checking to make sure the offsetParent is an object will NOT throw        // this hard exception.        if (overItem && typeof(overItem.offsetParent) === "object") {            // mouseout : relatedTarget == nowOver, target == wasOver            // mouseover: relatedTarget == wasOver, target == nowOver            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,            type = e.type,            overItem = me.mouseOverItem,            newType;        if (!item) {            if (type == 'mouseover' && me.stillOverItem(e, overItem)) {                item = overItem;            }            // Try to get the selected item to handle the keydown event, otherwise we'll just fire a container keydown event            if (type == 'keydown') {                record = me.getSelectionModel().getLastSelected();                if (record) {                    item = me.getNode(record);                }            }        }        if (item) {            index = me.indexOf(item);            if (!record) {                record = me.getRecord(item);            }            // It is possible for an event to arrive for which there is no record... this            // can happen with dblclick where the clicks are on removal actions (think a            // grid w/"delete row" action column)            if (!record || me.processItemEvent(record, item, index, e) === false) {                return false;            }            newType = me.isNewItemEvent(item, e);            if (newType === false) {                return false;            }            if (                (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' + newType, me, record, item, index, e);        }        else {            if (                (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 (item, e) {        var me = this,            overItem = me.mouseOverItem,            type = e.type;        switch (type) {            case 'mouseover':                if (item === overItem) {                    return false;                }                me.mouseOverItem = item;                return 'mouseenter';            case 'mouseout':                // If the currently mouseovered item contains the mouseover target, it's *NOT* a mouseleave                if (me.stillOverItem(e, overItem)) {                    return false;                }                me.mouseOverItem = null;                return 'mouseleave';        }        return type;    },    // private    onItemMouseEnter: function(record, item, index, e) {        if (this.trackOver) {            this.highlightItem(item);        }    },    // private    onItemMouseLeave : function(record, item, index, e) {        if (this.trackOver) {            this.clearHighlight();        }    },    // @private, template methods    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,    // @private, template methods    onContainerMouseDown: Ext.emptyFn,    onContainerMouseUp: Ext.emptyFn,    onContainerMouseOver: Ext.emptyFn,    onContainerMouseOut: Ext.emptyFn,    onContainerClick: Ext.emptyFn,    onContainerDblClick: Ext.emptyFn,    onContainerContextMenu: Ext.emptyFn,    onContainerKeyDown: Ext.emptyFn,    onBeforeContainerMouseDown: Ext.emptyFn,    onBeforeContainerMouseUp: Ext.emptyFn,    onBeforeContainerMouseOver: Ext.emptyFn,    onBeforeContainerMouseOut: Ext.emptyFn,    onBeforeContainerClick: Ext.emptyFn,    onBeforeContainerDblClick: Ext.emptyFn,    onBeforeContainerContextMenu: Ext.emptyFn,    onBeforeContainerKeyDown: Ext.emptyFn,    //private    setHighlightedItem: function(item){        var me = this,            highlighted = me.highlightedItem;        if (highlighted != item){            if (highlighted) {                Ext.fly(highlighted).removeCls(me.overItemCls);                me.fireEvent('unhighlightitem', me, highlighted);            }            me.highlightedItem = item;            if (item) {                //console.log(item.viewIndex);                Ext.fly(item).addCls(me.overItemCls);                me.fireEvent('highlightitem', me, item);            }        }    },<span id='Ext-view-View-method-highlightItem'>    /**</span>     * Highlights a given item in the View. This is called by the mouseover handler if {@link #overItemCls}     * and {@link #trackOver} are configured, but can also be called manually by other code, for instance to     * handle stepping through the list via keyboard navigation.     * @param {HTMLElement} item The item to highlight     */    highlightItem: function(item) {        this.setHighlightedItem(item);    },<span id='Ext-view-View-method-clearHighlight'>    /**</span>     * Un-highlights the currently highlighted item, if any.     */    clearHighlight: function() {        this.setHighlightedItem(undefined);    },        onUpdate: function(store, record){        var me = this,            node,            newNode,            highlighted;                if (me.viewReady) {            node = me.getNode(record);            newNode = me.callParent(arguments);            highlighted = me.highlightedItem;                        if (highlighted && highlighted === node) {                delete me.highlightedItem;                if (newNode) {                    me.highlightItem(newNode);                }            }        }    },    refresh: function() {        this.clearHighlight();        this.callParent(arguments);    }});</pre></body></html>
 |