org.polarsys.reqcycle.predicates.ui.dialogs.NewPredicateDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.polarsys.reqcycle.predicates.ui.dialogs.NewPredicateDialog.java

Source

/*******************************************************************************
 *  Copyright (c) 2013 AtoS
 *  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:
 *    Papa Issa Diakhate (AtoS) - initial API and implementation and/or initial documentation
 *   
 *******************************************************************************/
package org.polarsys.reqcycle.predicates.ui.dialogs;

import java.util.regex.Pattern;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.PojoProperties;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.window.Window;
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.Combo;
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.polarsys.reqcycle.predicates.core.api.IPredicate;
import org.polarsys.reqcycle.predicates.core.util.PredicatesUtil;
import org.polarsys.reqcycle.predicates.persistance.util.IPredicatesConfManager;
import org.polarsys.reqcycle.utils.inject.ZigguratInject;

public class NewPredicateDialog extends TitleAreaDialog {

    private DataBindingContext m_bindingContext;

    private Text text;

    private ComboViewer comboViewer;

    private IContentProvider comboContentProvider;

    private ILabelProvider comboILabelProvider;

    private IInputValidator validator;

    private PredicateBean bean = new PredicateBean();

    IPredicatesConfManager predicatesConfManager = ZigguratInject.make(IPredicatesConfManager.class);

    private Combo combo;

    static class PredicateBean {

        private String name;

        private IPredicate rootPredicate;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public IPredicate getRootPredicate() {
            return rootPredicate;
        }

        public void setRootPredicate(IPredicate rootPredicate) {
            this.rootPredicate = rootPredicate;
        }
    }

    public NewPredicateDialog(Shell parentShell) {
        super(parentShell);
        this.validator = new IInputValidator() {

            @Override
            public String isValid(String newText) {
                final String regex = "\\w+[-\\w]*";
                if (newText == null || newText.isEmpty()) {
                    return "Enter the name of the new predicate";
                } else if (!Pattern.compile(regex, Pattern.CASE_INSENSITIVE).matcher(newText).matches()) {
                    return "The name of the predicate is not valid.";
                } else if (predicatesConfManager.isPredicateNameAlreadyUsed(newText)) {
                    return "This predicate's name is already used.";
                }
                return null;
            }
        };
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        // create composite
        Composite control = (Composite) super.createDialogArea(parent);

        Composite composite = new Composite(control, SWT.WRAP);
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
        composite.setLayout(new GridLayout(2, false));

        // create message
        Label label = new Label(composite, SWT.None);
        label.setText("Predicate name");
        label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
        label.setFont(parent.getFont());

        text = new Text(composite, SWT.BORDER);
        text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        text.addModifyListener(new ModifyListener() {

            @Override
            public void modifyText(ModifyEvent e) {
                validateInput();
            }
        });

        label = new Label(composite, SWT.WRAP);
        label.setText("Root Predicate");
        label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
        label.setFont(parent.getFont());

        comboViewer = new ComboViewer(composite, SWT.READ_ONLY);
        combo = comboViewer.getCombo();
        combo.setLayout(new GridLayout());
        combo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        if (this.comboContentProvider == null)
            this.comboContentProvider = ArrayContentProvider.getInstance();
        if (this.comboILabelProvider == null)
            this.comboILabelProvider = new LabelProvider();
        comboViewer.setContentProvider(comboContentProvider);
        comboViewer.setLabelProvider(comboILabelProvider);
        comboViewer.setInput(PredicatesUtil.getDefaultPredicates());
        comboViewer.addSelectionChangedListener(new ISelectionChangedListener() {

            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                validateInput();
            }
        });

        ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory(
                ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
        final AdapterFactoryLabelProvider adapterLabelProvider = new AdapterFactoryLabelProvider(adapterFactory);

        comboViewer.setLabelProvider(new LabelProvider() {

            @Override
            public String getText(Object element) {
                return adapterLabelProvider.getText(element);
            }
        });

        // Set the error message text
        // See https://bugs.eclipse.org/bugs/show_bug.cgi?id=66292
        // setErrorMessage(errorMessage);

        applyDialogFont(composite);
        new Label(composite, SWT.NONE);
        new Label(composite, SWT.NONE);
        m_bindingContext = initDataBindings();
        return composite;
    }

    protected void validateInput() {

        String errorMessage = null;
        if (validator != null && text != null) {
            errorMessage = validator.isValid(text.getText());
        }

        if (comboViewer != null && comboViewer.getSelection().isEmpty()) {
            String msg = "Select a root predicate";
            errorMessage = errorMessage != null && !errorMessage.isEmpty() ? errorMessage + "\n" + msg : msg;
        }

        setErrorMessage(errorMessage);
        Button okButton = getButton(OK);
        if (okButton != null) {
            okButton.setEnabled(errorMessage == null);
        }
    }

    @Override
    protected Button createButton(Composite parent, int id, String label, boolean defaultButton) {
        Button btn = super.createButton(parent, id, label, defaultButton);

        if (Window.OK == id && btn != null) {
            btn.setEnabled(false);
        }

        return btn;
    }

    public String getName() {
        return bean != null ? bean.getName() : null;
    }

    public IPredicate getRootPredicate() {
        return bean != null ? bean.getRootPredicate() : null;
    }

    protected DataBindingContext initDataBindings() {
        DataBindingContext bindingContext = new DataBindingContext();
        //
        IObservableValue observeTextTextObserveWidget = WidgetProperties.text(SWT.Modify).observe(text);
        IObservableValue nameBeanObserveValue = PojoProperties.value("name").observe(bean);
        bindingContext.bindValue(observeTextTextObserveWidget, nameBeanObserveValue, null, null);
        //
        IObservableValue observeSingleSelectionComboViewer = ViewerProperties.singleSelection()
                .observe(comboViewer);
        IObservableValue rootPredicateBeanObserveValue = PojoProperties.value("rootPredicate").observe(bean);
        bindingContext.bindValue(observeSingleSelectionComboViewer, rootPredicateBeanObserveValue, null, null);
        //
        return bindingContext;
    }
}