com.netxforge.netxstudio.screens.f1.details.NewEditServiceTree.java Source code

Java tutorial

Introduction

Here is the source code for com.netxforge.netxstudio.screens.f1.details.NewEditServiceTree.java

Source

/*******************************************************************************
 * Copyright (c) 10 dec. 2012 NetXForge.
 * 
 * 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 3 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/>
 * 
 * Contributors: Christophe Bouhier - initial API and implementation and/or
 * initial documentation
 *******************************************************************************/
package com.netxforge.netxstudio.screens.f1.details;

import java.util.Date;
import java.util.List;

import javax.xml.datatype.XMLGregorianCalendar;

import org.eclipse.core.databinding.conversion.IConverter;
import org.eclipse.core.databinding.observable.map.IObservableMap;
import org.eclipse.core.databinding.observable.set.IObservableSet;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.databinding.EMFDataBindingContext;
import org.eclipse.emf.databinding.EMFObservables;
import org.eclipse.emf.databinding.EMFUpdateValueStrategy;
import org.eclipse.emf.databinding.FeaturePath;
import org.eclipse.emf.databinding.IEMFListProperty;
import org.eclipse.emf.databinding.IEMFValueProperty;
import org.eclipse.emf.databinding.edit.EMFEditProperties;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.command.RemoveCommand;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.nebula.widgets.datechooser.DateChooserCombo;
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.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.events.IHyperlinkListener;
import org.eclipse.ui.forms.widgets.ColumnLayoutData;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ImageHyperlink;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.wb.swt.ResourceManager;

import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.netxforge.base.NonModelUtils;
import com.netxforge.netxstudio.common.model.StudioUtils;
import com.netxforge.netxstudio.generics.DateTimeRange;
import com.netxforge.netxstudio.generics.GenericsFactory;
import com.netxforge.netxstudio.generics.GenericsPackage;
import com.netxforge.netxstudio.generics.Lifecycle;
import com.netxforge.netxstudio.library.LibraryPackage;
import com.netxforge.netxstudio.library.NodeType;
import com.netxforge.netxstudio.library.Tolerance;
import com.netxforge.netxstudio.operators.Network;
import com.netxforge.netxstudio.operators.Node;
import com.netxforge.netxstudio.operators.OperatorsPackage;
import com.netxforge.netxstudio.screens.AbstractDetailsScreen;
import com.netxforge.netxstudio.screens.dialog.NodeOrNetworkFilterDialog;
import com.netxforge.netxstudio.screens.dialog.ServiceUserFilterDialog;
import com.netxforge.netxstudio.screens.dialog.ToleranceFilterDialog;
import com.netxforge.netxstudio.screens.f1.ServiceDistributionScreen;
import com.netxforge.netxstudio.screens.f1.ServiceHierarchy;
import com.netxforge.netxstudio.screens.f2.support.ToleranceObservableMapLabelProvider;
import com.netxforge.netxstudio.services.RFSService;
import com.netxforge.netxstudio.services.ServiceDistribution;
import com.netxforge.netxstudio.services.ServiceUser;
import com.netxforge.netxstudio.services.ServicesFactory;
import com.netxforge.netxstudio.services.ServicesPackage;
import com.netxforge.screens.editing.base.IDataScreenInjection;
import com.netxforge.screens.editing.base.IEditingService;
import com.netxforge.screens.editing.base.ScreenUtil;
import com.netxforge.screens.editing.base.util.DateChooserComboObservableValue;

/**
 * Component for showing the Service Summary.
 * 
 * 
 * @author Christophe Bouhier
 * 
 */
public class NewEditServiceTree extends AbstractDetailsScreen implements IDataScreenInjection {

    final IEditingService editingService;

    private final FormToolkit formToolkit = new FormToolkit(Display.getDefault());

    private Text txtName;
    private Text txtDescription;
    private Table table;
    private TableViewer tolerancesTableViewer;
    private RFSService service;
    private Table tblNetworkElements;
    private TableViewer networkElementsTableViewer;
    private TableViewer serviceUserTableViewer;

    private DateChooserCombo dcProposed;
    private DateChooserCombo dcPlanned;
    private DateChooserCombo dcConstruction;
    private DateChooserCombo dcInService;
    private DateChooserCombo dcOutOfService;

    private Section sctnInfo;

    private boolean readonly;

    private int widgetStyle;

    public NewEditServiceTree(Composite parent, int style, final IEditingService editingService) {
        super(parent, style);
        this.editingService = editingService;
        // buildUI();
    }

    private void buildUI() {

        // Readonlyness.
        readonly = ScreenUtil.isReadOnlyOperation(this.getOperation());
        widgetStyle = readonly ? SWT.READ_ONLY : SWT.NONE;

        buildInfoSection();
        buildNetworkElementsSection();
        buildServiceUserSection();
        buildLifeCycleSection();
        buildHierarchySection();
        buildServiceDistributionSection();
        buildToleranceSection();

    }

    private void buildLifeCycleSection() {

        Section sctnLifecycle = toolkit.createSection(this, Section.TITLE_BAR | Section.TWISTIE);
        toolkit.paintBordersFor(sctnLifecycle);
        sctnLifecycle.setText("Lifecycle");

        Composite cmpLifeCycle = toolkit.createComposite(sctnLifecycle, SWT.NONE);
        toolkit.paintBordersFor(cmpLifeCycle);
        sctnLifecycle.setClient(cmpLifeCycle);
        cmpLifeCycle.setLayout(new GridLayout(2, false));

        Label lblProposed = toolkit.createLabel(cmpLifeCycle, "Proposed:", SWT.NONE);
        lblProposed.setAlignment(SWT.RIGHT);
        GridData gd_lblProposed = new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1);
        gd_lblProposed.widthHint = 70;
        lblProposed.setLayoutData(gd_lblProposed);

        dcProposed = new DateChooserCombo(cmpLifeCycle, SWT.BORDER | SWT.FLAT);
        GridData gd_dcProposed = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_dcProposed.heightHint = 20;
        dcProposed.setLayoutData(gd_dcProposed);
        toolkit.adapt(dcProposed);
        toolkit.paintBordersFor(dcProposed);

        Label lblPlanned = toolkit.createLabel(cmpLifeCycle, "Planned:", SWT.NONE);
        lblPlanned.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
        lblPlanned.setAlignment(SWT.RIGHT);

        dcPlanned = new DateChooserCombo(cmpLifeCycle, SWT.BORDER | SWT.FLAT);
        GridData gd_dcPlanned = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_dcPlanned.heightHint = 20;
        dcPlanned.setLayoutData(gd_dcPlanned);
        toolkit.adapt(dcPlanned);
        toolkit.paintBordersFor(dcPlanned);

        Label lblConstruction = toolkit.createLabel(cmpLifeCycle, "Construction:", SWT.NONE);
        lblConstruction.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));

        dcConstruction = new DateChooserCombo(cmpLifeCycle, SWT.BORDER | SWT.FLAT);
        GridData gd_dcConstruction = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_dcConstruction.heightHint = 20;
        dcConstruction.setLayoutData(gd_dcConstruction);
        toolkit.adapt(dcConstruction);
        toolkit.paintBordersFor(dcConstruction);

        Label lblInService = toolkit.createLabel(cmpLifeCycle, "In Service:", SWT.NONE);
        lblInService.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
        lblInService.setAlignment(SWT.RIGHT);

        dcInService = new DateChooserCombo(cmpLifeCycle, SWT.BORDER | SWT.FLAT);
        GridData gd_dcInService = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_dcInService.heightHint = 20;
        dcInService.setLayoutData(gd_dcInService);
        toolkit.adapt(dcInService);
        toolkit.paintBordersFor(dcInService);

        Label lblOutOfService = toolkit.createLabel(cmpLifeCycle, "Out of Service:", SWT.NONE);
        GridData gd_lblOutOfService = new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1);
        gd_lblOutOfService.widthHint = 80;
        lblOutOfService.setLayoutData(gd_lblOutOfService);

        dcOutOfService = new DateChooserCombo(cmpLifeCycle, SWT.BORDER | SWT.FLAT);
        GridData gd_dcOutOfService = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_dcOutOfService.heightHint = 20;
        dcOutOfService.setLayoutData(gd_dcOutOfService);
        dcOutOfService.setWeeksVisible(true);
        toolkit.adapt(dcOutOfService);
        toolkit.paintBordersFor(dcOutOfService);

        if (readonly) {
            dcProposed.setEditable(false);
            dcPlanned.setEditable(false);
            dcConstruction.setEditable(false);
            dcInService.setEditable(false);
            dcOutOfService.setEditable(false);
        }
    }

    private void buildToleranceSection() {
        Section sctnTolerances = formToolkit.createSection(this, Section.TWISTIE | Section.TITLE_BAR);

        formToolkit.paintBordersFor(sctnTolerances);
        sctnTolerances.setText("Tolerances");
        sctnTolerances.setExpanded(false);

        Composite cmpTolerances = formToolkit.createComposite(sctnTolerances, SWT.NONE);
        formToolkit.paintBordersFor(cmpTolerances);
        sctnTolerances.setClient(cmpTolerances);
        cmpTolerances.setLayout(new GridLayout(1, false));

        if (!readonly) {
            ImageHyperlink hypLnkAddTolerance = formToolkit.createImageHyperlink(cmpTolerances, SWT.NONE);
            hypLnkAddTolerance.addHyperlinkListener(new HyperlinkAdapter() {
                public void linkActivated(HyperlinkEvent e) {
                    final Resource toleranceResource = editingService.getData(LibraryPackage.Literals.TOLERANCE);
                    final ToleranceFilterDialog dialog = new ToleranceFilterDialog(
                            NewEditServiceTree.this.getShell(), toleranceResource);
                    if (dialog.open() == IDialogConstants.OK_ID) {
                        Tolerance tol = (Tolerance) dialog.getFirstResult();
                        if (!service.getToleranceRefs().contains(tol)) {
                            Command c = new AddCommand(editingService.getEditingDomain(),
                                    service.getToleranceRefs(), tol);
                            editingService.getEditingDomain().getCommandStack().execute(c);
                        }
                    }
                }
            });
            hypLnkAddTolerance.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
            formToolkit.paintBordersFor(hypLnkAddTolerance);
            hypLnkAddTolerance.setText("Add");
        }
        tolerancesTableViewer = new TableViewer(cmpTolerances, SWT.BORDER | SWT.FULL_SELECTION);
        Table metricsTable = tolerancesTableViewer.getTable();
        metricsTable.setHeaderVisible(true);
        metricsTable.setLinesVisible(true);

        GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
        gd.heightHint = 100;
        metricsTable.setLayoutData(gd);
        formToolkit.paintBordersFor(metricsTable);

        TableViewerColumn tableViewerColumn_4 = new TableViewerColumn(tolerancesTableViewer, SWT.NONE);
        TableColumn tblclmnNewColumn = tableViewerColumn_4.getColumn();
        tblclmnNewColumn.setWidth(100);
        tblclmnNewColumn.setText("Name");

        TableViewerColumn tableViewerColumn_1 = new TableViewerColumn(tolerancesTableViewer, SWT.NONE);
        TableColumn tblclmnLevel = tableViewerColumn_1.getColumn();
        tblclmnLevel.setWidth(69);
        tblclmnLevel.setText("Level");

        TableViewerColumn tableViewerColumn_2 = new TableViewerColumn(tolerancesTableViewer, SWT.NONE);
        TableColumn tblclmnExpression = tableViewerColumn_2.getColumn();
        tblclmnExpression.setWidth(100);
        tblclmnExpression.setText("Expression");

        Menu menu = new Menu(metricsTable);
        metricsTable.setMenu(menu);

        MenuItem mntmRemoveTolerance = new MenuItem(menu, SWT.NONE);
        mntmRemoveTolerance.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                ISelection s = tolerancesTableViewer.getSelection();
                if (s instanceof IStructuredSelection) {
                    Object o = ((IStructuredSelection) s).getFirstElement();
                    Command rc = new RemoveCommand(editingService.getEditingDomain(), service.getToleranceRefs(),
                            o);
                    editingService.getEditingDomain().getCommandStack().execute(rc);
                }
            }
        });
        mntmRemoveTolerance.setText("Remove");

        if (readonly) {
            mntmRemoveTolerance.setEnabled(false);

        }
    }

    private void buildServiceDistributionSection() {
        Section sctnDistribution = formToolkit.createSection(this, Section.TWISTIE | Section.TITLE_BAR);
        formToolkit.paintBordersFor(sctnDistribution);
        sctnDistribution.setText("Distribution");
        sctnDistribution.setExpanded(false);

        Composite composite_4 = formToolkit.createComposite(sctnDistribution, SWT.NONE);
        formToolkit.paintBordersFor(composite_4);
        sctnDistribution.setClient(composite_4);
        composite_4.setLayout(new GridLayout(1, false));

        ImageHyperlink mghprlnkEdit = formToolkit.createImageHyperlink(composite_4, SWT.NONE);
        mghprlnkEdit.addHyperlinkListener(new HyperlinkAdapter() {
            public void linkActivated(HyperlinkEvent e) {

                if (!service.eIsSet(ServicesPackage.Literals.SERVICE__SERVICE_DISTRIBUTION)) {
                    if (!readonly) {
                        ServiceDistribution sd = ServicesFactory.eINSTANCE.createServiceDistribution();
                        service.setServiceDistribution(sd);
                    } else {
                        MessageDialog.openInformation(NewEditServiceTree.this.getShell(),
                                "Service Distribution is not existing",
                                "A Service distribution object can only be created in edit mode");
                        return;
                    }

                }

                final ServiceDistributionScreen screen = new ServiceDistributionScreen(
                        screenService.getScreenContainer(), SWT.NONE);
                screen.setScreenService(screenService);
                screen.setOperation(getOperation());
                screen.injectData(null, service);
                screenService.setActiveScreen(screen);
            }
        });
        mghprlnkEdit.setImage(ResourceManager.getPluginImage("com.netxforge.netxstudio.models.edit",
                "icons/full/obj16/Servicedistribution_H.png"));
        formToolkit.paintBordersFor(mghprlnkEdit);

        mghprlnkEdit.setText(this.getOperationText());
    }

    private void buildHierarchySection() {
        Section sctnHiarchy = formToolkit.createSection(this, Section.TWISTIE | Section.TITLE_BAR);
        formToolkit.paintBordersFor(sctnHiarchy);
        sctnHiarchy.setText("Hierarchy");

        Composite hierarchyComposite = formToolkit.createComposite(sctnHiarchy, SWT.NONE);
        formToolkit.paintBordersFor(hierarchyComposite);
        sctnHiarchy.setClient(hierarchyComposite);
        hierarchyComposite.setLayout(new GridLayout(1, false));

        ImageHyperlink mghprlnkShowHiararchy = formToolkit.createImageHyperlink(hierarchyComposite, SWT.NONE);
        mghprlnkShowHiararchy.addHyperlinkListener(new IHyperlinkListener() {
            public void linkActivated(HyperlinkEvent e) {

                ServiceHierarchy sh = new ServiceHierarchy(screenService.getScreenContainer(), SWT.NONE);
                sh.setScreenService(screenService);
                sh.setOperation(ScreenUtil.OPERATION_READ_ONLY);
                sh.injectData(null, service);
                screenService.setActiveScreen(sh);
            }

            public void linkEntered(HyperlinkEvent e) {
            }

            public void linkExited(HyperlinkEvent e) {
            }
        });
        formToolkit.paintBordersFor(mghprlnkShowHiararchy);
        mghprlnkShowHiararchy.setText("Show Hierarchy");
    }

    private void buildServiceUserSection() {
        Section sctnServiceUsers = formToolkit.createSection(this,
                Section.EXPANDED | Section.TWISTIE | Section.TITLE_BAR);
        ColumnLayoutData cld_sctnServiceUsers = new ColumnLayoutData();
        cld_sctnServiceUsers.heightHint = 150;
        sctnServiceUsers.setLayoutData(cld_sctnServiceUsers);
        formToolkit.paintBordersFor(sctnServiceUsers);
        sctnServiceUsers.setText("Service Users");
        sctnServiceUsers.setExpanded(true);

        Composite composite_1 = formToolkit.createComposite(sctnServiceUsers, SWT.NONE);
        formToolkit.paintBordersFor(composite_1);
        sctnServiceUsers.setClient(composite_1);
        composite_1.setLayout(new GridLayout(1, false));

        if (!readonly) {
            ImageHyperlink mghprlnkAddServiceUser = formToolkit.createImageHyperlink(composite_1, SWT.NONE);
            mghprlnkAddServiceUser.setImage(null);
            mghprlnkAddServiceUser.addHyperlinkListener(new HyperlinkAdapter() {
                public void linkActivated(HyperlinkEvent e) {
                    Resource serviceUserResource = editingService.getData(ServicesPackage.Literals.SERVICE_USER);

                    ServiceUserFilterDialog dialog = new ServiceUserFilterDialog(NewEditServiceTree.this.getShell(),
                            serviceUserResource);

                    if (dialog.open() == IDialogConstants.OK_ID) {
                        ServiceUser u = (ServiceUser) dialog.getFirstResult();
                        if (!service.getServiceUserRefs().contains(u)) {
                            Command c = new AddCommand(editingService.getEditingDomain(),
                                    service.getServiceUserRefs(), u);
                            editingService.getEditingDomain().getCommandStack().execute(c);
                        }
                    }
                }
            });
            mghprlnkAddServiceUser.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false, 1, 1));
            formToolkit.paintBordersFor(mghprlnkAddServiceUser);
            mghprlnkAddServiceUser.setText("Add");
        }

        serviceUserTableViewer = new TableViewer(composite_1, SWT.BORDER | SWT.FULL_SELECTION);
        table = serviceUserTableViewer.getTable();
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
        GridData gd_table = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
        gd_table.heightHint = 120;
        table.setLayoutData(gd_table);
        formToolkit.paintBordersFor(table);

        TableViewerColumn tableViewerColumn = new TableViewerColumn(serviceUserTableViewer, SWT.NONE);
        TableColumn tblclmnName = tableViewerColumn.getColumn();
        tblclmnName.setWidth(120);
        tblclmnName.setText("Name");

        Menu menu_1 = new Menu(table);
        table.setMenu(menu_1);

        MenuItem mntmRemove = new MenuItem(menu_1, SWT.NONE);
        mntmRemove.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                ISelection s = serviceUserTableViewer.getSelection();
                if (s instanceof IStructuredSelection) {
                    Object o = ((IStructuredSelection) s).toList();
                    Command rc = new RemoveCommand(editingService.getEditingDomain(), service.getServiceUserRefs(),
                            (List<?>) o);
                    editingService.getEditingDomain().getCommandStack().execute(rc);
                }
            }
        });

        mntmRemove.setText("Remove");

        if (readonly) {
            mntmRemove.setEnabled(false);
        }
    }

    private void buildNetworkElementsSection() {
        Section sctnNetworkElements = formToolkit.createSection(this, Section.TWISTIE | Section.TITLE_BAR);
        ColumnLayoutData cld_sctnNetworkElements = new ColumnLayoutData();
        cld_sctnNetworkElements.heightHint = 38;
        sctnNetworkElements.setLayoutData(cld_sctnNetworkElements);
        formToolkit.paintBordersFor(sctnNetworkElements);
        sctnNetworkElements.setText("Network Elements");
        sctnNetworkElements.setExpanded(true);

        Composite composite_3 = formToolkit.createComposite(sctnNetworkElements, SWT.NONE);
        formToolkit.paintBordersFor(composite_3);
        sctnNetworkElements.setClient(composite_3);
        composite_3.setLayout(new GridLayout(1, false));

        if (!readonly) {
            ImageHyperlink mghprlnkAddNetworkElement = formToolkit.createImageHyperlink(composite_3, SWT.NONE);
            mghprlnkAddNetworkElement.addHyperlinkListener(new HyperlinkAdapter() {
                public void linkActivated(HyperlinkEvent e) {

                    final Resource operatorResource = editingService.getData(OperatorsPackage.Literals.OPERATOR);

                    final NodeOrNetworkFilterDialog dialog = new NodeOrNetworkFilterDialog(
                            NewEditServiceTree.this.getShell(), operatorResource);

                    if (dialog.open() == IDialogConstants.OK_ID) {
                        Object o = dialog.getFirstResult();

                        List<Node> nodesToAdd = Lists.newArrayList();
                        // find non duplicates.
                        if (o instanceof Node) {
                            nodesToAdd.add((Node) o);
                        }
                        if (o instanceof Network) {
                            // Adds all closure nodes.
                            nodesToAdd.addAll(StudioUtils.nodesForNetwork((Network) o));
                        }

                        Iterable<Node> filter = Iterables.filter(nodesToAdd, new Predicate<Node>() {
                            public boolean apply(Node input) {
                                return !service.getNodes().contains(input);
                            }
                        });

                        Command c = new AddCommand(editingService.getEditingDomain(), service.getNodes(),
                                Lists.newArrayList(filter));
                        editingService.getEditingDomain().getCommandStack().execute(c);
                    }

                }
            });
            mghprlnkAddNetworkElement.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false, 1, 1));
            formToolkit.paintBordersFor(mghprlnkAddNetworkElement);
            mghprlnkAddNetworkElement.setText("Add");

        }

        networkElementsTableViewer = new TableViewer(composite_3, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
        tblNetworkElements = networkElementsTableViewer.getTable();
        tblNetworkElements.setLinesVisible(true);
        tblNetworkElements.setHeaderVisible(true);
        GridData gd_table_1 = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
        gd_table_1.heightHint = 146;
        tblNetworkElements.setLayoutData(gd_table_1);
        formToolkit.paintBordersFor(tblNetworkElements);

        TableViewerColumn tbvClmnType = new TableViewerColumn(networkElementsTableViewer, SWT.NONE);
        TableColumn tblclmnNodeId = tbvClmnType.getColumn();
        tblclmnNodeId.setWidth(79);
        tblclmnNodeId.setText("Type");

        TableViewerColumn tbvClmnNodeID = new TableViewerColumn(networkElementsTableViewer, SWT.NONE);
        TableColumn tblclmnNewColumn_1 = tbvClmnNodeID.getColumn();
        tblclmnNewColumn_1.setWidth(120);
        tblclmnNewColumn_1.setText("ID");

        Menu menu_2 = new Menu(tblNetworkElements);
        tblNetworkElements.setMenu(menu_2);

        MenuItem mntmRemoveNetworkElement = new MenuItem(menu_2, SWT.NONE);
        mntmRemoveNetworkElement.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                ISelection s = networkElementsTableViewer.getSelection();
                if (s instanceof IStructuredSelection) {
                    Object o = ((IStructuredSelection) s).toList();
                    Command rc = new RemoveCommand(editingService.getEditingDomain(), service.getNodes(),
                            (List<?>) o);

                    // Command rc = new RemoveCommand(editingService
                    // .getEditingDomain(), service,
                    // ServicesPackage.Literals.RFS_SERVICE__NODES, o);

                    editingService.getEditingDomain().getCommandStack().execute(rc);
                }
            }
        });
        mntmRemoveNetworkElement.setText("Remove");

        if (readonly) {
            mntmRemoveNetworkElement.setEnabled(false);
        }
    }

    // private void buildSummarySection() {
    //
    // Section sctnSummary = formToolkit.createSection(this, Section.TWISTIE
    // | Section.TITLE_BAR);
    // formToolkit.paintBordersFor(sctnSummary);
    // sctnSummary.setText("Summary");
    // sctnSummary.setExpanded(true);
    //
    // final Composite content = formToolkit.createComposite(sctnSummary,
    // SWT.NONE);
    // formToolkit.paintBordersFor(content);
    // content.setLayout(new FillLayout());
    // sctnSummary.setClient(content);
    //
    // summaryComponent.setParentScreen(this);
    // summaryComponent.buildUI(content, null);
    //
    // }

    private void buildInfoSection() {
        sctnInfo = formToolkit.createSection(this, Section.EXPANDED | Section.TWISTIE | Section.TITLE_BAR);
        formToolkit.paintBordersFor(sctnInfo);
        sctnInfo.setText("Info");
        sctnInfo.setExpanded(true);

        Composite composite = formToolkit.createComposite(sctnInfo, SWT.NONE);
        formToolkit.paintBordersFor(composite);
        sctnInfo.setClient(composite);
        composite.setLayout(new GridLayout(2, false));

        Label lblName = formToolkit.createLabel(composite, " Name:", SWT.NONE);
        lblName.setAlignment(SWT.RIGHT);
        GridData gd_lblName = new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1);
        gd_lblName.widthHint = 70;
        lblName.setLayoutData(gd_lblName);
        lblName.setBounds(0, 0, 59, 14);

        txtName = formToolkit.createText(composite, "New Text", widgetStyle);
        txtName.setText("");
        GridData gd_txtName = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_txtName.widthHint = 150;
        txtName.setLayoutData(gd_txtName);

        Label lblDescription = formToolkit.createLabel(composite, "Description:", SWT.NONE);
        lblDescription.setAlignment(SWT.RIGHT);
        lblDescription.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false, 1, 1));

        txtDescription = formToolkit.createText(composite, "New Text", SWT.WRAP | SWT.MULTI | widgetStyle);
        txtDescription.setText("");
        GridData gd_txtDescription = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
        gd_txtDescription.heightHint = 133;
        txtDescription.setLayoutData(gd_txtDescription);
    }

    public EMFDataBindingContext initDataBindings_() {

        EMFDataBindingContext context = new EMFDataBindingContext();

        // Defaults for 8 months.

        // TODO, Migrate to Dashboard
        Date startTime = NonModelUtils.monthsAgo(8);
        startTime = NonModelUtils.adjustToDayStart(startTime);

        Date endTime = NonModelUtils.todayAtDayEnd();
        @SuppressWarnings("unused")
        DateTimeRange period = StudioUtils.period(startTime, endTime);

        bindInfoSection(context);
        bindLifeCycle(context);
        bindNetworkElementSection();
        bindServiceUserSection();
        bindToleranceSection();

        return context;
    }

    private void bindInfoSection(EMFDataBindingContext context) {
        IObservableValue nameObservable = SWTObservables.observeDelayedValue(400,
                SWTObservables.observeText(txtName, SWT.Modify));

        IObservableValue descriptionObservable = SWTObservables.observeDelayedValue(400,
                SWTObservables.observeText(txtDescription, SWT.Modify));

        IEMFValueProperty nameProperty = EMFEditProperties.value(editingService.getEditingDomain(),
                ServicesPackage.Literals.SERVICE__SERVICE_NAME);

        IEMFValueProperty descriptionProperty = EMFEditProperties.value(editingService.getEditingDomain(),
                ServicesPackage.Literals.SERVICE__SERVICE_DESCRIPTION);

        context.bindValue(nameObservable, nameProperty.observe(service), null, null);
        context.bindValue(descriptionObservable, descriptionProperty.observe(service), null, null);
    }

    public void bindToleranceSection() {
        ObservableListContentProvider listContentProvider = new ObservableListContentProvider();
        tolerancesTableViewer.setContentProvider(listContentProvider);
        IObservableMap[] observeMaps = EMFObservables.observeMaps(listContentProvider.getKnownElements(),
                new EStructuralFeature[] { LibraryPackage.Literals.TOLERANCE__NAME,
                        LibraryPackage.Literals.TOLERANCE__LEVEL,
                        LibraryPackage.Literals.TOLERANCE__EXPRESSION_REF });
        tolerancesTableViewer.setLabelProvider(new ToleranceObservableMapLabelProvider(observeMaps));
        IEMFListProperty l = EMFEditProperties.list(editingService.getEditingDomain(),
                ServicesPackage.Literals.RFS_SERVICE__TOLERANCE_REFS);

        tolerancesTableViewer.setInput(l.observe(service));
    }

    public void bindNetworkElementSection() {

        ObservableListContentProvider listContentProvider = new ObservableListContentProvider();
        networkElementsTableViewer.setContentProvider(listContentProvider);
        IObservableSet set = listContentProvider.getKnownElements();

        List<IObservableMap> mapList = Lists.newArrayList();

        mapList.add(EMFEditProperties
                .value(editingService.getEditingDomain(), ServicesPackage.Literals.RFS_SERVICE__NODES)
                .observeDetail(set));
        mapList.add(EMFEditProperties
                .value(editingService.getEditingDomain(), OperatorsPackage.Literals.NODE__NODE_TYPE)
                .observeDetail(set));
        mapList.add(
                EMFEditProperties.value(editingService.getEditingDomain(), OperatorsPackage.Literals.NODE__NODE_ID)
                        .observeDetail(set));

        // IObservableMap[] observeMaps = EMFObservables.observeMaps(
        // listContentProvider.getKnownElements(),
        // new EStructuralFeature[] {,});

        IObservableMap[] map = new IObservableMap[mapList.size()];
        mapList.toArray(map);

        networkElementsTableViewer.setLabelProvider(new NodeInServiceObservableMapLabelProvider(map));

        IEMFListProperty l = EMFEditProperties.list(editingService.getEditingDomain(),
                ServicesPackage.Literals.RFS_SERVICE__NODES);

        networkElementsTableViewer.setInput(l.observe(service));
    }

    protected void bindLifeCycle(EMFDataBindingContext context) {
        IObservableValue dcProposedObservable = new DateChooserComboObservableValue(dcProposed, SWT.Modify);

        IObservableValue dcPlannedObservable = new DateChooserComboObservableValue(dcPlanned, SWT.Modify);

        IObservableValue dcConstructionObservable = new DateChooserComboObservableValue(dcConstruction, SWT.Modify);

        IObservableValue dcInServiceObservable = new DateChooserComboObservableValue(dcInService, SWT.Modify);

        IObservableValue dcOutOfServiceObservable = new DateChooserComboObservableValue(dcOutOfService, SWT.Modify);

        IEMFValueProperty proposedProperty = EMFEditProperties.value(editingService.getEditingDomain(),
                FeaturePath.fromList(ServicesPackage.Literals.SERVICE__LIFECYCLE,
                        GenericsPackage.Literals.LIFECYCLE__PROPOSED));

        IEMFValueProperty plannedProperty = EMFEditProperties.value(editingService.getEditingDomain(),
                FeaturePath.fromList(ServicesPackage.Literals.SERVICE__LIFECYCLE,
                        GenericsPackage.Literals.LIFECYCLE__PLANNED_DATE));

        IEMFValueProperty constructionProperty = EMFEditProperties.value(editingService.getEditingDomain(),
                FeaturePath.fromList(ServicesPackage.Literals.SERVICE__LIFECYCLE,
                        GenericsPackage.Literals.LIFECYCLE__CONSTRUCTION_DATE));

        IEMFValueProperty inServiceProperty = EMFEditProperties.value(editingService.getEditingDomain(),
                FeaturePath.fromList(ServicesPackage.Literals.SERVICE__LIFECYCLE,
                        GenericsPackage.Literals.LIFECYCLE__IN_SERVICE_DATE));

        IEMFValueProperty outOfServiceProperty = EMFEditProperties.value(editingService.getEditingDomain(),
                FeaturePath.fromList(ServicesPackage.Literals.SERVICE__LIFECYCLE,
                        GenericsPackage.Literals.LIFECYCLE__OUT_OF_SERVICE_DATE));

        EMFUpdateValueStrategy modelToTargetUpdateStrategy = new EMFUpdateValueStrategy();
        modelToTargetUpdateStrategy.setConverter(new IConverter() {

            public Object getFromType() {
                return XMLGregorianCalendar.class;
            }

            public Object getToType() {
                return Date.class;
            }

            public Object convert(Object fromObject) {
                if (fromObject != null) {
                    return NonModelUtils.fromXMLDate((XMLGregorianCalendar) fromObject);
                } else {
                    return fromObject;
                }
            }
        });

        EMFUpdateValueStrategy targetToModelUpdateStrategy = new EMFUpdateValueStrategy();
        targetToModelUpdateStrategy.setConverter(new IConverter() {

            public Object getFromType() {
                return Date.class;
            }

            public Object getToType() {

                return XMLGregorianCalendar.class;
            }

            public Object convert(Object fromObject) {
                if (fromObject != null) {
                    return NonModelUtils.toXMLDate((Date) fromObject);
                } else {
                    return fromObject;
                }
            }
        });

        // Create a new lifecycle if non-existent.
        if (service.getLifecycle() == null) {
            Lifecycle newLC = GenericsFactory.eINSTANCE.createLifecycle();
            service.setLifecycle(newLC);
        }

        context.bindValue(dcProposedObservable, proposedProperty.observe(service), targetToModelUpdateStrategy,
                modelToTargetUpdateStrategy);

        context.bindValue(dcPlannedObservable, plannedProperty.observe(service), targetToModelUpdateStrategy,
                modelToTargetUpdateStrategy);

        context.bindValue(dcConstructionObservable, constructionProperty.observe(service),
                targetToModelUpdateStrategy, modelToTargetUpdateStrategy);

        context.bindValue(dcInServiceObservable, inServiceProperty.observe(service), targetToModelUpdateStrategy,
                modelToTargetUpdateStrategy);

        context.bindValue(dcOutOfServiceObservable, outOfServiceProperty.observe(service),
                targetToModelUpdateStrategy, modelToTargetUpdateStrategy);
    }

    public void bindServiceUserSection() {

        ObservableListContentProvider listContentProvider = new ObservableListContentProvider();
        serviceUserTableViewer.setContentProvider(listContentProvider);
        IObservableMap[] observeMaps = EMFObservables.observeMaps(listContentProvider.getKnownElements(),
                new EStructuralFeature[] { ServicesPackage.Literals.SERVICE_USER__NAME });
        serviceUserTableViewer.setLabelProvider(new ObservableMapLabelProvider(observeMaps));
        IEMFListProperty l = EMFEditProperties.list(editingService.getEditingDomain(),
                ServicesPackage.Literals.SERVICE__SERVICE_USER_REFS);

        serviceUserTableViewer.setInput(l.observe(service));
    }

    public class NodeInServiceObservableMapLabelProvider extends ObservableMapLabelProvider {

        public NodeInServiceObservableMapLabelProvider(IObservableMap[] attributeMaps) {
            super(attributeMaps);
        }

        @Override
        public String getColumnText(Object element, int columnIndex) {
            if (element instanceof Node) {
                Node t = (Node) element;
                switch (columnIndex) {
                case 0: {
                    if (t.getNodeType() != null) {
                        NodeType e = t.getNodeType();
                        return e.getName();
                    }
                }
                    break;
                case 1: {
                    return ((Node) element).getNodeID();
                }
                }
            }

            return super.getColumnText(element, columnIndex);
        }
    }

    public void disposeData() {
    }

    @Override
    public Viewer getViewer() {
        return null;
    }

    public boolean isValid() {
        return false;
    }

    public void injectData(Object owner, Object object) {

        if (object != null && object instanceof RFSService) {
            service = (RFSService) object;
        } else {
            throw new java.lang.IllegalArgumentException("Data injection for screen invalid");
        }

        // Hack to clean a stale reference, which was not removed when deleting
        // an object.
        CDOUtil.cleanStaleReference(service, ServicesPackage.Literals.RFS_SERVICE__NODES);

        buildUI();
        this.initDataBindings_();

    }

}