era.foss.objecteditor.specobject.AttributeDefinitionEnumComposite.java Source code

Java tutorial

Introduction

Here is the source code for era.foss.objecteditor.specobject.AttributeDefinitionEnumComposite.java

Source

/**************************************************************************
 * ERA - Eclipse Requirements Analysis
 * ==============================================
 * Copyright (C) 2009-2013 by Georg Blaschke, Christoph P. Neumann
 * and Bernd Haberstumpf (http://era.origo.ethz.ch)
 **************************************************************************
 * Licensed under the Eclipse Public License - v 1.0 (the "License");
 * you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.eclipse.org/org/documents/epl-v10.html
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 **************************************************************************
 */
package era.foss.objecteditor.specobject;

import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.databinding.EMFProperties;
import org.eclipse.emf.databinding.IEMFListProperty;
import org.eclipse.emf.databinding.edit.EMFEditProperties;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.viewers.AbstractListViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;

import era.foss.erf.AttributeDefinitionEnumeration;
import era.foss.erf.AttributeValue;
import era.foss.erf.AttributeValueEnumeration;
import era.foss.erf.EnumValue;
import era.foss.erf.ErfPackage;
import era.foss.erf.SpecObject;
import era.foss.erf.ViewElement;
import era.foss.erf.impl.EnumValueImpl;
import era.foss.erf.impl.ErfFactoryImpl;
import era.foss.ui.contrib.ColorComboViewer;
import era.foss.ui.contrib.MultiComboViewer;
import era.foss.ui.contrib.ObservableMapLabelColorProvider;

/**
 * The Class AttributeDefinitionEnumComposite.
 */
public class AttributeDefinitionEnumComposite extends AbstractAttributeDefinitionComposite {

    /** The GUI element representing a AttributeDefinitionBoolean. */
    AbstractListViewer comboViewer;

    /** The value modify listener. */
    private DefaultModifyListener valueModifyListener;

    /** The attribute definition. */
    private AttributeDefinitionEnumeration attributeDefinition;

    /**
     * Instantiates a new attribute definition enum composite.
     * 
     * @param parent the parent
     * @param viewElement the view element
     * @param specObject the spec object
     */
    public AttributeDefinitionEnumComposite(Composite parent, ViewElement viewElement, SpecObject specObject) {
        super(parent, viewElement);

    }

    public Control createControl() {
        attributeDefinition = (AttributeDefinitionEnumeration) viewElement.getAttributeDefinition();

        if (attributeDefinition.isMultiValued()) {
            comboViewer = new MultiComboViewer(this, SWT.READ_ONLY | SWT.BORDER);
        } else {
            comboViewer = new ColorComboViewer(new CCombo(this, SWT.READ_ONLY | SWT.BORDER));
        }

        ObservableListContentProvider contentProvider = new ObservableListContentProvider();

        // set content provider
        comboViewer.setContentProvider(contentProvider);

        ObservableMapLabelColorProvider labelProvider = new ObservableMapLabelColorProvider(
                EMFProperties.value(ErfPackage.Literals.IDENTIFIABLE__LONG_NAME)
                        .observeDetail(contentProvider.getKnownElements())) {

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

            @Override
            public Image getImage(Object element) {
                return super.getImage(element);
            }

            public Color getForeground(Object element) {
                return null;
            }

            public Color getBackground(Object element) {
                org.eclipse.swt.graphics.Color swtColor;
                if (element != null) {
                    assert (element instanceof EnumValueImpl);
                    EnumValueImpl enumValue = (EnumValueImpl) element;
                    swtColor = enumValue.getColor().getColor();
                } else {
                    swtColor = Display.getDefault().getSystemColor(SWT.COLOR_WHITE);
                }
                return swtColor;
            }

        };

        // set label provider
        comboViewer.setLabelProvider(labelProvider);

        // set input
        IEMFListProperty dataTypeDefinitions = EMFProperties
                .list(ErfPackage.Literals.DATATYPE_DEFINITION_ENUMERATION__SPECIFIED_VALUES);
        IObservableList observableList = dataTypeDefinitions.observe(attributeDefinition.getType());
        comboViewer.setInput(observableList);

        return comboViewer.getControl();
    }

    @Override
    public void doBind(SpecObject specObject, AttributeValue attributeValue, EditingDomain editingDomain) {
        if (attributeValue == null) {
            valueModifyListener = new DefaultModifyListener(specObject, editingDomain);
            comboViewer.addSelectionChangedListener(valueModifyListener);
            if (attributeDefinition.getDefaultValue() != null) {
                comboViewer
                        .setSelection(new StructuredSelection(attributeDefinition.getDefaultValue().getValues()));
            } else {
                comboViewer.setSelection(StructuredSelection.EMPTY);
            }
        } else {
            this.binding = dbc.bindList(ViewerProperties.multipleSelection().observe(comboViewer),
                    EMFEditProperties.list(editingDomain, ErfPackage.Literals.ATTRIBUTE_VALUE_ENUMERATION__VALUES)
                            .observe(attributeValue));
        }
    }

    /**
     * Sets the k color.
     * 
     * @param enumValue the new k color
     */
    protected void setKColor(EnumValue enumValue) {
        org.eclipse.swt.graphics.Color swtColor;
        if (enumValue != null) {
            swtColor = enumValue.getColor().getColor();
        } else if (attributeDefinition.getDefaultValue() != null) {
            swtColor = attributeDefinition.getDefaultValue().getValues().get(0).getColor().getColor();
        } else {
            swtColor = Display.getDefault().getSystemColor(SWT.COLOR_WHITE);
        }
        comboViewer.getControl().setBackground(swtColor);
    }

    @Override
    public void unbind() {
        if (valueModifyListener != null) {
            comboViewer.removeSelectionChangedListener(valueModifyListener);
        }
        super.unbind();
    }

    /**
     * Listener which adds a AttributeValue to a SpecObject in case no attributeValue exists yet.
     * 
     * @see DefaultModifyEvent
     */
    private class DefaultModifyListener implements ISelectionChangedListener {

        /** Spec Object for which a AttributeValue has to be created in case the content of the Text control is changed. */
        SpecObject specObject;

        /** The editing domain. */
        EditingDomain editingDomain;

        public DefaultModifyListener(SpecObject specObject, EditingDomain editingDomain) {
            super();
            this.specObject = specObject;
            this.editingDomain = editingDomain;
        }

        @SuppressWarnings("unchecked")
        @Override
        synchronized public void selectionChanged(SelectionChangedEvent e) {

            if (AttributeDefinitionEnumComposite.this.attributeValue == null) {

                AttributeDefinitionEnumeration attributeDefinition = (AttributeDefinitionEnumeration) viewElement
                        .getAttributeDefinition();

                AbstractListViewer comboViewer = ((AbstractListViewer) e.getSource());

                // as now a value is entered this listener is obsolete
                comboViewer.removeSelectionChangedListener(this);

                // create an Attribute Value
                AttributeValueEnumeration attributeValue = ErfFactoryImpl.eINSTANCE
                        .createAttributeValueEnumeration();

                // set reference to the respective Attribute Definition
                attributeValue.setDefinition(attributeDefinition);

                // set value of attribute definition
                attributeValue.getValues().addAll(((IStructuredSelection) e.getSelection()).toList());

                // create new Attribute value in the model
                Command cmd = AddCommand.create(editingDomain, specObject, ErfPackage.SPEC_OBJECT__VALUES,
                        attributeValue);
                editingDomain.getCommandStack().execute(cmd);
                // AttributeDefinitionEnumComposite.this.bind( specObject, attributeValue, editingDomain );
            }
            comboViewer.refresh();

        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see era.foss.objecteditor.AbstractAttributeDefinitionComposite#getControl()
     */
    @Override
    public Control getControl() {
        return comboViewer.getControl();
    }

}