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

add half selection

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