/******************************************************************************* * Copyright (c) 2005, 2015 Zend Technologies and others. * 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: * Zend Technologies - initial API and implementation *******************************************************************************/ package org.eclipse.php.refactoring.ui.wizard; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.dltk.internal.corext.refactoring.RefactoringCoreMessages; import org.eclipse.dltk.internal.ui.dialogs.TextFieldNavigationHandler; import org.eclipse.dltk.internal.ui.refactoring.RefactoringMessages; import org.eclipse.jface.dialogs.StatusDialog; import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.osgi.util.NLS; import org.eclipse.php.refactoring.core.extract.function.ParameterInfo; import org.eclipse.php.refactoring.ui.RefactoringUIPlugin; import org.eclipse.php.refactoring.ui.utils.PHPConventionsUtil; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; public class ParameterEditDialog extends StatusDialog { private final ParameterInfo fParameter; private final boolean fEditDefault; private final StubTypeContext fContext; private Text fType; // XXX: never set private Text fName; private Text fDefaultValue; /** * @param parentShell * @param parameter * @param canEditType * @param canEditDefault * @param context * the <code>IPackageFragment</code> for type ContentAssist. Can * be <code>null</code> if <code>canEditType</code> is * <code>false</code>. */ public ParameterEditDialog(Shell parentShell, ParameterInfo parameter, boolean canEditDefault, StubTypeContext context) { super(parentShell); fParameter = parameter; fEditDefault = canEditDefault; fContext = context; } protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell.setText(RefactoringMessages.ParameterEditDialog_title); } protected Control createDialogArea(Composite parent) { Composite result = (Composite) super.createDialogArea(parent); GridLayout layout = (GridLayout) result.getLayout(); layout.numColumns = 2; Label label; GridData gd; label = new Label(result, SWT.NONE); String newName = fParameter.getNewDisplayName(); if (newName.length() == 0) label.setText(RefactoringMessages.ParameterEditDialog_message_new); else { label.setText(NLS.bind(RefactoringMessages.ParameterEditDialog_message, newName)); } gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; label.setLayoutData(gd); label = new Label(result, SWT.NONE); fName = new Text(result, SWT.BORDER); initializeDialogUnits(fName); label.setText(RefactoringMessages.ParameterEditDialog_name); gd = new GridData(GridData.FILL_HORIZONTAL); gd.widthHint = convertWidthInCharsToPixels(45); fName.setLayoutData(gd); fName.setText(newName); fName.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { validate((Text) e.widget); } }); TextFieldNavigationHandler.install(fName); if (fEditDefault && fParameter.isAdded()) { label = new Label(result, SWT.NONE); label.setText(RefactoringMessages.ParameterEditDialog_defaultValue); fDefaultValue = new Text(result, SWT.BORDER); gd = new GridData(GridData.FILL_HORIZONTAL); fDefaultValue.setLayoutData(gd); fDefaultValue.setText(fParameter.getDefaultValue()); fDefaultValue.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { validate((Text) e.widget); } }); TextFieldNavigationHandler.install(fDefaultValue); } applyDialogFont(result); return result; } protected void okPressed() { if (fType != null) { fParameter.setNewTypeName(fType.getText()); } fParameter.setNewName(fName.getText()); if (fDefaultValue != null) { fParameter.setDefaultValue(fDefaultValue.getText()); } super.okPressed(); } private void validate(Text first) { IStatus[] result = new IStatus[3]; if (first == fType) { result[0] = validateType(); result[1] = validateName(); result[2] = validateDefaultValue(); } else if (first == fName) { result[0] = validateName(); result[1] = validateType(); result[2] = validateDefaultValue(); } else { result[0] = validateDefaultValue(); result[1] = validateName(); result[2] = validateType(); } for (int i = 0; i < result.length; i++) { IStatus status = result[i]; if (status != null && !status.isOK()) { updateStatus(status); return; } } updateStatus(createOkStatus()); } private IStatus validateType() { if (fType == null) return null; String type = fType.getText(); RefactoringStatus status = PHPConventionsUtil.checkParameterTypeSyntax(type, fContext.getCuHandle().getSourceModule().getScriptProject()); if (status == null || status.isOK()) return createOkStatus(); if (status.hasError()) return createErrorStatus(status.getEntryWithHighestSeverity().getMessage()); else return createWarningStatus(status.getEntryWithHighestSeverity().getMessage()); } private IStatus validateName() { if (fName == null) return null; String text = fName.getText(); if (text.length() == 0) return createErrorStatus(RefactoringMessages.ParameterEditDialog_name_error); IStatus status = PHPConventionsUtil.validateFieldName(text); if (status.matches(IStatus.ERROR)) return status; if (!PHPConventionsUtil.startsWithLowerCase(text)) return createWarningStatus(RefactoringCoreMessages.ExtractTempRefactoring_convention); return createOkStatus(); } private IStatus validateDefaultValue() { if (fDefaultValue == null) return null; String defaultValue = fDefaultValue.getText(); if (defaultValue.length() == 0) return createErrorStatus(RefactoringMessages.ParameterEditDialog_defaultValue_error); // if (ChangeSignatureProcessor.isValidExpression(defaultValue)) // return createOkStatus(); String msg = RefactoringMessages.bind(RefactoringMessages.ParameterEditDialog_defaultValue_invalid, new String[] { defaultValue }); return createErrorStatus(msg); } private Status createOkStatus() { return new Status(IStatus.OK, RefactoringUIPlugin.PLUGIN_ID, IStatus.OK, "", null); //$NON-NLS-1$ } private Status createWarningStatus(String message) { return new Status(IStatus.WARNING, RefactoringUIPlugin.PLUGIN_ID, IStatus.WARNING, message, null); } private Status createErrorStatus(String message) { return new Status(IStatus.ERROR, RefactoringUIPlugin.PLUGIN_ID, IStatus.ERROR, message, null); } }