org.eclipse.rmf.reqif10.search.ui.masterdetails.CriteriaDetailsPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.rmf.reqif10.search.ui.masterdetails.CriteriaDetailsPage.java

Source

/*******************************************************************************
 * Copyright (c) 2014 Hussein Mhanna
 * 
 * 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:
 *     Hussein Mhanna - initial API and implementation
 ******************************************************************************/
package org.eclipse.rmf.reqif10.search.ui.masterdetails;

import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.observable.value.WritableValue;
import org.eclipse.emf.databinding.edit.EMFEditObservables;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.databinding.fieldassist.ControlDecorationSupport;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.viewers.ViewersObservables;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.rmf.reqif10.search.criteria.Criteria;
import org.eclipse.rmf.reqif10.search.criteria.CriteriaPackage.Literals;
import org.eclipse.rmf.reqif10.search.criteria.Operator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
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.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.IDetailsPage;
import org.eclipse.ui.forms.IFormPart;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;

/**
 * 
 * @author Hussein MHANNA
 * 
 */
public class CriteriaDetailsPage implements IDetailsPage {

    /**
     * The managed form
     */
    private IManagedForm managedForm;

    /**
     * The input object
     */
    private Object input;
    /**
     * The feature text widget
     */
    private Text featureTextWidget;
    /**
     * The operator combo viewer
     */
    private ComboViewer operatorComboViewer;
    /**
     * The searched text widget
     */
    private Text searchedTextWidget;
    /**
     * The replacement text widget
     */
    private Text replacementTextWidget;
    /**
     * The case sensitive check button
     */
    private Button caseSensitiveButton;
    /**
     * The writable value
     */
    private WritableValue writableValue = new WritableValue();
    /**
     * The editing domain
     */
    private EditingDomain editingDomain;
    /**
     * The form toolkit
     */
    private FormToolkit toolkit;
    /**
     * The data binding context
     */
    private DataBindingContext bindingContext;

    /**
     * The constructor
     * 
     * @param editingDomain
     *            : The editing domain
     */
    public CriteriaDetailsPage(EditingDomain editingDomain) {
        this.editingDomain = editingDomain;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void initialize(final IManagedForm form) {
        managedForm = form;
    }

    /**
     * Return the {@link FormToolkit} of the managed form
     * 
     * @return The {@link FormToolkit} of the managed form
     */
    protected FormToolkit getFormToolkit() {
        return managedForm.getToolkit();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void dispose() {
        managedForm.getToolkit().dispose();
    }

    /**
     * Set the focus to the form of the {@link IManagedForm}
     */
    @Override
    public void setFocus() {
        managedForm.getForm().setFocus();

    }

    /**
     * {@inheritDoc} This method return <code>false</code>
     */
    @Override
    public boolean isDirty() {
        return false;
    }

    /**
     * {@inheritDoc} This method do nothing
     */
    @Override
    public void commit(final boolean onSave) {
    }

    /**
     * {@inheritDoc} This method return <code>false</code>
     */
    @Override
    public boolean setFormInput(final Object input) {
        return false;
    }

    /**
     * {@inheritDoc} This method return <code>false</code>
     */
    @Override
    public boolean isStale() {
        return false;
    }

    /**
     * {@inheritDoc} This method do nothing
     */
    @Override
    public void refresh() {
    }

    /**
     * {@inheritDoc} Update the selection and call {@link #update(Object)}
     */
    @Override
    public void selectionChanged(final IFormPart part, final ISelection selection) {
        final IStructuredSelection structuredSelection = (IStructuredSelection) selection;
        if (structuredSelection.size() == 1) {
            input = (Criteria) structuredSelection.getFirstElement();
        }
        writableValue.setValue(input);
    }

    protected void initDataBindings() {
        bindingContext = new DataBindingContext();
        Binding featureComboViewerBinding = bindTextWidget(featureTextWidget, Literals.CRITERIA__FEATURE_NAME);
        ControlDecorationSupport.create(featureComboViewerBinding, SWT.TOP | SWT.LEFT);
        Binding operatorComboViewerBinding = bindComboViewer(operatorComboViewer, Literals.CRITERIA__OPERATOR);
        ControlDecorationSupport.create(operatorComboViewerBinding, SWT.TOP | SWT.LEFT);
        Binding searchedTextBinding = bindTextWidget(searchedTextWidget, Literals.CRITERIA__SERACHED_TEXT);
        ControlDecorationSupport.create(searchedTextBinding, SWT.TOP | SWT.LEFT);

        Binding replacementTextBinding = bindTextWidget(replacementTextWidget, Literals.CRITERIA__REPLACEMENT_TEXT);
        ControlDecorationSupport.create(replacementTextBinding, SWT.TOP | SWT.LEFT);
        bindButton(caseSensitiveButton, Literals.CRITERIA__SENSITIVE_CASE);
    }

    private Binding bindTextWidget(Text textWidget, EStructuralFeature feature) {
        IObservableValue target = WidgetProperties.text(SWT.Modify).observe(textWidget);
        IObservableValue model = EMFEditObservables.observeDetailValue(Realm.getDefault(), editingDomain,
                writableValue, feature);
        return bindingContext.bindValue(target, model, null, null);
    }

    private Binding bindComboViewer(ComboViewer comboViewer, EStructuralFeature feature) {
        //
        IObservableValue target = ViewersObservables.observeSingleSelection(comboViewer);
        IObservableValue model = EMFEditObservables.observeDetailValue(Realm.getDefault(), editingDomain,
                writableValue, feature);
        return bindingContext.bindValue(target, model, null, null);
    }

    private Binding bindButton(Button button, EStructuralFeature feature) {
        //
        IObservableValue target = WidgetProperties.selection().observe(button);
        IObservableValue model = EMFEditObservables.observeDetailValue(Realm.getDefault(), editingDomain,
                writableValue, feature);
        return bindingContext.bindValue(target, model, null, null);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void createContents(final Composite parent) {
        toolkit = managedForm.getToolkit();
        parent.setLayout(new FillLayout());
        //
        Section section = toolkit.createSection(parent,
                ExpandableComposite.EXPANDED | ExpandableComposite.TITLE_BAR);
        section.setText("Criteria Details");
        //
        Composite composite = toolkit.createComposite(section, SWT.NONE);
        section.setClient(composite);
        composite.setLayout(new GridLayout(2, false));

        createFeatureText(composite);

        createOperatorComboViewer(composite);

        createSearchedText(composite);

        createReplacementText(composite);

        createSensitiveButton(composite);
        initDataBindings();
    }

    private void createSensitiveButton(Composite composite) {
        createLabel(composite, "Case Sensitive");
        caseSensitiveButton = toolkit.createButton(composite, "", SWT.CHECK);
        caseSensitiveButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false, 1, 1));
    }

    private void createReplacementText(Composite composite) {
        replacementTextWidget = createText("Replacement", composite);
    }

    private void createSearchedText(Composite composite) {
        searchedTextWidget = createText("Searched Text", composite);
    }

    private Text createText(String labelText, Composite composite) {
        createLabel(composite, labelText);
        Text text = toolkit.createText(composite, "", SWT.BORDER);
        text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        return text;
    }

    private void createOperatorComboViewer(Composite composite) {
        operatorComboViewer = createComboViewer("Operator", composite, Operator.values());
    }

    private void createFeatureText(Composite composite) {
        featureTextWidget = createText("Feature", composite);
    }

    private Label createLabel(Composite parent, String labelText) {
        return toolkit.createLabel(parent, labelText);
    }

    private ComboViewer createComboViewer(String labelText, Composite parent, Object input) {
        createLabel(parent, labelText);
        ComboViewer comboViewer = new ComboViewer(parent, SWT.READ_ONLY);
        Combo combo = comboViewer.getCombo();
        combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        toolkit.paintBordersFor(combo);
        comboViewer.setLabelProvider(new LabelProvider());
        comboViewer.setContentProvider(new ArrayContentProvider());
        comboViewer.setInput(input);
        return comboViewer;
    }
}