/******************************************************************************* * 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; } } }; }