feat:add table tool
This commit is contained in:
@@ -108,3 +108,83 @@
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.table-tool__row {
|
||||||
|
position: absolute;
|
||||||
|
width: 12px;
|
||||||
|
border-radius: 6.5px;
|
||||||
|
overflow: hidden;
|
||||||
|
background-color: #E2E6ED;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-tool__row .table-tool__row__item {
|
||||||
|
width: 100%;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-tool__row .table-tool__row__item::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left: 2px;
|
||||||
|
width: 8px;
|
||||||
|
height: 1px;
|
||||||
|
background-color: #C0C6CF;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-tool__row .table-tool__row__item:last-child:after {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-tool__col {
|
||||||
|
position: absolute;
|
||||||
|
height: 12px;
|
||||||
|
border-radius: 6.5px;
|
||||||
|
overflow: hidden;
|
||||||
|
background-color: #E2E6ED;
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-tool__col .table-tool__col__item {
|
||||||
|
height: 100%;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-tool__col .table-tool__col__item::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 2px;
|
||||||
|
left: -1px;
|
||||||
|
width: 1px;
|
||||||
|
height: 8px;
|
||||||
|
z-index: 1;
|
||||||
|
background-color: #C0C6CF;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-tool__col .table-tool__col__item:first-child:after {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-tool__row .table-tool__row__item.active,
|
||||||
|
.table-tool__col .table-tool__col__item.active {
|
||||||
|
background-color: #C4D7FA;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-tool__col .table-tool__anchor {
|
||||||
|
right: -5px;
|
||||||
|
width: 10px;
|
||||||
|
height: 12px;
|
||||||
|
z-index: 9;
|
||||||
|
position: absolute;
|
||||||
|
cursor: col-resize;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-tool__row .table-tool__anchor {
|
||||||
|
bottom: -5px;
|
||||||
|
left: 0;
|
||||||
|
width: 12px;
|
||||||
|
height: 10px;
|
||||||
|
z-index: 9;
|
||||||
|
position: absolute;
|
||||||
|
cursor: row-resize;
|
||||||
|
}
|
||||||
@@ -25,6 +25,7 @@ import { PageNumber } from "./frame/PageNumber"
|
|||||||
import { GlobalObserver } from "../observer/GlobalObserver"
|
import { GlobalObserver } from "../observer/GlobalObserver"
|
||||||
import { TableParticle } from "./particle/table/TableParticle"
|
import { TableParticle } from "./particle/table/TableParticle"
|
||||||
import { ISearchResult } from "../../interface/Search"
|
import { ISearchResult } from "../../interface/Search"
|
||||||
|
import { TableTool } from "./particle/table/TableTool"
|
||||||
|
|
||||||
export class Draw {
|
export class Draw {
|
||||||
|
|
||||||
@@ -50,6 +51,7 @@ export class Draw {
|
|||||||
private imageParticle: ImageParticle
|
private imageParticle: ImageParticle
|
||||||
private textParticle: TextParticle
|
private textParticle: TextParticle
|
||||||
private tableParticle: TableParticle
|
private tableParticle: TableParticle
|
||||||
|
private tableTool: TableTool
|
||||||
private pageNumber: PageNumber
|
private pageNumber: PageNumber
|
||||||
|
|
||||||
private rowList: IRow[]
|
private rowList: IRow[]
|
||||||
@@ -87,6 +89,7 @@ export class Draw {
|
|||||||
this.imageParticle = new ImageParticle(this)
|
this.imageParticle = new ImageParticle(this)
|
||||||
this.textParticle = new TextParticle(this)
|
this.textParticle = new TextParticle(this)
|
||||||
this.tableParticle = new TableParticle(this)
|
this.tableParticle = new TableParticle(this)
|
||||||
|
this.tableTool = new TableTool(this)
|
||||||
this.pageNumber = new PageNumber(this)
|
this.pageNumber = new PageNumber(this)
|
||||||
new GlobalObserver(this)
|
new GlobalObserver(this)
|
||||||
|
|
||||||
@@ -234,6 +237,10 @@ export class Draw {
|
|||||||
return this.imageParticle
|
return this.imageParticle
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public getTableTool(): TableTool {
|
||||||
|
return this.tableTool
|
||||||
|
}
|
||||||
|
|
||||||
public getRowCount(): number {
|
public getRowCount(): number {
|
||||||
return this.rowList.length
|
return this.rowList.length
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,93 @@
|
|||||||
|
import { IElement } from "../../../.."
|
||||||
|
import { IEditorOption } from "../../../../interface/Editor"
|
||||||
|
import { IElementPosition } from "../../../../interface/Element"
|
||||||
|
import { Position } from "../../../position/Position"
|
||||||
|
import { Draw } from "../../Draw"
|
||||||
|
|
||||||
|
export class TableTool {
|
||||||
|
|
||||||
|
private readonly translate = 18
|
||||||
|
|
||||||
|
private draw: Draw
|
||||||
|
private options: Required<IEditorOption>
|
||||||
|
private position: Position
|
||||||
|
private container: HTMLDivElement
|
||||||
|
private toolRowContainer: HTMLDivElement | null
|
||||||
|
private toolColContainer: HTMLDivElement | null
|
||||||
|
|
||||||
|
constructor(draw: Draw) {
|
||||||
|
this.draw = draw
|
||||||
|
this.options = draw.getOptions()
|
||||||
|
this.position = draw.getPosition()
|
||||||
|
this.container = draw.getContainer()
|
||||||
|
// x、y轴
|
||||||
|
this.toolRowContainer = null
|
||||||
|
this.toolColContainer = null
|
||||||
|
}
|
||||||
|
|
||||||
|
public dispose() {
|
||||||
|
this.toolRowContainer?.remove()
|
||||||
|
this.toolColContainer?.remove()
|
||||||
|
}
|
||||||
|
|
||||||
|
public render(element: IElement, position: IElementPosition) {
|
||||||
|
this.dispose()
|
||||||
|
const { trIndex, tdIndex } = this.position.getPositionContext()
|
||||||
|
const { scale } = this.options
|
||||||
|
const height = this.draw.getHeight()
|
||||||
|
const pageGap = this.draw.getPageGap()
|
||||||
|
const { colgroup, trList } = element
|
||||||
|
const { coordinate: { leftTop } } = position
|
||||||
|
const prePageHeight = this.draw.getPageNo() * (height + pageGap)
|
||||||
|
const td = element.trList![trIndex!].tdList[tdIndex!]
|
||||||
|
const rowIndex = td.rowIndex
|
||||||
|
const colIndex = td.colIndex
|
||||||
|
// 计算表格行列信息
|
||||||
|
const rowList = trList!.map(tr => tr.height)
|
||||||
|
const colList = colgroup!.map(col => col.width)
|
||||||
|
// 渲染行
|
||||||
|
const rowContainer = document.createElement('div')
|
||||||
|
rowContainer.classList.add('table-tool__row')
|
||||||
|
rowContainer.style.transform = `translateX(-${this.translate * scale}px)`
|
||||||
|
for (let r = 0; r < rowList.length; r++) {
|
||||||
|
const rowHeight = rowList[r] * scale
|
||||||
|
const rowItem = document.createElement('div')
|
||||||
|
rowItem.classList.add('table-tool__row__item')
|
||||||
|
if (r === rowIndex) {
|
||||||
|
rowItem.classList.add('active')
|
||||||
|
}
|
||||||
|
const rowItemAnchor = document.createElement('div')
|
||||||
|
rowItemAnchor.classList.add('table-tool__anchor')
|
||||||
|
rowItem.append(rowItemAnchor)
|
||||||
|
rowItem.style.height = `${rowHeight}px`
|
||||||
|
rowContainer.append(rowItem)
|
||||||
|
}
|
||||||
|
rowContainer.style.left = `${leftTop[0]}px`
|
||||||
|
rowContainer.style.top = `${leftTop[1] + prePageHeight}px`
|
||||||
|
this.container.append(rowContainer)
|
||||||
|
this.toolRowContainer = rowContainer
|
||||||
|
|
||||||
|
// 渲染列
|
||||||
|
const colContainer = document.createElement('div')
|
||||||
|
colContainer.classList.add('table-tool__col')
|
||||||
|
colContainer.style.transform = `translateY(-${this.translate * scale}px)`
|
||||||
|
for (let c = 0; c < colList.length; c++) {
|
||||||
|
const colHeight = colList[c] * scale
|
||||||
|
const colItem = document.createElement('div')
|
||||||
|
colItem.classList.add('table-tool__col__item')
|
||||||
|
if (c === colIndex) {
|
||||||
|
colItem.classList.add('active')
|
||||||
|
}
|
||||||
|
const colItemAnchor = document.createElement('div')
|
||||||
|
colItemAnchor.classList.add('table-tool__anchor')
|
||||||
|
colItem.append(colItemAnchor)
|
||||||
|
colItem.style.width = `${colHeight}px`
|
||||||
|
colContainer.append(colItem)
|
||||||
|
}
|
||||||
|
colContainer.style.left = `${leftTop[0]}px`
|
||||||
|
colContainer.style.top = `${leftTop[1] + prePageHeight}px`
|
||||||
|
this.container.append(colContainer)
|
||||||
|
this.toolColContainer = colContainer
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@ import { writeTextByElementList } from "../../utils/clipboard"
|
|||||||
import { Cursor } from "../cursor/Cursor"
|
import { Cursor } from "../cursor/Cursor"
|
||||||
import { Draw } from "../draw/Draw"
|
import { Draw } from "../draw/Draw"
|
||||||
import { ImageParticle } from "../draw/particle/ImageParticle"
|
import { ImageParticle } from "../draw/particle/ImageParticle"
|
||||||
|
import { TableTool } from "../draw/particle/table/TableTool"
|
||||||
import { HistoryManager } from "../history/HistoryManager"
|
import { HistoryManager } from "../history/HistoryManager"
|
||||||
import { Position } from "../position/Position"
|
import { Position } from "../position/Position"
|
||||||
import { RangeManager } from "../range/RangeManager"
|
import { RangeManager } from "../range/RangeManager"
|
||||||
@@ -24,6 +25,7 @@ export class CanvasEvent {
|
|||||||
private cursor: Cursor | null
|
private cursor: Cursor | null
|
||||||
private historyManager: HistoryManager
|
private historyManager: HistoryManager
|
||||||
private imageParticle: ImageParticle
|
private imageParticle: ImageParticle
|
||||||
|
private tableTool: TableTool
|
||||||
|
|
||||||
constructor(draw: Draw) {
|
constructor(draw: Draw) {
|
||||||
this.isAllowDrag = false
|
this.isAllowDrag = false
|
||||||
@@ -38,6 +40,7 @@ export class CanvasEvent {
|
|||||||
this.range = this.draw.getRange()
|
this.range = this.draw.getRange()
|
||||||
this.historyManager = this.draw.getHistoryManager()
|
this.historyManager = this.draw.getHistoryManager()
|
||||||
this.imageParticle = this.draw.getImageParticle()
|
this.imageParticle = this.draw.getImageParticle()
|
||||||
|
this.tableTool = this.draw.getTableTool()
|
||||||
}
|
}
|
||||||
|
|
||||||
public register() {
|
public register() {
|
||||||
@@ -163,6 +166,13 @@ export class CanvasEvent {
|
|||||||
const curIndex = isTable ? tdValueIndex! : index
|
const curIndex = isTable ? tdValueIndex! : index
|
||||||
this.imageParticle.drawResizer(elementList[curIndex], positionList[curIndex])
|
this.imageParticle.drawResizer(elementList[curIndex], positionList[curIndex])
|
||||||
}
|
}
|
||||||
|
// 表格工具组件
|
||||||
|
this.tableTool.dispose()
|
||||||
|
if (isTable) {
|
||||||
|
const elementList = this.draw.getOriginalElementList()
|
||||||
|
const positionList = this.position.getOriginalPositionList()
|
||||||
|
this.tableTool.render(elementList[index], positionList[index])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public mouseleave(evt: MouseEvent) {
|
public mouseleave(evt: MouseEvent) {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { findParent } from "../../utils"
|
|||||||
import { Cursor } from "../cursor/Cursor"
|
import { Cursor } from "../cursor/Cursor"
|
||||||
import { Draw } from "../draw/Draw"
|
import { Draw } from "../draw/Draw"
|
||||||
import { ImageParticle } from "../draw/particle/ImageParticle"
|
import { ImageParticle } from "../draw/particle/ImageParticle"
|
||||||
|
import { TableTool } from "../draw/particle/table/TableTool"
|
||||||
import { RangeManager } from "../range/RangeManager"
|
import { RangeManager } from "../range/RangeManager"
|
||||||
import { CanvasEvent } from "./CanvasEvent"
|
import { CanvasEvent } from "./CanvasEvent"
|
||||||
|
|
||||||
@@ -16,6 +17,7 @@ export class GlobalEvent {
|
|||||||
private canvasEvent: CanvasEvent
|
private canvasEvent: CanvasEvent
|
||||||
private range: RangeManager
|
private range: RangeManager
|
||||||
private imageParticle: ImageParticle
|
private imageParticle: ImageParticle
|
||||||
|
private tableTool: TableTool
|
||||||
|
|
||||||
constructor(draw: Draw, canvasEvent: CanvasEvent) {
|
constructor(draw: Draw, canvasEvent: CanvasEvent) {
|
||||||
this.draw = draw
|
this.draw = draw
|
||||||
@@ -25,6 +27,7 @@ export class GlobalEvent {
|
|||||||
this.cursor = null
|
this.cursor = null
|
||||||
this.range = draw.getRange()
|
this.range = draw.getRange()
|
||||||
this.imageParticle = draw.getImageParticle()
|
this.imageParticle = draw.getImageParticle()
|
||||||
|
this.tableTool = draw.getTableTool()
|
||||||
}
|
}
|
||||||
|
|
||||||
public register() {
|
public register() {
|
||||||
@@ -66,6 +69,7 @@ export class GlobalEvent {
|
|||||||
this.range.recoveryRangeStyle()
|
this.range.recoveryRangeStyle()
|
||||||
this.range.setRange(0, 0)
|
this.range.setRange(0, 0)
|
||||||
this.imageParticle.clearResizer()
|
this.imageParticle.clearResizer()
|
||||||
|
this.tableTool.dispose()
|
||||||
}
|
}
|
||||||
|
|
||||||
public setDragState() {
|
public setDragState() {
|
||||||
|
|||||||
Reference in New Issue
Block a user