import { getObjType } from '../utils/util'; import formula from '../global/formula'; import { isRealNull } from '../global/validate'; import { countfunc } from '../global/count'; import menuButton from './menuButton'; import { selectHightlightShow } from './select'; import pivotTable from './pivotTable'; import Store from '../store'; import server from './server'; function luckysheetMoveEndCell(postion, type, isScroll, terminal, onlyvalue) { if (isScroll == null) { isScroll = true; } if (!postion) { postion = "down"; } if (!type) { type = "cell"; } if (onlyvalue == null) { onlyvalue = false; } let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]; let curR = last["row"] == null ? 0 : last["row"][0]; let curC = last["column"] == null ? 0 : last["column"][0]; let startR = last["row"] == null ? 0 : last["row"][0]; let startC = last["column"] == null ? 0 : last["column"][0]; let endR = last["row"] == null ? 0 : last["row"][1]; let endC = last["column"] == null ? 0 : last["column"][1]; formula.fucntionboxshow(curR, curC); if (type == "range") { // need var var p_startR = Store.luckysheet_shiftpositon["row"][0]; var p_startC = Store.luckysheet_shiftpositon["column"][0]; let p_endR = Store.luckysheet_shiftpositon["row"][1]; let p_endC = Store.luckysheet_shiftpositon["column"][1]; if (postion == "down" || postion == "up") { if (p_endR < endR) { curR = last["row"] == null ? 0 : last["row"][1]; } else if (p_startR > startR) { curR = last["row"] == null ? 0 : last["row"][0]; } else if (p_endR == endR && p_startR == startR) { if (postion == "down") { curR = last["row"] == null ? 0 : last["row"][1]; } else { curR = last["row"] == null ? 0 : last["row"][0]; } } } else if (postion == "right" || postion == "left") { if (p_endC < endC) { curC = last["column"] == null ? 0 : last["column"][1]; } else if (p_startC > startC) { curC = last["column"] == null ? 0 : last["column"][0]; } else if (p_endC == endC && p_startC == startC) { if (postion == "right") { curC = last["column"] == null ? 0 : last["column"][1]; } else { curC = last["column"] == null ? 0 : last["column"][0]; } } } } let datarowlen = Store.flowdata.length, datacolumnlen = Store.flowdata[0].length; let data = Store.flowdata, moveP = "", moveV = 0; if (postion == "up") { if (curR == 0) { return; } else { let stvalue = [], p = null, i = 0, p_pre = null; for (let c = startC; c <= endC; c++) { stvalue = []; i = 0; for (let r = curR - 1; r >= 0; r--) { let cell = data[r][c]; if (getObjType(cell) == "object" && isRealNull(cell.v)) { stvalue.push(false); } else if (isRealNull(cell)) { stvalue.push(false); } else { stvalue.push(true); } if (stvalue.length > 1) { if (stvalue[i] == true && stvalue[i - 1] == false) { p = r; break } else if (stvalue[i] == false && stvalue[i - 1] == true) { p = r + 1; break } } i++; } if(p == null){ p = 0; } if (p_pre == null || p < p_pre) { p_pre = p; } } moveP = "down"; moveV = p_pre - curR; } } else if (postion == "down") { if (curR == datarowlen - 1) { return; } else { let stvalue = [], p = null, i = 0, p_pre = null; for (let c = startC; c <= endC; c++) { stvalue = []; i = 0; for (let r = curR + 1; r < data.length; r++) { let cell = data[r][c]; if (getObjType(cell) == "object" && isRealNull(cell.v)) { stvalue.push(false); } else if (isRealNull(cell)) { stvalue.push(false); } else { stvalue.push(true); } if (stvalue.length > 1) { if (stvalue[i] == true && stvalue[i - 1] == false) { p = r; break } else if (stvalue[i] == false && stvalue[i - 1] == true) { p = r - 1; break } } i++; } if(p == null){ p = data.length - 1; } if (p_pre == null || p > p_pre) { p_pre = p; } } moveP = "down"; moveV = p_pre - curR; } } else if (postion == "left") { if (curC == 0) { return; } else { let stvalue = [], p = null, i = 0, p_pre = null; for (let r = startR; r <= endR; r++) { stvalue = []; i = 0; for (let c = curC - 1; c >= 0; c--) { let cell = data[r][c]; if (getObjType(cell) == "object" && isRealNull(cell.v)) { stvalue.push(false); } else if (isRealNull(cell)) { stvalue.push(false); } else { stvalue.push(true); } if (stvalue.length > 1) { if (stvalue[i] == true && stvalue[i - 1] == false) { p = c; break } else if (stvalue[i] == false && stvalue[i - 1] == true) { p = c + 1; break } } i++; } if(p == null){ p = 0; } if (p_pre == null || p < p_pre) { p_pre = p; } } moveP = "right"; moveV = p_pre - curC; } } else if (postion == "right") { if (curC == datacolumnlen - 1) { return; } else { let stvalue = [], p = null, i = 0, p_pre = null; for (let r = startR; r <= endR; r++) { stvalue = []; i = 0; for (let c = curC + 1; c < data[0].length; c++) { let cell = data[r][c]; if (getObjType(cell) == "object" && isRealNull(cell.v)) { stvalue.push(false); } else if (isRealNull(cell)) { stvalue.push(false); } else { stvalue.push(true); } if (stvalue.length > 1) { if (stvalue[i] == true && stvalue[i - 1] == false) { p = c; break } else if (stvalue[i] == false && stvalue[i - 1] == true) { p = c - 1; break } } i++; } if(p == null){ p = data[0].length - 1; } if (p_pre == null || p > p_pre) { p_pre = p; } } moveP = "right"; moveV = p_pre - curC; } } if (type == "range") { if (postion == "up") { if (p_endR < endR) { if (moveV + curR < p_endR) { moveV = p_endR - curR; } } } else if (postion == "down") { if (p_startR > startR) { if (moveV + curR > p_startR) { moveV = p_startR - curR; } } } else if (postion == "left") { if (p_endC < endC) { if (moveV + curC < p_endC) { moveV = p_endC - curC; } } } else if (postion == "right") { if (p_startC > startC) { if (moveV + curC > p_startC) { moveV = p_startC - curC; } } } if (terminal != null && Math.abs(moveV) > Math.abs(terminal)) { moveV = terminal; } } if (!onlyvalue) { if (type == "cell") { luckysheetMoveHighlightCell(moveP, moveV, "rangeOfSelect", isScroll); } else if (type == "range") { luckysheetMoveHighlightRange(moveP, moveV, "rangeOfSelect", isScroll); } } else { return moveV; } } //方向键 调整单元格 function luckysheetMoveHighlightCell(postion, index, type, isScroll) { if (isScroll == null) { isScroll = true; } if (!postion) { postion == "down"; } let datarowlen = Store.flowdata.length, datacolumnlen = Store.flowdata[0].length; let row, row_pre, row_index, row_index_ed; let col, col_pre, col_index, col_index_ed; if(type == "rangeOfSelect"){ let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]; let curR; if(last["row_focus"] == null){ curR = last["row"][0]; } else{ curR = last["row_focus"]; } let curC; if(last["column_focus"] == null){ curC = last["column"][0]; } else{ curC = last["column_focus"]; } //focus单元格 是否是合并单元格 let margeset = menuButton.mergeborer(Store.flowdata, curR, curC); if(!!margeset){ let str_r = margeset.row[2]; let end_r = margeset.row[3]; let str_c = margeset.column[2]; let end_c = margeset.column[3]; if(index > 0){ if(postion == "down"){ curR = end_r; curC = str_c; } else if(postion == "right"){ curR = str_r; curC = end_c; } } else{ curR = str_r; curC = str_c; } } let moveX = last["moveXY"] == null ? curR : last["moveXY"].x; let moveY = last["moveXY"] == null ? curC : last["moveXY"].y; if (postion == "down") { curR += index; moveX = curR; } else if (postion == "right") { curC += index; moveY = curC; } if (curR >= datarowlen) { curR = datarowlen - 1; moveX = curR; } if (curR < 0) { curR = 0; moveX = curR; } if (curC >= datacolumnlen) { curC = datacolumnlen - 1; moveY = curC; } if (curC < 0) { curC = 0; moveY = curC; } //移动的下一个单元格是否是合并的单元格 let margeset2 = menuButton.mergeborer(Store.flowdata, curR, curC); if(!!margeset2){ row = margeset2.row[1]; row_pre = margeset2.row[0]; row_index = margeset2.row[2]; row_index_ed = margeset2.row[3]; col = margeset2.column[1]; col_pre = margeset2.column[0]; col_index = margeset2.column[2]; col_index_ed = margeset2.column[3]; } else{ row = Store.visibledatarow[moveX]; row_pre = moveX - 1 == -1 ? 0 : Store.visibledatarow[moveX - 1]; // row_index = moveX; // row_index_ed = moveX; col = Store.visibledatacolumn[moveY]; col_pre = moveY - 1 == -1 ? 0 : Store.visibledatacolumn[moveY - 1]; // col_index = moveY; // col_index_ed = moveY; row_index = row_index_ed = curR; col_index = col_index_ed = curC; } last["row"] = [row_index, row_index_ed]; last["column"] = [col_index, col_index_ed]; last["row_focus"] = row_index; last["column_focus"] = col_index; last["moveXY"] = {"x": moveX,"y": moveY}; selectHightlightShow(); pivotTable.pivotclick(row_index, col_index); formula.fucntionboxshow(row_index, col_index); } else if(type == "rangeOfFormula"){ let last = formula.func_selectedrange; let curR; if(last["row_focus"] == null){ curR = last["row"][0]; } else{ curR = last["row_focus"]; } let curC; if(last["column_focus"] == null){ curC = last["column"][0]; } else{ curC = last["column_focus"]; } //focus单元格 是否是合并单元格 let margeset = menuButton.mergeborer(Store.flowdata, curR, curC); if(!!margeset){ let str_r = margeset.row[2]; let end_r = margeset.row[3]; let str_c = margeset.column[2]; let end_c = margeset.column[3]; if(index > 0){ if(postion == "down"){ curR = end_r; curC = str_c; } else if(postion == "right"){ curR = str_r; curC = end_c; } } else{ curR = str_r; curC = str_c; } } let moveX = last["moveXY"] == null ? curR : last["moveXY"].x; let moveY = last["moveXY"] == null ? curC : last["moveXY"].y; if (postion == "down") { curR += index; moveX = curR; } else if (postion == "right") { curC += index; moveY = curC; } if (curR >= datarowlen) { curR = datarowlen - 1; moveX = curR; } if (curR < 0) { curR = 0; moveX = curR; } if (curC >= datacolumnlen) { curC = datacolumnlen - 1; moveY = curC; } if (curC < 0) { curC = 0; moveY = curC; } //移动的下一个单元格是否是合并的单元格 let margeset2 = menuButton.mergeborer(Store.flowdata, curR, curC); if(!!margeset2){ row = margeset2.row[1]; row_pre = margeset2.row[0]; row_index = margeset2.row[2]; row_index_ed = margeset2.row[3]; col = margeset2.column[1]; col_pre = margeset2.column[0]; col_index = margeset2.column[2]; col_index_ed = margeset2.column[3]; } else{ row = Store.visibledatarow[moveX]; row_pre = moveX - 1 == -1 ? 0 : Store.visibledatarow[moveX - 1]; row_index = moveX; row_index_ed = moveX; col = Store.visibledatacolumn[moveY]; col_pre = moveY - 1 == -1 ? 0 : Store.visibledatacolumn[moveY - 1]; col_index = moveY; col_index_ed = moveY; } formula.func_selectedrange = { "left": col_pre, "width": col - col_pre - 1, "top": row_pre, "height": row - row_pre - 1, "left_move": col_pre, "width_move": col - col_pre - 1, "top_move": row_pre, "height_move": row - row_pre - 1, "row": [row_index, row_index_ed], "column": [col_index, col_index_ed], "row_focus": row_index, "column_focus": col_index, "moveXY": {"x": moveX, "y": moveY} }; $("#luckysheet-formula-functionrange-select").css({ "left": col_pre, "width": col - col_pre - 1, "top": row_pre, "height": row - row_pre - 1 }).show(); formula.rangeSetValue({ "row": [row_index, row_index_ed], "column": [col_index, col_index_ed] }); } let scrollLeft = $("#luckysheet-cell-main").scrollLeft(); let scrollTop = $("#luckysheet-cell-main").scrollTop(); let winH = $("#luckysheet-cell-main").height(), winW = $("#luckysheet-cell-main").width(); let sleft = 0, stop = 0; if (col - scrollLeft - winW + 20 > 0) { sleft = col - winW + 20; if (isScroll) { $("#luckysheet-scrollbar-x").scrollLeft(sleft); } } else if (col_pre - scrollLeft - 20 < 0) { sleft = col_pre - 20; if (isScroll) { $("#luckysheet-scrollbar-x").scrollLeft(sleft); } } if (row - scrollTop - winH + 20 > 0) { stop = row - winH + 20; if (isScroll) { $("#luckysheet-scrollbar-y").scrollTop(stop); } } else if (row_pre - scrollTop - 20 < 0) { stop = row_pre - 20; if (isScroll) { $("#luckysheet-scrollbar-y").scrollTop(stop); } } clearTimeout(Store.countfuncTimeout); countfunc(); // 移动单元格通知后台 server.saveParam("mv", Store.currentSheetIndex, Store.luckysheet_select_save); } //ctrl + 方向键 调整单元格 function luckysheetMoveHighlightCell2(postion, type, isScroll) { if(!isScroll){ isScroll = true; } let row, row_pre; let col, col_pre; if(type == "rangeOfSelect"){ let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]; let rf = last["row_focus"], cf = last["column_focus"]; let focusIsMerge = false, mc = {}; if(Store.config["merge"] != null && (rf + "_" + cf) in Store.config["merge"]){ focusIsMerge = true; mc = Store.config["merge"][rf + "_" + cf]; } if(postion == "down"){ if(rf == Store.flowdata.length - 1){ return; } if(focusIsMerge){ rf = getNextIndex("down", cf, mc.r + mc.rs - 1, Store.flowdata.length - 1); } else{ rf = getNextIndex("down", cf, rf, Store.flowdata.length - 1); } } else if(postion == "up"){ if(rf == 0){ return; } if(focusIsMerge){ rf = getNextIndex("up", cf, 0, mc.r); } else{ rf = getNextIndex("up", cf, 0, rf); } } else if(postion == "right"){ if(cf == Store.flowdata[0].length - 1){ return; } if(focusIsMerge){ cf = getNextIndex("right", rf, mc.c + mc.cs - 1, Store.flowdata[0].length - 1); } else{ cf = getNextIndex("right", rf, cf, Store.flowdata[0].length - 1); } } else if(postion == "left"){ if(cf == 0){ return; } if(focusIsMerge){ cf = getNextIndex("left", rf, 0, mc.c); } else{ cf = getNextIndex("left", rf, 0, cf); } } let rowseleted = [rf, rf]; let columnseleted = [cf, cf]; row = Store.visibledatarow[rf]; row_pre = rf - 1 == -1 ? 0 : Store.visibledatarow[rf - 1]; col = Store.visibledatacolumn[cf]; col_pre = cf - 1 == -1 ? 0 : Store.visibledatacolumn[cf - 1]; let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, row_pre, row - row_pre - 1, col_pre, col - col_pre - 1); if(changeparam != null){ columnseleted = changeparam[0]; rowseleted= changeparam[1]; // top = changeparam[2]; // height = changeparam[3]; // left = changeparam[4]; // width = changeparam[5]; } Store.luckysheet_select_save = [{"row": rowseleted, "column": columnseleted}]; selectHightlightShow(); pivotTable.pivotclick(rf, cf); formula.fucntionboxshow(rf, cf); } else if(type == "rangeOfFormula"){ let last = formula.func_selectedrange; let rf = last["row_focus"], cf = last["column_focus"]; let focusIsMerge = false, mc = {}; if(Store.config["merge"] != null && (rf + "_" + cf) in Store.config["merge"]){ focusIsMerge = true; mc = Store.config["merge"][rf + "_" + cf]; } if(postion == "down"){ if(rf == Store.flowdata.length - 1){ return; } if(focusIsMerge){ rf = getNextIndex("down", cf, mc.r + mc.rs - 1, Store.flowdata.length - 1); } else{ rf = getNextIndex("down", cf, rf, Store.flowdata.length - 1); } } else if(postion == "up"){ if(rf == 0){ return; } if(focusIsMerge){ rf = getNextIndex("up", cf, 0, mc.r); } else{ rf = getNextIndex("up", cf, 0, rf); } } else if(postion == "right"){ if(cf == Store.flowdata[0].length - 1){ return; } if(focusIsMerge){ cf = getNextIndex("right", rf, mc.c + mc.cs - 1, Store.flowdata[0].length - 1); } else{ cf = getNextIndex("right", rf, cf, Store.flowdata[0].length - 1); } } else if(postion == "left"){ if(cf == 0){ return; } if(focusIsMerge){ cf = getNextIndex("left", rf, 0, mc.c); } else{ cf = getNextIndex("left", rf, 0, cf); } } let rowseleted = [rf, rf]; let columnseleted = [cf, cf]; row = Store.visibledatarow[rf]; row_pre = rf - 1 == -1 ? 0 : Store.visibledatarow[rf - 1]; col = Store.visibledatacolumn[cf]; col_pre = cf - 1 == -1 ? 0 : Store.visibledatacolumn[cf - 1]; let top = row_pre, height = row - row_pre - 1; let left = col_pre, width = col - col_pre - 1; let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, top, height, left, width); if(changeparam != null){ columnseleted = changeparam[0]; rowseleted= changeparam[1]; top = changeparam[2]; height = changeparam[3]; left = changeparam[4]; width = changeparam[5]; } formula.func_selectedrange = { "left": left, "width": width, "top": top, "height": height, "left_move": left, "width_move": width, "top_move": top, "height_move": height, "row": rowseleted, "column": columnseleted, "row_focus": rf, "column_focus": cf }; $("#luckysheet-formula-functionrange-select").css({ "left": left, "width": width, "top": top, "height": height }).show(); formula.rangeSetValue({ "row": rowseleted, "column": columnseleted }); } let scrollLeft = $("#luckysheet-cell-main").scrollLeft(); let scrollTop = $("#luckysheet-cell-main").scrollTop(); let winH = $("#luckysheet-cell-main").height(), winW = $("#luckysheet-cell-main").width(); let sleft = 0, stop = 0; if (col - scrollLeft - winW + 20 > 0) { sleft = col - winW + 20; if (isScroll) { $("#luckysheet-scrollbar-x").scrollLeft(sleft); } } else if (col_pre - scrollLeft - 20 < 0) { sleft = col_pre - 20; if (isScroll) { $("#luckysheet-scrollbar-x").scrollLeft(sleft); } } if (row - scrollTop - winH + 20 > 0) { stop = row - winH + 20; if (isScroll) { $("#luckysheet-scrollbar-y").scrollTop(stop); } } else if (row_pre - scrollTop - 20 < 0) { stop = row_pre - 20; if (isScroll) { $("#luckysheet-scrollbar-y").scrollTop(stop); } } clearTimeout(Store.countfuncTimeout); countfunc(); } //shift + 方向键 调整选区 function luckysheetMoveHighlightRange(postion, index, type, isScroll) { if (isScroll == null) { isScroll = true; } if (!postion) { postion == "down"; } let row, row_pre; let col, col_pre; if(type == "rangeOfSelect"){ let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]; let curR = last["row"][0], endR = last["row"][1]; let curC = last["column"][0], endC = last["column"][1]; let rf = last["row_focus"], cf = last["column_focus"]; let datarowlen = Store.flowdata.length, datacolumnlen = Store.flowdata[0].length; if(postion == "down"){ //选区上下变动 if(rowHasMerge(rf, curC, endC)){ //focus单元格所在行有合并单元格 let rfMerge = getRowMerge(rf, curC, endC); let rf_str = rfMerge[0], rf_end = rfMerge[1]; if(rf_str > curR && rf_end == endR){ if(index > 0 && rowHasMerge(curR, curC, endC)){ curR = getRowMerge(curR, curC, endC)[1]; } curR += index; } else if(rf_end < endR && rf_str == curR){ if(index < 0 && rowHasMerge(endR, curC, endC)){ endR = getRowMerge(endR, curC, endC)[0]; } endR += index; } else{ if(index > 0){ endR += index; } else{ curR += index; } } } else{ if(rf > curR && rf == endR){ if(index > 0 && rowHasMerge(curR, curC, endC)){ curR = getRowMerge(curR, curC, endC)[1]; } curR += index; } else if(rf < endR && rf == curR){ if(index < 0 && rowHasMerge(endR, curC, endC)){ endR = getRowMerge(endR, curC, endC)[0]; } endR += index; } else if(rf == curR && rf == endR){ if(index > 0){ endR += index; } else{ curR += index; } } } if (endR >= datarowlen) { endR = datarowlen - 1; } if (endR < 0) { endR = 0; } if (curR >= datarowlen) { curR = datarowlen - 1; } if (curR < 0) { curR = 0; } } else{ if(colHasMerge(cf, curR, endR)){ //focus单元格所在列有合并单元格 let cfMerge = getColMerge(cf, curR, endR); let cf_str = cfMerge[0], cf_end = cfMerge[1]; if(cf_str > curC && cf_end == endC){ if(index > 0 && colHasMerge(curC, curR, endR)){ curC = getColMerge(curC, curR, endR)[1]; } curC += index; } else if(cf_end < endC && cf_str == curC){ if(index < 0 && colHasMerge(endC, curR, endR)){ endC = getColMerge(endC, curR, endR)[0]; } endC += index; } else{ if(index > 0){ endC += index; } else{ curC += index; } } } else{ if(cf > curC && cf == endC){ if(index > 0 && colHasMerge(curC, curR, endR)){ curC = getColMerge(curC, curR, endR)[1]; } curC += index; } else if(cf < endC && cf == curC){ if(index < 0 && colHasMerge(endC, curR, endR)){ endC = getColMerge(endC, curR, endR)[0]; } endC += index; } else if(cf == curC && cf == endC){ if(index > 0){ endC += index; } else{ curC += index; } } } if (endC >= datacolumnlen) { endC = datacolumnlen - 1; } if (endC < 0) { endC = 0; } if (curC >= datacolumnlen) { curC = datacolumnlen - 1; } if (curC < 0) { curC = 0; } } let rowseleted = [curR, endR]; let columnseleted = [curC, endC]; row = Store.visibledatarow[endR]; row_pre = curR - 1 == -1 ? 0 : Store.visibledatarow[curR - 1]; col = Store.visibledatacolumn[endC]; col_pre = curC - 1 == -1 ? 0 : Store.visibledatacolumn[curC - 1]; let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, row_pre, row - row_pre - 1, col_pre, col - col_pre - 1); if(changeparam != null){ columnseleted = changeparam[0]; rowseleted= changeparam[1]; // top = changeparam[2]; // height = changeparam[3]; // left = changeparam[4]; // width = changeparam[5]; } last["row"] = rowseleted; last["column"] = columnseleted; selectHightlightShow(); } else if(type == "rangeOfFormula"){ let last = formula.func_selectedrange; let curR = last["row"][0], endR = last["row"][1]; let curC = last["column"][0], endC = last["column"][1]; let rf = last["row_focus"], cf = last["column_focus"]; let datarowlen = Store.flowdata.length, datacolumnlen = Store.flowdata[0].length; if(postion == "down"){ //选区上下变动 if(rowHasMerge(rf, curC, endC)){ //focus单元格所在行有合并单元格 let rfMerge = getRowMerge(rf, curC, endC); let rf_str = rfMerge[0], rf_end = rfMerge[1]; if(rf_str > curR && rf_end == endR){ if(index > 0 && rowHasMerge(curR, curC, endC)){ curR = getRowMerge(curR, curC, endC)[1]; } curR += index; } else if(rf_end < endR && rf_str == curR){ if(index < 0 && rowHasMerge(endR, curC, endC)){ endR = getRowMerge(endR, curC, endC)[0]; } endR += index; } else{ if(index > 0){ endR += index; } else{ curR += index; } } } else{ if(rf > curR && rf == endR){ if(index > 0 && rowHasMerge(curR, curC, endC)){ curR = getRowMerge(curR, curC, endC)[1]; } curR += index; } else if(rf < endR && rf == curR){ if(index < 0 && rowHasMerge(endR, curC, endC)){ endR = getRowMerge(endR, curC, endC)[0]; } endR += index; } else if(rf == curR && rf == endR){ if(index > 0){ endR += index; } else{ curR += index; } } } if (endR >= datarowlen) { endR = datarowlen - 1; } if (endR < 0) { endR = 0; } if (curR >= datarowlen) { curR = datarowlen - 1; } if (curR < 0) { curR = 0; } } else{ if(colHasMerge(cf, curR, endR)){ //focus单元格所在列有合并单元格 let cfMerge = getColMerge(cf, curR, endR); let cf_str = cfMerge[0], cf_end = cfMerge[1]; if(cf_str > curC && cf_end == endC){ if(index > 0 && colHasMerge(curC, curR, endR)){ curC = getColMerge(curC, curR, endR)[1]; } curC += index; } else if(cf_end < endC && cf_str == curC){ if(index < 0 && colHasMerge(endC, curR, endR)){ endC = getColMerge(endC, curR, endR)[0]; } endC += index; } else{ if(index > 0){ endC += index; } else{ curC += index; } } } else{ if(cf > curC && cf == endC){ if(index > 0 && colHasMerge(curC, curR, endR)){ curC = getColMerge(curC, curR, endR)[1]; } curC += index; } else if(cf < endC && cf == curC){ if(index < 0 && colHasMerge(endC, curR, endR)){ endC = getColMerge(endC, curR, endR)[0]; } endC += index; } else if(cf == curC && cf == endC){ if(index > 0){ endC += index; } else{ curC += index; } } } if (endC >= datacolumnlen) { endC = datacolumnlen - 1; } if (endC < 0) { endC = 0; } if (curC >= datacolumnlen) { curC = datacolumnlen - 1; } if (curC < 0) { curC = 0; } } let rowseleted = [curR, endR]; let columnseleted = [curC, endC]; row = Store.visibledatarow[endR]; row_pre = curR - 1 == -1 ? 0 : Store.visibledatarow[curR - 1]; col = Store.visibledatacolumn[endC]; col_pre = curC - 1 == -1 ? 0 : Store.visibledatacolumn[curC - 1]; let top = row_pre, height = row - row_pre - 1; let left = col_pre, width = col - col_pre - 1; let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, top, height, left, width); if(changeparam != null){ columnseleted = changeparam[0]; rowseleted= changeparam[1]; top = changeparam[2]; height = changeparam[3]; left = changeparam[4]; width = changeparam[5]; } formula.func_selectedrange = { "left": left, "width": width, "top": top, "height": height, "left_move": left, "width_move": width, "top_move": top, "height_move": height, "row": rowseleted, "column": columnseleted, "row_focus": rf, "column_focus": cf }; $("#luckysheet-formula-functionrange-select").css({ "left": left, "width": width, "top": top, "height": height }).show(); formula.rangeSetValue({ "row": rowseleted, "column": columnseleted }); } let scrollLeft = $("#luckysheet-cell-main").scrollLeft(); let scrollTop = $("#luckysheet-cell-main").scrollTop(); let winH = $("#luckysheet-cell-main").height(), winW = $("#luckysheet-cell-main").width(); let sleft = 0, stop = 0; if (col - scrollLeft - winW + 20 > 0) { sleft = col - winW + 20; if (isScroll) { $("#luckysheet-scrollbar-x").scrollLeft(sleft); } } else if (col_pre - scrollLeft - 20 < 0) { sleft = col_pre - 20; if (isScroll) { $("#luckysheet-scrollbar-x").scrollLeft(sleft); } } if (row - scrollTop - winH + 20 > 0) { stop = row - winH + 20; if (isScroll) { $("#luckysheet-scrollbar-y").scrollTop(stop); } } else if (row_pre - scrollTop - 20 < 0) { stop = row_pre - 20; if (isScroll) { $("#luckysheet-scrollbar-y").scrollTop(stop); } } clearTimeout(Store.countfuncTimeout); countfunc(); } //ctrl + shift + 方向键 调整选区 function luckysheetMoveHighlightRange2(postion, type, isScroll) { if(!isScroll){ isScroll = true; } let row, row_pre; let col, col_pre; if(type == "rangeOfSelect"){ let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]; let rf = last["row_focus"], cf = last["column_focus"]; let r1 = last["row"][0], r2 = last["row"][1]; let c1 = last["column"][0], c2 = last["column"][1]; if(postion == "down"){ if(r2 == Store.flowdata.length - 1){ return; } if(rowHasMerge(rf, c1, c2)){ //focus所在行有合并单元格 let rfMerge = getRowMerge(rf, c1, c2); let rf_str = rfMerge[0], rf_end = rfMerge[1]; if(rf_str > r1 && rf_end == r2){ r1 = getNextIndex("down", cf, r1, r2); } else{ r2 = getNextIndex("down", cf, r2, Store.flowdata.length - 1); } } else{ if(rf > r1 && rf == r2){ r1 = getNextIndex("down", cf, r1, r2); } else{ r2 = getNextIndex("down", cf, r2, Store.flowdata.length - 1); } } } else if(postion == "up"){ if(r1 == 0){ return; } if(rowHasMerge(rf, c1, c2)){ //focus所在行有合并单元格 let rfMerge = getRowMerge(rf, c1, c2); let rf_str = rfMerge[0], rf_end = rfMerge[1]; if(rf_end < r2 && rf_str == r1){ r2 = getNextIndex("up", cf, r1, r2); } else{ r1 = getNextIndex("up", cf, 0, r1); } } else{ if(rf < r2 && rf == r1){ r2 = getNextIndex("up", cf, r1, r2); } else{ r1 = getNextIndex("up", cf, 0, r1); } } } else if(postion == "right"){ if(c2 == Store.flowdata[0].length - 1){ return; } if(colHasMerge(cf, r1, r2)){ //focus所在行有合并单元格 let cfMerge = getColMerge(cf, r1, r2); let cf_str = cfMerge[0], cf_end = cfMerge[1]; if(cf_str > c1 && cf_end == c2){ c1 = getNextIndex("right", rf, c1, c2); } else{ c2 = getNextIndex("right", rf, c2, Store.flowdata[0].length - 1); } } else{ if(cf > c1 && cf == c2){ c1 = getNextIndex("right", rf, c1, c2); } else{ c2 = getNextIndex("right", rf, c2, Store.flowdata[0].length - 1); } } } else if(postion == "left"){ if(c1 == 0){ return; } if(colHasMerge(cf, r1, r2)){ //focus所在行有合并单元格 let cfMerge = getColMerge(cf, r1, r2); let cf_str = cfMerge[0], cf_end = cfMerge[1]; if(cf_end < c2 && cf_str == c1){ c2 = getNextIndex("left", rf, c1, c2); } else{ c1 = getNextIndex("left", rf, 0, c1); } } else{ if(cf < c2 && cf == c1){ c2 = getNextIndex("left", rf, c1, c2); } else{ c1 = getNextIndex("left", rf, 0, c1); } } } let rowseleted = [r1, r2]; let columnseleted = [c1, c2]; row = Store.visibledatarow[r2]; row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1]; col = Store.visibledatacolumn[c2]; col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1]; let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, row_pre, row - row_pre - 1, col_pre, col - col_pre - 1); if(changeparam != null){ columnseleted = changeparam[0]; rowseleted= changeparam[1]; // top = changeparam[2]; // height = changeparam[3]; // left = changeparam[4]; // width = changeparam[5]; } last["row"] = rowseleted; last["column"] = columnseleted; selectHightlightShow(); } else if(type == "rangeOfFormula"){ let last = formula.func_selectedrange; let rf = last["row_focus"], cf = last["column_focus"]; let r1 = last["row"][0], r2 = last["row"][1]; let c1 = last["column"][0], c2 = last["column"][1]; if(postion == "down"){ if(r2 == Store.flowdata.length - 1){ return; } if(rowHasMerge(rf, c1, c2)){ //focus所在行有合并单元格 let rfMerge = getRowMerge(rf, c1, c2); let rf_str = rfMerge[0], rf_end = rfMerge[1]; if(rf_str > r1 && rf_end == r2){ r1 = getNextIndex("down", cf, r1, r2); } else{ r2 = getNextIndex("down", cf, r2, Store.flowdata.length - 1); } } else{ if(rf > r1 && rf == r2){ r1 = getNextIndex("down", cf, r1, r2); } else{ r2 = getNextIndex("down", cf, r2, Store.flowdata.length - 1); } } } else if(postion == "up"){ if(r1 == 0){ return; } if(rowHasMerge(rf, c1, c2)){ //focus所在行有合并单元格 let rfMerge = getRowMerge(rf, c1, c2); let rf_str = rfMerge[0], rf_end = rfMerge[1]; if(rf_end < r2 && rf_str == r1){ r2 = getNextIndex("up", cf, r1, r2); } else{ r1 = getNextIndex("up", cf, 0, r1); } } else{ if(rf < r2 && rf == r1){ r2 = getNextIndex("up", cf, r1, r2); } else{ r1 = getNextIndex("up", cf, 0, r1); } } } else if(postion == "right"){ if(c2 == Store.flowdata[0].length - 1){ return; } if(colHasMerge(cf, r1, r2)){ //focus所在行有合并单元格 let cfMerge = getColMerge(cf, r1, r2); let cf_str = cfMerge[0], cf_end = cfMerge[1]; if(cf_str > c1 && cf_end == c2){ c1 = getNextIndex("right", rf, c1, c2); } else{ c2 = getNextIndex("right", rf, c2, Store.flowdata[0].length - 1); } } else{ if(cf > c1 && cf == c2){ c1 = getNextIndex("right", rf, c1, c2); } else{ c2 = getNextIndex("right", rf, c2, Store.flowdata[0].length - 1); } } } else if(postion == "left"){ if(c1 == 0){ return; } if(colHasMerge(cf, r1, r2)){ //focus所在行有合并单元格 let cfMerge = getColMerge(cf, r1, r2); let cf_str = cfMerge[0], cf_end = cfMerge[1]; if(cf_end < c2 && cf_str == c1){ c2 = getNextIndex("left", rf, c1, c2); } else{ c1 = getNextIndex("left", rf, 0, c1); } } else{ if(cf < c2 && cf == c1){ c2 = getNextIndex("left", rf, c1, c2); } else{ c1 = getNextIndex("left", rf, 0, c1); } } } let rowseleted = [r1, r2]; let columnseleted = [c1, c2]; row = Store.visibledatarow[r2]; row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1]; col = Store.visibledatacolumn[c2]; col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1]; let top = row_pre, height = row - row_pre - 1; let left = col_pre, width = col - col_pre - 1; let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, top, height, left, width); if(changeparam != null){ columnseleted = changeparam[0]; rowseleted= changeparam[1]; top = changeparam[2]; height = changeparam[3]; left = changeparam[4]; width = changeparam[5]; } formula.func_selectedrange = { "left": left, "width": width, "top": top, "height": height, "left_move": left, "width_move": width, "top_move": top, "height_move": height, "row": rowseleted, "column": columnseleted, "row_focus": rf, "column_focus": cf }; $("#luckysheet-formula-functionrange-select").css({ "left": left, "width": width, "top": top, "height": height }).show(); formula.rangeSetValue({ "row": rowseleted, "column": columnseleted }); } let scrollLeft = $("#luckysheet-cell-main").scrollLeft(); let scrollTop = $("#luckysheet-cell-main").scrollTop(); let winH = $("#luckysheet-cell-main").height(), winW = $("#luckysheet-cell-main").width(); let sleft = 0, stop = 0; if (col - scrollLeft - winW + 20 > 0) { sleft = col - winW + 20; if (isScroll) { $("#luckysheet-scrollbar-x").scrollLeft(sleft); } } else if (col_pre - scrollLeft - 20 < 0) { sleft = col_pre - 20; if (isScroll) { $("#luckysheet-scrollbar-x").scrollLeft(sleft); } } if (row - scrollTop - winH + 20 > 0) { stop = row - winH + 20; if (isScroll) { $("#luckysheet-scrollbar-y").scrollTop(stop); } } else if (row_pre - scrollTop - 20 < 0) { stop = row_pre - 20; if (isScroll) { $("#luckysheet-scrollbar-y").scrollTop(stop); } } clearTimeout(Store.countfuncTimeout); countfunc(); } //shift + 方向键 / ctrl + shift + 方向键 功能 function rowHasMerge(r, c1, c2){ let rowHasMerge = false; for(let c = c1; c <= c2; c++){ let cell = Store.flowdata[r][c]; if(getObjType(cell) == "object" && ("mc" in cell)){ rowHasMerge = true; break; } } return rowHasMerge; } function colHasMerge(c, r1, r2){ let colHasMerge = false; for(let r = r1; r <= r2; r++){ let cell = Store.flowdata[r][c]; if(getObjType(cell) == "object" && ("mc" in cell)){ colHasMerge = true; break; } } return colHasMerge; } function getRowMerge(rIndex, c1, c2){ let r1 = 0, r2 = Store.flowdata.length - 1; let str = null; if(rIndex > r1){ for(let r = rIndex; r >= r1; r--){ for(let c = c1; c <= c2; c++){ let cell = Store.flowdata[r][c]; if(getObjType(cell) == "object" && ("mc" in cell)){ let mc = Store.config["merge"][cell["mc"].r + "_" + cell["mc"].c]; if(str == null || mc.r < str){ str = mc.r; } } } if(rowHasMerge(str - 1, c1, c2) && str > r1){ r = str - 1; } else{ break; } } } else{ str = r1; } let end = null; if(rIndex < r2){ for(let r = rIndex; r <= r2; r++){ for(let c = c1; c <= c2; c++){ let cell = Store.flowdata[r][c]; if(getObjType(cell) == "object" && ("mc" in cell)){ let mc = Store.config["merge"][cell["mc"].r + "_" + cell["mc"].c]; if(end == null || (mc.r + mc.rs - 1) > end){ end = mc.r + mc.rs - 1; } } } if(rowHasMerge(end + 1, c1, c2) && end < r2){ r = end + 1; } else{ break; } } } else{ end = r2; } return [str, end]; } function getColMerge(cIndex, r1, r2){ let c1 = 0, c2 = Store.flowdata[0].length - 1; let str = null; if(cIndex > c1){ for(let c = cIndex; c >= c1; c--){ for(let r = r1; r <= r2; r++){ let cell = Store.flowdata[r][c]; if(getObjType(cell) == "object" && ("mc" in cell)){ let mc = Store.config["merge"][cell["mc"].r + "_" + cell["mc"].c]; if(str == null || mc.c < str){ str = mc.c; } } } if(colHasMerge(str - 1, r1, r2) && str > c1){ c = str - 1; } else{ break; } } } else{ str = c1; } let end = null; if(cIndex < c2){ for(let c = cIndex; c <= c2; c++){ for(let r = r1; r <= r2; r++){ let cell = Store.flowdata[r][c]; if(getObjType(cell) == "object" && ("mc" in cell)){ let mc = Store.config["merge"][cell["mc"].r + "_" + cell["mc"].c]; if(end == null || (mc.c + mc.cs - 1) > end){ end = mc.c + mc.cs - 1; } } } if(colHasMerge(end + 1, r1, r2) && end < c2){ c = end + 1; } else{ break; } } } else{ end = c2; } return [str, end]; } function getNextIndex(direction, focusIndex, strIndex, endIndex) { let index = null; let stNull; if(direction == "down"){ let stValue = Store.flowdata[strIndex][focusIndex]; if(getObjType(stValue) == "object" && isRealNull(stValue.v)){ stNull = true; } else if(isRealNull(stValue)){ stNull = true; } else{ stNull = false; } console.log(stNull, "stNull"); let cellNull = [], i = 0; for(let r = strIndex + 1; r <= endIndex; r++){ let cell = Store.flowdata[r][focusIndex]; if(getObjType(cell) == "object" && isRealNull(cell.v)){ cellNull.push(true); } else if(isRealNull(cell)){ cellNull.push(true); } else{ cellNull.push(false); } if(cellNull.length == 1 && stNull==true && cellNull[i] == false){ index = strIndex + i + 1; break; } else if(cellNull.length > 1){ if(stNull && cellNull[i] == false){ //起始是空,找第一个有值的位置 index = strIndex + i + 1; break; } else if(!stNull){ //起始有值,找一个有值的位置 if(cellNull[i] == false && cellNull[i - 1] == true){ //前面为空 index = strIndex + i + 1; break; } else if(cellNull[i] == true && cellNull[i - 1] == false){ //后面为空 index = strIndex + i; break; } } } if(r == endIndex){ index = endIndex; } i++; } } else if(direction == "up"){ let stValue = Store.flowdata[endIndex][focusIndex]; if(getObjType(stValue) == "object" && isRealNull(stValue.v)){ stNull = true; } else if(isRealNull(stValue)){ stNull = true; } else{ stNull = false; } let cellNull = [], i = 0; for(let r = endIndex - 1; r >= strIndex; r--){ let cell = Store.flowdata[r][focusIndex]; if(getObjType(cell) == "object" && isRealNull(cell.v)){ cellNull.push(true); } else if(isRealNull(cell)){ cellNull.push(true); } else{ cellNull.push(false); } if(cellNull.length == 1 && stNull && cellNull[i] == false){ index = endIndex - (i + 1); break; } else if(cellNull.length > 1){ if(stNull && cellNull[i] == false){ //起始是空,找第一个有值的位置 index = endIndex - (i + 1); break; } else if(!stNull){ //起始有值,找一个有值的位置 if(cellNull[i] == false && cellNull[i - 1] == true){ //前面为空 index = endIndex - (i + 1); break; } else if(cellNull[i] == true && cellNull[i - 1] == false){ //后面为空 index = endIndex - i; break; } } } if(r == strIndex){ index = strIndex; } i++; } } else if(direction == "right"){ let stValue = Store.flowdata[focusIndex][strIndex]; if(getObjType(stValue) == "object" && isRealNull(stValue.v)){ stNull = true; } else if(isRealNull(stValue)){ stNull = true; } else{ stNull = false; } let cellNull = [], i = 0; for(let c = strIndex + 1; c <= endIndex; c++){ let cell = Store.flowdata[focusIndex][c]; if(getObjType(cell) == "object" && isRealNull(cell.v)){ cellNull.push(true); } else if(isRealNull(cell)){ cellNull.push(true); } else{ cellNull.push(false); } if(cellNull.length == 1 && stNull && cellNull[i] == false){ index = strIndex + i + 1; break; } else if(cellNull.length > 1){ if(stNull && cellNull[i] == false){ //起始是空,找第一个有值的位置 index = strIndex + i + 1; break; } else if(!stNull){ //起始有值,找一个有值的位置 if(cellNull[i] == false && cellNull[i - 1] == true){ //前面为空 index = strIndex + i + 1; break; } else if(cellNull[i] == true && cellNull[i - 1] == false){ //后面为空 index = strIndex + i; break; } } } if(c == endIndex){ index = endIndex; } i++; } } else if(direction == "left"){ let stValue = Store.flowdata[focusIndex][endIndex]; if(getObjType(stValue) == "object" && isRealNull(stValue.v)){ stNull = true; } else if(isRealNull(stValue)){ stNull = true; } else{ stNull = false; } let cellNull = [], i = 0; for(let c = endIndex - 1; c >= strIndex; c--){ let cell = Store.flowdata[focusIndex][c]; if(getObjType(cell) == "object" && isRealNull(cell.v)){ cellNull.push(true); } else if(isRealNull(cell)){ cellNull.push(true); } else{ cellNull.push(false); } if(cellNull.length == 1 && stNull && cellNull[i] == false){ index = endIndex - (i + 1); break; } else if(cellNull.length > 1){ if(stNull && cellNull[i] == false){ //起始是空,找第一个有值的位置 index = endIndex - (i + 1); break; } else if(!stNull){ //起始有值,找一个有值的位置 if(cellNull[i] == false && cellNull[i - 1] == true){ //前面为空 index = endIndex - (i + 1); break; } else if(cellNull[i] == true && cellNull[i - 1] == false){ //后面为空 index = endIndex - i; break; } } } if(c == strIndex){ index = strIndex; } i++; } } return index; } export { luckysheetMoveEndCell, luckysheetMoveHighlightCell, luckysheetMoveHighlightCell2, luckysheetMoveHighlightRange, luckysheetMoveHighlightRange2, }