/*******************************************************************************
* Copyright (c) 2000, 2012 IBM Corporation 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:
* IBM Corporation - initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.StatusDialog;
import org.eclipse.osgi.util.NLS;
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.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.Text;
import org.eclipse.cdt.core.CConventions;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.ui.dialogs.TextFieldNavigationHandler;
import org.eclipse.cdt.internal.ui.viewsupport.BasicElementLabels;
public class ParameterEditDialog extends StatusDialog {
private final NameInformation fParameter;
private final boolean fEditType;
private final boolean fEditDefault;
private final boolean fEditReturn;
private Text fType;
private Text fName;
private Text fDefaultValue;
private Button fReturn;
/**
* @param parentShell
* @param parameter
* @param canEditType
* @param canEditDefault
* @param canChangeReturn
* Can be <code>null</code> if <code>canEditType</code> is <code>false</code>.
*/
public ParameterEditDialog(Shell parentShell, NameInformation parameter, boolean canEditType,
boolean canEditDefault, boolean canChangeReturn) {
super(parentShell);
fParameter= parameter;
fEditType= canEditType;
fEditDefault= canEditDefault;
fEditReturn = canChangeReturn;
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(Messages.ParameterEditDialog_title);
}
@Override
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.getNewName();
if (newName.isEmpty()) {
label.setText(Messages.ParameterEditDialog_message_new);
} else {
label.setText(NLS.bind(Messages.ParameterEditDialog_message,
BasicElementLabels.getCElementName(newName)));
}
gd= new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan= 2;
label.setLayoutData(gd);
if (fEditType) {
label= new Label(result, SWT.NONE);
label.setText(Messages.ParameterEditDialog_type);
fType= new Text(result, SWT.BORDER);
gd= new GridData(GridData.FILL_HORIZONTAL);
fType.setLayoutData(gd);
fType.setText(fParameter.getTypeName());
fType.addModifyListener(
new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
validate((Text) e.widget);
}
});
TextFieldNavigationHandler.install(fType);
}
label= new Label(result, SWT.NONE);
fName= new Text(result, SWT.BORDER);
initializeDialogUnits(fName);
label.setText(Messages.ParameterEditDialog_name);
gd= new GridData(GridData.FILL_HORIZONTAL);
gd.widthHint= convertWidthInCharsToPixels(45);
fName.setLayoutData(gd);
fName.setText(newName);
fName.addModifyListener(
new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
validate((Text) e.widget);
}
});
TextFieldNavigationHandler.install(fName);
if (fEditDefault && fParameter.isAdded()) {
label= new Label(result, SWT.NONE);
label.setText(Messages.ParameterEditDialog_default_value);
fDefaultValue= new Text(result, SWT.BORDER);
gd= new GridData(GridData.FILL_HORIZONTAL);
fDefaultValue.setLayoutData(gd);
fDefaultValue.setText(fParameter.getDefaultValue());
fDefaultValue.addModifyListener(
new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
validate((Text) e.widget);
}
});
TextFieldNavigationHandler.install(fDefaultValue);
}
if (fEditReturn) {
fReturn = new Button(result, SWT.CHECK);
fReturn.setText(Messages.ParameterEditDialog_use_as_return);
fReturn.setSelection(fParameter.isReturnValue());
fReturn.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
}
applyDialogFont(result);
return result;
}
@Override
protected void okPressed() {
if (fType != null) {
fParameter.setTypeName(fType.getText());
}
fParameter.setNewName(fName.getText());
if (fDefaultValue != null) {
fParameter.setDefaultValue(fDefaultValue.getText());
}
if (fReturn != null) {
fParameter.setReturnValue(fReturn.getSelection());
}
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(Status.OK_STATUS);
}
private IStatus validateType() {
// TODO(sprigogin): Implement type validation.
return Status.OK_STATUS;
}
private IStatus validateName() {
if (fName == null)
return null;
String name= fName.getText();
if (name.isEmpty())
return createErrorStatus(Messages.ParameterEditDialog_name_error);
IStatus status= CConventions.validateFieldName(name);
if (status.matches(IStatus.ERROR))
return status;
return Status.OK_STATUS;
}
private IStatus validateDefaultValue() {
if (fDefaultValue == null)
return null;
String defaultValue= fDefaultValue.getText();
if (defaultValue.isEmpty())
return createErrorStatus(Messages.ParameterEditDialog_default_value_error);
// TODO(sprigogin): Implement real default value validation.
return Status.OK_STATUS;
}
private Status createErrorStatus(String message) {
return new Status(IStatus.ERROR, CUIPlugin.getPluginId(), IStatus.ERROR, message, null);
}
}