com.arm.cmsis.pack.ui.widgets.RtePackSelectorWidget.java Source code

Java tutorial

Introduction

Here is the source code for com.arm.cmsis.pack.ui.widgets.RtePackSelectorWidget.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.widgets;

import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Tree;

import com.arm.cmsis.pack.CpStrings;
import com.arm.cmsis.pack.common.CmsisConstants;
import com.arm.cmsis.pack.enums.EVersionMatchMode;
import com.arm.cmsis.pack.events.RteEvent;
import com.arm.cmsis.pack.rte.IRteModelController;
import com.arm.cmsis.pack.rte.packs.IRtePack;
import com.arm.cmsis.pack.rte.packs.IRtePackFamily;
import com.arm.cmsis.pack.rte.packs.IRtePackItem;
import com.arm.cmsis.pack.rte.packs.RtePack;
import com.arm.cmsis.pack.ui.CpPlugInUI;
import com.arm.cmsis.pack.ui.CpStringsUI;
import com.arm.cmsis.pack.ui.tree.AdvisedCellLabelProvider;
import com.arm.cmsis.pack.ui.tree.AdvisedEditingSupport;
import com.arm.cmsis.pack.ui.tree.TreeObjectContentProvider;

/**
 * Tree widget to select pack versions 
 */
public class RtePackSelectorWidget extends RteWidget {
    protected final static String[] VERSION_MODES = new String[] { CpStrings.Latest, CpStrings.Fixed,
            CpStrings.Excluded };

    static final Color GREEN = new Color(Display.getCurrent(), CpPlugInUI.GREEN);
    static final Color YELLOW = new Color(Display.getCurrent(), CpPlugInUI.YELLOW);

    static final String[] PACK_ICONS = new String[] { CpPlugInUI.ICON_PACKAGE, CpPlugInUI.ICON_PACKAGE_EMPTY,
            CpPlugInUI.ICON_PACKAGE_GREY, CpPlugInUI.ICON_PACKAGE_RED, CpPlugInUI.ICON_PACKAGES,
            CpPlugInUI.ICON_PACKAGES_EMPTY, CpPlugInUI.ICON_PACKAGES_GREY, CpPlugInUI.ICON_PACKAGES_RED };
    public static final int ICON_INDEX_EMPTY = 1;
    public static final int ICON_INDEX_GREY = 2;
    public static final int ICON_INDEX_RED = 3;
    public static final int ICON_INDEX_PACKAGES = 4;

    TreeViewer viewer = null; // the Tree Viewer
    private static final int COLPACK = 0;
    private static final int COLSEL = 1;
    private static final int COLVERSION = 2;
    private static final int COLDESCR = 3;

    public RtePackSelectorWidget() {
    }

    public IRtePackItem getRtePackItem(Object obj) {
        if (obj instanceof IRtePackItem) {
            return (IRtePackItem) obj;
        }
        return null;
    }

    public IRtePackFamily getRtePackFamily(Object obj) {
        if (obj instanceof IRtePackFamily) {
            return (IRtePackFamily) obj;
        }
        return null;
    }

    public RtePack getRtePack(Object obj) {
        if (obj instanceof RtePack) {
            return (RtePack) obj;
        }
        return null;
    }

    public int getIconIndex(IRtePackItem item) {
        int index = 0;
        if (!item.isInstalled()) {
            if (item.isUsed())
                index = ICON_INDEX_RED;
            else
                index = ICON_INDEX_EMPTY;
        } else if (item.isExcluded()) {
            index = ICON_INDEX_GREY;
        }

        if (item instanceof IRtePackFamily)
            index += ICON_INDEX_PACKAGES;
        return index;
    };

    /**
     *    Content provider for RteValidateWidget tree 
     */
    public class RtePackProvider extends TreeObjectContentProvider {
        @Override
        public Object[] getElements(Object inputElement) {
            if (inputElement == getModelController()) {
                return getModelController().getRtePackCollection().getChildArray();
            }
            return super.getElements(inputElement);
        }
    }

    /** 
     * Column label provider for RtePackSelectorWidget 
     */
    public class RtePackSelectorColumnAdvisor extends RteColumnAdvisor {
        /**
         * Constructs advisor for a viewer
         * @param columnViewer ColumnViewer on which the advisor is installed
         */
        public RtePackSelectorColumnAdvisor(ColumnViewer columnViewer) {
            super(columnViewer);
        }

        @Override
        public CellControlType getCellControlType(Object obj, int columnIndex) {
            IRtePackItem item = getRtePackItem(obj);
            if (item == null)
                return CellControlType.NONE;
            IRtePackFamily packFamily = getRtePackFamily(obj);
            switch (columnIndex) {
            case COLSEL:
                if (packFamily != null)
                    return CellControlType.MENU;
                else
                    return CellControlType.CHECK;
            case COLDESCR:
                if (packFamily != null) {
                    String url = item.getUrl();
                    if (url != null && !url.isEmpty())
                        return CellControlType.URL;
                }
                break;
            case COLPACK:
            case COLVERSION:
            default:
                break;
            }

            return CellControlType.TEXT;
        }

        @Override
        public boolean getCheck(Object obj, int columnIndex) {
            if (getCellControlType(obj, columnIndex) == CellControlType.CHECK) {
                IRtePack pack = getRtePack(obj);
                boolean check = pack.isSelected();
                return check;
            }
            return false;
        }

        @Override
        public String getString(Object obj, int index) {
            IRtePackItem item = getRtePackItem(obj);
            if (item != null) {
                String id = item.getId();
                IRtePackFamily packFamily = getRtePackFamily(obj);
                switch (index) {
                case COLPACK: {
                    if (packFamily != null)
                        return id;
                    else
                        return item.getVersion();
                }
                case COLSEL:
                    if (packFamily != null) {
                        int i = getCurrentSelectedIndex(obj, index);
                        return VERSION_MODES[i];
                    }
                    break;
                case COLVERSION:
                    if (packFamily != null) {
                        return packFamily.getVersion();
                    }
                    break;
                case COLDESCR:
                    if (packFamily != null || !item.isInstalled())
                        return item.getDescription();
                default:
                    break;
                }
            }
            return CmsisConstants.EMPTY_STRING;
        }

        @Override
        public int getCurrentSelectedIndex(Object element, int columnIndex) {
            if (columnIndex == COLSEL) {
                IRtePackFamily packFamily = getRtePackFamily(element);
                if (packFamily != null) {
                    return packFamily.getVersionMatchMode().ordinal();
                }
            }
            return -1;
        }

        @Override
        public String[] getStringArray(Object obj, int columnIndex) {
            if (columnIndex == COLSEL) {
                IRtePackFamily packFamily = getRtePackFamily(obj);
                if (packFamily != null) {
                    return VERSION_MODES;
                }
            }
            return null;
        }

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

        @Override
        public boolean isEnabled(Object obj, int columnIndex) {
            if (columnIndex == COLSEL) {
                if (getModelController().getRtePackCollection().isUseAllLatestPacks())
                    return false;
                IRtePack pack = getRtePack(obj);
                if (pack != null) {
                    return pack.getVersionMatchMode() != EVersionMatchMode.LATEST;
                }
                return getRtePackFamily(obj) != null;
            }
            return true;
        }

        @Override
        public Image getImage(Object obj, int columnIndex) {
            IRtePackItem item = getRtePackItem(obj);
            if (item != null) {
                if (columnIndex == 0) {
                    int iconIndex = getIconIndex(item);
                    Image baseImage = CpPlugInUI.getImage(PACK_ICONS[iconIndex]);
                    return getOverlayImage(baseImage, obj, columnIndex);
                } else {
                    switch (columnIndex) {
                    case COLVERSION:
                        break;
                    default:
                        break;
                    }
                }
            }
            return null;
        }

        @Override
        public String getUrl(Object obj, int columnIndex) {
            if (columnIndex == COLDESCR) {
                IRtePackFamily item = getRtePackFamily(obj);
                if (item != null) {
                    return item.getUrl();
                }
            }
            return null;
        }

        private Image getOverlayImage(Image baseImage, Object obj, int columnIndex) {
            return baseImage;
        }

        @Override
        public String getTooltipText(Object obj, int columnIndex) {
            IRtePackItem item = getRtePackItem(obj);
            if (item == null)
                return null;

            switch (columnIndex) {
            case COLPACK:
                return item.getDescription();
            case COLVERSION:
                return null; // TODO
            case COLDESCR:
                String url = item.getUrl();
                if (url != null && !url.isEmpty())
                    return url;
                break;
            default:
                break;
            }
            return null;
        }

        @Override
        public void setCheck(Object element, int columnIndex, boolean newVal) {
            if (getCellControlType(element, columnIndex) == CellControlType.CHECK) {
                IRtePack pack = getRtePack(element);
                if (pack != null) {
                    fModelController.selectPack(pack, newVal);
                }
            }
        }

        @Override
        public void setString(Object obj, int columnIndex, String newVal) {
            if (columnIndex != COLSEL)
                return;
            IRtePackFamily packFamily = getRtePackFamily(obj);
            if (packFamily == null)
                return;
            EVersionMatchMode mode = EVersionMatchMode.fromString(newVal);
            packFamily.setVersionMatchMode(mode);
            fModelController.setVesrionMatchMode(packFamily, mode);
        }

        @Override
        public Color getBgColor(Object obj, int columnIndex) {
            if (columnIndex != COLSEL)
                return null;
            IRtePackItem item = getRtePackItem(obj);
            if (item != null && item.isUsed()) {
                Device device = Display.getCurrent();
                if (!item.isInstalled())
                    return device.getSystemColor(SWT.COLOR_RED);
                else if (!item.isSelected())
                    return YELLOW;
                return GREEN;
            }
            return null;
        }

    } /// end of ColumnAdviser

    @Override
    public Composite createControl(Composite parent) {
        Tree tree = new Tree(parent, SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
        tree.setHeaderVisible(true);
        viewer = new TreeViewer(tree);
        ColumnViewerToolTipSupport.enableFor(viewer);

        // Tree item name
        TreeViewerColumn column0 = new TreeViewerColumn(viewer, SWT.LEFT);
        tree.setLinesVisible(true);
        column0.getColumn().setAlignment(SWT.LEFT);
        column0.getColumn().setText(CpStrings.Pack);
        column0.getColumn().setWidth(180);
        fColumnAdvisor = new RtePackSelectorColumnAdvisor(viewer);
        column0.setEditingSupport(new AdvisedEditingSupport(viewer, fColumnAdvisor, COLPACK));
        AdvisedCellLabelProvider col0LabelProvider = new AdvisedCellLabelProvider(fColumnAdvisor, COLPACK);
        // workaround jface bug: first owner-draw column is not correctly painted when column is resized
        col0LabelProvider.setOwnerDrawEnabled(false);
        column0.setLabelProvider(col0LabelProvider);

        // Check/menu box for selection
        TreeViewerColumn column1 = new TreeViewerColumn(viewer, SWT.LEFT);
        tree.setLinesVisible(true);
        column1.getColumn().setAlignment(SWT.LEFT);
        column1.getColumn().setText(CpStrings.Selection);
        column1.getColumn().setWidth(100);
        column1.setEditingSupport(new AdvisedEditingSupport(viewer, fColumnAdvisor, COLSEL));
        column1.setLabelProvider(new AdvisedCellLabelProvider(fColumnAdvisor, COLSEL));

        // Version
        TreeViewerColumn column2 = new TreeViewerColumn(viewer, SWT.RIGHT);
        column2.getColumn().setAlignment(SWT.LEFT);
        column2.getColumn().setText(CpStringsUI.RteComponentTreeWidget_Version);
        column2.getColumn().setWidth(70);
        column2.setEditingSupport(new AdvisedEditingSupport(viewer, fColumnAdvisor, COLVERSION));
        column2.setLabelProvider(new AdvisedCellLabelProvider(fColumnAdvisor, COLVERSION));

        // Description/URL
        TreeViewerColumn column3 = new TreeViewerColumn(viewer, SWT.RIGHT);
        column3.getColumn().setAlignment(SWT.LEFT);
        column3.getColumn().setText(CpStringsUI.RteComponentTreeWidget_Description);
        column3.getColumn().setWidth(400);
        column3.setEditingSupport(new AdvisedEditingSupport(viewer, fColumnAdvisor, COLDESCR));
        column3.setLabelProvider(new AdvisedCellLabelProvider(fColumnAdvisor, COLDESCR));

        viewer.setContentProvider(new RtePackProvider());

        GridData gridData = new GridData();
        gridData.horizontalAlignment = SWT.FILL;
        gridData.verticalAlignment = SWT.FILL;
        gridData.grabExcessHorizontalSpace = true;
        gridData.grabExcessVerticalSpace = true;
        gridData.horizontalSpan = 2;
        tree.setLayoutData(gridData);

        //      hookContextMenu();
        return tree;
    }

    @Override
    public void setModelController(IRteModelController model) {
        super.setModelController(model);
        if (model != null) {
            viewer.setInput(fModelController);
        } else {
            viewer.setInput(null);
        }
        update();
    }

    @Override
    public void handle(RteEvent event) {
        // TODO Auto-generated method stub

    }

    @Override
    public void refresh() {
        viewer.refresh();
    }

    @Override
    public void update() {
        refresh();
    }

    @Override
    public Composite getFocusWidget() {
        return viewer.getTree();
    }

}