eclipse rcp: как выделить одну ячейку в просмотрщике таблиц? - PullRequest
1 голос
/ 28 июня 2011

Как я могу изменить стандартное поведение выбора таблиц, я хочу сделать ячейку выделенной, когда пользователь щелкает по ней, и сделать ее редактируемой, когда пользователь дважды щелкает по ней.что я хочу.enter image description hereВот моя реализация подсветки ячеек:

package com.amarsoft.rcputil;

import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;


public class DefaultCellFocusHighlighter extends FocusCellOwnerDrawHighlighter {

    public DefaultCellFocusHighlighter(ColumnViewer viewer) {
        super(viewer);
    }

    protected boolean onlyTextHighlighting(ViewerCell cell) {
        return false;
    }

    protected Color getSelectedCellBackgroundColor(ViewerCell cell) {
        return cell.getControl().getDisplay().getSystemColor(SWT.COLOR_DARK_BLUE);
    }

    protected Color getSelectedCellForegroundColor(ViewerCell cell) {
        return cell.getControl().getDisplay().getSystemColor(SWT.COLOR_WHITE);
    }

    protected Color getSelectedCellForegroundColorNoFocus(ViewerCell cell) {
        return cell.getControl().getDisplay().getSystemColor(SWT.COLOR_WHITE);
    }

    protected Color getSelectedCellBackgroundColorNoFocus(ViewerCell cell) {
        return cell.getControl().getDisplay().getSystemColor(SWT.COLOR_DARK_BLUE);
    }

    protected void focusCellChanged(ViewerCell newCell, ViewerCell oldCell) {
        super.focusCellChanged(newCell, oldCell);
    }



}

код для его использования:

TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(tv,new DefaultCellFocusHighlighter(tv));
        ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(tv) {
            protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
                return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
                        || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
                        || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR)
                        || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
            }
        };

        TableViewerEditor.create(tv, focusCellManager, actSupport, ColumnViewerEditor.TABBING_HORIZONTAL
                | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
                | ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);

но у меня появилась новая проблема: enter image description hereкогда я дважды щелкаю по ячейке, чтобы отредактировать ее значение, в левой части ячейки остается небольшая область, все еще подсвеченная синим цветом

Я знаю почему: Когда текстовый элемент управления создается с рамкой, операционная система включает в себя специфическую для платформы вставку вокруг содержимого элемента управления. все еще ищу исправления ...

Ответы [ 2 ]

1 голос
/ 28 июня 2011

Взгляните на эти два фрагмента JFace:

  • Snippet036FocusBorderCellHighlighter - Демонстрирует навигацию с помощью клавиатуры, выделяя текущую выбранную ячейку с рамкой фокуса, еще раз демонстрируя гибкость новой поддержки навигации по ячейкам
  • Snippet034CellEditorPerRowNewAPI - Демонстрирует различные типы CellEditor в одной COLUMN с 3.3-API JFace-Viewers
0 голосов
/ 11 мая 2012

После просмотра кода я нашел следующий метод в классе ColumnViewer:

/**
 * Hook up the editing support. Subclasses may override.
 * 
 * @param control
 *      the control you want to hook on
 */
protected void hookEditingSupport(Control control) {
    // Needed for backwards comp with AbstractTreeViewer and TableTreeViewer
    // who are not hooked this way others may already overwrite and provide
    // their
    // own impl
    if (viewerEditor != null) {
        control.addMouseListener(new MouseAdapter() {
            public void mouseDown(MouseEvent e) {
                // Workaround for bug 185817
                if (e.count != 2) {
                    handleMouseDown(e);
                }
            }

            public void mouseDoubleClick(MouseEvent e) {
                handleMouseDown(e);
            }
        });
    }
}

Итак, я переопределил эту функцию в моем подклассе TableViewer:

@Override protected void hookEditingSupport(Control control) {
    // We know there should be an editor avaiable
//  if (viewerEditor != null) {
        control.addMouseListener(new MouseAdapter() {
            public void mouseDown(MouseEvent e) {
                // Workaround for bug 185817
                if (e.count != 2) {
                    // We don't want to edit on single clicks
//                  handleMouseDown(e);
                }
            }

            public void mouseDoubleClick(MouseEvent e) {
                // This method is private, so copy the implementation
//              handleMouseDown(e);
                ViewerCell cell = getCell(new Point(e.x, e.y));
                e.count--; // A hack to make things work - pretend like it's a single click
                if (cell != null) {
                    triggerEditorActivationEvent(new ColumnViewerEditorActivationEvent(
                            cell, e));
                }
            }
        });
//  }
}

Это работает для меня.Скажите, работает ли он у вас.

...