/* * 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 net.sf.webcat.eclipse.cxxtest.wizards.dialogs.TranslationUnitSelectionDialog; import net.sf.webcat.eclipse.cxxtest.wizards.i18n.Messages; import net.sf.webcat.eclipse.cxxtest.wizards.ui.SWTUtil; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ISourceRoot; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.internal.ui.wizards.SourceFolderSelectionDialog; import org.eclipse.cdt.internal.ui.wizards.classwizard.NewClassWizardUtil; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; 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.swt.widgets.Text; @SuppressWarnings("restriction") public class NewCxxTestSuiteWizardPageOne extends WizardPage { private static final String PAGE_NAME = "NewCxxTestSuiteWizardPageOne"; //$NON-NLS-1$ private static final String PAGE_TITLE = Messages.NewCxxTestSuiteWizardPageOne_PageTitle; private static final String PAGE_DESCRIPTION = Messages.NewCxxTestSuiteWizardPageOne_PageDescription; private IPath sourceFolder; private IPath headerUnderTest; private String suiteName; private String superClass; private boolean createSetUp; private boolean createTearDown; private Text sourceFolderField; private Text suiteNameField; private Text superClassField; private Text headerUnderTestField; private Button setUpButton; private Button tearDownButton; private NewCxxTestSuiteWizardPageTwo pageTwo; public NewCxxTestSuiteWizardPageOne(NewCxxTestSuiteWizardPageTwo pageTwo) { super(PAGE_NAME); this.pageTwo = pageTwo; sourceFolder = Path.EMPTY; headerUnderTest = Path.EMPTY; setTitle(PAGE_TITLE); setDescription(PAGE_DESCRIPTION); } public void init(IStructuredSelection selection) { ICElement element = getSelectedElement(selection); if(element != null) { ICProject cproject = element.getCProject(); IPath projectPath = cproject.getProject().getFullPath(); sourceFolder = projectPath.makeRelative(); ICElement tuElement = element.getAncestor(ICElement.C_UNIT); if(tuElement != null) { ITranslationUnit unit = (ITranslationUnit)tuElement; headerUnderTest = unit.getResource().getFullPath().makeRelative(); } } } 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 composite = new Composite(parent, SWT.NONE); int numColumns = 4; GridLayout layout = new GridLayout(); layout.numColumns = numColumns; composite.setLayout(layout); createContainerControls(composite, numColumns); createSeparator(composite, numColumns); createTypeNameControls(composite, numColumns); createSuperClassControls(composite, numColumns); createMethodStubSelectionControls(composite, numColumns); setSuperClass("CxxTest::TestSuite"); //$NON-NLS-1$ createSeparator(composite, numColumns); createHeaderUnderTestControls(composite, numColumns); setControl(composite); } private void createSeparator(Composite composite, int numColumns) { Label sep = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL); GridData gd = new GridData(SWT.FILL, SWT.NONE, true, false); gd.horizontalSpan = numColumns; sep.setLayoutData(gd); } private void createContainerControls(Composite composite, int numColumns) { Label label = new Label(composite, SWT.NONE); label.setText(Messages.NewCxxTestSuiteWizardPageOne_SourceFolder); label.setLayoutData(gridDataForLabel(1)); sourceFolderField = new Text(composite, SWT.SINGLE | SWT.BORDER); sourceFolderField.setLayoutData(gridDataForText(2)); sourceFolderField.setText(sourceFolder.toString()); sourceFolderField.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { checkForErrors(); } }); Button browseButton = new Button(composite, SWT.NONE); browseButton.setText(Messages.NewCxxTestSuiteWizardPageOne_Browse); browseButton.setLayoutData(gridDataForButton(browseButton, 1)); browseButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { selectSourceFolder(); } }); } private void selectSourceFolder() { IPath oldFolderPath = sourceFolder; IPath newFolderPath = chooseSourceFolder(oldFolderPath); if (newFolderPath != null) { sourceFolder = newFolderPath.makeRelative(); sourceFolderField.setText(sourceFolder.toString()); } } private IPath chooseSourceFolder(IPath initialPath) { ICElement initElement = NewClassWizardUtil.getSourceFolder(initialPath); if (initElement instanceof ISourceRoot) { ICProject cProject = initElement.getCProject(); ISourceRoot projRoot = cProject.findSourceRoot(cProject.getProject()); if (projRoot != null && projRoot.equals(initElement)) initElement = cProject; } SourceFolderSelectionDialog dialog = new SourceFolderSelectionDialog(getShell()); dialog.setInput(CoreModel.create(NewClassWizardUtil.getWorkspaceRoot())); dialog.setInitialSelection(initElement); if (dialog.open() == Window.OK) { Object result = dialog.getFirstResult(); if (result instanceof ICElement) { ICElement element = (ICElement)result; if (element instanceof ICProject) { ICProject cproject = (ICProject)element; ISourceRoot folder = cproject.findSourceRoot(cproject.getProject()); if (folder != null) return folder.getResource().getFullPath(); } return element.getResource().getFullPath(); } } return null; } private void selectHeaderUnderTest() { IPath oldFolderPath = headerUnderTest; IPath newFolderPath = chooseHeaderUnderTest(oldFolderPath); if (newFolderPath != null) { headerUnderTest = newFolderPath.makeRelative(); headerUnderTestField.setText(headerUnderTest.toString()); } } private IPath chooseHeaderUnderTest(IPath initialPath) { ICElement initElement = NewClassWizardUtil.getSourceFolder(initialPath); if (initElement instanceof ISourceRoot) { ICProject cProject = initElement.getCProject(); ISourceRoot projRoot = cProject.findSourceRoot(cProject.getProject()); if (projRoot != null && projRoot.equals(initElement)) initElement = cProject; } TranslationUnitSelectionDialog dialog = new TranslationUnitSelectionDialog(getShell()); dialog.setInput(CoreModel.create(NewClassWizardUtil.getWorkspaceRoot())); dialog.setInitialSelection(initElement); if (dialog.open() == Window.OK) { Object result = dialog.getFirstResult(); if (result instanceof ICElement) { ICElement element = (ICElement)result; if (element instanceof ICProject) { ICProject cproject = (ICProject)element; ISourceRoot folder = cproject.findSourceRoot(cproject.getProject()); if (folder != null) return folder.getResource().getFullPath(); } return element.getResource().getFullPath(); } } return null; } private void createTypeNameControls(Composite composite, int numColumns) { Label label = new Label(composite, SWT.NONE); label.setText(Messages.NewCxxTestSuiteWizardPageOne_Name); label.setLayoutData(gridDataForLabel(1)); suiteNameField = new Text(composite, SWT.SINGLE | SWT.BORDER); suiteNameField.setLayoutData(gridDataForText(2)); suiteNameField.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { checkForErrors(); } }); suiteNameField.setFocus(); label = new Label(composite, SWT.NONE); label.setLayoutData(gridDataForLabel(1)); } private void createSuperClassControls(Composite composite, int numColumns) { Label label = new Label(composite, SWT.NONE); label.setText(Messages.NewCxxTestSuiteWizardPageOne_Superclass); label.setLayoutData(gridDataForLabel(1)); superClassField = new Text(composite, SWT.SINGLE | SWT.BORDER); superClassField.setLayoutData(gridDataForText(2)); superClassField.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { checkForErrors(); } }); label = new Label(composite, SWT.NONE); label.setLayoutData(gridDataForLabel(1)); } private void createMethodStubSelectionControls(Composite composite, int numColumns) { Label label = new Label(composite, SWT.NONE); label.setText(Messages.NewCxxTestSuiteWizardPageOne_MethodStubsPrompt); label.setLayoutData(gridDataForLabel(4)); label = new Label(composite, SWT.NONE); label.setLayoutData(gridDataForLabel(1)); setUpButton = new Button(composite, SWT.CHECK); setUpButton.setText("setUp()"); //$NON-NLS-1$ setUpButton.setLayoutData(gridDataForButton(setUpButton, 3)); label = new Label(composite, SWT.NONE); label.setLayoutData(gridDataForLabel(1)); tearDownButton = new Button(composite, SWT.CHECK); tearDownButton.setText("tearDown()"); //$NON-NLS-1$ tearDownButton.setLayoutData(gridDataForButton(tearDownButton, 3)); } private void createHeaderUnderTestControls(Composite composite, int numColumns) { Label label = new Label(composite, SWT.NONE); label.setText(Messages.NewCxxTestSuiteWizardPageOne_HeaderUnderTest); label.setLayoutData(gridDataForLabel(1)); headerUnderTestField = new Text(composite, SWT.SINGLE | SWT.BORDER); headerUnderTestField.setLayoutData(gridDataForText(2)); headerUnderTestField.setText(headerUnderTest.toString()); headerUnderTestField.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { checkForErrors(); } }); Button browseButton = new Button(composite, SWT.NONE); browseButton.setText(Messages.NewCxxTestSuiteWizardPageOne_Browse); browseButton.setLayoutData(gridDataForButton(browseButton, 1)); browseButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { selectHeaderUnderTest(); } }); } private boolean isValidSuiteName() { String suiteName = suiteNameField.getText(); char ch = suiteName.charAt(0); if(!Character.isLetter(ch) && ch != '_') return false; for(int i = 1; i < suiteName.length(); i++) { ch = suiteName.charAt(i); if(!Character.isLetterOrDigit(ch) && ch != '_') return false; } return true; } private void checkForErrors() { String msg = null; if(sourceFolderField.getText().length() == 0) msg = Messages.NewCxxTestSuiteWizardPageOne_EnterSourceFolderMsg; else if(suiteNameField.getText().length() == 0) msg = Messages.NewCxxTestSuiteWizardPageOne_EnterSuiteNameMsg; else if(!isValidSuiteName()) msg = Messages.NewCxxTestSuiteWizardPageOne_SuiteNameInvalidMsg; else if(superClassField.getText().length() == 0) msg = Messages.NewCxxTestSuiteWizardPageOne_EnterSuperclassNameMsg; setErrorMessage(msg); setPageComplete(msg == null); } private static GridData gridDataForLabel(int span) { GridData gd = new GridData(); gd.horizontalAlignment = SWT.FILL; gd.horizontalSpan = span; return gd; } private static GridData gridDataForText(int span) { GridData gd = new GridData(); gd.horizontalAlignment = SWT.FILL; gd.grabExcessHorizontalSpace = true; gd.horizontalSpan = span; return gd; } private static GridData gridDataForButton(Button button, int span) { GridData gd = new GridData(); gd.horizontalAlignment = SWT.FILL; gd.grabExcessHorizontalSpace = false; gd.horizontalSpan = span; gd.widthHint = SWTUtil.getButtonWidthHint(button); return gd; } private void setSuperClass(String name) { superClass = name; superClassField.setText(name); } public void collectFields() { if(suiteNameField.getText().length() == 0) suiteName = null; else suiteName = suiteNameField.getText(); if(superClassField.getText().length() == 0) superClass = null; else superClass = superClassField.getText(); if(sourceFolderField.getText().length() == 0) sourceFolder = null; else sourceFolder = new Path(sourceFolderField.getText()); if(headerUnderTestField.getText().length() == 0) headerUnderTest = null; else headerUnderTest = new Path(headerUnderTestField.getText()); createSetUp = setUpButton.getSelection(); createTearDown = tearDownButton.getSelection(); } public IPath getSourceFolder() { return sourceFolder; } public IPath getHeaderUnderTest() { return headerUnderTest; } public String getSuiteName() { return suiteName; } public String getSuperClass() { return superClass; } public boolean getCreateSetUp() { return createSetUp; } public boolean getCreateTearDown() { return createTearDown; } public IWizardPage getNextPage() { collectFields(); pageTwo.setHeaderUnderTestPath(headerUnderTest); return super.getNextPage(); } }