git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.DevExpressVCL@32 05c56307-c608-d34a-929d-697000501d7a
389 lines
18 KiB
JavaScript
389 lines
18 KiB
JavaScript
/*
|
|
ExpressWeb Framework by Developer Express
|
|
ExpressWebDataSource
|
|
|
|
Copyright (c) 2000-2004 Developer Express Inc.
|
|
ALL RIGHTS RESERVED
|
|
|
|
The entire contents of this file is protected by U.S. and
|
|
International Copyright Laws. Unauthorized reproduction,
|
|
reverse-engineering, and distribution of all or any portion of
|
|
the code contained in this file is strictly prohibited and may
|
|
result in severe civil and criminal penalties and will be
|
|
prosecuted to the maximum extent possible under the law.
|
|
*/
|
|
|
|
var soNone = 0
|
|
var soAscending = 1
|
|
var soDescending = 2
|
|
var itemRemoved = 0;
|
|
var itemChanged = 1;
|
|
var itemAdded = 2;
|
|
|
|
function SortingArrayItem()
|
|
{
|
|
this.sortingIndex = -1;
|
|
this.sortingOrder = soNone;
|
|
}
|
|
|
|
function dx_DataEngine(ADataController)
|
|
{
|
|
this.DataController = ADataController;
|
|
this.groupingArray = new Array();
|
|
this.sortingArray = new Array();
|
|
this.expandingArray = new Array();
|
|
this.globalSortingArray = new Array();
|
|
this.globalRowsArray = new Array();
|
|
this.RestoreFocusing = function(oldFocusedRow) {
|
|
if(!oldFocusedRow) return;
|
|
for(var i = 0; i < this.DataController.RowCount; i ++) {
|
|
if(this.DataController.Rows[i] == oldFocusedRow) {
|
|
this.DataController.FocusedRow = i;
|
|
this.DataController.SyncronizeFocusingInfo();
|
|
return;
|
|
}
|
|
}
|
|
for(var i = 0; i < this.DataController.RowCount; i ++) {
|
|
if(this.DataController.Rows[i].recordIndex == oldFocusedRow.recordIndex) {
|
|
this.DataController.FocusedRow = i;
|
|
this.DataController.SyncronizeFocusingInfo();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
this.GetSortingItemCount = function() {
|
|
var sortingItemCount = 0;
|
|
for(var i = 0; i < this.DataController.ItemCount; i ++) {
|
|
if (Exists(this.sortingArray[i])) {
|
|
if(this.sortingArray[i].sortingIndex != -1) sortingItemCount ++;
|
|
}
|
|
}
|
|
return sortingItemCount;
|
|
}
|
|
this.GetItemSortIndex = function(AItemIndex) {
|
|
if (Exists(this.sortingArray[AItemIndex]))
|
|
return this.sortingArray[AItemIndex].sortingIndex;
|
|
else
|
|
return -1;
|
|
}
|
|
this.GetItemSortOrder = function(AItemIndex) {
|
|
if (Exists(this.sortingArray[AItemIndex]))
|
|
return this.sortingArray[AItemIndex].sortingOrder;
|
|
else
|
|
return soNone;
|
|
}
|
|
this.GetSortingItemIndex = function(Index) {
|
|
for(var i = 0; i < this.DataController.ItemCount; i ++) {
|
|
if (Exists(this.sortingArray[i])) {
|
|
if(this.sortingArray[i].sortingIndex == Index) return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
this.ChangeSorting = function(SortingItem, SortingOrder) {
|
|
var SavedFocusedRow = this.DataController.Rows[this.DataController.FocusedRow];
|
|
if(SortingOrder == soNone) {
|
|
if(this.sortingArray[SortingItem].sortingIndex != -1 && this.groupingArray[SortingItem] == -1) {
|
|
for(var i = 0; i < this.DataController.ItemCount; i ++) {
|
|
if(this.sortingArray[i].sortingIndex > this.sortingArray[SortingItem].sortingIndex) {
|
|
this.sortingArray[i].sortingIndex --;
|
|
}
|
|
}
|
|
this.sortingArray[SortingItem].sortingIndex = -1;
|
|
this.sortingArray[SortingItem].sortingOrder = SortingOrder;
|
|
}
|
|
} else {
|
|
if(this.sortingArray[SortingItem].sortingIndex == -1)
|
|
this.sortingArray[SortingItem].sortingIndex = this.GetSortingItemCount();
|
|
this.sortingArray[SortingItem].sortingOrder = SortingOrder;
|
|
}
|
|
|
|
this.UpdateRowInfo(true);
|
|
this.RestoreFocusing(SavedFocusedRow);
|
|
|
|
this.DataController.SyncronizeExpandingInfo();
|
|
this.DataController.SyncronizeSortingInfo();
|
|
}
|
|
this.ClearSorting = function() {
|
|
var SavedFocusedRow = this.DataController.Rows[this.DataController.FocusedRow];
|
|
for(var i = 0; i < this.DataController.ItemCount; i ++) {
|
|
if(this.groupingArray[i] == -1) {
|
|
this.sortingArray[i].sortingIndex = -1;
|
|
this.sortingArray[i].sortingOrder = soNone;
|
|
}
|
|
}
|
|
this.UpdateRowInfo(true);
|
|
this.RestoreFocusing(SavedFocusedRow);
|
|
|
|
this.DataController.SyncronizeExpandingInfo();
|
|
this.DataController.SyncronizeSortingInfo();
|
|
}
|
|
this.GetGroupingItemCount = function() {
|
|
var groupingItemCount = 0;
|
|
for(var i = 0; i < this.DataController.ItemCount; i ++) {
|
|
if (Exists(this.groupingArray[i])) {
|
|
if(this.groupingArray[i] != -1) groupingItemCount ++;
|
|
}
|
|
}
|
|
return groupingItemCount;
|
|
}
|
|
this.GetItemGroupIndex = function(AItemIndex) {
|
|
if (Exists(this.groupingArray[AItemIndex]))
|
|
return this.groupingArray[AItemIndex];
|
|
else
|
|
return -1;
|
|
}
|
|
this.GetGroupingItemIndex = function(Index) {
|
|
for(var i = 0; i < this.DataController.ItemCount; i ++) {
|
|
if (Exists(this.groupingArray[i])) {
|
|
if(this.groupingArray[i] == Index) return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
this.UpdateSortingArray = function(GroupingItem, operation) {
|
|
if(operation == itemRemoved) {
|
|
this.sortingArray[GroupingItem].sortingIndex = -1;
|
|
for(var i = 0; i < this.DataController.ItemCount; i ++) {
|
|
if(this.groupingArray[i] != -1) this.sortingArray[i].sortingIndex = this.groupingArray[i];
|
|
}
|
|
for(var i = 0; i < this.DataController.ItemCount; i ++) {
|
|
if(this.groupingArray[i] == -1) {
|
|
if(this.sortingArray[i].sortingIndex != -1) this.sortingArray[i].sortingIndex --;
|
|
}
|
|
}
|
|
} else {
|
|
if(operation == itemChanged) {
|
|
for(var i = 0; i < this.DataController.ItemCount; i ++) {
|
|
if(this.groupingArray[i] != -1) this.sortingArray[i].sortingIndex = this.groupingArray[i];
|
|
}
|
|
} else {
|
|
for(var i = 0; i < this.DataController.ItemCount; i ++) {
|
|
if(this.groupingArray[i] == -1) {
|
|
if(this.sortingArray[i].sortingIndex != -1) this.sortingArray[i].sortingIndex ++;
|
|
}
|
|
}
|
|
for(var i = 0; i < this.DataController.ItemCount; i ++) {
|
|
if(this.groupingArray[i] != -1) this.sortingArray[i].sortingIndex = this.groupingArray[i];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
this.ChangeGrouping = function(GroupingItem, GroupingIndex) {
|
|
if(this.GetGroupingItemCount() == this.DataController.ItemCount - 1 && GroupingIndex != -1) return;
|
|
var SavedFocusedRow = this.DataController.Rows[this.DataController.FocusedRow];
|
|
if (GroupingIndex > this.GetGroupingItemCount()) GroupingIndex = this.GetGroupingItemCount();
|
|
|
|
if(GroupingIndex == -1) {
|
|
for(var i = 0; i < this.DataController.ItemCount; i ++) {
|
|
if(this.groupingArray[i] != -1) {
|
|
if(this.groupingArray[i] > this.groupingArray[GroupingItem]) this.groupingArray[i] --;
|
|
}
|
|
}
|
|
this.groupingArray[GroupingItem] = GroupingIndex;
|
|
this.sortingArray[GroupingItem].sortingOrder = soNone;
|
|
this.UpdateSortingArray(GroupingItem, itemRemoved);
|
|
} else {
|
|
if(this.groupingArray[GroupingItem] != -1) {
|
|
if (GroupingIndex >= this.GetGroupingItemCount()) GroupingIndex = this.GetGroupingItemCount() - 1;
|
|
var oldGroupingIndex = this.groupingArray[GroupingItem];
|
|
if((oldGroupingIndex - GroupingIndex) > 0) {
|
|
for(var i = 0; i < this.DataController.ItemCount; i ++) {
|
|
if(this.groupingArray[i] != -1) {
|
|
if(this.groupingArray[i] < oldGroupingIndex && this.groupingArray[i] >= GroupingIndex) this.groupingArray[i] ++;
|
|
}
|
|
}
|
|
}
|
|
if((oldGroupingIndex - GroupingIndex) < 0) {
|
|
for(i = 0; i < this.DataController.ItemCount; i ++) {
|
|
if(this.groupingArray[i] != -1) {
|
|
if(this.groupingArray[i] > oldGroupingIndex && this.groupingArray[i] <= GroupingIndex) this.groupingArray[i] --;
|
|
}
|
|
}
|
|
}
|
|
this.groupingArray[GroupingItem] = GroupingIndex;
|
|
this.sortingArray[GroupingItem].sortingOrder = soAscending;
|
|
this.UpdateSortingArray(GroupingItem, itemChanged);
|
|
} else {
|
|
if (GroupingIndex > this.GetGroupingItemCount()) GroupingIndex = this.GetGroupingItemCount();
|
|
for(var i = 0; i < this.DataController.ItemCount; i ++) {
|
|
if(this.groupingArray[i] != -1) {
|
|
if(this.groupingArray[i] >= GroupingIndex) this.groupingArray[i] ++;
|
|
}
|
|
}
|
|
this.groupingArray[GroupingItem] = GroupingIndex;
|
|
this.sortingArray[GroupingItem].sortingOrder = soAscending;
|
|
this.UpdateSortingArray(GroupingItem, itemAdded);
|
|
}
|
|
}
|
|
this.UpdateRowInfo(true);
|
|
this.RestoreFocusing(SavedFocusedRow);
|
|
|
|
this.DataController.SyncronizeExpandingInfo();
|
|
this.DataController.SyncronizeGroupingInfo();
|
|
this.DataController.SyncronizeSortingInfo();
|
|
}
|
|
this.ClearGrouping = function() {
|
|
var SavedFocusedRow = this.DataController.Rows[this.DataController.FocusedRow];
|
|
for(var i = 0; i < this.DataController.ItemCount; i ++) this.groupingArray[i] = -1;
|
|
this.UpdateRowInfo(true);
|
|
this.RestoreFocusing(SavedFocusedRow);
|
|
|
|
this.DataController.SyncronizeExpandingInfo();
|
|
this.DataController.SyncronizeGroupingInfo();
|
|
this.DataController.SyncronizeSortingInfo();
|
|
}
|
|
this.ChangeExpanding = function(rowIndex, AExpanded, ARecursive) {
|
|
if(this.DataController.Rows[rowIndex].level == this.GetGroupingItemCount()) return;
|
|
var SavedFocusedRow = this.DataController.Rows[this.DataController.FocusedRow];
|
|
var globalIndex = this.DataController.Rows[rowIndex].globalIndex;
|
|
this.globalRowsArray[globalIndex].expanded = AExpanded;
|
|
if(ARecursive) {
|
|
var Level = this.globalRowsArray[globalIndex].level;
|
|
for(var i = globalIndex + 1; i < this.globalRowsArray.length; i ++) {
|
|
if(this.globalRowsArray[i].level == Level) break;
|
|
if(this.globalRowsArray[i].level < this.GetGroupingItemCount())
|
|
this.globalRowsArray[i].expanded = AExpanded;
|
|
}
|
|
}
|
|
this.UpdateRowInfo(false);
|
|
this.RestoreFocusing(SavedFocusedRow);
|
|
this.DataController.SyncronizeExpandingInfo();
|
|
}
|
|
this.FullExpand = function() {
|
|
var SavedFocusedRow = this.DataController.Rows[this.DataController.FocusedRow];
|
|
for(var i = 0; i < this.globalRowsArray[i].length; i ++) {
|
|
if(this.globalRowsArray[i].level < this.GetGroupingItemCount())
|
|
this.globalRowsArray[i].expanded = true;
|
|
}
|
|
this.UpdateRowInfo(false);
|
|
this.RestoreFocusing(SavedFocusedRow);
|
|
this.DataController.SyncronizeExpandingInfo();
|
|
}
|
|
this.FullCollapse = function() {
|
|
var SavedFocusedRow = this.DataController.Rows[this.DataController.FocusedRow];
|
|
for(var i = 0; i < this.globalRowsArray[i].length; i ++) {
|
|
this.globalRowsArray[i].expanded = false;
|
|
}
|
|
this.UpdateRowInfo(false);
|
|
this.RestoreFocusing(SavedFocusedRow);
|
|
this.DataController.SyncronizeExpandingInfo();
|
|
}
|
|
this.GetDataRecordNumber = function(recordIndex) {
|
|
for(var i = 0; i < this.DataController.RecordCount; i ++) {
|
|
if(this.globalSortingArray[i] == recordIndex) return i;
|
|
}
|
|
return -1;
|
|
}
|
|
this.CompareRows = function(rowIndex1, rowIndex2) {
|
|
if (rowIndex1==rowIndex2) return 0;
|
|
var row1 = this.DataController.Values[rowIndex1];
|
|
var row2 = this.DataController.Values[rowIndex2];
|
|
for(var i = 0; i < this.GetSortingItemCount(); i ++) {
|
|
var itemIndex = this.GetSortingItemIndex(i);
|
|
var value1 = row1[itemIndex];
|
|
var value2 = row2[itemIndex];
|
|
var ret;
|
|
if(value1 == value2) continue;
|
|
if(value1 == null) ret = -1;
|
|
if(value2 == null) ret = 1;
|
|
if(value1 < value2) ret = -1;
|
|
if(value1 > value2) ret = 1;
|
|
if(this.sortingArray[itemIndex].sortingOrder == soDescending) ret *= -1;
|
|
return ret;
|
|
}
|
|
return (rowIndex1 > rowIndex2)?1:-1;
|
|
}
|
|
this.UpdateGlobalSortingArray = function() {
|
|
this.globalSortingArray = [];
|
|
if(this.DataController.RecordCount > 0) {
|
|
var tempSortingArray = [];
|
|
for(var i = 0; i < this.DataController.RecordCount; i ++) {
|
|
tempSortingArray[i] = i;
|
|
}
|
|
while (tempSortingArray.length > 0) {
|
|
var maxIndex = 0;
|
|
for(var i = 1; i < tempSortingArray.length; i ++) {
|
|
if (this.CompareRows(tempSortingArray[maxIndex], tempSortingArray[i]) == 1)
|
|
maxIndex = i;
|
|
}
|
|
this.globalSortingArray[this.globalSortingArray.length] = tempSortingArray[maxIndex];
|
|
tempSortingArray[maxIndex] = tempSortingArray[tempSortingArray.length - 1];
|
|
tempSortingArray.length--;
|
|
}
|
|
}
|
|
}
|
|
this.NeedGroupNode = function(Index, Level) {
|
|
if(Index == 0) return true;
|
|
for(var i = 0; i <= Level; i ++) {
|
|
var ItemIndex = this.GetGroupingItemIndex(i);
|
|
if(this.DataController.Values[this.globalSortingArray[Index]][ItemIndex] !=
|
|
this.DataController.Values[this.globalSortingArray[Index - 1]][ItemIndex])
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
this.UpdateGlobalRowsArray = function() {
|
|
var globalRowCount = 0;
|
|
this.globalRowsArray = [];
|
|
for(var i = 0; i < this.DataController.RecordCount; i ++) {
|
|
for(var j = 0; j < this.GetGroupingItemCount(); j ++) {
|
|
if(this.NeedGroupNode(i, j)) {
|
|
this.globalRowsArray[globalRowCount] = new dx_Row()
|
|
this.globalRowsArray[globalRowCount].expanded = false;
|
|
this.globalRowsArray[globalRowCount].level = j;
|
|
this.globalRowsArray[globalRowCount].recordIndex = this.globalSortingArray[i];
|
|
this.globalRowsArray[globalRowCount].globalIndex = globalRowCount;
|
|
globalRowCount ++;
|
|
}
|
|
}
|
|
this.globalRowsArray[globalRowCount] = new dx_Row()
|
|
this.globalRowsArray[globalRowCount].expanded = false;
|
|
this.globalRowsArray[globalRowCount].level = this.GetGroupingItemCount();
|
|
this.globalRowsArray[globalRowCount].recordIndex = this.globalSortingArray[i];
|
|
this.globalRowsArray[globalRowCount].globalIndex = globalRowCount;
|
|
globalRowCount ++;
|
|
}
|
|
}
|
|
this.UpdateRowInfo = function(UpdateAll) {
|
|
if(UpdateAll) {
|
|
this.UpdateGlobalSortingArray();
|
|
this.UpdateGlobalRowsArray();
|
|
}
|
|
|
|
var Level = 0, RowCount = 0;
|
|
this.DataController.Rows = [];
|
|
for(var i = 0; i < this.globalRowsArray.length; i ++) {
|
|
if(Level >= this.globalRowsArray[i].level)
|
|
{
|
|
if(this.globalRowsArray[i].expanded == false) {
|
|
Level = this.globalRowsArray[i].level;
|
|
} else {
|
|
Level = this.globalRowsArray[i].level + 1;
|
|
}
|
|
this.DataController.Rows[RowCount] = new dx_Row();
|
|
this.DataController.Rows[RowCount] = this.globalRowsArray[i];
|
|
RowCount ++;
|
|
}
|
|
}
|
|
this.DataController.RowCount = this.DataController.Rows.length;
|
|
}
|
|
this.LoadExpandingInfo = function() {
|
|
for(var i = 0; i < this.expandingArray.length; i ++) {
|
|
if(i >= this.DataController.RowCount) break;
|
|
if(this.expandingArray[i]) {
|
|
if(this.DataController.Rows[i].level == this.GetGroupingItemCount()) continue;
|
|
var globalIndex = this.DataController.Rows[i].globalIndex;
|
|
this.globalRowsArray[globalIndex].expanded = true;
|
|
this.UpdateRowInfo(false);
|
|
}
|
|
}
|
|
}
|
|
this.SaveExpandingInfo = function() {
|
|
this.expandingArray = [];
|
|
for(var i = 0; i < this.DataController.Rows.length; i ++) {
|
|
this.expandingArray[i] = this.DataController.Rows[i].expanding;
|
|
}
|
|
}
|
|
}
|