Mercurial > projects > dwt-addons
diff dwtx/jface/viewers/OwnerDrawLabelProvider.d @ 10:b6c35faf97c8
Viewers
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Mon, 31 Mar 2008 00:47:19 +0200 |
parents | |
children | 644f1334b451 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dwtx/jface/viewers/OwnerDrawLabelProvider.d Mon Mar 31 00:47:19 2008 +0200 @@ -0,0 +1,211 @@ +/******************************************************************************* + * Copyright (c) 2006, 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 + * Port to the D programming language: + * Frank Benoit <benoit@tionex.de> + *******************************************************************************/ + +module dwtx.jface.viewers.OwnerDrawLabelProvider; + +import dwtx.jface.viewers.CellLabelProvider; +import dwtx.jface.viewers.ColumnViewer; +import dwtx.jface.viewers.ViewerCell; + +import dwt.DWT; +import dwt.graphics.Color; +import dwt.graphics.Rectangle; +import dwt.widgets.Event; +import dwt.widgets.Listener; + +import dwt.dwthelper.utils; + +/** + * OwnerDrawLabelProvider is an abstract implementation of a label provider that + * handles custom draw. + * + * <p> + * <b>This class is intended to be subclassed by implementors.</b> + * </p> + * + * @since 3.3 + * + */ +public abstract class OwnerDrawLabelProvider : CellLabelProvider { + + /** + * Set up the owner draw callbacks for the viewer. + * + * @param viewer + * the viewer the owner draw is set up + */ + public static void setUpOwnerDraw(ColumnViewer viewer) { + viewer.getControl().addListener(DWT.MeasureItem, new class Listener { + ColumnViewer viewer_; + this(){ + viewer_=viewer; + } + /* + * (non-Javadoc) + * + * @see dwt.widgets.Listener#handleEvent(dwt.widgets.Event) + */ + public void handleEvent(Event event) { + CellLabelProvider provider = viewer_ + .getViewerColumn(event.index).getLabelProvider(); + Object element = event.item.getData(); + + if ( auto p = cast(OwnerDrawLabelProvider) provider ) + p.measure(event, element); + } + }); + + viewer.getControl().addListener(DWT.PaintItem, new class Listener { + ColumnViewer viewer_; + this(){ + viewer_=viewer; + } + /* + * (non-Javadoc) + * + * @see dwt.widgets.Listener#handleEvent(dwt.widgets.Event) + */ + public void handleEvent(Event event) { + CellLabelProvider provider = viewer_ + .getViewerColumn(event.index).getLabelProvider(); + Object element = event.item.getData(); + + if ( auto p = cast(OwnerDrawLabelProvider) provider ) + p.paint(event, element); + } + }); + + viewer.getControl().addListener(DWT.EraseItem, new class Listener { + ColumnViewer viewer_; + this(){ + viewer_=viewer; + } + /* + * (non-Javadoc) + * + * @see dwt.widgets.Listener#handleEvent(dwt.widgets.Event) + */ + public void handleEvent(Event event) { + + CellLabelProvider provider = getLabelProvider(viewer_, event); + Object element = getElement(event); + + if ( auto p = cast(OwnerDrawLabelProvider) provider ) + p.erase(event, element); + + } + + /** + * Return the item for the event + * + * @param event + * @return Object + */ + private Object getElement(Event event) { + return event.item.getData(); + } + + /** + * Return the label provider for the column. + * + * @param viewer + * @param event + * @return CellLabelProvider + */ + private CellLabelProvider getLabelProvider( + ColumnViewer viewer, Event event) { + return viewer.getViewerColumn(event.index).getLabelProvider(); + } + }); + } + + /** + * Handle the erase event. The default implementation colors the background + * of selected areas with {@link DWT#COLOR_LIST_SELECTION} and foregrounds + * with {@link DWT#COLOR_LIST_SELECTION_TEXT} + * + * @param event + * the erase event + * @param element + * the model object + * @see DWT#EraseItem + * @see DWT#COLOR_LIST_SELECTION + * @see DWT#COLOR_LIST_SELECTION_TEXT + */ + protected void erase(Event event, Object element) { + + Rectangle bounds = event.getBounds(); + if ((event.detail & DWT.SELECTED) !is 0) { + + Color oldForeground = event.gc.getForeground(); + Color oldBackground = event.gc.getBackground(); + + event.gc.setBackground(event.item.getDisplay().getSystemColor( + DWT.COLOR_LIST_SELECTION)); + event.gc.setForeground(event.item.getDisplay().getSystemColor( + DWT.COLOR_LIST_SELECTION_TEXT)); + event.gc.fillRectangle(bounds); + /* restore the old GC colors */ + event.gc.setForeground(oldForeground); + event.gc.setBackground(oldBackground); + /* ensure that default selection is not drawn */ + event.detail &= ~DWT.SELECTED; + + } + + } + + /** + * Handle the paint event. + * + * @param event + * the paint event + * @param element + * the model element + * @see DWT#PaintItem + */ + protected abstract void paint(Event event, Object element); + + /** + * Handle the measure event. + * + * @param event + * the measure event + * @param element + * the model element + * @see DWT#MeasureItem + */ + protected abstract void measure(Event event, Object element); + + /** + * Create a new instance of the receiver based on a column viewer. + * + */ + public this() { + + } + + /* + * (non-Javadoc) + * + * @see dwtx.jface.viewers.ViewerLabelProvider#update(dwtx.jface.viewers.ViewerCell) + */ + public void update(ViewerCell cell) { + // Force a redraw + Rectangle cellBounds = cell.getBounds(); + cell.getControl().redraw(cellBounds.x, cellBounds.y, cellBounds.width, + cellBounds.height, true); + + } + +}