x-data-spreadsheet
Version:
a javascript xpreadsheet
109 lines (95 loc) • 2.11 kB
JavaScript
import { CellRange } from './cell_range';
class Merges {
constructor(d = []) {
this._ = d;
}
forEach(cb) {
this._.forEach(cb);
}
deleteWithin(cr) {
this._ = this._.filter(it => !it.within(cr));
}
getFirstIncludes(ri, ci) {
for (let i = 0; i < this._.length; i += 1) {
const it = this._[i];
if (it.includes(ri, ci)) {
return it;
}
}
return null;
}
filterIntersects(cellRange) {
return new Merges(this._.filter(it => it.intersects(cellRange)));
}
intersects(cellRange) {
for (let i = 0; i < this._.length; i += 1) {
const it = this._[i];
if (it.intersects(cellRange)) {
// console.log('intersects');
return true;
}
}
return false;
}
union(cellRange) {
let cr = cellRange;
this._.forEach((it) => {
if (it.intersects(cr)) {
cr = it.union(cr);
}
});
return cr;
}
add(cr) {
this.deleteWithin(cr);
this._.push(cr);
}
// type: row | column
shift(type, index, n, cbWithin) {
this._.forEach((cellRange) => {
const {
sri, sci, eri, eci,
} = cellRange;
const range = cellRange;
if (type === 'row') {
if (sri >= index) {
range.sri += n;
range.eri += n;
} else if (sri < index && index <= eri) {
range.eri += n;
cbWithin(sri, sci, n, 0);
}
} else if (type === 'column') {
if (sci >= index) {
range.sci += n;
range.eci += n;
} else if (sci < index && index <= eci) {
range.eci += n;
cbWithin(sri, sci, 0, n);
}
}
});
}
move(cellRange, rn, cn) {
this._.forEach((it1) => {
const it = it1;
if (it.within(cellRange)) {
it.eri += rn;
it.sri += rn;
it.sci += cn;
it.eci += cn;
}
});
}
setData(merges) {
this._ = merges.map(merge => CellRange.valueOf(merge));
return this;
}
getData() {
return this._.map(merge => merge.toString());
}
}
export default {};
export {
Merges,
};