Bug 215069 [Viewers] Problems with FocusCellOwnerDrawHighlighter
I have been experimenting with using TreeViewerEditor and related facilities, such as FocusCellOwnerDrawHighlighter. Have noticed a few problems with the current implementation: 1. At least on Windows, the background color for the selection in the tree should alter depending on whether or not the overall tree widget has focus or not. FocusCellOwnerDrawHighlighter does not implement this feedback. 2. If you don't set SWT.FULL_SELECTION when creating the tree, the selection doesn't get painted on any column besides the first one. If this is expected behavior, this should at least be in javadoc. 3. Regardless of whether or not SWT.FULL_SELECTION is used, the selection extent in the first column is not restricted to the text (as it typical on Windows for trees). It goes all the way to the left margin of the tree widget and covers tree controls, icon and the checkbox. This doesn't look particularly good. Following native behavior here would be desirable. The FocusCellOwnerDrawHighlighter also needs javadoc since it's public API.
bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerCell.java
/**
	 * Get the current index. This can be different from the original index when
	 * columns are reordered
	 *
	 * @return the current index (as shown in the UI)
	 * @since 3.4
	 */
	public int getVisualIndex() {
		return row.getVisualIndex(getColumnIndex());
	}
	/**
	 * Returns the specified neighbor of this cell, or <code>null</code> if no
	 * neighbor exists in the given direction. Direction constants can be
	 * combined by bitwise OR; for example, this method will return the cell to
	 * the upper-left of the current cell by passing {@link #ABOVE} |
	 * {@link #LEFT}. If <code>sameLevel</code> is <code>true</code>, only
	 * cells in sibling rows (under the same parent) will be considered.
	 *
	 * @param directionMask
	 *            the direction mask used to identify the requested neighbor
	 *            cell
	 * @param sameLevel
	 *            if <code>true</code>, only consider cells from sibling rows
	 * @return the requested neighbor cell, or <code>null</code> if not found
	 */
	public ViewerCell getNeighbor(int directionMask, boolean sameLevel) {
		ViewerRow row;
		if ((directionMask & ABOVE) == ABOVE) {
			row = this.row.getNeighbor(ViewerRow.ABOVE, sameLevel);
		} else if ((directionMask & BELOW) == BELOW) {