/******************************************************************************* * 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.Arrays; import java.util.List; import java.util.Set; import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ComboBoxCellEditor; import org.eclipse.jface.viewers.ICellModifier; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.window.Window; import org.eclipse.jubula.client.core.model.IParamDescriptionPO; import org.eclipse.jubula.client.core.model.IParameterInterfacePO; 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.constants.TestDataConstants; import org.eclipse.jubula.tools.internal.exception.Assert; import org.eclipse.jubula.tools.internal.i18n.CompSystemI18n; import org.eclipse.jubula.tools.internal.messagehandling.MessageIDs; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.events.VerifyEvent; import org.eclipse.swt.events.VerifyListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; 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.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; /** * @author BREDEX GmbH * @created Oct 25, 2007 */ @SuppressWarnings("synthetic-access") public abstract class AbstractEditParametersDialog extends TitleAreaDialog { /** * Regex for param name input validation. This allows all letters and * numbers as well as the empty string. It can be used for controlling the * input of a text field, but should not be used for final validation, as it * allows empty strings. */ private static final String PARAM_NAME_REGEX = "[a-zA-Z_0-9]*"; //$NON-NLS-1$ /** * <code>DEFAULT_COLUMN_WIDTH</code> */ private static final int DEFAULT_COLUMN_WIDTH = 200; /** * <code>INITIAL_SIZE</code> of this Dialog. */ private static final int INITIAL_SIZE = 600; /** Name of the name-column */ private static final String NAME_COL_NAME = Messages.EditParametersDialogNameTableColumnName; /** Name of the type-column */ private static final String TYPE_COL_NAME = Messages.EditParametersDialogTypeTableColumnName; /** Constant for an empty Cell entry */ private static final String EMPTY_ENTRY = StringUtils.EMPTY; /** Default name of a new added Parameter */ private static final String DEFAULT_PARAM_NAME = Messages.EditParametersDialogDefaultNewParameterName; /** Default type of a new added Parameter */ private static final String DEFAULT_PARAM_TYPE = TestDataConstants.STR; /** * <code>ERROR_COLOR</code> */ private static final int ERROR_COLOR = SWT.COLOR_RED; /** Constant for the index of the name column of the table */ private static final int NAME_TABLE_COLUMN = 0; /** Constant for the index of the type column of the table */ private static final int TYPE_TABLE_COLUMN = 1; /** * <code>TABLE_COLUMNS</code> */ private static final String[] TABLE_COLUMNS = new String[]{NAME_COL_NAME, TYPE_COL_NAME}; /** The IParameterInterfacePO */ private IParameterInterfacePO m_paramInterfaceObj; /** The inner data model of the parameters */ private List<Parameter> m_parameters = new ArrayList<Parameter>(); /** The TableViewer */ private TableViewer m_paramTableViewer; /** * @param parentShell * the parent. * @param paramIntObj * parameter interface obj the IParameterInterfacePO. */ public AbstractEditParametersDialog(Shell parentShell, IParameterInterfacePO paramIntObj) { super(parentShell); setParamInterfaceObj(paramIntObj); } /** * {@inheritDoc} */ protected Point getInitialSize() { final Point initialSize = super.getInitialSize(); initialSize.y = INITIAL_SIZE; return initialSize; } /** * @author BREDEX GmbH * @created Mar 17, 2008 */ protected final class SelectionBasedButtonEnabler implements ISelectionChangedListener, SelectionListener { /** <code>Button</code> */ private final Button m_button; /** @param button a Button */ private SelectionBasedButtonEnabler(Button button) { m_button = button; } /** {@inheritDoc} */ public void selectionChanged(SelectionChangedEvent event) { handleSelection(); } /** {@inheritDoc} */ public void widgetDefaultSelected(SelectionEvent e) { handleSelection(); } /** {@inheritDoc} */ public void widgetSelected(SelectionEvent e) { handleSelection(); } /** * handle the selection */ private void handleSelection() { m_button.setEnabled(generalButtonEnablement() && !getParamTableViewer().getSelection().isEmpty()); } } /** * @return wheter all buttons add, delete, up, down shall be enabled on * selection changed events */ protected boolean generalButtonEnablement() { return true; } /** * ContentProvider of the ParameterTable * @author BREDEX GmbH * @created Oct 25, 2007 */ private static final class ParamTableContentProvider implements IStructuredContentProvider { /** {@inheritDoc} */ public Object[] getElements(Object inputElement) { return ((List)inputElement).toArray(); } /** {@inheritDoc} */ public void dispose() { // nothing } /** {@inheritDoc} */ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // nothing } } /** * LabelProvider of the ParameterTable * * @author BREDEX GmbH * @created Oct 25, 2007 */ private final class ParamTableLabelProvider implements ITableLabelProvider { /** {@inheritDoc} */ public Image getColumnImage(Object element, int columnIndex) { if (columnIndex == NAME_TABLE_COLUMN) { final Parameter parameter = (Parameter)element; if (EMPTY_ENTRY.equals(parameter.getName().trim()) || EMPTY_ENTRY.equals(parameter.getType().trim()) || isDuplicate(parameter)) { return IconConstants.ERROR_IMAGE; } } return null; } /** {@inheritDoc} */ public String getColumnText(Object element, int columnIndex) { final Parameter parameter = (Parameter)element; final String text = getTableCellText(parameter, columnIndex); setCellBackground(parameter); return text; } /** * Sets the background of the cell of the given parameter. * @param parameter A Parameter. */ private void setCellBackground(Parameter parameter) { final Table table = getParamTableViewer().getTable(); Color rowColor = null; // null sets default color! if (EMPTY_ENTRY.equals(parameter.getName().trim()) || EMPTY_ENTRY.equals(parameter.getType().trim()) || isDuplicate(parameter)) { rowColor = table.getDisplay().getSystemColor(ERROR_COLOR); } final Integer[] indices = getIndices(parameter); final int itemCount = table.getItemCount(); for (int index : indices) { if (index < itemCount) { final TableItem item = table.getItem(index); item.setBackground(NAME_TABLE_COLUMN, rowColor); } } } /** {@inheritDoc} */ public void addListener(ILabelProviderListener listener) { // nothing } /** {@inheritDoc} */ public void dispose() { // nothing } /** {@inheritDoc} */ public boolean isLabelProperty(Object element, String property) { return false; } /** {@inheritDoc} */ public void removeListener(ILabelProviderListener listener) { // nothing } } /** * @author BREDEX GmbH * @created Oct 26, 2007 */ private static final class I18nComboBoxCellEditor extends ComboBoxCellEditor { /** The model items (no I18N) */ private String[] m_modelItems; /** * @param parent the parent control * @param items the list of strings for the combo box * @param style the style bits */ public I18nComboBoxCellEditor(Composite parent, String[] items, int style) { super(parent, items, style); m_modelItems = items; translateModelItems(); } /** * translates the model items */ protected void translateModelItems() { final int itemSize = m_modelItems.length; final String[] translatedItems = new String[itemSize]; int i = 0; for (String item : m_modelItems) { final String translatedItem = CompSystemI18n.getString(item); translatedItems[i] = translatedItem; i++; } setItems(translatedItems); } /** * {@inheritDoc} * @return The non-I18N-Value of the current selection. */ protected Object doGetValue() { final int selectedIndex = (Integer)super.doGetValue(); return getModelItems()[selectedIndex]; } /** * {@inheritDoc} */ protected void doSetValue(Object value) { int index = Arrays.asList(getItems()).indexOf(value); if (index < 0) { index = 0; } super.doSetValue(Integer.valueOf(index)); } /** * @return The model Items (no I18N) */ public String[] getModelItems() { return m_modelItems; } } /** * Inner data model for parameter * @author BREDEX GmbH * @created Oct 25, 2007 */ public static final class Parameter { /** The GUID */ private String m_guid; /** The name */ private String m_name = StringConstants.EMPTY; /** The type */ private String m_type = StringConstants.EMPTY; /** * Constructor to create a new Parameter without GUID * @param name The name. * @param type The type. */ public Parameter(String name, String type) { m_name = name; m_type = type; } /** * Constructor to create an already existing parameter with GUID * @param guid the GUID. * @param name The name. * @param type The type. */ public Parameter(String guid, String name, String type) { this(name, type); m_guid = guid; } /** * Copy constructor from an already existing parameter description. * @param descr The parameter description. */ public Parameter(IParamDescriptionPO descr) { this(descr.getUniqueId(), descr.getName(), descr.getType()); } /** * @return the name or an empty String if no name is set. */ public String getName() { return m_name; } /** * @param name the name to set */ public void setName(String name) { if (name == null) { m_name = EMPTY_ENTRY; } else { m_name = name; } } /** * @return The type or an empty String if no type is set. */ public String getType() { return m_type; } /** * @param type The type to set */ public void setType(String type) { if (type == null) { m_type = EMPTY_ENTRY; } else { m_type = type; } } /** * @return The GUID or null if this is a new created Parameter. */ public String getGuid() { return m_guid; } /** * {@inheritDoc} */ public int hashCode() { return m_name.hashCode(); } } /** * @author BREDEX GmbH * @created Oct 25, 2007 */ protected abstract class AbstractTableCellModifier implements ICellModifier { /** * {@inheritDoc} */ public abstract boolean canModify(Object element, String property); /** * {@inheritDoc} */ public Object getValue(Object element, String property) { final int columnIndex = getColumnIndex(property); return getTableCellText((Parameter)element, columnIndex); } /** * {@inheritDoc} */ public void modify(Object element, String property, Object value) { final TableItem tableItem = (TableItem)element; final Parameter parameter = (Parameter)tableItem.getData(); final int columnIndex = getColumnIndex(property); setTableCellText(value, parameter, columnIndex); } } /** * {@inheritDoc} */ protected Control createDialogArea(Composite parent) { final GridLayout gridLayoutParent = new GridLayout(); gridLayoutParent.numColumns = 1; parent.setLayout(gridLayoutParent); LayoutUtil.createSeparator(parent); final Composite area = new Composite(parent, SWT.NONE); final GridLayout areaLayout = new GridLayout(); area.setLayout(areaLayout); final GridData areaGridData = new GridData(); areaGridData.grabExcessVerticalSpace = true; areaGridData.horizontalAlignment = GridData.FILL; areaGridData.verticalAlignment = GridData.FILL; area.setLayoutData(areaGridData); createNameField(area); LayoutUtil.createSeparator(area); createParameterTableArea(area); LayoutUtil.createSeparator(area); refreshTable(); // add help id and tell eclipse that it's there Plugin.getHelpSystem().setHelp(parent, ContextHelpIds.EDIT_PARAMETERS); setHelpAvailable(true); return area; } /** * @param parent the parent */ private void createParameterTableArea(Composite parent) { final Label label = new Label(parent, SWT.NONE); label.setText(Messages.EditParametersDialogParameters); createAdditionalWidgetsAtTop(parent); final Composite tableArea = new Composite(parent, SWT.NONE); final GridLayout areaLayout = new GridLayout(2, false); tableArea.setLayout(areaLayout); final GridData tableAreaGridData = new GridData(); tableAreaGridData.grabExcessVerticalSpace = true; tableAreaGridData.horizontalAlignment = GridData.FILL; tableAreaGridData.verticalAlignment = GridData.FILL; tableArea.setLayoutData(tableAreaGridData); createParameterTable(tableArea); createTableButtons(tableArea); } /** * subclasses may override * @param parent the parent */ protected void createAdditionalWidgetsAtTop(Composite parent) { // subclasses may override } /** * @param parent the parent */ protected void createParameterTable(final Composite parent) { setParamTableViewer(new TableViewer(parent, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION)); createInnerDataModel(); final GridData paramTableFieldGridData = new GridData(); paramTableFieldGridData.grabExcessHorizontalSpace = true; paramTableFieldGridData.grabExcessVerticalSpace = true; paramTableFieldGridData.horizontalAlignment = GridData.FILL; paramTableFieldGridData.verticalAlignment = GridData.FILL; final Table table = getParamTableViewer().getTable(); for (String columnText : TABLE_COLUMNS) { TableColumn column = new TableColumn(table, SWT.NONE); column.setText(columnText); } table.setHeaderVisible(true); table.setLinesVisible(true); table.setLayoutData(paramTableFieldGridData); for (TableColumn col : table.getColumns()) { col.setWidth(DEFAULT_COLUMN_WIDTH); } getParamTableViewer().setColumnProperties(TABLE_COLUMNS); getParamTableViewer().setContentProvider( new ParamTableContentProvider()); getParamTableViewer().setLabelProvider( new ParamTableLabelProvider()); getParamTableViewer().setInput(m_parameters); createTableCellEditors(table); getParamTableViewer().setCellModifier(getParamTableCellModifier()); for (CellEditor cellEditor : getParamTableViewer().getCellEditors()) { cellEditor.getControl().addFocusListener(new FocusAdapter() { public void focusLost(FocusEvent e) { checkOkButtonEnablement(); } }); } } /** * @return a valid cell table modifier */ protected abstract ICellModifier getParamTableCellModifier(); /** * Creates the {@link CellEditor}s of the given Table. * @param table a Table */ private void createTableCellEditors(final Table table) { final TextCellEditor paramNameTextCellEditor = new TextCellEditor( table); ((Text)paramNameTextCellEditor.getControl()).addVerifyListener( new VerifyListener() { public void verifyText(VerifyEvent e) { Text txt = (Text)e.widget; final String oldValue = txt.getText(); StringBuilder workValue = new StringBuilder(oldValue); workValue.replace(e.start, e.end, e.text); String newValue = workValue.toString(); e.doit = Pattern.matches(PARAM_NAME_REGEX, newValue); } }); final Set<String> paramTypes = ComponentBuilder.getInstance() .getCompSystem().getAllDataTypes(); final I18nComboBoxCellEditor i18nParamTypesComboBoxEditor = new I18nComboBoxCellEditor(table, paramTypes.toArray(new String[paramTypes.size()]), SWT.READ_ONLY); getParamTableViewer().setCellEditors( new CellEditor[]{paramNameTextCellEditor, i18nParamTypesComboBoxEditor}); } /** * Creates the inner data model (m_parameters) */ private void createInnerDataModel() { if (!m_parameters.isEmpty()) { m_parameters.clear(); } List<IParamDescriptionPO> parameterList = getParamInterfaceObj().getParameterList(); for (IParamDescriptionPO descr : parameterList) { m_parameters.add(new Parameter(descr)); } } /** * @param parent the parent */ private void createTableButtons(Composite parent) { final Composite tableButtonArea = new Composite(parent, SWT.NONE); final GridLayout areaLayout = new GridLayout(1, true); tableButtonArea.setLayout(areaLayout); final GridData tableAreaGridData = new GridData(); tableAreaGridData.grabExcessVerticalSpace = true; tableAreaGridData.horizontalAlignment = GridData.FILL; tableAreaGridData.verticalAlignment = GridData.FILL; tableButtonArea.setLayoutData(tableAreaGridData); final GridData buttonsGridData = new GridData(); buttonsGridData.grabExcessHorizontalSpace = true; buttonsGridData.horizontalAlignment = GridData.FILL; createAddButton(tableButtonArea, buttonsGridData); createDeleteButton(tableButtonArea, buttonsGridData); LayoutUtil.createSeparator(tableButtonArea); createUpButton(tableButtonArea, buttonsGridData); createDownButton(tableButtonArea, buttonsGridData); } /** * @param parent the parent * @param layoutData the LayoutData * @return the Delete-Button */ private Button createDeleteButton(Composite parent, GridData layoutData) { final Button deleteButton = new Button(parent, SWT.NONE); deleteButton.setText(Messages.EditParametersDialogRemove); deleteButton.setLayoutData(layoutData); deleteButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { handleSelection(e); } public void widgetDefaultSelected(SelectionEvent e) { handleSelection(e); } /** * Handles the selection * @param e SelectionEvent */ private void handleSelection(SelectionEvent e) { removeSelectedParameter(); checkOkButtonEnablement(); } }); final SelectionBasedButtonEnabler buttonEnabler = new SelectionBasedButtonEnabler(deleteButton); getParamTableViewer().addSelectionChangedListener(buttonEnabler); afterDeleteButtonCreation(deleteButton, buttonEnabler); deleteButton.setEnabled( !getParamTableViewer().getSelection().isEmpty()); return deleteButton; } /** * subclasses may override * @param deleteButton the delete button * @param buttonEnabler the button enabler */ protected void afterDeleteButtonCreation(Button deleteButton, SelectionBasedButtonEnabler buttonEnabler) { // subclasses may override } /** * @param parent the parent * @param layoutData the LayoutData * @return the Up-Button */ private Button createUpButton(Composite parent, GridData layoutData) { final Button upButton = new Button(parent, SWT.NONE); upButton.setText(Messages.EditParametersDialogUp); upButton.setLayoutData(layoutData); upButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { handleSelection(e); } public void widgetDefaultSelected(SelectionEvent e) { handleSelection(e); } /** * Handles the selection * @param e SelectionEvent */ private void handleSelection(SelectionEvent e) { moveParameter(false); } }); final SelectionBasedButtonEnabler buttonEnabler = new SelectionBasedButtonEnabler(upButton); getParamTableViewer().addSelectionChangedListener(buttonEnabler); afterUpButtonCreation(upButton, buttonEnabler); upButton.setEnabled(!getParamTableViewer().getSelection().isEmpty()); return upButton; } /** * subclasses may override * @param upButton the up button * @param buttonEnabler the button enabler */ protected void afterUpButtonCreation(Button upButton, SelectionBasedButtonEnabler buttonEnabler) { // subclasses may override } /** * @param parent the parent * @param layoutData the LayoutData * @return the Up-Button */ private Button createDownButton(Composite parent, GridData layoutData) { final Button downButton = new Button(parent, SWT.NONE); downButton.setText(Messages.EditParametersDialogDown); downButton.setLayoutData(layoutData); downButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { handleSelection(e); } public void widgetDefaultSelected(SelectionEvent e) { handleSelection(e); } /** * Handles the selection * @param e SelectionEvent */ private void handleSelection(SelectionEvent e) { moveParameter(true); } }); final SelectionBasedButtonEnabler buttonEnabler = new SelectionBasedButtonEnabler(downButton); getParamTableViewer().addSelectionChangedListener(buttonEnabler); afterDownButtonCreation(downButton, buttonEnabler); downButton.setEnabled(!getParamTableViewer().getSelection().isEmpty()); return downButton; } /** * subclasses may override * @param downButton the down button * @param buttonEnabler the button enabler */ protected void afterDownButtonCreation(Button downButton, SelectionBasedButtonEnabler buttonEnabler) { // subclasses may override } /** * @param parent the parent * @param layoutData the LayoutData * @return the Add-Button */ private Button createAddButton(Composite parent, GridData layoutData) { final Button addButton = new Button(parent, SWT.NONE); addButton.setText(Messages.EditParametersDialogAdd); addButton.setLayoutData(layoutData); addButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { handleSelection(e); } public void widgetDefaultSelected(SelectionEvent e) { handleSelection(e); } /** * Handles the selection * @param e SelectionEvent */ private void handleSelection(SelectionEvent e) { addParameter(); checkOkButtonEnablement(); } }); afterAddButtonCreation(addButton); return addButton; } /** * subclasses may override * @param addButton the down button */ protected void afterAddButtonCreation(Button addButton) { // subclasses may override } /** * Adds a new Parameter to the table model */ private void addParameter() { String newParamName = DEFAULT_PARAM_NAME; boolean unique = true; int count = 0; do { for (Parameter p : m_parameters) { unique = true; if (p.getName().equals(newParamName)) { unique = false; newParamName = DEFAULT_PARAM_NAME + (++count); break; } } } while (!unique); final Parameter parameter = new Parameter(newParamName, DEFAULT_PARAM_TYPE); m_parameters.add(parameter); refreshTable(); selectRowInParameterTable(-1); getParamTableViewer().editElement(parameter, 0); } /** * selects a row in the parameter table and makes sure all listeners are * notified (which doesn't happen if you just call Tabke.setSelection()). * @param row valid row number or -1 for last row */ private void selectRowInParameterTable(final int row) { final boolean selectLast = (row == -1); final Table table = getParamTableViewer().getTable(); final int tableItemCount = table.getItemCount(); int index = row; if (selectLast) { index = tableItemCount - 1; if (index == -1) { // no entries in table return; } } if (index > tableItemCount) { // out of bounds return; } final Object selectedObject = getParamTableViewer().getElementAt(index); if (selectedObject != null) { getParamTableViewer().setSelection(new StructuredSelection( selectedObject)); } } /** * Removes the current selected Parameter from the table model. */ private void removeSelectedParameter() { if (!confirmDeleteParam()) { return; } final Table table = getParamTableViewer().getTable(); final int[] selectionIndices = table.getSelectionIndices(); for (int index : selectionIndices) { m_parameters.remove(index); } if (selectionIndices.length > 0) { int index = selectionIndices[selectionIndices.length - 1]; refreshTable(); final int tableItemCount = table.getItemCount(); if (index >= tableItemCount) { index = -1; // last row } selectRowInParameterTable(index); } } /** * Creates a Question Dialog for deleting a Parameter * @return true if the user clicks OK, false otherwise. */ private boolean confirmDeleteParam() { final Dialog dialog = ErrorHandlingUtil.createMessageDialog( MessageIDs.Q_CHANGE_INTERFACE_REMOVE_PARAM, null, null, getShell()); return dialog.getReturnCode() == Window.OK; } /** * Creates a Question Dialog for changing a Parameter type. * @return true if the user clicks OK, false otherwise. */ private boolean confirmChangeParamType() { final Dialog dialog = ErrorHandlingUtil.createMessageDialog( MessageIDs.Q_CHANGE_INTERFACE_CHANGE_PARAM_TYPE, null, null, getShell()); return dialog.getReturnCode() == Window.OK; } /** * @param parent the parent */ private void createNameField(final Composite parent) { final Composite nameFieldArea = new Composite(parent, SWT.NONE); final GridLayout areaLayout = new GridLayout(2, false); nameFieldArea.setLayout(areaLayout); final GridData tableAreaGridData = new GridData(); tableAreaGridData.horizontalAlignment = GridData.FILL; nameFieldArea.setLayoutData(tableAreaGridData); final Label nameLabel = new Label(nameFieldArea, SWT.NONE); nameLabel.setText(getEditedObjectNameString()); final Label nameField = new Label(nameFieldArea, SWT.SINGLE); final GridData nameFieldGridData = new GridData(); nameFieldGridData.grabExcessHorizontalSpace = true; nameFieldGridData.horizontalAlignment = GridData.FILL; nameField.setLayoutData(nameFieldGridData); nameField.setText(getParamInterfaceObj().getName()); } /** * @return the name to display for the currently edited object */ protected abstract String getEditedObjectNameString(); /** * @return The Parameters. */ public final List<Parameter> getParameters() { return m_parameters; } /** * Gets the column index of the given column name. * @param columnName a column name. * @return the column index of the given column name or -1 if no column * with the given name was found. */ private int getColumnIndex(String columnName) { int index = 0; for (String colName : TABLE_COLUMNS) { if (colName.equals(columnName)) { return index; } index++; } return -1; } /** * @param parameter The Parameter object. * @param columnIndex the index of the table column. * @return the table entry. */ private String getTableCellText(Parameter parameter, int columnIndex) { switch (columnIndex) { case NAME_TABLE_COLUMN: return parameter.getName(); case TYPE_TABLE_COLUMN: final String paramType = parameter.getType(); return CompSystemI18n.getString(paramType, true); default: StringBuilder msg = new StringBuilder(); msg.append(Messages.ColumnIndex) .append(StringConstants.SPACE) .append(StringConstants.APOSTROPHE) .append(columnIndex) .append(StringConstants.APOSTROPHE) .append(StringConstants.SPACE) .append(Messages.DoesNotExist) .append(StringConstants.EXCLAMATION_MARK); Assert.notReached(msg.toString()); break; } return EMPTY_ENTRY; } /** * @param value The value to set. * @param parameter The Parameter object. * @param columnIndex the column index. */ private void setTableCellText(Object value, Parameter parameter, int columnIndex) { switch (columnIndex) { case NAME_TABLE_COLUMN: changeParameterName(parameter, (String)value); break; case TYPE_TABLE_COLUMN: changeParameterType(parameter, (String)value); break; default: StringBuilder msg = new StringBuilder(); msg.append(Messages.ColumnIndex) .append(StringConstants.SPACE) .append(StringConstants.APOSTROPHE) .append(columnIndex) .append(StringConstants.APOSTROPHE) .append(StringConstants.SPACE) .append(Messages.DoesNotExist) .append(StringConstants.EXCLAMATION_MARK); Assert.notReached(msg.toString()); break; } refreshTable(); } /** * Changes the Parameter Name. * * @param parameter * the Parameter which name is to change. * @param name * the new name */ private void changeParameterName(Parameter parameter, String name) { if (parameter.getName().equals(name)) { return; } if (isNewParameter(parameter)) { parameter.setName(name); } else if (confirmChangeParamName()) { parameter.setName(name); } } /** * optional point to ask the user for permission; subclasses may override * * @return true if the param name change is ok */ protected boolean confirmChangeParamName() { return true; } /** * Changes the Parameter Type. * @param parameter the Parameter which type is to change. * @param type the type. */ private void changeParameterType(Parameter parameter, String type) { if (parameter.getType().equals(type)) { return; } if (isNewParameter(parameter)) { parameter.setType(type); } else if (confirmChangeParamType()) { // already used Parameter final int index = m_parameters.indexOf(parameter); final Parameter newParam = new Parameter(parameter.getName(), type); m_parameters.remove(parameter); m_parameters.add(index, newParam); } } /** * @param parameter * to check whether it's new * @return true if the parameter is a new one */ private boolean isNewParameter(Parameter parameter) { return parameter.getGuid() == null; } /** * Refreshes the m_paramTableViewer. */ private void refreshTable() { getParamTableViewer().refresh(); final Table table = getParamTableViewer().getTable(); table.setFocus(); } /** * @return the OK-Button of this dialog. */ private Button getOkButton() { return getButton(IDialogConstants.OK_ID); } /** * Checks the enablement of the OK-Button */ private void checkOkButtonEnablement() { getOkButton().setEnabled(isParamTableValid()); } /** * @return true if all entries of the parameter table are valid, * false otherwise. */ private boolean isParamTableValid() { for (Parameter param : getParameters()) { if (EMPTY_ENTRY.equals(param.getName().trim())) { setErrorMessage( Messages.EditParametersDialogEmptyParamName); return false; } else if (EMPTY_ENTRY.equals(param.getType().trim())) { setErrorMessage( Messages.EditParametersDialogEmptyParamName); return false; } else if (isDuplicate(param)) { setErrorMessage( NLS.bind( Messages.EditParametersDialogDuplicateParamName, param.getName())); return false; } } setErrorMessage(null); return true; } /** * * @param parameter A Parameter. * @return true if the given Parameter is a duplicate, false otherwise. */ private boolean isDuplicate(Parameter parameter) { int occurences = 0; for (Parameter param : m_parameters) { if (param.getName().equals(parameter.getName())) { occurences++; } if (occurences > 1) { return true; } } return false; } /** * Gets all indices of the given Parameter. * @param parameter a Parameter * @return an Array of indices. */ private Integer[] getIndices(Parameter parameter) { final List<Integer> occurenceIndices = new ArrayList<Integer>(); int index = 0; for (Parameter param : m_parameters) { if (param.getName().equals(parameter.getName())) { occurenceIndices.add(index); } index++; } return occurenceIndices.toArray(new Integer[occurenceIndices.size()]); } /** * Moves the selected Parameter up or down * * @param down * true moves down, false moves up. */ private void moveParameter(boolean down) { if (getParamTableViewer().getSelection() instanceof IStructuredSelection) { final Parameter param = (Parameter) ((IStructuredSelection)getParamTableViewer() .getSelection()).getFirstElement(); final int paramIdx = m_parameters.indexOf(param); final int newIdxDiff = 1; final int newIdx = down ? (paramIdx + newIdxDiff) : (paramIdx - newIdxDiff); if (newIdx < m_parameters.size() && newIdx > -1) { m_parameters.remove(paramIdx); m_parameters.add(newIdx, param); refreshTable(); } } } /** * @param paramTableViewer the paramTableViewer to set */ private void setParamTableViewer(TableViewer paramTableViewer) { m_paramTableViewer = paramTableViewer; } /** * @return the paramTableViewer */ protected TableViewer getParamTableViewer() { return m_paramTableViewer; } /** * @param paramInterfaceObj the paramInterfaceObj to set */ protected void setParamInterfaceObj( IParameterInterfacePO paramInterfaceObj) { m_paramInterfaceObj = paramInterfaceObj; } /** * @return the paramInterfaceObj */ protected IParameterInterfacePO getParamInterfaceObj() { return m_paramInterfaceObj; } }