/*******************************************************************************
* Copyright (c) 2008, 2010 Spring IDE Developers
* 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:
* Spring IDE Developers - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.ui.dialogs;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TrayDialog;
import org.eclipse.jface.resource.JFaceColors;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import org.springframework.beans.BeansException;
import org.springframework.ide.eclipse.core.internal.model.validation.ValidationRuleDefinition;
import org.springframework.ide.eclipse.core.model.validation.IValidationProblemMarker;
import org.springframework.ide.eclipse.core.model.validation.IValidationRule;
import org.springframework.util.StringUtils;
/**
* {@link Dialog} to configure property values for {@link IValidationRule}.
* @author Christian Dupuis
* @since 2.0.4
*/
public class ValidationRuleConfigurationDialog extends TrayDialog {
private final Map<String, String> propertyValues;
private final Map<String, Integer> messageSeverities;
private final String ruleName;
private final ValidationRuleDefinition validationRule;
private Label errorLabel;
private Button okButton;
private Set<PropertyModifyListener> propertyModifyListeners = new HashSet<PropertyModifyListener>();
private Set<SeverityModifyListener> severityModifyListeners = new HashSet<SeverityModifyListener>();
public ValidationRuleConfigurationDialog(Shell parentShell, Map<String, String> propertyValues,
Map<String, Integer> messageSeverities, ValidationRuleDefinition ruleDefinition) {
super(parentShell);
this.validationRule = ruleDefinition;
this.propertyValues = propertyValues;
this.messageSeverities = messageSeverities;
this.ruleName = ruleDefinition.getName();
}
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setText("Configure rule '" + ruleName + "'");
}
protected Control createDialogArea(Composite parent) {
Composite parentComposite = (Composite) super.createDialogArea(parent);
if (propertyValues.size() > 0) {
GridLayout layout = new GridLayout();
layout.numColumns = 1;
Group group = new Group(parentComposite, SWT.NULL);
group.setText("Properties");
group.setLayout(layout);
group.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite composite = new Composite(group, SWT.NULL);
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
composite.setLayout(layout);
// labelData.widthHint = 120;
GridData textData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL);
textData.widthHint = 450;
for (Map.Entry<String, String> entry : propertyValues.entrySet()) {
GridData labelData = new GridData();
labelData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL);
Label label = new Label(composite, SWT.NONE);
label.setText(validationRule.getPropertyDescription(entry.getKey()) + ":");
Point size = label.computeSize(SWT.DEFAULT, SWT.DEFAULT);
labelData.widthHint = size.x;
label.setLayoutData(labelData);
Text text = new Text(composite, SWT.SINGLE | SWT.BORDER);
text.setText(entry.getValue());
text.setLayoutData(textData);
PropertyModifyListener listener = new PropertyModifyListener(text, entry.getKey(), validationRule
.getRule().getClass());
text.addModifyListener(listener);
propertyModifyListeners.add(listener);
}
}
if (messageSeverities.size() > 0) {
GridLayout layout = new GridLayout();
layout.numColumns = 2;
Group group = new Group(parentComposite, SWT.NULL);
group.setText("Severities");
group.setLayout(layout);
group.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite severityComposite = new Composite(group, SWT.NULL);
severityComposite.setLayout(layout);
// severityComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
GridData textData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL);
// textData.widthHint = 450;
for (Map.Entry<String, Integer> entry : messageSeverities.entrySet()) {
GridData labelData = new GridData();
labelData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL);
Label label = new Label(severityComposite, SWT.NONE);
label.setText(validationRule.getMessageLabel(entry.getKey()) + ":");
Point size = label.computeSize(SWT.DEFAULT, SWT.DEFAULT);
labelData.widthHint = size.x;
label.setLayoutData(labelData);
Combo text = new Combo(severityComposite, SWT.SINGLE | SWT.BORDER | SWT.DROP_DOWN | SWT.READ_ONLY);
text.setItems(new String[] { "Error", "Warning", "Info", "Ignore" });
int severity = entry.getValue();
switch (severity) {
case IValidationProblemMarker.SEVERITY_ERROR:
text.select(0);
break;
case IValidationProblemMarker.SEVERITY_WARNING:
text.select(1);
break;
case IValidationProblemMarker.SEVERITY_INFO:
text.select(2);
break;
default:
text.select(3);
break;
}
text.setLayoutData(textData);
SeverityModifyListener listener = new SeverityModifyListener(text, entry.getKey());
text.addModifyListener(listener);
severityModifyListeners.add(listener);
}
}
errorLabel = new Label(parentComposite, SWT.NONE);
errorLabel.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
errorLabel.setForeground(JFaceColors.getErrorText(parent.getDisplay()));
errorLabel.setBackground(JFaceColors.getErrorBackground(parent.getDisplay()));
applyDialogFont(parentComposite);
return parentComposite;
}
protected void createButtonsForButtonBar(Composite parent) {
// create OK and Cancel buttons by default
okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
}
protected void buttonPressed(int buttonId) {
if (buttonId == IDialogConstants.OK_ID) {
for (PropertyModifyListener listener : propertyModifyListeners) {
propertyValues.put(listener.getName(), listener.getValue());
}
for (SeverityModifyListener listener : severityModifyListeners) {
messageSeverities.put(listener.getName(), listener.getValue());
}
}
super.buttonPressed(buttonId);
}
private void setErrorLabel(String error) {
errorLabel.setText(error);
okButton.setEnabled(!StringUtils.hasText(error));
}
private class PropertyModifyListener implements ModifyListener {
private final Text text;
private final String name;
private final BeanWrapper wrapper;
public PropertyModifyListener(Text text, String name, Class ruleClass) {
this.wrapper = new BeanWrapperImpl(ruleClass);
this.text = text;
this.name = name;
}
public void modifyText(ModifyEvent e) {
String value = getValue();
try {
wrapper.setPropertyValue(name, value);
setErrorLabel("");
}
catch (BeansException ex) {
setErrorLabel("Value '" + value + "' is not valid for property '" + name + "'");
}
}
public String getValue() {
return text.getText();
}
public String getName() {
return name;
}
}
private class SeverityModifyListener implements ModifyListener {
private final Combo text;
private final String name;
public SeverityModifyListener(Combo text, String name) {
this.text = text;
this.name = name;
}
public Integer getValue() {
String severity = text.getText();
if ("Error".equals(severity)) {
return IValidationProblemMarker.SEVERITY_ERROR;
}
else if ("Warning".equals(severity)) {
return IValidationProblemMarker.SEVERITY_WARNING;
}
else if ("Info".equals(severity)) {
return IValidationProblemMarker.SEVERITY_INFO;
}
else {
return IValidationProblemMarker.SEVERITY_UNKOWN;
}
}
public String getName() {
return name;
}
public void modifyText(ModifyEvent e) {
}
}
}