com.arm.cmsis.pack.ui.tree.AdvisedCellLabelProvider.java Source code

Java tutorial

Introduction

Here is the source code for com.arm.cmsis.pack.ui.tree.AdvisedCellLabelProvider.java

Source

/*******************************************************************************
* Copyright (c) 2015 ARM Ltd. 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:
* ARM Ltd and ARM Germany GmbH - Initial API and implementation
*******************************************************************************/
package com.arm.cmsis.pack.ui.tree;

import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;

import com.arm.cmsis.pack.ui.CpPlugInUI;

/**
 * This is a generic class to support owner-draw cell label displayed in a
 * TreeViewer
 */
public class AdvisedCellLabelProvider extends StyledCellLabelProvider {

    private static final int ALPHA = 160; // transparency value
    private static final int TEXTOFFSET = 4;
    private IColumnAdvisor columnAdvisor = null; // column advisor necessary
    // processing cell
    // attributes e.g. image,
    // check state
    private int columnIndex; // column index of this cell

    public AdvisedCellLabelProvider(IColumnAdvisor columnAdviser, int colIndex) {
        this.columnAdvisor = columnAdviser;
        this.columnIndex = colIndex;
    }

    @Override
    public void initialize(ColumnViewer viewer, ViewerColumn column) {
        super.initialize(viewer, column);
    }

    @Override
    public void dispose() {
        super.dispose();
    }

    @Override
    protected void paint(Event event, Object element) {
        drawBackground(event, element);
        switch (columnAdvisor.getCellControlType(element, columnIndex)) {
        case URL:
            super.paint(event, element); // draw only URL text
            drawUrl(event, element); // underline text
            break;
        case CHECK:
            drawCheckbox(event, element);
            break;
        case SPIN:
        case MENU:
        case COMBO:
            drawImage(event, element);
            super.paint(event, element);
            drawMark(event, element);
            break;
        default:
            super.paint(event, element);
            break;
        }
    }

    private void drawBackground(Event event, Object element) {
        Rectangle cellBounds = getCellBounds(event);
        Color clr = columnAdvisor.getBgColor(element, columnIndex);
        if (clr != null) {
            event.gc.setAlpha(ALPHA);
            event.gc.setBackground(clr);
            event.gc.fillRectangle(cellBounds);
            event.gc.setAlpha(255);
        }
    }

    private void drawImage(Event event, Object element) {
        Image image = columnAdvisor.getImage(element, columnIndex);
        if (image != null) {
            Rectangle cellBounds = getCellBounds(event);
            Rectangle imageBounds = image.getBounds();
            int dstX = (cellBounds.x + cellBounds.width) - imageBounds.width;
            int yOff = (cellBounds.height - imageBounds.height) / 2;
            yOff = Math.max(2, yOff);
            int dstY = cellBounds.y + yOff;

            event.gc.setAlpha(ALPHA);
            event.gc.drawImage(image, imageBounds.x, imageBounds.y, imageBounds.width, imageBounds.height, dstX,
                    dstY, imageBounds.width, imageBounds.height);
            event.gc.setAlpha(255);
        }
    }

    private void drawMark(Event event, Object element) {
        Rectangle cellBounds = getCellBounds(event);
        int[] ptArr = new int[6];

        int offs = cellBounds.height / 3;
        ptArr[0] = cellBounds.x + cellBounds.width;
        ptArr[1] = cellBounds.y + cellBounds.height - offs;
        ptArr[2] = ptArr[0];
        ptArr[3] = cellBounds.y + cellBounds.height;
        ptArr[4] = ptArr[0] - offs;
        ptArr[5] = ptArr[3];

        event.gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY));
        event.gc.fillPolygon(ptArr);
    }

    /**
     * Draw a check box
     * 
     * @param event
     * @param element
     *            tree item in the column zero
     */
    private void drawCheckbox(Event event, Object element) {
        Rectangle cellBounds = getCellBounds(event);
        boolean check = columnAdvisor.getCheck(element, columnIndex);
        boolean enabled = columnAdvisor.canEdit(element, columnIndex);
        Image image;
        if (enabled)
            image = check ? CpPlugInUI.getImage(CpPlugInUI.ICON_CHECKED)
                    : CpPlugInUI.getImage(CpPlugInUI.ICON_UNCHECKED);
        else
            image = check ? CpPlugInUI.getImage(CpPlugInUI.ICON_CHECKED_GREY)
                    : CpPlugInUI.getImage(CpPlugInUI.ICON_UNCHECKED_GREY);
        Rectangle imageBounds = image.getBounds();
        int dstX = (cellBounds.x + cellBounds.width / 2) - imageBounds.width / 2;
        int dstY = (cellBounds.y + cellBounds.height / 2) - imageBounds.height / 2 + cellBounds.height % 2;

        event.gc.drawImage(image, imageBounds.x, imageBounds.y, imageBounds.width, imageBounds.height, dstX, dstY,
                imageBounds.width, imageBounds.height);
    }

    /**
     * Draw an URL
     * 
     * @param event
     * @param element
     *            tree item in the column zero
     */
    private void drawUrl(Event event, Object element) {
        Rectangle cellBounds = getCellBounds(event);
        String text = columnAdvisor.getString(element, columnIndex);
        if (text != null) {
            int x = cellBounds.x + TEXTOFFSET;
            int y = cellBounds.y;

            Image img = columnAdvisor.getImage(element, columnIndex);
            if (img != null) {
                x += img.getBounds().width;
                y++;
            }

            Point extent = event.gc.textExtent(text);
            event.gc.drawLine(x - 1, y + extent.y, x + extent.x - 1, y + extent.y);
        }
    }

    /**
     * Return the cell bounds
     * 
     * @param event
     * @return The cell bounds
     */
    private Rectangle getCellBounds(Event event) {
        Widget item = event.item;
        Rectangle cellBounds = new Rectangle(0, 0, 0, 0);
        if (item instanceof TreeItem) {
            TreeItem treeItem = (TreeItem) item;
            cellBounds = treeItem.getBounds(event.index);
        } else if (item instanceof TableItem) {
            TableItem tableItem = (TableItem) item;
            cellBounds = tableItem.getBounds(event.index);
        }
        return cellBounds;
    }

    /**
     * @return the Display object
     */
    public static Display getDisplay() {
        Display display = Display.getCurrent();
        // may be null if outside the UI thread
        if (display == null)
            display = Display.getDefault();
        return display;
    }

    @Override
    public Image getToolTipImage(Object object) {
        // TODO Auto-generated method stub
        return super.getToolTipImage(object);
    }

    @Override
    public void update(ViewerCell cell) {
        Object element = cell.getElement();
        int index = cell.getColumnIndex();
        Color clr = columnAdvisor.getBgColor(element, index);
        if (clr != null)
            cell.setBackground(clr);
        else
            cell.setBackground(null);

        boolean enabled = columnAdvisor.isEnabled(element, index);

        switch (columnAdvisor.getCellControlType(element, index)) {
        case TEXT:
            cell.setImage(columnAdvisor.getImage(element, index));
        case SPIN:
        case MENU:
        case COMBO:
            cell.setText(columnAdvisor.getString(element, index));
            if (!enabled) {
                cell.setForeground(getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY));
            } else {
                cell.setForeground(null);
            }
            break;
        case URL:
            cell.setImage(columnAdvisor.getImage(element, index));
            cell.setText(columnAdvisor.getString(element, index));
            cell.setForeground(getDisplay().getSystemColor(SWT.COLOR_LINK_FOREGROUND));
            break;
        default:
            break;
        }
        super.update(cell);
    }

    @Override
    public String getToolTipText(Object element) {
        return columnAdvisor.getTooltipText(element, columnIndex);
    }
}