/*******************************************************************************
* 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 java.util.Collection;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.swt.SWT;
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.common.CmsisConstants;
import com.arm.cmsis.pack.enums.EEvaluationResult;
import com.arm.cmsis.pack.events.RteEvent;
import com.arm.cmsis.pack.generic.ITreeObject;
import com.arm.cmsis.pack.info.ICpComponentInfo;
import com.arm.cmsis.pack.rte.IRteModelController;
import com.arm.cmsis.pack.rte.components.IRteComponent;
import com.arm.cmsis.pack.rte.components.IRteComponentItem;
import com.arm.cmsis.pack.rte.dependencies.IRteDependencyItem;
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;
public class RteValidateWidget extends RteWidget {
TreeViewer fViewer = null;
/** Column label provider for RteComponentTreeWidget
*
*/
IRteDependencyItem getDependencyItem(Object element){
if(element instanceof IRteDependencyItem) {
return (IRteDependencyItem)element;
}
return null;
}
/**
* Set current configuration for this component tree widget
* @param configuration A RTE configuration that contains RTE component
*/
@Override
public void setModelController(IRteModelController model) {
super.setModelController(model);
if (fViewer != null) {
fViewer.setInput(model);
refresh();
}
}
public class RteValidateColumnAdvisor extends RteColumnAdvisor {
/**
* Constructs advisor for a viewer
* @param columnViewer ColumnViewer on which the advisor is installed
*/
public RteValidateColumnAdvisor(ColumnViewer columnViewer) {
super(columnViewer);
}
@Override
public String getString(Object obj, int index) {
IRteDependencyItem item = getDependencyItem(obj);
if(item != null) {
switch(index) {
case 0 : return item.getName();
case 1 : return item.getDescription();
default:
break;
}
}
return CmsisConstants.EMPTY_STRING;
}
@Override
public Image getImage(Object obj, int columnIndex) {
if(columnIndex == 0) {
IRteDependencyItem item = getDependencyItem(obj);
if(item != null) {
if(item.isMaster()) {
EEvaluationResult res = item.getEvaluationResult();
switch(res) {
case IGNORED:
case UNDEFINED:
case FULFILLED:
break;
case CONFLICT:
case ERROR:
case FAILED:
case INCOMPATIBLE:
case INCOMPATIBLE_API:
case INCOMPATIBLE_BUNDLE:
case INCOMPATIBLE_VARIANT:
case INCOMPATIBLE_VENDOR:
case INCOMPATIBLE_VERSION:
case MISSING:
case MISSING_API:
case MISSING_BUNDLE:
case MISSING_VARIANT:
case MISSING_VENDOR:
case MISSING_VERSION:
case MISSING_GPDSC:
case UNAVAILABLE:
case UNAVAILABLE_PACK:
return CpPlugInUI.getImage(CpPlugInUI.ICON_ERROR);
case INACTIVE:
case INSTALLED:
case SELECTABLE:
return CpPlugInUI.getImage(CpPlugInUI.ICON_WARNING);
default:
break;
}
return null;
} else if( item.getComponentItem() != null) {
IRteComponent component = item.getComponentItem().getParentComponent();
if(component != null) {
ICpComponentInfo ci = component.getActiveCpComponentInfo();
int instances = component.getMaxInstanceCount();
if(ci != null && ci.getComponent() == null) {
if(instances > 1) {
return CpPlugInUI.getImage(CpPlugInUI.ICON_MULTICOMPONENT_ERROR);
}
return CpPlugInUI.getImage(CpPlugInUI.ICON_COMPONENT_ERROR);
}
if(instances > 1) {
return CpPlugInUI.getImage(CpPlugInUI.ICON_MULTICOMPONENT);
}
return CpPlugInUI.getImage(CpPlugInUI.ICON_COMPONENT);
}
}
}
}
return null;
}
}
/**
* Content provider for RteValidateWidget tree
*/
public class RteValidateContentProvider extends TreeObjectContentProvider {
@Override
public Object[] getElements(Object inputElement) {
if(inputElement == getModelController()) {
Collection<? extends IRteDependencyItem> depItems = getModelController().getDependencyItems();
if(depItems != null) {
return depItems.toArray();
}
return ITreeObject.EMPTY_OBJECT_ARRAY;
}
return getChildren(inputElement);
}
}
@Override
public Composite createControl(Composite parent) {
Tree tree = new Tree(parent, SWT.FULL_SELECTION | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL|SWT.BORDER);
tree.setHeaderVisible(true);
fViewer = new TreeViewer(tree);
ColumnViewerToolTipSupport.enableFor(fViewer);
fColumnAdvisor = new RteValidateColumnAdvisor(fViewer);
TreeViewerColumn column0 = new TreeViewerColumn(fViewer, SWT.LEFT);
tree.setLinesVisible(true);
column0.getColumn().setText(CpStringsUI.RteValidateWidget_ValidationOutput);
column0.getColumn().setWidth(400);
column0.setEditingSupport(new AdvisedEditingSupport(fViewer, fColumnAdvisor, 0));
fViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
handleTreeSelectionChanged(event);
}
});
AdvisedCellLabelProvider col0LabelProvider = new AdvisedCellLabelProvider(fColumnAdvisor, 0);
// workaround jface bug: first owner-draw column is not correctly painted when column is resized
col0LabelProvider.setOwnerDrawEnabled(false);
column0.setLabelProvider(col0LabelProvider);
TreeViewerColumn column1 = new TreeViewerColumn(fViewer, SWT.LEFT);
column1.getColumn().setText(CpStringsUI.RteValidateWidget_Description);
column1.getColumn().setWidth(500);
column1.setEditingSupport(new AdvisedEditingSupport(fViewer, fColumnAdvisor, 1));
column1.setLabelProvider(new AdvisedCellLabelProvider(fColumnAdvisor, 1));
RteValidateContentProvider validateProvider = new RteValidateContentProvider();
fViewer.setContentProvider(validateProvider);
GridData gridData = new GridData();
gridData.horizontalAlignment = SWT.FILL;
gridData.verticalAlignment = SWT.FILL;
gridData.grabExcessHorizontalSpace = true;
gridData.grabExcessVerticalSpace = true;
tree.setLayoutData(gridData);
if (getModelController() != null) {
fViewer.setInput(getModelController());
}
return tree;
}
private IRteDependencyItem getSelectedDependencyItem() {
IStructuredSelection sel= (IStructuredSelection)fViewer.getSelection();
if(sel.size() == 1) {
Object o = sel.getFirstElement();
if(o instanceof IRteDependencyItem ){
return (IRteDependencyItem)o;
}
}
return null;
}
/**
* @param event
*/
protected void handleTreeSelectionChanged(SelectionChangedEvent event) {
if(getModelController() == null) {
return;
}
IRteDependencyItem d = getSelectedDependencyItem();
if(d == null) {
return;
}
IRteComponentItem item = d.getComponentItem();
if(item != null) {
getModelController().emitRteEvent(RteEvent.COMPONENT_SHOW, item);
}
}
@Override
public void handle(RteEvent event) {
switch(event.getTopic()) {
case RteEvent.COMPONENT_SELECTION_MODIFIED:
update();
return;
}
super.handle(event);
}
@Override
public void refresh() {
if(fViewer != null) {
fViewer.refresh();
}
}
@Override
public void update() {
refresh();
if(fViewer != null) {
fViewer.expandAll();
}
}
/**
* Updates widget asynchronously, must run in GUI thread
*/
protected void asyncUpdate() {
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
update();
}
});
}
@Override
public Composite getFocusWidget() {
return fViewer.getTree();
}
}