net.bpelunit.toolsupport.editors.wizards.components.HeaderProcessorComponent.java Source code

Java tutorial

Introduction

Here is the source code for net.bpelunit.toolsupport.editors.wizards.components.HeaderProcessorComponent.java

Source

/**
 * This file belongs to the BPELUnit utility and Eclipse plugin set. See enclosed
 * license file for more information.
 * 
 */
package net.bpelunit.toolsupport.editors.wizards.components;

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

import net.bpelunit.framework.client.eclipse.ExtensionControl;
import net.bpelunit.framework.client.eclipse.dialog.FieldBasedInputDialog;
import net.bpelunit.framework.client.eclipse.dialog.field.SelectionField;
import net.bpelunit.framework.client.eclipse.dialog.field.TextField;
import net.bpelunit.framework.client.eclipse.dialog.validate.NotEmptyValidator;
import net.bpelunit.framework.xml.suite.XMLHeaderProcessor;
import net.bpelunit.framework.xml.suite.XMLProperty;
import net.bpelunit.framework.xml.suite.XMLSendOnlyActivity;
import net.bpelunit.framework.xml.suite.XMLTwoWayActivity;
import net.bpelunit.toolsupport.editors.wizards.fields.ComboDialogField;
import net.bpelunit.toolsupport.editors.wizards.fields.DialogField;
import net.bpelunit.toolsupport.editors.wizards.fields.IDialogFieldListener;
import net.bpelunit.toolsupport.editors.wizards.fields.ListDialogField;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;

/**
 * The HeaderProcessorComponent contains controls for selecting a header processor from a list of
 * all registered processors, and editing properties for this header processor.
 * 
 * @version $Id$
 * @author Philip Mayer
 * 
 */
public class HeaderProcessorComponent extends StructuredDataComponent {

    private static final String HEADER_PROCESSOR_NULL_NAME = "(none)";
    private static final int HEADER_PROCESSOR_NULL_INDEX = 0;

    private class HeaderListener implements IDialogFieldListener {

        public void dialogFieldChanged(DialogField field) {
            headerProcessorChanged();
        }
    }

    private static class ConditionsListLabelProvider implements ITableLabelProvider {

        public Image getColumnImage(Object element, int columnIndex) {
            return null;
        }

        public String getColumnText(Object element, int columnIndex) {
            if (element instanceof XMLProperty) {
                XMLProperty property = (XMLProperty) element;
                switch (columnIndex) {
                case 0:
                    return property.getName();
                case 1:
                    return property.getStringValue();
                }
            }
            return "";
        }

        public void addListener(ILabelProviderListener listener) {
        }

        public void dispose() {
        }

        public boolean isLabelProperty(Object element, String property) {
            return true;
        }

        public void removeListener(ILabelProviderListener listener) {
        }
    }

    private ComboDialogField fHeaderProcessorField;
    private XMLTwoWayActivity fParentTwoWayActivity;
    private ListDialogField fPropertiesField;

    private String fCurrentlySelectedHeaderProcessor;
    private String[][] fDeployerMetaInformations;
    private XMLSendOnlyActivity fSendOnlyActivity;

    public HeaderProcessorComponent(IWizardPage wizard, FontMetrics metrics) {
        super(wizard, metrics);
    }

    @Override
    public void handleAddPressed() {

        String[] edit = editProperty(null);
        if (edit != null) {
            XMLProperty xmlCondition = getHeaderProcessor().addNewProperty();
            xmlCondition.setName(edit[0]);
            xmlCondition.setStringValue(edit[1]);
            recreateInput();
            enableButtonsForSelection(fPropertiesField, false);
        }

    }

    @Override
    public void handleEditPressed() {

        XMLProperty current = getSelectedProperty();
        if (current == null)
            return;

        String[] edit = editProperty(current);
        if (edit != null) {
            current.setName(edit[0]);
            current.setStringValue(edit[1]);
            recreateInput();
            enableButtonsForSelection(fPropertiesField, false);
        }

    }

    @Override
    public void handleRemovePressed() {
        XMLProperty prop = getSelectedProperty();
        if (prop != null) {
            int index = getHeaderProcessor().getPropertyList().indexOf(prop);
            if (index != -1) {
                getHeaderProcessor().removeProperty(index);
                recreateInput();
                enableButtonsForSelection(fPropertiesField, false);
            }
        }

    }

    private XMLProperty getSelectedProperty() {
        List<Object> selectedElements = fPropertiesField.getSelectedElements();
        if (selectedElements.size() > 0)
            return ((XMLProperty) selectedElements.get(0));
        else
            return null;
    }

    public void recreateInput() {
        List<Object> l = new ArrayList<Object>();
        for (Object o : getHeaderProcessor().getPropertyList()) {
            l.add(o);
        }
        fPropertiesField.setElements(l);
    }

    private String[] editProperty(XMLProperty currentProperty) {

        FieldBasedInputDialog dialog = new FieldBasedInputDialog(getWizard().getShell(), "Add a property");

        String initialKey = currentProperty != null ? currentProperty.getName() : null;
        String initialValue = currentProperty != null ? currentProperty.getStringValue() : null;

        SelectionField field = new SelectionField(dialog, "Key", initialKey, "Keys...", new String[0]);
        field.setValidator(new NotEmptyValidator("Key"));
        dialog.addField(field);

        TextField field2 = new TextField(dialog, "Value", initialValue, TextField.Style.SINGLE);
        field2.setValidator(new NotEmptyValidator("Value"));
        dialog.addField(field2);

        if (dialog.open() != Window.OK)
            return null;

        String[] s = new String[2];
        s[0] = field.getSelection();
        s[1] = field2.getSelection();
        return s;
    }

    public void headerProcessorChanged() {
        if ((fPropertiesField != null) && fHeaderProcessorField != null) {

            int selectionIndex = fHeaderProcessorField.getSelectionIndex();
            if (selectionIndex > HEADER_PROCESSOR_NULL_INDEX) {
                fPropertiesField.setEnabled(true);
                String currentName = fHeaderProcessorField.getItems()[fHeaderProcessorField.getSelectionIndex()];
                fCurrentlySelectedHeaderProcessor = name2code(currentName);
                getHeaderProcessor().setName(fCurrentlySelectedHeaderProcessor);
                enableButtonsForSelection(fPropertiesField, false);
            } else {
                fPropertiesField.setEnabled(false);
                // will be removed later
                getHeaderProcessor().setName("removeme");
                fCurrentlySelectedHeaderProcessor = null;
            }
        }

    }

    public void init(XMLSendOnlyActivity sendOnlyActivity) {
        fSendOnlyActivity = sendOnlyActivity;
        init();
    }

    public void init(XMLTwoWayActivity twoWayActivity) {
        fParentTwoWayActivity = twoWayActivity;
        init();
    }

    private void init() {
        HeaderListener headerListener = new HeaderListener();
        fHeaderProcessorField = new ComboDialogField(SWT.READ_ONLY);
        fHeaderProcessorField.setDialogFieldListener(headerListener);
        fHeaderProcessorField.setLabelText("Processor");

        fDeployerMetaInformations = ExtensionControl.getHeaderProcessorMetaInformation();
        String[] items = new String[fDeployerMetaInformations.length + 1];
        items[0] = HEADER_PROCESSOR_NULL_NAME;
        for (int i = 0; i < fDeployerMetaInformations.length; i++) {
            items[i + 1] = fDeployerMetaInformations[i][0];
        }

        fHeaderProcessorField.setItems(items);
        ListFieldListener conditionListener = createListFieldListener();
        fPropertiesField = new ListDialogField(conditionListener, fButtons, new ConditionsListLabelProvider());
        fPropertiesField.setDialogFieldListener(conditionListener);
        fPropertiesField
                .setTableColumns(new ListDialogField.ColumnsDescription(new String[] { "Key", "Value" }, true));
        fPropertiesField.setLabelText("Properties");

        /*
         * The header processor may still be null...
         */
        boolean initialized = false;
        fCurrentlySelectedHeaderProcessor = null;
        if (hasHeaderProcessor()) {
            // Check the name
            String code = getHeaderProcessor().getName();
            String readableName = code2name(code);
            int index = getItemIndex(items, readableName);
            if (readableName != null && index != -1) {
                fPropertiesField.setEnabled(true);
                List<Object> l = new ArrayList<Object>();
                for (Object o : getHeaderProcessor().getPropertyList()) {
                    l.add(o);
                }
                fPropertiesField.setElements(l);

                fHeaderProcessorField.selectItem(index);
                fCurrentlySelectedHeaderProcessor = code;
                initialized = true;
            }
        } else {
            addNewHeaderProcessor();
        }
        if (!initialized) {
            fPropertiesField.setEnabled(false);
            fHeaderProcessorField.selectItem(0);
        }

        enableButtonsForSelection(fPropertiesField, false);
    }

    private void addNewHeaderProcessor() {
        if (fParentTwoWayActivity != null) {
            fParentTwoWayActivity.addNewHeaderProcessor();
        } else {
            fSendOnlyActivity.addNewHeaderProcessor();
        }
    }

    private XMLHeaderProcessor getHeaderProcessor() {
        if (fParentTwoWayActivity != null) {
            return fParentTwoWayActivity.getHeaderProcessor();
        } else {
            return fSendOnlyActivity.getHeaderProcessor();
        }
    }

    private String code2name(String code) {

        if (code == null)
            return null;

        for (int i = 0; i < fDeployerMetaInformations.length; i++) {
            if (fDeployerMetaInformations[i][1].equals(code))
                return fDeployerMetaInformations[i][0];
        }
        return null;
    }

    private String name2code(String name) {

        if (name == null)
            return null;

        for (int i = 0; i < fDeployerMetaInformations.length; i++) {
            if (fDeployerMetaInformations[i][0].equals(name))
                return fDeployerMetaInformations[i][1];
        }
        return null;
    }

    private int getItemIndex(String[] items, String name) {
        for (int i = 0; i < items.length; i++) {
            if (items[i].equals(name))
                return i;
        }
        return -1;
    }

    private boolean hasHeaderProcessor() {
        return getHeaderProcessor() != null;
    }

    @Override
    public Composite createControls(Composite composite, int nColumns) {

        Group group = createGroup(composite, "Header Processor", nColumns,
                new GridData(SWT.FILL, SWT.FILL, true, true));
        fHeaderProcessorField.doFillIntoGrid(group, nColumns);

        // header combo
        GridData gd = (GridData) fHeaderProcessorField.getComboControl(null).getLayoutData();
        gd.heightHint = Dialog.convertHeightInCharsToPixels(getFontMetrics(), 6);

        gd.grabExcessVerticalSpace = false;
        gd.widthHint = getMaxFieldWidth();
        gd.grabExcessHorizontalSpace = true;

        // Properties
        fPropertiesField.doFillIntoGrid(group, nColumns);

        final TableViewer tableViewer = fPropertiesField.getTableViewer();
        tableViewer.getTable().setHeaderVisible(true);

        gd = (GridData) fPropertiesField.getListControl(null).getLayoutData();
        gd.heightHint = Dialog.convertHeightInCharsToPixels(getFontMetrics(), 6);

        gd.grabExcessVerticalSpace = false;
        gd.widthHint = getMaxFieldWidth();
        gd.grabExcessHorizontalSpace = true;

        headerProcessorChanged();

        return group;
    }

    public boolean hasHeaderProcessorSelected() {
        return fCurrentlySelectedHeaderProcessor != null;
    }

}