DBeaver的LightGrid 类所有函数详细分析
一、构造函数与初始化
1. checkStyle(int style)
java
private static int checkStyle(int style)
功能 :过滤和添加必要的SWT样式
处理逻辑:
- 只保留
BORDER、H_SCROLL、V_SCROLL、SINGLE、MULTI等关键样式 - 强制添加
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数据(核心方法)
处理流程:
- 保存当前状态(焦点、滚动位置、列宽)
- 检查控件是否曾被隐藏
- 如果需要刷新列 -> 重建列结构
- 刷新行数据
- 恢复保存的状态
- 重新计算尺寸和滚动条
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)
功能 :根据屏幕坐标获取行索引
算法:
- 减去列头高度
- 遍历可见行,检查Y坐标范围
- 返回匹配的行索引
五、渲染与绘制函数
19. onPaint(PaintEvent e)
功能 :核心绘制方法
绘制顺序:
- 清空背景
- 更新滚动条(如果需要)
- 绘制列头
- 遍历可见行:
- 计算每行的X坐标
- 绘制普通单元格
- 绘制行头
- 绘制固定列
- 绘制网格线
- 绘制固定列分隔线
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)
功能 :滚动使指定行可见
实现:
- 检查是否已可见
- 如果在底部下面 -> 滚动到底部可见
- 如果在顶部上面 -> 滚动到顶部
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)
功能 :列大小调整拖拽处理
逻辑:
- 计算新宽度
- 检查最小/最大限制
- 设置新宽度并重绘
十、工具提示函数
103. getCellToolTip(GridColumn col, int row)
功能 :获取单元格工具提示文本
逻辑:
- 获取单元格完整文本
- 如果文本宽度>列宽或高度>行高 -> 返回提示
- 否则返回空字符串
104. getCellText(IGridColumn colElement, IGridRow rowElement)
功能 :获取单元格显示文本
截断:超过1000字符自动截断
105. getCellText(Object cellValue)
功能:重载方法,直接处理对象转文本
十一、展开/折叠函数
106. toggleRowExpand(IGridRow gridRow, IGridColumn gridColumn)
功能 :切换行的展开/折叠状态
实现:
- 获取或创建展开状态对象
- 切换指定列的展开状态
- 刷新行数据
- 重新计算尺寸和滚动条
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个函数,涵盖了:
- 生命周期管理(构造、销毁)
- 数据管理(刷新、更新)
- 渲染系统(绘制、坐标计算)
- 选择系统(多级选择、范围选择)
- 交互处理(鼠标、键盘、拖拽)
- 滚动优化(虚拟化、缓存)
- 辅助功能(工具提示、焦点管理)
每个函数都经过精心设计,共同构成了一个高性能、功能完整的表格控件。