com.ebmwebsourcing.petals.services.eip.designer.tabbedproperties.EipSpecificSection.java Source code

Java tutorial

Introduction

Here is the source code for com.ebmwebsourcing.petals.services.eip.designer.tabbedproperties.EipSpecificSection.java

Source

/******************************************************************************
 * Copyright (c) 2010-2013, Linagora
 *
 * All rights reserved. This program and the accompanying materials
 * are 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:
 *       Linagora - initial API and implementation
 *******************************************************************************/

package com.ebmwebsourcing.petals.services.eip.designer.tabbedproperties;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.CommandStack;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.text.source.VerticalRuler;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
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.custom.StyledText;
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.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;

import com.ebmwebsourcing.petals.common.xpath.internal.provisional.configuration.ColorManager;
import com.ebmwebsourcing.petals.common.xpath.internal.provisional.configuration.XPathSourceViewerConfiguration;
import com.ebmwebsourcing.petals.services.eip.designer.edit.commands.EipNodeSetAttributeCommand;
import com.ebmwebsourcing.petals.services.eip.designer.edit.parts.EipNodeEditPart;
import com.ebmwebsourcing.petals.services.eip.designer.model.EIPtype;
import com.ebmwebsourcing.petals.services.eip.designer.model.EipNode;
import com.ebmwebsourcing.petals.services.eip.designer.model.EipProperty;

/**
 * The section for EIP specific properties.
 * @author Vincent Zurczak - EBM WebSourcing
 */
public class EipSpecificSection extends AbstractPropertySection implements PropertyChangeListener {

    private EipNode eip;

    private Composite subContainer;
    private ComboViewer patternViewer;
    private boolean notifyChanges = true;

    private final List<StyledText> textFields = new ArrayList<StyledText>();

    /**
     * Constructor.
     */
    public EipSpecificSection() {
        // nothing
    }

    /*
     * (non-Jsdoc)
     * @see java.beans.PropertyChangeListener
     * #propertyChange(java.beans.PropertyChangeEvent)
     */
    public void propertyChange(PropertyChangeEvent evt) {

        if (EipNode.PROPERTY_EIP_TYPE.equals(evt.getPropertyName()))
            refresh();
    }

    /*
     * (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 aTabbedPropertySheetPage) {

        // Create the container
        super.createControls(parent, aTabbedPropertySheetPage);
        Composite container = getWidgetFactory().createPlainComposite(parent, SWT.NONE);
        GridLayout layout = new GridLayout(2, false);
        layout.marginTop = 10;
        container.setLayout(layout);

        // Add the other widgets
        Label l = getWidgetFactory().createLabel(container, "Enterprise Integration Pattern:");
        l.setToolTipText("The Enterprise Integration Pattern");

        CCombo combo = getWidgetFactory().createCCombo(container, SWT.READ_ONLY | SWT.FLAT | SWT.NO_FOCUS);
        GridData layoutData = new GridData();
        layoutData.widthHint = 240;
        layoutData.horizontalIndent = 5;
        combo.setLayoutData(layoutData);

        this.patternViewer = new ComboViewer(combo);
        this.patternViewer.setContentProvider(new ArrayContentProvider());
        this.patternViewer.setLabelProvider(new LabelProvider());
        this.patternViewer.setInput(EIPtype.values());
        this.patternViewer.getCCombo().setVisibleItemCount(EIPtype.values().length);

        this.subContainer = getWidgetFactory().createComposite(container);
        layout = new GridLayout(2, false);
        layout.marginWidth = 0;
        this.subContainer.setLayout(layout);
        layoutData = new GridData(GridData.FILL_BOTH);
        layoutData.horizontalSpan = 2;
        layoutData.verticalIndent = 5;
        this.subContainer.setLayoutData(layoutData);

        if (this.eip != null) {
            this.patternViewer.setSelection(new StructuredSelection(this.eip.getEipType()));
            buildPatternWidgets();
        }

        // Listeners
        this.patternViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {

                // Notify the change
                if (EipSpecificSection.this.notifyChanges) {
                    EipNodeSetAttributeCommand cmd = new EipNodeSetAttributeCommand(EipNode.PROPERTY_EIP_TYPE);

                    cmd.setEipNode(EipSpecificSection.this.eip);
                    Object o = ((IStructuredSelection) event.getSelection()).getFirstElement();
                    cmd.setNewValue(o);
                    executeCommand(cmd);
                }
            }
        });
    }

    /**
     * Executes a command on top of the EIP editor's command stack.
     * @param command
     */
    private void executeCommand(Command command) {

        IEditorPart part = getPart().getSite().getPage().getActiveEditor();
        CommandStack commandStack = (CommandStack) part.getAdapter(CommandStack.class);
        if (commandStack != null)
            commandStack.execute(command);
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection
     * #setInput(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
     */
    @Override
    public void setInput(IWorkbenchPart part, ISelection selection) {

        super.setInput(part, selection);

        // Do not listen to model changes from the previous input
        if (this.eip != null)
            this.eip.removePropertyChangeListener(this);

        if (selection instanceof IStructuredSelection) {
            Object input = ((IStructuredSelection) selection).getFirstElement();
            if (input instanceof EipNodeEditPart)
                this.eip = (EipNode) ((EipNodeEditPart) input).getModel();
        }

        // Listen to changes in the new model
        if (this.eip != null)
            this.eip.addPropertyChangeListener(this);
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection
     * #refresh()
     */
    @Override
    public void refresh() {

        if (this.patternViewer != null && !this.patternViewer.getCCombo().isDisposed() && this.eip != null) {

            // Save the caret position - if there is one
            StyledText focusText = null;
            for (StyledText st : this.textFields) {
                if (st.isFocusControl()) {
                    focusText = st;
                    break;
                }
            }

            int caret = focusText != null ? focusText.getCaretOffset() : -1;

            // Update values
            this.notifyChanges = false;
            this.patternViewer.setSelection(new StructuredSelection(this.eip.getEipType()));

            // Build the UI
            buildPatternWidgets();
            this.notifyChanges = true;

            // Restore the caret
            if (focusText != null)
                focusText.setSelection(caret);
        }
    }

    /**
     * Builds the pattern widgets.
     */
    private void buildPatternWidgets() {

        // Constant for this method
        final String buttonValue = "ButtonRealValue";

        // Remove all the previous ones
        this.textFields.clear();
        for (Control c : this.subContainer.getChildren())
            c.dispose();

        // Build the new widgets
        Listener listener = new Listener() {
            public void handleEvent(Event e) {

                String value;
                if (e.widget instanceof Text)
                    value = ((Text) e.widget).getText();
                if (e.widget instanceof StyledText)
                    value = ((StyledText) e.widget).getText();
                else if (e.widget instanceof CCombo)
                    value = ((CCombo) e.widget).getText();
                else if (e.widget instanceof Button) {

                    // Works only for routing criteria
                    value = (String) ((Button) e.widget).getData(buttonValue);

                    // By default, a button indicates a value
                    if (value == null)
                        value = String.valueOf(((Button) e.widget).getSelection());
                } else
                    value = null;

                EipProperty property = (EipProperty) e.widget.getData();
                EipNodeSetAttributeCommand cmd = new EipNodeSetAttributeCommand(property.toString());

                cmd.setEipNode(EipSpecificSection.this.eip);
                cmd.setNewValue(value);
                executeCommand(cmd);
            }
        };

        // Create the UI from the properties
        for (EipProperty property : this.eip.getSupportedProperties()) {

            // Add the specific widget
            Label label;
            String value;
            switch (property.getType()) {

            case BOOLEAN:
                Button button = getWidgetFactory().createButton(this.subContainer, property.getDisplayLabel(),
                        SWT.CHECK);
                value = this.eip.getProperties().get(property);
                if (Boolean.parseBoolean(value))
                    button.setSelection(true);

                GridData layoutData = new GridData();
                layoutData.horizontalSpan = 2;
                button.setLayoutData(layoutData);

                button.setData(property);
                button.addListener(SWT.Selection, listener);
                button.setToolTipText(property.getTooltipText());
                break;

            case WIRETAP_ENUM:
                label = getWidgetFactory().createLabel(this.subContainer, property.getDisplayLabel() + ":");
                label.setToolTipText(property.getTooltipText());

                CCombo combo = getWidgetFactory().createCCombo(this.subContainer, SWT.READ_ONLY | SWT.DROP_DOWN);
                combo.setItems(new String[] { "Request", "Response", "Request-on-response", "Request-response" });

                value = this.eip.getProperties().get(property);
                int index = -1;
                if (value != null)
                    index = combo.indexOf(value);

                if (index >= 0) {
                    combo.select(index);
                } else if ((value = property.getDefaultValue()) != null) {
                    this.eip.setEipProperty(property, value);
                    index = combo.indexOf(value);
                    if (index >= 0)
                        combo.select(index);
                }

                combo.setData(property);
                combo.addListener(SWT.Selection, listener);
                break;

            case ROUTING_CRITERIA_ENUM:
                Button xpathCriteriaButton = getWidgetFactory().createButton(this.subContainer,
                        "Route Messages by Content (XPath)", SWT.RADIO);
                xpathCriteriaButton.setToolTipText("Messages will be tested againt a XPath condition");

                Button opCriteriaButton = getWidgetFactory().createButton(this.subContainer,
                        "Route Messages by Invoked Operation", SWT.RADIO);
                opCriteriaButton.setToolTipText(
                        "Messages will be forwarded to the service which matches the invoked operation");

                value = this.eip.getProperties().get(property);
                if (EipProperty.ROUTING_CRITERIA_BY_OPERATION.equals(value)) {
                    opCriteriaButton.setSelection(true);
                    xpathCriteriaButton.setSelection(false);

                } else {
                    opCriteriaButton.setSelection(false);
                    xpathCriteriaButton.setSelection(true);
                }

                xpathCriteriaButton.setData(property);
                xpathCriteriaButton.setData(buttonValue, EipProperty.ROUTING_CRITERIA_BY_CONTENT);

                opCriteriaButton.setData(property);
                opCriteriaButton.setData(buttonValue, EipProperty.ROUTING_CRITERIA_BY_OPERATION);

                xpathCriteriaButton.addListener(SWT.Selection, listener);
                opCriteriaButton.addListener(SWT.Selection, listener);
                break;

            case XPATH:
                label = getWidgetFactory().createLabel(this.subContainer, property.getDisplayLabel() + ":");
                label.setToolTipText(property.getTooltipText());
                label.setLayoutData(new GridData(SWT.DEFAULT, SWT.TOP, false, true));

                Composite editor = getWidgetFactory().createComposite(this.subContainer, SWT.BORDER);
                editor.setLayout(new FillLayout());
                layoutData = new GridData(GridData.FILL_HORIZONTAL);
                layoutData.heightHint = 60;
                editor.setLayoutData(layoutData);

                int style = SWT.V_SCROLL | SWT.MULTI | SWT.BORDER;
                final ISourceViewer viewer = new SourceViewer(editor, new VerticalRuler(0), style);
                ColorManager cManager = new ColorManager();
                viewer.configure(new XPathSourceViewerConfiguration(cManager));

                viewer.getTextWidget().setLayoutData(new GridData(GridData.FILL_BOTH));
                value = this.eip.getProperties().get(property);
                IDocument document = new Document(value == null ? "" : value);
                viewer.setDocument(document);
                viewer.getTextWidget().setData(property);
                viewer.getTextWidget().addListener(SWT.Modify, listener);

                this.textFields.add(viewer.getTextWidget());
                break;

            default:
                break;
            }
        }

        // Lay out
        this.subContainer.getParent().getParent().getParent().layout();
        this.subContainer.layout();
    }
}