org.eclipse.nebula.widgets.richtext.RichTextCellLabelProvider.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.nebula.widgets.richtext.RichTextCellLabelProvider.java

Source

/*****************************************************************************
 * Copyright (c) 2015 CEA LIST.
 *
 * 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:
 *      Dirk Fauth <dirk.fauth@googlemail.com> - Initial API and implementation
 *
 *****************************************************************************/
package org.eclipse.nebula.widgets.richtext;

import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;

/**
 *
 * @see <a
 *      href="https://www.eclipse.org/articles/article.php?file=Article-CustomDrawingTableAndTreeItems/index.html">Custom
 *      Drawing Table and Tree Items</a>
 */
public abstract class RichTextCellLabelProvider<T> extends StyledCellLabelProvider {

    private int columnIndex = -1;

    private RichTextPainter painter;

    int preferredWidth = -1;

    public RichTextCellLabelProvider(final Control viewerControl) {
        this(viewerControl, 5, false);
    }

    public RichTextCellLabelProvider(final Control viewerControl, boolean wordWrap) {
        this(viewerControl, 5, wordWrap);
    }

    public RichTextCellLabelProvider(final Control viewerControl, final int leftRightMargin, boolean wordWrap) {
        super(COLORS_ON_SELECTION);

        this.painter = new RichTextPainter(wordWrap);

        if (viewerControl instanceof Tree) {
            viewerControl.addListener(SWT.MeasureItem, new Listener() {

                @Override
                public void handleEvent(Event event) {
                    final Item item = (Item) event.item;

                    @SuppressWarnings("unchecked")
                    String html = getRichText((T) item.getData());
                    if (event.index == columnIndex && html != null && !html.isEmpty()) {

                        Rectangle bounds = null;
                        if (item instanceof TableItem) {
                            bounds = ((TableItem) item).getBounds(event.index);
                        } else if (item instanceof TreeItem) {
                            bounds = ((TreeItem) item).getBounds();
                            bounds.x -= 3;
                        }

                        bounds.width -= (leftRightMargin * 2);

                        if (bounds != null) {
                            int topMargin = ((bounds.height - event.gc.getFontMetrics().getHeight()) / 2)
                                    - painter.getParagraphSpace();

                            bounds.x += leftRightMargin;
                            bounds.y += topMargin;
                            painter.preCalculate(html, event.gc, bounds, false);
                            event.width = painter.getPreferredSize().x + leftRightMargin;
                        }
                    }
                }
            });
        }

        viewerControl.addListener(SWT.PaintItem, new Listener() {
            @Override
            public void handleEvent(Event event) {
                final Item item = (Item) event.item;

                @SuppressWarnings("unchecked")
                String html = getRichText((T) item.getData());
                if (event.index == columnIndex && html != null && !html.isEmpty()) {

                    Rectangle bounds = null;
                    if (item instanceof TableItem) {
                        bounds = ((TableItem) item).getBounds(event.index);
                    } else if (item instanceof TreeItem) {
                        bounds = ((TreeItem) item).getBounds();
                        bounds.x -= 3;
                    }

                    bounds.width -= (leftRightMargin * 2);

                    if (bounds != null) {
                        int topMargin = ((bounds.height - event.gc.getFontMetrics().getHeight()) / 2)
                                - painter.getParagraphSpace();

                        bounds.x += leftRightMargin;
                        bounds.y += topMargin;
                        painter.paintHTML(html, event.gc, bounds);
                    }
                }
            }
        });
    }

    @Override
    public void update(ViewerCell cell) {
        columnIndex = cell.getColumnIndex();
        super.update(cell);
    }

    public abstract String getRichText(T object);

    /**
     * Null-safe method to return the text that should be shown.
     * 
     * @param object
     *            The value object to get the text to show from.
     * @return The text to render or an empty string if the given object is <code>null</code>
     */
    protected String getText(T object) {
        if (object != null) {
            return getRichText(object);
        }
        return "";
    }
}