org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter Maven / Gradle / Ivy
The newest version!
/*******************************************************************************
* Copyright (c) 2007, 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Tom Schindl - initial API and implementation
* - fix for bug 183850, 182652, 182800, 215069
* Innoopract - RAP adaption
*******************************************************************************/
package org.eclipse.jface.viewers;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.*;
/**
* A concrete implementation of {@link FocusCellHighlighter} using by setting
* the control into owner draw mode and highlighting the currently selected
* cell. To make the use this class you should create the control with the
* {@link SWT#FULL_SELECTION} bit set
*
*
* RAP specific: despite its name that was taken as-is from
* JFace/RCP to ease single-sourcing, this class does not use custom drawing
* to highlight the focused cell.
*
* The focused cell is displayed using the selection colors of the system.
*
*
* This class can be subclassed to configure how the coloring of the selected
* cell.
*
* @since 1.2
*
*/
public class FocusCellOwnerDrawHighlighter extends FocusCellHighlighter {
private final ColumnViewer viewer;
/**
* Create a new instance which can be passed to a
*
* @param viewer
* the viewer
*/
public FocusCellOwnerDrawHighlighter(ColumnViewer viewer) {
super(viewer);
this.viewer = viewer;
// hookListener(viewer);
// RAP [if]
viewer.getControl().setData( Table.ALWAYS_HIDE_SELECTION, Boolean.TRUE );
}
private void markFocusedCell(Event event, ViewerCell cell) {
Color background = (cell.getControl().isFocusControl()) ? getSelectedCellBackgroundColor(cell)
: getSelectedCellBackgroundColorNoFocus(cell);
Color foreground = (cell.getControl().isFocusControl()) ? getSelectedCellForegroundColor(cell)
: getSelectedCellForegroundColorNoFocus(cell);
if (foreground != null || background != null || onlyTextHighlighting(cell)) {
// GC gc = event.gc;
if (background == null) {
background = cell.getItem().getDisplay().getSystemColor(
SWT.COLOR_LIST_SELECTION);
}
if (foreground == null) {
foreground = cell.getItem().getDisplay().getSystemColor(
SWT.COLOR_LIST_SELECTION_TEXT);
}
// gc.setBackground(background);
// gc.setForeground(foreground);
//
// if (onlyTextHighlighting(cell)) {
// Rectangle area = event.getBounds();
// Rectangle rect = cell.getTextBounds();
// if( rect != null ) {
// area.x = rect.x;
// }
// gc.fillRectangle(area);
// } else {
// gc.fillRectangle(event.getBounds());
// }
cell.setBackground( background );
cell.setForeground( foreground );
// event.detail &= ~SWT.SELECTED;
}
}
private void removeSelectionInformation(Event event, ViewerCell cell) {
// GC gc = event.gc;
// gc.setBackground(cell.getViewerRow().getBackground(
// cell.getColumnIndex()));
// gc.setForeground(cell.getViewerRow().getForeground(
// cell.getColumnIndex()));
// gc.fillRectangle(cell.getBounds());
// event.detail &= ~SWT.SELECTED;
Color cellBackground = null;
Color cellForeground = null;
CellLabelProvider labelProvider = viewer.getLabelProvider( cell.getColumnIndex() );
if( labelProvider instanceof ColumnLabelProvider ) {
ColumnLabelProvider columnLabelProvider = ( ColumnLabelProvider )labelProvider;
cellBackground = columnLabelProvider.getBackground( cell.getElement() );
cellForeground = columnLabelProvider.getForeground( cell.getElement() );
}
cell.setBackground( cellBackground );
cell.setForeground( cellForeground );
}
// private void hookListener(final ColumnViewer viewer) {
//
// Listener listener = new Listener() {
//
// public void handleEvent(Event event) {
//// if ((event.detail & SWT.SELECTED) > 0) {
// ViewerCell focusCell = getFocusCell();
// ViewerRow row = viewer.getViewerRowFromItem(event.item);
//
// Assert
// .isNotNull(row,
// "Internal structure invalid. Item without associated row is not possible."); //$NON-NLS-1$
//
//// ViewerCell cell = row.getCell(event.index);
////
//// if (focusCell == null || !cell.equals(focusCell)) {
//// removeSelectionInformation(event, cell);
//// } else {
//// markFocusedCell(event, cell);
//// }
//
// focusCellChanged( focusCell );
// }
//
// };
//// viewer.getControl().addListener(SWT.EraseItem, listener);
// viewer.getControl().addListener(SWT.KeyDown, listener);
// viewer.getControl().addListener(SWT.MouseDown, listener);
// }
/**
* The color to use when rendering the background of the selected cell when
* the control has the input focus
*
* @param cell
* the cell which is colored
* @return the color or null
to use the default
*/
protected Color getSelectedCellBackgroundColor(ViewerCell cell) {
return null;
}
/**
* The color to use when rendering the foreground (=text) of the selected
* cell when the control has the input focus
*
* @param cell
* the cell which is colored
* @return the color or null
to use the default
*/
protected Color getSelectedCellForegroundColor(ViewerCell cell) {
return null;
}
/**
* The color to use when rendering the foreground (=text) of the selected
* cell when the control has no input focus
*
* @param cell
* the cell which is colored
* @return the color or null
to use the same used when
* control has focus
*/
protected Color getSelectedCellForegroundColorNoFocus(ViewerCell cell) {
return null;
}
/**
* The color to use when rendering the background of the selected cell when
* the control has no input focus
*
* @param cell
* the cell which is colored
* @return the color or null
to use the same used when
* control has focus
*/
protected Color getSelectedCellBackgroundColorNoFocus(ViewerCell cell) {
return null;
}
/**
* Controls whether the whole cell or only the text-area is highlighted
*
* @param cell
* the cell which is highlighted
* @return true
if only the text area should be highlighted
*/
protected boolean onlyTextHighlighting(ViewerCell cell) {
// return false;
return true;
}
protected void init() {
ColumnViewerEditorActivationListener listener
= new ColumnViewerEditorActivationListener() {
public void afterEditorActivated( ColumnViewerEditorActivationEvent e )
{
}
public void afterEditorDeactivated( ColumnViewerEditorDeactivationEvent e )
{
focusCellChanged( getFocusCell(), null );
}
public void beforeEditorActivated( ColumnViewerEditorActivationEvent e )
{
}
public void beforeEditorDeactivated( ColumnViewerEditorDeactivationEvent e )
{
}
};
ColumnViewerEditor editor = viewer.getColumnViewerEditor();
editor.addEditorActivationListener( listener );
}
protected void focusCellChanged(ViewerCell newCell, ViewerCell oldCell) {
// super.focusCellChanged(newCell, oldCell);
//
// // Redraw new area
// if (newCell != null) {
// Rectangle rect = newCell.getBounds();
// int x = newCell.getColumnIndex() == 0 ? 0 : rect.x;
// int width = newCell.getColumnIndex() == 0 ? rect.x + rect.width
// : rect.width;
// // 1 is a fix for Linux-GTK
// newCell.getControl().redraw(x, rect.y - 1, width, rect.height + 1,
// true);
// }
//
// if (oldCell != null) {
// Rectangle rect = oldCell.getBounds();
// int x = oldCell.getColumnIndex() == 0 ? 0 : rect.x;
// int width = oldCell.getColumnIndex() == 0 ? rect.x + rect.width
// : rect.width;
// // 1 is a fix for Linux-GTK
// oldCell.getControl().redraw(x, rect.y - 1, width, rect.height + 1,
// true);
// }
if( oldCell != null ) {
removeSelectionInformation( null, oldCell );
}
if( newCell != null ) {
markFocusedCell( null, newCell );
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy