/******************************************************************************* * 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.wizards.pages; import java.util.ArrayList; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.jubula.client.core.model.IAUTMainPO; import org.eclipse.jubula.client.core.model.IProjectPO; import org.eclipse.jubula.client.ui.constants.ContextHelpIds; import org.eclipse.jubula.client.ui.rcp.Plugin; import org.eclipse.jubula.client.ui.rcp.databinding.validators.AutIdValidator; import org.eclipse.jubula.client.ui.rcp.dialogs.NagDialog; import org.eclipse.jubula.client.ui.rcp.factory.ControlFactory; import org.eclipse.jubula.client.ui.rcp.i18n.Messages; import org.eclipse.jubula.client.ui.rcp.provider.ControlDecorator; import org.eclipse.jubula.client.ui.rcp.widgets.AutIdListComposite; import org.eclipse.jubula.client.ui.rcp.wizards.ProjectWizard; import org.eclipse.jubula.client.ui.utils.LayoutUtil; import org.eclipse.jubula.client.ui.widgets.DirectCombo; import org.eclipse.jubula.toolkit.common.exception.ToolkitPluginException; import org.eclipse.jubula.toolkit.common.xml.businessprocess.ComponentBuilder; import org.eclipse.jubula.tools.internal.constants.CommandConstants; import org.eclipse.jubula.tools.internal.constants.StringConstants; import org.eclipse.jubula.tools.internal.exception.Assert; import org.eclipse.jubula.tools.internal.i18n.I18n; import org.eclipse.jubula.tools.internal.xml.businessmodell.ToolkitDescriptor; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; 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.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; /** * @author BREDEX GmbH * @created 18.05.2005 */ public class AUTSettingWizardPage extends WizardPage { /** number of columns = 1 */ private static final int NUM_COLUMNS_1 = 1; /** number of columns = 2 */ private static final int NUM_COLUMNS_2 = 2; /** the AUT name editor */ private Text m_autNameText; /** the combo box with the toolkit names */ private DirectCombo<String> m_autToolKitComboBox; /** the new AUT to create */ private IAUTMainPO m_autMain; /** the new project to create */ private IProjectPO m_project; /** the the WidgetSelectionListener */ private final WidgetSelectionListener m_selectionListener = new WidgetSelectionListener(); /** the WidgetModifyListener */ private final WidgetModifyListener m_modifyListener = new WidgetModifyListener(); /***/ private ScrolledComposite m_scroll; /** The button to indicate whether names should be generated */ private Button m_generateNames; /** * @param pageName The page name. * @param newProject The new project to create. * @param autMain The new AUT to create. */ public AUTSettingWizardPage(String pageName, IProjectPO newProject, IAUTMainPO autMain) { super(pageName); setPageComplete(false); m_project = newProject; m_autMain = autMain; } /** * @return the combo box with the toolkit names */ public DirectCombo<String> getToolkitComboBox() { return m_autToolKitComboBox; } /** * @param parent The parent composite. */ public void createControl(Composite parent) { m_scroll = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL); Composite composite = createComposite(m_scroll, 1, GridData.FILL, false); Composite autNameComposite = createComposite(composite, NUM_COLUMNS_2, GridData.FILL, false); newLabel(autNameComposite, StringConstants.EMPTY); newLabel(autNameComposite, StringConstants.EMPTY); createAUTNameEditor(autNameComposite); separator(composite); createAutIdList(composite); separator(composite); addListener(); Plugin.getHelpSystem().setHelp(composite, ContextHelpIds.AUT_SETTING_WIZARD_PAGE); createNextLabel(composite); m_scroll.setContent(composite); m_scroll.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); m_scroll.setExpandHorizontal(true); m_scroll.setExpandVertical(true); setControl(m_scroll); } /** * Creates a label. * @param composite the parent composite */ private void createNextLabel(Composite composite) { Label nextLabel = new Label(composite, SWT.NONE); nextLabel.setText(Messages.AUTSettingWizardPageClickNext); GridData data = new GridData(); data.grabExcessVerticalSpace = true; data.verticalAlignment = GridData.END; nextLabel.setLayoutData(data); } /** * Creates a new composite. * @param parent The parent composite. * @param numColumns the number of columns for this composite. * @param alignment The horizontalAlignment. * @param horizontalSpace The horizontalSpace. * @return The new composite. */ private Composite createComposite(Composite parent, int numColumns, int alignment, boolean horizontalSpace) { Composite composite = new Composite(parent, SWT.NONE); GridLayout compositeLayout = new GridLayout(); compositeLayout.numColumns = numColumns; compositeLayout.marginHeight = 0; compositeLayout.marginWidth = 0; composite.setLayout(compositeLayout); GridData compositeData = new GridData(); compositeData.horizontalAlignment = alignment; compositeData.grabExcessHorizontalSpace = horizontalSpace; composite.setLayoutData(compositeData); return composite; } /** * Creates the textfield for the project name. * @param parent The parent composite. */ private void createAUTNameEditor(Composite parent) { Composite leftComposite = createComposite(parent, NUM_COLUMNS_1, GridData.FILL, false); Composite rightComposite = createComposite(parent, NUM_COLUMNS_1, GridData.FILL, true); GridLayout gridLayout = new GridLayout(); gridLayout.marginHeight = 0; gridLayout.marginWidth = 0; leftComposite.setLayout(gridLayout); rightComposite.setLayout(gridLayout); newLabel(leftComposite, Messages.AUTSettingWizardPageAutName); m_autNameText = new Text(rightComposite, SWT.BORDER); m_autNameText.setFocus(); final GridData gridData = new GridData(); gridData.grabExcessHorizontalSpace = true; gridData.horizontalAlignment = GridData.FILL; m_autNameText.setLayoutData(gridData); LayoutUtil.setMaxChar(m_autNameText); createAutToolkitCombo(leftComposite, rightComposite, gridData); createGenerateNamesCheckBox(parent); } /** * Creates the graphical components for viewing and changing the list of * AUT IDs. * * @param parent The parent composite for the graphical components. */ private void createAutIdList(Composite parent) { Composite autIdListComposite = new AutIdListComposite(parent, m_autMain, new AutIdValidator(m_project)); GridData compositeData = new GridData(); compositeData.horizontalAlignment = SWT.FILL; compositeData.grabExcessHorizontalSpace = true; autIdListComposite.setLayoutData(compositeData); } /** * @param parent The parent composite. */ private void createGenerateNamesCheckBox(Composite parent) { Composite leftComposite = createComposite(parent, 3, SWT.LEFT, false); Composite rightComposite = createComposite(parent, NUM_COLUMNS_1, SWT.FILL, true); Label infoLabel = newLabel(leftComposite, Messages.AUTPropertiesDialogGenerateNames); ControlDecorator.createInfo(infoLabel, I18n.getString("AUTPropertiesDialog.generateNamesDescription"), //$NON-NLS-1$ false); m_generateNames = new Button(rightComposite, SWT.CHECK); m_generateNames.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { // nothing } public void widgetSelected(SelectionEvent e) { if (m_autMain.isGenerateNames() != m_generateNames.getSelection()) { m_autMain.setGenerateNames(m_generateNames.getSelection()); } } }); if (m_autMain.getToolkit() != null && m_autMain.getToolkit() .equals(CommandConstants.RCP_TOOLKIT)) { m_generateNames.setEnabled(true); } else { m_generateNames.setEnabled(false); m_generateNames.setSelection(false); } m_generateNames.setSelection(m_autMain.isGenerateNames()); } /** * Creates a Combo to select the toolkit * @param leftComposite see createAUTNameEditor() * @param rightComposite see createAUTNameEditor() * @param gridData see createAUTNameEditor() */ private void createAutToolkitCombo(Composite leftComposite, Composite rightComposite, final GridData gridData) { newLabel(leftComposite, StringConstants.EMPTY); newLabel(rightComposite, StringConstants.EMPTY); ControlDecorator.createInfo(newLabel(leftComposite, Messages.AUTSettingWizardPageToolkit), I18n.getString("ControlDecorator.NewProjectAUTToolkit"), //$NON-NLS-1$ false); try { m_autToolKitComboBox = ControlFactory.createAutToolkitCombo( rightComposite, m_project, m_autMain.getToolkit()); m_autToolKitComboBox.deselectAll(); m_autToolKitComboBox.clearSelection(); String autToolkit = m_autMain.getToolkit(); if (autToolkit != null && autToolkit.trim().length() != 0) { m_autToolKitComboBox.setSelectedObject(autToolkit); } } catch (ToolkitPluginException tpe) { // Toolkit for project could not be found. // Create a combo with only the aut toolkit. m_autToolKitComboBox = ControlFactory.createAutToolkitCombo( rightComposite, m_autMain); } m_autToolKitComboBox.addSelectionListener(m_selectionListener); m_autToolKitComboBox.setLayoutData(gridData); } /** * Creates a label for this page. * @param text The label text to set. * @param parent The composite. * @return a new label */ private Label newLabel(Composite parent, String text) { Label label = new Label(parent, SWT.NONE); label.setText(text); GridData labelGrid = new GridData(GridData.BEGINNING, GridData.CENTER, false, false, 1, 1); label.setLayoutData(labelGrid); return label; } /** * {@inheritDoc} * MH: Doesn't seem to work... */ public void performHelp() { PlatformUI.getWorkbench().getHelpSystem() .displayHelp(ContextHelpIds.AUT_SETTING_WIZARD_PAGE); } /** * Adds listeners. */ private void addListener() { m_autNameText.addModifyListener(m_modifyListener); } /** * Removes listeners. */ private void removeListener() { m_autNameText.removeModifyListener(m_modifyListener); } /** * This private inner class contains a new SelectionListener. * @author BREDEX GmbH * @created 10.02.2005 */ private class WidgetSelectionListener implements SelectionListener { /** * {@inheritDoc} */ public void widgetSelected(SelectionEvent e) { handleEvent(e); } /** * {@inheritDoc} */ public void widgetDefaultSelected(SelectionEvent e) { handleEvent(e); } /** * Handles the given event. * @param e a SelectionEvent. */ private void handleEvent(SelectionEvent e) { final Object o = e.getSource(); if (o.equals(m_autToolKitComboBox)) { if (CommandConstants.RCP_TOOLKIT.equals( m_autToolKitComboBox.getSelectedObject())) { m_generateNames.setEnabled(true); m_generateNames.setSelection(true); } else { m_generateNames.setEnabled(false); m_generateNames.setSelection(false); } checkCompleteness(); return; } Assert.notReached(Messages.EventActivatedByUnknownWidget + StringConstants.COLON + StringConstants.SPACE + StringConstants.APOSTROPHE + String.valueOf(o) + StringConstants.APOSTROPHE); } } /** * This private inner class contains a new ModifyListener. * @author BREDEX GmbH * @created 11.02.2005 */ private class WidgetModifyListener implements ModifyListener { /** * {@inheritDoc} */ public void modifyText(ModifyEvent e) { Object o = e.getSource(); if (o.equals(m_autNameText)) { m_autMain.setName(m_autNameText.getText()); checkCompleteness(); return; } Assert.notReached(Messages.EventActivatedByUnknownWidget + StringConstants.DOT); } } /** * Creates an AUT when pressing the next button. */ private void confirmNextButton() { String oldToolkit = m_autMain.getToolkit(); m_autMain.setName(m_autNameText.getText()); m_autMain.setToolkit(m_autToolKitComboBox.getSelectedObject()); m_autMain.setGenerateNames(m_generateNames.getSelection()); checkToolkit(this.getShell(), m_autMain, oldToolkit); } /** * check if the user needs info about the selected toolkit * @param shell the shell to be used as a parent or null for the * plug-ins default shell. * @param autMain which AUT is checked * @param oldToolkit old value */ public static void checkToolkit(Shell shell, IAUTMainPO autMain, String oldToolkit) { String newToolkit = autMain.getToolkit(); if (newToolkit != null) { if (((oldToolkit == null) || !newToolkit.equals(oldToolkit)) && newToolkit.equals(CommandConstants.RCP_TOOLKIT)) { NagDialog.runNagDialog(shell, "InfoNagger.DefineRcpAut", //$NON-NLS-1$ ContextHelpIds.AUT_CONFIG_SETTING_WIZARD_PAGE); } } } /** * Creates a separator line. * * @param composite * The parent composite. */ private void separator(Composite composite) { newLabel(composite, StringConstants.EMPTY); Label sep = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL); GridData sepData = new GridData(); sepData.horizontalAlignment = GridData.FILL; sepData.horizontalSpan = NUM_COLUMNS_2; sep.setLayoutData(sepData); newLabel(composite, StringConstants.EMPTY); } /** * {@inheritDoc} */ public void setVisible(boolean visible) { super.setVisible(visible); java.util.List<ToolkitDescriptor> toolkits; java.util.List<String> values = new ArrayList<String>(); java.util.List<String> displayValues = new ArrayList<String>(); try { toolkits = ControlFactory .getAutToolkits(m_project); for (ToolkitDescriptor desc : toolkits) { values.add(desc.getToolkitID()); displayValues.add(desc.getName()); } } catch (ToolkitPluginException tpe) { ToolkitDescriptor autToolkit = ComponentBuilder.getInstance().getCompSystem() .getToolkitDescriptor(m_autMain.getToolkit()); if (autToolkit != null) { values.add(autToolkit.getToolkitID()); displayValues.add(autToolkit.getName()); } else { values.add(m_autMain.getToolkit()); displayValues.add(m_autMain.getToolkit()); } } String selectedObject = m_autToolKitComboBox.getSelectedObject(); m_autToolKitComboBox.setItems(values, displayValues); if (selectedObject == null || selectedObject.length() < 1) { m_autToolKitComboBox.deselectAll(); } else { m_autToolKitComboBox.setSelectedObject(selectedObject); } if (visible) { m_autNameText.setFocus(); checkCompleteness(); } } /** * {@inheritDoc} */ public void dispose() { m_autMain = null; removeListener(); super.dispose(); } /** * Sets the "Next>"-button true, if all fields are filled in correctly. */ private void checkCompleteness() { if (modifyAUTNameFieldAction() && modifyAutToolkitComboAction()) { setMessage(Messages.ProjectWizardNewAUT, IMessageProvider.NONE); setPageComplete(true); confirmNextButton(); } else { setPageComplete(false); } } /** * The action for the toolkit combo box. * @return <code>true</code> if the input for the toolkit combo box is * valid. Otherwise, <code>false</code>. */ private boolean modifyAutToolkitComboAction() { boolean isToolkitSelected = m_autToolKitComboBox.getSelectedObject() != null; if (isToolkitSelected) { String oldToolkit = m_autMain.getToolkit(); m_autMain.setToolkit(m_autToolKitComboBox.getSelectedObject()); checkToolkit(getShell(), m_autMain, oldToolkit); } else { setMessage(Messages.ProjectWizardNoToolkitSelected, IMessageProvider.ERROR); } return isToolkitSelected; } /** * The action of the AUT name field. * @return false, if the AUT name field contents an error: * the AUT name starts or end with a blank, or the field is empty */ private boolean modifyAUTNameFieldAction() { boolean isError = false; int autNameLength = m_autNameText.getText().length(); if ((autNameLength == 0) || (m_autNameText.getText().startsWith(" ")) //$NON-NLS-1$ || (m_autNameText.getText().charAt(autNameLength - 1) == ' ')) { isError = true; } if (isError) { if (autNameLength == 0) { setMessage(Messages.AUTSettingWizardPageEmptyAUTName, IMessageProvider.ERROR); setPageComplete(false); } else { setMessage(Messages.ProjectWizardNotValidAUT, IMessageProvider.ERROR); setPageComplete(false); } } return !isError; } /** * {@inheritDoc} */ public ProjectWizard getWizard() { return (ProjectWizard)super.getWizard(); } }