背景
通常在Eclipse插件开发或RCP开发中,如果需要使用表格编辑的话,一般都是在JFace的ColumnViewer上通过EditingSupport来实现,EditingSupport通过返回一个适当的CellEditor来支持单元格编辑操作。
但是JFace的这个机制默认是鼠标单击即打开CellEditor进入编辑状态的,在某些用户只想单击选择并不想编辑的场景下,用户体验会差很多。本篇文章就是想实现一种类似于Windows资源管理器中文件或文件夹重命名操作的单元格编辑模式,单击是选中,再次单击或者直接双击即进入编辑态,用户体验会好很多。
实现
实现这种编辑风格并不复杂,通过实现org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy
,然后覆盖isEditorActivationEvent
方法提供自定义的检测逻辑即可。
实现思路是用户单击表格项时,检查该表格项是否之前已被选中,如果是,则允许激活编辑态,否则记录一下当前选中的表格项;双击时则直接允许激活编辑态。需要注意的是,如果表格或树是设置的支持取消选择的话(即点击表格空白处取消当前表格项的选中态),则需要清除当前所记忆的选择项。
部分实现代码如下:
@Override
protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
boolean singleSelect = getViewer().getStructuredSelection().size() == 1;
if (!singleSelect) {
return false;
}
Object selected = getViewer().getStructuredSelection().getFirstElement();
boolean isLeftMouseSingleClick = event.eventType == ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION
&& ((MouseEvent) event.sourceEvent).button == 1;
boolean isLeftMouseDoubleClick = event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
&& ((MouseEvent) event.sourceEvent).button == 1;
if (isLeftMouseSingleClick) {
if (lastSelection == selected) {
return true;
}
lastSelection = selected;
}
if (isLeftMouseDoubleClick) {
lastSelection = selected;
return true;
}
return event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC
|| event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL;
}
使用的时候只需在创建ColumnViewer的时候把该Strategy设置进去即可,例如:
// approprate for TreeViewer
TreeViewerEditor.create(viewer, new DelayedColumnViewerEditorActivationStrategy(viewer),
TreeViewerEditor.KEEP_EDITOR_ON_DOUBLE_CLICK);
// approprate for TableViewer
TableViewerEditor.create(viewer, new DelayedColumnViewerEditorActivationStrategy(viewer),
TreeViewerEditor.KEEP_EDITOR_ON_DOUBLE_CLICK);