/*******************************************************************************
* Copyright (c) 2005, 2009 Intel 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:
* Intel Corporation - Initial API and implementation
* IBM Corporation
*******************************************************************************/
package org.eclipse.cdt.ui.newui;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.internal.ui.newui.Messages;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.JFacePreferences;
import org.eclipse.jface.resource.JFaceResources;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
/**
* @noextend This class is not intended to be subclassed by clients.
*/
public class RenameConfigurationDialog extends Dialog {
// Widgets
private Text configName;
private Text configDescription;
private ICConfigurationDescription[] cfgds;
private ICConfigurationDescription renameConfig;
private String newName;
private String newDescription;
private Label statusLabel;
private String originalName;
final private String title;
/**
*/
protected RenameConfigurationDialog(Shell parentShell,
ICConfigurationDescription _renameConfig,
ICConfigurationDescription[] _cfgds,
String _title) {
super(parentShell);
title = _title;
renameConfig = _renameConfig;
cfgds = _cfgds;
setShellStyle(getShellStyle()|SWT.RESIZE);
newName = renameConfig.getName();
newDescription = renameConfig.getDescription();
if(newDescription == null) newDescription = new String();
originalName = renameConfig.getName();
}
/* (non-Javadoc)
* Method declared on Dialog. Cache the name and base config selections.
* We don't have to worry that the index or name is wrong because we
* enable the OK button IFF those conditions are met.
*/
@Override
protected void buttonPressed(int buttonId) {
if (buttonId == IDialogConstants.OK_ID) {
newName = configName.getText().trim();
newDescription = configDescription.getText().trim();
}
super.buttonPressed(buttonId);
}
/* (non-Javadoc)
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
@Override
protected void configureShell(Shell shell) {
super.configureShell(shell);
if (title != null) shell.setText(title);
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
*/
@Override
protected void createButtonsForButtonBar(Composite parent) {
super.createButtonsForButtonBar(parent);
configName.setFocus();
if (configName != null) {
configName.setText(newName);
}
validateState();
}
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = new Composite(parent, SWT.NULL);
composite.setFont(parent.getFont());
composite.setLayout(new GridLayout(3, false));
composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// Create a group for the name & description
final Group group1 = new Group(composite, SWT.NONE);
group1.setFont(composite.getFont());
GridLayout layout1 = new GridLayout(3, false);
group1.setLayout(layout1);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 3;
group1.setLayoutData(gd);
// bug 187634: Add a label to warn user that configuration name will be used directly
// as a directory name in the filesystem.
Label warningLabel = new Label(group1, SWT.BEGINNING | SWT.WRAP);
warningLabel.setFont(parent.getFont());
warningLabel.setText(Messages.RenameConfiguration_label_warning);
gd = new GridData(SWT.FILL, SWT.BEGINNING, true, false, 3, 1);
gd.widthHint = 300;
warningLabel.setLayoutData(gd);
// Add a label and a text widget for Configuration's name
final Label nameLabel = new Label(group1, SWT.LEFT);
nameLabel.setFont(parent.getFont());
nameLabel.setText(Messages.RenameConfiguration_label_name);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 1;
gd.grabExcessHorizontalSpace = false;
nameLabel.setLayoutData(gd);
configName = new Text(group1, SWT.SINGLE | SWT.BORDER);
configName.setFont(group1.getFont());
configName.setText(getNewName());
configName.setFocus();
gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan = 2;
gd.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
configName.setLayoutData(gd);
configName.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
validateState();
}
});
// Add a label and a text widget for Configuration's description
final Label descriptionLabel = new Label(group1, SWT.LEFT);
descriptionLabel.setFont(parent.getFont());
descriptionLabel.setText(Messages.RenameConfiguration_label_description);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 1;
gd.grabExcessHorizontalSpace = false;
descriptionLabel.setLayoutData(gd);
configDescription = new Text(group1, SWT.SINGLE | SWT.BORDER);
configDescription.setFont(group1.getFont());
configDescription.setText(getNewDescription());
configDescription.setFocus();
gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan = 2;
gd.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
configDescription.setLayoutData(gd);
statusLabel = new Label(parent, SWT.CENTER);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 3;
statusLabel.setLayoutData(gd);
statusLabel.setFont(composite.getFont());
statusLabel.setForeground(JFaceResources.getColorRegistry().get(JFacePreferences.ERROR_COLOR));
return composite;
}
protected boolean isDuplicateName(String newName) {
if(newName.equals(originalName)) return false;
// Return true if there is already a config of that name defined
for (int i = 0; i < cfgds.length; i++) {
if (cfgds[i].getName().equals(newName)) return true;
}
return false;
}
protected boolean isSimilarName(String newName) {
if(newName.equalsIgnoreCase(originalName)) return false;
// Return true if there is already a config of that name defined on the target
for (int i = 0; i < cfgds.length; i++) {
if (cfgds[i].getName().equalsIgnoreCase(newName)) return true;
}
return false;
}
/* (non-Javadoc)
* Checks the argument for leading whitespaces and invalid directory name characters.
* @param name
* @return <I>true</i> is the name is a valid directory name with no whitespaces
*/
private boolean validateName(String name) {
// Iterate over the name checking for bad characters
char[] chars = name.toCharArray();
// No whitespaces at the start of a name
if (Character.isWhitespace(chars[0])) {
return false;
}
for (int index = 0; index < chars.length; ++index) {
// Config name must be a valid dir name too, so we ban "\ / : * ? " < >" in the names
if (!Character.isLetterOrDigit(chars[index])) {
switch (chars[index]) {
case '/':
case '\\':
case ':':
case '*':
case '?':
case '\"':
case '<':
case '>':
return false;
default:
break;
}
}
}
return true;
}
/* (non-Javadoc)
* Update the status message and button state based on the input selected
* by the user
*
*/
private void validateState() {
String s = null;
String currentName = configName.getText().trim();
// Make sure that the name is at least one character in length
if (currentName.length() == 0) {
s = ""; //$NON-NLS-1$
// Make sure the name is not a duplicate
} else if (isDuplicateName(currentName)) {
s = NLS.bind(Messages.RenameConfiguration_error_duplicateName, currentName);
} else if (isSimilarName(currentName)) {
s = NLS.bind(Messages.RenameConfiguration_error_caseName, currentName);
} else if (!validateName(currentName)) {
s = NLS.bind(Messages.RenameConfiguration_error_invalidName, currentName);
}
Button b = getButton(IDialogConstants.OK_ID);
if (s != null) {
statusLabel.setText(s);
statusLabel.setVisible(true);
if (b != null) b.setEnabled(false);
} else {
statusLabel.setVisible(false);
if (b != null) b.setEnabled(true);
}
return;
}
public String getNewName() { return newName; }
public String getNewDescription() { return newDescription; }
}