/* * This file is part of Web-CAT Eclipse Plugins. * * Web-CAT is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Web-CAT is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Web-CAT; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package net.sf.webcat.eclipse.cxxtest.wizards; import java.util.Vector; import net.sf.webcat.eclipse.cxxtest.wizards.i18n.Messages; import net.sf.webcat.eclipse.cxxtest.wizards.ui.SWTUtil; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.IFunctionDeclaration; import org.eclipse.cdt.core.model.IMethodDeclaration; import org.eclipse.cdt.core.model.INamespace; import org.eclipse.cdt.core.model.IParent; import org.eclipse.cdt.core.model.IStructure; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility; import org.eclipse.cdt.ui.CElementLabelProvider; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IPath; import org.eclipse.jface.viewers.AbstractTreeViewer; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer; public class NewCxxTestSuiteWizardPageTwo extends WizardPage { private static final String PAGE_NAME = "NewCxxTestSuiteWizardPageTwo"; //$NON-NLS-1$ private static final String PAGE_TITLE = Messages.NewCxxTestSuiteWizardPageTwo_PageTitle; private static final String PAGE_DESCRIPTION = Messages.NewCxxTestSuiteWizardPageTwo_PageDescription; private ContainerCheckedTreeViewer functionsTree; private Button selectAllButton; private Button deselectAllButton; private Label selectedFunctionsLabel; private IPath headerUnderTestPath; private Object[] checkedObjects; public NewCxxTestSuiteWizardPageTwo() { super(PAGE_NAME); setTitle(PAGE_TITLE); setDescription(PAGE_DESCRIPTION); } public ICElement getSelectedElement(IStructuredSelection selection) { ICElement element = null; if(selection != null && !selection.isEmpty()) { Object selElem = selection.getFirstElement(); if(selElem instanceof IAdaptable) { IAdaptable adaptable = (IAdaptable)selElem; element = (ICElement)adaptable.getAdapter(ICElement.class); if(element == null) { IResource resource = (IResource)adaptable.getAdapter(IResource.class); if(resource != null && resource.getType() != IResource.ROOT) { while(element == null && resource.getType() != IResource.PROJECT) { resource = resource.getParent(); element = (ICElement)resource.getAdapter(ICElement.class); } if(element == null) { element = CoreModel.getDefault().create(resource); } } } } } return element; } public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 2; container.setLayout(layout); createFunctionsTreeControls(container); setControl(container); } private void createFunctionsTreeControls(Composite container) { Label label= new Label(container, SWT.LEFT | SWT.WRAP); label.setFont(container.getFont()); label.setText(Messages.NewCxxTestSuiteWizardPageTwo_AvailableFunctions); GridData gd = new GridData(); gd.horizontalSpan = 2; label.setLayoutData(gd); functionsTree = new ContainerCheckedTreeViewer(container, SWT.BORDER); gd = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL); gd.heightHint = 180; functionsTree.getTree().setLayoutData(gd); functionsTree.setLabelProvider(new CustomCElementLabelProvider()); functionsTree.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS); functionsTree.addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { doCheckedStateChanged(); } }); Composite buttonContainer = new Composite(container, SWT.NONE); gd = new GridData(GridData.FILL_VERTICAL); buttonContainer.setLayoutData(gd); GridLayout buttonLayout = new GridLayout(); buttonLayout.marginWidth = 0; buttonLayout.marginHeight = 0; buttonContainer.setLayout(buttonLayout); selectAllButton = new Button(buttonContainer, SWT.PUSH); selectAllButton.setText(Messages.NewCxxTestSuiteWizardPageTwo_SelectAll); gd= new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING); selectAllButton.setLayoutData(gd); selectAllButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { functionsTree.setCheckedElements((Object[]) functionsTree.getInput()); doCheckedStateChanged(); } }); SWTUtil.setButtonDimensionHint(selectAllButton); deselectAllButton = new Button(buttonContainer, SWT.PUSH); deselectAllButton.setText(Messages.NewCxxTestSuiteWizardPageTwo_DeselectAll); gd= new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING); deselectAllButton.setLayoutData(gd); deselectAllButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { functionsTree.setCheckedElements(new Object[0]); doCheckedStateChanged(); } }); SWTUtil.setButtonDimensionHint(deselectAllButton); /* No of selected functions label */ selectedFunctionsLabel = new Label(container, SWT.LEFT); selectedFunctionsLabel.setFont(container.getFont()); doCheckedStateChanged(); gd= new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 1; selectedFunctionsLabel.setLayoutData(gd); Label emptyLabel = new Label(container, SWT.LEFT); gd= new GridData(); gd.horizontalSpan = 1; emptyLabel.setLayoutData(gd); } public void setVisible(boolean visible) { super.setVisible(visible); if (visible) { if(headerUnderTestPath == null) return; ITranslationUnit unit = null; try { ICElement element = CoreModel.getDefault().create(headerUnderTestPath); if(element instanceof ITranslationUnit) { unit = (ITranslationUnit)element; } } catch(Exception e) { e.printStackTrace(); } functionsTree.setContentProvider(new FunctionsTreeContentProvider()); functionsTree.setInput(new Object[] { unit }); doCheckedStateChanged(); functionsTree.getControl().setFocus(); } else { //saveWidgetValues(); } } public void setHeaderUnderTestPath(IPath path) { headerUnderTestPath = path; } private void doCheckedStateChanged() { Object[] checked = functionsTree.getCheckedElements(); checkedObjects = checked; int checkedFunctionCount= 0; for(int i= 0; i < checked.length; i++) { if(checked[i] instanceof IFunctionDeclaration) checkedFunctionCount++; } String label = Integer.toString(checkedFunctionCount); if(checkedFunctionCount == 1) label += Messages.NewCxxTestSuiteWizardPageTwo_FunctionSelectedSingular; else label += Messages.NewCxxTestSuiteWizardPageTwo_FunctionSelectedPlural; selectedFunctionsLabel.setText(label); } public IFunctionDeclaration[] getCheckedFunctions() { int functionCount= 0; for(int i = 0; i < checkedObjects.length; i++) { if(checkedObjects[i] instanceof IFunctionDeclaration) functionCount++; } IFunctionDeclaration[] checkedFunctions= new IFunctionDeclaration[functionCount]; int j = 0; for(int i = 0; i < checkedObjects.length; i++) { if(checkedObjects[i] instanceof IFunctionDeclaration) { checkedFunctions[j]= (IFunctionDeclaration)checkedObjects[i]; j++; } } return checkedFunctions; } private static class CustomCElementLabelProvider extends CElementLabelProvider { public String getText(Object element) { if(element instanceof ITranslationUnit) { return Messages.NewCxxTestSuiteWizardPageTwo_GlobalScope; } else { return super.getText(element); } } } private static class FunctionsTreeContentProvider implements ITreeContentProvider { private Object[] elements = new Object[0]; private final Object[] fEmpty = new Object[0]; public FunctionsTreeContentProvider() { } private ICElement[] getChildrenOfElement(IParent element) { Vector<ICElement> vec = new Vector<ICElement>(); try { ICElement[] children = element.getChildren(); for(int i = 0; i < children.length; i++) { ICElement child = children[i]; if(child instanceof INamespace || child instanceof IStructure) { vec.add(child); } else if(child instanceof IMethodDeclaration) { IMethodDeclaration method = (IMethodDeclaration)child; if (!method.isDestructor() && method.getVisibility() == ASTAccessVisibility.PUBLIC) { vec.add(method); } } else if(child instanceof IFunctionDeclaration) { vec.add(child); } } } catch(CModelException e) { e.printStackTrace(); } return vec.toArray(new ICElement[vec.size()]); } /* * @see ITreeContentProvider#getChildren(Object) */ public Object[] getChildren(Object parentElement) { if(parentElement instanceof IParent) return getChildrenOfElement((IParent)parentElement); else return fEmpty; } /* * @see ITreeContentProvider#getParent(Object) */ public Object getParent(Object element) { if(element instanceof ITranslationUnit) return null; else if(element instanceof ICElement) return ((ICElement)element).getParent(); else return null; } /* * @see ITreeContentProvider#hasChildren(Object) */ public boolean hasChildren(Object element) { return getChildren(element).length > 0; } /* * @see IStructuredContentProvider#getElements(Object) */ public Object[] getElements(Object inputElement) { return elements; } /* * @see IContentProvider#dispose() */ public void dispose() { } /* * @see IContentProvider#inputChanged(Viewer, Object, Object) */ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { this.elements = (Object[])newInput; } } }