/******************************************************************************* * 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.dialogs; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jubula.client.core.model.IEventExecTestCasePO; import org.eclipse.jubula.client.core.model.IEventHandlerContainer; import org.eclipse.jubula.client.core.model.ReentryProperty; import org.eclipse.jubula.client.core.utils.StringHelper; import org.eclipse.jubula.client.ui.constants.ContextHelpIds; import org.eclipse.jubula.client.ui.constants.IconConstants; import org.eclipse.jubula.client.ui.rcp.Plugin; import org.eclipse.jubula.client.ui.rcp.i18n.Messages; import org.eclipse.jubula.client.ui.utils.ErrorHandlingUtil; import org.eclipse.jubula.client.ui.utils.LayoutUtil; import org.eclipse.jubula.toolkit.common.xml.businessprocess.ComponentBuilder; import org.eclipse.jubula.tools.internal.constants.StringConstants; import org.eclipse.jubula.tools.internal.messagehandling.MessageIDs; import org.eclipse.swt.SWT; 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.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Spinner; import org.eclipse.swt.widgets.Text; /** * @author BREDEX GmbH * @created 13.04.2005 */ public class AddEventHandlerDialog extends TitleAreaDialog { /** number of columns = 1 */ private static final int NUM_COLUMNS_1 = 1; /** number of columns = 4 */ private static final int NUM_COLUMNS_2 = 2; /** vertical spacing = 2 */ private static final int VERTICAL_SPACING = 10; /** margin width = 0 */ private static final int MARGIN_WIDTH = 10; /** margin height = 2 */ private static final int MARGIN_HEIGHT = 10; /** width hint = 300 */ private static final int WIDTH_HINT = 300; /** maximum length of input */ private int m_maxLength = 255; /** the parent area/composite */ private Composite m_area = null; /** TextFieled for reference name */ private Text m_refNameField; /** ComboBox for event types */ private Combo m_eventTypesCombo; /** ComboBox for reentry types */ private Combo m_reentryTypesCombo; /** The depending EventTestCase */ private final IEventHandlerContainer m_eventHandlerContainer; /** * label for max retries. this component is only shown if the RETRY * reentry type is selected */ private Label m_maxRetriesLabel; /** * text field for max retries. this component is only shown if the RETRY * reentry type is selected */ private Spinner m_maxRetriesText; /** List of listener */ private List < Listener > m_listenerList = new ArrayList < Listener > (); /** name of the test case to use as an event handler */ private String m_tcName; /** * Constructor. * @param parentShell the parent shell. * @param tcName The name of the test case to use as an event handler. * @param eventTc the depending EventTestCase. */ public AddEventHandlerDialog(Shell parentShell, String tcName, IEventHandlerContainer eventTc) { super(parentShell); m_eventHandlerContainer = eventTc; m_tcName = tcName; } /** * {@inheritDoc} */ protected Button createButton(Composite parent, int id, String label, boolean defaultButton) { Button button = super.createButton(parent, id, label, defaultButton); getButton(IDialogConstants.OK_ID).setEnabled(false); return button; } /** * {@inheritDoc} */ protected Control createDialogArea(Composite parent) { setTitle(Messages.AddEventHandlerDialogAddErrorHandler); setTitleImage(IconConstants.NEW_EH_DIALOG_IMAGE); getShell().setText(Messages.AddEventHandlerDialogAddErrorHandler); setMessage(Messages.AddEventHandlerDialogMessage); // new Composite as container final GridLayout gridLayoutParent = new GridLayout(); gridLayoutParent.numColumns = NUM_COLUMNS_1; gridLayoutParent.verticalSpacing = VERTICAL_SPACING; gridLayoutParent.marginWidth = MARGIN_WIDTH; gridLayoutParent.marginHeight = MARGIN_HEIGHT; parent.setLayout(gridLayoutParent); LayoutUtil.createSeparator(parent); m_area = new Composite(parent, SWT.FILL); final GridLayout gridLayout = new GridLayout(); gridLayout.numColumns = NUM_COLUMNS_2; m_area.setLayout(gridLayout); GridData gridData = new GridData(); gridData.grabExcessHorizontalSpace = true; gridData.grabExcessVerticalSpace = true; gridData.horizontalAlignment = GridData.FILL; gridData.verticalAlignment = GridData.FILL; gridData.widthHint = WIDTH_HINT; m_area.setLayoutData(gridData); new Label(m_area, SWT.NONE).setLayoutData(newGridData(NUM_COLUMNS_2)); createWidgets(m_area); new Label(m_area, SWT.NONE).setLayoutData(newGridData(NUM_COLUMNS_2)); LayoutUtil.createSeparator(parent); addListenerToWidgets(); //add help id and tell eclipse that it's there Plugin.getHelpSystem().setHelp(parent, ContextHelpIds.EVENT_HANDLER_ADD); setHelpAvailable(true); return m_area; } /** * Creates the widgets. * * @param parent * the parent for the widgets. */ private void createWidgets(Composite parent) { // create a non-editable text field for the name of the event handler Label eventNameLabel = new Label(parent, SWT.NONE); eventNameLabel.setText(Messages.AddEventHandlerDialogLabel); Text nameText = new Text(parent, SWT.FILL | SWT.BORDER); GridData eventNameGridData = new GridData(SWT.FILL, SWT.NONE, true, false); nameText.setLayoutData(eventNameGridData); nameText.setText(m_tcName); nameText.setEnabled(false); // create an editable text field for the referenced name of the event // handler Label eventRefNameLabel = new Label(parent, SWT.NONE); eventRefNameLabel.setText(Messages.AddEventHandlerDialogRefNameLabel); m_refNameField = new Text(parent, SWT.FILL | SWT.BORDER); GridData eventRefNameGridData = new GridData(SWT.FILL, SWT.NONE, true, false); m_refNameField.setLayoutData(eventRefNameGridData); m_refNameField.setTextLimit(m_maxLength); Collection<IEventExecTestCasePO> eventTcList = m_eventHandlerContainer .getAllEventEventExecTC(); // get a List of used event types in this TestCase. List<String> existentEventTypes = new ArrayList<String>(); for (IEventExecTestCasePO eventTc : eventTcList) { existentEventTypes.add(eventTc.getEventType()); } // create Combo with event types Label eventTypeLabel = new Label(parent, SWT.NONE); eventTypeLabel.setText(Messages.AddEventHandlerDialogEventType); m_eventTypesCombo = new Combo(parent, SWT.FILL | SWT.READ_ONLY); GridData eventGridData = new GridData(SWT.FILL, SWT.NONE, true, false); m_eventTypesCombo.setLayoutData(eventGridData); Set<String> mapKeySet = ComponentBuilder.getInstance().getCompSystem() .getEventTypes().keySet(); List<String> selectableEventTypes = new ArrayList<String>(); final Map<String, String> stringHelperMap = StringHelper.getInstance() .getMap(); for (String eventTypeKey : mapKeySet) { if (!existentEventTypes.contains(eventTypeKey)) { selectableEventTypes.add(stringHelperMap.get(eventTypeKey)); } } m_eventTypesCombo.setItems(selectableEventTypes .toArray(new String[selectableEventTypes.size()])); // create Combo with reentry types Label reentryTypeLabel = new Label(parent, SWT.NONE); reentryTypeLabel.setText(Messages.AddEventHandlerDialogReentryType); m_reentryTypesCombo = new Combo(parent, SWT.FILL | SWT.READ_ONLY); GridData reentryGridData = new GridData(SWT.FILL, SWT.NONE, true, false); m_reentryTypesCombo.setLayoutData(reentryGridData); ReentryProperty[] reentryProps = ReentryProperty.REENTRY_PROP_ARRAY; String[] reentryStrings = new String[reentryProps.length]; for (int k = 0; k < reentryProps.length; k++) { reentryStrings[k] = reentryProps[k].toString(); } m_reentryTypesCombo.setItems(reentryStrings); SelectionListener reentryComboListener = new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { // Do nothing } public void widgetSelected(SelectionEvent e) { setMaxRetriesVisibility(); } }; m_reentryTypesCombo.addSelectionListener(reentryComboListener); createMaxNumRetriesWidgets(parent); } /** * Creates the widgets for maximum number of retries. * * @param parent * the parent for the widgets. */ private void createMaxNumRetriesWidgets(Composite parent) { m_maxRetriesLabel = new Label(parent, SWT.NONE); m_maxRetriesLabel.setText( Messages.AddEventHandlerDialogMaxNumRetries); m_maxRetriesText = new Spinner( parent, SWT.FILL | SWT.BORDER); m_maxRetriesText.setSelection( IEventExecTestCasePO.DEFAULT_MAX_NUM_RETRIES); m_maxRetriesText.setMinimum( IEventExecTestCasePO.MIN_VALUE_MAX_NUM_RETRIES); m_maxRetriesText.setMaximum( IEventExecTestCasePO.MAX_VALUE_MAX_NUM_RETRIES); GridData maxRetriesGridData = new GridData(SWT.FILL, SWT.NONE, true, false); m_maxRetriesText.setLayoutData(maxRetriesGridData); setMaxRetriesVisibility(); } /** * Creates a new GridData. * @param horizontalSpan The horizontal span. * @return grid data */ private GridData newGridData(int horizontalSpan) { GridData gridData = new GridData(); gridData.grabExcessHorizontalSpace = false; gridData.horizontalAlignment = GridData.FILL; gridData.horizontalSpan = horizontalSpan; return gridData; } /** * @param listener the listener */ public void addListener(Listener listener) { if (!m_listenerList.contains(listener)) { m_listenerList.add(listener); } } /** * @param listener the listener */ public void removeListener(Listener listener) { m_listenerList.remove(listener); } /** * Notifies the Listener */ private void notifyListener() { Iterator<Listener> iter = m_listenerList.iterator(); while (iter.hasNext()) { iter.next().notifySelected(m_refNameField.getText(), m_eventTypesCombo.getText(), m_reentryTypesCombo.getText(), m_maxRetriesText.isVisible() ? m_maxRetriesText.getSelection() : null); } } /** * This method is called, when the OK button was pressed */ protected void okPressed() { notifyListener(); super.okPressed(); } /** * @return false, if the reference name field contains an error: the name starts or * end with a blank */ private boolean checkRefNameFieldAction() { int nameLength = m_refNameField.getText().length(); if (nameLength > 0) { if (nameLength >= m_maxLength) { ErrorHandlingUtil.createMessageDialog(MessageIDs.W_MAX_CHAR, new Object[] { m_maxLength }, null); setErrorMessage(Messages. AddEventHandlerDialogIncorrectRefNameInput); return false; } String refName = m_refNameField.getText(); if (refName.startsWith(StringConstants.SPACE) || refName.endsWith(StringConstants.SPACE)) { setErrorMessage(Messages. AddEventHandlerDialogIncorrectRefNameInput); return false; } } return true; } /** * @return True, if something was selected in this combo box. */ private boolean checkEventTypeComboAction() { if (m_eventTypesCombo.getText() == StringConstants.EMPTY) { setErrorMessage(Messages.AddEventHandlerDialogNoEventTypeSel); return false; } return true; } /** * @return True, if something was selected in this combo box. */ private boolean checkReentryTypeComboAction() { if (m_reentryTypesCombo.getText() == StringConstants.EMPTY) { setErrorMessage(Messages.AddEventHandlerDialogNoReentryTypeSel); return false; } return true; } /** * en-/disables the OK button and makes a non-error title message. * * @param enabled * true or false. */ private void enableOKButton(boolean enabled) { getButton(IDialogConstants.OK_ID).setEnabled(enabled); if (enabled) { setErrorMessage(null); } } /** * {@inheritDoc} */ public boolean close() { m_listenerList.clear(); return super.close(); } /** * Abstract listener class to notify listener about the selections. * * @author BREDEX GmbH * @created 13.04.2005 */ public abstract static class Listener { /** * Notifies about the selections. * @param refName of EventHandler. * @param eventType the selected event Type. * @param reentryType the selected reentryType. * @param maxRetries the maximum number of retries */ public abstract void notifySelected(String refName, String eventType, String reentryType, Integer maxRetries); } /** * Adds listener to the widgets. */ private void addListenerToWidgets() { WidgetModifyListener listener = new WidgetModifyListener(); m_eventTypesCombo.addModifyListener(listener); m_reentryTypesCombo.addModifyListener(listener); m_refNameField.addModifyListener(listener); } /** * */ private void setMaxRetriesVisibility() { boolean isRetryReentrySelected = m_reentryTypesCombo.getSelectionIndex() != -1 && ReentryProperty.REENTRY_PROP_ARRAY [m_reentryTypesCombo.getSelectionIndex()].equals( ReentryProperty.RETRY); m_maxRetriesLabel.setVisible(isRetryReentrySelected); m_maxRetriesText.setVisible(isRetryReentrySelected); m_maxRetriesLabel.getParent().layout(); } /** * ModifyListener for the all fields. * * @author BREDEX GmbH * @created 14.04.2005 */ private class WidgetModifyListener implements ModifyListener { /** * {@inheritDoc} */ public void modifyText(ModifyEvent e) { enableOKButton(dialogInputIsValid()); } } /** * This method is called on modification of any of Add Event Handler Dialog components * @return false, if at least one of the values * that were inputed in the Add Event Handler Dialog is invalid * @author M.Maulhs * @created 22.10.2013 */ private boolean dialogInputIsValid() { return checkRefNameFieldAction() && checkReentryTypeComboAction() && checkEventTypeComboAction(); } }