<!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-list-ListView-method-constructor'><span id='Ext-list-ListView'>/** </span></span> * @class Ext.list.ListView * @extends Ext.DataView * <p>Ext.list.ListView is a fast and light-weight implentation of a * {@link Ext.grid.GridPanel Grid} like view with the following characteristics:</p> * <div class="mdetail-params"><ul> * <li>resizable columns</li> * <li>selectable</li> * <li>column widths are initially proportioned by percentage based on the container * width and number of columns</li> * <li>uses templates to render the data in any required format</li> * <li>no horizontal scrolling</li> * <li>no editing</li> * </ul></div> * <p>Example usage:</p> * <pre><code> // consume JSON of this form: { "images":[ { "name":"dance_fever.jpg", "size":2067, "lastmod":1236974993000, "url":"images\/thumbs\/dance_fever.jpg" }, { "name":"zack_sink.jpg", "size":2303, "lastmod":1236974993000, "url":"images\/thumbs\/zack_sink.jpg" } ] } var store = new Ext.data.JsonStore({ url: 'get-images.php', root: 'images', fields: [ 'name', 'url', {name:'size', type: 'float'}, {name:'lastmod', type:'date', dateFormat:'timestamp'} ] }); store.load(); var listView = new Ext.list.ListView({ store: store, multiSelect: true, emptyText: 'No images to display', reserveScrollOffset: true, columns: [{ header: 'File', width: .5, dataIndex: 'name' },{ header: 'Last Modified', width: .35, dataIndex: 'lastmod', tpl: '{lastmod:date("m-d h:i a")}' },{ header: 'Size', dataIndex: 'size', tpl: '{size:fileSize}', // format using Ext.util.Format.fileSize() align: 'right' }] }); // put it in a Panel so it looks pretty var panel = new Ext.Panel({ id:'images-view', width:425, height:250, collapsible:true, layout:'fit', title:'Simple ListView <i>(0 items selected)</i>', items: listView }); panel.render(document.body); // little bit of feedback listView.on('selectionchange', function(view, nodes){ var l = nodes.length; var s = l != 1 ? 's' : ''; panel.setTitle('Simple ListView <i>('+l+' item'+s+' selected)</i>'); }); * </code></pre> * @constructor * @param {Object} config * @xtype listview */ Ext.list.ListView = Ext.extend(Ext.DataView, { <span id='Ext-list-ListView-property-disableHeaders'> /** </span> * Set this property to <tt>true</tt> to disable the header click handler disabling sort * (defaults to <tt>false</tt>). * @type Boolean * @property disableHeaders */ <span id='Ext-list-ListView-cfg-hideHeaders'> /** </span> * @cfg {Boolean} hideHeaders * <tt>true</tt> to hide the {@link #internalTpl header row} (defaults to <tt>false</tt> so * the {@link #internalTpl header row} will be shown). */ <span id='Ext-list-ListView-cfg-itemSelector'> /** </span> * @cfg {String} itemSelector * Defaults to <tt>'dl'</tt> to work with the preconfigured <b><tt>{@link Ext.DataView#tpl tpl}</tt></b>. * This setting specifies the CSS selector (e.g. <tt>div.some-class</tt> or <tt>span:first-child</tt>) * that will be used to determine what nodes the ListView will be working with. */ itemSelector: 'dl', <span id='Ext-list-ListView-cfg-selectedClass'> /** </span> * @cfg {String} selectedClass The CSS class applied to a selected row (defaults to * <tt>'x-list-selected'</tt>). An example overriding the default styling: <pre><code> .x-list-selected {background-color: yellow;} </code></pre> * @type String */ selectedClass:'x-list-selected', <span id='Ext-list-ListView-cfg-overClass'> /** </span> * @cfg {String} overClass The CSS class applied when over a row (defaults to * <tt>'x-list-over'</tt>). An example overriding the default styling: <pre><code> .x-list-over {background-color: orange;} </code></pre> * @type String */ overClass:'x-list-over', <span id='Ext-list-ListView-cfg-reserveScrollOffset'> /** </span> * @cfg {Boolean} reserveScrollOffset * By default will defer accounting for the configured <b><tt>{@link #scrollOffset}</tt></b> * for 10 milliseconds. Specify <tt>true</tt> to account for the configured * <b><tt>{@link #scrollOffset}</tt></b> immediately. */ <span id='Ext-list-ListView-cfg-scrollOffset'> /** </span> * @cfg {Number} scrollOffset The amount of space to reserve for the scrollbar (defaults to * <tt>undefined</tt>). If an explicit value isn't specified, this will be automatically * calculated. */ scrollOffset : undefined, <span id='Ext-list-ListView-cfg-columnResize'> /** </span> * @cfg {Boolean/Object} columnResize * Specify <tt>true</tt> or specify a configuration object for {@link Ext.list.ListView.ColumnResizer} * to enable the columns to be resizable (defaults to <tt>true</tt>). */ columnResize: true, <span id='Ext-list-ListView-cfg-columns'> /** </span> * @cfg {Array} columns An array of column configuration objects, for example: * <pre><code> { align: 'right', dataIndex: 'size', header: 'Size', tpl: '{size:fileSize}', width: .35 } * </code></pre> * Acceptable properties for each column configuration object are: * <div class="mdetail-params"><ul> * <li><b><tt>align</tt></b> : String<div class="sub-desc">Set the CSS text-align property * of the column. Defaults to <tt>'left'</tt>.</div></li> * <li><b><tt>dataIndex</tt></b> : String<div class="sub-desc">See {@link Ext.grid.Column}. * {@link Ext.grid.Column#dataIndex dataIndex} for details.</div></li> * <li><b><tt>header</tt></b> : String<div class="sub-desc">See {@link Ext.grid.Column}. * {@link Ext.grid.Column#header header} for details.</div></li> * <li><b><tt>tpl</tt></b> : String<div class="sub-desc">Specify a string to pass as the * configuration string for {@link Ext.XTemplate}. By default an {@link Ext.XTemplate} * will be implicitly created using the <tt>dataIndex</tt>.</div></li> * <li><b><tt>width</tt></b> : Number<div class="sub-desc">Percentage of the container width * this column should be allocated. Columns that have no width specified will be * allocated with an equal percentage to fill 100% of the container width. To easily take * advantage of the full container width, leave the width of at least one column undefined. * Note that if you do not want to take up the full width of the container, the width of * every column needs to be explicitly defined.</div></li> * </ul></div> */ <span id='Ext-list-ListView-cfg-columnSort'> /** </span> * @cfg {Boolean/Object} columnSort * Specify <tt>true</tt> or specify a configuration object for {@link Ext.list.ListView.Sorter} * to enable the columns to be sortable (defaults to <tt>true</tt>). */ columnSort: true, <span id='Ext-list-ListView-cfg-internalTpl'> /** </span> * @cfg {String/Array} internalTpl * The template to be used for the header row. See {@link #tpl} for more details. */ <span id='Ext-list-ListView-property-maxColumnWidth'> /* </span> * IE has issues when setting percentage based widths to 100%. Default to 99. */ maxColumnWidth: Ext.isIE9m ? 99 : 100, <span id='Ext-list-ListView-method-initComponent'> initComponent : function(){ </span> if(this.columnResize){ this.colResizer = new Ext.list.ColumnResizer(this.colResizer); this.colResizer.init(this); } if(this.columnSort){ this.colSorter = new Ext.list.Sorter(this.columnSort); this.colSorter.init(this); } if(!this.internalTpl){ this.internalTpl = new Ext.XTemplate( '<div class="x-list-header"><div class="x-list-header-inner">', '<tpl for="columns">', '<div style="width:{[values.width*100]}%;text-align:{align};"><em class="x-unselectable" unselectable="on" id="',this.id, '-xlhd-{#}">', '{header}', '</em></div>', '</tpl>', '<div class="x-clear"></div>', '</div></div>', '<div class="x-list-body"><div class="x-list-body-inner">', '</div></div>' ); } if(!this.tpl){ this.tpl = new Ext.XTemplate( '<tpl for="rows">', '<dl>', '<tpl for="parent.columns">', '<dt style="width:{[values.width*100]}%;text-align:{align};">', '<em unselectable="on"<tpl if="cls"> class="{cls}</tpl>">', '{[values.tpl.apply(parent)]}', '</em></dt>', '</tpl>', '<div class="x-clear"></div>', '</dl>', '</tpl>' ); }; var cs = this.columns, allocatedWidth = 0, colsWithWidth = 0, len = cs.length, columns = []; for(var i = 0; i < len; i++){ var c = cs[i]; if(!c.isColumn) { c.xtype = c.xtype ? (/^lv/.test(c.xtype) ? c.xtype : 'lv' + c.xtype) : 'lvcolumn'; c = Ext.create(c); } if(c.width) { allocatedWidth += c.width*100; if(allocatedWidth > this.maxColumnWidth){ c.width -= (allocatedWidth - this.maxColumnWidth) / 100; } colsWithWidth++; } columns.push(c); } cs = this.columns = columns; // auto calculate missing column widths if(colsWithWidth < len){ var remaining = len - colsWithWidth; if(allocatedWidth < this.maxColumnWidth){ var perCol = ((this.maxColumnWidth-allocatedWidth) / remaining)/100; for(var j = 0; j < len; j++){ var c = cs[j]; if(!c.width){ c.width = perCol; } } } } Ext.list.ListView.superclass.initComponent.call(this); }, <span id='Ext-list-ListView-method-onRender'> onRender : function(){ </span> this.autoEl = { cls: 'x-list-wrap' }; Ext.list.ListView.superclass.onRender.apply(this, arguments); this.internalTpl.overwrite(this.el, {columns: this.columns}); this.innerBody = Ext.get(this.el.dom.childNodes[1].firstChild); this.innerHd = Ext.get(this.el.dom.firstChild.firstChild); if(this.hideHeaders){ this.el.dom.firstChild.style.display = 'none'; } }, <span id='Ext-list-ListView-method-getTemplateTarget'> getTemplateTarget : function(){ </span> return this.innerBody; }, <span id='Ext-list-ListView-method-collectData'> /** </span> * <p>Function which can be overridden which returns the data object passed to this * view's {@link #tpl template} to render the whole ListView. The returned object * shall contain the following properties:</p> * <div class="mdetail-params"><ul> * <li><b>columns</b> : String<div class="sub-desc">See <tt>{@link #columns}</tt></div></li> * <li><b>rows</b> : String<div class="sub-desc">See * <tt>{@link Ext.DataView}.{@link Ext.DataView#collectData collectData}</div></li> * </ul></div> * @param {Array} records An Array of {@link Ext.data.Record}s to be rendered into the DataView. * @param {Number} startIndex the index number of the Record being prepared for rendering. * @return {Object} A data object containing properties to be processed by a repeating * XTemplate as described above. */ collectData : function(){ var rs = Ext.list.ListView.superclass.collectData.apply(this, arguments); return { columns: this.columns, rows: rs }; }, <span id='Ext-list-ListView-method-verifyInternalSize'> verifyInternalSize : function(){ </span> if(this.lastSize){ this.onResize(this.lastSize.width, this.lastSize.height); } }, <span id='Ext-list-ListView-method-onResize'> // private </span> onResize : function(w, h){ var body = this.innerBody.dom, header = this.innerHd.dom, scrollWidth = w - Ext.num(this.scrollOffset, Ext.getScrollBarWidth()) + 'px', parentNode; if(!body){ return; } parentNode = body.parentNode; if(Ext.isNumber(w)){ if(this.reserveScrollOffset || ((parentNode.offsetWidth - parentNode.clientWidth) > 10)){ body.style.width = scrollWidth; header.style.width = scrollWidth; }else{ body.style.width = w + 'px'; header.style.width = w + 'px'; setTimeout(function(){ if((parentNode.offsetWidth - parentNode.clientWidth) > 10){ body.style.width = scrollWidth; header.style.width = scrollWidth; } }, 10); } } if(Ext.isNumber(h)){ parentNode.style.height = Math.max(0, h - header.parentNode.offsetHeight) + 'px'; } }, <span id='Ext-list-ListView-method-updateIndexes'> updateIndexes : function(){ </span> Ext.list.ListView.superclass.updateIndexes.apply(this, arguments); this.verifyInternalSize(); }, <span id='Ext-list-ListView-method-findHeaderIndex'> findHeaderIndex : function(header){ </span> header = header.dom || header; var parentNode = header.parentNode, children = parentNode.parentNode.childNodes, i = 0, c; for(; c = children[i]; i++){ if(c == parentNode){ return i; } } return -1; }, <span id='Ext-list-ListView-method-setHdWidths'> setHdWidths : function(){ </span> var els = this.innerHd.dom.getElementsByTagName('div'), i = 0, columns = this.columns, len = columns.length; for(; i < len; i++){ els[i].style.width = (columns[i].width*100) + '%'; } } }); Ext.reg('listview', Ext.list.ListView); // Backwards compatibility alias Ext.ListView = Ext.list.ListView;</pre> </body> </html>