/*******************************************************************************
* Copyright (c) 2007 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.webflow.ui.properties;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.resource.JFaceColors;
import org.eclipse.jface.viewers.CheckboxTableViewer;
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.springframework.ide.eclipse.beans.core.BeansCorePlugin;
import org.springframework.ide.eclipse.beans.core.model.IBeansProject;
import org.springframework.ide.eclipse.beans.ui.navigator.BeansNavigatorSorter;
import org.springframework.ide.eclipse.core.model.IModelElement;
import org.springframework.ide.eclipse.webflow.core.Activator;
import org.springframework.ide.eclipse.webflow.core.model.IWebflowConfig;
import org.springframework.ide.eclipse.webflow.core.model.IWebflowProject;
/**
* @author Christian Dupuis
* @since 2.0
*/
public class WebflowConfigDialog extends Dialog {
private static final int BEANS_CONFIG_LIST_VIEWER_HEIGHT = 150;
private static final int LIST_VIEWER_WIDTH = 340;
private CheckboxTableViewer beansConfigSetViewer;
private Text nameText;
private Button okButton;
private Label errorLabel;
private String title;
private IProject project;
private Set<IModelElement> beansConfig;
private List<String> config;
private IFile file;
/**
*
*
* @param project
* @param beansConfig
* @param parent
*/
public WebflowConfigDialog(Shell parent, IProject project,
Set<IModelElement> beansConfig, List<String> config, IFile file) {
super(parent);
this.project = project;
this.config = config;
this.beansConfig = beansConfig;
this.title = "Link to Spring configs";
String name = config.get(0);
if (name == null) {
int i = file.getName().lastIndexOf('.');
if (i > 0) {
name = file.getName().substring(0, i);
}
config.add(0, name);
}
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
protected void configureShell(Shell shell) {
super.configureShell(shell);
if (title != null) {
shell.setText(title);
}
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
protected Control createDialogArea(Composite parent) {
// create composite
Composite composite = (Composite) super.createDialogArea(parent);
GridLayout layout = new GridLayout();
layout.marginHeight = 3;
layout.marginWidth = 3;
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
Label nameLabel = new Label(composite, SWT.NONE);
nameLabel.setText("Specify a flow id");
nameText = new Text(composite, SWT.SINGLE | SWT.BORDER);
if (this.config != null && this.config.size() > 0
&& this.config.get(0) != null) {
this.nameText.setText(this.config.get(0));
}
nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
nameText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
validateName();
}
});
Label beansLabel = new Label(composite, SWT.NONE);
beansLabel.setText("Link Spring Bean Config and Config Sets");
// config set list viewer
beansConfigSetViewer = CheckboxTableViewer.newCheckList(composite,
SWT.BORDER);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.widthHint = LIST_VIEWER_WIDTH;
gd.heightHint = BEANS_CONFIG_LIST_VIEWER_HEIGHT;
beansConfigSetViewer.getTable().setLayoutData(gd);
beansConfigSetViewer.setContentProvider(new BeansConfigContentProvider(
createBeansConfigList()));
beansConfigSetViewer.setLabelProvider(new BeansConfigLabelProvider());
beansConfigSetViewer.setInput(this); // activate content provider
if (this.beansConfig != null) {
beansConfigSetViewer.setCheckedElements(this.beansConfig.toArray());
}
beansConfigSetViewer.setSorter(new BeansNavigatorSorter());
// Create error label
errorLabel = new Label(composite, 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(composite);
return composite;
}
/**
*
*
* @param group
* @param labelText
*
* @return
*/
protected Button createCheckBox(Composite group, String labelText) {
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginWidth = 0;
group.setLayout(layout);
Button button = new Button(group, SWT.CHECK);
Label label = new Label(group, SWT.NONE);
label.setText(labelText);
return button;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
*/
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);
// do this here because setting the text will set enablement on the
// ok button
okButton.setEnabled(true);
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
*/
@SuppressWarnings("unchecked")
protected void buttonPressed(int buttonId) {
if (buttonId == IDialogConstants.OK_ID) {
List configs = Arrays.asList(beansConfigSetViewer
.getCheckedElements());
this.beansConfig.clear();
this.beansConfig.addAll(configs);
this.config.add(0, nameText.getText());
}
super.buttonPressed(buttonId);
}
/**
*
*
* @return
*/
private Set<IModelElement> createBeansConfigList() {
IBeansProject beansProject = BeansCorePlugin.getModel().getProject(
project);
// Create new list with config files from this config set
Set<IModelElement> elements = new HashSet<IModelElement>();
elements.addAll(beansProject.getConfigs());
elements.addAll(beansProject.getConfigSets());
return elements;
}
private void validateName() {
boolean isEnabled = true;
String name = nameText.getText();
if (name == null || name.trim().length() == 0) {
errorLabel.setText("Please specify a valid flow id");
isEnabled = false;
}
else {
IWebflowProject wp = Activator.getModel().getProject(project);
for (IWebflowConfig config : wp.getConfigs()) {
if (name.equals(config.getName()) && !config.getResource().equals(file)){
errorLabel.setText("Flow id already in use in this project");
isEnabled = false;
}
}
}
okButton.setEnabled(isEnabled);
errorLabel.getParent().update();
}
public String getName() {
return this.nameText.getText();
}
}