com.arm.cmsis.pack.installer.ui.views.DevicesView.java Source code

Java tutorial

Introduction

Here is the source code for com.arm.cmsis.pack.installer.ui.views.DevicesView.java

Source

/*******************************************************************************
 * Copyright (c) 2016 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.installer.ui.views;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.dialogs.PatternFilter;
import org.eclipse.ui.part.ViewPart;

import com.arm.cmsis.pack.CpPlugIn;
import com.arm.cmsis.pack.ICpPackManager;
import com.arm.cmsis.pack.common.CmsisConstants;
import com.arm.cmsis.pack.data.ICpItem;
import com.arm.cmsis.pack.data.ICpPack.PackState;
import com.arm.cmsis.pack.enums.EDeviceHierarchyLevel;
import com.arm.cmsis.pack.events.IRteEventListener;
import com.arm.cmsis.pack.events.RteEvent;
import com.arm.cmsis.pack.info.CpDeviceInfo;
import com.arm.cmsis.pack.info.ICpDeviceInfo;
import com.arm.cmsis.pack.installer.ui.CpInstallerPlugInUI;
import com.arm.cmsis.pack.installer.ui.IHelpContextIds;
import com.arm.cmsis.pack.installer.ui.Messages;
import com.arm.cmsis.pack.item.CmsisMapItem;
import com.arm.cmsis.pack.item.ICmsisMapItem;
import com.arm.cmsis.pack.rte.devices.IRteDeviceItem;
import com.arm.cmsis.pack.ui.CpPlugInUI;
import com.arm.cmsis.pack.ui.tree.AdvisedCellLabelProvider;
import com.arm.cmsis.pack.ui.tree.ColumnAdvisor;
import com.arm.cmsis.pack.ui.tree.TreeObjectContentProvider;
import com.arm.cmsis.pack.utils.AlnumComparator;

public class DevicesView extends ViewPart implements IRteEventListener {

    public static final String ID = "com.arm.cmsis.pack.installer.ui.views.DevicesView"; //$NON-NLS-1$

    private static final int COLURL = 1;

    FilteredTree fTree;
    TreeViewer fViewer;
    //private DrillDownAdapter fDrillDownAdapter;
    private Action fExpandAction;
    private Action fExpandItemAction;
    private Action fCollapseAction;
    private Action fCollapseItemAction;
    private Action fRemoveSelection;
    private Action fHelpAction;
    Action fDoubleClickAction;

    private DevicesViewColumnAdvisor fColumnAdvisor;

    static IRteDeviceItem getDeviceTreeItem(Object obj) {
        if (obj instanceof IRteDeviceItem) {
            return (IRteDeviceItem) obj;
        }
        return null;
    }

    static ICpItem getCpItem(Object obj) {
        if (obj instanceof ICpItem) {
            return (ICpItem) obj;
        }
        return null;
    }

    static boolean stopAtCurrentLevel(IRteDeviceItem rteDeviceItem) {
        IRteDeviceItem firstChild = rteDeviceItem.getFirstChild();
        if (firstChild == null || firstChild.getLevel() == EDeviceHierarchyLevel.PROCESSOR.ordinal()) {
            return true;
        }
        return false;
    }

    static class DeviceViewContentProvider extends TreeObjectContentProvider {

        @Override
        public Object getParent(Object child) {
            IRteDeviceItem rteDeviceItem = getDeviceTreeItem(child);
            if (rteDeviceItem != null) {
                return rteDeviceItem.getParent();
            }
            return null;
        }

        @Override
        public Object[] getChildren(Object parent) {
            IRteDeviceItem rteDeviceItem = getDeviceTreeItem(parent);
            if (rteDeviceItem != null) {
                if (!rteDeviceItem.hasChildren() || stopAtCurrentLevel(rteDeviceItem)) {
                    return null;
                }
                return rteDeviceItem.getChildArray();
            }
            return super.getChildren(parent);
        }

        @Override
        public boolean hasChildren(Object parent) {
            IRteDeviceItem rteDeviceItem = getDeviceTreeItem(parent);
            if (rteDeviceItem != null) {
                if (stopAtCurrentLevel(rteDeviceItem)) {
                    return false;
                }
                return rteDeviceItem.hasChildren();
            }
            return super.hasChildren(parent);
        }
    }

    static class DevicesViewLabelProvider extends ColumnLabelProvider {

        @Override
        public String getText(Object obj) {
            IRteDeviceItem rteDeviceItem = getDeviceTreeItem(obj);
            if (rteDeviceItem != null) {
                // added spaces at last of text as a workaround to show the complete text in the views
                return removeColon(rteDeviceItem.getName()) + ' ';
            }
            return CmsisConstants.EMPTY_STRING;
        }

        private String removeColon(String string) {
            if (string.indexOf(':') != -1) {
                return string.substring(0, string.indexOf(':'));
            }
            return string;
        }

        @Override
        public Image getImage(Object obj) {
            IRteDeviceItem rteDeviceItem = getDeviceTreeItem(obj);
            if (rteDeviceItem != null) {
                if (rteDeviceItem.getLevel() == EDeviceHierarchyLevel.VENDOR.ordinal()) {
                    return CpPlugInUI.getImage(CpPlugInUI.ICON_COMPONENT);
                } else if (rteDeviceItem.hasChildren() && !stopAtCurrentLevel(rteDeviceItem)) {
                    return CpPlugInUI.getImage(CpPlugInUI.ICON_COMPONENT_CLASS);
                } else if (packInstalledAndContainsDevice(rteDeviceItem)) {
                    return CpPlugInUI.getImage(CpPlugInUI.ICON_DEVICE);
                } else {
                    return CpPlugInUI.getImage(CpPlugInUI.ICON_DEPRDEVICE);
                }
            }

            return null;
        }

        private boolean packInstalledAndContainsDevice(IRteDeviceItem rteDeviceItem) {
            IRteDeviceItem deviceItem;
            if (rteDeviceItem.getDevice() == null) {
                IRteDeviceItem parent = getClosestParentRteDeviceItem(rteDeviceItem);
                deviceItem = parent.findItem(rteDeviceItem.getName(), rteDeviceItem.getVendorName(), false);
                if (deviceItem == null) {
                    return false;
                }
            } else {
                deviceItem = rteDeviceItem;
            }
            return deviceItem.getDevice().getPack().getPackState() == PackState.INSTALLED
                    || deviceItem.getDevice().getPack().getPackState() == PackState.GENERATED;
        }

        @Override
        public String getToolTipText(Object obj) {
            IRteDeviceItem item = getDeviceTreeItem(obj);
            IRteDeviceItem parent = getClosestParentRteDeviceItem(item);
            IRteDeviceItem rteDeviceItem;
            if (parent == item) {
                rteDeviceItem = item;
            } else {
                rteDeviceItem = parent.findItem(item.getName(), item.getVendorName(), false);
            }
            if (rteDeviceItem != null && rteDeviceItem.getDevice() != null) {
                return NLS.bind(Messages.DevicesView_AvailableInPack, rteDeviceItem.getDevice().getPackId());
            }
            return null;
        }

        private IRteDeviceItem getClosestParentRteDeviceItem(IRteDeviceItem item) {
            IRteDeviceItem parent = item;
            while (parent != null && parent.getAllDeviceNames().isEmpty()) {
                parent = parent.getParent();
            }
            return parent;
        }
    }

    static class DevicesViewColumnAdvisor extends ColumnAdvisor {

        public DevicesViewColumnAdvisor(ColumnViewer columnViewer) {
            super(columnViewer);
        }

        @Override
        public CellControlType getCellControlType(Object obj, int columnIndex) {
            if (columnIndex == COLURL) {
                IRteDeviceItem item = getDeviceTreeItem(obj);
                if (item != null) {
                    if (item.getLevel() == EDeviceHierarchyLevel.VARIANT.ordinal()
                            || (item.getLevel() == EDeviceHierarchyLevel.DEVICE.ordinal()
                                    && stopAtCurrentLevel(item))) {
                        return CellControlType.URL;
                    }
                }
            }
            return CellControlType.TEXT;
        }

        @Override
        public String getString(Object obj, int columnIndex) {
            if (getCellControlType(obj, columnIndex) == CellControlType.URL) {
                IRteDeviceItem item = getDeviceTreeItem(obj);
                ICpDeviceInfo deviceInfo = new CpDeviceInfo(null, item);
                return deviceInfo.getSummary();
            } else if (columnIndex == COLURL) {
                IRteDeviceItem item = getDeviceTreeItem(obj);
                int nrofDevices = item.getAllDeviceNames().size();
                if (nrofDevices == 1) {
                    return Messages.DevicesView_1Device;
                } else if (nrofDevices == 0) {
                    return Messages.DevicesView_Processor;
                } else {
                    return nrofDevices + Messages.DevicesView_Devices;
                }
            }
            return null;
        }

        @Override
        public String getUrl(Object obj, int columnIndex) {
            if (getCellControlType(obj, columnIndex) == CellControlType.URL) {
                IRteDeviceItem item = getDeviceTreeItem(obj);
                return item.getUrl();
            }
            return null;
        }

        @Override
        public String getTooltipText(Object obj, int columnIndex) {
            if (getCellControlType(obj, columnIndex) == CellControlType.URL) {
                IRteDeviceItem item = getDeviceTreeItem(obj);
                return item.getUrl();
            }
            return null;
        }

    }

    class DeviceTreeColumnComparator extends TreeColumnComparator {

        private final AlnumComparator alnumComparator;

        public DeviceTreeColumnComparator(TreeViewer viewer, ColumnAdvisor advisor) {
            super(viewer, advisor);
            alnumComparator = new AlnumComparator(false, false);
        }

        @Override
        public int compare(Viewer viewer, Object e1, Object e2) {

            Tree tree = fViewer.getTree();
            int index = getColumnIndex();
            if (index != 0) {
                return super.compare(viewer, e1, e2);
            }

            int result = 0;
            ColumnLabelProvider colLabelProvider = (ColumnLabelProvider) treeViewer.getLabelProvider(index);
            String str1 = colLabelProvider.getText(e1);
            String str2 = colLabelProvider.getText(e2);
            result = alnumComparator.compare(str1, str2);

            return tree.getSortDirection() == SWT.DOWN ? -result : result;
        }
    }

    public DevicesView() {
    }

    @Override
    public void createPartControl(Composite parent) {

        PatternFilter filter = new PatternFilter() {
            @Override
            protected boolean isLeafMatch(final Viewer viewer, final Object element) {
                TreeViewer treeViewer = (TreeViewer) viewer;
                boolean isMatch = false;
                ColumnLabelProvider labelProvider = (ColumnLabelProvider) treeViewer.getLabelProvider(0);
                String labelText = labelProvider.getText(element);
                isMatch |= wordMatches(labelText);
                return isMatch;
            }
        };
        filter.setIncludeLeadingWildcard(true);
        fTree = new FilteredTree(parent, SWT.FULL_SELECTION | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL, filter,
                true);
        fTree.setInitialText(Messages.DevicesView_SearchDevice);
        fViewer = fTree.getViewer();
        fViewer.getTree().setLinesVisible(true);
        fViewer.getTree().setHeaderVisible(true);

        TreeViewerColumn column0 = new TreeViewerColumn(fViewer, SWT.LEFT);
        column0.getColumn().setText(CmsisConstants.DEVICE_TITLE);
        column0.getColumn().setWidth(200);
        column0.setLabelProvider(new DevicesViewLabelProvider());

        TreeViewerColumn column1 = new TreeViewerColumn(fViewer, SWT.LEFT);
        column1.getColumn().setText(CmsisConstants.SUMMARY_TITLE);
        column1.getColumn().setWidth(300);
        fColumnAdvisor = new DevicesViewColumnAdvisor(fViewer);
        column1.setLabelProvider(new AdvisedCellLabelProvider(fColumnAdvisor, COLURL));

        fViewer.setContentProvider(new DeviceViewContentProvider());
        fViewer.setComparator(new DeviceTreeColumnComparator(fViewer, fColumnAdvisor));
        fViewer.setAutoExpandLevel(2);
        refresh();

        ColumnViewerToolTipSupport.enableFor(fViewer);

        // Create the help context id for the viewer's control
        PlatformUI.getWorkbench().getHelpSystem().setHelp(fViewer.getControl(), IHelpContextIds.DEVICES_VIEW);

        getSite().setSelectionProvider(fViewer);

        makeActions();
        hookContextMenu();
        hookDoubleClickAction();
        contributeToActionBars();

        CpInstallerPlugInUI.registerViewPart(this);

        CpPlugIn.addRteListener(this);
    }

    protected void refresh() {
        if (CpPlugIn.getDefault() == null) {
            return;
        }
        ICpPackManager packManager = CpPlugIn.getPackManager();
        if (packManager != null) {
            ICmsisMapItem<IRteDeviceItem> root = new CmsisMapItem<>();
            IRteDeviceItem allDevices = packManager.getDevices();
            root.addChild(allDevices);
            if (!fViewer.getControl().isDisposed()) {
                fViewer.setInput(root);
            }
        } else {
            if (!fViewer.getControl().isDisposed()) {
                fViewer.setInput(null);
            }
        }
    }

    private void hookContextMenu() {
        MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            @Override
            public void menuAboutToShow(IMenuManager manager) {
                DevicesView.this.fillContextMenu(manager);
            }
        });
        Menu menu = menuMgr.createContextMenu(fViewer.getControl());
        fViewer.getControl().setMenu(menu);
        getSite().registerContextMenu(menuMgr, fViewer);
    }

    private void contributeToActionBars() {
        IActionBars bars = getViewSite().getActionBars();
        fillLocalPullDown(bars.getMenuManager());
        fillLocalToolBar(bars.getToolBarManager());
    }

    private void fillLocalPullDown(IMenuManager manager) {
        manager.add(fExpandAction);
        manager.add(fCollapseAction);
        manager.add(fHelpAction);
        manager.add(new Separator());
        manager.add(fRemoveSelection);
    }

    void fillContextMenu(IMenuManager manager) {
        if (fViewer.getSelection() == null || fViewer.getSelection().isEmpty()) {
            manager.add(fExpandAction);
            manager.add(fCollapseAction);
        } else {
            manager.add(fExpandItemAction);
            manager.add(fCollapseItemAction);
        }
        manager.add(new Separator());
        manager.add(fRemoveSelection);
        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
    }

    private void fillLocalToolBar(IToolBarManager manager) {
        manager.add(fExpandAction);
        manager.add(fCollapseAction);
        manager.add(fHelpAction);
        manager.add(new Separator());
        manager.add(fRemoveSelection);
    }

    private void makeActions() {

        fRemoveSelection = new Action() {

            @Override
            public void run() {
                // Empty search text and selection
                fViewer.setSelection(null);
                fTree.getFilterControl().setText(CmsisConstants.EMPTY_STRING);
            }
        };

        fRemoveSelection.setText(Messages.DevicesView_RemoveSelection);
        fRemoveSelection.setImageDescriptor(CpPlugInUI.getImageDescriptor(CpPlugInUI.ICON_REMOVE_ALL));
        fRemoveSelection.setToolTipText(Messages.DevicesView_RemoveSelection);

        fExpandAction = new Action() {
            @Override
            public void run() {
                if (fViewer == null) {
                    return;
                }
                fViewer.expandAll();
            }
        };
        fExpandAction.setText(Messages.ExpandAll);
        fExpandAction.setToolTipText(Messages.ExpandAllNodes);
        fExpandAction.setImageDescriptor(CpPlugInUI.getImageDescriptor(CpPlugInUI.ICON_EXPAND_ALL));

        fExpandItemAction = new Action() {
            @Override
            public void run() {
                if (fViewer == null) {
                    return;
                }
                ISelection selection = fViewer.getSelection();
                if (selection == null) {
                    return;
                }
                Object obj = ((IStructuredSelection) selection).getFirstElement();
                fViewer.expandToLevel(obj, AbstractTreeViewer.ALL_LEVELS);
            }
        };
        fExpandItemAction.setText(Messages.ExpandSelected);
        fExpandItemAction.setToolTipText(Messages.ExpandSelectedNode);
        fExpandItemAction.setImageDescriptor(CpPlugInUI.getImageDescriptor(CpPlugInUI.ICON_EXPAND_ALL));

        fCollapseAction = new Action() {
            @Override
            public void run() {
                if (fViewer == null) {
                    return;
                }
                fViewer.collapseAll();
            }
        };
        fCollapseAction.setText(Messages.CollapseAll);
        fCollapseAction.setToolTipText(Messages.CollapseAllNodes);
        fCollapseAction.setImageDescriptor(CpPlugInUI.getImageDescriptor(CpPlugInUI.ICON_COLLAPSE_ALL));

        fCollapseItemAction = new Action() {
            @Override
            public void run() {
                if (fViewer == null) {
                    return;
                }
                ISelection selection = fViewer.getSelection();
                if (selection == null) {
                    return;
                }
                Object obj = ((IStructuredSelection) selection).getFirstElement();
                fViewer.collapseToLevel(obj, AbstractTreeViewer.ALL_LEVELS);
            }
        };
        fCollapseItemAction.setText(Messages.CollapseSelected);
        fCollapseItemAction.setToolTipText(Messages.CollapseSelectedNode);
        fCollapseItemAction.setImageDescriptor(CpPlugInUI.getImageDescriptor(CpPlugInUI.ICON_COLLAPSE_ALL));

        fHelpAction = new Action(Messages.Help, IAction.AS_PUSH_BUTTON) {
            @Override
            public void run() {
                fViewer.getControl().notifyListeners(SWT.Help, new Event());
            }
        };
        fHelpAction.setToolTipText(Messages.DevicesView_HelpForDevicesView);
        fHelpAction.setImageDescriptor(CpPlugInUI.getImageDescriptor(CpPlugInUI.ICON_HELP));

        fDoubleClickAction = new Action() {
            @Override
            public void run() {
                ISelection selection = fViewer.getSelection();
                Object obj = ((IStructuredSelection) selection).getFirstElement();
                if (fViewer.getExpandedState(obj)) {
                    fViewer.collapseToLevel(obj, AbstractTreeViewer.ALL_LEVELS);
                } else if (fViewer.isExpandable(obj)) {
                    fViewer.expandToLevel(obj, 1);
                }
            }
        };
    }

    private void hookDoubleClickAction() {
        fViewer.addDoubleClickListener(new IDoubleClickListener() {
            @Override
            public void doubleClick(DoubleClickEvent event) {
                fDoubleClickAction.run();
            }
        });
    }

    public Composite getComposite() {
        return fTree;
    }

    @Override
    public void setFocus() {
        fViewer.getControl().setFocus();
    }

    @Override
    public void handle(RteEvent event) {
        switch (event.getTopic()) {
        case RteEvent.PACKS_RELOADED:
            Display.getDefault().asyncExec(new Runnable() {
                @Override
                public void run() {
                    refresh();
                }
            });
            break;
        case RteEvent.PACK_INSTALL_JOB_FINISHED:
        case RteEvent.PACK_UNPACK_JOB_FINISHED:
        case RteEvent.PACK_REMOVE_JOB_FINISHED:
        case RteEvent.PACK_DELETE_JOB_FINISHED:
            Display.getDefault().asyncExec(new Runnable() {
                @Override
                public void run() {
                    fViewer.refresh();
                }
            });
            break;
        default:
            return;
        }
    }

    @Override
    public void dispose() {
        if (CpPlugIn.getDefault() != null) {
            CpPlugIn.removeRteListener(this);
        }
        super.dispose();
    }

}