DBeaver的LightGrid 类所有函数详细分析

DBeaver的LightGrid 类所有函数详细分析

一、构造函数与初始化

1. checkStyle(int style)

java 复制代码
private static int checkStyle(int style)

功能 :过滤和添加必要的SWT样式
处理逻辑

  • 只保留BORDERH_SCROLLV_SCROLLSINGLEMULTI等关键样式
  • 强制添加SWT.DOUBLE_BUFFERED(双缓冲减少闪烁)
  • 可选添加SWT.NO_BACKGROUND(提升性能)

2. LightGrid(Composite parent, int style)

功能 :构造函数,初始化整个Grid控件
初始化内容

  • 创建GC和字体资源(normal、bold、italic)
  • 初始化三个渲染器(列、行、单元格)
  • 设置颜色和光标
  • 创建滚动条适配器
  • 初始化事件监听器
  • 计算初始尺寸

二、数据管理函数

3. collectRowsFromElements(List<IGridRow> result, Object[] elements)

功能 :将原始数据对象递归转换为Grid行对象
算法

java 复制代码
for each element:
    创建GridRow对象
    添加到底层集合
    如果有嵌套数据 -> 递归收集子行

4. getNestedRowsCount(IGridRow row)

功能 :获取行的嵌套子行数量
逻辑:检查展开状态,返回最大展开列的长度

5. collectNestedRows(List<IGridRow> result, IGridRow parentRow, int index, int colLength)

功能 :递归收集嵌套行数据
参数

  • colLength:要收集的子行数量
  • 返回更新后的索引位置

6. refreshData(boolean refreshColumns, boolean keepState, boolean fitValue)

功能 :刷新Grid数据(核心方法)
处理流程

  1. 保存当前状态(焦点、滚动位置、列宽)
  2. 检查控件是否曾被隐藏
  3. 如果需要刷新列 -> 重建列结构
  4. 刷新行数据
  5. 恢复保存的状态
  6. 重新计算尺寸和滚动条

7. refreshRowsData()

功能 :只刷新行数据,不改变列结构
调用场景:数据内容变化但列结构不变时

8. getCurrentOrLastClientArea()

功能 :获取当前或最后一次有效的客户区尺寸
用途:解决控件堆叠时尺寸为0的问题(缓存机制)

三、列管理函数

9. createChildColumns(GridColumn parent)

功能 :递归创建子列(支持列分组)
实现:调用ContentProvider获取子列,递归创建

10. getColumn(int index)

功能 :根据索引获取列对象
返回:列对象或null

11. getColumnByElement(Object element)

功能 :根据业务元素查找列
遍历:所有列,比较element对象

12. getColumnIndex(int x, int y)

功能 :根据屏幕坐标获取列索引
用途:鼠标事件定位

13. indexOf(GridColumn column)

功能 :获取列在columns列表中的索引
特殊处理:获取列的FirstLeaf(最左叶子节点)

14. getPinnedColumnsWidth()

功能 :计算固定列的总宽度
逻辑:遍历前面的列直到遇到非固定列

四、行管理函数

15. getRow(int row)

功能:根据索引获取行对象

16. getRowElement(int row)

功能:获取行对应的业务对象

17. getRowByElement(int fromIndex, Object element)

功能:从指定位置开始查找包含特定元

18. getRow(Point point)

功能 :根据屏幕坐标获取行索引
算法

  1. 减去列头高度
  2. 遍历可见行,检查Y坐标范围
  3. 返回匹配的行索引

五、渲染与绘制函数

19. onPaint(PaintEvent e)

功能 :核心绘制方法
绘制顺序

  1. 清空背景
  2. 更新滚动条(如果需要)
  3. 绘制列头
  4. 遍历可见行:
    • 计算每行的X坐标
    • 绘制普通单元格
    • 绘制行头
    • 绘制固定列
  5. 绘制网格线
  6. 绘制固定列分隔线

20. paintHeader(GC gc)

功能 :绘制列头
实现

  • 绘制顶层列
  • 处理固定列
  • 绘制左上角单元格

21. paintColumnsHeader(GC gc, GridColumn column, int x, int y, int columnHeight, int level)

功能 :递归绘制列头(支持多级列头)
参数

  • level:当前层级,用于计算Y坐标

22. drawEmptyCell(GC gc, int x, int y, int width, int height)

功能:绘制空白单元格(无数据的区域)

23. drawEmptyColumnHeader(GC gc, int x, int y, int width, int height)

功能:绘制空白列头区域

24. drawEmptyRowHeader(GC gc, int x, int y, int width, int height)

功能:绘制空白行头区域

25. drawTopLeftCell(GC gc, int x, int y, int width, int height)

功能 :绘制左上角单元格
内容

  • 排序图标
  • 只读图标
  • 自定义内容(可重写)

26. paintTopLeftCellCustom(GC gc, int y)

功能:可重写的左上角单元格定制绘制方法

六、尺寸计算函数

27. computeSize(int wHint, int hHint, boolean changed)

功能 :计算控件首选尺寸
逻辑:计算表格实际大小 + 滚动条宽度

28. getTableSize()

功能 :计算表格内容的总尺寸
公式:总宽度 = 行头宽度 + 所有列宽;总高度 = 列头高度 + 所有行高

29. computeHeaderSizes(boolean decreaseSize)

功能 :计算头部的尺寸
计算内容

  • 行高(基于字体)
  • 列头高度(取最大列头高度)
  • 行头宽度(取最大行文本宽度)

30. recalculateSizes(boolean decreaseSize)

功能 :重新计算所有尺寸
用途:数据变化后调用

31. getItemHeight()

功能 :获取行高
返回:缓存的itemHeight

32. setItemHeight(int height)

功能 :设置行高
副作用:标记滚动值失效,触发重绘

33. getHeaderHeight()

功能 :获取列头总高度
包括:多级列头的总高度

34. getRowHeaderWidth()

功能:获取行头宽度

35. getVisibleGridHeight()

功能 :获取可见网格区域的高度
计算:客户区高度 - 列头高度

36. getVisibleGridHeight(Rectangle clientArea)

功能:重载方法,使用指定的客户区计算

37. getGridHeight()

功能:获取表格内容的总高度(不包括列头)

七、滚动与可见性函数

38. getTopIndex()

功能 :获取第一个可见行的索引
缓存机制:使用topIndex缓存,-1表示需要重新计算

39. setTopIndex(int index)

功能 :设置第一个可见行
实现:调用垂直滚动条的setSelection

40. getBottomIndex()

功能 :获取最后可见行的索引
注意:该行可能只部分可见

41. updateScrollbars()

功能 :更新滚动条的参数
逻辑

  • 判断是否需要显示滚动条
  • 设置滚动范围
  • 设置滚动块大小
  • 支持两种滚动模式(像素/列)

42. getHScrollSelectionInPixels()

功能 :获取水平滚动位置(像素)
转换:如果是列滚动模式,将列索引转换为像素

43. showItem(int item)

功能 :滚动使指定行可见
实现

  1. 检查是否已可见
  2. 如果在底部下面 -> 滚动到底部可见
  3. 如果在顶部上面 -> 滚动到顶部

44. showItem(int item, int topOffset)

功能 :带偏移的显示行
参数:topOffset - 目标行距离顶部的偏移行数

45. showColumn(int column)

功能 :滚动使指定列可见
处理

  • 获取列的实际位置
  • 计算需要滚动的距离
  • 处理固定列的特殊情况

46. showColumn(Object element)

功能 :根据列元素显示列
实现:查找对应的列后调用上面的方法

47. isShown(int row)

功能 :判断行是否完全可见
注意:只判断高度,不考虑水平滚动

48. getColumnHeaderXPosition(GridColumn column)

功能 :获取列头在屏幕上的X坐标
计算:考虑滚动位置和行头宽度

49. getOrigin(GridColumn column, int item)

功能 :获取单元格的左上角坐标
参数:item为-1时获取列头的坐标

50. getMaxVisibleRows()

功能 :获取最多能显示的行数
计算:客户区高度 / 行高 + 1

51. getRowRange(int startIndex, int endIndex)

功能 :计算行范围的信息
返回:RowRange对象(包含起始、结束索引、行数、高度)

52. getRowRange(int startIndex, int availableHeight, boolean forceEndCompletelyInside, boolean inverse)

功能 :根据可用高度计算行范围
参数

  • inverse:true表示反向查找(从底部向上)
  • forceEndCompletelyInside:是否强制终点完全可见

八、选择系统函数

53. selectCell(GridPos cell)

功能:选择单个单元格

54. selectCells(Collection<GridPos> cells)

功能:选择多个单元格

55. select(int index)

功能:选择整行

56. select(int start, int end)

功能:选择行范围

57. select(int[] indices)

功能:选择多个整行

58. selectAll()

功能:全选所有单元格

59. deselectAll()

功能:清空所有选择

60. setSelection(int index)

功能:设置当前选择(清除之前选择)

61. setSelection(int start, int end)

功能:设置行范围选择

62. setSelection(int[] indices)

功能:设置多个行的选择

63. getSelection()

功能:获取选中的单元格集合

64. getCellSelection()

功能:获取选中的单元格(业务对象列表)

65. getColumnSelection()

功能:获取选中的列集合

66. getRowSelection()

功能:获取选中的行索引集合

67. isRowSelected(int row)

功能:判断行是否被选中

68. getCellSelectionSize()

功能:获取选中单元格数量

69. getColumnSelectionSize()

功能:获取选中列数量

70. getRowSelectionSize()

功能:获取选中行数量

71. selectAllCells()

功能:选择所有单元格(公开方法)

72. selectAllCellsInternal(int stateMask)

功能 :内部全选实现
返回:Selection事件对象

73. setCellSelection(GridPos cell)

功能:设置单元格选择(清空之前选择)

74. updateCellSelection(List<GridPos> newCells, int stateMask, boolean dragging, boolean reverseDuplicateSelections, EventSource eventSource)

功能 :更新单元格选择(核心逻辑)
处理按键

  • Shift:范围选择
  • Ctrl:多选/反选
  • Alt:选择整列/行

75. updateSelectionCache()

功能 :更新选择缓存
作用:从selectedCells重建selectedColumns和selectedRows

76. addToCellSelection(GridPos newCell)

功能 :添加单元格到选择集
返回:是否添加成功

77. getCells(GridColumn col, List<GridPos> cells)

功能:获取指定列的所有单元格

78. getCells(int row, List<GridPos> cells)

功能:获取指定行的所有单元格

79. getAllCells()

功能:获取所有单元格的列表

80. getCells(int startRow, int endRow, List<GridPos> cells)

功能:获取行范围内的所有单元格

81. getSelectionRange(int fromItem, GridColumn fromColumn, int toItem, GridColumn toColumn)

功能:计算选择范围(处理列合并)

82. getRowSelectionRange(GridColumn fromColumn, GridColumn toColumn)

功能:计算行选择的列范围

九、交互事件处理函数

83. initListeners()

功能 :初始化所有事件监听器
注册的事件

  • Paint、Resize、KeyDown
  • MouseDown、MouseUp、MouseMove
  • MouseTrack、Focus
  • MouseWheel

84. onMouseDown(MouseEvent e)

功能 :鼠标按下处理
处理的场景

  • 列排序/过滤按钮
  • 列调整大小
  • 单元格选择
  • 行头选择
  • 列头选择

85. onMouseUp(MouseEvent e)

功能 :鼠标释放处理
清理:拖拽状态、调整大小状态

86. onMouseMove(MouseEvent e)

功能 :鼠标移动处理
功能

  • 更新悬停状态
  • 处理拖拽选择
  • 列大小调整拖拽

87. onMouseDoubleClick(MouseEvent e)

功能 :鼠标双击处理
触发

  • 列头双击 -> 自动调整列宽
  • 单元格双击 -> 发送DefaultSelection事件
  • 行头双击 -> 展开/折叠

88. onKeyDown(Event e)

功能 :键盘按键处理
支持的键

  • 方向键:移动焦点
  • Home/End:跳转到首/尾
  • PageUp/Down:翻页
  • +/-:展开/折叠树节点
  • Space:切换单元格值

89. onMouseVerticalWheel(Event e)

功能:鼠标滚轮垂直滚动处理

90. onMouseHorizontalWheel(Event e)

功能:鼠标滚轮水平滚动处理

91. onScrollSelection()

功能 :滚动条滚动事件处理
作用:标记滚动值失效,触发重绘

92. onResize()

功能 :控件大小改变处理
作用:标记滚动值失效,重建可见范围

93. onFocusIn()

功能 :获得焦点处理
作用:设置默认焦点行

94. setDefaultFocusRow()

功能 :设置默认焦点行
逻辑:如果没有焦点且有数据,设置第一行为焦点

95. onDispose(Event event)

功能 :控件销毁处理
清理:字体、GC等资源

96. handleHoverOnColumnHeader(int x, int y)

功能 :处理列头悬停
检测

  • 排序按钮悬停
  • 过滤按钮悬停
  • 列大小调整区域
  • 列图标悬停

97. handleHoverOnRowHeader(int x, int y)

功能:处理行头悬停

98. handleHovering(int x, int y)

功能:综合处理悬停状态

99. handleCellHover(int x, int y)

功能 :处理单元格悬停
返回 :悬停区域是否变化
功能

  • 检测链接悬停
  • 更新工具提示

100. refreshHoverState()

功能 :刷新悬停状态
用途:屏幕外悬停状态更新

101. onMouseExit(MouseEvent e)

功能 :鼠标离开处理
清理:清空悬停状态

102. handleColumnResizerDragging(int x)

功能 :列大小调整拖拽处理
逻辑

  1. 计算新宽度
  2. 检查最小/最大限制
  3. 设置新宽度并重绘

十、工具提示函数

103. getCellToolTip(GridColumn col, int row)

功能 :获取单元格工具提示文本
逻辑

  • 获取单元格完整文本
  • 如果文本宽度>列宽或高度>行高 -> 返回提示
  • 否则返回空字符串

104. getCellText(IGridColumn colElement, IGridRow rowElement)

功能 :获取单元格显示文本
截断:超过1000字符自动截断

105. getCellText(Object cellValue)

功能:重载方法,直接处理对象转文本

十一、展开/折叠函数

106. toggleRowExpand(IGridRow gridRow, IGridColumn gridColumn)

功能 :切换行的展开/折叠状态
实现

  1. 获取或创建展开状态对象
  2. 切换指定列的展开状态
  3. 刷新行数据
  4. 重新计算尺寸和滚动条

107. isCellExpanded(IGridCell cell)

功能:判断单元格是否展开(用于树形结构)

108. isRowExpanded(IGridRow gridRow)

功能:判断行是否完全展开

109. getRowState(IGridRow row)

功能 :获取行的展开状态
返回:NONE/COLLAPSED/EXPANDED

十二、UI辅助函数

110. setHeaderVisible(boolean show)

功能:设置列头可见性

111. setRowHeaderVisible(boolean show)

功能:设置行头可见性

112. setLinesVisible(boolean linesVisible)

功能:设置网格线可见性

113. setLineColor(Color lineColor)

功能:设置网格线颜色

114. setDefaultBackground(GC gc)

功能:设置默认背景色(从LabelProvider获取)

115. setColumnScrolling(boolean columnScrolling)

功能 :设置滚动模式
true :按列滚动
false:按像素滚动

116. getColumnScrolling()

功能:获取当前滚动模式

117. setMaxColumnDefWidth(int maxColumnDefWidth)

功能:设置列的最大定义宽度百分比

118. setFont(Font font)

功能 :设置字体
副作用:重新创建粗体、斜体字体

119. getFont(UIElementFontStyle style)

功能:获取指定样式的字体

十三、单元格坐标转换函数

120. posToCell(GridPos pos)

功能:将坐标位置转换为单元格对象

121. cellToPos(GridCell cell)

功能:将单元格对象转换为坐标位置

122. getCell(Point point)

功能:根据屏幕坐标获取单元格坐标

123. getFocusPos()

功能:获取当前焦点单元格坐标

124. getFocusCell()

功能:获取当前焦点单元格对象

125. getFocusColumnElement()

功能:获取焦点列的业务元素

126. getFocusRowElement()

功能:获取焦点行的业务元素

127. getFocusRow()

功能:获取焦点行对象

128. setFocusItem(int item)

功能:设置焦点行索引

129. setFocusColumn(int col)

功能:设置焦点列索引

130. resetFocus()

功能:重置所有焦点

131. isValidCell(GridPos cell)

功能:检查单元格坐标是否有效

132. getCellBounds(int columnIndex, int rowIndex)

功能 :获取单元格在屏幕上的边界矩形
用途:用于弹出编辑器、高亮等

十四、其他辅助函数

133. setScrollValuesObsolete()

功能 :标记滚动值已过时
作用:强制下次重绘时重新计算

134. newColumn(GridColumn column, int index)

功能:内部添加新列的方法

135. setDefaultFocusRow()

功能:设置默认焦点行

136. toggleCellValue(IGridColumn column, IGridRow row)

功能 :切换单元格值(可重写)
默认实现:空方法,子类可覆盖实现复选框等逻辑

137. getNextVisibleItem(int index)

功能:获取下一个可见行索引

138. getPreviousVisibleItem(int index)

功能:获取上一个可见行索引

139. getNextVisibleColumn(GridColumn column)

功能:获取下一个可见列

140. getPreviousVisibleColumn(GridColumn column)

功能:获取上一个可见列

十五、拖拽与DnD函数

141. addDragAndDropSupport()

功能 :添加拖拽支持
支持:列拖拽重排、数据导出

142. isDragSingleColumn()

功能:判断是否只拖拽单列

143. isDragSingleRow()

功能:判断是否只拖拽单行

十六、监听器管理函数

144. addSelectionListener(SelectionListener listener)

功能:添加选择监听器

145. removeSelectionListener(SelectionListener listener)

功能:移除选择监听器

总结

这个LightGrid类总共有约145个函数,涵盖了:

  1. 生命周期管理(构造、销毁)
  2. 数据管理(刷新、更新)
  3. 渲染系统(绘制、坐标计算)
  4. 选择系统(多级选择、范围选择)
  5. 交互处理(鼠标、键盘、拖拽)
  6. 滚动优化(虚拟化、缓存)
  7. 辅助功能(工具提示、焦点管理)

每个函数都经过精心设计,共同构成了一个高性能、功能完整的表格控件。

相关推荐
钛态4 小时前
前端TypeScript高级技巧:让你的代码更安全
前端·vue·react·web
光影少年4 小时前
前端在页面渲染优化和组件优化经验?
前端·vue.js·react.js·前端框架
yqcoder5 小时前
CSS 迷思破解:`:nth-child` vs `:nth-of-type`
前端·css
时寒的笔记5 小时前
某陆飞11期_webpack案例
前端·webpack·node.js
漫游的渔夫5 小时前
前端开发者做多步 Agent:别让 AI 边想边乱跑,用 Plan-Act-Observe 稳住 4 步任务
前端·人工智能·typescript
一锤捌拾6 小时前
V8引擎精品漫游指南--Ignition篇(下 一) 动态执行前的事情
前端·javascript
遇见~未来6 小时前
第六篇_CSS进阶_深入浏览器与工程化
前端·css·rust
Cache技术分享6 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
前端·后端
Daybreak6 小时前
Vercel Serverless 调国内 AI 接口 504?Edge Runtime 救了我
前端