org.switchyard.tools.ui.editor.property.SwitchyardSCAPropertiesBindingsSection.java Source code

Java tutorial

Introduction

Here is the source code for org.switchyard.tools.ui.editor.property.SwitchyardSCAPropertiesBindingsSection.java

Source

/******************************************************************************* 
 * Copyright (c) 2012 Red Hat, Inc. 
 *  All rights reserved. 
 * This program is 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: 
 * Red Hat, Inc. - initial API and implementation 
 *
 * @author bfitzpat
 ******************************************************************************/
package org.switchyard.tools.ui.editor.property;

import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.transaction.NotificationFilter;
import org.eclipse.emf.transaction.RecordingCommand;
import org.eclipse.emf.transaction.ResourceSetChangeEvent;
import org.eclipse.emf.transaction.ResourceSetListener;
import org.eclipse.emf.transaction.RollbackException;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl;
import org.eclipse.graphiti.dt.IDiagramTypeProvider;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.services.Graphiti;
import org.eclipse.graphiti.ui.platform.GFPropertySection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.soa.sca.sca1_1.model.sca.Binding;
import org.eclipse.soa.sca.sca1_1.model.sca.Contract;
import org.eclipse.soa.sca.sca1_1.model.sca.Reference;
import org.eclipse.soa.sca.sca1_1.model.sca.Service;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
import org.switchyard.tools.ui.editor.diagram.shared.AbstractSwitchyardComposite;
import org.switchyard.tools.ui.editor.diagram.shared.IBindingComposite;
import org.switchyard.tools.ui.editor.impl.SwitchyardSCAEditor;
import org.switchyard.tools.ui.editor.property.adapters.BindingCompositeAdapter;
import org.switchyard.tools.ui.editor.property.adapters.LabelAdapter;

/**
 * @author bfitzpat
 * 
 */
public class SwitchyardSCAPropertiesBindingsSection extends GFPropertySection
        implements ITabbedPropertyConstants, ResourceSetListener {

    private Binding _binding = null;
    private ListViewer _listViewer;
    private FormToolkit _toolkit = null;
    private SashForm _sashForm;
    private Section _tableSection;
    private Composite _tableComposite;
    private Section _detailSection;
    // private Button _addButton;
    private Button _removeButton;
    private Object _targetBO;
    private TransactionalEditingDomain _domain = null;
    private IBindingComposite _composite = null;

    /**
     * Constructor.
     */
    public SwitchyardSCAPropertiesBindingsSection() {
        super();
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.ui.views.properties.tabbed.AbstractPropertySection#createControls
     * (org.eclipse.swt.widgets.Composite,
     * org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
     */
    @Override
    public void createControls(Composite parent, TabbedPropertySheetPage tabbedPropertySheetPage) {
        super.createControls(parent, tabbedPropertySheetPage);

        parent.setLayout(new GridLayout(3, false));
        _toolkit = this.getWidgetFactory();
        _sashForm = new SashForm(parent, SWT.NONE);
        _sashForm.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 3, 1));

        _tableSection = _toolkit.createSection(_sashForm, ExpandableComposite.TITLE_BAR);
        _tableSection.setLayout(new FillLayout());
        _tableSection.setText("Bindings List");

        _tableComposite = _toolkit.createComposite(_tableSection, SWT.NONE);
        _tableComposite.setLayout(new FillLayout());
        _tableSection.setClient(_tableComposite);
        _tableComposite.setLayout(new GridLayout(3, false));
        createTableAndButtons(_tableComposite, SWT.NONE);

        _detailSection = _toolkit.createSection(_sashForm, ExpandableComposite.TITLE_BAR);
        _detailSection.setLayout(new FillLayout());
        _detailSection.setExpanded(true);
        _detailSection.setText("Binding Details");

        _sashForm.setWeights(new int[] { 25, 75 });
        addDomainListener();
    }

    private void handleSelectListItem(boolean justRefresh) {
        if (_removeButton != null && !_removeButton.isDisposed()) {
            _removeButton.setEnabled(_binding != null);
        }
        if (_binding != null) {
            if (justRefresh) {
                if (_composite != null) {
                    _composite.setBinding(_binding);
                    _detailSection.setClient(((AbstractSwitchyardComposite) _composite).getPanel());
                    _detailSection.setExpanded(true);
                }
            } else {
                TabbedPropertySheetWidgetFactory factory = getWidgetFactory();
                IBindingComposite composite = (IBindingComposite) BindingCompositeAdapter
                        .adaptModelToComposite(_binding);
                if (composite != null) {
                    if (_detailSection.getClient() != null) {
                        _detailSection.getClient().setVisible(false);
                    }
                    ((AbstractSwitchyardComposite) composite).setOpenOnCreate(true);
                    ((AbstractSwitchyardComposite) composite).createContents(_detailSection, SWT.NONE);
                    ((AbstractSwitchyardComposite) composite)
                            .setRootGridData(new GridData(SWT.FILL, SWT.FILL, true, true));
                    factory.adapt(((AbstractSwitchyardComposite) composite).getPanel());
                    _composite = composite;
                    composite.setBinding(_binding);
                    _detailSection.setClient(((AbstractSwitchyardComposite) composite).getPanel());
                    _detailSection.setExpanded(true);
                } else {
                    _composite = null;
                    if (_detailSection.getClient() != null) {
                        _detailSection.getClient().setVisible(false);
                    }
                }
            }
        } else {
            if (_detailSection.getClient() != null) {
                _detailSection.getClient().setVisible(false);
            }
        }
    }

    @Override
    public void refresh() {

        Display.getDefault().asyncExec(new Runnable() {
            public void run() {
                PictogramElement pe = getSelectedPictogramElement();
                if (pe != null) {
                    Object newTarget = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(pe);
                    // the filter assured, that it is a Service or Reference
                    if (newTarget == null) {
                        return;
                    }
                    if (_targetBO == null) {
                        _targetBO = newTarget;
                    } else if (_targetBO != newTarget) {
                        _targetBO = newTarget;
                    }
                }

                StructuredSelection ssel = (StructuredSelection) _listViewer.getSelection();
                if (!ssel.isEmpty()) {
                    Binding test = (Binding) ssel.getFirstElement();
                    if (test.eContainer() != _targetBO) {
                        _binding = null;
                    } else {
                        _binding = test;
                    }
                }
                EList<Binding> bindings = null;
                if (_targetBO instanceof Service) {
                    Service service = (Service) _targetBO;
                    bindings = service.getBinding();
                } else if (_targetBO instanceof Reference) {
                    Reference reference = (Reference) _targetBO;
                    bindings = reference.getBinding();
                }
                if (bindings != null && _listViewer != null && !_listViewer.getList().isDisposed()) {
                    _listViewer.setInput(bindings);
                    if (bindings.size() > 0) {
                        if (_binding != null) {
                            _listViewer.setSelection(new StructuredSelection(_binding), true);
                        } else {
                            _listViewer.setSelection(new StructuredSelection(bindings.get(0)));
                        }
                    } else {
                        _detailSection.setExpanded(false);
                    }
                }
            }
        });
    }

    private void createTableAndButtons(Composite parent, int style) {

        GridData gridData;

        boolean showButtons = true;

        // //////////////////////////////////////////////////////////
        // Create a composite to hold the buttons and table
        // //////////////////////////////////////////////////////////
        Composite tableAndButtonsComposite = _toolkit.createComposite(parent, SWT.NONE);
        gridData = new GridData(SWT.FILL, SWT.TOP, true, true, 3, 1);
        gridData.verticalIndent = -5;
        tableAndButtonsComposite.setLayoutData(gridData);
        tableAndButtonsComposite.setLayout(new GridLayout(3, false));

        // //////////////////////////////////////////////////////////
        // Create button section for add/remove/up/down buttons
        // //////////////////////////////////////////////////////////
        Composite buttonsComposite = _toolkit.createComposite(tableAndButtonsComposite);
        buttonsComposite.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
        buttonsComposite.setLayout(new FillLayout(SWT.VERTICAL));

        int span = 2;
        if (!showButtons) {
            span = 3;
        }
        _listViewer = new ListViewer(tableAndButtonsComposite,
                SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
        gridData = new GridData(SWT.FILL, SWT.TOP, true, true, span, 1);
        gridData.widthHint = 100;
        gridData.heightHint = 100;
        _listViewer.getList().setLayoutData(gridData);

        _listViewer.setLabelProvider(new LabelProvider() {
            public String getText(Object element) {
                Binding binding = (Binding) element;
                return LabelAdapter.getLabel(binding);
            }
        });
        _listViewer.setContentProvider(new IStructuredContentProvider() {
            public Object[] getElements(Object inputElement) {
                if (inputElement instanceof EList<?>) {
                    EList<?> v = (EList<?>) inputElement;
                    return v.toArray();
                }
                return new Object[0];
            }

            public void dispose() {
            }

            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            }
        });
        _listViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection ssel = (IStructuredSelection) event.getSelection();
                if (!ssel.isEmpty() && ssel.getFirstElement() instanceof Binding) {
                    boolean justRefresh = true;
                    Binding testBinding = (Binding) ssel.getFirstElement();
                    IBindingComposite testcomposite = (IBindingComposite) BindingCompositeAdapter
                            .adaptModelToComposite(testBinding);
                    if (_composite == null) {
                        justRefresh = false;
                    } else if (!(_composite.getClass().getName()
                            .equalsIgnoreCase(testcomposite.getClass().getName()))) {
                        justRefresh = false;
                    }
                    _binding = testBinding;
                    _detailSection.setRedraw(false);
                    handleSelectListItem(justRefresh);
                    _detailSection.setRedraw(true);
                }

            }
        });

        if (showButtons) {
            // _addButton = _toolkit.createButton(buttonsComposite, "Add",
            // SWT.PUSH);
            // _addButton.addSelectionListener(new SelectionListener(){
            //
            // @Override
            // public void widgetSelected(SelectionEvent e) {
            // // add new binding
            // // addBinding();
            // }
            //
            // @Override
            // public void widgetDefaultSelected(SelectionEvent e) {
            // widgetSelected(e);
            // }
            // });
            _removeButton = _toolkit.createButton(buttonsComposite, "Remove", SWT.PUSH);
            _removeButton.setEnabled(false);
            _removeButton.addSelectionListener(new SelectionListener() {

                @Override
                public void widgetSelected(SelectionEvent e) {
                    // remove old binding
                    IStructuredSelection ssel = (IStructuredSelection) _listViewer.getSelection();
                    removeBinding((Binding) ssel.getFirstElement());
                    refreshDiagram();
                }

                @Override
                public void widgetDefaultSelected(SelectionEvent e) {
                    widgetSelected(e);
                }
            });
        }
    }

    private void refreshDiagram() {
        PictogramElement pe = getSelectedPictogramElement();
        if (pe != null) {
            IDiagramTypeProvider diagramTypeProvider = SwitchyardSCAEditor.getActiveEditor()
                    .getDiagramTypeProvider();
            if (diagramTypeProvider != null) {
                if (diagramTypeProvider.getDiagramEditor() != null) {
                    diagramTypeProvider.getDiagramEditor().refreshRenderingDecorators(pe);
                }
            }
        }
    }

    private void removeBinding(final Binding selected) {
        if (selected != null && _domain != null) {
            if (_targetBO instanceof Contract) {
                RecordingCommand rcmd = new RecordingCommand(_domain) {
                    @Override
                    protected void doExecute() {
                        Contract contract = (Contract) _targetBO;
                        contract.getBindingGroup().remove(_listViewer.getList().getSelectionIndex());
                    }
                };
                _domain.getCommandStack().execute(rcmd);
            }
            refresh();
        }
    }

    @Override
    public NotificationFilter getFilter() {
        return null;
    }

    @Override
    public boolean isAggregatePrecommitListener() {
        return false;
    }

    @Override
    public boolean isPostcommitOnly() {
        return false;
    }

    @Override
    public boolean isPrecommitOnly() {
        return false;
    }

    @Override
    public void resourceSetChanged(ResourceSetChangeEvent arg0) {
        refresh();
    }

    @Override
    public Command transactionAboutToCommit(ResourceSetChangeEvent arg0) throws RollbackException {
        return null;
    }

    private void addDomainListener() {
        if (_domain == null) {
            _domain = (TransactionalEditingDomainImpl) SwitchyardSCAEditor.getActiveEditor().getEditingDomain();
            _domain.addResourceSetListener(this);
        }
    }

    private void removeDomainListener() {
        if (_domain != null) {
            _domain.removeResourceSetListener(this);
        }
    }

    @Override
    public void dispose() {
        removeDomainListener();
        super.dispose();
    }
}