/******************************************************************************* * 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.core.resources.ResourcesPlugin; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Tree; import com.arm.cmsis.pack.CpPlugIn; import com.arm.cmsis.pack.DeviceVendor; import com.arm.cmsis.pack.ICpPackInstaller; import com.arm.cmsis.pack.ICpPackManager; import com.arm.cmsis.pack.common.CmsisConstants; import com.arm.cmsis.pack.data.ICpBoard; import com.arm.cmsis.pack.data.ICpExample; import com.arm.cmsis.pack.data.ICpItem; import com.arm.cmsis.pack.data.ICpPack.PackState; import com.arm.cmsis.pack.installer.ui.IHelpContextIds; import com.arm.cmsis.pack.installer.ui.Messages; import com.arm.cmsis.pack.rte.examples.IRteExampleItem; 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; import com.arm.cmsis.pack.utils.Utils; /** * Default implementation of the examples view in pack manager */ public class ExamplesView extends PackInstallerView { public static final String ID = "com.arm.cmsis.pack.installer.ui.views.ExamplesView"; //$NON-NLS-1$ Action fShowInstOnlyAction; IRteExampleItem getRteExampleItem(Object obj) { if (obj instanceof IRteExampleItem) { return (IRteExampleItem) obj; } return null; } class ExamplesViewColumnAdvisor extends ColumnAdvisor { public ExamplesViewColumnAdvisor(ColumnViewer columnViewer) { super(columnViewer); } @Override public CellControlType getCellControlType(Object obj, int columnIndex) { if (columnIndex == COLBUTTON) { return CellControlType.BUTTON; } return CellControlType.TEXT; } @Override public boolean isEnabled(Object obj, int columnIndex) { if (getCellControlType(obj, columnIndex) == CellControlType.BUTTON) { ICpPackInstaller packInstaller = getPackInstaller(); if(packInstaller == null) { return false; } IRteExampleItem example = getRteExampleItem(obj); if (example != null) { ICpExample e = example.getExample(); if (e == null || packInstaller.isProcessing(e.getPackId())) { return false; } return true; } } return false; } @Override public Image getImage(Object obj, int columnIndex) { if (getCellControlType(obj, columnIndex) == CellControlType.BUTTON) { switch (getString(obj, columnIndex)) { case CmsisConstants.BUTTON_COPY: IRteExampleItem item = getRteExampleItem(obj); if (item != null && item.getExample().isDeprecated()) { return CpPlugInUI.getImage(CpPlugInUI.ICON_RTE_WARNING); } return CpPlugInUI.getImage(CpPlugInUI.ICON_RTE); case CmsisConstants.BUTTON_INSTALL: return CpPlugInUI.getImage(CpPlugInUI.ICON_RTE_INSTALL); default : break; } } return null; } @Override public String getString(Object obj, int index) { if (getCellControlType(obj, index) == CellControlType.BUTTON) { IRteExampleItem item = getRteExampleItem(obj); if (item != null) { if (item.getExample().getPack().getPackState() == PackState.INSTALLED) { return CmsisConstants.BUTTON_COPY; } return CmsisConstants.BUTTON_INSTALL; } } return CmsisConstants.EMPTY_STRING; } @Override public String getTooltipText(Object obj, int columnIndex) { if (getCellControlType(obj, columnIndex) == CellControlType.BUTTON) { IRteExampleItem item = getRteExampleItem(obj); if (item != null) { if (item.getExample().getPack() .getPackState() != PackState.INSTALLED) { StringBuilder str = new StringBuilder( Messages.ExamplesView_CopyExampleInstallPack) .append(item.getExample().getPackId()); return str.toString(); } return constructExampleTooltipText(item.getExample()); } } return null; } @Override protected void handleMouseUp(MouseEvent e) { Point pt = new Point(e.x, e.y); ViewerCell cell = getViewer().getCell(pt); if (cell == null) { return; } int colIndex = cell.getColumnIndex(); Object element = cell.getElement(); if (getCellControlType(element, colIndex) != CellControlType.BUTTON || !isEnabled(element, colIndex) || !isButtonPressed(element, colIndex)) { return; } IRteExampleItem example = getRteExampleItem(element); if (example != null) { switch (getString(element, colIndex)) { case CmsisConstants.BUTTON_COPY : ICpExample cpExample = example.getExample(); copyExample(cpExample); Utils.clearReadOnly(ResourcesPlugin .getWorkspace().getRoot().getLocation() .append(Utils.extractBaseFileName( cpExample.getFolder())) .toFile(), CmsisConstants.EMPTY_STRING); break; case CmsisConstants.BUTTON_INSTALL : ICpPackInstaller packInstaller = getPackInstaller(); if(packInstaller != null) { packInstaller.installPack(example.getExample().getPackId()); } default : break; } } setButtonPressed(null, COLBUTTON, null); this.control.redraw(); } } /// end of ColumnAdviser void copyExample(ICpExample cpExample) { if(fViewController == null) { return; } fViewController.copyExample(cpExample); } String constructExampleTooltipText(ICpExample example) { ICpBoard b = example.getBoard(); String tooltip = CmsisConstants.EMPTY_STRING; if(b != null) { String line1 = NLS.bind(Messages.ExamplesView_Board, b.getName(), b.getVendor()); StringBuilder lb2 = new StringBuilder(Messages.ExamplesView_Device); for (ICpItem device : b.getMountedDevices()) { String vendorName = DeviceVendor .getOfficialVendorName(device.getVendor()); String deviceName = CmsisConstants.EMPTY_STRING; if (device.hasAttribute(CmsisConstants.DFAMILY)) { deviceName = device.getAttribute(CmsisConstants.DFAMILY); } else if (device.hasAttribute(CmsisConstants.DSUBFAMILY)) { deviceName = device.getAttribute(CmsisConstants.DSUBFAMILY); } else if (device.hasAttribute(CmsisConstants.DNAME)) { deviceName = device.getAttribute(CmsisConstants.DNAME); } else if (device.hasAttribute(CmsisConstants.DVARIANT)) { deviceName = device.getAttribute(CmsisConstants.DVARIANT); } if (!deviceName.isEmpty()) { lb2.append(deviceName).append(" (").append(vendorName) //$NON-NLS-1$ .append("), "); //$NON-NLS-1$ } } if (lb2.lastIndexOf(",") >= 0) { //$NON-NLS-1$ lb2.deleteCharAt(lb2.lastIndexOf(",")); //$NON-NLS-1$ } String line2 = lb2.append(System.lineSeparator()).toString(); tooltip = line1 + line2; } String line3 = NLS.bind(Messages.ExamplesView_Pack, example.getPackId()); String line4 = example.getDescription(); return tooltip + line3 + line4; } class ExampleTreeColumnComparator extends TreeColumnComparator { private final AlnumComparator alnumComparator; public ExampleTreeColumnComparator(TreeViewer viewer, ColumnAdvisor advisor) { super(viewer, advisor); alnumComparator = new AlnumComparator(false, false); } @Override public int compare(Viewer viewer, Object e1, Object e2) { Tree tree = treeViewer.getTree(); if (getColumnIndex() != 0) { return super.compare(viewer, e1, e2); } ICpExample cp1 = ((IRteExampleItem) e1).getExample(); ICpExample cp2 = ((IRteExampleItem) e2).getExample(); int result = alnumComparator.compare(cp1.getId(), cp2.getId()); return tree.getSortDirection() == SWT.DOWN ? -result : result; } } public ExamplesView() { } @Override public void createTreeColumns() { fTree.setInitialText(Messages.ExamplesView_SearchExample); // ------ Start Setting ALL Columns for the Examples View // ------ First Column TreeViewerColumn column0 = new TreeViewerColumn(fViewer, SWT.LEFT); column0.getColumn().setText(CmsisConstants.EXAMPLE_TITLE); column0.getColumn().setWidth(300); column0.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { ICpExample e = ((IRteExampleItem) element).getExample(); return e.getId(); } @Override public String getToolTipText(Object element) { ICpExample e = ((IRteExampleItem) element).getExample(); return constructExampleTooltipText(e); } }); // ------ Second Column TreeViewerColumn column1 = new TreeViewerColumn(fViewer, SWT.LEFT); column1.getColumn().setText(CmsisConstants.ACTION_TITLE); column1.getColumn().setWidth(90); ExamplesViewColumnAdvisor columnAdvisor = new ExamplesViewColumnAdvisor(fViewer); column1.setLabelProvider(new AdvisedCellLabelProvider(columnAdvisor, COLBUTTON)); // ------ Third Column TreeViewerColumn column2 = new TreeViewerColumn(fViewer, SWT.LEFT); column2.getColumn().setText(CmsisConstants.DESCRIPTION_TITLE); column2.getColumn().setWidth(400); column2.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object obj) { IRteExampleItem example = getRteExampleItem(obj); if (example != null) { return example.getExample().getDescription(); } return null; } }); // ------ End Setting ALL Columns for the Examples View fViewer.setContentProvider(new TreeObjectContentProvider()); fViewer.setComparator(new ExampleTreeColumnComparator(fViewer, columnAdvisor)); } @Override protected String getHelpContextId() { return IHelpContextIds.EXAMPLES_VIEW; } @Override protected boolean isExpandable() { return false; } @Override protected boolean hasManagerCommands() { return true; } @Override protected void refresh() { if (CpPlugIn.getDefault() == null) { return; } ICpPackManager packManager = CpPlugIn.getPackManager(); if (packManager != null) { fViewer.setInput(packManager.getExamples()); } else { fViewer.setInput(null); } } @Override protected void makeActions() { fShowInstOnlyAction = new Action( Messages.ExamplesView_OnlyShowInstalledPack, IAction.AS_CHECK_BOX) { @Override public void run() { fViewController.getFilter().setInstalledOnly(fShowInstOnlyAction.isChecked()); fViewer.setFilters(fViewFilters); fViewer.setSelection(null); if (fShowInstOnlyAction.isChecked()) { fShowInstOnlyAction.setImageDescriptor(CpPlugInUI .getImageDescriptor(CpPlugInUI.ICON_CHECKED)); } else { fShowInstOnlyAction.setImageDescriptor(CpPlugInUI .getImageDescriptor(CpPlugInUI.ICON_UNCHECKED)); } } }; fShowInstOnlyAction .setToolTipText(Messages.ExamplesView_OnlyShowInstalledPack); fShowInstOnlyAction.setImageDescriptor(CpPlugInUI.getImageDescriptor(CpPlugInUI.ICON_UNCHECKED)); fShowInstOnlyAction.setEnabled(true); super.makeActions(); } @Override protected void fillLocalPullDown(IMenuManager manager) { manager.add(fShowInstOnlyAction); manager.add(new Separator()); super.fillLocalPullDown(manager); } @Override protected void fillLocalToolBar(IToolBarManager manager) { ActionContributionItem aci = new ActionContributionItem(fShowInstOnlyAction); aci.setMode(ActionContributionItem.MODE_FORCE_TEXT); manager.add(aci); manager.add(new Separator()); super.fillLocalToolBar(manager); } }