/**
* Created by Mai on 2017/4/1.
*/
var TREE_SHEET_HELPER = {
getObjPos: function (obj) {
let target = obj;
let pos = {x: obj.offsetLeft, y: obj.offsetTop};
target = obj.offsetParent;
while (target) {
pos.x += target.offsetLeft;
pos.y += target.offsetTop;
target = target.offsetParent;
}
return pos;
},
/**
* 初始化setting,需要提示单元格text时,必须先初始化setting
* @param obj
* @param setting
*/
/*initSetting: function (obj, setting) {
setting.pos = this.getObjPos(obj);
},*/
initSetting: function (obj, setting) {
setting.pos = this.getObjPos(obj);
},
createNewSpread: function (obj) {
var spread = new GC.Spread.Sheets.Workbook(obj, {sheetCount: 1});
spread.options.tabStripVisible = false;
spread.options.scrollbarMaxAlign = true;
spread.options.cutCopyIndicatorVisible = false;
spread.options.allowCopyPasteExcelStyle = false;
spread.options.allowUserDragDrop = false;
spread.getActiveSheet().setRowCount(3);
return spread;
},
getSheetCellStyle: function (setting) {
var style = new GC.Spread.Sheets.Style();
//style.locked = setting.readOnly ? true : false;
style.name = setting.id;
//style.font = setting.data.font;
style.hAlign = setting.data.hAlign;
style.vAlign = setting.data.vAlign;
style.wordWrap = setting.data.wordWrap;
if (setting.data.formatter) {
style.formatter = setting.data.formatter;
}
return style;
},
loadSheetHeader: function (setting, sheet) {
this.massOperationSheet(sheet, function () {
if(setting.rowHeaderWidth !== undefined && setting.rowHeaderWidth !== null){
sheet.setColumnWidth(0, setting.rowHeaderWidth, GC.Spread.Sheets.SheetArea.rowHeader);
}
if (setting.frozenCols) {
sheet.frozenColumnCount(setting.frozenCols);
}
sheet.setColumnCount(setting.cols.length);
sheet.setRowCount(setting.headRows, GC.Spread.Sheets.SheetArea.colHeader);
setting.headRowHeight.forEach(function (rowHeight, index) {
sheet.setRowHeight(index, rowHeight, GC.Spread.Sheets.SheetArea.colHeader);
});
setting.cols.forEach(function (col, index) {
var i, iRow = 0, cell;
for (i = 0; i < col.head.spanCols.length; i++) {
if (col.head.spanCols[i] !== 0) {
cell = sheet.getCell(iRow, index, GC.Spread.Sheets.SheetArea.colHeader);
//cell.value(col.head.titleNames[i]).font(col.head.font).hAlign(col.head.hAlign[i]).vAlign(col.head.vAlign[i]).wordWrap(true);
cell.value(col.head.titleNames[i]).hAlign(col.head.hAlign[i]).vAlign(col.head.vAlign[i]).wordWrap(true);
}
if (col.head.spanCols[i] > 1 || col.head.spanRows[i] > 1) {
sheet.addSpan(iRow, index, col.head.spanRows[i], col.head.spanCols[i], GC.Spread.Sheets.SheetArea.colHeader);
}
iRow += col.head.spanRows[i];
};
sheet.setColumnWidth(index, col.width);
sheet.setColumnVisible(index, col.visible && true);
});
});
},
protectdSheet: function (sheet) {
var option = {
allowSelectLockedCells: true,
allowSelectUnlockedCells: true,
allowResizeRows: true,
allowResizeColumns: true
};
sheet.options.protectionOptions = option;
sheet.options.isProtected = true;
sheet.options.allowCellOverflow = false;
},
massOperationSheet: function (sheet, Operation) {
sheet.suspendPaint();
sheet.suspendEvent();
Operation();
sheet.resumeEvent();
sheet.resumePaint();
},
refreshNodesVisible: function (nodes, sheet, recursive) {
nodes.forEach(function (node) {
var iRow;
iRow = node.serialNo();
sheet.setRowVisible(iRow, node.visible, GC.Spread.Sheets.SheetArea.viewport);
if (recursive) {
TREE_SHEET_HELPER.refreshNodesVisible(node.children, sheet, recursive);
}
})
},
refreshTreeNodeData: function (setting, sheet, nodes, recursive) {
nodes.forEach(function (node) {
let iRow = node.serialNo();
if(setting.emptyRowHeader){
sheet.setValue(iRow, 0, '', GC.Spread.Sheets.SheetArea.rowHeader);
}
if(typeof projectObj !== 'undefined'){
let nodeStyle = projectObj.getNodeColorStyle(sheet, node);
if(node.data.bgColour){
nodeStyle.backColor = node.data.bgColour;
}
if(nodeStyle){
sheet.setStyle(iRow, -1, nodeStyle);
}
}
setting.cols.forEach(function (colSetting, iCol) {
var cell = sheet.getCell(iRow, iCol, GC.Spread.Sheets.SheetArea.viewport);
/* if(typeof projectObj !== 'undefined'){ 7/28 取消黑体显示
let boldFontStyle = projectObj.getBoldFontStyle(node, colSetting);
sheet.setStyle(iRow, iCol, boldFontStyle);
}
}*/
// var getFieldText = function () {
// var fields = colSetting.data.field.split('.');
// var validField = fields.reduce(function (field1, field2) {
// if (eval('node.data.' + field1)) {
// return field1 + '.' + field2
// } else {
// return field1;
// }
// });
// if (eval('node.data.' + validField)) {
// return eval('node.data.' + validField);
// } else {
// return '';
// }
// };
var getFieldText2 = function () {
var fields = colSetting.data.field.split('.'), iField, data = node.data;
for (iField = 0; iField < fields.length; iField++) {
if (data[fields[iField]] && data[fields[iField]]!='0') {
data = data[fields[iField]];
} else {
return '';
}
}
return data;
};
if(sheet.name()=="mainSheet"){
/* if(colSetting.data.field=="quantity"){ 2018-08-06 去掉工程量列表达式
let tag = node.data.quantityEXP?node.data.quantityEXP:'';
sheet.setTag(iRow, iCol,tag);
}*/
if(colSetting.data.field=="code"){
let tag ="";
if(node.sourceType == ModuleNames.ration){//定额的时候换算子目
tag = node.data.adjustState?node.data.adjustState:'';
}else if(node.sourceType == ModuleNames.bills &&projectObj.ifItemCharHiden(setting)){//清单、并且项目特征列隐藏的时候悬浮提示
tag = node.data.itemCharacterText?node.data.itemCharacterText:'';
}
sheet.setTag(iRow, iCol,tag);
}
/*if(colSetting.data.field=="name"){ 2018-08-06 改成在编号列悬浮提示
let tag = node.data.itemCharacterText?node.data.itemCharacterText:'';
sheet.setTag(iRow, iCol,tag);
}*/
}
if (colSetting.data.getText && Object.prototype.toString.apply(colSetting.data.getText) === "[object Function]") {
cell.value(colSetting.data.getText(node));
} else {
cell.value(getFieldText2());
}
if (colSetting.data.cellType && Object.prototype.toString.apply(colSetting.data.cellType) !== "[object String]") {
cell.cellType(colSetting.data.cellType(node));
}
if(colSetting.data.autoHeight == true){
colSetting.setAutoHeight(cell,node);
}
if(colSetting.editChecking&&colSetting.editChecking(node)){
cell.locked(true);
}else if (colSetting.readOnly) {
if(typeof projectReadOnly !== 'undefined' && projectReadOnly){
cell.locked(true);
}else {
if (Object.prototype.toString.apply(colSetting.readOnly) === "[object Function]") {
cell.locked(colSetting.readOnly(node));
} else {
cell.locked(true);
}
}
} else {
cell.locked(typeof projectReadOnly !== 'undefined' && projectReadOnly ? true : false);
}
});
if(setting.setAutoFitRow){
setting.setAutoFitRow(sheet,node)
}
if (recursive) {
TREE_SHEET_HELPER.refreshTreeNodeData(setting, sheet, node.children, recursive);
}
});
},
refreshChildrenVisiable:function(sheet,tree,node,row,visiable){
let iCount = node.posterityCount(), i, child;
for (i = 0; i < iCount; i++) {
child = tree.items[row + i +1];
sheet.setRowVisible(row + i + 1, visiable?visiable:child.visible, GC.Spread.Sheets.SheetArea.viewport);
}
sheet.invalidateLayout();
},
showTreeData: function (setting, sheet, tree) {
let indent = 20;
let levelIndent = -5;
let halfBoxLength = 5;
let halfExpandLength = 3;
let TreeNodeCellType = function () {
};
TreeNodeCellType.prototype = new GC.Spread.Sheets.CellTypes.Text();
TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
if (style.backColor) {
ctx.save();
ctx.fillStyle = style.backColor;
ctx.fillRect(x, y, w, h);
ctx.restore();
} else {
ctx.clearRect(x, y, w, h);
}
// ������(x1, y1)���(��, ��), (x2, y2)�յ�(��, ��), ��ɫ
let drawLine = function (canvas, x1, y1, x2, y2, color) {
ctx.save();
// ����ƫ����
ctx.translate(0.5, 0.5);
ctx.beginPath();
ctx.moveTo(x1, y1);
ctx.lineTo(x2, y2);
ctx.strokeStyle = color;
ctx.stroke();
ctx.restore();
};
let drawExpandBox = function (ctx, x, y, w, h, centerX, centerY, expanded) {
let rect = {}, h1, h2, offset = 1;
rect.top = centerY - halfBoxLength;
rect.bottom = centerY + halfBoxLength;
rect.left = centerX - halfBoxLength;
rect.right = centerX + halfBoxLength;
if (rect.left < x + w) {
rect.right = Math.min(rect.right, x + w);
ctx.save();
// ����ƫ����
ctx.translate(0.5, 0.5);
ctx.strokeStyle = 'black';
ctx.beginPath();
ctx.moveTo(rect.left, rect.top);
ctx.lineTo(rect.left, rect.bottom);
ctx.lineTo(rect.right, rect.bottom);
ctx.lineTo(rect.right, rect.top);
ctx.lineTo(rect.left, rect.top);
ctx.stroke();
ctx.fillStyle = 'white';
ctx.fill();
ctx.restore();
// Draw Horizontal Line
h1 = centerX - halfExpandLength;
h2 = Math.min(centerX + halfExpandLength, x + w);
if (h2 > h1) {
drawLine(ctx, h1, centerY, h2, centerY, 'black');
}
// Draw Vertical Line
if (!expanded && (centerX < x + w)) {
drawLine(ctx, centerX, centerY - halfExpandLength, centerX, centerY + halfExpandLength, 'black');
}
}
}
let node = tree.items[options.row];
let showTreeLine = true;
if (!node) { return; }
let centerX = Math.floor(x) + node.depth() * indent + node.depth() * levelIndent + indent / 2;
let x1 = centerX + indent / 2;
let centerY = Math.floor((y + (y + h)) / 2);
let y1;
// Draw Sibling Line
if (showTreeLine) {
// Draw Horizontal Line
if (centerX < x + w) {
drawLine(ctx, centerX, centerY, Math.min(x1, x + w), centerY, 'gray');
}
// Draw Vertical Line
if (centerX < x + w) {
y1 = node.isLast() ? centerY : y + h;
if (node.isFirst() && !node.parent) {
drawLine(ctx, centerX, centerY, centerX, y1, 'gray');
} else {
drawLine(ctx, centerX, y, centerX, y1, 'gray');
}
}
}
// Draw Expand Box
if (node.children.length > 0) {
drawExpandBox(ctx, x, y, w, h, centerX, centerY, node.expanded);
}
// Draw Parent Line
if (showTreeLine) {
var parent = node.parent, parentCenterX = centerX - indent - levelIndent;
while (parent) {
if (!parent.isLast()) {
if (parentCenterX < x + w) {
drawLine(ctx, parentCenterX, y, parentCenterX, y + h, 'gray');
}
}
parent = parent.parent;
parentCenterX -= (indent + levelIndent);
}
};
// Draw Text
x = x + (node.depth() + 1) * indent + node.depth() * levelIndent;
w = w - (node.depth() + 1) * indent - node.depth() * levelIndent;
GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
};
TreeNodeCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
return {
x: x,
y: y,
row: context.row,
col: context.col,
cellStyle: cellStyle,
cellRect: cellRect,
sheetArea: context.sheetArea
};
};
TreeNodeCellType.prototype.processMouseDown = function (hitinfo) {
let offset = -1;
let node = tree.items[hitinfo.row];
tree.selected = node;
if (!node || node.children.length === 0) { return; }
let centerX = hitinfo.cellRect.x + offset + node.depth() * indent + node.depth() * levelIndent + indent / 2;
let centerY = (hitinfo.cellRect.y + offset + (hitinfo.cellRect.y + offset + hitinfo.cellRect.height)) / 2;
if (hitinfo.x > centerX - halfBoxLength && hitinfo.x < centerX + halfBoxLength && hitinfo.y > centerY - halfBoxLength && hitinfo.y < centerY + halfBoxLength) {
node.setExpanded(!node.expanded);
let sheetName = hitinfo.sheet.name();
if(sheetName === 'stdBillsLib_bills'){
sessionStorage.setItem('stdBillsLibExpState', billsLibObj.stdBillsTree.getExpState(billsLibObj.stdBillsTree.items));
}
else if(sheetName === 'stdRationLib_chapter'){
sessionStorage.setItem('stdRationLibExpState', rationLibObj.tree.getExpState(rationLibObj.tree.items));
}
else if(sheetName === 'stdBillsGuidance_bills'){
sessionStorage.setItem('stdBillsGuidanceExpState', billsGuidance.bills.tree.getExpState(billsGuidance.bills.tree.items));
}
TREE_SHEET_HELPER.massOperationSheet(hitinfo.sheet, function () {
let iCount = node.posterityCount(), i, child;
for (i = 0; i < iCount; i++) {
child = tree.items[hitinfo.row + i + 1];
hitinfo.sheet.setRowVisible(hitinfo.row + i + 1, child.visible, hitinfo.sheetArea);
//hitinfo.sheet.setRowVisible(hitinfo.row + i + 1, child.vis(), hitinfo.sheetArea);
}
hitinfo.sheet.invalidateLayout();
});
hitinfo.sheet.repaint();
}
};
TreeNodeCellType.prototype.processMouseEnter = function(hitinfo){
let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col);
let tag = hitinfo.sheet.getTag(hitinfo.row, hitinfo.col);
if(tag&&tag!=''){
TREE_SHEET_HELPER.showTipsDiv(tag,setting,hitinfo);
}
};
TreeNodeCellType.prototype.processMouseLeave = function (hitinfo) {
let me = TREE_SHEET_HELPER;
TREE_SHEET_HELPER.tipDiv = 'hide';
if (me._toolTipElement) {
$(me._toolTipElement).hide();
me._toolTipElement = null;
};
TREE_SHEET_HELPER.tipDivCheck();//延时检查:当tips正在show的时候,就调用了hide方法,会导致tips一直存在,所以设置一个超时处理
};
let TipCellType = function () {};
TipCellType.prototype = new GC.Spread.Sheets.CellTypes.Text();
TipCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
return {
x: x,
y: y,
row: context.row,
col: context.col,
cellStyle: cellStyle,
cellRect: cellRect,
sheet: context.sheet,
sheetArea: context.sheetArea
};
};
TipCellType.prototype.processMouseEnter = function (hitinfo) {
let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col);
let value = hitinfo.sheet.getValue(hitinfo.row, hitinfo.col);
let tag = hitinfo.sheet.getTag(hitinfo.row, hitinfo.col);
let acStyle = hitinfo.sheet.getActualStyle(hitinfo.row, hitinfo.col),
zoom = hitinfo.sheet.zoom();
let textLength = this.getAutoFitWidth(value, text, acStyle, zoom, {sheet: hitinfo.sheet, row: hitinfo.row, col: hitinfo.col, sheetArea: GC.Spread.Sheets.SheetArea.viewport});
let cellWidth = hitinfo.sheet.getCell(-1, hitinfo.col).width();
let dataField = setting.cols[hitinfo.col].data.field;
if((tag==undefined||tag=='')&&hitinfo.sheet.getCell(hitinfo.row,hitinfo.col).wordWrap()==true){//显示其它列的标记为空并且设置了自动换行
return;
}
if(dataField === 'itemCharacterText' || dataField === 'jobContentText' || dataField === 'adjustState'||dataField=="name"){
if((hitinfo.sheet.getParent() === projectObj.mainSpread||hitinfo.sheet.getParent() === tender_obj.tenderSpread) && textLength <= cellWidth)
return;
}
if(hitinfo.sheet.name()=="mainSheet"){
if(dataField=="quantity"){//显示工程量明细
text = tag;
}/*if(dataField=="name"){//项目特征及内容隐藏时,显示特征及内容
if(projectObj.ifItemCharHiden(setting)&&tag!=''){
text = tag;
}else if(textLength <= cellWidth){
return;
}
}*/
else if(tag !== undefined && tag) {
text = tag;
}
}
TREE_SHEET_HELPER.showTipsDiv(text,setting,hitinfo);
};
TipCellType.prototype.processMouseLeave = function (hitinfo) {
let me = TREE_SHEET_HELPER;
TREE_SHEET_HELPER.tipDiv = 'hide';
if (me._toolTipElement) {
$(me._toolTipElement).hide();
me._toolTipElement = null;
};
TREE_SHEET_HELPER.tipDivCheck();//延时检查:当tips正在show的时候,就调用了hide方法,会导致tips一直存在,所以设置一个超时处理
}
TREE_SHEET_HELPER.protectdSheet(sheet);
TREE_SHEET_HELPER.massOperationSheet(sheet, function () {
sheet.rowOutlines.direction(GC.Spread.Sheets.Outlines.OutlineDirection.backward);
sheet.showRowOutline(false);
if (setting.defaultRowHeight) {
sheet.defaults.rowHeight = setting.defaultRowHeight;
}
sheet.setRowCount(tree.count() + setting.emptyRows, GC.Spread.Sheets.SheetArea.viewport);
sheet.getRange(tree.count(), -1, setting.emptyRows, -1).locked(true);
setting.cols.forEach(function (colSetting, iCol) {
sheet.setStyle(-1, iCol, TREE_SHEET_HELPER.getSheetCellStyle(colSetting));
if (colSetting.showHint) {
sheet.getRange(-1, iCol, -1, 1).cellType(new TipCellType());
}
if(colSetting.formatter){
sheet.setFormatter(-1, iCol, colSetting.formatter, GC.Spread.Sheets.SheetArea.viewport);
}
});
sheet.getRange(-1, setting.treeCol, -1, 1).cellType(new TreeNodeCellType());
TREE_SHEET_HELPER.refreshTreeNodeData(setting, sheet, tree.roots, true);
TREE_SHEET_HELPER.refreshNodesVisible(tree.roots, sheet, true);
});
},
showTipsDiv:function (text,setting,hitinfo) {
if (setting.pos && text && text !== '') {
if (!this._toolTipElement) {
let div = $('#autoTip')[0];
if (!div) {
div = document.createElement("div");
$(div).addClass("message-box");
$(div) .attr("id", 'autoTip');
$(div).hide();
document.body.insertBefore(div, null);
}
this._toolTipElement = div;
//实时读取位置信息
if(hitinfo.sheet && hitinfo.sheet.getParent().qo){
setting.pos = SheetDataHelper.getObjPos(hitinfo.sheet.getParent().qo);
}
if(text) text = replaceAll(/[\n]/,'
',text);
$(this._toolTipElement).html(`${text}