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

Java tutorial

Introduction

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

Source

/*******************************************************************************
* Copyright (c) 2014 ARM Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*    http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package com.arm.cmsis.pack.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.events.MouseEvent;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.MouseTrackAdapter;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.TreeItem;

import com.bora.logger.file.Log;
import com.arm.cmsis.pack.tree.IColumnAdvisor.CellControlType;
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 TEXTOFFSET = 4;
    private static final Cursor CURSOR_HAND = Display.getCurrent().getSystemCursor(SWT.CURSOR_HAND); // hand cursor for URL text
    private IColumnAdvisor columnAdvisor = null; // column advisor necessary
    // processing cell
    // attributes e.g. image,
    // check state
    private int columnIndex; // column index of this cell
    private Control control; // primary control of the tree viewer which is a
    // Tree

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

        Log.writeCurrentConstructor("AdvisedCellLabelProvider(IColumnAdvisor columnAdviser, int colIndex)");
    }

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

    @Override
    protected void paint(Event event, Object 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;
        default:
            super.paint(event, element); // draw only URL text
            break;
        }

        //Log.writeCurrentMethod(event, element);
    }

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

        this.control = viewer.getControl();
        this.control.addMouseTrackListener(new MouseTrackAdapter() {

            public void mouseEnter(MouseEvent e) {
                handleMouseOver(e);
            }

            public void mouseExit(MouseEvent e) {
                handleMouseExit(e);
            }
        });

        this.control.addMouseMoveListener(new MouseMoveListener() {
            public void mouseMove(MouseEvent e) {
                handleMouseOver(e);
            }
        });

        //Log.writeCurrentMethod(viewer, column);
    }

    /**
     * Handling mouse over event to display hand cursor in case cell contains an
     * URL
     * 
     * @param e mouse event
     */
    private void handleMouseOver(MouseEvent e) {
        Point pt = new Point(e.x, e.y);
        ViewerCell cell = getViewer().getCell(pt);
        boolean cursorSet = false;

        if (cell != null) {
            int colIndex = cell.getColumnIndex();
            Object element = cell.getElement();
            if (columnAdvisor.getCellControlType(element, colIndex) == CellControlType.URL) {
                if (columnAdvisor.getString(element, colIndex) != null) {
                    this.control.setCursor(CURSOR_HAND);
                    cursorSet = true;
                }
            }
        }

        if (!cursorSet) {
            handleMouseExit(e);
        }

        //Log.writeCurrentMethod(e);
    }

    /**
     * reset cursor 'hand'
     * 
     * @param e
     *            mouse event
     */
    private void handleMouseExit(MouseEvent e) {
        if (this.control.getCursor() == CURSOR_HAND) {
            this.control.setCursor(null);
        }

        //Log.writeCurrentMethod(e);
    }

    /**
     * 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);
        Image image = check ? CpPlugInUI.getImage(CpPlugInUI.ICON_CHECKED)
                : CpPlugInUI.getImage(CpPlugInUI.ICON_UNCHECKED);
        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);

        //Log.writeCurrentMethod(event, element);
    }

    /**
     * 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;
            Point extent = event.gc.textExtent(text);
            event.gc.drawLine(x - 1, y + extent.y, x + extent.x - 1, y + extent.y);
        }

        //Log.writeCurrentMethod(event, element);
    }

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

        //Log.writeCurrentMethod(event);

        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();

        //Log.writeCurrentMethod();

        return display;
    }

    @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);

        switch (columnAdvisor.getCellControlType(element, index)) {
        case TEXT:
            cell.setText(columnAdvisor.getString(element, index));
            cell.setImage(columnAdvisor.getImage(element, index));
            break;
        case COMBO:
            cell.setText(columnAdvisor.getString(element, index));
            break;
        case URL:
            cell.setText(columnAdvisor.getString(element, index));
            cell.setForeground(getDisplay().getSystemColor(SWT.COLOR_LINK_FOREGROUND));
            break;
        default:
            break;
        }
        super.update(cell);

        //Log.writeCurrentMethod(cell);

    }

    @Override
    public String getToolTipText(Object element) {

        //Log.writeCurrentMethod(element);

        return columnAdvisor.getTooltipText(element, columnIndex);

    }
}