// ============================================================================ // // Copyright (C) 2006-2012 Talend Inc. - www.talend.com // // This source code is available under agreement available at // %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt // // You should have received a copy of the agreement // along with this program; if not, write to Talend SA // 9 rue Pages 92150 Suresnes, France // // ============================================================================ package org.talend.designer.core.ui.wizards; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; 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; import org.talend.core.language.ECodeLanguage; import org.talend.core.language.LanguageManager; import org.talend.core.model.metadata.MetadataTalendType; import org.talend.core.model.metadata.types.ContextParameterJavaTypeManager; import org.talend.core.model.metadata.types.JavaType; import org.talend.core.model.process.IContext; import org.talend.core.model.process.IContextManager; import org.talend.core.model.process.IContextParameter; import org.talend.designer.core.DesignerPlugin; import org.talend.designer.core.i18n.Messages; /** * Wizard used to add a new context parameter. * * $Id: ContextParameterPage.java 77219 2012-01-24 01:14:15Z mhirt $ * */ public class ContextParameterPage extends WizardPage { private IContextParameter parameter; private Set<String> existingParameterNames; /** Name. */ private Text nameText; /** Should Prompt. */ private Button promptBtn; /** Prompt text. */ private Text promptText; /** Type. */ private ComboViewer typeViewer; /** Default. */ private Text defaultText; /** Comment. */ private Text commentText; private IStatus nameStatus; private IStatus promptStatus; private IStatus typeStatus; private IStatus defaultStatus; private IStatus commentStatus; private IContextManager contextManager; /** * Constructs a new ContextParameterPage. * * @param contextManager */ public ContextParameterPage(IContextManager contextManager) { super("ContextParameterPage"); //$NON-NLS-1$ this.contextManager = contextManager; setTitle(Messages.getString("ContextParameterPage.title")); //$NON-NLS-1$ setDescription(Messages.getString("ContextParameterPage.description")); //$NON-NLS-1$ nameStatus = createOkStatus(); commentStatus = createOkStatus(); typeStatus = createOkStatus(); promptStatus = createOkStatus(); defaultStatus = createOkStatus(); } /* * (non-Javadoc) * * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite) */ public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(2, false); container.setLayout(layout); GridData data; // Name Label nameLabel = new Label(container, SWT.NONE); nameLabel.setText(Messages.getString("ContextParameterPage.name")); //$NON-NLS-1$ nameText = new Text(container, SWT.BORDER); nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // Comment Label commentLabel = new Label(container, SWT.NONE); commentLabel.setText(Messages.getString("ContextParameterPage.comment")); //$NON-NLS-1$ commentLabel.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING)); commentText = new Text(container, SWT.BORDER | SWT.MULTI | SWT.WRAP); data = new GridData(GridData.FILL_HORIZONTAL); data.heightHint = 60; commentText.setLayoutData(data); // Type Label typeLabel = new Label(container, SWT.NONE); typeLabel.setText(Messages.getString("ContextParameterPage.type")); //$NON-NLS-1$ typeViewer = new ComboViewer(container, SWT.BORDER | SWT.READ_ONLY); typeViewer.setContentProvider(new ArrayContentProvider()); typeViewer.setLabelProvider(new LabelProvider()); typeViewer.setInput(MetadataTalendType.getCxtParameterTalendTypesLabels()); typeViewer.getControl().setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // Prompt Label promptLabel = new Label(container, SWT.NONE); promptLabel.setText(Messages.getString("ContextParameterPage.prompt")); //$NON-NLS-1$ promptText = new Text(container, SWT.BORDER); promptText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // Prompt new Label(container, SWT.NONE); promptBtn = new Button(container, SWT.CHECK); promptBtn.setText(Messages.getString("ContextParameterPage.shouldPrompt")); //$NON-NLS-1$ // Default Label defaultLabel = new Label(container, SWT.NONE); defaultLabel.setText(Messages.getString("ContextParameterPage.defaultValue")); //$NON-NLS-1$ defaultText = new Text(container, SWT.BORDER); defaultText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); setControl(container); updateContent(); addListeners(); updatePageComplete(); } private void addListeners() { nameText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (nameText.getText().length() == 0) { nameStatus = new Status(IStatus.ERROR, DesignerPlugin.ID, IStatus.OK, Messages .getString("ContextParameterPage.nameEmpty"), null); //$NON-NLS-1$ } else if (existingParameterNames.contains(nameText.getText())) { nameStatus = new Status(IStatus.ERROR, DesignerPlugin.ID, IStatus.OK, Messages .getString("ContextParameterPage.nameExists"), null); //$NON-NLS-1$ } else if (!contextManager.checkValidParameterName(null, nameText.getText())) { nameStatus = new Status(IStatus.ERROR, DesignerPlugin.ID, IStatus.OK, "Parameter name is not valid.", null); //$NON-NLS-1$ } else { nameStatus = createOkStatus(); } parameter.setName(StringUtils.trimToEmpty(nameText.getText())); updatePageStatus(); } }); commentText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (commentText.getText().length() == 0) { commentStatus = new Status(IStatus.WARNING, DesignerPlugin.ID, IStatus.OK, Messages .getString("ContextParameterPage.commentEmpty"), //$NON-NLS-1$ null); } else { commentStatus = createOkStatus(); } parameter.setComment(StringUtils.trimToEmpty(commentText.getText())); updatePageStatus(); } }); final ECodeLanguage curLanguage = LanguageManager.getCurrentLanguage(); typeViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { String type; if (event.getSelection().isEmpty()) { typeStatus = new Status(IStatus.ERROR, DesignerPlugin.ID, IStatus.OK, Messages .getString("ContextParameterPage.typeEmpty"), null); //$NON-NLS-1$ type = null; } else { typeStatus = createOkStatus(); type = (String) ((IStructuredSelection) event.getSelection()).getFirstElement(); } if (curLanguage == ECodeLanguage.JAVA) { type = getJavaDisplayedType(type); } final String value = parameter.getValue(); parameter.setType(type); // value will be empty parameter.setValue(value); // revert the value updatePageStatus(); } }); PromptListener promptListener = new PromptListener(); promptText.addModifyListener(promptListener); promptBtn.addSelectionListener(promptListener); defaultText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (defaultText.getText().length() == 0) { defaultStatus = new Status(IStatus.WARNING, DesignerPlugin.ID, IStatus.OK, Messages .getString("ContextParameterPage.defaultValueEmpty"), null); //$NON-NLS-1$ } else { defaultStatus = createOkStatus(); } parameter.setValue(StringUtils.trimToEmpty(defaultText.getText())); updatePageStatus(); } }); } private String getJavaDisplayedType(String originalTypedValue) { JavaType javaType; javaType = ContextParameterJavaTypeManager.getJavaTypeFromLabel(originalTypedValue); String type; if (javaType == null) { type = MetadataTalendType.getDefaultTalendType(); } else { type = javaType.getId(); } return type; } public void setParameter(IContextParameter contextParameter, List<? extends IContext> contexts) { this.parameter = contextParameter; existingParameterNames = new HashSet<String>(); for (IContext context : contexts) { for (IContextParameter ctxPrm : context.getContextParameterList()) { existingParameterNames.add(ctxPrm.getName()); } } } private void updateContent() { nameText.setText(StringUtils.trimToEmpty(parameter.getName())); commentText.setText(StringUtils.trimToEmpty(parameter.getComment())); typeViewer.setSelection(parameter.getType() != null ? new StructuredSelection(parameter.getType()) : StructuredSelection.EMPTY, true); promptText.setText(StringUtils.trimToEmpty(parameter.getPrompt())); promptBtn.setSelection(parameter.isPromptNeeded()); defaultText.setText(StringUtils.trimToEmpty(parameter.getValue())); } private void updatePageStatus() { setMessage(findMostSevere()); updatePageComplete(); } private void updatePageComplete() { setPageComplete(getErrorMessage() == null && StringUtils.isNotEmpty(parameter.getName()) && parameter.getType() != null && (!parameter.isPromptNeeded() || StringUtils.isNotEmpty(parameter.getPrompt()))); } private IStatus findMostSevere() { IStatus[] statuses = getStatuses(); IStatus severeStatus = statuses[0]; for (IStatus status : statuses) { if (status.getSeverity() > severeStatus.getSeverity()) { severeStatus = status; } } return severeStatus; } private void setMessage(IStatus status) { if (IStatus.ERROR == status.getSeverity()) { setErrorMessage(status.getMessage()); // setMessage(""); //$NON-NLS-1$ } else { if (StringUtils.isNotEmpty(status.getMessage())) { setMessage(status.getMessage(), status.getSeverity()); } else { setMessage(getDescription()); } setErrorMessage(null); } } private IStatus[] getStatuses() { return new IStatus[] { nameStatus, commentStatus, typeStatus, promptStatus, defaultStatus }; } private static IStatus createOkStatus() { return new Status(IStatus.OK, DesignerPlugin.ID, IStatus.OK, "", null); //$NON-NLS-1$ } /** * Listener on prompt changes. <br/> * * $Id: ContextParameterPage.java 77219 2012-01-24 01:14:15Z mhirt $ * */ private class PromptListener extends SelectionAdapter implements ModifyListener { public void modifyText(ModifyEvent e) { updateStatus(); } @Override public void widgetSelected(SelectionEvent e) { updateStatus(); } private void updateStatus() { if (promptText.getText().length() == 0 && promptBtn.getSelection()) { promptStatus = new Status(IStatus.ERROR, DesignerPlugin.ID, IStatus.OK, Messages.getString("ContextParameterPage.promptEmpty"), null); //$NON-NLS-1$ } else { promptStatus = createOkStatus(); } parameter.setPrompt(StringUtils.trimToEmpty(promptText.getText())); parameter.setPromptNeeded(promptBtn.getSelection()); updatePageStatus(); } } }