Ext.override(Ext.Component, { x_setDisabled: function () { this.setDisabled(!this.x_state['Enabled']); }, x_setVisible: function () { this.setVisible(!this.x_state['Hidden']); } }); // 验证一个表单是否有效,会递归查询表单中每个字段 // 如果表单隐藏或者字段隐藏,则不进行有效性校验 Ext.override(Ext.container.Container, { x_isValid: function () { var valid = true; var firstInvalidField = null; if (!this.hidden) { this.items.each(function (f) { if (!f.hidden) { if (f.isXType('field') || f.isXType('checkboxgroup')) { if (!f.validate()) { valid = false; if (firstInvalidField == null) { firstInvalidField = f; } } } else if (f.items) { var validResult = f.x_isValid(); if (!validResult[0]) { valid = false; if (firstInvalidField == null) { firstInvalidField = validResult[1]; } } } } }); } return [valid, firstInvalidField]; }, x_reset: function () { this.items.each(function (f) { if (f.isXType('field')) { f.reset(); } else if (f.items) { validResult = this.x_reset(); } }); } }); Ext.override(Ext.panel.Panel, { x_setCollapse: function () { var collapsed = this.x_state['Collapsed']; if (collapsed) { this.collapse(); } else { this.expand(); } }, x_isCollapsed: function () { var collapsed = false; var state = this.getState(); if (state && state.collapsed) { collapsed = true; } return collapsed; }, x_setTitle: function () { this.setTitle(this.x_state['Title']); } }); Ext.override(Ext.form.FieldSet, { x_setCollapse: function () { var collapsed = this.x_state['Collapsed']; if (collapsed) { this.collapse(); } else { this.expand(); } }, x_isCollapsed: function () { var collapsed = false; var state = this.getState(); if (state && state.collapsed) { collapsed = true; } return collapsed; }, x_setTitle: function () { this.setTitle(this.x_state['Title']); } }); if (Ext.menu.CheckItem) { Ext.override(Ext.menu.CheckItem, { x_setChecked: function () { this.setChecked(this.x_state['Checked'], true); } }); } if (Ext.form.field.Base) { Ext.override(Ext.form.field.Base, { // Add functionality to Field's initComponent to enable the change event to bubble /* initComponent: Ext.form.Field.prototype.initComponent.createSequence(function () { this.enableBubble('change'); }), */ /* 这会导致在文本输入框中按回车键,无法触发type=submit的表单回发事件 listeners: { specialkey: function (field, e) { if (e.getKey() == e.ENTER) { e.stopEvent(); } } }, */ /* // When show or hide the field, also hide the label. hide: function () { Ext.form.Field.superclass.hide.call(this); //this.callOverridden(); //var label = Ext.get(this.el.findParent('div[class=x-form-item]')).first('label[for=' + this.id + ']'); var labelAndField = this.el.findParentNode('div[class*=x-form-item]', 10, true); if (labelAndField) { if (this.hideMode == 'display') { labelAndField.setVisibilityMode(Ext.Element.DISPLAY); } else { labelAndField.setVisibilityMode(Ext.Element.VISIBILITY); } labelAndField.hide(); } }, show: function () { Ext.form.Field.superclass.show.call(this); //this.callOverridden(); //var label = Ext.get(this.el.findParent('div[class=x-form-item]')).first('label[for=' + this.id + ']'); var labelAndField = this.el.findParentNode('div[class*=x-form-item]', 10, true); if (labelAndField) { if (this.hideMode == 'display') { labelAndField.setVisibilityMode(Ext.Element.DISPLAY); } else { labelAndField.setVisibilityMode(Ext.Element.VISIBILITY); } labelAndField.show(); } }, */ x_setValue: function (value) { if (typeof (value) === 'undefined') { value = this.x_state['Text']; } this.setValue(value); }, x_setLabel: function (text) { if (this.label && this.label.update) { this.label.update(text || this.x_state['Label']); } } }); } if (Ext.form.field.Time) { Ext.override(Ext.form.field.Time, { // Time 继承自 ComboBox,这个函数被覆盖了,因此需要重新定义 x_setValue: function (value) { if (typeof (value) === 'undefined') { value = this.x_state['Text']; } this.setValue(value); } }); } if (Ext.form.field.HtmlEditor) { Ext.override(Ext.form.field.HtmlEditor, { x_setValue: function (text) { if (typeof (text) === 'undefined') { text = this.x_state['Text']; } this.setValue(text); } }); } if (Ext.form.field.Checkbox) { Ext.override(Ext.form.field.Checkbox, { x_setValue: function () { this.setValue(this.x_state['Checked']); } }); } if (Ext.form.RadioGroup) { Ext.override(Ext.form.RadioGroup, { x_setValue: function (value) { value = value || this.x_state['SelectedValue']; var selectedObj = {}; selectedObj[this.name] = value; this.setValue(selectedObj); //Ext.form.CheckboxGroup.prototype.x_setValue.apply(this, [value]); } }); } if (Ext.form.CheckboxGroup) { Ext.override(Ext.form.CheckboxGroup, { x_reloadData: function (name, isradiogroup) { var container = this.ownerCt; var newConfig = Ext.apply(this.initialConfig, { "x_state": this.x_state, "items": X.util.resolveCheckBoxGroup(name, this.x_state, isradiogroup) }); if (container) { var originalIndex = container.items.indexOf(this); container.remove(this, true); if (isradiogroup) { container.insert(originalIndex, Ext.create('Ext.form.RadioGroup', newConfig)); } else { container.insert(originalIndex, Ext.create('Ext.form.CheckboxGroup', newConfig)); } container.doLayout(); } else { this.destroy(); if (isradiogroup) { Ext.create('Ext.form.RadioGroup', newConfig); } else { Ext.create('Ext.form.CheckboxGroup', newConfig); } } }, /* x_toBeDeleted: function () { var tobedeleted = this.items.items[0]; if (tobedeleted && tobedeleted.inputValue === 'tobedeleted') { tobedeleted.destroy(); this.items.remove(tobedeleted); } }, */ // 选中项 x_setValue: function (values) { // valueArray:["value1", "value2", "value3"] var values = values || this.x_state['SelectedValueArray']; var selectedObj = {}; this.items.each(function (item) { var itemSelected = false; if (values.indexOf(item.inputValue) >= 0) { itemSelected = true; } selectedObj[item.name] = itemSelected; }); this.setValue(selectedObj); }, // 返回 ["value1", "value2", "value3"] x_getSelectedValues: function () { var selectedValues = []; var values = this.getValue(); Ext.Object.each(values, function (key, value) { selectedValues.push(value); }); return selectedValues; } }); } if (Ext.form.field.ComboBox) { Ext.override(Ext.form.field.ComboBox, { // Load data from local cache. // mode: "local", // triggerAction: "all", displayField: "text", valueField: "value", //tpl: "
x-combo-list-item-disable\">{prefix}{text}
", // These variables are in the Ext.form.ComboBox.prototype, therefore all instance will refer to the same store instance. //store: new Ext.data.ArrayStore({ fields: ['value', 'text', 'enabled', 'prefix'] }), x_setValue: function (value) { // value 可以是空字符串 if (typeof (value) === 'undefined') { value = this.x_state['SelectedValue']; } this.setValue(value); }, x_loadData: function (data) { data = data || this.x_state['X_Items']; if (data) { this.store.loadData(X.simulateTree.transform(data)); } }, x_getTextByValue: function (value, data) { data = data || this.x_state['X_Items']; value += ''; // 把Value转换为字符串 for (var i = 0, count = data.length; i < count; i++) { var item = data[i]; if (item[0] === value) { return item[1]; } } return ''; } }); } if (Ext.button.Button) { Ext.override(Ext.button.Button, { x_setTooltip: function () { this.setTooltip(this.x_state['ToolTip']); }, x_toggle: function () { this.toggle(this.x_state['Pressed']); }, x_setText: function () { this.setText(this.x_state['Text']); } }); } if (Ext.grid.column.RowNumberer) { X.originalRowNumbererRenderer = Ext.grid.column.RowNumberer.prototype.renderer; Ext.override(Ext.grid.column.RowNumberer, { renderer: function () { var number = X.originalRowNumbererRenderer.apply(this, arguments); if (this.x_paging) { var pagingBar = X(this.x_paging_grid).x_getPaging(); if (pagingBar) { number += pagingBar.x_pageIndex * pagingBar.x_pageSize; } } return number; } }); } /* if (Ext.data.Store) { Ext.override(Ext.data.Store, { // true to clear all modified record information each time the store is loaded or when a record is removed (defaults to false). pruneModifiedRecords: true }); } */ if (Ext.grid.Panel) { Ext.override(Ext.grid.Panel, { x_getData: function () { var $this = this, data = this.x_state['X_Rows']['Values']; ////////////////////////////////////////////////// var tpls = this.x_getTpls(this.x_tpls); // 将Grid1_ctl37与对应的outHTML放在哈希表中 var tplsHash = {}; var e = document.createElement('div'); e.innerHTML = tpls; Ext.Array.each(e.childNodes, function (item, index) { tplsHash[item.id] = item.outerHTML.replace(/\r?\n\s*/ig, ''); }); // 不要改变 X_Rows -> Values 的原始数据,因为这个值会被POST到后台 var newdata = [], newdataitem; Ext.Array.each(data, function (row, rowIndex) { newdataitem = []; Ext.Array.each(row, function (item, index) { if (item.substr(0, 7) === "#@TPL@#") { var clientId = $this.id + '_' + item.substr(7); newdataitem.push('
' + tplsHash[clientId] + '
'); } else { newdataitem.push(item); } }); newdata.push(newdataitem); }); ////////////////////////////////////////////////// return newdata; }, x_getTpls: function (paramTpls) { var tpls; if (typeof (paramTpls) !== 'undefined') { // 1. 如果Tpls存在于函数参数中 tpls = paramTpls; this['data-last-tpls'] = tpls; } else { var tplsNode = Ext.get(this.id + '_tpls'); if (tplsNode) { // 2. 如果Tpls存在于页面节点中 tpls = tplsNode.dom.innerHTML; // 获取模板列的内容之后,必须要删除原有的节点,因为会在表格中创建完全相同的新节点 tplsNode.remove(); // 将模板列内容保存到表格实例中 this['data-last-tpls'] = tpls; } else { // 3. 从缓存中读取 // 从表格实例中读取模板列内容 tpls = this['data-last-tpls']; } } return tpls; }, x_updateTpls: function (tpls) { tpls = this.x_getTpls(tpls); var e = document.createElement('div'); e.innerHTML = tpls; Ext.Array.each(e.childNodes, function (item, index) { var nodeId = item.id; var tplContainer = Ext.get(nodeId + '_container'); // 对于内存分页,模板列的内容可能还没有渲染到页面中 if (tplContainer) { tplContainer.dom.innerHTML = item.outerHTML; } }); }, x_getPaging: function () { var toolbar = this.getDockedItems('toolbar[dock="bottom"]'); return toolbar.length ? toolbar[0] : undefined; }, x_loadData: function () { var datas = this.x_getData(); var pagingBar = this.x_getPaging(); if (pagingBar) { var pagingDatas = []; if (pagingBar.x_databasePaging) { pagingDatas = datas; } else { for (var i = pagingBar.x_startRowIndex; i <= pagingBar.x_endRowIndex; i++) { pagingDatas.push(datas[i]); } } datas = pagingDatas; } var store = this.getStore(); // 已经设置 Ext.data.Store 的 pruneModifiedRecords ,在重新加载数据时都会清除所有已经改变的数据 // 所以无需 rejectChanges // 拒绝之前对表格的编辑,因为接下来就要重新加载数据 //store.rejectChanges(); // 重新加载数据前清空之前的改变 //this.x_newAddedRows = []; //this.x_deletedRows = []; store.loadData(datas); this.x_initRecordIDs(); }, // 初始化所有记录的ID列表 x_initRecordIDs: function () { var $this = this; this.x_recordIDs = []; this.getStore().each(function (record, index) { $this.x_recordIDs.push(record.id); }); }, // 展开所有的行扩展列 x_expandAllRows: function () { var expander = this.getPlugin(this.id + '_rowexpander'); if (expander) { var store = this.getStore(); for (var i = 0, count = store.getCount() ; i < count; i++) { var record = store.getAt(i); if (!expander.recordsExpanded[record.internalId]) { expander.toggleRow(i, record); } } } }, // 隐藏所有的行扩展列 x_collapseAllRows: function () { var expander = this.getPlugin(this.id + '_rowexpander'); if (expander) { var store = this.getStore(); for (var i = 0, count = store.getCount() ; i < count; i++) { var record = store.getAt(i); if (expander.recordsExpanded[record.internalId]) { expander.toggleRow(i, record); } } } }, // http://evilcroco.name/2010/10/making-extjs-grid-content-selectable/ // IE下允许选中表格中的文本 /* x_enableTextSelection: function () { var elems = Ext.DomQuery.select("div[unselectable=on]", this.el.dom); for (var i = 0, len = elems.length; i < len; i++) { Ext.get(elems[i]).set({ 'unselectable': 'off' }).removeCls('x-unselectable'); } }, */ // 获取选中的行数,或者单元格数(单元格编辑模式) x_getSelectedCount: function () { var selectedCount = 0; var sm = this.getSelectionModel(); if (sm.hasSelection()) { if (sm.getCount) { selectedCount = sm.getCount(); } else { // 单元格编辑模式,只可能选中一个单元格 selectedCount = 1; } } return selectedCount; }, // 选中某些行 x_selectRows: function (rows) { rows = rows || this.x_state['SelectedRowIndexArray'] || []; var sm = this.getSelectionModel(); if (sm.select) { sm.deselectAll(true); Ext.Array.each(rows, function (row, index) { // select( records, [keepExisting], [suppressEvent] ) sm.select(row, true, true); }); } }, // 选中全部行 x_selectAllRows: function() { var sm = this.getSelectionModel(); if (sm.selectAll) { sm.selectAll(true); } }, // 获取选中的行 x_getSelectedRows: function () { var selectedRows = []; var sm = this.getSelectionModel(); if (sm.getSelection) { var selection = sm.getSelection(); var store = this.getStore(); Ext.Array.each(selection, function (record, index) { selectedRows.push(store.indexOf(record)); }); } return selectedRows; }, // 选中单元格(AllowCellEditing) x_selectCell: function (cell) { cell = cell || this.x_state['SelectedCell'] || []; var sm = this.getSelectionModel(); if (sm.select) { if (cell.length === 2) { sm.select(cell[0], cell[1]); } else { sm.clearSelections(); } } }, // 获取选中的单元格(AllowCellEditing) x_getSelectedCell: function () { var selectedCell = []; var sm = this.getSelectionModel(); if (sm.getSelectedCell) { selectedCell = sm.getSelectedCell(); if (!selectedCell) { selectedCell = []; } } return selectedCell; }, // 获取隐藏列的名称列表 x_getHiddenColumns: function () { var hiddens = [], columns = this.columns; Ext.Array.each(columns, function (column, index) { if (column.isHidden()) { hiddens.push(column.id); } }); return hiddens; }, // 隐藏需要隐藏的列,显示不需要隐藏的列 x_updateColumnsHiddenStatus: function (hiddens) { hiddens = hiddens || this.x_state['HiddenColumns'] || []; var columns = this.columns; Ext.Array.each(columns, function (column, index) { if (hiddens.indexOf(column.id) !== -1) { column.setVisible(false); } else { column.setVisible(true); } }); }, // 初始化排序列头 x_initSortHeaders: function() { var gridEl = Ext.get(this.id), columns = this.x_getColumns(); // 为所有可排序列添加手型光标 Ext.Array.each(columns, function (item, index) { if (item['sortable']) { Ext.get(item.id).addCls('cursor-pointer'); } }); }, // 设置表格标题栏的排序图标 x_setSortIcon: function (sortColumnID, sortDirection) { var gridEl = Ext.get(this.id), columns = this.x_getColumns(), headers = gridEl.select('.x-column-header'); // 清空所有可排序列的排序箭头 headers.removeCls(['x-column-header-sort-DESC', 'x-column-header-sort-ASC']); // 为所有可排序列添加手型光标 Ext.Array.each(columns, function (item, index) { if (item['sortable']) { Ext.get(item.id).addCls('cursor-pointer'); } }); // 设置当前列的排序箭头 if (sortColumnID) { Ext.get(sortColumnID).addCls('x-column-header-sort-' + sortDirection.toUpperCase()); } }, // 获取表格列 x_getColumns: function () { /* var columns = []; var configColumns = this.getColumnModel().config; Ext.Array.each(configColumns, function (item, index) { // expander也属于表格列的一种类型,否则设置x_setSortIcon会出错 if (item.id !== 'numberer' && item.id !== 'checker') { // && item.id !== 'expander' columns.push(item); } }); */ return this.columns; }, // 这个方法用不到了,现在对States的更新会导致Values的改变,进而促使表格的重新加载 /* x_setRowStates: function (states) { var gridEl = Ext.get(this.id), columns = this.x_getColumns(), states = states || this.x_state['X_States'] || []; function setCheckBoxStates(columnIndex, stateColumnIndex) { var checkboxRows = gridEl.select('.x-grid-body .x-grid-row .x-grid-td-' + columns[columnIndex].id + ' .box-grid-checkbox'); checkboxRows.each(function (row, rows, index) { if (states[index][stateColumnIndex]) { if (row.hasCls('box-grid-checkbox-unchecked-disabled')) { row.removeCls('box-grid-checkbox-unchecked-disabled'); } else { row.removeCls('box-grid-checkbox-unchecked'); } } else { if (row.hasCls('box-grid-checkbox-disabled')) { row.addCls('box-grid-checkbox-unchecked-disabled') } else { row.addCls('box-grid-checkbox-unchecked') } } }); } var stateColumnIndex = 0; Ext.Array.each(columns, function (column, index) { if (column['x_persistState']) { if (column['x_persistStateType'] === 'checkbox') { setCheckBoxStates(index, stateColumnIndex); stateColumnIndex++; } } }); }, */ // 获取列状态(目前只有CheckBoxField用到) x_getStates: function () { var gridEl = Ext.get(this.id), columns = this.x_getColumns(), states = []; function getCheckBoxStates(columnIndex) { var checkboxRows = gridEl.select('.x-grid-row .x-grid-cell-' + columns[columnIndex].id + ' .box-grid-checkbox'); var columnStates = []; checkboxRows.each(function (row, index) { if (row.hasCls('unchecked')) { columnStates.push(false); } else { columnStates.push(true); } }); return columnStates; } Ext.Array.each(columns, function (column, index) { if (column['x_persistState']) { if (column['x_persistStateType'] === 'checkbox') { states.push(getCheckBoxStates(index)); } } }); // 把列状态列表转换为行状态列表,与后台数据保持一致 var i, resolvedStates = [], rowState, rowCount; if (states.length > 0) { rowCount = states[0].length; for (i = 0; i < rowCount; i++) { rowState = []; Ext.Array.each(states, function (state, index) { rowState.push(state[i]); }); resolvedStates.push(rowState); } } return resolvedStates; }, // 提交客户端改变 x_commitChanges: function () { this.getStore().commitChanges(); //this.x_newAddedRows = []; //this.x_deletedRows = []; this.x_initRecordIDs(); }, // 从Store中删除选中的行(或者单元格) x_deleteSelected: function () { var $this = this; var store = this.getStore(); var sm = this.getSelectionModel(); if (sm.getSelections) { var selections = sm.getSelections(); Ext.Array.each(selections, function (record, index) { store.remove(record); }); } else if (sm.getSelectedCell) { var selectedCell = sm.getSelectedCell(); store.removeAt(selectedCell[0]); } }, // 添加一条新纪录 x_addNewRecord: function (defaultObj, appendToEnd) { var i, count, store = this.getStore(); var recordType = store.recordType; var newRecord = new recordType(defaultObj); this.stopEditing(); if (appendToEnd) { store.add(newRecord); // 新增客户端改变的行索引 //this.x_newAddedRows.push(store.getCount() - 1); } else { store.insert(0, newRecord); // 新增客户端改变的行索引 //for (i = 0, count = this.x_newAddedRows.length; i < count; i++) { // this.x_newAddedRows[i]++; //} //this.x_newAddedRows.push(0); } this.startEditing(0, 0); }, // 获取新增的行索引(在修改后的列表中) x_getNewAddedRows: function () { var $this = this; var newAddedRows = []; this.getStore().each(function (record, index) { if ($this.x_recordIDs.indexOf(record.id) < 0) { newAddedRows.push(index); } }); return newAddedRows; }, // 获取删除的行索引(在原始的列表中) x_getDeletedRows: function () { var currentRecordIDs = [], deletedRows = []; this.getStore().each(function (record, index) { currentRecordIDs.push(record.id); }); // 快速判断是否存在行被删除的情况 if (currentRecordIDs.join('') === this.x_recordIDs.join('')) { return deletedRows; } Ext.Array.each(this.x_recordIDs, function (recordID, index) { if (currentRecordIDs.indexOf(recordID) < 0) { deletedRows.push(index); } }); return deletedRows; }, // 获取用户修改的单元格值 x_getModifiedData: function () { var i, j, count, columns = this.x_getColumns(), columnMap = {}; Ext.Array.each(columns, function (column, index) { columnMap[column.id] = column; }); function checkColumnEditable(columnID) { var column = columnMap[columnID]; if (column && (column.editor || column.xtype === 'checkcolumn')) { return true; } return false; } var modifiedRows = []; var store = this.getStore(); var modifiedRecords = store.getModifiedRecords(); var rowIndex, rowData, newData, modifiedRecord, recordID, rowIndexOriginal; for (i = 0, count = modifiedRecords.length; i < count; i++) { modifiedRecord = modifiedRecords[i]; recordID = modifiedRecord.id; rowIndex = store.indexOf(modifiedRecord); rowData = modifiedRecord.data; if (rowIndex < 0) { continue; } // 本行数据在原始数据集合中的行索引 rowIndexOriginal = this.x_recordIDs.indexOf(recordID); if (rowIndexOriginal < 0) { // 删除那些不能编辑的列 for (var columnID in rowData) { if (!checkColumnEditable(columnID)) { delete rowData[columnID]; } } // 新增数据行 modifiedRows.push([rowIndex, -1, rowData]); } else { var rowModifiedObj = {}; for (var columnID in modifiedRecord.modified) { if (checkColumnEditable(columnID)) { newData = rowData[columnID]; rowModifiedObj[columnID] = newData; } } // 修改现有数据行 modifiedRows.push([rowIndex, rowIndexOriginal, rowModifiedObj]); } } // 结果按照 rowIndex 升序排序 return modifiedRows.sort(function (a, b) { return a[0] - b[0]; }); } }); } if (Ext.tree.Panel) { Ext.override(Ext.tree.Panel, { x_loadData: function () { var datas = this.x_state['X_Nodes']; var nodes = this.x_tranformData(datas); var root = this.getRootNode(); if (root) { root.removeAll(); } this.setRootNode({ //id: this.id + '_root', expanded: true, children: nodes }); }, x_tranformData: function (datas) { var that = this, i = 0, nodes = []; for (i = 0; i < datas.length; i++) { var data = datas[i], node = {}; // 0 - Text // 1 - Leaf // 2 - NodeID // 3 - Enabled // 4 - EnableCheckBox // 5 - Checked // 6 - Expanded // 7 - NavigateUrl // 8 - Target // 9 - href // 10 - Icon // 11 - IconUrl // 12 - iconUrl // 13 - ToolTip // 14 - OnClientClick // 15 - EnablePostBack // 16 - AutoPostBack // 17 - CommandName // 18 - CommandArgument // 19 - Nodes node.text = data[0]; node.leaf = !!data[1]; node.id = data[2]; node.disabled = !data[3]; if (!!data[4]) { node.checked = !!data[5]; if (!!data[16]) { node.x_autopostback = true; } } if (!data[1]) { node.expanded = !!data[6]; } if (data[9]) { node.href = data[9]; node.hrefTarget = data[8]; } if (data[12]) { node.icon = data[12]; } node.qtip = data[13]; if (data[14]) { node.x_clientclick = data[14]; } node.x_enablepostback = !!data[15]; node.x_commandname = data[17]; node.x_commandargument = data[18]; if (data[19] && data[19].length > 0) { node.children = that.x_tranformData(data[19]); } /* node.listeners = {}; if (!data[3]) { node.listeners.beforeclick = function () { return false; }; } if (!!data[4] && !!data[17]) { node.listeners.checkchange = function (node, checked) { var args = 'Check$' + node.id + '$' + checked; __doPostBack(that.name, args); }; } var clickScript = ''; if (data[15]) { clickScript += data[15] + ';'; } if (!!data[16]) { clickScript += "__doPostBack('" + that.name + "', 'Command$" + node.id + "$" + data[18] + "$" + data[19] + "');"; } if (clickScript) { node.listeners.click = new Function('node', clickScript); } if (data[20] && data[20].length > 0) { node.children = that.x_tranformData(data[20]); } */ nodes.push(node); } return nodes; }, x_getExpandedNodes: function (nodes) { var i = 0, that = this, expandedNodes = []; for (; i < nodes.length; i++) { var node = nodes[i]; if (node.isExpanded()) { expandedNodes.push(node.getId()); } if (node.hasChildNodes()) { expandedNodes = expandedNodes.concat(that.x_getExpandedNodes(node.childNodes)); } } return expandedNodes; }, x_getCheckedNodes: function () { var checkedIDs = [], checkedArray = this.getChecked(); Ext.Array.each(checkedArray, function (node, index) { checkedIDs.push(node.getId()); }); return checkedIDs; }, x_getSelectedNodes: function () { var selectedNodeIDs = []; var sm = this.getSelectionModel(); if (sm.getSelection) { var selection = sm.getSelection(); Ext.Array.each(selection, function (node, index) { selectedNodeIDs.push(node.getId()); }); } return selectedNodeIDs; }, x_selectNodes: function () { var nodeIDs = this.x_state['SelectedNodeIDArray'] || []; var model = this.getSelectionModel(), store = this.getStore(), nodes = []; Ext.Array.each(nodeIDs, function (nodeID, index) { nodes.push(store.getNodeById(nodeID)); }); model.deselectAll(true); model.select(nodes); } }); } if (Ext.PagingToolbar) { // We don't use this Class in current version. Ext.override(Ext.PagingToolbar, { x_hideRefresh: function () { var index = this.items.indexOf(this.refresh); this.items.get(index - 1).hide(); this.refresh.hide(); } }); } if (Ext.tab.Panel) { Ext.override(Ext.tab.Panel, { x_autoPostBackTabsContains: function (tabId) { var tabs = this.x_state['X_AutoPostBackTabs']; return tabs.indexOf(tabId) !== -1; }, x_setActiveTab: function () { var tabIndex = this.x_state['ActiveTabIndex']; this.setActiveTab(tabIndex); }, x_getActiveTabIndex: function () { return this.items.indexOf(this.getActiveTab()); }, /* activateNextTab: function (c) { if (c == this.activeTab) { var next = this.stack.next(); if (next) { this.setActiveTab(next); } if (next = this.items.find(function (t) { return t.tabEl.style.display !== 'none'; })) { // Find the first visible tab and set it active tab. this.setActiveTab(next); } else { this.setActiveTab(null); } } }, */ hideTab: function (tabId) { var tab = X(tabId).tab; if (tab) { tab.hide(); } }, showTab: function (tabId) { var tab = X(tabId).tab; if (tab) { tab.show(); } }, addTab: function (id, url, title, closable) { var options = {}; if (typeof (id) === 'string') { Ext.apply(options, { 'id': id, 'title': title, 'closable': closable, 'url': url }); } else { // 如果id不是字符串,则id为对象并且只有一个参数 Ext.apply(options, id); } Ext.apply(options, { 'x_dynamic_added_tab': true, 'html': '