org.jboss.tools.smooks.configuration.editors.SmooksReaderFormPage.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.smooks.configuration.editors.SmooksReaderFormPage.java

Source

/*******************************************************************************
 * Copyright (c) 2008 Red Hat, Inc.
 * Distributed under license by 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
 ******************************************************************************/
package org.jboss.tools.smooks.configuration.editors;

import java.util.ArrayList;
import java.util.Collection;
import java.util.EventObject;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;

import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileInfo;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.Path;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CommandStack;
import org.eclipse.emf.common.command.CommandStackListener;
import org.eclipse.emf.common.command.CommandWrapper;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.util.FeatureMapUtil;
import org.eclipse.emf.ecore.xml.type.XMLTypePackage;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.command.CommandParameter;
import org.eclipse.emf.edit.command.DeleteCommand;
import org.eclipse.emf.edit.command.RemoveCommand;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.provider.IItemPropertySource;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ICheckStateProvider;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableColorProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
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.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.events.IHyperlinkListener;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Hyperlink;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.ScrolledPageBook;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.ide.IDE;
import org.jboss.tools.smooks.SmooksModelUtils;
import org.jboss.tools.smooks.configuration.editors.input.InputType;
import org.jboss.tools.smooks.configuration.editors.utils.SmooksUIUtils;
import org.jboss.tools.smooks.configuration.editors.wizard.IStructuredDataSelectionWizard;
import org.jboss.tools.smooks.configuration.editors.wizard.StructuredDataSelectionWizard;
import org.jboss.tools.smooks.configuration.editors.wizard.ViewerInitorStore;
import org.jboss.tools.smooks.configuration.validate.ISmooksModelValidateListener;
import org.jboss.tools.smooks.editor.ISmooksModelProvider;
import org.jboss.tools.smooks.editor.ISourceSynchronizeListener;
import org.jboss.tools.smooks.model.csv12.CSV12Reader;
import org.jboss.tools.smooks.model.csv12.Csv12Package;
import org.jboss.tools.smooks.model.edi12.EDI12Reader;
import org.jboss.tools.smooks.model.edi12.Edi12Package;
import org.jboss.tools.smooks.model.json12.Json12Package;
import org.jboss.tools.smooks.model.json12.Json12Reader;
import org.jboss.tools.smooks.model.smooks.AbstractReader;
import org.jboss.tools.smooks.model.smooks.DocumentRoot;
import org.jboss.tools.smooks.model.smooks.ParamType;
import org.jboss.tools.smooks.model.smooks.ParamsType;
import org.jboss.tools.smooks.model.smooks.ReaderType;
import org.jboss.tools.smooks.model.smooks.SmooksFactory;
import org.jboss.tools.smooks.model.smooks.SmooksPackage;
import org.jboss.tools.smooks.model.smooks.SmooksResourceListType;
import org.milyn.SmooksException;

/**
 * @author Dart
 * 
 */
public class SmooksReaderFormPage extends FormPage
        implements ISmooksModelValidateListener, ISourceSynchronizeListener, CommandStackListener {

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.emf.common.command.CommandStackListener#commandStackChanged
     * (java.util.EventObject)
     */
    public void commandStackChanged(EventObject event) {
        final Command mostRecentCommand = ((org.eclipse.emf.common.command.CommandStack) event.getSource())
                .getMostRecentCommand();
        getEditorSite().getShell().getDisplay().asyncExec(new Runnable() {
            public void run() {
                if (mostRecentCommand != null) {
                    Command rawCommand = mostRecentCommand;
                    while (rawCommand instanceof CommandWrapper) {
                        rawCommand = ((CommandWrapper) rawCommand).getCommand();
                    }
                    if (rawCommand instanceof CompoundCommand) {
                        List<Command> command = ((CompoundCommand) rawCommand).getCommandList();
                        for (Iterator<?> iterator = command.iterator(); iterator.hasNext();) {
                            Command command2 = (Command) iterator.next();
                            while (command2 instanceof CommandWrapper) {
                                command2 = ((CommandWrapper) command2).getCommand();
                            }
                            if (handleInputParamChange(command2)) {
                                break;
                            }
                        }
                    } else {
                        handleInputParamChange(rawCommand);
                    }
                }
            }
        });
    }

    private CheckboxTableViewer inputDataViewer;
    private TreeViewer inputModelViewer;
    private Combo readerCombo;
    private List<Object> readerTypeList = new ArrayList<Object>();
    private Composite readerConfigComposite;
    private ModelPanelCreator modelPanelCreator;
    protected boolean lockCheck = false;
    private Button removeInputDataButton;
    private Button addInputDataButton;
    private ScrolledPageBook scrolledPageBook;

    public SmooksReaderFormPage(FormEditor editor, String id, String title) {
        super(editor, id, title);
    }

    public SmooksReaderFormPage(String id, String title) {
        super(id, title);
    }

    @Override
    protected void createFormContent(IManagedForm managedForm) {
        final ScrolledForm form = managedForm.getForm();
        FormToolkit toolkit = managedForm.getToolkit();
        form.setText(""); //$NON-NLS-1$
        // toolkit.decorateFormHeading(form.getForm());
        // // create master details UI
        // createMasterDetailBlock(managedForm);
        Composite leftComposite = toolkit.createComposite(form.getBody());
        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.widthHint = 300;
        leftComposite.setLayoutData(gd);

        Composite rightComposite = toolkit.createComposite(form.getBody());
        gd = new GridData(GridData.FILL_BOTH);
        rightComposite.setLayoutData(gd);

        GridLayout lgl = new GridLayout();
        lgl.marginWidth = 0;
        lgl.marginHeight = 0;
        leftComposite.setLayout(lgl);

        GridLayout rgl = new GridLayout();
        rgl.marginWidth = 0;
        rgl.marginHeight = 0;
        rightComposite.setLayout(rgl);

        createReaderSection(toolkit, leftComposite);
        createInputDataSection(toolkit, rightComposite);
        createReaderConfigSection(toolkit, leftComposite);
        createInputModelViewerSection(toolkit, rightComposite);

        handleReaderCombo(readerCombo);

        GridLayout gridLayout = new GridLayout();
        gridLayout.marginHeight = 13;
        gridLayout.numColumns = 2;
        gridLayout.horizontalSpacing = 20;
        gridLayout.makeColumnsEqualWidth = true;
        form.getBody().setLayout(gridLayout);

        refreshInputDataButtons();
    }

    private void createInputModelViewerSection(FormToolkit toolkit, Composite parent) {
        Section section = toolkit.createSection(parent, Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED);
        GridData gd = new GridData(GridData.FILL_BOTH);
        // gd.verticalAlignment = GridData.BEGINNING;
        section.setLayoutData(gd);
        section.setText(Messages.SmooksReaderFormPage_InputSectionTitle);
        // section.setDescription("View the XML structure model of the input data");
        FillLayout flayout = new FillLayout();
        section.setLayout(flayout);

        Composite mainContainer = toolkit.createComposite(section);
        GridLayout gl = new GridLayout();
        mainContainer.setLayout(gl);
        section.setClient(mainContainer);

        Hyperlink refreshLink = toolkit.createHyperlink(mainContainer,
                Messages.SmooksReaderFormPage_RefreshLinkLabel, SWT.NONE);
        refreshLink.addHyperlinkListener(new IHyperlinkListener() {

            public void linkExited(HyperlinkEvent e) {
                // TODO Auto-generated method stub

            }

            public void linkEntered(HyperlinkEvent e) {
                // TODO Auto-generated method stub

            }

            public void linkActivated(HyperlinkEvent e) {
                refreshInputModelView();
            }
        });

        Composite viewerContainer = toolkit.createComposite(mainContainer);
        gd = new GridData(GridData.FILL_BOTH);
        viewerContainer.setLayoutData(gd);

        FillLayout fillLayout = new FillLayout();
        fillLayout.marginHeight = 1;
        fillLayout.marginWidth = 1;
        viewerContainer.setBackground(GraphicsConstants.BORDER_CORLOR);
        viewerContainer.setLayout(fillLayout);
        inputModelViewer = new TreeViewer(viewerContainer, SWT.NONE);
        inputModelViewer.setContentProvider(new CompoundStructuredDataContentProvider());
        inputModelViewer.setLabelProvider(new CompoundStructuredDataLabelProvider());
        inputModelViewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
            }
        });
        inputModelViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                // currentSelection = ((IStructuredSelection)
                // event.getSelection()).getFirstElement();
            }
        });

        refreshInputModelView();

    }

    protected List<Object> generateInputData() {
        Object obj = ((SmooksMultiFormEditor) getEditor()).getSmooksModel();
        SmooksResourceListType resourceList = null;
        if (obj instanceof DocumentRoot) {
            resourceList = ((DocumentRoot) obj).getSmooksResourceList();
        }
        return SelectorCreationDialog.generateInputData(resourceList);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.ui.forms.editor.FormPage#init(org.eclipse.ui.IEditorSite,
     * org.eclipse.ui.IEditorInput)
     */
    @Override
    public void init(IEditorSite site, IEditorInput input) {
        super.init(site, input);
        if (getEditor() != null && getEditor() instanceof ISmooksModelProvider) {
            this.handleCommandStack(((ISmooksModelProvider) getEditor()).getEditingDomain().getCommandStack());
        }
    }

    protected boolean handleInputParamChange(Command command) {
        Collection<?> affectedObjects = command.getAffectedObjects();
        boolean refreshInputModel = false;
        for (Iterator<?> iterator2 = affectedObjects.iterator(); iterator2.hasNext();) {
            Object object = (Object) iterator2.next();
            if (object instanceof AbstractReader) {
                refreshInputModel = true;
                break;
            }
            if (object instanceof ParamType) {
                if (SmooksUIUtils.isInputParamType((ParamType) object)) {
                    refreshInputModel = true;
                    break;
                }
            }
            Collection<?> deletedObjs = null;
            if (command instanceof DeleteCommand) {
                deletedObjs = ((DeleteCommand) command).getCollection();
            }
            if (command instanceof RemoveCommand) {
                deletedObjs = ((RemoveCommand) command).getCollection();
            }
            if (deletedObjs != null) {
                for (Iterator<?> iterator = deletedObjs.iterator(); iterator.hasNext();) {
                    Object object2 = (Object) iterator.next();
                    if (object2 instanceof AbstractReader) {
                        refreshInputModel = true;
                        break;
                    }
                    if (object2 instanceof ParamType) {
                        if (SmooksUIUtils.isInputParamType((ParamType) object2)) {
                            refreshInputModel = true;
                            break;
                        }
                    }
                }
            }
            if (refreshInputModel)
                break;
        }

        if (refreshInputModel) {
            refreshInputModelView();
        }

        return refreshInputModel;
    }

    private void handleCommandStack(CommandStack commandStack) {
        commandStack.addCommandStackListener(this);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.forms.editor.FormPage#dispose()
     */
    @Override
    public void dispose() {
        if (getEditor() != null && getEditor() instanceof ISmooksModelProvider) {
            ((ISmooksModelProvider) getEditor()).getEditingDomain().getCommandStack()
                    .removeCommandStackListener(this);
        }
        super.dispose();
    }

    private void createReaderConfigSection(FormToolkit toolkit, Composite parent) {
        Section section = toolkit.createSection(parent, Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED);
        GridData gd = new GridData(GridData.FILL_BOTH);
        section.setLayoutData(gd);
        section.setText(Messages.SmooksReaderFormPage_InputConfigurationSectionTitle);
        section.setDescription(Messages.SmooksReaderFormPage_InputConfigurationSectionDes);
        FillLayout flayout = new FillLayout();
        section.setLayout(flayout);

        scrolledPageBook = new ScrolledPageBook(section);
        scrolledPageBook.setBackground(toolkit.getColors().getBackground());
        section.setClient(scrolledPageBook);

        readerConfigComposite = scrolledPageBook.createPage(scrolledPageBook);
        scrolledPageBook.showPage(scrolledPageBook);

        GridLayout gl = new GridLayout();
        gl.numColumns = 2;
        readerConfigComposite.setLayout(gl);

        initReaderConfigSection();
    }

    private void createReaderSection(FormToolkit toolkit, Composite parent) {
        Section section = toolkit.createSection(parent, Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED);
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.verticalAlignment = GridData.BEGINNING;
        section.setLayoutData(gd);
        section.setText(Messages.SmooksReaderFormPage_InputTypeSectionTitle);
        // section.setDescription("Select the input type");
        FillLayout flayout = new FillLayout();
        section.setLayout(flayout);

        Composite mainComposite = toolkit.createComposite(section);
        section.setClient(mainComposite);
        GridLayout gl = new GridLayout();
        gl.numColumns = 2;
        mainComposite.setLayout(gl);

        toolkit.createLabel(mainComposite, Messages.SmooksReaderFormPage_InputTypeLabel);

        readerCombo = new Combo(mainComposite, SWT.NONE | SWT.READ_ONLY);
        gd = new GridData(GridData.FILL_HORIZONTAL);
        readerCombo.setLayoutData(gd);

        toolkit.createLabel(mainComposite, " "); //$NON-NLS-1$

        bindingReaderCombo();

        initReaderCombo();

        gd = new GridData(GridData.FILL_HORIZONTAL);
        readerCombo.setLayoutData(gd);

        toolkit.paintBordersFor(mainComposite);
    }

    private void initReaderConfigSection() {
        Object reader = getCurrentReaderModel();
        ISmooksModelProvider provider = getSmooksModelProvider();
        if (provider == null)
            return;
        String type = provider.getInputType();
        if (reader instanceof EObject && type != null) {
            SmooksResourceListType list = getSmooksConfigResourceList();
            createReaderPanel((EObject) list.getAbstractReader().get(0));
        } else {
            disposeCompositeControls(readerConfigComposite, null);
            createSimpleReaderPanel(reader);
        }
    }

    private void selectCorrectReaderItem(Object reader) {
        for (int i = 0; i < readerTypeList.size(); i++) {
            Object r = readerTypeList.get(i);
            if (r instanceof EObject) {
                if (CSV12Reader.class.isInstance(reader)) {
                    if (CSV12Reader.class.isInstance(r)) {
                        readerCombo.select(i);
                        break;
                    }
                }
                if (EDI12Reader.class.isInstance(reader)) {
                    if (EDI12Reader.class.isInstance(r)) {
                        readerCombo.select(i);
                        break;
                    }
                }
                if (Json12Reader.class.isInstance(reader)) {
                    if (Json12Reader.class.isInstance(r)) {
                        readerCombo.select(i);
                        break;
                    }
                }
                if (ReaderType.class.isInstance(reader)) {
                    if (ReaderType.class.isInstance(r)) {
                        readerCombo.select(i);
                        break;
                    }
                }
            }
        }
    }

    private String getCurrentReaderType() {
        Object reader = getCurrentReaderModel();
        return getReaderType(reader);
    }

    private void initReaderCombo() {
        if (readerCombo == null)
            return;
        SmooksResourceListType rlist = getSmooksConfigResourceList();
        if (rlist == null) {
            readerCombo.select(-1);
            return;
        }

        ISmooksModelProvider modelProvider = getSmooksModelProvider();

        String inputType = modelProvider.getInputType();

        if (inputType == null) {
            // for the first time to open the file.
            if (rlist.getAbstractReader().isEmpty()) {
                readerCombo.select(0);
                return;
            } else {
            }
        }
        if (SmooksModelUtils.INPUT_TYPE_XML.equals(inputType)) {
            readerCombo.select(1);
        }
        if (SmooksModelUtils.INPUT_TYPE_JAVA.equals(inputType)) {
            readerCombo.select(2);
        }
        if (SmooksModelUtils.INPUT_TYPE_XSD.equals(inputType)) {
            readerCombo.select(3);
        }

        if (SmooksModelUtils.INPUT_TYPE_CSV.equals(inputType)) {
            if (!rlist.getAbstractReader().isEmpty()) {
                AbstractReader reader = rlist.getAbstractReader().get(0);
                if (CSV12Reader.class.isInstance(reader)) {
                    selectCorrectReaderItem(reader);
                }
            }
        }
        if (SmooksModelUtils.INPUT_TYPE_EDI_1_1.equals(inputType)) {
            if (!rlist.getAbstractReader().isEmpty()) {
                AbstractReader reader = rlist.getAbstractReader().get(0);
                if (EDI12Reader.class.isInstance(reader)) {
                    selectCorrectReaderItem(reader);
                }
            }
        }
        if (SmooksModelUtils.INPUT_TYPE_JSON_1_1.equals(inputType)) {
            if (!rlist.getAbstractReader().isEmpty()) {
                AbstractReader reader = rlist.getAbstractReader().get(0);
                if (Json12Reader.class.isInstance(reader)) {
                    selectCorrectReaderItem(reader);
                }
            }
        }
        if (SmooksModelUtils.INPUT_TYPE_CUSTOME.equals(inputType)) {
            if (!rlist.getAbstractReader().isEmpty()) {
                AbstractReader reader = rlist.getAbstractReader().get(0);
                if (ReaderType.class.isInstance(reader)) {
                    selectCorrectReaderItem(reader);
                }
            }
        }
        return;
    }

    private void handleReaderCombo(final Combo combo) {
        combo.addSelectionListener(new SelectionListener() {

            public void widgetSelected(SelectionEvent e) {
                Object newreader = getCurrentReaderModel();
                if (newreader == null)
                    return;
                // String type = getCurrentReaderType();
                // if (type == null) {
                // getSmooksGraphicsExtType().eUnset(GraphPackage.Literals.SMOOKS_GRAPHICS_EXT_TYPE__INPUT_TYPE);
                // } else {
                // getSmooksGraphicsExtType().setInputType(type);
                // }
                readerChanged(newreader);
            }

            public void widgetDefaultSelected(SelectionEvent e) {
                // TODO Auto-generated method stub

            }
        });
    }

    private Object createReaderEntry(Object reader, boolean clone) {
        if (clone) {
            reader = EcoreUtil.copy((EObject) reader);
        }
        if (reader instanceof CSV12Reader) {
            return FeatureMapUtil.createEntry(Csv12Package.Literals.CSV12_DOCUMENT_ROOT__READER, reader);
        }
        if (reader instanceof EDI12Reader) {
            return FeatureMapUtil.createEntry(Edi12Package.Literals.EDI12_DOCUMENT_ROOT__READER, reader);
        }
        if (reader instanceof Json12Reader) {
            return FeatureMapUtil.createEntry(Json12Package.Literals.JSON12_DOCUMENT_ROOT__READER, reader);
        }
        if (reader instanceof ReaderType) {
            return FeatureMapUtil.createEntry(SmooksPackage.Literals.DOCUMENT_ROOT__READER, reader);
        }
        return null;
    }

    private Command createRemoveReaderCommand() {
        SmooksResourceListType rlist = getSmooksConfigResourceList();
        List<AbstractReader> readerList = rlist.getAbstractReader();
        CompoundCommand compoundCommand = new CompoundCommand();
        for (Iterator<?> iterator = readerList.iterator(); iterator.hasNext();) {
            AbstractReader abstractReader = (AbstractReader) iterator.next();
            Object readerEntry = createReaderEntry(abstractReader, false);
            if (readerEntry == null)
                continue;
            Command removeCommand = RemoveCommand.create(getEditingDomain(), rlist,
                    SmooksPackage.Literals.SMOOKS_RESOURCE_LIST_TYPE__ABSTRACT_READER_GROUP, readerEntry);
            if (removeCommand.canExecute()) {
                compoundCommand.append(removeCommand);
            }
        }
        if (compoundCommand.isEmpty()) {
            return null;
        }
        return compoundCommand;
    }

    private String getReaderType(Object reader) {
        if (reader instanceof XMLReader) {
            return SmooksModelUtils.INPUT_TYPE_XML;
        }
        if (reader instanceof JavaReader) {
            return SmooksModelUtils.INPUT_TYPE_JAVA;
        }
        if (reader instanceof XSDReader) {
            return SmooksModelUtils.INPUT_TYPE_XSD;
        }
        if (reader instanceof EObject) {
            Object obj = ((EObject) reader);

            if (obj instanceof CSV12Reader) {
                return SmooksModelUtils.INPUT_TYPE_CSV;
            }
            if (obj instanceof EDI12Reader) {
                return SmooksModelUtils.INPUT_TYPE_EDI_1_1;
            }
            if (obj instanceof Json12Reader) {
                return SmooksModelUtils.INPUT_TYPE_JSON_1_1;
            }
            if (obj instanceof ReaderType) {
                return SmooksModelUtils.INPUT_TYPE_CUSTOME;
            }
        }
        return null;
    }

    private void refreshInputDataButtons() {
        this.addInputDataButton.setEnabled(true);
        this.removeInputDataButton.setEnabled(true);

        String inputType = getSmooksModelProvider().getInputType();
        if (inputType == null || inputType.trim().equals("")) { //$NON-NLS-1$
            this.addInputDataButton.setEnabled(false);
            this.removeInputDataButton.setEnabled(false);
        }
    }

    private void readerChanged(Object reader) {

        String type = getCurrentReaderType();
        String oldType = this.getSmooksModelProvider().getInputType();

        if (type == null && oldType == null) {
            return;
        }
        if (type != null && type.equals(oldType)) {
            return;
        }
        if (oldType != null && oldType.equals(type)) {
            return;
        }

        CompoundCommand compoundCommand = new CompoundCommand();

        ParamsType params = getSmooksConfigResourceList().getParams();
        if (params == null) {
            params = SmooksFactory.eINSTANCE.createParamsType();
            Command addparamsCommand = SetCommand.create(getEditingDomain(), getSmooksConfigResourceList(),
                    SmooksPackage.Literals.SMOOKS_RESOURCE_LIST_TYPE__PARAMS, params);
            if (addparamsCommand.canExecute())
                compoundCommand.append(addparamsCommand);
        }

        org.jboss.tools.smooks.model.smooks.ParamType param = SmooksUIUtils
                .getInputTypeParam(getSmooksConfigResourceList());
        if (param == null) {
            // add new one
            param = SmooksFactory.eINSTANCE.createParamType();
            param.setName(SmooksModelUtils.INPUT_TYPE);
            param.setStringValue(type);
            Command addparamc = AddCommand.create(getEditingDomain(), params,
                    SmooksPackage.Literals.PARAMS_TYPE__PARAM, param);
            if (addparamc.canExecute())
                compoundCommand.append(addparamc);
        } else {

            Command addCommand = null;
            if (type != null) {
                addCommand = AddCommand.create(getEditingDomain(), param, XMLTypePackage.Literals.ANY_TYPE__MIXED,
                        FeatureMapUtil.createEntry(XMLTypePackage.Literals.XML_TYPE_DOCUMENT_ROOT__TEXT, type));
            }
            Object removeValue = (param.getMixed().get(XMLTypePackage.Literals.XML_TYPE_DOCUMENT_ROOT__TEXT, true));
            if (removeValue != null && removeValue instanceof Collection<?>) {
                List<Object> rList = new ArrayList<Object>();
                for (Iterator<?> iterator = ((Collection<?>) removeValue).iterator(); iterator.hasNext();) {
                    Object string = (Object) iterator.next();
                    rList.add(FeatureMapUtil.createEntry(XMLTypePackage.Literals.XML_TYPE_DOCUMENT_ROOT__TEXT,
                            string));
                }
                Command cc = RemoveCommand.create(getEditingDomain(), param, null, rList);
                if (cc != null && cc.canExecute()) {
                    compoundCommand.append(cc);
                }
            }
            if (addCommand != null && addCommand.canExecute()) {
                compoundCommand.append(addCommand);
            }

        }
        Command removeCommand = createRemoveReaderCommand();
        if (removeCommand != null && removeCommand.canExecute()) {
            compoundCommand.append(removeCommand);
        }
        if (readerConfigComposite != null) {
            disposeCompositeControls(readerConfigComposite, null);
            scrolledPageBook.reflow(true);
        }
        if (reader instanceof EObject) {
            Object obj = ((EObject) reader);
            obj = AdapterFactoryEditingDomain.unwrap(obj);
            Command command = AddCommand.create(getEditingDomain(), getSmooksConfigResourceList(),
                    SmooksPackage.Literals.SMOOKS_RESOURCE_LIST_TYPE__ABSTRACT_READER_GROUP,
                    createReaderEntry(obj, false));
            if (command.canExecute()) {
                compoundCommand.append(command);
            }

        } else {
            createSimpleReaderPanel(reader);
        }
        deactiveAllInputFile(compoundCommand);
        if (!compoundCommand.isEmpty() && compoundCommand.canExecute()) {
            getEditingDomain().getCommandStack().execute(compoundCommand);
            if (reader != null && reader instanceof EObject) {
                createReaderPanel(((EObject) reader));
            }
        }

        if (inputDataViewer != null) {
            inputDataViewer.refresh();
        }
        refreshInputModelView();
        refreshInputDataButtons();
    }

    private void deactiveAllInputFile(CompoundCommand command) {
        Object viewerInput = this.inputDataViewer.getInput();
        if (viewerInput != null && viewerInput instanceof List<?>) {
            List<InputType> inputList = (List) viewerInput;
            for (Iterator<?> iterator = inputList.iterator(); iterator.hasNext();) {
                InputType inputType = (InputType) iterator.next();
                setInputDataActiveStatus(false, inputType, command);
            }
        }
    }

    private void createSimpleReaderPanel(Object reader) {
        Label formText = this.getManagedForm().getToolkit().createLabel(readerConfigComposite, ""); //$NON-NLS-1$
        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.heightHint = 50;
        gd.horizontalSpan = 2;
        formText.setLayoutData(gd);
        if (reader instanceof XMLReader || reader instanceof JavaReader || reader instanceof XSDReader) {
            formText.setText(Messages.SmooksReaderFormPage_Warning_Specify_Sample_Data);
        }

        if (reader instanceof NullReader) {
            formText.setText(Messages.SmooksReaderFormPage_Warning_Specify_Input_Type);
        }
        readerConfigComposite.layout();
        scrolledPageBook.reflow(false);
    }

    private void createReaderPanel(EObject reader) {
        disposeCompositeControls(readerConfigComposite, null);
        try {
            ModelPanelCreator modelPanelCreator = getModelPanelCreator();
            IItemPropertySource ps = (IItemPropertySource) getEditingDomain().getAdapterFactory().adapt(reader,
                    IItemPropertySource.class);
            modelPanelCreator.createModelPanel(reader, getManagedForm().getToolkit(), readerConfigComposite, ps,
                    (ISmooksModelProvider) getEditor(), getEditor());
            Composite parentPage = readerConfigComposite.getParent();
            if (parentPage != null) {
                parentPage.layout();
            }
            scrolledPageBook.reflow(true);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private ModelPanelCreator getModelPanelCreator() {
        if (modelPanelCreator == null) {
            modelPanelCreator = new ModelPanelCreator();
        }
        return modelPanelCreator;
    }

    private void bindingReaderCombo() {
        if (readerCombo == null)
            return;

        readerCombo.removeAll();
        readerTypeList.clear();

        readerCombo.add(Messages.SmooksReaderFormPage_NoInputComboText);
        readerTypeList.add(new NullReader());
        readerCombo.add(Messages.SmooksReaderFormPage_XMLReaderComboText);
        readerTypeList.add(new XMLReader());
        readerCombo.add(Messages.SmooksReaderFormPage_JavaReaderComboText);
        readerTypeList.add(new JavaReader());
        readerCombo.add(Messages.SmooksReaderFormPage_XSDReaderComboText);
        readerTypeList.add(new XSDReader());

        SmooksResourceListType resourceList = getSmooksConfigResourceList();

        if (resourceList == null) {
            return;
        }

        AdapterFactoryEditingDomain editDomain = getEditingDomain();
        IEditingDomainItemProvider provider = (IEditingDomainItemProvider) editDomain.getAdapterFactory()
                .adapt(resourceList, IEditingDomainItemProvider.class);
        Collection<?> collections = provider.getNewChildDescriptors(resourceList, editDomain, null);

        String customReaderText = null;
        Object customReaderInstance = null;

        ISmooksModelProvider modelProvider = getSmooksModelProvider();
        if (modelProvider != null) {
            String version = modelProvider.getPlatformVersion();
            OnlyReaderViewerFilter filter = new OnlyReaderViewerFilter();
            // move the custom reader to the end of the reader type list.
            for (Iterator<?> iterator = collections.iterator(); iterator.hasNext();) {
                Object object = (Object) iterator.next();
                if (object instanceof CommandParameter) {
                    Object value = ((CommandParameter) object).getValue();

                    value = AdapterFactoryEditingDomain.unwrap(value);

                    if (filter.select(null, null, value)) {
                        if (SmooksUIUtils.isUnSupportElement(version, (EObject) value)) {
                            continue;
                        }

                        IItemLabelProvider lp = (IItemLabelProvider) editDomain.getAdapterFactory().adapt(value,
                                IItemLabelProvider.class);
                        String text = lp.getText(value);

                        if (ReaderType.class.isInstance(value)) {
                            customReaderText = text;
                            customReaderInstance = value;
                            continue;
                        }
                        readerCombo.add(text);
                        readerTypeList.add(value);
                    }
                }
            }
        }
        if (customReaderInstance != null && customReaderText != null) {
            readerCombo.add(customReaderText);
            readerTypeList.add(customReaderInstance);
        }

    }

    private void setInputDataActiveStatus(boolean active, InputType inputType, final CompoundCommand command) {
        inputType.setActived(active);
        ParamType param = SmooksUIUtils.getInputTypeAssociatedParamType(inputType, getSmooksConfigResourceList());
        if (param != null) {
            String value = SmooksModelUtils.INPUT_ACTIVE_TYPE;
            if (!active) {
                value = SmooksModelUtils.INPUT_DEACTIVE_TYPE;
            }
            Command c = SetCommand.create(this.getEditingDomain(), param, SmooksPackage.Literals.PARAM_TYPE__TYPE,
                    value);
            if (command != null) {
                command.append(c);
            } else {
                getEditingDomain().getCommandStack().execute(c);
            }
        }
    }

    protected void createInputDataSection(FormToolkit toolkit, Composite parent) {
        Section section = toolkit.createSection(parent,
                Section.TITLE_BAR | Section.DESCRIPTION | Section.TWISTIE | Section.EXPANDED);
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        section.setLayoutData(gd);
        section.setText(Messages.SmooksReaderFormPage_InputDataSectionTitle);
        section.setDescription(Messages.SmooksReaderFormPage_InputDataSectionDes);
        FillLayout flayout = new FillLayout();
        section.setLayout(flayout);

        Composite mainComposite = toolkit.createComposite(section, SWT.NONE);
        GridLayout gl = new GridLayout();
        gl.numColumns = 2;
        mainComposite.setLayout(gl);
        section.setClient(mainComposite);

        Composite tableComposite = toolkit.createComposite(mainComposite, SWT.NONE);
        FillLayout fillLayout = new FillLayout();
        fillLayout.marginHeight = 1;
        fillLayout.marginWidth = 1;
        gd = new GridData(GridData.FILL_BOTH);
        gd.heightHint = 70;
        tableComposite.setLayoutData(gd);
        tableComposite.setBackground(GraphicsConstants.BORDER_CORLOR);
        tableComposite.setLayout(fillLayout);

        inputDataViewer = CheckboxTableViewer.newCheckList(tableComposite, SWT.MULTI | SWT.FULL_SELECTION);
        // inputDataViewer.set
        inputDataViewer.setCheckStateProvider(new ICheckStateProvider() {

            public boolean isGrayed(Object element) {
                return isIncorrectInputType((InputType) element);
            }

            public boolean isChecked(Object element) {
                if (element instanceof InputType) {
                    return ((InputType) element).isActived();
                }
                return false;
            }
        });
        inputDataViewer.addCheckStateListener(new ICheckStateListener() {

            public void checkStateChanged(CheckStateChangedEvent event) {
                if (lockCheck)
                    return;
                boolean checked = event.getChecked();
                InputType inputType = (InputType) event.getElement();
                if (isIncorrectInputType(inputType)) {
                    lockCheck = true;
                    inputDataViewer.setChecked(inputType, false);
                    lockCheck = false;
                    return;
                }
                CompoundCommand compoundCommand = new CompoundCommand();
                if (checked) {
                    ParamType param = SmooksUIUtils.getInputTypeAssociatedParamType(inputType,
                            getSmooksConfigResourceList());
                    if (param != null) {
                        inputType.setActived(checked);
                        String value = SmooksModelUtils.INPUT_ACTIVE_TYPE;
                        Command c = SetCommand.create(getEditingDomain(), param,
                                SmooksPackage.Literals.PARAM_TYPE__TYPE, value);
                        if (c.canExecute())
                            compoundCommand.append(c);
                    }

                    Object[] checkedObjects = inputDataViewer.getCheckedElements();
                    for (int i = 0; i < checkedObjects.length; i++) {
                        InputType type = (InputType) checkedObjects[i];
                        if (type == inputType) {
                            continue;
                        }
                        type.setActived(!checked);
                        ParamType param1 = SmooksUIUtils.getInputTypeAssociatedParamType(type,
                                getSmooksConfigResourceList());
                        if (param1 != null) {
                            String value1 = SmooksModelUtils.INPUT_DEACTIVE_TYPE;
                            Command c1 = SetCommand.create(getEditingDomain(), param1,
                                    SmooksPackage.Literals.PARAM_TYPE__TYPE, value1);
                            compoundCommand.append(c1);
                        }

                        lockCheck = true;
                        inputDataViewer.setChecked(type, false);
                        lockCheck = false;
                    }

                } else {
                    ParamType param = SmooksUIUtils.getInputTypeAssociatedParamType(inputType,
                            getSmooksConfigResourceList());
                    if (param != null) {
                        String value = SmooksModelUtils.INPUT_DEACTIVE_TYPE;
                        Command c = SetCommand.create(getEditingDomain(), param,
                                SmooksPackage.Literals.PARAM_TYPE__TYPE, value);
                        compoundCommand.append(c);
                    }
                }
                try {
                    getEditingDomain().getCommandStack().execute(compoundCommand);
                } catch (Exception e) {
                    // e.printStackTrace();
                }

                // refreshInputModelView();
            }
        });
        inputDataViewer.addDoubleClickListener(new IDoubleClickListener() {

            public void doubleClick(DoubleClickEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                Object element = selection.getFirstElement();
                if (element instanceof InputType) {
                    String type = ((InputType) element).getType();
                    String filePath = ((InputType) element).getPath();
                    if (type != null && filePath != null) {
                        if (SmooksModelUtils.INPUT_TYPE_JAVA.equals(type)) {
                            IFile file = ((IFileEditorInput) getEditorInput()).getFile();
                            IJavaProject javaProject = JavaCore.create(file.getProject());
                            if (javaProject != null) {
                                try {
                                    if (filePath.endsWith("[]")) { //$NON-NLS-1$
                                        filePath = filePath.substring(0, filePath.length() - 2);
                                    }
                                    IJavaElement result = javaProject.findType(filePath);
                                    if (result != null)
                                        JavaUI.openInEditor(result);
                                    else {
                                        MessageDialog.openError(getSite().getWorkbenchWindow().getShell(),
                                                Messages.SmooksReaderFormPage_CantFindTypeErrorTitle,
                                                "Can't find type \"" + filePath + "\" in \"" //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
                                                        + javaProject.getProject().getName() + "\" project."); //$NON-NLS-1$
                                    }
                                } catch (Exception e) {

                                }
                            }
                        } else {
                            try {
                                filePath = SmooksUIUtils.parseFilePath(filePath);
                                if (filePath != null) {
                                    IFileStore fileStore = EFS.getLocalFileSystem().getStore(new Path(filePath));
                                    IFileInfo fetchInfo = fileStore.fetchInfo();
                                    if (!fetchInfo.isDirectory() && fetchInfo.exists()) {
                                        IWorkbenchWindow window = getSite().getWorkbenchWindow();
                                        IWorkbenchPage page = window.getActivePage();
                                        try {
                                            IDE.openEditorOnFileStore(page, fileStore);
                                        } catch (PartInitException e) {
                                            MessageDialog.open(MessageDialog.ERROR, window.getShell(),
                                                    Messages.SmooksReaderFormPage_OpenFileErrorTitle,
                                                    "Can't open the file : '" + filePath + "'", SWT.SHEET); //$NON-NLS-1$ //$NON-NLS-2$
                                        }
                                    } else {
                                    }
                                }
                            } catch (Exception e) {
                                MessageDialog.open(MessageDialog.ERROR, getSite().getWorkbenchWindow().getShell(),
                                        Messages.SmooksReaderFormPage_OpenFileErrorTitle,
                                        "Can't open the file : '" + filePath + "'", SWT.SHEET); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
                            }
                        }
                    }
                }
            }
        });
        TableColumn header = new TableColumn(inputDataViewer.getTable(), SWT.NONE);
        header.setText(Messages.SmooksReaderFormPage_TypeColumnText);
        header.setWidth(100);
        TableColumn pathColumn = new TableColumn(inputDataViewer.getTable(), SWT.NONE);
        pathColumn.setText(Messages.SmooksReaderFormPage_PathColumnText);
        pathColumn.setWidth(300);

        // TableColumn extColumn = new TableColumn(inputDataViewer.getTable(),
        // SWT.NONE);
        // extColumn.setText("Extension Paramers");
        // extColumn.setWidth(400);
        inputDataViewer.setContentProvider(new ExtentionInputContentProvider());
        inputDataViewer.setLabelProvider(new InputDataViewerLabelProvider());
        inputDataViewer.getTable().setHeaderVisible(true);
        inputDataViewer.getTable().setLinesVisible(true);
        ISmooksModelProvider provider = getSmooksModelProvider();
        if (provider != null) {
            inputDataViewer.setInput(SmooksUIUtils.getInputTypeList(getSmooksConfigResourceList()));
        }
        Composite buttonComposite = toolkit.createComposite(mainComposite, SWT.NONE);
        gd = new GridData(GridData.FILL_VERTICAL);
        buttonComposite.setLayoutData(gd);
        GridLayout l = new GridLayout();
        buttonComposite.setLayout(l);

        addInputDataButton = toolkit.createButton(buttonComposite, Messages.SmooksReaderFormPage_AddButtonLabel,
                SWT.FLAT);
        gd = new GridData(GridData.FILL_HORIZONTAL);
        addInputDataButton.setLayoutData(gd);
        addInputDataButton.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                showInputDataWizard();
            }

        });

        removeInputDataButton = toolkit.createButton(buttonComposite,
                Messages.SmooksReaderFormPage_DeleteButtonLabel, SWT.FLAT);
        gd = new GridData(GridData.FILL_HORIZONTAL);
        removeInputDataButton.setLayoutData(gd);
        removeInputDataButton.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                IStructuredSelection selection = (IStructuredSelection) inputDataViewer.getSelection();
                if (selection != null) {
                    List<?> inputs = selection.toList();
                    ISmooksModelProvider smooksModelProvider = getSmooksModelProvider();
                    for (Iterator<?> iterator = inputs.iterator(); iterator.hasNext();) {
                        InputType input = (InputType) iterator.next();
                        SmooksUIUtils.removeInputType(input, smooksModelProvider);
                    }
                    if (!inputs.isEmpty()) {
                        List<?> viewerInput = (List<?>) inputDataViewer.getInput();
                        viewerInput.removeAll(inputs);
                        // inputTypeChanged();
                        if (inputDataViewer != null) {
                            inputDataViewer.refresh();
                        }
                    }
                }
            }
        });
    }

    // protected SmooksGraphicsExtType getSmooksGraphicsExtType() {
    // SmooksGraphicsExtType extType = ((SmooksMultiFormEditor)
    // getEditor()).getSmooksGraphicsExt();
    // return extType;
    // }

    protected ISmooksModelProvider getSmooksModelProvider() {
        return (ISmooksModelProvider) getEditor();
    }

    protected AdapterFactoryEditingDomain getEditingDomain() {
        AdapterFactoryEditingDomain editDomain = (AdapterFactoryEditingDomain) ((SmooksMultiFormEditor) this
                .getEditor()).getEditingDomain();
        return editDomain;
    }

    protected SmooksResourceListType getSmooksConfigResourceList() {
        EObject doc = ((SmooksMultiFormEditor) this.getEditor()).getSmooksModel();
        if (doc instanceof DocumentRoot) {
            return ((DocumentRoot) doc).getSmooksResourceList();
        }
        return null;
    }

    protected void showInputDataWizard() {
        CompoundCommand compoundCommand = new CompoundCommand();
        // SmooksGraphicsExtType extType = getSmooksGraphicsExtType();
        String inputType = getSmooksModelProvider().getInputType();
        List<InputType> inputTypes = null;
        if (inputType == null || SmooksModelUtils.INPUT_TYPE_CUSTOME.equals(inputType)
                || inputType.trim().equals("")) { //$NON-NLS-1$
            StructuredDataSelectionWizard wizard = new StructuredDataSelectionWizard();
            wizard.setInput(getEditorInput());
            wizard.setSite(getEditorSite());
            wizard.setForcePreviousAndNextButtons(true);
            StructuredDataSelectionWizardDailog dialog = new StructuredDataSelectionWizardDailog(
                    getEditorSite().getShell(), wizard);

            if (dialog.show() == Dialog.OK) {
                String type = dialog.getType();
                String path = dialog.getPath();
                Properties pros = dialog.getProperties();
                inputTypes = SmooksUIUtils.recordInputDataInfomation(getEditingDomain(),
                        getSmooksConfigResourceList().getParams(), type, path, pros, compoundCommand);
            }
        } else {
            IStructuredDataSelectionWizard wizard = ViewerInitorStore.getInstance()
                    .getStructuredDataCreationWizard(inputType);
            WizardDialog dialog = new WizardDialog(getEditorSite().getShell(), wizard);
            wizard.init(getEditorSite(), getEditorInput());
            if (dialog.open() == Dialog.OK) {
                String path = wizard.getStructuredDataSourcePath();
                Properties pros = wizard.getProperties();
                inputTypes = SmooksUIUtils.recordInputDataInfomation(getEditingDomain(),
                        getSmooksConfigResourceList().getParams(), inputType, path, pros, compoundCommand);
            }
        }

        if (inputTypes != null && !inputTypes.isEmpty()) {
            InputType addedInputType = inputTypes.get(0);
            Object obj = this.inputDataViewer.getInput();
            if (obj != null && obj instanceof List) {
                ((List) obj).add(addedInputType);
            }

            deactiveAllInputFile(compoundCommand);
            if (inputType.equals(SmooksModelUtils.INPUT_TYPE_CUSTOME)) {
                // don't active the input file
            } else {
                addedInputType.setActived(true);
                ParamType param = addedInputType.getRelatedParameter();
                if (param != null) {
                    String value = SmooksModelUtils.INPUT_ACTIVE_TYPE;
                    Command c = SetCommand.create(this.getEditingDomain(), param,
                            SmooksPackage.Literals.PARAM_TYPE__TYPE, value);
                    if (c.canExecute()) {
                        compoundCommand.append(c);
                    }
                }
            }
            if (!compoundCommand.isEmpty()) {
                getSmooksModelProvider().getEditingDomain().getCommandStack().execute(compoundCommand);
            }
            if (inputDataViewer != null)
                inputDataViewer.refresh();
        }
    }

    private void refreshInputModelView() {
        if (this.getManagedForm() != null) {
            this.getManagedForm().getMessageManager().removeAllMessages();
        }
        if (inputModelViewer != null) {
            List<Object> input = generateInputData();
            try {
                inputModelViewer.setInput(input);
                SmooksUIUtils.expandSelectorViewer(input, inputModelViewer);
            } catch (Throwable e) {

            }

            if (input == null || input.isEmpty()) {
                Throwable t = SelectorCreationDialog.getCurrentException();
                if (t != null) {
                    if (this.getManagedForm() != null) {
                        if (t instanceof SmooksException && t.getCause() != null) {
                            t = t.getCause();
                        }
                        this.getManagedForm().getMessageManager().addMessage(
                                Messages.SmooksReaderFormPage_Input_Error,
                                Messages.SmooksReaderFormPage_Error_Creating_Input_Model + t.getMessage() + "\"", //$NON-NLS-1$
                                null, IMessageProvider.ERROR);
                    }
                }
            }
        }
    }

    public void inputTypeChanged() {
        if (inputDataViewer != null)
            inputDataViewer.refresh();
        refreshInputModelView();
    }

    protected void disposeCompositeControls(Composite composite, Control[] ignoreControl) {
        if (composite != null) {
            Control[] children = composite.getChildren();
            for (int i = 0; i < children.length; i++) {
                Control child = children[i];
                if (ignoreControl != null) {
                    for (int j = 0; j < ignoreControl.length; j++) {
                        if (child == ignoreControl[j]) {
                            continue;
                        }
                    }
                }
                child.dispose();
                child = null;
            }
        }
    }

    private Object getCurrentReaderModel() {
        if (readerCombo == null || readerCombo.isDisposed())
            return null;
        int index = readerCombo.getSelectionIndex();
        if (index < 0)
            return null;
        return readerTypeList.get(index);
    }

    public void sourceChange(Object model) {
        bindingReaderCombo();
        initReaderCombo();
        initReaderConfigSection();
        if (inputDataViewer != null) {
            inputDataViewer.setInput(SmooksUIUtils.getInputTypeList(getSmooksConfigResourceList()));
            inputDataViewer.refresh();
        }
        refreshInputModelView();
    }

    // public void graphChanged(SmooksGraphicsExtType extType) {
    // // TODO Auto-generated method stub
    //
    // }

    public void graphPropertyChange(EStructuralFeature featre, Object value) {
        // TODO Auto-generated method stub

    }

    public void validateEnd(List<Diagnostic> diagnosticResult) {
        if (diagnosticResult == null)
            return;
        Object model = getCurrentReaderModel();
        if (model == null)
            return;
        if (model instanceof EObject) {
            this.getModelPanelCreator().markPropertyUI(diagnosticResult, (EObject) model);
        }
    }

    public void validateStart() {

    }

    protected boolean isIncorrectInputType(InputType element) {
        if (element == null)
            return false;
        if (element instanceof InputType) {
            String type = ((InputType) element).getType();
            int index = readerCombo.getSelectionIndex();
            if (index == -1)
                return true;

            Object reader = readerTypeList.get(index);
            if (reader instanceof NullReader) {
                return true;
            }
            if (reader instanceof XMLReader || reader instanceof XSDReader || reader instanceof JavaReader) {

            }

            if (reader instanceof XMLReader) {
                if (!SmooksModelUtils.INPUT_TYPE_XML.equals(type)) {
                    return true;
                }
            }
            if (reader instanceof XSDReader) {
                if (!SmooksModelUtils.INPUT_TYPE_XSD.equals(type)) {
                    return true;
                }
            }
            if (reader instanceof JavaReader) {
                if (!SmooksModelUtils.INPUT_TYPE_JAVA.equals(type)) {
                    return true;
                }
            }

            if (reader instanceof EObject) {
                Object obj = ((EObject) reader);
                obj = AdapterFactoryEditingDomain.unwrap(obj);
                if (obj instanceof EDI12Reader) {
                    if (!SmooksModelUtils.INPUT_TYPE_EDI_1_1.equals(type)) {
                        return true;
                    }
                }
                if (obj instanceof CSV12Reader) {
                    if (!SmooksModelUtils.INPUT_TYPE_CSV.equals(type)) {
                        return true;
                    }
                }
                if (obj instanceof Json12Reader) {
                    if (!SmooksModelUtils.INPUT_TYPE_JSON_1_1.equals(type)) {
                        return true;
                    }
                }
                if (obj instanceof ReaderType) {
                    if (!SmooksModelUtils.INPUT_TYPE_CUSTOME.equals(type)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    private class NullReader {

    }

    private class XMLReader {

    }

    private class XSDReader {

    }

    private class JavaReader {

    }

    private class InputDataViewerLabelProvider extends ExtentionInputLabelProvider implements ITableColorProvider {

        public Color getBackground(Object element, int columnIndex) {
            if (isIncorrectInputType((InputType) element)) {
                // return ColorConstants.darkGray;
            }
            return null;
        }

        public Color getForeground(Object element, int columnIndex) {
            if (isIncorrectInputType((InputType) element)) {
                return ColorConstants.lightGray;
            }
            return null;
        }
    }
}