Commit e9fd2a15 authored by Alexander.Trofimov's avatar Alexander.Trofimov

add half selection

parent 6988f6fd
...@@ -120,6 +120,8 @@ ...@@ -120,6 +120,8 @@
ctx.fillRect(1, 1, 1, 1); ctx.fillRect(1, 1, 1, 1);
this.ptrnLineDotted1 = ctx.createPattern(cnv, "repeat"); this.ptrnLineDotted1 = ctx.createPattern(cnv, "repeat");
this.halfSelection = false;
return this; return this;
} }
......
...@@ -5804,9 +5804,20 @@ ...@@ -5804,9 +5804,20 @@
return result; return result;
}; };
// dX = true - считать с половиной следующей ячейки /**
WorksheetView.prototype._findColUnderCursor = function (x, canReturnNull, dX) { *
var c = this.visibleRange.c1, offset = this.cols[c].left - this.cellsLeft, c2, x1, x2, cFrozen, widthDiff = 0; * @param x
* @param canReturnNull
* @param half - считать с половиной следующей ячейки
* @returns {*}
* @private
*/
WorksheetView.prototype._findColUnderCursor = function (x, canReturnNull, half) {
var activeCellCol = this._getSelection().activeCell.col;
var dx = 0;
var c = this.visibleRange.c1;
var offset = this.cols[c].left - this.cellsLeft;
var c2, x1, x2, cFrozen, widthDiff = 0;
if (x >= this.cellsLeft) { if (x >= this.cellsLeft) {
if (this.topLeftFrozenCell) { if (this.topLeftFrozenCell) {
cFrozen = this.topLeftFrozenCell.getCol0(); cFrozen = this.topLeftFrozenCell.getCol0();
...@@ -5818,20 +5829,26 @@ ...@@ -5818,20 +5829,26 @@
} }
for (x1 = this.cellsLeft + widthDiff, c2 = this.cols.length - 1; c <= c2; ++c, x1 = x2) { for (x1 = this.cellsLeft + widthDiff, c2 = this.cols.length - 1; c <= c2; ++c, x1 = x2) {
x2 = x1 + this.cols[c].width; x2 = x1 + this.cols[c].width;
if (x1 <= x && x < x2) { dx = half ? this.cols[c].width / 2.0 * Math.sign(c - activeCellCol) : 0;
if (dX) { if (x1 + dx > x) {
// Учитываем половину ячейки if (c !== this.visibleRange.c1) {
if (x1 <= x && x < x1 + this.cols[c].width / 2.0) { if (dx) {
// Это предыдущая ячейка c -= 1;
--c; x2 = x1;
// Можем вернуть и -1 (но это только для fillHandle) x1 -= this.cols[c].width;
} }
return {col: c, left: x1, right: x2};
} else {
c = c2;
break;
} }
} else if (x <= x2 + dx) {
return {col: c, left: x1, right: x2}; return {col: c, left: x1, right: x2};
} }
} }
if (!canReturnNull) { if (!canReturnNull) {
return {col: c2, left: this.cols[c2].left - offset, right: x2}; x1 = this.cols[c2].left - offset;
return {col: c2, left: x1, right: x1 + this.cols[c2].width};
} }
} else { } else {
if (this.topLeftFrozenCell) { if (this.topLeftFrozenCell) {
...@@ -5844,33 +5861,30 @@ ...@@ -5844,33 +5861,30 @@
for (x2 = this.cellsLeft + this.cols[c].width, c2 = 0; c >= c2; --c, x2 = x1) { for (x2 = this.cellsLeft + this.cols[c].width, c2 = 0; c >= c2; --c, x2 = x1) {
x1 = this.cols[c].left - offset; x1 = this.cols[c].left - offset;
if (x1 <= x && x < x2) { if (x1 <= x && x < x2) {
if (dX) {
// Учитываем половину ячейки
if (x1 <= x && x < x1 + this.cols[c].width / 2.0) {
// Это предыдущая ячейка
--c;
// Можем вернуть и -1 (но это только для fillHandle)
}
}
return {col: c, left: x1, right: x2}; return {col: c, left: x1, right: x2};
} }
} }
if (!canReturnNull) { if (!canReturnNull) {
if (dX) {
// Это предыдущая ячейка
--c2;
// Можем вернуть и -1 (но это только для fillHandle)
return {col: c2};
}
return {col: c2, left: x1, right: x1 + this.cols[c2].width}; return {col: c2, left: x1, right: x1 + this.cols[c2].width};
} }
} }
return null; return null;
}; };
// dY = true - считать с половиной следующей ячейки /**
WorksheetView.prototype._findRowUnderCursor = function (y, canReturnNull, dY) { *
var r = this.visibleRange.r1, offset = this.rows[r].top - this.cellsTop, r2, y1, y2, rFrozen, heightDiff = 0; * @param y
* @param canReturnNull
* @param half - считать с половиной следующей ячейки
* @returns {*}
* @private
*/
WorksheetView.prototype._findRowUnderCursor = function (y, canReturnNull, half) {
var activeCellRow = this._getSelection().activeCell.row;
var dy = 0;
var r = this.visibleRange.r1;
var offset = this.rows[r].top - this.cellsTop;
var r2, y1, y2, rFrozen, heightDiff = 0;
if (y >= this.cellsTop) { if (y >= this.cellsTop) {
if (this.topLeftFrozenCell) { if (this.topLeftFrozenCell) {
rFrozen = this.topLeftFrozenCell.getRow0(); rFrozen = this.topLeftFrozenCell.getRow0();
...@@ -5882,20 +5896,26 @@ ...@@ -5882,20 +5896,26 @@
} }
for (y1 = this.cellsTop + heightDiff, r2 = this.rows.length - 1; r <= r2; ++r, y1 = y2) { for (y1 = this.cellsTop + heightDiff, r2 = this.rows.length - 1; r <= r2; ++r, y1 = y2) {
y2 = y1 + this.rows[r].height; y2 = y1 + this.rows[r].height;
if (y1 <= y && y < y2) { dy = half ? this.rows[r].height / 2.0 * Math.sign(r - activeCellRow) : 0;
if (dY) { if (y1 + dy > y) {
// Учитываем половину ячейки if (r !== this.visibleRange.r1) {
if (y1 <= y && y < y1 + this.rows[r].height / 2.0) { if (dy) {
// Это предыдущая ячейка r -= 1;
--r; y2 = y1;
// Можем вернуть и -1 (но это только для fillHandle) y1 -= this.rows[r].height;
} }
return {row: r, top: y1, bottom: y2};
} else {
r = r2;
break;
} }
} else if (y <= y2 + dy) {
return {row: r, top: y1, bottom: y2}; return {row: r, top: y1, bottom: y2};
} }
} }
if (!canReturnNull) { if (!canReturnNull) {
return {row: r2, top: this.rows[r2].top - offset, bottom: y2}; y1 = this.rows[r2].top - offset;
return {row: r2, top: y1, bottom: y1 + this.rows[r2].height};
} }
} else { } else {
if (this.topLeftFrozenCell) { if (this.topLeftFrozenCell) {
...@@ -5908,24 +5928,10 @@ ...@@ -5908,24 +5928,10 @@
for (y2 = this.cellsTop + this.rows[r].height, r2 = 0; r >= r2; --r, y2 = y1) { for (y2 = this.cellsTop + this.rows[r].height, r2 = 0; r >= r2; --r, y2 = y1) {
y1 = this.rows[r].top - offset; y1 = this.rows[r].top - offset;
if (y1 <= y && y < y2) { if (y1 <= y && y < y2) {
if (dY) {
// Учитываем половину ячейки
if (y1 <= y && y < y1 + this.rows[r].height / 2.0) {
// Это предыдущая ячейка
--r;
// Можем вернуть и -1 (но это только для fillHandle)
}
}
return {row: r, top: y1, bottom: y2}; return {row: r, top: y1, bottom: y2};
} }
} }
if (!canReturnNull) { if (!canReturnNull) {
if (dY) {
// Это предыдущая ячейка
--r2;
// Можем вернуть и -1 (но это только для fillHandle)
return {row: r2};
}
return {row: r2, top: y1, bottom: y1 + this.rows[r2].height}; return {row: r2, top: y1, bottom: y1 + this.rows[r2].height};
} }
} }
...@@ -6514,8 +6520,9 @@ ...@@ -6514,8 +6520,9 @@
x *= asc_getcvt(0/*px*/, 1/*pt*/, this._getPPIX()); x *= asc_getcvt(0/*px*/, 1/*pt*/, this._getPPIX());
y *= asc_getcvt(0/*px*/, 1/*pt*/, this._getPPIY()); y *= asc_getcvt(0/*px*/, 1/*pt*/, this._getPPIY());
var res = new asc_Range(tmpSelection.activeCell.col, tmpSelection.activeCell.row, this._findColUnderCursor( var res = new asc_Range(tmpSelection.activeCell.col, tmpSelection.activeCell.row, this._findColUnderCursor(x,
x).col, this._findRowUnderCursor(y).row, true); false, this.settings.halfSelection).col, this._findRowUnderCursor(y, false,
this.settings.halfSelection).row, true);
if (ar.type === c_oAscSelectionType.RangeCells) { if (ar.type === c_oAscSelectionType.RangeCells) {
this._fixSelectionOfMergedCells(res); this._fixSelectionOfMergedCells(res);
} }
...@@ -7568,11 +7575,11 @@ ...@@ -7568,11 +7575,11 @@
var activeFillHandleCopy; var activeFillHandleCopy;
// Колонка по X и строка по Y // Колонка по X и строка по Y
var colByX = this._findColUnderCursor(x, /*canReturnNull*/false, /*dX*/true).col; var colByX = this._findColUnderCursor(x, /*canReturnNull*/false, true).col;
var rowByY = this._findRowUnderCursor(y, /*canReturnNull*/false, /*dX*/true).row; var rowByY = this._findRowUnderCursor(y, /*canReturnNull*/false, true).row;
// Колонка по X и строка по Y (без половинчатого счета). Для сдвига видимой области // Колонка по X и строка по Y (без половинчатого счета). Для сдвига видимой области
var colByXNoDX = this._findColUnderCursor(x, /*canReturnNull*/false, /*dX*/false).col; var colByXNoDX = this._findColUnderCursor(x, /*canReturnNull*/false, false).col;
var rowByYNoDY = this._findRowUnderCursor(y, /*canReturnNull*/false, /*dX*/false).row; var rowByYNoDY = this._findRowUnderCursor(y, /*canReturnNull*/false, false).row;
// Сдвиг в столбцах и строках от крайней точки // Сдвиг в столбцах и строках от крайней точки
var dCol; var dCol;
var dRow; var dRow;
...@@ -7765,8 +7772,6 @@ ...@@ -7765,8 +7772,6 @@
this.activeFillHandle.r2 = ar.r1; this.activeFillHandle.r2 = ar.r1;
// Когда идем назад, должна быть колонка на 1 больше
this.activeFillHandle.c2 += 1;
// Случай, если мы еще не вышли из внутренней области // Случай, если мы еще не вышли из внутренней области
if (this.activeFillHandle.c2 == ar.c1) { if (this.activeFillHandle.c2 == ar.c1) {
this.fillHandleArea = 2; this.fillHandleArea = 2;
...@@ -7779,9 +7784,6 @@ ...@@ -7779,9 +7784,6 @@
this.activeFillHandle.r2 = ar.r1; this.activeFillHandle.r2 = ar.r1;
// Когда идем назад, должна быть колонка на 1 больше
this.activeFillHandle.c2 += 1;
if (this.activeFillHandle.c2 > this.activeFillHandle.c1) { if (this.activeFillHandle.c2 > this.activeFillHandle.c1) {
// Ситуация половинки последнего столбца // Ситуация половинки последнего столбца
this.activeFillHandle.c1 = ar.c1; this.activeFillHandle.c1 = ar.c1;
...@@ -7841,8 +7843,6 @@ ...@@ -7841,8 +7843,6 @@
this.activeFillHandle.c2 = ar.c1; this.activeFillHandle.c2 = ar.c1;
// Когда идем назад, должна быть строка на 1 больше
this.activeFillHandle.r2 += 1;
// Случай, если мы еще не вышли из внутренней области // Случай, если мы еще не вышли из внутренней области
if (this.activeFillHandle.r2 == ar.r1) { if (this.activeFillHandle.r2 == ar.r1) {
this.fillHandleArea = 2; this.fillHandleArea = 2;
...@@ -7855,9 +7855,6 @@ ...@@ -7855,9 +7855,6 @@
this.activeFillHandle.c2 = ar.c1; this.activeFillHandle.c2 = ar.c1;
// Когда идем назад, должна быть строка на 1 больше
this.activeFillHandle.r2 += 1;
if (this.activeFillHandle.r2 > this.activeFillHandle.r1) { if (this.activeFillHandle.r2 > this.activeFillHandle.r1) {
// Ситуация половинки последней строки // Ситуация половинки последней строки
this.activeFillHandle.c1 = ar.c1; this.activeFillHandle.c1 = ar.c1;
...@@ -8053,8 +8050,8 @@ ...@@ -8053,8 +8050,8 @@
} }
// Колонка по X и строка по Y // Колонка по X и строка по Y
var colByX = this._findColUnderCursor(x, /*canReturnNull*/false, /*dX*/false).col; var colByX = this._findColUnderCursor(x, /*canReturnNull*/false, false).col;
var rowByY = this._findRowUnderCursor(y, /*canReturnNull*/false, /*dY*/false).row; var rowByY = this._findRowUnderCursor(y, /*canReturnNull*/false, false).row;
if (selectionRange.type == c_oAscSelectionType.RangeRow) { if (selectionRange.type == c_oAscSelectionType.RangeRow) {
colByX = 0; colByX = 0;
...@@ -8179,8 +8176,8 @@ ...@@ -8179,8 +8176,8 @@
this.arrActiveChartRanges[indexFormulaRange]).getLast().clone(); this.arrActiveChartRanges[indexFormulaRange]).getLast().clone();
// Колонка по X и строка по Y // Колонка по X и строка по Y
var colByX = this._findColUnderCursor(x, /*canReturnNull*/false, /*dX*/false).col; var colByX = this._findColUnderCursor(x, /*canReturnNull*/false, false).col;
var rowByY = this._findRowUnderCursor(y, /*canReturnNull*/false, /*dY*/false).row; var rowByY = this._findRowUnderCursor(y, /*canReturnNull*/false, false).row;
// Если мы только первый раз попали сюда, то копируем выделенную область // Если мы только первый раз попали сюда, то копируем выделенную область
if (null === this.startCellMoveResizeRange) { if (null === this.startCellMoveResizeRange) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment