/*****************************************************************************
* Copyright (c) 2011 CEA LIST.
*
* 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:
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
*****************************************************************************/
package org.eclipse.papyrus.infra.widgets.editors;
import java.util.Collections;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.papyrus.infra.widgets.Activator;
import org.eclipse.papyrus.infra.widgets.providers.IStaticContentProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.SelectionDialog;
/**
* A Dialog used to input a String. The dialog uses a IInputValidator
* to check the string, and can display an error message.
*
* @author Camille Letavernier
*/
public class InputDialog extends SelectionDialog {
/**
* The initial value for the string
*/
protected String initialValue;
/**
* The string validator
*/
protected IInputValidator validator;
/**
* The label used to display the error message
*/
protected Label errorLabel;
/**
* The label used to display the error icon
*/
protected Label errorImage;
/**
* The text widget used to input a new string
*/
protected AbstractValueEditor editor;
/**
* The dialog's title
*/
protected String title;
/**
* The label describing the kind of text to input
*/
protected String labelText;
/**
* The content provider used to suggest predefined values to the user
*/
protected IStaticContentProvider contentProvider;
/**
*
* Constructor.
*
* @param parentShell
* The shell in which the dialog will be opened
* @param title
* The dialog's title
* @param initialValue
* The dialog's initial value
* @param validator
* The validator used to check the input string
*/
public InputDialog(Shell parentShell, String title, String label, String initialValue, IInputValidator validator) {
super(parentShell);
this.initialValue = initialValue;
this.validator = validator;
this.title = title;
this.labelText = label;
}
@Override
protected Composite getDialogArea() {
return (Composite)super.getDialogArea();
}
@Override
public void create() {
super.create();
((GridLayout)getDialogArea().getLayout()).numColumns = 2;
errorImage = new Label(getDialogArea(), SWT.NONE);
errorImage.setImage(Activator.getDefault().getImage("/icons/error.gif")); //$NON-NLS-1$
errorLabel = new Label(getDialogArea(), SWT.NONE);
errorLabel.setVisible(false);
Label label = new Label(getDialogArea(), SWT.None);
if(labelText != null) {
label.setText(labelText);
}
label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
if(contentProvider != null) {
editor = new StringCombo(getDialogArea(), SWT.BORDER);
((StringCombo)editor).setValue(initialValue);
((StringCombo)editor).setContentProvider(contentProvider);
} else {
editor = new StringEditor(getDialogArea(), SWT.BORDER) {
//FIXME: The StringEditor (Or one of its superclasses) should be responsible for forwarding this call
@Override
public void addKeyListener(KeyListener keyListener) {
super.text.addKeyListener(keyListener);
}
};
((StringEditor)editor).setValue(initialValue);
}
// input = new Text(getDialogArea(), SWT.BORDER);
// input.setText(initialValue);
editor.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
editor.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
//Nothing
}
public void keyReleased(KeyEvent e) {
validate();
}
});
getShell().setImage(Activator.getDefault().getImage("/icons/papyrus.png")); //$NON-NLS-1$
if(title != null) {
getShell().setText(title);
}
validate();
getShell().pack();
}
/**
* Validates the current string. If the string isn't valid,
* and error message will be displayed.
*/
protected void validate() {
if(validator == null) {
errorLabel.setVisible(false);
errorImage.setVisible(false);
getOkButton().setEnabled(true);
return;
}
String errorMessage = validator.isValid((String)editor.getValue());
if(errorMessage == null) {
errorLabel.setVisible(false);
errorImage.setVisible(false);
getOkButton().setEnabled(true);
} else {
errorLabel.setText(errorMessage);
errorLabel.setVisible(true);
errorImage.setVisible(true);
getOkButton().setEnabled(false);
}
getDialogArea().layout(true);
}
@Override
protected void okPressed() {
setResult(Collections.singletonList((String)editor.getValue()));
super.okPressed();
}
/**
* @return the input text from this dialog, or null
* if the dialog has been canceled
*/
public String getText() {
Object[] result = getResult();
if(result == null || result.length == 0) {
return null;
}
return (String)result[0];
}
/**
* Sets a content provider to suggest predefined values to the user
*
* @param contentProvider
*/
public void setContentProvider(IStaticContentProvider contentProvider) {
this.contentProvider = contentProvider;
}
}