blob: 0725c4be369878ddbe456ff04d5d5eaea4f2043a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2007 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
*******************************************************************************/
package org.eclipse.jface.snippets.viewers;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.FocusCellHighlighter;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerRow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
public class FocusBorderCellHighlighter extends FocusCellHighlighter {
private ViewerCell oldCell;
/**
* @param viewer
* the viewer
*/
public FocusBorderCellHighlighter(ColumnViewer viewer) {
super(viewer);
hookListener(viewer);
}
private void markFocusedCell(Event event, ViewerCell cell) {
GC gc = event.gc;
Rectangle rect = event.getBounds();
gc.drawFocus(rect.x, rect.y, rect.width, rect.height);
event.detail &= ~SWT.SELECTED;
}
private void removeSelectionInformation(Event event, ViewerCell cell) {
}
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 = focusCell.getViewerRow();
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);
}
}
}
};
viewer.getControl().addListener(SWT.EraseItem, listener);
}
/**
* @param cell
* the cell which is colored
* @return the color
*/
protected Color getSelectedCellBackgroundColor(ViewerCell cell) {
return null;
}
/**
* @param cell
* the cell which is colored
* @return the color
*/
protected Color getSelectedCellForegroundColor(ViewerCell cell) {
return null;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.FocusCellHighlighter#focusCellChanged(org.eclipse.jface.viewers.ViewerCell)
*/
protected void focusCellChanged(ViewerCell cell) {
super.focusCellChanged(cell);
// Redraw new area
if (cell != null) {
Rectangle rect = cell.getBounds();
int x = cell.getColumnIndex() == 0 ? 0 : rect.x;
int width = cell.getColumnIndex() == 0 ? rect.x + rect.width
: rect.width;
cell.getControl().redraw(x, rect.y, width, rect.height, 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;
oldCell.getControl().redraw(x, rect.y, width, rect.height, true);
}
this.oldCell = cell;
}
}