/******************************************************************************* * Copyright (c) 2004, 2010 BREDEX GmbH. * 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: * BREDEX GmbH - initial API and implementation and/or initial documentation *******************************************************************************/ package org.eclipse.jubula.client.ui.rcp.widgets; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.eclipse.jface.viewers.IColorProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jubula.client.core.model.IAbstractContainerPO; import org.eclipse.jubula.client.core.model.ICategoryPO; import org.eclipse.jubula.client.core.model.IConditionalStatementPO; import org.eclipse.jubula.client.core.model.IDoWhilePO; import org.eclipse.jubula.client.core.model.IIteratePO; import org.eclipse.jubula.client.core.model.INodePO; import org.eclipse.jubula.client.core.model.IReusedProjectPO; import org.eclipse.jubula.client.core.model.ISpecTestCasePO; import org.eclipse.jubula.client.core.model.IWhileDoPO; import org.eclipse.jubula.client.core.persistence.GeneralStorage; import org.eclipse.jubula.client.core.utils.DependencyFinderOp; import org.eclipse.jubula.client.core.utils.TreeTraverser; import org.eclipse.jubula.client.ui.constants.IconConstants; import org.eclipse.jubula.client.ui.filter.JBPatternFilter; import org.eclipse.jubula.client.ui.rcp.Plugin; import org.eclipse.jubula.client.ui.rcp.filter.JBFilteredTree; import org.eclipse.jubula.client.ui.rcp.provider.contentprovider.TestCaseTreeCompositeContentProvider; import org.eclipse.jubula.client.ui.rcp.provider.labelprovider.GeneralLabelProvider; import org.eclipse.jubula.client.ui.rcp.sorter.NodeNameViewerSorter; import org.eclipse.jubula.client.ui.utils.LayoutUtil; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.dialogs.FilteredTree; /** * @author Markus Tiede * @created Jul 20, 2011 */ public class TestCaseTreeComposite extends Composite { /** width hint = 300 */ private static final int WIDTH_HINT = 300; /** the local tree viewer */ private TreeViewer m_treeViewer; /** * <code>m_parentTestCase</code> */ private INodePO m_setOfParentTestCase; /** * <code>m_parentTestCases</code> */ private Set<INodePO> m_parentTestCases; /** a list with the item numbers of circular dependend test cases */ private Set < INodePO > m_circDependList = new HashSet < INodePO > (); /** * @param parent * the parent * @param treeStyle * the tree style to use * @param parentTestCases * the parent test cases */ public TestCaseTreeComposite(Composite parent, int treeStyle, Set<INodePO> parentTestCases) { this(parent, treeStyle); m_parentTestCases = parentTestCases; initTreeViewer(); } /** * @param parent * the parent * @param treeStyle * the tree style to use */ private TestCaseTreeComposite(Composite parent, int treeStyle) { super(parent, SWT.NONE); // use Gridlayout final GridLayout gridLayout = new GridLayout(); this.setLayout(gridLayout); GridData gridData = new GridData(); gridData.grabExcessHorizontalSpace = true; gridData.grabExcessVerticalSpace = true; gridData.horizontalAlignment = GridData.FILL; gridData.verticalAlignment = GridData.FILL; this.setLayoutData(gridData); final FilteredTree ft = new JBFilteredTree(this, treeStyle, new JBPatternFilter(), true); m_treeViewer = ft.getViewer(); GridData layoutData = new GridData(); layoutData.grabExcessHorizontalSpace = true; layoutData.grabExcessVerticalSpace = true; layoutData.horizontalAlignment = GridData.FILL; layoutData.verticalAlignment = GridData.FILL; layoutData.heightHint = WIDTH_HINT; LayoutUtil.addToolTipAndMaxWidth(layoutData, m_treeViewer.getControl()); m_treeViewer.getControl().setLayoutData(layoutData); } /** * @param parent * the parent * @param treeStyle * the tree style to use * @param parentTestCase * the parent test case */ public TestCaseTreeComposite(Composite parent, int treeStyle, INodePO parentTestCase) { this(parent, treeStyle); m_setOfParentTestCase = parentTestCase; initTreeViewer(); } /** * Initialization of the TreeViewer with data */ private void initTreeViewer() { m_treeViewer.setUseHashlookup(true); getInitialInput(); m_treeViewer.setLabelProvider(new LabelProvider()); m_treeViewer.setContentProvider( new TestCaseTreeCompositeContentProvider()); m_treeViewer.setInput(GeneralStorage.getInstance().getProject()); m_treeViewer.setSorter(new NodeNameViewerSorter()); } /** * gets a list of all test cases */ private void getInitialInput() { if (m_parentTestCases != null) { for (Iterator iterator = m_parentTestCases.iterator(); iterator.hasNext();) { ISpecTestCasePO type = (ISpecTestCasePO) iterator.next(); DependencyFinderOp op = new DependencyFinderOp(type); TreeTraverser traverser = new TreeTraverser(GeneralStorage. getInstance().getProject(), op, true); traverser.traverse(true); if (m_circDependList == null) { m_circDependList = op.getDependentNodes(); } else { m_circDependList.addAll(op.getDependentNodes()); } } } else if (m_setOfParentTestCase != null) { DependencyFinderOp op = new DependencyFinderOp(m_setOfParentTestCase); TreeTraverser traverser = new TreeTraverser(GeneralStorage. getInstance().getProject(), op, true); traverser.traverse(true); m_circDependList = op.getDependentNodes(); } } /** * @return the tree viewer */ public TreeViewer getTreeViewer() { return m_treeViewer; } /** * @return a flag indicating whether the selection is valid (e.g. no * category or a node which would cause recursive loops) */ public boolean hasValidSelection() { IStructuredSelection selection = (IStructuredSelection)getTreeViewer().getSelection(); for (Object selectedObj : selection.toArray()) { if (m_circDependList.contains(selectedObj) || selectedObj instanceof ICategoryPO || selectedObj instanceof IReusedProjectPO) { return false; } } return true; } /** * LabelProvider for m_treeViewer * * @author BREDEX GmbH * @created 14.06.2005 */ private class LabelProvider implements IColorProvider, ILabelProvider { /** * {@inheritDoc} */ public Image getImage(Object element) { if (element instanceof ISpecTestCasePO) { if (m_circDependList.contains(element)) { return Plugin.TC_DISABLED_IMAGE; } return IconConstants.TC_IMAGE; } if (element instanceof ICategoryPO || element instanceof IReusedProjectPO) { return IconConstants.CATEGORY_IMAGE; } if (element instanceof IConditionalStatementPO) { return IconConstants.CONDITION; } if (element instanceof IDoWhilePO) { return IconConstants.DO_WHILE; } if (element instanceof IWhileDoPO) { return IconConstants.DO_WHILE; } if (element instanceof IIteratePO) { return IconConstants.ITERATE; } if (element instanceof IAbstractContainerPO) { return IconConstants.CONTAINER; } return null; } /** * {@inheritDoc} */ public String getText(Object element) { return GeneralLabelProvider.getTextImpl(element); } /** * {@inheritDoc} */ public void addListener(ILabelProviderListener listener) { // do nothing } /** * {@inheritDoc} */ public void dispose() { // do nothing } /** * {@inheritDoc} */ public boolean isLabelProperty(Object element, String property) { // do nothing return false; } /** * {@inheritDoc} */ public void removeListener(ILabelProviderListener listener) { // do nothing } /** * {@inheritDoc} */ public Color getForeground(Object element) { if (element instanceof ISpecTestCasePO) { if (m_circDependList.contains(element)) { return LayoutUtil.GRAY_COLOR; } return LayoutUtil.DEFAULT_OS_COLOR; } if (element instanceof ICategoryPO || element instanceof IReusedProjectPO) { return LayoutUtil.GRAY_COLOR; } return null; } /** * {@inheritDoc} */ public Color getBackground(Object element) { return null; } } }