打造Windows资源管理器编辑风格的ColumnViewer

背景

通常在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);

你可能感兴趣的:(打造Windows资源管理器编辑风格的ColumnViewer)