com.netxforge.netxstudio.callflow.screens.protocols.Protocols.java Source code

Java tutorial

Introduction

Here is the source code for com.netxforge.netxstudio.callflow.screens.protocols.Protocols.java

Source

/*******************************************************************************
 * Copyright (c) May 9, 2011 NetXForge.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser 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 Lesser 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.callflow.screens.protocols;

import java.util.List;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.observable.IObservable;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.map.IObservableMap;
import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.emf.databinding.EMFDataBindingContext;
import org.eclipse.emf.databinding.EMFObservables;
import org.eclipse.emf.databinding.IEMFListProperty;
import org.eclipse.emf.databinding.IEMFValueProperty;
import org.eclipse.emf.databinding.edit.EMFEditProperties;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.databinding.viewers.ObservableListTreeContentProvider;
import org.eclipse.jface.databinding.viewers.TreeStructureAdvisor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.layout.FillLayout;
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.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.events.IHyperlinkListener;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ImageHyperlink;
import org.eclipse.wb.swt.ResourceManager;

import com.google.common.collect.Lists;
import com.netxforge.netxstudio.callflow.screens.AbstractScreen;
import com.netxforge.netxstudio.callflow.screens.referenceNetwork.TextCellEditingSupport;
import com.netxforge.netxstudio.protocols.Message;
import com.netxforge.netxstudio.protocols.Procedure;
import com.netxforge.netxstudio.protocols.Protocol;
import com.netxforge.netxstudio.protocols.ProtocolsFactory;
import com.netxforge.netxstudio.protocols.ProtocolsPackage;
import com.netxforge.screens.editing.base.IDataServiceInjection;
import com.netxforge.screens.editing.base.ScreenUtil;
import com.netxforge.screens.editing.base.filter.SearchFilter;

/**
 * @author Christophe Bouhier christophe.bouhier@netxforge.com
 * 
 */
public class Protocols extends AbstractScreen implements IDataServiceInjection {

    private final FormToolkit toolkit = new FormToolkit(Display.getCurrent());
    private Text txtFilterText;

    private Tree tree;

    private TreeViewer treeViewer;

    @SuppressWarnings("unused")
    private DataBindingContext bindingContext;
    private Form frmProtocols;
    private Resource protocolResource;
    private TreeViewerColumn tvcName;
    private TreeViewerColumn tvcDescription;

    /**
     * Create the composite.
     * 
     * @param parent
     * @param style
     */
    public Protocols(Composite parent, int style) {
        super(parent, style);

        addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                toolkit.dispose();
            }
        });
        toolkit.adapt(this);
        toolkit.paintBordersFor(this);
        // buildUI();
    }

    private void buildUI() {
        setLayout(new FillLayout(SWT.HORIZONTAL));

        // Readonlyness.
        boolean readonly = ScreenUtil.isReadOnlyOperation(this.getOperation());
        String actionText = readonly ? "View: " : "Edit: ";
        int widgetStyle = readonly ? SWT.READ_ONLY : SWT.NONE;

        frmProtocols = toolkit.createForm(this);
        frmProtocols.setSeparatorVisible(true);

        toolkit.decorateFormHeading(frmProtocols);
        toolkit.paintBordersFor(frmProtocols);

        frmProtocols.setText(actionText + "Protocols");
        frmProtocols.getBody().setLayout(new GridLayout(3, false));

        Label lblFilterLabel = toolkit.createLabel(frmProtocols.getBody(), "Filter:", SWT.NONE);
        GridData gd_lblFilterLabel = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_lblFilterLabel.widthHint = 36;
        lblFilterLabel.setLayoutData(gd_lblFilterLabel);

        txtFilterText = toolkit.createText(frmProtocols.getBody(), "New Text",
                SWT.H_SCROLL | SWT.SEARCH | SWT.CANCEL);
        txtFilterText.setText("");
        GridData gd_txtFilterText = new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1);
        gd_txtFilterText.widthHint = 200;
        txtFilterText.setLayoutData(gd_txtFilterText);

        txtFilterText.addKeyListener(new KeyAdapter() {
            public void keyReleased(KeyEvent ke) {
                treeViewer.refresh();
                ViewerFilter[] filters = treeViewer.getFilters();
                for (ViewerFilter viewerFilter : filters) {
                    if (viewerFilter instanceof SearchFilter) {
                        ((SearchFilter) viewerFilter).setSearchText(txtFilterText.getText());
                    }
                }
            }
        });

        // Conditional widget.
        if (!readonly) {
            ImageHyperlink mghprlnkNew = toolkit.createImageHyperlink(frmProtocols.getBody(), SWT.NONE);
            mghprlnkNew.addHyperlinkListener(new IHyperlinkListener() {
                public void linkActivated(HyperlinkEvent e) {

                    NewEditProtocol protocolScreen = new NewEditProtocol(screenService.getScreenContainer(),
                            SWT.NONE);
                    protocolScreen.setOperation(ScreenUtil.OPERATION_NEW);
                    protocolScreen.setScreenService(screenService);
                    Protocol protocol = ProtocolsFactory.eINSTANCE.createProtocol();
                    protocolScreen.injectData(protocolResource, protocol);
                    screenService.setActiveScreen(protocolScreen);

                }

                public void linkEntered(HyperlinkEvent e) {
                }

                public void linkExited(HyperlinkEvent e) {
                }
            });
            mghprlnkNew.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
            mghprlnkNew.setImage(ResourceManager.getPluginImage("com.netxforge.netxstudio.models.edit",
                    "icons/full/ctool16/Protocol_E.png"));
            mghprlnkNew.setBounds(0, 0, 114, 17);
            toolkit.paintBordersFor(mghprlnkNew);
            mghprlnkNew.setText("New");

        }

        // new Label(frmProtocols.getBody(), SWT.NONE);

        treeViewer = new TreeViewer(frmProtocols.getBody(),
                SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI | widgetStyle);
        tree = treeViewer.getTree();
        tree.setLinesVisible(true);
        tree.setHeaderVisible(true);
        tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1));
        toolkit.paintBordersFor(tree);

        {
            TreeViewerColumn tableViewerColumn = new TreeViewerColumn(treeViewer, SWT.NONE);
            TreeColumn tblclmnName = tableViewerColumn.getColumn();
            tblclmnName.setWidth(50);
            tblclmnName.setText("Index");
        }
        {
            tvcName = new TreeViewerColumn(treeViewer, SWT.NONE);
            TreeColumn tblclmnName = tvcName.getColumn();
            tblclmnName.setWidth(111);
            tblclmnName.setText("Name");
        }

        {
            tvcDescription = new TreeViewerColumn(treeViewer, SWT.NONE);
            TreeColumn tblclmnDescription = tvcDescription.getColumn();
            tblclmnDescription.setWidth(214);
            tblclmnDescription.setText("Description");
        }
        {
            TreeViewerColumn tableViewerColumn_2 = new TreeViewerColumn(treeViewer, SWT.NONE);
            TreeColumn tblclmnOSI = tableViewerColumn_2.getColumn();
            tblclmnOSI.setWidth(250);
            tblclmnOSI.setText("OSI");
        }
        TreeViewerColumn tableViewerColumn_3 = new TreeViewerColumn(treeViewer, SWT.NONE);
        TreeColumn tblclmnSpecification = tableViewerColumn_3.getColumn();
        tblclmnSpecification.setWidth(100);
        tblclmnSpecification.setText("Specification");
        treeViewer.addFilter(new SearchFilter());
    }

    /**
     * Wrap in an action, to contribute to a menu manager.
     * 
     * @author Christophe Bouhier
     * 
     */
    class EditProtocolAction extends Action {

        public EditProtocolAction(String text) {
            super(text);
        }

        @Override
        public void run() {
            super.run();
            if (screenService != null) {
                ISelection selection = treeViewer.getSelection();
                if (selection instanceof IStructuredSelection) {
                    Object o = ((IStructuredSelection) selection).getFirstElement();
                    if (o instanceof Protocol) {
                        NewEditProtocol protocolScreen = new NewEditProtocol(screenService.getScreenContainer(),
                                SWT.NONE);
                        protocolScreen.setOperation(getOperation());
                        protocolScreen.setScreenService(screenService);
                        protocolScreen.injectData(protocolResource, o);
                        screenService.setActiveScreen(protocolScreen);
                    } else if (o instanceof Procedure) {

                    } else if (o instanceof Message) {

                    }
                }
            }
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.netxforge.netxstudio.data.IDataServiceInjection#injectData()
     */
    public void injectData() {
        protocolResource = editingService.getData(ProtocolsPackage.Literals.PROTOCOL);
        buildUI();
        bindingContext = initDataBindings_();
    }

    public EMFDataBindingContext initDataBindings_() {

        // Bind a tree viewer to call flows and reference interfaces in the call
        // flow.
        ObservableListTreeContentProvider listContentProvider = new ObservableListTreeContentProvider(
                new ProtocolsTreeFactoryImpl(editingService.getEditingDomain()),
                new ProtocolsTreeStructureAdvisorImpl());

        treeViewer.setContentProvider(listContentProvider);
        IObservableMap[] observeMaps = EMFObservables.observeMaps(listContentProvider.getKnownElements(),
                new EStructuralFeature[] { ProtocolsPackage.Literals.PROTOCOL__NAME,
                        ProtocolsPackage.Literals.PROTOCOL__DESCRIPTION, ProtocolsPackage.Literals.PROTOCOL__OSI,
                        ProtocolsPackage.Literals.PROTOCOL__SPECIFICATION,
                        ProtocolsPackage.Literals.PROCEDURE__NAME, ProtocolsPackage.Literals.MESSAGE__NAME,
                        ProtocolsPackage.Literals.MESSAGE__DESCRIPTION });
        treeViewer.setLabelProvider(new ProtocolsTreeLabelProvider(observeMaps));
        IEMFListProperty l = EMFEditProperties.resource(editingService.getEditingDomain());
        IObservableList protocolObservableList = l.observe(protocolResource);

        // obm.addObservable(toleranceObservableList);
        treeViewer.setInput(protocolObservableList);

        EMFDataBindingContext bindingContext = new EMFDataBindingContext();

        {

            IObservableFactory nameObservableFactory = new IObservableFactory() {

                IEMFValueProperty protocolNameProperty = EMFEditProperties.value(editingService.getEditingDomain(),
                        ProtocolsPackage.Literals.PROTOCOL__NAME);

                IEMFValueProperty procedureNameProperty = EMFEditProperties.value(editingService.getEditingDomain(),
                        ProtocolsPackage.Literals.PROCEDURE__NAME);

                IEMFValueProperty msgNameProperty = EMFEditProperties.value(editingService.getEditingDomain(),
                        ProtocolsPackage.Literals.MESSAGE__NAME);

                public IObservable createObservable(Object target) {
                    if (target instanceof IObservableValue) {
                        return (IObservable) target;
                    } else if (target instanceof Protocol) {
                        return protocolNameProperty.observe(target);
                    } else if (target instanceof Procedure) {
                        return procedureNameProperty.observe(target);
                    } else if (target instanceof Message) {
                        return msgNameProperty.observe(target);
                    }
                    return null;
                }
            };

            final TextCellEditingSupport editingSupportName = new TextCellEditingSupport(treeViewer, bindingContext,
                    tree, editingService.getEditingDomain(), nameObservableFactory);

            tvcName.setEditingSupport(editingSupportName);
        }

        {

            IObservableFactory nameObservableFactory = new IObservableFactory() {

                IEMFValueProperty protocolNameProperty = EMFEditProperties.value(editingService.getEditingDomain(),
                        ProtocolsPackage.Literals.PROTOCOL__DESCRIPTION);

                IEMFValueProperty msgNameProperty = EMFEditProperties.value(editingService.getEditingDomain(),
                        ProtocolsPackage.Literals.MESSAGE__DESCRIPTION);

                public IObservable createObservable(Object target) {
                    if (target instanceof IObservableValue) {
                        return (IObservable) target;
                    } else if (target instanceof Protocol) {
                        return protocolNameProperty.observe(target);
                    } else if (target instanceof Message) {
                        return msgNameProperty.observe(target);
                    }
                    return null;
                }
            };

            TextCellEditingSupport editingSupportDescription = new TextCellEditingSupport(treeViewer,
                    bindingContext, tree, editingService.getEditingDomain(), nameObservableFactory) {

                @Override
                protected boolean canEdit(Object element) {
                    return !(element instanceof Procedure);
                }
            };

            tvcDescription.setEditingSupport(editingSupportDescription);
        }

        return bindingContext;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.emf.common.ui.viewer.IViewerProvider#getViewer()
     */
    public Viewer getViewer() {
        return treeViewer;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.netxforge.netxstudio.screens.editing.selector.IScreen#isValid()
     */
    public boolean isValid() {
        return true;
    }

    public Form getScreenForm() {
        return this.frmProtocols;
    }

    private final List<IAction> actions = Lists.newArrayList();

    @Override
    public IAction[] getActions() {
        // Lazy init actions.
        if (actions.isEmpty()) {
            String actionText = ScreenUtil.isReadOnlyOperation(getOperation()) ? "View" : "Edit";
            actions.add(new EditProtocolAction(actionText + "..."));
        }
        return actions.toArray(new IAction[actions.size()]);
    }

    @Override
    public String getScreenName() {
        return "Protocols";
    }

    class ProtocolsTreeFactoryImpl implements IObservableFactory {

        EditingDomain domain;

        private IEMFListProperty protocolObservableProperty = EMFEditProperties.list(domain,
                ProtocolsPackage.Literals.PROTOCOL__PROCEDURES);

        private IEMFListProperty procedureObservableProperty = EMFEditProperties.list(domain,
                ProtocolsPackage.Literals.PROCEDURE__MESSAGES);

        ProtocolsTreeFactoryImpl(EditingDomain domain) {
            this.domain = domain;
        }

        public IObservable createObservable(final Object target) {

            IObservable ol = null;
            if (target instanceof IObservableList) {
                ol = (IObservable) target;
            } else if (target instanceof Protocol) {
                ol = protocolObservableProperty.observe(target);
            } else if (target instanceof Procedure) {
                ol = procedureObservableProperty.observe(target);
            }
            return ol;
        }
    }

    class ProtocolsTreeStructureAdvisorImpl extends TreeStructureAdvisor {
        @Override
        public Object getParent(Object element) {

            if (element instanceof EObject) {
                EObject eo = (EObject) element;
                if (eo.eContainer() != null) {
                    return eo.eContainer();
                }
            }
            return null;
        }

        @Override
        public Boolean hasChildren(Object element) {
            if (element instanceof Protocol) {
                return ((Protocol) element).getProcedures().size() > 0 ? Boolean.TRUE : null;
            } else if (element instanceof Procedure) {
                return ((Procedure) element).getMessages().size() > 0 ? Boolean.TRUE : null;
            }

            return false;
        }
    }

}