diva.editor.QoSPropertyEditorPane.java Source code

Java tutorial

Introduction

Here is the source code for diva.editor.QoSPropertyEditorPane.java

Source

/**
 * Copyright 2014 SINTEF <brice.morin@sintef.no>
 *
 * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
 *
 * 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 diva.editor;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.command.RemoveCommand;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;

import diva.Dimension;
import diva.DivaPackage;
import diva.Property;
import diva.PropertyLiteral;
import diva.PropertyValue;
import diva.VariabilityModel;
import diva.Variant;
import diva.impl.DivaFactoryImpl;
import diva.visitors.Visitable;

public class QoSPropertyEditorPane extends DiVATableEditorPane implements Adapter {

    public QoSPropertyEditorPane(DiVATableEditor editor, IWorkbenchPage page, IWorkbenchPart part) {
        super(editor, page, part);
    }

    Notifier eNotifier;

    public Notifier getTarget() {
        return eNotifier;
    }

    public boolean isAdapterForType(Object type) {
        return false;
    }

    public void notifyChanged(Notification notification) {
        if (notification.getNotifier() instanceof Dimension) {
            treeViewerWithColumns.update(notification.getNotifier(), null);
            for (Variant v : ((Dimension) notification.getNotifier()).getVariant())
                treeViewerWithColumns.update(v, null);
        }
        if (notification.getNotifier() instanceof VariabilityModel) {
            VariabilityModel m = (VariabilityModel) notification.getNotifier();
            for (Dimension d : m.getDimension()) {
                if (!d.eAdapters().contains(this))
                    d.eAdapters().add(this);
            }
            for (Property p : m.getProperty()) {
                if (!p.eAdapters().contains(this))
                    p.eAdapters().add(this);
            }
            if (notification.getFeature() == DivaPackage.eINSTANCE.getVariabilityModel_Property()) {
                initializeTableTreeViewer();
            }
        }
        if (notification.getNotifier() instanceof PropertyValue) {
            treeViewerWithColumns.update(((PropertyValue) notification.getNotifier()).eContainer(), null);
        }
        if (notification.getNotifier() instanceof Property) {
            initializeTableTreeViewer();
        }

    }

    public void setTarget(Notifier newTarget) {
        eNotifier = newTarget;

    }

    /**
     * Initializes the table tree viewer, creating columns and setting up
     * editing. {@link #treeViewerWithColumns} should be valid before calling.
     */
    protected void initializeTableTreeViewer() {

        Tree tree = treeViewerWithColumns.getTree();

        // Get rid of any existing stuff
        for (TreeColumn c : columns)
            c.dispose();
        columns.clear();

        tree.setLayoutData(new FillLayout());
        tree.setHeaderVisible(true);
        tree.setLinesVisible(true);
        // tree.setBackground(DiVABackgroundProvider.varColor);

        treeViewerWithColumns.setContentProvider(new VariantContentProvider(editor.getAdaptedFactory()));

        // get the model
        Resource r = editor.getEditingDomain().getResourceSet().getResources().get(0);

        // Find the VariabilityModel and set the input
        for (EObject o : r.getContents()) {
            if (o instanceof VariabilityModel) {
                createPropertyColumns(treeViewerWithColumns, (VariabilityModel) o);
                treeViewerWithColumns.setInput(o);
                if (!o.eAdapters().contains(this))
                    o.eAdapters().add(this);
                for (Dimension d : ((VariabilityModel) o).getDimension()) {
                    d.eAdapters().add(this);
                }
                break;
            }
        }
        treeViewerWithColumns.expandAll();
        // resize all the columns
        for (TreeColumn c : columns)
            c.pack();
    }

    protected void createPropertyColumns(TreeViewer viewer, VariabilityModel m) {
        TreeViewerColumn viewerColumn;
        TreeColumn column;

        /* Column 0 is always the tree itself */
        viewerColumn = new TreeViewerColumn(viewer, SWT.LEAD);
        column = viewerColumn.getColumn();
        columns.add(column);
        // column.setText("Type");
        // column.setToolTipText("Type of the context variable");
        column.setWidth(100);
        viewerColumn.setLabelProvider(
                new DiVALabelProvider(new AdapterFactoryLabelProvider(editor.getAdaptedFactory())));

        for (Property p : m.getProperty()) {
            if (!p.eAdapters().contains(this))
                p.eAdapters().add(this);
            viewerColumn = new TreeViewerColumn(viewer, SWT.LEAD);
            column = viewerColumn.getColumn();
            columns.add(column);
            column.setText("" + p.getName());
            // column.setToolTipText(descriptor.description);
            column.setAlignment(SWT.CENTER);
            column.setWidth(100);
            viewerColumn.setLabelProvider(new QoSPropertyColumnLabelProvider(p));
            viewerColumn.setEditingSupport(new QoSPropertyEditingSupport(viewer, p));
        }

    }

    class VariantContentProvider extends AdapterFactoryContentProvider {

        public VariantContentProvider(AdapterFactory adapterFactory) {
            super(adapterFactory);
        }

        public Object[] getChildren(Object object) {
            if (object instanceof VariabilityModel) {
                return ((VariabilityModel) object).getDimension().toArray();
            } else if (object instanceof Variant) {
                return new Object[0];
            } else if (object instanceof Dimension) {
                return ((Dimension) object).getVariant().toArray();
            }
            return super.getChildren(object);
        }

        public boolean hasChildren(Object object) {
            if (object instanceof VariabilityModel) {
                return ((VariabilityModel) object).getDimension().size() != 0;
            } else if (object instanceof Variant) {
                return false;
            } else if (object instanceof Dimension) {
                return ((Dimension) object).getVariant().size() != 0;
            }
            return super.hasChildren(object);
        }

        public Object[] getElements(Object object) {
            if (object instanceof VariabilityModel) {
                return ((VariabilityModel) object).getDimension().toArray();
            } else if (object instanceof Variant) {
                return new Object[0];
            } else if (object instanceof Dimension) {
                return ((Dimension) object).getVariant().toArray();
            }
            return super.getElements(object);
        }
    }

    /**
     * @return list of {@link ColumnDescriptor}s
     * @generated
     */
    protected List<ColumnDescriptor> getColumnDescriptors() {
        ArrayList<ColumnDescriptor> list = new ArrayList<ColumnDescriptor>();
        return list;
    }

    // static String[] QosValues = {"-", "Very Low", "Low", "Medium", "High",
    // "Very High" };

    public class QoSPropertyEditingSupport extends EditingSupport {

        protected Property property;

        public QoSPropertyEditingSupport(ColumnViewer viewer, Property property) {
            super(viewer);
            this.property = property;
        }

        protected boolean canEdit(Object element) {
            if (element instanceof Variant) {
                Variant v = (Variant) element;
                if (!v.getType().getProperty().contains(property)) {
                    return false;
                }
            }
            return true;
        }

        protected CellEditor getCellEditor(Object element) {
            CellEditor result = null;
            if (element instanceof Variant) {
                String[] choices = new String[property.getLiteral().size()];
                for (int i = 0; i < property.getLiteral().size(); i++)
                    choices[i] = property.getLiteral().get(i).getName();
                result = new ComboBoxCellEditor((Composite) getViewer().getControl(), choices);
            } else if (element instanceof Dimension) {
                result = new CheckboxCellEditor((Composite) getViewer().getControl(), SWT.CHECK);
            }
            return result;
        }

        protected Object getValue(Object element) {
            Object result = null;
            if (element instanceof Variant) {
                Variant v = (Variant) element;
                PropertyValue pv = null;
                for (PropertyValue o : v.getPropertyValue())
                    if (o.getProperty() == property)
                        pv = o;
                if (pv != null) {
                    // find the index of the property literal having this value
                    int res;
                    for (res = 0; res < property.getLiteral().size(); res++) {
                        if (property.getLiteral().get(res).getValue() == pv.getValue())
                            break;
                    }
                    result = res;
                } else
                    result = 0;
            } else if (element instanceof Dimension) {
                Dimension d = (Dimension) element;
                result = d.getProperty().contains(property);
            }
            return result;
        }

        protected void setValue(Object element, Object value) {
            if (value == null) { // Need this check because somehow this gets
                                 // called with value null
                return;
            }
            if (element instanceof Variant) {
                Variant v = (Variant) element;
                PropertyValue pv = null;
                for (PropertyValue o : v.getPropertyValue())
                    if (o.getProperty() == property)
                        pv = o;
                if (pv != null) {
                    // Find the value from the index
                    int idx = (Integer) value;
                    SetCommand cmd = new SetCommand(editor.getEditingDomain(), pv,
                            DivaPackage.eINSTANCE.getPropertyValue_Value(),
                            property.getLiteral().get(idx).getValue());
                    editor.getEditingDomain().getCommandStack().execute(cmd);
                }
                getViewer().update(v, null);
            } else if (element instanceof Dimension) {
                Dimension d = (Dimension) element;
                if (((Boolean) value).booleanValue()) {
                    if (!d.getProperty().contains(property)) {
                        d.getProperty().add(property);
                        AddCommand cmd = new AddCommand(editor.getEditingDomain(), d.getProperty(), property);
                        editor.getEditingDomain().getCommandStack().execute(cmd);
                    }
                } else {
                    RemoveCommand cmd = new RemoveCommand(editor.getEditingDomain(), d.getProperty(), property);
                    editor.getEditingDomain().getCommandStack().execute(cmd);
                }

                getViewer().update(d, null);
                for (Variant v : d.getVariant())
                    getViewer().update(v, null);
            }

        }
    }

    public class QoSPropertyColumnLabelProvider extends ColumnLabelProvider {

        protected Property property;

        private org.eclipse.swt.graphics.Color fNoEditColor;

        private final static String NOEDIT_STRING = "-";

        public QoSPropertyColumnLabelProvider(Property property) {
            super();
            this.property = property;
            this.fNoEditColor = new org.eclipse.swt.graphics.Color(Display.getCurrent(), 230, 230, 230);
        }

        public String getText(Object element) {

            if (element instanceof Variant) {
                Variant v = (Variant) element;

                if (v.getType().getProperty().contains(property)) {
                    PropertyValue pv = null;
                    for (PropertyValue o : v.getPropertyValue())
                        if (o.getProperty() == property)
                            pv = o;
                    if (pv == null) {
                        pv = DivaFactoryImpl.init().createPropertyValue();
                        pv.setProperty(property);
                        pv.setValue(0);
                        AddCommand cmd = new AddCommand(editor.getEditingDomain(), v.getPropertyValue(), pv);
                        editor.getEditingDomain().getCommandStack().execute(cmd);
                    }
                    // if (pv.getValue()<0) pv.setValue(0);
                    // else if (pv.getValue()>=QosValues.length)
                    // pv.setValue(QosValues.length-1);
                    if (!pv.eAdapters().contains(QoSPropertyEditorPane.this))
                        pv.eAdapters().add(QoSPropertyEditorPane.this);

                    // search in the property
                    for (PropertyLiteral l : property.getLiteral()) {
                        if (l.getValue() == pv.getValue())
                            return l.getName();
                    }

                    return "" + pv.getValue();
                } else {
                    return NOEDIT_STRING;
                }
            } else if (element instanceof Dimension) {
                Dimension d = (Dimension) element;
                return "" + d.getProperty().contains(property);
            }

            return NOEDIT_STRING;
        }

        public org.eclipse.swt.graphics.Image getImage(Object element) {
            return super.getImage(element);
        }

        public void dispose() {
            this.fNoEditColor.dispose();
            super.dispose();
        }

        public org.eclipse.swt.graphics.Color getBackground(Object element) {

            if (element instanceof Variant) {
                Variant v = (Variant) element;
                if (!v.getType().getProperty().contains(property)) {
                    return this.fNoEditColor;
                }
            }

            if (element instanceof Visitable) {
                return ((Visitable) element).accept(DiVABackgroundProvider.getInstance(), null);
            }

            return super.getBackground(element);
        }
    }
}