view dwtx/jface/viewers/OwnerDrawLabelProvider.d @ 39:644f1334b451

fix anon classes
author Frank Benoit <benoit@tionex.de>
date Tue, 08 Apr 2008 22:05:42 +0200
parents b6c35faf97c8
children ea8ff534f622
line wrap: on
line source

/*******************************************************************************
 * 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(viewer) Listener {
            ColumnViewer viewer_;
            this(ColumnViewer a){
                viewer_=a;
            }
            /*
             * (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(viewer) Listener {
            ColumnViewer viewer_;
            this(ColumnViewer a){
                viewer_=a;
            }
            /*
             * (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(viewer) Listener {
            ColumnViewer viewer_;
            this(ColumnViewer a){
                viewer_=a;
            }
            /*
             * (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 cv, Event event) {
                return cv.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);

    }

}