org.bonitasoft.studio.validators.ui.property.section.ValidatorsPropertySection.java Source code

Java tutorial

Introduction

Here is the source code for org.bonitasoft.studio.validators.ui.property.section.ValidatorsPropertySection.java

Source

/**
 * Copyright (C) 2009 BonitaSoft S.A.
 * BonitaSoft, 31 rue Gustave Eiffel - 38000 Grenoble
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2.0 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.bonitasoft.studio.validators.ui.property.section;

import java.util.Collection;

import org.bonitasoft.studio.common.ExpressionConstants;
import org.bonitasoft.studio.common.log.BonitaStudioLog;
import org.bonitasoft.studio.common.properties.AbstractBonitaDescriptionSection;
import org.bonitasoft.studio.common.repository.RepositoryManager;
import org.bonitasoft.studio.expression.editor.filter.AvailableExpressionTypeFilter;
import org.bonitasoft.studio.expression.editor.viewer.ExpressionViewer;
import org.bonitasoft.studio.model.expression.Expression;
import org.bonitasoft.studio.model.expression.ExpressionFactory;
import org.bonitasoft.studio.model.expression.ExpressionPackage;
import org.bonitasoft.studio.model.form.Form;
import org.bonitasoft.studio.model.form.FormPackage;
import org.bonitasoft.studio.model.form.MultipleValuatedFormField;
import org.bonitasoft.studio.model.form.Validable;
import org.bonitasoft.studio.model.form.Validator;
import org.bonitasoft.studio.model.form.Widget;
import org.bonitasoft.studio.model.process.Element;
import org.bonitasoft.studio.validators.commands.AddValidatorCommand;
import org.bonitasoft.studio.validators.commands.RemoveValidatorCommand;
import org.bonitasoft.studio.validators.descriptor.validator.ValidatorDescriptor;
import org.bonitasoft.studio.validators.descriptor.validator.ValidatorType;
import org.bonitasoft.studio.validators.i18n.Messages;
import org.bonitasoft.studio.validators.repository.ValidatorDescriptorRepositoryStore;
import org.bonitasoft.studio.validators.ui.providers.ValidatorLabelProvider;
import org.bonitasoft.studio.validators.ui.wizard.ValidatorWizard;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.operations.IUndoableOperation;
import org.eclipse.core.commands.operations.OperationHistoryFactory;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.conversion.Converter;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.observable.value.IValueChangeListener;
import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.databinding.EMFDataBindingContext;
import org.eclipse.emf.databinding.EMFObservables;
import org.eclipse.emf.databinding.edit.EMFEditProperties;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.databinding.viewers.IViewerObservableValue;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.databinding.viewers.ViewersObservables;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;

/**
 * @author Aurelien Pupier
 * @author Baptiste Mesta
 * 
 */
public class ValidatorsPropertySection extends AbstractBonitaDescriptionSection {

    private static final String GROOVY_TYPE = "Groovy expression";
    private static final String REGULAR_TYPE = "Regular expression";
    protected EMFDataBindingContext context = new EMFDataBindingContext();

    private TableViewer tableViewer;
    private Button defaultValidator;

    /*right panel*/
    private Composite fieldsComposite;
    private Text nameField;
    private ExpressionViewer labelExpressionViewer;
    private ComboViewer comboViewerForValidatorClass;
    private ExpressionViewer parameterExpressionViewer;
    private Text htmlClassField;

    /*save the validator selected in the TreeViewer*/
    private Validator currentValidator;

    private EObject lastEObject;

    private DataBindingContext defaultValidatorContext;
    private Button isBelow;
    private Button defaultValidatorIsBelow;

    private Button isAbove;
    private Button defaultValidatorIsAbove;
    private final Converter converter = new Converter(Boolean.class, Boolean.class) {

        @Override
        public Object convert(Object fromObject) {
            return !((Boolean) fromObject);
        }
    };

    private Composite positionComp;
    private Button removeValidatorButton;
    private ValidatorDescriptorRepositoryStore validatorStore;

    private final ViewerFilter formFilter = new ViewerFilter() {

        @Override
        public boolean select(Viewer arg0, Object arg1, Object arg2) {
            ValidatorDescriptor descriptor = (ValidatorDescriptor) arg2;
            return descriptor.getType() == ValidatorType.PAGE_VALIDATOR;
        }
    };

    private final ViewerFilter fieldFilter = new ViewerFilter() {

        @Override
        public boolean select(Viewer arg0, Object arg1, Object arg2) {
            ValidatorDescriptor descriptor = (ValidatorDescriptor) arg2;
            return descriptor.getType() == ValidatorType.FILED_VALIDATOR;
        }
    };

    private EMFDataBindingContext expressionContext;

    @Override
    public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage) {
        super.createControls(parent, aTabbedPropertySheetPage);
        validatorStore = (ValidatorDescriptorRepositoryStore) RepositoryManager.getInstance()
                .getRepositoryStore(ValidatorDescriptorRepositoryStore.class);
        doCreateControls(parent);
    }

    protected void doCreateControls(Composite parent) {
        Composite mainComposite = getWidgetFactory().createComposite(parent, SWT.NONE);
        mainComposite.setLayout(GridLayoutFactory.fillDefaults().numColumns(3).margins(10, 10)
                .extendedMargins(10, 10, 10, 10).create());

        createButtons(mainComposite);
        createListOfValidators(mainComposite);
        updateButton();
        createRightPanel(mainComposite);

    }

    private void createRightPanel(Composite mainComposite) {
        fieldsComposite = getWidgetFactory().createComposite(mainComposite, SWT.NONE);
        GridLayout gl = new GridLayout(4, false);
        fieldsComposite.setLayout(gl);

        // Name Label
        getWidgetFactory().createCLabel(fieldsComposite, Messages.GeneralSection_Name);
        // Name text
        nameField = getWidgetFactory().createText(fieldsComposite, "", SWT.NONE); //$NON-NLS-1$
        nameField.setLayoutData(new GridData(SWT.FILL, SWT.DEFAULT, true, false, 3, 1));

        getWidgetFactory().createCLabel(fieldsComposite, Messages.Validator_ValidatorClass + " *");
        // validatorClass text
        createComboAnButtonForValidatorClass(fieldsComposite);

        // Label Label
        getWidgetFactory().createLabel(fieldsComposite, Messages.Validator_ErrorMessage + " *");
        // Label text
        labelExpressionViewer = new ExpressionViewer(fieldsComposite, SWT.BORDER, getWidgetFactory(),
                getEditingDomain(), FormPackage.Literals.VALIDATOR__DISPLAY_NAME);
        labelExpressionViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.DEFAULT, true, false, 3, 1));
        labelExpressionViewer.addFilter(new AvailableExpressionTypeFilter(
                new String[] { ExpressionConstants.CONSTANT_TYPE, ExpressionConstants.VARIABLE_TYPE,
                        ExpressionConstants.SCRIPT_TYPE, ExpressionConstants.PARAMETER_TYPE,
                        ExpressionConstants.FORM_FIELD_TYPE, ExpressionConstants.DOCUMENT_TYPE }));
        labelExpressionViewer.setExpressionNatureProvider(new ValidatorExpressionNatureProvider());

        /*create the parameter field */
        getWidgetFactory().createLabel(fieldsComposite, Messages.Validator_Parameter);
        parameterExpressionViewer = new ExpressionViewer(fieldsComposite, SWT.BORDER, getWidgetFactory(),
                getEditingDomain(), FormPackage.Literals.VALIDATOR__PARAMETER);
        parameterExpressionViewer.getControl()
                .setLayoutData(GridDataFactory.fillDefaults().hint(300, SWT.DEFAULT).span(3, 1).create());
        parameterExpressionViewer.addFilter(new AvailableExpressionTypeFilter(
                new String[] { ExpressionConstants.CONSTANT_TYPE, ExpressionConstants.VARIABLE_TYPE,
                        ExpressionConstants.SCRIPT_TYPE, ExpressionConstants.PARAMETER_TYPE,
                        ExpressionConstants.FORM_FIELD_TYPE, ExpressionConstants.DOCUMENT_TYPE }));
        parameterExpressionViewer.setExpressionNatureProvider(new ValidatorExpressionNatureProvider());

        // htmlClass Label
        getWidgetFactory().createLabel(fieldsComposite, Messages.Validator_HtmlClass);
        // htmlClass text
        htmlClassField = getWidgetFactory().createText(fieldsComposite, ""); //$NON-NLS-1$
        htmlClassField.setLayoutData(new GridData(SWT.FILL, SWT.DEFAULT, true, false, 3, 1));

        // htmlClass Label
        getWidgetFactory().createLabel(fieldsComposite, Messages.Validator_isBelow);
        Composite positionComposite = getWidgetFactory().createComposite(fieldsComposite, SWT.NONE);
        positionComposite.setLayout(new GridLayout(2, false));
        isBelow = getWidgetFactory().createButton(positionComposite, Messages.Validator_Below, SWT.RADIO);
        isAbove = getWidgetFactory().createButton(positionComposite, Messages.Validator_Above, SWT.RADIO);

        createDefaultValidatorPanel(mainComposite);

        enableFields(false);

    }

    private void createDefaultValidatorPanel(Composite mainComposite) {
        Composite defaultValidatorComposite = getWidgetFactory().createComposite(mainComposite);
        defaultValidatorComposite.setLayout(new GridLayout(1, false));
        defaultValidatorComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 4, 1));

        defaultValidator = getWidgetFactory().createButton(defaultValidatorComposite,
                Messages.Validator_defaultValidator, SWT.CHECK);

        positionComp = getWidgetFactory().createComposite(defaultValidatorComposite);
        positionComp.setLayout(new GridLayout(3, false));
        getWidgetFactory().createLabel(positionComp, Messages.Validator_isBelow);
        defaultValidatorIsBelow = getWidgetFactory().createButton(positionComp, Messages.Validator_Below,
                SWT.RADIO);
        defaultValidatorIsAbove = getWidgetFactory().createButton(positionComp, Messages.Validator_Above,
                SWT.RADIO);

        positionComp.setLayoutData(GridDataFactory.fillDefaults().indent(15, 0).create());
        defaultValidator.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                positionComp.setVisible(defaultValidator.getSelection());
            }
        });
    }

    private void createButtons(Composite mainComposite) {
        Composite buttonsComposite = getWidgetFactory().createPlainComposite(mainComposite, SWT.NONE);
        buttonsComposite.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, false, false));
        buttonsComposite
                .setLayout(GridLayoutFactory.fillDefaults().numColumns(1).margins(0, 0).spacing(0, 3).create());

        Button addValidatorButton = createAddValidatorButton(buttonsComposite);
        addValidatorButton.setFocus();
        createCreateValidatorButton(buttonsComposite);
        removeValidatorButton = createRemoveValidatorButton(buttonsComposite);

    }

    private void updateButton() {
        if (removeValidatorButton != null && !removeValidatorButton.isDisposed() && tableViewer != null
                && !tableViewer.getTable().isDisposed()) {
            removeValidatorButton.setEnabled(!tableViewer.getSelection().isEmpty());
        }
    }

    /**
     * Create a FilteredTree to list all validators on the Validable.
     * @param mainComposite
     */
    protected void createListOfValidators(Composite mainComposite) {
        // ----------------left panel : tree + buttons
        tableViewer = new TableViewer(mainComposite,
                SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.H_SCROLL);
        getWidgetFactory().adapt(tableViewer.getTable(), false, false);
        GridData gridData = new GridData(SWT.CENTER, SWT.TOP, false, false);
        gridData.widthHint = 300;
        gridData.heightHint = 150;
        tableViewer.getTable().setLayoutData(gridData);
        //validatorList.setLayoutData(new GridData(300, 150));
        tableViewer.setLabelProvider(new ValidatorLabelProvider());
        //TODO : bind the list of validator
        tableViewer.setContentProvider(new IStructuredContentProvider() {

            @Override
            public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
            }

            @Override
            public void dispose() {
            }

            @Override
            public Object[] getElements(Object inputElement) {
                if (inputElement instanceof Validable) {
                    return ((Validable) inputElement).getValidators().toArray();
                } else {
                    return new Object[0];
                }
            }
        });
        tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {

            @Override
            public void selectionChanged(SelectionChangedEvent event) {

                currentValidator = (Validator) ((IStructuredSelection) tableViewer.getSelection())
                        .getFirstElement();
                enableFields(!tableViewer.getSelection().isEmpty());
                if (currentValidator != null) {
                    if (expressionContext != null) {
                        expressionContext.dispose();
                    }
                    expressionContext = new EMFDataBindingContext();

                    parameterExpressionViewer.setEditingDomain(getEditingDomain());
                    Expression selection = currentValidator.getParameter();
                    if (selection == null) {
                        selection = ExpressionFactory.eINSTANCE.createExpression();
                        getEditingDomain().getCommandStack().execute(SetCommand.create(getEditingDomain(),
                                currentValidator, FormPackage.Literals.VALIDATOR__PARAMETER, selection));

                    }
                    if (currentValidator != null) {
                        parameterExpressionViewer.setContext(currentValidator);
                    } else {
                        parameterExpressionViewer.setContext(getValidable());
                    }

                    parameterExpressionViewer.setInput(currentValidator);

                    expressionContext
                            .bindValue(ViewerProperties.singleSelection().observe(parameterExpressionViewer),
                                    EMFEditProperties
                                            .value(getEditingDomain(), FormPackage.Literals.VALIDATOR__PARAMETER)
                                            .observe(currentValidator));

                }

                if (currentValidator != null) {
                    labelExpressionViewer.setEditingDomain(getEditingDomain());
                    Expression selection = currentValidator.getDisplayName();
                    if (selection == null) {
                        selection = ExpressionFactory.eINSTANCE.createExpression();
                        getEditingDomain().getCommandStack().execute(SetCommand.create(getEditingDomain(),
                                currentValidator, FormPackage.Literals.VALIDATOR__DISPLAY_NAME, selection));
                    }
                    if (currentValidator != null) {
                        labelExpressionViewer.setContext(currentValidator);
                    } else {
                        labelExpressionViewer.setContext(getValidable());
                    }

                    labelExpressionViewer.setInput(currentValidator);
                    expressionContext.bindValue(ViewerProperties.singleSelection().observe(labelExpressionViewer),
                            EMFEditProperties
                                    .value(getEditingDomain(), FormPackage.Literals.VALIDATOR__DISPLAY_NAME)
                                    .observe(currentValidator));

                }
                updateButton();
            }
        });

    }

    /**
     * @param fieldsComposite
     */
    private void createComboAnButtonForValidatorClass(Composite fieldsComposite) {
        Combo ccombo = new Combo(fieldsComposite, SWT.READ_ONLY);
        comboViewerForValidatorClass = new ComboViewer(ccombo);
        ccombo.setLayoutData(GridDataFactory.fillDefaults().span(3, 1).create());
        comboViewerForValidatorClass.setLabelProvider(new LabelProvider() {
            @Override
            public String getText(Object element) {
                return ((ValidatorDescriptor) element).getName();
            }
        });
        comboViewerForValidatorClass.setContentProvider(new ArrayContentProvider());
        /*Sort element by alphabetical order*/
        comboViewerForValidatorClass.setComparator(new ViewerComparator());

    }

    private void createCreateValidatorButton(Composite buttonsComposite) {
        Button importButton = getWidgetFactory().createButton(buttonsComposite, Messages.createButton, SWT.FLAT);
        importButton.setLayoutData(GridDataFactory.swtDefaults().hint(85, SWT.DEFAULT).create());
        importButton.addListener(SWT.Selection, new Listener() {
            @Override
            public void handleEvent(Event event) {
                CompoundCommand cc = new CompoundCommand();
                ValidatorWizard cvw = new ValidatorWizard();
                WizardDialog wd = new WizardDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
                        cvw);

                if (wd.open() == WizardDialog.OK) {
                    /*if OK create add the validator to the widget/form
                     * and set directly the validator type on the validator*/
                    createValidator(/*ValidatorRepositoryArtifact.ID_BASE+*/cvw.getValidatorId());
                    getEditingDomain().getCommandStack().execute(cc);
                    comboViewerForValidatorClass.setInput(validatorStore.getValidatorDescriptors());
                }
                comboViewerForValidatorClass.refresh(true);
            }
        });

    }

    private void enableFields(boolean enable) {
        fieldsComposite.setVisible(enable);
        nameField.setEnabled(enable);
        labelExpressionViewer.getTextControl().setEnabled(enable);
        labelExpressionViewer.getButtonControl().setEnabled(enable);
        comboViewerForValidatorClass.getCombo().setEnabled(enable);
        htmlClassField.setEnabled(enable);
        isBelow.setEnabled(enable);
        if (currentValidator != null && currentValidator.getValidatorClass() != null) {
            ValidatorDescriptor descriptior = validatorStore
                    .getValidatorDescriptor(currentValidator.getValidatorClass());
            if (descriptior == null) {
                parameterExpressionViewer.getTextControl().setEnabled(false);
                parameterExpressionViewer.getButtonControl().setEnabled(false);
            } else {
                final boolean enabled = enable && descriptior.getHasParameter();
                parameterExpressionViewer.getTextControl().setEnabled(enabled);
                parameterExpressionViewer.getButtonControl().setEnabled(enabled);
            }
        } else {
            parameterExpressionViewer.getTextControl().setEnabled(false);
            parameterExpressionViewer.getButtonControl().setEnabled(false);
        }
    }

    @Override
    public void refresh() {
        super.refresh();

        if (tableViewer != null && !tableViewer.getTable().isDisposed() && comboViewerForValidatorClass != null
                && !comboViewerForValidatorClass.getCombo().isDisposed()) {
            if (getValidable().getValidators().size() > 0) {
                /*update value in the treeviewer when the name changed.*/
                tableViewer.refresh(true);
                currentValidator = (Validator) ((IStructuredSelection) tableViewer.getSelection())
                        .getFirstElement();
            } else {
                /*update the treeviewer if the last validator is removed*/
                tableViewer.refresh(true);
                currentValidator = null;
            }

            if (lastEObject == null || !lastEObject.equals(getEObject())) {
                lastEObject = getEObject();
                if (lastEObject != null) {
                    tableViewer.setInput(getValidable());
                    comboViewerForValidatorClass.resetFilters();
                    if (getEObject() instanceof Form) {
                        comboViewerForValidatorClass.addFilter(formFilter);
                    } else {
                        comboViewerForValidatorClass.addFilter(fieldFilter);
                    }

                    //               for(Validator validator :((Validable)lastEObject).getValidators()){
                    //                  if(validator.getValidatorClass() != null){
                    //                     boolean stilExists = false ;
                    //                     for(IRepositoryFileStore file : validatorStore.getChildren()){
                    //                        ValidatorDescriptor desc = (ValidatorDescriptor) file.getContent() ;
                    //                        if(desc.getClassName().equals(validator.getValidatorClass())){
                    //                           stilExists = true ;
                    //                           break ;
                    //                        }
                    //                     }
                    //                     if(!stilExists){
                    //                        getEditingDomain().getCommandStack().execute(SetCommand.create(getEditingDomain(), validator, FormPackage.Literals.VALIDATOR__VALIDATOR_CLASS, null)) ;
                    //                     }
                    //                  }
                    //               }

                    comboViewerForValidatorClass.setInput(validatorStore.getValidatorDescriptors());

                    if (context != null) {
                        context.dispose();
                    }
                    context = new EMFDataBindingContext();

                    updateFieldDependingOnValidatorClass();

                    if (defaultValidatorContext != null) {
                        defaultValidatorContext.dispose();
                    }
                    defaultValidatorContext = new DataBindingContext();
                    defaultValidatorContext.bindValue(SWTObservables.observeSelection(defaultValidator),
                            EMFObservables.observeValue(getEObject(),
                                    FormPackage.Literals.VALIDABLE__USE_DEFAULT_VALIDATOR));

                    defaultValidatorContext.bindValue(SWTObservables.observeSelection(defaultValidatorIsBelow),
                            EMFObservables.observeValue(getEObject(), FormPackage.Literals.VALIDABLE__BELOW));

                    defaultValidatorContext.bindValue(SWTObservables.observeSelection(defaultValidatorIsAbove),
                            EMFObservables.observeValue(getEObject(), FormPackage.Literals.VALIDABLE__BELOW),
                            new UpdateValueStrategy().setConverter(converter),
                            new UpdateValueStrategy().setConverter(converter));

                    defaultValidator.setVisible(
                            lastEObject instanceof Widget && !(lastEObject instanceof MultipleValuatedFormField));
                    positionComp.setVisible(lastEObject instanceof Widget && defaultValidator.getSelection());

                    /*
                     * Use pattern master-detail databinding in order to be up to date with the selection in the FilteredTreeViewer
                     * */

                    //      labelField.setElement((Element) lastEObject);
                    //      labelField.reset();

                    /*Observe change in selection*/
                    IViewerObservableValue treeViewerObservaleValue = ViewersObservables
                            .observeSingleSelection(tableViewer);

                    //Observe the validator name property of the current selection
                    IObservableValue nameDetailValue = EMFObservables.observeDetailValue(Realm.getDefault(),
                            treeViewerObservaleValue, FormPackage.Literals.VALIDATOR__NAME);

                    //Bind the Text widget to the name detail
                    ISWTObservableValue nameFieldObservableValue = SWTObservables.observeText(nameField,
                            SWT.Modify);
                    context.bindValue(nameFieldObservableValue, nameDetailValue);
                    nameFieldObservableValue.addValueChangeListener(new IValueChangeListener() {
                        @Override
                        public void handleValueChange(ValueChangeEvent event) {
                            /*update value in the treeviewer when the name changed.*/
                            tableViewer.refresh(true);
                        }
                    });

                    //Observe the validator classes of the current selection
                    IObservableValue emfValidatorClassObservableDetailValue = EMFObservables.observeDetailValue(
                            Realm.getDefault(), treeViewerObservaleValue,
                            FormPackage.Literals.VALIDATOR__VALIDATOR_CLASS);

                    //Bind the Combo widget to the validator class detail
                    IViewerObservableValue comboViewerObservable = ViewersObservables
                            .observeSingleSelection(comboViewerForValidatorClass);
                    UpdateValueStrategy targetStrategy = new UpdateValueStrategy();
                    targetStrategy.setConverter(new Converter(ValidatorDescriptor.class, String.class) {

                        @Override
                        public Object convert(Object from) {
                            if (from != null && from instanceof ValidatorDescriptor) {
                                return ((ValidatorDescriptor) from).getClassName();
                            }
                            return null;
                        }
                    });
                    UpdateValueStrategy modelStrategy = new UpdateValueStrategy();
                    modelStrategy.setConverter(new Converter(String.class, ValidatorDescriptor.class) {

                        @Override
                        public Object convert(Object from) {
                            if (from != null && from instanceof String) {
                                Collection<ValidatorDescriptor> input = (Collection<ValidatorDescriptor>) comboViewerForValidatorClass
                                        .getInput();
                                for (ValidatorDescriptor d : input) {
                                    if (d.getClassName().equals(from)) {
                                        return d;
                                    }
                                }
                            }
                            return null;
                        }
                    });

                    context.bindValue(comboViewerObservable, emfValidatorClassObservableDetailValue, targetStrategy,
                            modelStrategy);

                    /*When value changed,
                     * look if need to enabled/disabled some widgets*/
                    comboViewerObservable.addValueChangeListener(new IValueChangeListener() {
                        @Override
                        public void handleValueChange(ValueChangeEvent event) {
                            updateFieldDependingOnValidatorClass();
                        }
                    });

                    IObservableValue htmlDetailValue = EMFObservables.observeDetailValue(Realm.getDefault(),
                            treeViewerObservaleValue, FormPackage.Literals.VALIDATOR__HTML_CLASS);
                    context.bindValue(SWTObservables.observeText(htmlClassField, SWT.Modify), htmlDetailValue);

                    IObservableValue isBelowValue = EMFObservables.observeDetailValue(Realm.getDefault(),
                            treeViewerObservaleValue, FormPackage.Literals.VALIDATOR__BELOW_FIELD);
                    context.bindValue(SWTObservables.observeSelection(isBelow), isBelowValue);
                    context.bindValue(SWTObservables.observeSelection(isAbove), isBelowValue,
                            new UpdateValueStrategy().setConverter(converter),
                            new UpdateValueStrategy().setConverter(converter));
                }
            }
            //            else{
            //                comboViewerForValidatorClass.setInput(validatorStore.getValidatorDescriptors());
            //                Validator validator = (Validator) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement() ;
            //                if(validator != null && validator.getValidatorClass() != null){
            //                    comboViewerForValidatorClass.setSelection(new StructuredSelection(validatorStore.getValidatorDescriptor(validator.getValidatorClass())));
            //                }
            //            }
        }
    }

    /**
     * Enable/disable Edit button and parameter field depending on Validator class
     */
    private void updateFieldDependingOnValidatorClass() {
        if (currentValidator != null) {
            String validatorId = currentValidator.getValidatorClass();
            if (validatorId != null) {
                ValidatorDescriptor descriptior = validatorStore.getValidatorDescriptor(validatorId);
                if (descriptior != null) {
                    final boolean enabled = descriptior.getHasParameter();
                    parameterExpressionViewer.getTextControl().setEnabled(enabled);
                    parameterExpressionViewer.getButtonControl().setEnabled(enabled);
                    if (descriptior.getName().equals(GROOVY_TYPE)
                            && !currentValidator.getParameter().getReturnType().equals(Boolean.class.getName())) {
                        getEditingDomain().getCommandStack()
                                .execute(SetCommand.create(getEditingDomain(), currentValidator.getParameter(),
                                        ExpressionPackage.Literals.EXPRESSION__RETURN_TYPE,
                                        Boolean.class.getName()));
                        getEditingDomain().getCommandStack()
                                .execute(SetCommand.create(getEditingDomain(), currentValidator.getParameter(),
                                        ExpressionPackage.Literals.EXPRESSION__RETURN_TYPE_FIXED, true));

                    } else {
                        if (descriptior.getName().equals(REGULAR_TYPE)) {
                            getEditingDomain().getCommandStack()
                                    .execute(SetCommand.create(getEditingDomain(), currentValidator.getParameter(),
                                            ExpressionPackage.Literals.EXPRESSION__RETURN_TYPE,
                                            String.class.getName()));
                            getEditingDomain().getCommandStack()
                                    .execute(SetCommand.create(getEditingDomain(), currentValidator.getParameter(),
                                            ExpressionPackage.Literals.EXPRESSION__RETURN_TYPE_FIXED, false));
                        }
                    }
                }

            }
        }
    }

    //    /**
    //     * @return
    //     */
    //    private boolean shouldShowEditParameterButton() {
    //        return currentValidator != null &&
    //                (GroovyFieldValidator.class.getName().equals(currentValidator.getValidatorClass())
    //                        || GroovyFieldValidator.class.getName().equals(currentValidator.getValidatorClass()));
    //    }

    /**
     * get the Validable
     * 
     * @return
     */
    private Validable getValidable() {
        return (Validable) getEObject();
    }

    private Button createAddValidatorButton(final Composite parent) {
        final Button addData = getWidgetFactory().createButton(parent, Messages.Add, SWT.FLAT);
        addData.setLayoutData(GridDataFactory.swtDefaults().hint(85, SWT.DEFAULT).create());
        addData.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                createValidator();
            }
        });
        return addData;
    }

    private Button createRemoveValidatorButton(final Composite parent) {
        Button removeButton = getWidgetFactory().createButton(parent, Messages.Remove, SWT.FLAT);
        removeButton.setLayoutData(GridDataFactory.swtDefaults().hint(85, SWT.DEFAULT).create());
        removeButton.addListener(SWT.Selection, new Listener() {
            @Override
            public void handleEvent(Event event) {

                if (tableViewer != null && ((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
                    Object[] selection = ((IStructuredSelection) tableViewer.getSelection()).toArray();
                    IUndoableOperation operation = new RemoveValidatorCommand(getEditingDomain(), getValidable(),
                            selection, ValidatorsPropertySection.this);
                    try {
                        OperationHistoryFactory.getOperationHistory().execute(operation, new NullProgressMonitor(),
                                null);
                    } catch (ExecutionException e) {
                        BonitaStudioLog.error(e);
                    }

                    currentValidator = null;
                    refresh();
                }
            }
        });
        return removeButton;
    }

    /**
     * create a new validator
     */
    private void createValidator() {
        IUndoableOperation operation = new AddValidatorCommand(getEditingDomain(), getValidable(),
                generateValidatorDefaultName(), this);
        try {
            OperationHistoryFactory.getOperationHistory().execute(operation, new NullProgressMonitor(), null);
        } catch (ExecutionException e) {
            BonitaStudioLog.error(e);
        }
    }

    /**
     * Create a validator with validatorClass and set the validatorClass in the list of resource to include in the application.
     * @param validatorClass
     */
    private void createValidator(String validatorClass) {
        IUndoableOperation operation = new AddValidatorCommand(getEditingDomain(), getValidable(),
                generateValidatorDefaultName(), validatorClass, this);
        try {
            OperationHistoryFactory.getOperationHistory().execute(operation, new NullProgressMonitor(), null);
        } catch (ExecutionException e) {
            BonitaStudioLog.error(e);
        }
        //      EObject eobject = getEObject();
        //      while(!(eobject instanceof AbstractProcess)){
        //         eobject = eobject.eContainer();
        //      }
        //      AbstractProcess ap = (AbstractProcess) eobject;
        //      getEditingDomain().getCommandStack().execute(new AddCommand(getEditingDomain(), ap.getResourceValidators(), ValidatorRepositoryArtifact.ID_BASE+validatorClass));
    }

    /**
     * Generate a Validator name following <validableName>Validator<number>
     * @return
     */
    private String generateValidatorDefaultName() {
        String prefix = "";
        if (getValidable() instanceof Element) {
            prefix = ((Element) getValidable()).getName();
        }
        return prefix + Messages.ValidatorDefaultName + (getValidable().getValidators().size() + 1);
    }

    public void select(Validator validator) {
        /*Unselect in order to avoid issues with databinding*/
        tableViewer.setSelection(StructuredSelection.EMPTY);
        tableViewer.refresh(true);
        tableViewer.setSelection(new StructuredSelection(validator));
    }

    @Override
    public void dispose() {
        super.dispose();

        if (defaultValidatorContext != null) {
            defaultValidatorContext.dispose();
        }
        if (context != null) {
            context.dispose();
        }
        if (comboViewerForValidatorClass != null && !comboViewerForValidatorClass.getCombo().isDisposed()) {
            comboViewerForValidatorClass.getCombo().dispose();
        }
        if (defaultValidator != null && !defaultValidator.isDisposed()) {
            defaultValidator.dispose();
        }

    }

    @Override
    public String getSectionDescription() {
        // TODO Auto-generated method stub
        return null;
    }
}