/*******************************************************************************
* Copyright (c) 2004, 2007 Boeing.
* 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:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.nebula.widgets.xviewer;
import java.util.logging.Level;
import org.eclipse.nebula.widgets.xviewer.core.model.XViewerColumn;
import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.TreeItem;
/**
* @author Donald G. Dunne
*/
public class XViewerGradient {
private final XViewer xViewer;
private boolean on = false;
public XViewerGradient(XViewer xViewer) {
this.xViewer = xViewer;
setOn(true);
}
public boolean isOn() {
return on;
}
public void setOn(boolean on) {
if (this.on == on) {
return;
}
this.on = on;
if (this.on) {
this.xViewer.getTree().addListener(SWT.PaintItem, paintListener);
} else {
this.xViewer.getTree().removeListener(SWT.PaintItem, paintListener);
}
}
private final Listener paintListener = new Listener() {
@Override
public void handleEvent(Event event) {
try {
XViewerColumn xViewerColumn =
((IXViewerLabelProvider) xViewer.getLabelProvider()).getTreeColumnOffIndex(event.index);
TreeItem item = (TreeItem) event.item;
if (item.getData() == null) {
return;
}
int percent =
((IXViewerLabelProvider) xViewer.getLabelProvider()).getColumnGradient(item.getData(), xViewerColumn,
event.index);
if (percent == 0 || percent > 100 || percent < 0) {
return;
}
GC gc = event.gc;
Color foreground = gc.getForeground();
Color background = gc.getBackground();
gc.setForeground(xViewer.getTree().getDisplay().getSystemColor(SWT.COLOR_GREEN));
gc.setBackground(xViewer.getTree().getDisplay().getSystemColor(SWT.COLOR_YELLOW));
int width = (xViewerColumn.getWidth() - 1) * percent / 100;
gc.fillGradientRectangle(event.x, event.y, width, event.height, true);
Rectangle rect2 = new Rectangle(event.x, event.y, width - 1, event.height - 1);
gc.setForeground(xViewer.getTree().getDisplay().getSystemColor(SWT.COLOR_BLACK));
gc.drawRectangle(rect2);
gc.setForeground(xViewer.getTree().getDisplay().getSystemColor(SWT.COLOR_LIST_FOREGROUND));
String text =
((IXViewerLabelProvider) xViewer.getLabelProvider()).getColumnText(item.getData(), xViewerColumn,
event.index);
Point size = event.gc.textExtent(text);
int offset = Math.max(0, (event.height - size.y) / 2 + 1);
gc.drawText(text, event.x + 5, event.y + offset, true);
gc.setForeground(background);
gc.setBackground(foreground);
} catch (Exception ex) {
XViewerLog.log(XViewerGradient.class, Level.SEVERE, ex);
return;
}
}
};
}