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

Java tutorial

Introduction

Here is the source code for com.arm.cmsis.pack.ui.tree.ColumnAdvisor.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.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
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.Menu;
import org.eclipse.swt.widgets.MenuItem;

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

/**
 *Default implementation of IColumnAdvisor interface   
 */
public abstract class ColumnAdvisor implements IColumnAdvisor {

    protected ColumnViewer columnViewer;
    protected Control control;
    protected static final Cursor CURSOR_HAND = Display.getCurrent().getSystemCursor(SWT.CURSOR_HAND); // hand cursor for URL text

    /**
     * Constructs advisor for a viewer
     * @param columnViewer ColumnViewer on which the advisor is installed
     */
    public ColumnAdvisor(ColumnViewer columnViewer) {
        this.columnViewer = columnViewer;
        this.control = columnViewer.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);
            }
        });
        this.control.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseUp(MouseEvent e) {
                handleMouseUp(e);
            }
        });

    }

    /**
     * Handling mouse over event to display hand cursor in case cell contains an
     * URL
     * 
     * @param e mouse event
     */
    void handleMouseOver(MouseEvent e) {
        String url = getUrl(e.x, e.y);
        if (url != null && !url.isEmpty()) {
            if (this.control.getCursor() != CURSOR_HAND)
                this.control.setCursor(CURSOR_HAND);
        } else if (this.control.getCursor() == CURSOR_HAND) {
            this.control.setCursor(null);
        }
    }

    /**
     * Resets cursor 'hand'
     * @param e mouse event
     */
    void handleMouseExit(MouseEvent e) {
        String url = getUrl(e.x, e.y);
        if (url == null || url.isEmpty()) {
            if (this.control.getCursor() == CURSOR_HAND) {
                this.control.setCursor(null);
            }
        }
    }

    /**
     * Opens URL for an URL control
     * @param e mouse event
     */
    void handleMouseUp(MouseEvent e) {
        String url = getUrl(e.x, e.y);
        if (url != null && !url.isEmpty()) {
            openUrl(url);
        }
    }

    public String getUrl(int x, int y) {
        Point pt = new Point(x, y);
        ViewerCell cell = getViewer().getCell(pt);

        if (cell != null) {
            int colIndex = cell.getColumnIndex();
            Object element = cell.getElement();
            if (getCellControlType(element, colIndex) == CellControlType.URL) {
                Rectangle cellBounds = cell.getBounds();
                Image img = getImage(element, colIndex);
                if (img != null) {
                    cellBounds.x += img.getBounds().width;
                }
                if (cellBounds.contains(pt)) {
                    return getUrl(element, colIndex);
                }
            }
        }
        return null;
    }

    @Override
    public ColumnViewer getViewer() {
        return columnViewer;
    }

    @Override
    public CellControlType getCellControlType(Object obj, int columnIndex) {
        return CellControlType.TEXT;
    }

    @Override
    public boolean getCheck(Object obj, int columnIndex) {
        return false;
    }

    @Override
    public String getUrl(Object obj, int columnIndex) {
        return null;
    }

    @Override
    public void openUrl(String url) {
        OpenURL.open(url, this.control != null ? this.control.getShell() : null);
    }

    @Override
    public boolean isEnabled(Object obj, int columnIndex) {
        return true;
    }

    @Override
    public void setString(Object obj, int columnIndex, String newVal) {
    }

    @Override
    public void setCurrentSelectedIndex(Object obj, int columnIndex, int newVal) {

    }

    @Override
    public int getCurrentSelectedIndex(Object element, int columnIndex) {
        return -1;
    }

    @Override
    public int getMaxCount(Object obj, int columnIndex) {
        return 0;
    }

    @Override
    public String[] getStringArray(Object obj, int columnIndex) {
        return null;
    }

    @Override
    public String getDefaultString(Object obj, int columnIndex) {
        return null;
    }

    @Override
    public boolean isDefault(Object obj, int columnIndex) {
        return false;
    }

    @Override
    public boolean canEdit(Object obj, int columnIndex) {
        return false;
    }

    @Override
    public Image getImage(Object obj, int columnIndex) {
        return null;
    }

    @Override
    public Color getBgColor(Object obj, int columnIndex) {
        return null;
    }

    @Override
    public String getTooltipText(Object obj, int columnIndex) {
        return null;
    }

    @Override
    public void setCheck(Object element, int columnIndex, boolean newVal) {
    }

    @Override
    public Menu getMenu(Object obj, int columnIndex) {
        String[] strings = getStringArray(obj, columnIndex);
        String selectedString = getString(obj, columnIndex);
        String defaultString = getDefaultString(obj, columnIndex);
        boolean bDefault = defaultString != null && isDefault(obj, columnIndex);

        return createMenu(strings, selectedString, defaultString, bDefault);
    }

    /**
     * Creates menu 
     * @param parent parent control
     * @param strings collection of strings 
     * @param selectedString selected item
     * @param defaultString default item if any or null
     * @return Menu
     */
    protected Menu createMenu(String[] strings, String selectedString, String defaultString, boolean bDefault) {
        if (strings == null || strings.length == 0)
            return null;

        Menu menu = new Menu(this.control);
        // insert default value first
        if (defaultString != null) {
            MenuItem menuItem = new MenuItem(menu, SWT.RADIO);
            menuItem.setText(defaultString);
            menuItem.setSelection(bDefault);
            menuItem = new MenuItem(menu, SWT.SEPARATOR);
        }

        for (String s : strings) {
            MenuItem menuItem = new MenuItem(menu, SWT.RADIO);
            menuItem.setText(s);
            menuItem.setSelection(!bDefault && s.equals(selectedString));
        }
        return menu;
    }

}