1505 lines
No EOL
59 KiB
HTML
1505 lines
No EOL
59 KiB
HTML
<html><head><title>GridView.js</title><link rel="stylesheet" type="text/css" href="../resources/style.css" media="screen"/></head><body><h1>GridView.js</h1><pre class="highlighted"><code><i>/**
|
|
* @class Ext.grid.GridView
|
|
* @extends AbstractGridView
|
|
* The <b>default</b> GridView implementation
|
|
* @constructor
|
|
* @param {Object} config
|
|
*/</i>
|
|
|
|
Ext.grid.GridView = <b>function</b>(config){
|
|
Ext.grid.GridView.superclass.constructor.call(<b>this</b>);
|
|
<b>this</b>.el = null;
|
|
|
|
Ext.apply(<b>this</b>, config);
|
|
};
|
|
|
|
Ext.extend(Ext.grid.GridView, Ext.grid.AbstractGridView, {
|
|
|
|
<i>/**
|
|
* Override <b>this</b> function to apply custom css classes to rows during rendering
|
|
* @param {Record} record The record
|
|
* @param {Number} index
|
|
* @method getRowClass
|
|
*/</i>
|
|
rowClass : "x-grid-row",
|
|
|
|
cellClass : "x-grid-col",
|
|
|
|
tdClass : "x-grid-td",
|
|
|
|
hdClass : "x-grid-hd",
|
|
|
|
splitClass : "x-grid-split",
|
|
|
|
sortClasses : ["sort-asc", "sort-desc"],
|
|
|
|
enableMoveAnim : false,
|
|
|
|
hlColor: "C3DAF9",
|
|
|
|
dh : Ext.DomHelper,
|
|
|
|
fly : Ext.Element.fly,
|
|
|
|
css : Ext.util.CSS,
|
|
|
|
borderWidth: 1,
|
|
|
|
splitOffset: 3,
|
|
|
|
scrollIncrement : 22,
|
|
|
|
cellRE: /(?:.*?)x-grid-(?:hd|cell|csplit)-(?:[\d]+)-([\d]+)(?:.*?)/,
|
|
|
|
findRE: /\s?(?:x-grid-hd|x-grid-col|x-grid-csplit)\s/,
|
|
|
|
bind : <b>function</b>(ds, cm){
|
|
<b>if</b>(this.ds){
|
|
<b>this</b>.ds.un("load", <b>this</b>.onLoad, <b>this</b>);
|
|
<b>this</b>.ds.un("datachanged", <b>this</b>.onDataChange);
|
|
<b>this</b>.ds.un("add", <b>this</b>.onAdd);
|
|
<b>this</b>.ds.un("remove", <b>this</b>.onRemove);
|
|
<b>this</b>.ds.un("update", <b>this</b>.onUpdate);
|
|
<b>this</b>.ds.un("clear", <b>this</b>.onClear);
|
|
}
|
|
<b>if</b>(ds){
|
|
ds.on("load", <b>this</b>.onLoad, <b>this</b>);
|
|
ds.on("datachanged", <b>this</b>.onDataChange, <b>this</b>);
|
|
ds.on("add", <b>this</b>.onAdd, <b>this</b>);
|
|
ds.on("remove", <b>this</b>.onRemove, <b>this</b>);
|
|
ds.on("update", <b>this</b>.onUpdate, <b>this</b>);
|
|
ds.on("clear", <b>this</b>.onClear, <b>this</b>);
|
|
}
|
|
<b>this</b>.ds = ds;
|
|
|
|
<b>if</b>(this.cm){
|
|
<b>this</b>.cm.un("widthchange", <b>this</b>.onColWidthChange, <b>this</b>);
|
|
<b>this</b>.cm.un("headerchange", <b>this</b>.onHeaderChange, <b>this</b>);
|
|
<b>this</b>.cm.un("hiddenchange", <b>this</b>.onHiddenChange, <b>this</b>);
|
|
<b>this</b>.cm.un("columnmoved", <b>this</b>.onColumnMove, <b>this</b>);
|
|
<b>this</b>.cm.un("columnlockchange", <b>this</b>.onColumnLock, <b>this</b>);
|
|
}
|
|
<b>if</b>(cm){
|
|
<b>this</b>.generateRules(cm);
|
|
cm.on("widthchange", <b>this</b>.onColWidthChange, <b>this</b>);
|
|
cm.on("headerchange", <b>this</b>.onHeaderChange, <b>this</b>);
|
|
cm.on("hiddenchange", <b>this</b>.onHiddenChange, <b>this</b>);
|
|
cm.on("columnmoved", <b>this</b>.onColumnMove, <b>this</b>);
|
|
cm.on("columnlockchange", <b>this</b>.onColumnLock, <b>this</b>);
|
|
}
|
|
<b>this</b>.cm = cm;
|
|
},
|
|
|
|
init: <b>function</b>(grid){
|
|
Ext.grid.GridView.superclass.init.call(<b>this</b>, grid);
|
|
|
|
<b>this</b>.bind(grid.dataSource, grid.colModel);
|
|
|
|
grid.on("headerclick", <b>this</b>.handleHeaderClick, <b>this</b>);
|
|
|
|
<b>if</b>(grid.trackMouseOver){
|
|
grid.on("mouseover", <b>this</b>.onRowOver, <b>this</b>);
|
|
grid.on("mouseout", <b>this</b>.onRowOut, <b>this</b>);
|
|
}
|
|
grid.cancelTextSelection = <b>function</b>(){};
|
|
<b>this</b>.gridId = grid.id;
|
|
|
|
<b>var</b> tpls = <b>this</b>.templates || {};
|
|
|
|
<b>if</b>(!tpls.master){
|
|
tpls.master = <b>new</b> Ext.Template(
|
|
'<div class="x-grid" hidefocus="true">',
|
|
'<div class="x-grid-topbar"></div>',
|
|
'<div class="x-grid-scroller"><div></div></div>',
|
|
'<div class="x-grid-locked">',
|
|
'<div class="x-grid-header">{lockedHeader}</div>',
|
|
'<div class="x-grid-body">{lockedBody}</div>',
|
|
"</div>",
|
|
'<div class="x-grid-viewport">',
|
|
'<div class="x-grid-header">{header}</div>',
|
|
'<div class="x-grid-body">{body}</div>',
|
|
"</div>",
|
|
'<div class="x-grid-bottombar"></div>',
|
|
'<a href="#" class="x-grid-focus" tabIndex="-1"></a>',
|
|
'<div class="x-grid-resize-proxy">&#160;</div>',
|
|
"</div>"
|
|
);
|
|
tpls.master.disableformats = true;
|
|
}
|
|
|
|
<b>if</b>(!tpls.header){
|
|
tpls.header = <b>new</b> Ext.Template(
|
|
'<table border="0" cellspacing="0" cellpadding="0">',
|
|
'<tbody><tr class="x-grid-hd-row">{cells}</tr></tbody>',
|
|
"</table>{splits}"
|
|
);
|
|
tpls.header.disableformats = true;
|
|
}
|
|
tpls.header.compile();
|
|
|
|
<b>if</b>(!tpls.hcell){
|
|
tpls.hcell = <b>new</b> Ext.Template(
|
|
'<td class="x-grid-hd x-grid-td-{id} {cellId}"><div title="{title}" class="x-grid-hd-inner x-grid-hd-{id}">',
|
|
'<div class="x-grid-hd-text" unselectable="on">{value}<img class="x-grid-sort-icon" src="', Ext.BLANK_IMAGE_URL, '" /></div>',
|
|
"</div></td>"
|
|
);
|
|
tpls.hcell.disableFormats = true;
|
|
}
|
|
tpls.hcell.compile();
|
|
|
|
<b>if</b>(!tpls.hsplit){
|
|
tpls.hsplit = <b>new</b> Ext.Template('<div class="x-grid-split {splitId} x-grid-split-{id}" style="{style}" unselectable="on">&#160;</div>');
|
|
tpls.hsplit.disableFormats = true;
|
|
}
|
|
tpls.hsplit.compile();
|
|
|
|
<b>if</b>(!tpls.body){
|
|
tpls.body = <b>new</b> Ext.Template(
|
|
'<table border="0" cellspacing="0" cellpadding="0">',
|
|
"<tbody>{rows}</tbody>",
|
|
"</table>"
|
|
);
|
|
tpls.body.disableFormats = true;
|
|
}
|
|
tpls.body.compile();
|
|
|
|
<b>if</b>(!tpls.row){
|
|
tpls.row = <b>new</b> Ext.Template('<tr class="x-grid-row {alt}">{cells}</tr>');
|
|
tpls.row.disableFormats = true;
|
|
}
|
|
tpls.row.compile();
|
|
|
|
<b>if</b>(!tpls.cell){
|
|
tpls.cell = <b>new</b> Ext.Template(
|
|
'<td class="x-grid-col x-grid-td-{id} {cellId} {css}" tabIndex="0">',
|
|
'<div class="x-grid-col-{id} x-grid-cell-inner"><div class="x-grid-cell-text" unselectable="on" {attr}>{value}</div></div>',
|
|
"</td>"
|
|
);
|
|
tpls.cell.disableFormats = true;
|
|
}
|
|
tpls.cell.compile();
|
|
|
|
<b>this</b>.templates = tpls;
|
|
},
|
|
|
|
<i>// remap these <b>for</b> backwards compat</i>
|
|
onColWidthChange : <b>function</b>(){
|
|
<b>this</b>.updateColumns.apply(<b>this</b>, arguments);
|
|
},
|
|
onHeaderChange : <b>function</b>(){
|
|
<b>this</b>.updateHeaders.apply(<b>this</b>, arguments);
|
|
},
|
|
onHiddenChange : <b>function</b>(){
|
|
<b>this</b>.handleHiddenChange.apply(<b>this</b>, arguments);
|
|
},
|
|
onColumnMove : <b>function</b>(){
|
|
<b>this</b>.handleColumnMove.apply(<b>this</b>, arguments);
|
|
},
|
|
onColumnLock : <b>function</b>(){
|
|
<b>this</b>.handleLockChange.apply(<b>this</b>, arguments);
|
|
},
|
|
|
|
onDataChange : <b>function</b>(){
|
|
<b>this</b>.refresh();
|
|
<b>this</b>.updateHeaderSortState();
|
|
},
|
|
|
|
onClear : <b>function</b>(){
|
|
<b>this</b>.refresh();
|
|
},
|
|
|
|
onUpdate : <b>function</b>(ds, record){
|
|
<b>this</b>.refreshRow(record);
|
|
},
|
|
|
|
refreshRow : <b>function</b>(record){
|
|
<b>var</b> ds = <b>this</b>.ds, index;
|
|
<b>if</b>(typeof record == 'number'){
|
|
index = record;
|
|
record = ds.getAt(index);
|
|
}<b>else</b>{
|
|
index = ds.indexOf(record);
|
|
}
|
|
<b>var</b> rows = <b>this</b>.getRowComposite(index);
|
|
<b>var</b> cls = [];
|
|
<b>this</b>.insertRows(ds, index, index, true);
|
|
<b>this</b>.onRemove(ds, record, index+1, true);
|
|
<b>this</b>.syncRowHeights(index, index);
|
|
<b>this</b>.layout();
|
|
<b>this</b>.fireEvent("rowupdated", <b>this</b>, index, record);
|
|
},
|
|
|
|
onAdd : <b>function</b>(ds, records, index){
|
|
<b>this</b>.insertRows(ds, index, index + (records.length-1));
|
|
},
|
|
|
|
onRemove : <b>function</b>(ds, record, index, isUpdate){
|
|
<b>if</b>(isUpdate !== true){
|
|
<b>this</b>.fireEvent("beforerowremoved", <b>this</b>, index, record);
|
|
}
|
|
<b>var</b> bt = <b>this</b>.getBodyTable(), lt = <b>this</b>.getLockedTable();
|
|
<b>if</b>(bt.rows[index]){
|
|
bt.firstChild.removeChild(bt.rows[index]);
|
|
}
|
|
<b>if</b>(lt.rows[index]){
|
|
lt.firstChild.removeChild(lt.rows[index]);
|
|
}
|
|
<b>if</b>(isUpdate !== true){
|
|
<b>this</b>.stripeRows(index);
|
|
<b>this</b>.syncRowHeights(index, index);
|
|
<b>this</b>.layout();
|
|
<b>this</b>.fireEvent("rowremoved", <b>this</b>, index, record);
|
|
}
|
|
},
|
|
|
|
onLoad : <b>function</b>(){
|
|
<b>this</b>.scrollToTop();
|
|
},
|
|
|
|
<i>/**
|
|
* Scrolls the grid to the top
|
|
*/</i>
|
|
scrollToTop : <b>function</b>(){
|
|
<b>if</b>(this.scroller){
|
|
<b>this</b>.scroller.dom.scrollTop = 0;
|
|
<b>this</b>.syncScroll();
|
|
}
|
|
},
|
|
|
|
<i>/**
|
|
* Gets a panel <b>in</b> the header of the grid that can be used <b>for</b> toolbars etc.
|
|
* After modifying the contents of <b>this</b> panel a call to grid.autoSize() may be
|
|
* required to register any changes <b>in</b> size.
|
|
* @param {Boolean} doShow By <b>default</b> the header is hidden. Pass true to show the panel
|
|
* @<b>return</b> Ext.Element
|
|
*/</i>
|
|
getHeaderPanel : <b>function</b>(doShow){
|
|
<b>if</b>(doShow){
|
|
<b>this</b>.headerPanel.show();
|
|
}
|
|
<b>return</b> this.headerPanel;
|
|
},
|
|
|
|
<i>/**
|
|
* Gets a panel <b>in</b> the footer of the grid that can be used <b>for</b> toolbars etc.
|
|
* After modifying the contents of <b>this</b> panel a call to grid.autoSize() may be
|
|
* required to register any changes <b>in</b> size.
|
|
* @param {Boolean} doShow By <b>default</b> the footer is hidden. Pass true to show the panel
|
|
* @<b>return</b> Ext.Element
|
|
*/</i>
|
|
getFooterPanel : <b>function</b>(doShow){
|
|
<b>if</b>(doShow){
|
|
<b>this</b>.footerPanel.show();
|
|
}
|
|
<b>return</b> this.footerPanel;
|
|
},
|
|
|
|
initElements : <b>function</b>(){
|
|
<b>var</b> E = Ext.Element;
|
|
<b>var</b> el = <b>this</b>.grid.container.dom.firstChild;
|
|
<b>var</b> cs = el.childNodes;
|
|
|
|
<b>this</b>.el = <b>new</b> E(el);
|
|
<b>this</b>.headerPanel = <b>new</b> E(el.firstChild);
|
|
<b>this</b>.headerPanel.enableDisplayMode("block");
|
|
|
|
<b>this</b>.scroller = <b>new</b> E(cs[1]);
|
|
<b>this</b>.scrollSizer = <b>new</b> E(<b>this</b>.scroller.dom.firstChild);
|
|
|
|
<b>this</b>.lockedWrap = <b>new</b> E(cs[2]);
|
|
<b>this</b>.lockedHd = <b>new</b> E(<b>this</b>.lockedWrap.dom.firstChild);
|
|
<b>this</b>.lockedBody = <b>new</b> E(<b>this</b>.lockedWrap.dom.childNodes[1]);
|
|
|
|
<b>this</b>.mainWrap = <b>new</b> E(cs[3]);
|
|
<b>this</b>.mainHd = <b>new</b> E(<b>this</b>.mainWrap.dom.firstChild);
|
|
<b>this</b>.mainBody = <b>new</b> E(<b>this</b>.mainWrap.dom.childNodes[1]);
|
|
|
|
<b>this</b>.footerPanel = <b>new</b> E(cs[4]);
|
|
<b>this</b>.footerPanel.enableDisplayMode("block");
|
|
|
|
<b>this</b>.focusEl = <b>new</b> E(cs[5]);
|
|
<b>this</b>.focusEl.swallowEvent("click", true);
|
|
<b>this</b>.resizeProxy = <b>new</b> E(cs[6]);
|
|
|
|
<b>this</b>.headerSelector = String.format(
|
|
'#{0} td.x-grid-hd, #{1} td.x-grid-hd',
|
|
<b>this</b>.lockedHd.id, <b>this</b>.mainHd.id
|
|
);
|
|
|
|
<b>this</b>.splitterSelector = String.format(
|
|
'#{0} div.x-grid-split, #{1} div.x-grid-split',
|
|
<b>this</b>.lockedHd.id, <b>this</b>.mainHd.id
|
|
);
|
|
},
|
|
|
|
getHeaderCell : <b>function</b>(index){
|
|
<b>return</b> Ext.DomQuery.select(<b>this</b>.headerSelector)[index];
|
|
},
|
|
|
|
getHeaderCellMeasure : <b>function</b>(index){
|
|
<b>return</b> this.getHeaderCell(index).firstChild;
|
|
},
|
|
|
|
getHeaderCellText : <b>function</b>(index){
|
|
<b>return</b> this.getHeaderCell(index).firstChild.firstChild;
|
|
},
|
|
|
|
getLockedTable : <b>function</b>(){
|
|
<b>return</b> this.lockedBody.dom.firstChild;
|
|
},
|
|
|
|
getBodyTable : <b>function</b>(){
|
|
<b>return</b> this.mainBody.dom.firstChild;
|
|
},
|
|
|
|
getLockedRow : <b>function</b>(index){
|
|
<b>return</b> this.getLockedTable().rows[index];
|
|
},
|
|
|
|
getRow : <b>function</b>(index){
|
|
<b>return</b> this.getBodyTable().rows[index];
|
|
},
|
|
|
|
getRowComposite : <b>function</b>(index){
|
|
<b>if</b>(!<b>this</b>.rowEl){
|
|
<b>this</b>.rowEl = <b>new</b> Ext.CompositeElementLite();
|
|
}
|
|
<b>var</b> els = [], lrow, mrow;
|
|
<b>if</b>(lrow = <b>this</b>.getLockedRow(index)){
|
|
els.push(lrow);
|
|
}
|
|
<b>if</b>(mrow = <b>this</b>.getRow(index)){
|
|
els.push(mrow);
|
|
}
|
|
<b>this</b>.rowEl.elements = els;
|
|
<b>return</b> this.rowEl;
|
|
},
|
|
|
|
getCell : <b>function</b>(rowIndex, colIndex){
|
|
<b>var</b> locked = <b>this</b>.cm.getLockedCount();
|
|
<b>var</b> source;
|
|
<b>if</b>(colIndex < locked){
|
|
source = <b>this</b>.lockedBody.dom.firstChild;
|
|
}<b>else</b>{
|
|
source = <b>this</b>.mainBody.dom.firstChild;
|
|
colIndex -= locked;
|
|
}
|
|
<b>return</b> source.rows[rowIndex].childNodes[colIndex];
|
|
},
|
|
|
|
getCellText : <b>function</b>(rowIndex, colIndex){
|
|
<b>return</b> this.getCell(rowIndex, colIndex).firstChild.firstChild;
|
|
},
|
|
|
|
getCellBox : <b>function</b>(cell){
|
|
<b>var</b> b = <b>this</b>.fly(cell).getBox();
|
|
<b>if</b>(Ext.isOpera){ <i>// opera fails to report the Y</i>
|
|
b.y = cell.offsetTop + <b>this</b>.mainBody.getY();
|
|
}
|
|
<b>return</b> b;
|
|
},
|
|
|
|
getCellIndex : <b>function</b>(cell){
|
|
<b>var</b> id = String(cell.className).match(<b>this</b>.cellRE);
|
|
<b>if</b>(id){
|
|
<b>return</b> parseInt(id[1], 10);
|
|
}
|
|
<b>return</b> 0;
|
|
},
|
|
|
|
findHeaderIndex : <b>function</b>(n){
|
|
<b>var</b> r = Ext.fly(n).findParent("td." + <b>this</b>.hdClass, 6);
|
|
<b>return</b> r ? <b>this</b>.getCellIndex(r) : false;
|
|
},
|
|
|
|
findHeaderCell : <b>function</b>(n){
|
|
<b>var</b> r = Ext.fly(n).findParent("td." + <b>this</b>.hdClass, 6);
|
|
<b>return</b> r ? r : false;
|
|
},
|
|
|
|
findRowIndex : <b>function</b>(n){
|
|
<b>if</b>(!n){
|
|
<b>return</b> false;
|
|
}
|
|
<b>var</b> r = Ext.fly(n).findParent("tr." + <b>this</b>.rowClass, 6);
|
|
<b>return</b> r ? r.rowIndex : false;
|
|
},
|
|
|
|
findCellIndex : <b>function</b>(node){
|
|
<b>var</b> stop = <b>this</b>.el.dom;
|
|
<b>while</b>(node && node != stop){
|
|
<b>if</b>(this.findRE.test(node.className)){
|
|
<b>return</b> this.getCellIndex(node);
|
|
}
|
|
node = node.parentNode;
|
|
}
|
|
<b>return</b> false;
|
|
},
|
|
|
|
getColumnId : <b>function</b>(index){
|
|
<b>return</b> this.cm.getColumnId(index);
|
|
},
|
|
|
|
getSplitters : <b>function</b>(){
|
|
<b>if</b>(this.splitterSelector){
|
|
<b>return</b> Ext.DomQuery.select(<b>this</b>.splitterSelector);
|
|
}<b>else</b>{
|
|
<b>return</b> null;
|
|
}
|
|
},
|
|
|
|
getSplitter : <b>function</b>(index){
|
|
<b>return</b> this.getSplitters()[index];
|
|
},
|
|
|
|
onRowOver : <b>function</b>(e, t){
|
|
<b>var</b> row;
|
|
<b>if</b>((row = <b>this</b>.findRowIndex(t)) !== false){
|
|
<b>this</b>.getRowComposite(row).addClass("x-grid-row-over");
|
|
}
|
|
},
|
|
|
|
onRowOut : <b>function</b>(e, t){
|
|
<b>var</b> row;
|
|
<b>if</b>((row = <b>this</b>.findRowIndex(t)) !== false && row !== <b>this</b>.findRowIndex(e.getRelatedTarget())){
|
|
<b>this</b>.getRowComposite(row).removeClass("x-grid-row-over");
|
|
}
|
|
},
|
|
|
|
renderHeaders : <b>function</b>(){
|
|
<b>var</b> cm = <b>this</b>.cm;
|
|
<b>var</b> ct = <b>this</b>.templates.hcell, ht = <b>this</b>.templates.header, st = <b>this</b>.templates.hsplit;
|
|
<b>var</b> cb = [], lb = [], sb = [], lsb = [], p = {};
|
|
<b>for</b>(var i = 0, len = cm.getColumnCount(); i < len; i++){
|
|
p.cellId = "x-grid-hd-0-" + i;
|
|
p.splitId = "x-grid-csplit-0-" + i;
|
|
p.id = cm.getColumnId(i);
|
|
p.title = cm.getColumnTooltip(i) || "";
|
|
p.value = cm.getColumnHeader(i) || "";
|
|
p.style = (<b>this</b>.grid.enableColumnResize === false || !cm.isResizable(i) || cm.isFixed(i)) ? 'cursor:<b>default</b>' : '';
|
|
<b>if</b>(!cm.isLocked(i)){
|
|
cb[cb.length] = ct.apply(p);
|
|
sb[sb.length] = st.apply(p);
|
|
}<b>else</b>{
|
|
lb[lb.length] = ct.apply(p);
|
|
lsb[lsb.length] = st.apply(p);
|
|
}
|
|
}
|
|
<b>return</b> [ht.apply({cells: lb.join(""), splits:lsb.join("")}),
|
|
ht.apply({cells: cb.join(""), splits:sb.join("")})];
|
|
},
|
|
|
|
updateHeaders : <b>function</b>(){
|
|
<b>var</b> html = <b>this</b>.renderHeaders();
|
|
<b>this</b>.lockedHd.update(html[0]);
|
|
<b>this</b>.mainHd.update(html[1]);
|
|
},
|
|
|
|
<i>/**
|
|
* Focuses the specified row.
|
|
* @param {Number} row The row index
|
|
*/</i>
|
|
focusRow : <b>function</b>(row){
|
|
<b>var</b> x = <b>this</b>.scroller.dom.scrollLeft;
|
|
<b>this</b>.focusCell(row, 0, false);
|
|
<b>this</b>.scroller.dom.scrollLeft = x;
|
|
},
|
|
|
|
<i>/**
|
|
* Focuses the specified cell.
|
|
* @param {Number} row The row index
|
|
* @param {Number} col The column index
|
|
* @param {Boolean} hscroll false to disable horizontal scrolling
|
|
*/</i>
|
|
focusCell : <b>function</b>(row, col, hscroll){
|
|
<b>var</b> el = <b>this</b>.ensureVisible(row, col, hscroll);
|
|
<b>this</b>.focusEl.alignTo(el, "tl-tl");
|
|
<b>if</b>(Ext.isGecko){
|
|
<b>this</b>.focusEl.focus();
|
|
}<b>else</b>{
|
|
<b>this</b>.focusEl.focus.defer(1, <b>this</b>.focusEl);
|
|
}
|
|
},
|
|
|
|
<i>/**
|
|
* Scrolls the specified cell into view
|
|
* @param {Number} row The row index
|
|
* @param {Number} col The column index
|
|
* @param {Boolean} hscroll false to disable horizontal scrolling
|
|
*/</i>
|
|
ensureVisible : <b>function</b>(row, col, hscroll){
|
|
<b>if</b>(typeof row != "number"){
|
|
row = row.rowIndex;
|
|
}
|
|
<b>if</b>(row < 0 && row >= <b>this</b>.ds.getCount()){
|
|
<b>return</b>;
|
|
}
|
|
col = (col !== undefined ? col : 0);
|
|
<b>var</b> cm = <b>this</b>.grid.colModel;
|
|
<b>while</b>(cm.isHidden(col)){
|
|
col++;
|
|
}
|
|
|
|
<b>var</b> el = <b>this</b>.getCell(row, col);
|
|
<b>if</b>(!el){
|
|
<b>return</b>;
|
|
}
|
|
<b>var</b> c = <b>this</b>.scroller.dom;
|
|
|
|
<b>var</b> ctop = parseInt(el.offsetTop, 10);
|
|
<b>var</b> cleft = parseInt(el.offsetLeft, 10);
|
|
<b>var</b> cbot = ctop + el.offsetHeight;
|
|
<b>var</b> cright = cleft + el.offsetWidth;
|
|
|
|
<b>var</b> ch = c.clientHeight - <b>this</b>.mainHd.dom.offsetHeight;
|
|
<b>var</b> stop = parseInt(c.scrollTop, 10);
|
|
<b>var</b> sleft = parseInt(c.scrollLeft, 10);
|
|
<b>var</b> sbot = stop + ch;
|
|
<b>var</b> sright = sleft + c.clientWidth;
|
|
|
|
<b>if</b>(ctop < stop){
|
|
c.scrollTop = ctop;
|
|
}<b>else</b> if(cbot > sbot){
|
|
c.scrollTop = cbot-ch;
|
|
}
|
|
|
|
<b>if</b>(hscroll !== false){
|
|
<b>if</b>(cleft < sleft){
|
|
c.scrollLeft = cleft;
|
|
}<b>else</b> if(cright > sright){
|
|
c.scrollLeft = cright-c.clientWidth;
|
|
}
|
|
}
|
|
<b>return</b> el;
|
|
},
|
|
|
|
updateColumns : <b>function</b>(){
|
|
<b>this</b>.grid.stopEditing();
|
|
<b>var</b> cm = <b>this</b>.grid.colModel, colIds = <b>this</b>.getColumnIds();
|
|
<i>//<b>var</b> totalWidth = cm.getTotalWidth();</i>
|
|
<b>var</b> pos = 0;
|
|
<b>for</b>(var i = 0, len = cm.getColumnCount(); i < len; i++){
|
|
<i>//<b>if</b>(cm.isHidden(i)) <b>continue</b>;</i>
|
|
<b>var</b> w = cm.getColumnWidth(i);
|
|
<b>this</b>.css.updateRule(<b>this</b>.colSelector+colIds[i], "width", (w - <b>this</b>.borderWidth) + "px");
|
|
<b>this</b>.css.updateRule(<b>this</b>.hdSelector+colIds[i], "width", (w - <b>this</b>.borderWidth) + "px");
|
|
}
|
|
<b>this</b>.updateSplitters();
|
|
},
|
|
|
|
updateSplitters : <b>function</b>(){
|
|
<b>var</b> cm = <b>this</b>.cm, s = <b>this</b>.getSplitters();
|
|
<b>if</b>(s){ <i>// splitters not created yet</i>
|
|
<b>var</b> pos = 0, locked = true;
|
|
<b>for</b>(var i = 0, len = cm.getColumnCount(); i < len; i++){
|
|
<b>if</b>(cm.isHidden(i)) <b>continue</b>;
|
|
<b>var</b> w = cm.getColumnWidth(i);
|
|
<b>if</b>(!cm.isLocked(i) && locked){
|
|
pos = 0;
|
|
locked = false;
|
|
}
|
|
pos += w;
|
|
s[i].style.left = (pos-<b>this</b>.splitOffset) + "px";
|
|
}
|
|
}
|
|
},
|
|
|
|
handleHiddenChange : <b>function</b>(colModel, colIndex, hidden){
|
|
<b>if</b>(hidden){
|
|
<b>this</b>.hideColumn(colIndex);
|
|
}<b>else</b>{
|
|
<b>this</b>.unhideColumn(colIndex);
|
|
}
|
|
},
|
|
|
|
hideColumn : <b>function</b>(colIndex){
|
|
<b>var</b> cid = <b>this</b>.getColumnId(colIndex);
|
|
<b>this</b>.css.updateRule(<b>this</b>.tdSelector+cid, "display", "none");
|
|
<b>this</b>.css.updateRule(<b>this</b>.splitSelector+cid, "display", "none");
|
|
<b>if</b>(Ext.isSafari){
|
|
<b>this</b>.updateHeaders();
|
|
}
|
|
<b>this</b>.updateSplitters();
|
|
<b>this</b>.layout();
|
|
},
|
|
|
|
unhideColumn : <b>function</b>(colIndex){
|
|
<b>var</b> cid = <b>this</b>.getColumnId(colIndex);
|
|
<b>this</b>.css.updateRule(<b>this</b>.tdSelector+cid, "display", "");
|
|
<b>this</b>.css.updateRule(<b>this</b>.splitSelector+cid, "display", "");
|
|
|
|
<b>if</b>(Ext.isSafari){
|
|
<b>this</b>.updateHeaders();
|
|
}
|
|
<b>this</b>.updateSplitters();
|
|
<b>this</b>.layout();
|
|
},
|
|
|
|
insertRows : <b>function</b>(dm, firstRow, lastRow, isUpdate){
|
|
<b>if</b>(firstRow == 0 && lastRow == dm.getCount()-1){
|
|
<b>this</b>.refresh();
|
|
}<b>else</b>{
|
|
<b>if</b>(!isUpdate){
|
|
<b>this</b>.fireEvent("beforerowsinserted", <b>this</b>, firstRow, lastRow);
|
|
}
|
|
<b>var</b> s = <b>this</b>.getScrollState();
|
|
<b>var</b> markup = <b>this</b>.renderRows(firstRow, lastRow);
|
|
<b>this</b>.bufferRows(markup[0], <b>this</b>.getLockedTable(), firstRow);
|
|
<b>this</b>.bufferRows(markup[1], <b>this</b>.getBodyTable(), firstRow);
|
|
<b>this</b>.restoreScroll(s);
|
|
<b>if</b>(!isUpdate){
|
|
<b>this</b>.fireEvent("rowsinserted", <b>this</b>, firstRow, lastRow);
|
|
<b>this</b>.syncRowHeights(firstRow, lastRow);
|
|
<b>this</b>.stripeRows(firstRow);
|
|
<b>this</b>.layout();
|
|
}
|
|
}
|
|
},
|
|
|
|
bufferRows : <b>function</b>(markup, target, index){
|
|
<b>var</b> before = null, trows = target.rows, tbody = target.tBodies[0];
|
|
<b>if</b>(index < trows.length){
|
|
before = trows[index];
|
|
}
|
|
<b>var</b> b = document.createElement("div");
|
|
b.innerHTML = "<table><tbody>"+markup+"</tbody></table>";
|
|
<b>var</b> rows = b.firstChild.rows;
|
|
<b>for</b>(var i = 0, len = rows.length; i < len; i++){
|
|
<b>if</b>(before){
|
|
tbody.insertBefore(rows[0], before);
|
|
}<b>else</b>{
|
|
tbody.appendChild(rows[0]);
|
|
}
|
|
}
|
|
b.innerHTML = "";
|
|
b = null;
|
|
},
|
|
|
|
deleteRows : <b>function</b>(dm, firstRow, lastRow){
|
|
<b>if</b>(dm.getRowCount()<1){
|
|
<b>this</b>.fireEvent("beforerefresh", <b>this</b>);
|
|
<b>this</b>.mainBody.update("");
|
|
<b>this</b>.lockedBody.update("");
|
|
<b>this</b>.fireEvent("refresh", <b>this</b>);
|
|
}<b>else</b>{
|
|
<b>this</b>.fireEvent("beforerowsdeleted", <b>this</b>, firstRow, lastRow);
|
|
<b>var</b> bt = <b>this</b>.getBodyTable();
|
|
<b>var</b> tbody = bt.firstChild;
|
|
<b>var</b> rows = bt.rows;
|
|
<b>for</b>(var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){
|
|
tbody.removeChild(rows[firstRow]);
|
|
}
|
|
<b>this</b>.stripeRows(firstRow);
|
|
<b>this</b>.fireEvent("rowsdeleted", <b>this</b>, firstRow, lastRow);
|
|
}
|
|
},
|
|
|
|
updateRows : <b>function</b>(dataSource, firstRow, lastRow){
|
|
<b>var</b> s = <b>this</b>.getScrollState();
|
|
<b>this</b>.refresh();
|
|
<b>this</b>.restoreScroll(s);
|
|
},
|
|
|
|
handleSort : <b>function</b>(dataSource, sortColumnIndex, sortDir, noRefresh){
|
|
<b>if</b>(!noRefresh){
|
|
<b>this</b>.refresh();
|
|
}
|
|
<b>this</b>.updateHeaderSortState();
|
|
},
|
|
|
|
getScrollState : <b>function</b>(){
|
|
<b>var</b> sb = <b>this</b>.scroller.dom;
|
|
<b>return</b> {left: sb.scrollLeft, top: sb.scrollTop};
|
|
},
|
|
|
|
stripeRows : <b>function</b>(startRow){
|
|
<b>if</b>(!<b>this</b>.grid.stripeRows || <b>this</b>.ds.getCount() < 1){
|
|
<b>return</b>;
|
|
}
|
|
startRow = startRow || 0;
|
|
<b>var</b> rows = <b>this</b>.getBodyTable().rows;
|
|
<b>var</b> lrows = <b>this</b>.getLockedTable().rows;
|
|
<b>var</b> cls = ' x-grid-row-alt ';
|
|
<b>for</b>(var i = startRow, len = rows.length; i < len; i++){
|
|
<b>var</b> row = rows[i], lrow = lrows[i];
|
|
<b>var</b> isAlt = ((i+1) % 2 == 0);
|
|
<b>var</b> hasAlt = (' '+row.className + ' ').indexOf(cls) != -1;
|
|
<b>if</b>(isAlt == hasAlt){
|
|
<b>continue</b>;
|
|
}
|
|
<b>if</b>(isAlt){
|
|
row.className += " x-grid-row-alt";
|
|
}<b>else</b>{
|
|
row.className = row.className.replace("x-grid-row-alt", "");
|
|
}
|
|
<b>if</b>(lrow){
|
|
lrow.className = row.className;
|
|
}
|
|
}
|
|
},
|
|
|
|
restoreScroll : <b>function</b>(state){
|
|
<b>var</b> sb = <b>this</b>.scroller.dom;
|
|
sb.scrollLeft = state.left;
|
|
sb.scrollTop = state.top;
|
|
<b>this</b>.syncScroll();
|
|
},
|
|
|
|
syncScroll : <b>function</b>(){
|
|
<b>var</b> sb = <b>this</b>.scroller.dom;
|
|
<b>var</b> sh = <b>this</b>.mainHd.dom;
|
|
<b>var</b> bs = <b>this</b>.mainBody.dom;
|
|
<b>var</b> lv = <b>this</b>.lockedBody.dom;
|
|
sh.scrollLeft = bs.scrollLeft = sb.scrollLeft;
|
|
lv.scrollTop = bs.scrollTop = sb.scrollTop;
|
|
},
|
|
|
|
handleScroll : <b>function</b>(e){
|
|
<b>this</b>.syncScroll();
|
|
<b>var</b> sb = <b>this</b>.scroller.dom;
|
|
<b>this</b>.grid.fireEvent("bodyscroll", sb.scrollLeft, sb.scrollTop);
|
|
e.stopEvent();
|
|
},
|
|
|
|
handleWheel : <b>function</b>(e){
|
|
<b>var</b> d = e.getWheelDelta();
|
|
<b>this</b>.scroller.dom.scrollTop -= d*22;
|
|
<i>// set <b>this</b> here to prevent jumpy scrolling on large tables</i>
|
|
<b>this</b>.lockedBody.dom.scrollTop = <b>this</b>.mainBody.dom.scrollTop = <b>this</b>.scroller.dom.scrollTop;
|
|
e.stopEvent();
|
|
},
|
|
|
|
renderRows : <b>function</b>(startRow, endRow){
|
|
<i>// pull <b>in</b> all the crap needed to render rows</i>
|
|
<b>var</b> g = <b>this</b>.grid, cm = g.colModel, ds = g.dataSource, stripe = g.stripeRows;
|
|
<b>var</b> colCount = cm.getColumnCount();
|
|
|
|
<b>if</b>(ds.getCount() < 1){
|
|
<b>return</b> ["", ""];
|
|
}
|
|
|
|
<i>// build a map <b>for</b> all the columns</i>
|
|
<b>var</b> cs = [];
|
|
<b>for</b>(var i = 0; i < colCount; i++){
|
|
<b>var</b> name = cm.getDataIndex(i);
|
|
cs[i] = {
|
|
name : <b>typeof</b> name == 'undefined' ? ds.fields.get(i).name : name,
|
|
renderer : cm.getRenderer(i),
|
|
id : cm.getColumnId(i),
|
|
locked : cm.isLocked(i)
|
|
};
|
|
}
|
|
|
|
startRow = startRow || 0;
|
|
endRow = <b>typeof</b> endRow == "undefined"? ds.getCount()-1 : endRow;
|
|
|
|
<i>// records to render</i>
|
|
<b>var</b> rs = ds.getRange(startRow, endRow);
|
|
|
|
<b>return</b> this.doRender(cs, rs, ds, startRow, colCount, stripe);
|
|
},
|
|
|
|
<i>// As much as I hate to duplicate code, <b>this</b> was branched because FireFox really hates</i>
|
|
<i>// [].join("") on strings. The performance difference was substantial enough to</i>
|
|
<i>// branch <b>this</b> function</i>
|
|
doRender : Ext.isGecko ?
|
|
<b>function</b>(cs, rs, ds, startRow, colCount, stripe){
|
|
<b>var</b> ts = <b>this</b>.templates, ct = ts.cell, rt = ts.row;
|
|
<i>// buffers</i>
|
|
<b>var</b> buf = "", lbuf = "", cb, lcb, c, p = {}, rp = {}, r;
|
|
<b>for</b>(var j = 0, len = rs.length; j < len; j++){
|
|
r = rs[j], cb = "", lcb = "", rowIndex = (j+startRow);
|
|
<b>for</b>(var i = 0; i < colCount; i++){
|
|
c = cs[i];
|
|
p.cellId = "x-grid-cell-" + rowIndex + "-" + i;
|
|
p.id = c.id;
|
|
p.css = p.attr = "";
|
|
p.value = c.renderer(r.data[c.name], p, r, rowIndex, i, ds);
|
|
<b>if</b>(p.value == undefined || p.value === "") p.value = "&#160;";
|
|
<b>if</b>(r.dirty && <b>typeof</b> r.modified[c.name] !== 'undefined'){
|
|
p.css += p.css ? ' x-grid-dirty-cell' : 'x-grid-dirty-cell';
|
|
}
|
|
<b>var</b> markup = ct.apply(p);
|
|
<b>if</b>(!c.locked){
|
|
cb+= markup;
|
|
}<b>else</b>{
|
|
lcb+= markup;
|
|
}
|
|
}
|
|
<b>var</b> alt = [];
|
|
<b>if</b>(stripe && ((rowIndex+1) % 2 == 0)){
|
|
alt[0] = "x-grid-row-alt";
|
|
}
|
|
<b>if</b>(r.dirty){
|
|
alt[1] = " x-grid-dirty-row";
|
|
}
|
|
rp.cells = lcb;
|
|
<b>if</b>(this.getRowClass){
|
|
alt[2] = <b>this</b>.getRowClass(r, rowIndex);
|
|
}
|
|
rp.alt = alt.join(" ");
|
|
lbuf+= rt.apply(rp);
|
|
rp.cells = cb;
|
|
buf+= rt.apply(rp);
|
|
}
|
|
<b>return</b> [lbuf, buf];
|
|
} :
|
|
<b>function</b>(cs, rs, ds, startRow, colCount, stripe){
|
|
<b>var</b> ts = <b>this</b>.templates, ct = ts.cell, rt = ts.row;
|
|
<i>// buffers</i>
|
|
<b>var</b> buf = [], lbuf = [], cb, lcb, c, p = {}, rp = {}, r;
|
|
<b>for</b>(var j = 0, len = rs.length; j < len; j++){
|
|
r = rs[j], cb = [], lcb = [], rowIndex = (j+startRow);
|
|
<b>for</b>(var i = 0; i < colCount; i++){
|
|
c = cs[i];
|
|
p.cellId = "x-grid-cell-" + rowIndex + "-" + i;
|
|
p.id = c.id;
|
|
p.css = p.attr = "";
|
|
p.value = c.renderer(r.data[c.name], p, r, rowIndex, i, ds);
|
|
<b>if</b>(p.value == undefined || p.value === "") p.value = "&#160;";
|
|
<b>if</b>(r.dirty && <b>typeof</b> r.modified[c.name] !== 'undefined'){
|
|
p.css += p.css ? ' x-grid-dirty-cell' : 'x-grid-dirty-cell';
|
|
}
|
|
<b>var</b> markup = ct.apply(p);
|
|
<b>if</b>(!c.locked){
|
|
cb[cb.length] = markup;
|
|
}<b>else</b>{
|
|
lcb[lcb.length] = markup;
|
|
}
|
|
}
|
|
<b>var</b> alt = [];
|
|
<b>if</b>(stripe && ((rowIndex+1) % 2 == 0)){
|
|
alt[0] = "x-grid-row-alt";
|
|
}
|
|
<b>if</b>(r.dirty){
|
|
alt[1] = " x-grid-dirty-row";
|
|
}
|
|
rp.cells = lcb;
|
|
<b>if</b>(this.getRowClass){
|
|
alt[2] = <b>this</b>.getRowClass(r, rowIndex);
|
|
}
|
|
rp.alt = alt.join(" ");
|
|
rp.cells = lcb.join("");
|
|
lbuf[lbuf.length] = rt.apply(rp);
|
|
rp.cells = cb.join("");
|
|
buf[buf.length] = rt.apply(rp);
|
|
}
|
|
<b>return</b> [lbuf.join(""), buf.join("")];
|
|
},
|
|
|
|
renderBody : <b>function</b>(){
|
|
<b>var</b> markup = <b>this</b>.renderRows();
|
|
<b>var</b> bt = <b>this</b>.templates.body;
|
|
<b>return</b> [bt.apply({rows: markup[0]}), bt.apply({rows: markup[1]})];
|
|
},
|
|
|
|
<i>/**
|
|
* Refreshes the grid
|
|
* @param {Boolean} headersToo
|
|
*/</i>
|
|
refresh : <b>function</b>(headersToo){
|
|
<b>this</b>.fireEvent("beforerefresh", <b>this</b>);
|
|
<b>this</b>.grid.stopEditing();
|
|
<b>var</b> result = <b>this</b>.renderBody();
|
|
<b>this</b>.lockedBody.update(result[0]);
|
|
<b>this</b>.mainBody.update(result[1]);
|
|
<b>if</b>(headersToo === true){
|
|
<b>this</b>.updateHeaders();
|
|
<b>this</b>.updateColumns();
|
|
<b>this</b>.updateSplitters();
|
|
<b>this</b>.updateHeaderSortState();
|
|
}
|
|
<b>this</b>.syncRowHeights();
|
|
<b>this</b>.layout();
|
|
<b>this</b>.fireEvent("refresh", <b>this</b>);
|
|
},
|
|
|
|
handleColumnMove : <b>function</b>(cm, oldIndex, newIndex){
|
|
<b>this</b>.indexMap = null;
|
|
<b>var</b> s = <b>this</b>.getScrollState();
|
|
<b>this</b>.refresh(true);
|
|
<b>this</b>.restoreScroll(s);
|
|
<b>this</b>.afterMove(newIndex);
|
|
},
|
|
|
|
afterMove : <b>function</b>(colIndex){
|
|
<b>if</b>(this.enableMoveAnim && Ext.enableFx){
|
|
<b>this</b>.fly(<b>this</b>.getHeaderCell(colIndex).firstChild).highlight(<b>this</b>.hlColor);
|
|
}
|
|
},
|
|
|
|
updateCell : <b>function</b>(dm, rowIndex, dataIndex){
|
|
<b>var</b> colIndex = <b>this</b>.getColumnIndexByDataIndex(dataIndex);
|
|
<b>if</b>(typeof colIndex == "undefined"){ <i>// not present <b>in</b> grid</i>
|
|
<b>return</b>;
|
|
}
|
|
<b>var</b> cm = <b>this</b>.grid.colModel;
|
|
<b>var</b> cell = <b>this</b>.getCell(rowIndex, colIndex);
|
|
<b>var</b> cellText = <b>this</b>.getCellText(rowIndex, colIndex);
|
|
|
|
<b>var</b> p = {
|
|
cellId : "x-grid-cell-" + rowIndex + "-" + colIndex,
|
|
id : cm.getColumnId(colIndex),
|
|
css: colIndex == cm.getColumnCount()-1 ? "x-grid-col-last" : ""
|
|
};
|
|
<b>var</b> renderer = cm.getRenderer(colIndex);
|
|
<b>var</b> val = renderer(dm.getValueAt(rowIndex, dataIndex), p, rowIndex, colIndex, dm);
|
|
<b>if</b>(typeof val == "undefined" || val === "") val = "&#160;";
|
|
cellText.innerHTML = val;
|
|
cell.className = <b>this</b>.cellClass + " " + p.cellId + " " + p.css;
|
|
<b>this</b>.syncRowHeights(rowIndex, rowIndex);
|
|
},
|
|
|
|
calcColumnWidth : <b>function</b>(colIndex, maxRowsToMeasure){
|
|
<b>var</b> maxWidth = 0;
|
|
<b>if</b>(this.grid.autoSizeHeaders){
|
|
<b>var</b> h = <b>this</b>.getHeaderCellMeasure(colIndex);
|
|
maxWidth = Math.max(maxWidth, h.scrollWidth);
|
|
}
|
|
<b>var</b> tb, index;
|
|
<b>if</b>(this.cm.isLocked(colIndex)){
|
|
tb = <b>this</b>.getLockedTable();
|
|
index = colIndex;
|
|
}<b>else</b>{
|
|
tb = <b>this</b>.getBodyTable();
|
|
index = colIndex - <b>this</b>.cm.getLockedCount();
|
|
}
|
|
<b>if</b>(tb && tb.rows){
|
|
<b>var</b> rows = tb.rows;
|
|
<b>var</b> stopIndex = Math.min(maxRowsToMeasure || rows.length, rows.length);
|
|
<b>for</b>(var i = 0; i < stopIndex; i++){
|
|
<b>var</b> cell = rows[i].childNodes[index].firstChild;
|
|
maxWidth = Math.max(maxWidth, cell.scrollWidth);
|
|
}
|
|
}
|
|
<b>return</b> maxWidth + <i>/*margin <b>for</b> error <b>in</b> IE*/</i> 5;
|
|
},
|
|
<i>/**
|
|
* Autofit a column to its content.
|
|
* @param {Number} colIndex
|
|
* @param {Boolean} forceMinSize true to force the column to go smaller <b>if</b> possible
|
|
*/</i>
|
|
autoSizeColumn : <b>function</b>(colIndex, forceMinSize, suppressEvent){
|
|
<b>if</b>(this.cm.isHidden(colIndex)){
|
|
<b>return</b>; <i>// can't calc a hidden column</i>
|
|
}
|
|
<b>if</b>(forceMinSize){
|
|
<b>var</b> cid = <b>this</b>.cm.getColumnId(colIndex);
|
|
<b>this</b>.css.updateRule(<b>this</b>.colSelector + cid, "width", <b>this</b>.grid.minColumnWidth + "px");
|
|
<b>if</b>(this.grid.autoSizeHeaders){
|
|
<b>this</b>.css.updateRule(<b>this</b>.hdSelector + cid, "width", <b>this</b>.grid.minColumnWidth + "px");
|
|
}
|
|
}
|
|
<b>var</b> newWidth = <b>this</b>.calcColumnWidth(colIndex);
|
|
<b>this</b>.cm.setColumnWidth(colIndex,
|
|
Math.max(<b>this</b>.grid.minColumnWidth, newWidth), suppressEvent);
|
|
<b>if</b>(!suppressEvent){
|
|
<b>this</b>.grid.fireEvent("columnresize", colIndex, newWidth);
|
|
}
|
|
},
|
|
|
|
<i>/**
|
|
* Autofits all columns to their content and then expands to fit any extra space <b>in</b> the grid
|
|
*/</i>
|
|
autoSizeColumns : <b>function</b>(){
|
|
<b>var</b> cm = <b>this</b>.grid.colModel;
|
|
<b>var</b> colCount = cm.getColumnCount();
|
|
<b>for</b>(var i = 0; i < colCount; i++){
|
|
<b>this</b>.autoSizeColumn(i, true, true);
|
|
}
|
|
<b>if</b>(cm.getTotalWidth() < <b>this</b>.scroller.dom.clientWidth){
|
|
<b>this</b>.fitColumns();
|
|
}<b>else</b>{
|
|
<b>this</b>.updateColumns();
|
|
<b>this</b>.layout();
|
|
}
|
|
},
|
|
|
|
<i>/**
|
|
* Autofits all columns to the grid's width proportionate <b>with</b> their current size
|
|
* @param {Boolean} reserveScrollSpace Reserve space <b>for</b> a scrollbar
|
|
*/</i>
|
|
fitColumns : <b>function</b>(reserveScrollSpace){
|
|
<b>var</b> cm = <b>this</b>.grid.colModel;
|
|
<b>var</b> colCount = cm.getColumnCount();
|
|
<b>var</b> cols = [];
|
|
<b>var</b> width = 0;
|
|
<b>var</b> i, w;
|
|
<b>for</b> (i = 0; i < colCount; i++){
|
|
<b>if</b>(!cm.isHidden(i) && !cm.isFixed(i)){
|
|
w = cm.getColumnWidth(i);
|
|
cols.push(i);
|
|
cols.push(w);
|
|
width += w;
|
|
}
|
|
}
|
|
<b>var</b> avail = Math.min(<b>this</b>.scroller.dom.clientWidth, <b>this</b>.el.getWidth());
|
|
<b>if</b>(reserveScrollSpace){
|
|
avail -= 17;
|
|
}
|
|
<b>var</b> frac = (avail - cm.getTotalWidth())/width;
|
|
<b>while</b> (cols.length){
|
|
w = cols.pop();
|
|
i = cols.pop();
|
|
cm.setColumnWidth(i, Math.floor(w + w*frac), true);
|
|
}
|
|
<b>this</b>.updateColumns();
|
|
<b>this</b>.layout();
|
|
},
|
|
|
|
onRowSelect : <b>function</b>(rowIndex){
|
|
<b>var</b> row = <b>this</b>.getRowComposite(rowIndex);
|
|
row.addClass("x-grid-row-selected");
|
|
},
|
|
|
|
onRowDeselect : <b>function</b>(rowIndex){
|
|
<b>var</b> row = <b>this</b>.getRowComposite(rowIndex);
|
|
row.removeClass("x-grid-row-selected");
|
|
},
|
|
|
|
onCellSelect : <b>function</b>(row, col){
|
|
<b>var</b> cell = <b>this</b>.getCell(row, col);
|
|
<b>if</b>(cell){
|
|
Ext.fly(cell).addClass("x-grid-cell-selected");
|
|
}
|
|
},
|
|
|
|
onCellDeselect : <b>function</b>(row, col){
|
|
<b>var</b> cell = <b>this</b>.getCell(row, col);
|
|
<b>if</b>(cell){
|
|
Ext.fly(cell).removeClass("x-grid-cell-selected");
|
|
}
|
|
},
|
|
|
|
updateHeaderSortState : <b>function</b>(){
|
|
<b>var</b> state = <b>this</b>.ds.getSortState();
|
|
<b>if</b>(!state){
|
|
<b>return</b>;
|
|
}
|
|
<b>this</b>.sortState = state;
|
|
<b>var</b> sortColumn = <b>this</b>.cm.findColumnIndex(state.field);
|
|
<b>if</b>(sortColumn != -1){
|
|
<b>var</b> sortDir = state.direction;
|
|
<b>var</b> sc = <b>this</b>.sortClasses;
|
|
<b>var</b> hds = <b>this</b>.el.select(<b>this</b>.headerSelector).removeClass(sc);
|
|
hds.item(sortColumn).addClass(sc[sortDir == "DESC" ? 1 : 0]);
|
|
}
|
|
},
|
|
|
|
handleHeaderClick : <b>function</b>(g, index){
|
|
<b>if</b>(this.headersDisabled){
|
|
<b>return</b>;
|
|
}
|
|
<b>var</b> dm = g.dataSource, cm = g.colModel;
|
|
<b>if</b>(!cm.isSortable(index)){
|
|
<b>return</b>;
|
|
}
|
|
g.stopEditing();
|
|
dm.sort(cm.getDataIndex(index));
|
|
},
|
|
|
|
|
|
destroy : <b>function</b>(){
|
|
<b>if</b>(this.colMenu){
|
|
<b>this</b>.colMenu.removeAll();
|
|
Ext.menu.MenuMgr.unregister(<b>this</b>.colMenu);
|
|
<b>this</b>.colMenu.getEl().remove();
|
|
<b>delete</b> this.colMenu;
|
|
}
|
|
<b>if</b>(this.hmenu){
|
|
<b>this</b>.hmenu.removeAll();
|
|
Ext.menu.MenuMgr.unregister(<b>this</b>.hmenu);
|
|
<b>this</b>.hmenu.getEl().remove();
|
|
<b>delete</b> this.hmenu;
|
|
}
|
|
<b>if</b>(this.grid.enableColumnMove){
|
|
<b>var</b> dds = Ext.dd.DDM.ids['gridHeader' + <b>this</b>.grid.container.id];
|
|
<b>if</b>(dds){
|
|
<b>for</b>(var dd <b>in</b> dds){
|
|
<b>if</b>(!dds[dd].config.isTarget && dds[dd].dragElId){
|
|
<b>var</b> elid = dds[dd].dragElId;
|
|
dds[dd].unreg();
|
|
Ext.get(elid).remove();
|
|
} <b>else</b> if(dds[dd].config.isTarget){
|
|
dds[dd].proxyTop.remove();
|
|
dds[dd].proxyBottom.remove();
|
|
dds[dd].unreg();
|
|
}
|
|
<b>if</b>(Ext.dd.DDM.locationCache[dd]){
|
|
<b>delete</b> Ext.dd.DDM.locationCache[dd];
|
|
}
|
|
}
|
|
<b>delete</b> Ext.dd.DDM.ids['gridHeader' + <b>this</b>.grid.container.id];
|
|
}
|
|
}
|
|
|
|
<b>this</b>.bind(null, null);
|
|
Ext.EventManager.removeResizeListener(<b>this</b>.onWindowResize, <b>this</b>);
|
|
},
|
|
|
|
handleLockChange : <b>function</b>(){
|
|
<b>this</b>.refresh(true);
|
|
},
|
|
|
|
onDenyColumnLock : <b>function</b>(){
|
|
|
|
},
|
|
|
|
onDenyColumnHide : <b>function</b>(){
|
|
|
|
},
|
|
|
|
handleHdMenuClick : <b>function</b>(item){
|
|
<b>var</b> index = <b>this</b>.hdCtxIndex;
|
|
<b>var</b> cm = <b>this</b>.cm, ds = <b>this</b>.ds;
|
|
<b>switch</b>(item.id){
|
|
<b>case</b> "asc":
|
|
ds.sort(cm.getDataIndex(index), "ASC");
|
|
<b>break</b>;
|
|
<b>case</b> "desc":
|
|
ds.sort(cm.getDataIndex(index), "DESC");
|
|
<b>break</b>;
|
|
<b>case</b> "lock":
|
|
<b>var</b> lc = cm.getLockedCount();
|
|
<b>if</b>(cm.getColumnCount(true) <= lc+1){
|
|
<b>this</b>.onDenyColumnLock();
|
|
<b>return</b>;
|
|
}
|
|
<b>if</b>(lc != index){
|
|
cm.setLocked(index, true, true);
|
|
cm.moveColumn(index, lc);
|
|
<b>this</b>.grid.fireEvent("columnmove", index, lc);
|
|
}<b>else</b>{
|
|
cm.setLocked(index, true);
|
|
}
|
|
<b>break</b>;
|
|
<b>case</b> "unlock":
|
|
<b>var</b> lc = cm.getLockedCount();
|
|
<b>if</b>((lc-1) != index){
|
|
cm.setLocked(index, false, true);
|
|
cm.moveColumn(index, lc-1);
|
|
<b>this</b>.grid.fireEvent("columnmove", index, lc-1);
|
|
}<b>else</b>{
|
|
cm.setLocked(index, false);
|
|
}
|
|
<b>break</b>;
|
|
<b>default</b>:
|
|
index = cm.getIndexById(item.id.substr(4));
|
|
<b>if</b>(index != -1){
|
|
<b>if</b>(item.checked && cm.getColumnCount(true) <= 1){
|
|
<b>this</b>.onDenyColumnHide();
|
|
<b>return</b> false;
|
|
}
|
|
cm.setHidden(index, item.checked);
|
|
}
|
|
}
|
|
<b>return</b> true;
|
|
},
|
|
|
|
beforeColMenuShow : <b>function</b>(){
|
|
<b>var</b> cm = <b>this</b>.cm, colCount = cm.getColumnCount();
|
|
<b>this</b>.colMenu.removeAll();
|
|
<b>for</b>(var i = 0; i < colCount; i++){
|
|
<b>this</b>.colMenu.add(<b>new</b> Ext.menu.CheckItem({
|
|
id: "col-"+cm.getColumnId(i),
|
|
text: cm.getColumnHeader(i),
|
|
checked: !cm.isHidden(i),
|
|
hideOnClick:false
|
|
}));
|
|
}
|
|
},
|
|
|
|
handleHdCtx : <b>function</b>(g, index, e){
|
|
e.stopEvent();
|
|
<b>var</b> hd = <b>this</b>.getHeaderCell(index);
|
|
<b>this</b>.hdCtxIndex = index;
|
|
<b>var</b> ms = <b>this</b>.hmenu.items, cm = <b>this</b>.cm;
|
|
ms.get("asc").setDisabled(!cm.isSortable(index));
|
|
ms.get("desc").setDisabled(!cm.isSortable(index));
|
|
<b>if</b>(this.grid.enableColLock !== false){
|
|
ms.get("lock").setDisabled(cm.isLocked(index));
|
|
ms.get("unlock").setDisabled(!cm.isLocked(index));
|
|
}
|
|
<b>this</b>.hmenu.show(hd, "tl-bl");
|
|
},
|
|
|
|
handleHdOver : <b>function</b>(e){
|
|
<b>var</b> hd = <b>this</b>.findHeaderCell(e.getTarget());
|
|
<b>if</b>(hd && !<b>this</b>.headersDisabled){
|
|
<b>if</b>(this.grid.colModel.isSortable(<b>this</b>.getCellIndex(hd))){
|
|
<b>this</b>.fly(hd).addClass("x-grid-hd-over");
|
|
}
|
|
}
|
|
},
|
|
|
|
handleHdOut : <b>function</b>(e){
|
|
<b>var</b> hd = <b>this</b>.findHeaderCell(e.getTarget());
|
|
<b>if</b>(hd){
|
|
<b>this</b>.fly(hd).removeClass("x-grid-hd-over");
|
|
}
|
|
},
|
|
|
|
handleSplitDblClick : <b>function</b>(e, t){
|
|
<b>var</b> i = <b>this</b>.getCellIndex(t);
|
|
<b>if</b>(this.grid.enableColumnResize !== false && <b>this</b>.cm.isResizable(i) && !<b>this</b>.cm.isFixed(i)){
|
|
<b>this</b>.autoSizeColumn(i, true);
|
|
<b>this</b>.layout();
|
|
}
|
|
},
|
|
|
|
render : <b>function</b>(){
|
|
|
|
<b>var</b> cm = <b>this</b>.cm;
|
|
<b>var</b> colCount = cm.getColumnCount();
|
|
|
|
<b>if</b>(this.grid.monitorWindowResize === true){
|
|
Ext.EventManager.onWindowResize(<b>this</b>.onWindowResize, <b>this</b>, true);
|
|
}
|
|
<b>var</b> header = <b>this</b>.renderHeaders();
|
|
<b>var</b> body = <b>this</b>.templates.body.apply({rows:""});
|
|
<b>var</b> html = <b>this</b>.templates.master.apply({
|
|
lockedBody: body,
|
|
body: body,
|
|
lockedHeader: header[0],
|
|
header: header[1]
|
|
});
|
|
|
|
<b>this</b>.updateColumns();
|
|
|
|
<b>this</b>.grid.container.dom.innerHTML = html;
|
|
|
|
<b>this</b>.initElements();
|
|
|
|
<b>this</b>.scroller.on("scroll", <b>this</b>.handleScroll, <b>this</b>);
|
|
<b>this</b>.lockedBody.on("mousewheel", <b>this</b>.handleWheel, <b>this</b>);
|
|
<b>this</b>.mainBody.on("mousewheel", <b>this</b>.handleWheel, <b>this</b>);
|
|
|
|
<b>this</b>.mainHd.on("mouseover", <b>this</b>.handleHdOver, <b>this</b>);
|
|
<b>this</b>.mainHd.on("mouseout", <b>this</b>.handleHdOut, <b>this</b>);
|
|
<b>this</b>.mainHd.on("dblclick", <b>this</b>.handleSplitDblClick, <b>this</b>,
|
|
{delegate: "."+<b>this</b>.splitClass});
|
|
|
|
<b>this</b>.lockedHd.on("mouseover", <b>this</b>.handleHdOver, <b>this</b>);
|
|
<b>this</b>.lockedHd.on("mouseout", <b>this</b>.handleHdOut, <b>this</b>);
|
|
<b>this</b>.lockedHd.on("dblclick", <b>this</b>.handleSplitDblClick, <b>this</b>,
|
|
{delegate: "."+<b>this</b>.splitClass});
|
|
|
|
<b>if</b>(this.grid.enableColumnResize !== false && Ext.grid.SplitDragZone){
|
|
<b>new</b> Ext.grid.SplitDragZone(<b>this</b>.grid, <b>this</b>.lockedHd.dom, <b>this</b>.mainHd.dom);
|
|
}
|
|
|
|
<b>this</b>.updateSplitters();
|
|
|
|
<b>if</b>(this.grid.enableColumnMove && Ext.grid.HeaderDragZone){
|
|
<b>new</b> Ext.grid.HeaderDragZone(<b>this</b>.grid, <b>this</b>.lockedHd.dom, <b>this</b>.mainHd.dom);
|
|
<b>new</b> Ext.grid.HeaderDropZone(<b>this</b>.grid, <b>this</b>.lockedHd.dom, <b>this</b>.mainHd.dom);
|
|
}
|
|
|
|
<b>if</b>(this.grid.enableCtxMenu !== false && Ext.menu.Menu){
|
|
<b>this</b>.hmenu = <b>new</b> Ext.menu.Menu({id: <b>this</b>.grid.id + "-hctx"});
|
|
<b>this</b>.hmenu.add(
|
|
{id:"asc", text: <b>this</b>.sortAscText, cls: "xg-hmenu-sort-asc"},
|
|
{id:"desc", text: <b>this</b>.sortDescText, cls: "xg-hmenu-sort-desc"}
|
|
);
|
|
<b>if</b>(this.grid.enableColLock !== false){
|
|
<b>this</b>.hmenu.add('-',
|
|
{id:"lock", text: <b>this</b>.lockText, cls: "xg-hmenu-lock"},
|
|
{id:"unlock", text: <b>this</b>.unlockText, cls: "xg-hmenu-unlock"}
|
|
);
|
|
}
|
|
<b>if</b>(this.grid.enableColumnHide !== false){
|
|
|
|
<b>this</b>.colMenu = <b>new</b> Ext.menu.Menu({id:<b>this</b>.grid.id + "-hcols-menu"});
|
|
<b>this</b>.colMenu.on("beforeshow", <b>this</b>.beforeColMenuShow, <b>this</b>);
|
|
<b>this</b>.colMenu.on("itemclick", <b>this</b>.handleHdMenuClick, <b>this</b>);
|
|
|
|
<b>this</b>.hmenu.add('-',
|
|
{id:"columns", text: <b>this</b>.columnsText, menu: <b>this</b>.colMenu}
|
|
);
|
|
}
|
|
<b>this</b>.hmenu.on("itemclick", <b>this</b>.handleHdMenuClick, <b>this</b>);
|
|
|
|
<b>this</b>.grid.on("headercontextmenu", <b>this</b>.handleHdCtx, <b>this</b>);
|
|
}
|
|
|
|
<b>if</b>((<b>this</b>.grid.enableDragDrop || <b>this</b>.grid.enableDrag) && Ext.grid.GridDragZone){
|
|
<b>this</b>.dd = <b>new</b> Ext.grid.GridDragZone(<b>this</b>.grid, {
|
|
ddGroup : <b>this</b>.grid.ddGroup || 'GridDD'
|
|
});
|
|
}
|
|
<b>for</b>(var i = 0; i < colCount; i++){
|
|
<b>if</b>(cm.isHidden(i)){
|
|
<b>this</b>.hideColumn(i);
|
|
}
|
|
<b>if</b>(cm.config[i].align){
|
|
<b>this</b>.css.updateRule(<b>this</b>.colSelector + i, "textAlign", cm.config[i].align);
|
|
<b>this</b>.css.updateRule(<b>this</b>.hdSelector + i, "textAlign", cm.config[i].align);
|
|
}
|
|
}
|
|
|
|
<b>this</b>.updateHeaderSortState();
|
|
|
|
<b>this</b>.beforeInitialResize();
|
|
<b>this</b>.layout(true);
|
|
|
|
<i>// two part rendering gives faster view to the user</i>
|
|
<b>this</b>.renderPhase2.defer(1, <b>this</b>);
|
|
},
|
|
|
|
renderPhase2 : <b>function</b>(){
|
|
<i>// render the rows now</i>
|
|
<b>this</b>.refresh();
|
|
<b>if</b>(this.grid.autoSizeColumns){
|
|
<b>this</b>.autoSizeColumns();
|
|
}
|
|
},
|
|
|
|
beforeInitialResize : <b>function</b>(){
|
|
|
|
},
|
|
|
|
onColumnSplitterMoved : <b>function</b>(i, w){
|
|
<b>this</b>.userResized = true;
|
|
<b>var</b> cm = <b>this</b>.grid.colModel;
|
|
cm.setColumnWidth(i, w, true);
|
|
<b>var</b> cid = cm.getColumnId(i);
|
|
<b>this</b>.css.updateRule(<b>this</b>.colSelector + cid, "width", (w-<b>this</b>.borderWidth) + "px");
|
|
<b>this</b>.css.updateRule(<b>this</b>.hdSelector + cid, "width", (w-<b>this</b>.borderWidth) + "px");
|
|
<b>this</b>.updateSplitters();
|
|
<b>this</b>.layout();
|
|
<b>this</b>.grid.fireEvent("columnresize", i, w);
|
|
},
|
|
|
|
syncRowHeights : <b>function</b>(startIndex, endIndex){
|
|
<b>if</b>(this.grid.enableRowHeightSync === true && <b>this</b>.cm.getLockedCount() > 0){
|
|
startIndex = startIndex || 0;
|
|
<b>var</b> mrows = <b>this</b>.getBodyTable().rows;
|
|
<b>var</b> lrows = <b>this</b>.getLockedTable().rows;
|
|
<b>var</b> len = mrows.length-1;
|
|
endIndex = Math.min(endIndex || len, len);
|
|
<b>for</b>(var i = startIndex; i <= endIndex; i++){
|
|
<b>var</b> m = mrows[i], l = lrows[i];
|
|
<b>var</b> h = Math.max(m.offsetHeight, l.offsetHeight);
|
|
m.style.height = l.style.height = h + "px";
|
|
}
|
|
}
|
|
},
|
|
|
|
layout : <b>function</b>(initialRender, is2ndPass){
|
|
<b>var</b> g = <b>this</b>.grid;
|
|
<b>var</b> auto = g.autoHeight;
|
|
<b>var</b> scrollOffset = 16;
|
|
<b>var</b> c = g.container, cm = <b>this</b>.cm,
|
|
expandCol = g.autoExpandColumn,
|
|
gv = <b>this</b>;
|
|
<i>//c.beginMeasure();</i>
|
|
|
|
<b>if</b>(!c.dom.offsetWidth){ <i>// display:none?</i>
|
|
<b>if</b>(initialRender){
|
|
<b>this</b>.lockedWrap.show();
|
|
<b>this</b>.mainWrap.show();
|
|
}
|
|
<b>return</b>;
|
|
}
|
|
|
|
<b>var</b> hasLock = <b>this</b>.cm.isLocked(0);
|
|
|
|
<b>var</b> tbh = <b>this</b>.headerPanel.getHeight();
|
|
<b>var</b> bbh = <b>this</b>.footerPanel.getHeight();
|
|
|
|
<b>if</b>(auto){
|
|
<b>var</b> ch = <b>this</b>.getBodyTable().offsetHeight + tbh + bbh + <b>this</b>.mainHd.getHeight();
|
|
<b>var</b> newHeight = ch + c.getBorderWidth("tb");
|
|
<b>if</b>(g.maxHeight){
|
|
newHeight = Math.min(g.maxHeight, newHeight);
|
|
}
|
|
c.setHeight(newHeight);
|
|
}
|
|
|
|
<b>if</b>(g.autoWidth){
|
|
c.setWidth(cm.getTotalWidth()+c.getBorderWidth('lr'));
|
|
}
|
|
|
|
<b>var</b> s = <b>this</b>.scroller;
|
|
|
|
<b>var</b> csize = c.getSize(true);
|
|
|
|
<b>this</b>.el.setSize(csize.width, csize.height);
|
|
|
|
<b>this</b>.headerPanel.setWidth(csize.width);
|
|
<b>this</b>.footerPanel.setWidth(csize.width);
|
|
|
|
<b>var</b> hdHeight = <b>this</b>.mainHd.getHeight();
|
|
<b>var</b> vw = csize.width;
|
|
<b>var</b> vh = csize.height - (tbh + bbh);
|
|
|
|
s.setSize(vw, vh);
|
|
|
|
<b>var</b> bt = <b>this</b>.getBodyTable();
|
|
<b>var</b> ltWidth = hasLock ?
|
|
Math.max(<b>this</b>.getLockedTable().offsetWidth, <b>this</b>.lockedHd.dom.firstChild.offsetWidth) : 0;
|
|
|
|
<b>var</b> scrollHeight = bt.offsetHeight;
|
|
<b>var</b> scrollWidth = ltWidth + bt.offsetWidth;
|
|
<b>var</b> vscroll = false, hscroll = false;
|
|
|
|
<b>this</b>.scrollSizer.setSize(scrollWidth, scrollHeight+hdHeight);
|
|
|
|
<b>var</b> lw = <b>this</b>.lockedWrap, mw = <b>this</b>.mainWrap;
|
|
<b>var</b> lb = <b>this</b>.lockedBody, mb = <b>this</b>.mainBody;
|
|
|
|
setTimeout(<b>function</b>(){
|
|
<b>var</b> t = s.dom.offsetTop;
|
|
<b>var</b> w = s.dom.clientWidth,
|
|
h = s.dom.clientHeight;
|
|
|
|
lw.setTop(t);
|
|
lw.setSize(ltWidth, h);
|
|
|
|
mw.setLeftTop(ltWidth, t);
|
|
mw.setSize(w-ltWidth, h);
|
|
|
|
lb.setHeight(h-hdHeight);
|
|
mb.setHeight(h-hdHeight);
|
|
|
|
<b>if</b>(is2ndPass !== true && !gv.userResized && expandCol){
|
|
<i>// high speed resize without full column calculation</i>
|
|
<b>var</b> ci = cm.getIndexById(expandCol);
|
|
<b>var</b> tw = cm.getTotalWidth(false);
|
|
<b>var</b> currentWidth = cm.getColumnWidth(ci);
|
|
<b>var</b> cw = Math.min(Math.max(((w-tw)+currentWidth-2)-<i>/*scrollbar*/</i>(w <= s.dom.offsetWidth ? 0 : 18), g.autoExpandMin), g.autoExpandMax);
|
|
<b>if</b>(currentWidth != cw){
|
|
cm.setColumnWidth(ci, cw, true);
|
|
gv.css.updateRule(gv.colSelector+expandCol, "width", (cw - gv.borderWidth) + "px");
|
|
gv.css.updateRule(gv.hdSelector+expandCol, "width", (cw - gv.borderWidth) + "px");
|
|
gv.updateSplitters();
|
|
gv.layout(false, true);
|
|
}
|
|
}
|
|
|
|
<b>if</b>(initialRender){
|
|
lw.show();
|
|
mw.show();
|
|
}
|
|
<i>//c.endMeasure();</i>
|
|
}, 10);
|
|
},
|
|
|
|
onWindowResize : <b>function</b>(){
|
|
<b>if</b>(!<b>this</b>.grid.monitorWindowResize || <b>this</b>.grid.autoHeight){
|
|
<b>return</b>;
|
|
}
|
|
<b>this</b>.layout();
|
|
},
|
|
|
|
appendFooter : <b>function</b>(parentEl){
|
|
<b>return</b> null;
|
|
},
|
|
|
|
sortAscText : "Sort Ascending",
|
|
sortDescText : "Sort Descending",
|
|
lockText : "Lock Column",
|
|
unlockText : "Unlock Column",
|
|
columnsText : "Columns"
|
|
});</code></pre><hr><div style="font-size:10px;text-align:center;color:gray;">Ext - Copyright © 2006-2007 Ext JS, LLC<br />All rights reserved.</div>
|
|
</body></html> |