org.eclipse.wst.xsd.ui.internal.common.properties.sections.SpecificConstraintsWidget.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.wst.xsd.ui.internal.common.properties.sections.SpecificConstraintsWidget.java

Source

/*******************************************************************************
 * Copyright (c) 2001, 2009 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.xsd.ui.internal.common.properties.sections;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.ibm.icu.util.StringTokenizer;

import org.eclipse.gef.commands.CommandStack;
import org.eclipse.gef.commands.CompoundCommand;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
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.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
import org.eclipse.wst.common.ui.internal.viewers.NavigableTableViewer;
import org.eclipse.wst.xsd.ui.internal.common.commands.AddEnumerationsCommand;
import org.eclipse.wst.xsd.ui.internal.common.commands.ChangeToLocalSimpleTypeCommand;
import org.eclipse.wst.xsd.ui.internal.common.commands.DeleteCommand;
import org.eclipse.wst.xsd.ui.internal.common.commands.SetXSDFacetValueCommand;
import org.eclipse.wst.xsd.ui.internal.common.commands.UpdateXSDPatternFacetCommand;
import org.eclipse.wst.xsd.ui.internal.common.util.Messages;
import org.eclipse.wst.xsd.ui.internal.common.util.XSDCommonUIUtils;
import org.eclipse.wst.xsd.ui.internal.editor.XSDEditorPlugin;
import org.eclipse.wst.xsd.ui.internal.widgets.EnumerationsDialog;
import org.eclipse.wst.xsd.ui.internal.wizards.RegexWizard;
import org.eclipse.xsd.XSDEnumerationFacet;
import org.eclipse.xsd.XSDFacet;
import org.eclipse.xsd.XSDFactory;
import org.eclipse.xsd.XSDFeature;
import org.eclipse.xsd.XSDPatternFacet;
import org.eclipse.xsd.XSDSimpleTypeDefinition;

public class SpecificConstraintsWidget implements SelectionListener, Listener {
    public static int ENUMERATION = 0;
    public static int PATTERN = 1;

    int kind;
    ConstraintsTableViewer constraintsTableViewer;
    Button addButton;
    Button addUsingDialogButton;
    Button deleteButton;
    Button editButton;
    Composite composite;
    boolean isEnabled;
    TabbedPropertySheetWidgetFactory factory;
    XSDSimpleTypeDefinition input;
    XSDFeature feature;
    boolean isReadOnly;
    CommandStack commandStack;
    XSDFacetSection facetSection;

    /**
     * @deprecated
     * @param composite
     * @param factory
     * @param feature
     * @param input
     * @param facetSection
     */
    public SpecificConstraintsWidget(Composite composite, TabbedPropertySheetWidgetFactory factory,
            XSDFeature feature, XSDSimpleTypeDefinition input, XSDFacetSection facetSection) {
        this(composite, factory, feature, input, facetSection, ENUMERATION);
    }

    public SpecificConstraintsWidget(Composite composite, TabbedPropertySheetWidgetFactory factory,
            XSDFeature feature, XSDSimpleTypeDefinition input, XSDFacetSection facetSection, int kind) {
        this.factory = factory;
        this.input = input;
        this.composite = composite;
        this.feature = feature;
        this.facetSection = facetSection;
        this.kind = kind;

        createControl(composite);
    }

    public void setCommandStack(CommandStack commandStack) {
        this.commandStack = commandStack;
    }

    public void setIsReadOnly(boolean isReadOnly) {
        this.isReadOnly = isReadOnly;
    }

    public TabbedPropertySheetWidgetFactory getWidgetFactory() {
        return factory;
    }

    public Control getControl() {
        return composite;
    }

    public void setEnabled(boolean isEnabled) {
        this.isEnabled = isEnabled;
        addButton.setEnabled(isEnabled);
        addUsingDialogButton.setEnabled(isEnabled);
        editButton.setEnabled(isEnabled);
        constraintsTableViewer.getTable().setEnabled(isEnabled);
        composite.setEnabled(isEnabled);
    }

    public Control createControl(Composite parent) {
        composite = factory.createFlatFormComposite(parent);
        GridData data = new GridData();

        GridLayout gridLayout = new GridLayout();
        gridLayout.marginTop = 0;
        gridLayout.marginBottom = 0;
        gridLayout.numColumns = 2;
        composite.setLayout(gridLayout);

        constraintsTableViewer = new ConstraintsTableViewer(
                getWidgetFactory().createTable(composite, SWT.MULTI | SWT.FULL_SELECTION));
        constraintsTableViewer.setInput(input);
        Table table = constraintsTableViewer.getTable();
        table.addSelectionListener(this);
        data.horizontalAlignment = GridData.FILL;
        data.verticalAlignment = GridData.FILL;
        data.grabExcessHorizontalSpace = true;
        data.widthHint = 150;
        data.grabExcessVerticalSpace = true;
        table.setLayoutData(data);
        table.addListener(SWT.Resize, this);

        Composite buttonComposite = getWidgetFactory().createComposite(composite, SWT.FLAT);
        GridLayout buttonCompositeLayout = new GridLayout();
        buttonCompositeLayout.marginTop = 0;
        buttonCompositeLayout.marginBottom = 0;
        buttonCompositeLayout.numColumns = 1;
        buttonComposite.setLayout(buttonCompositeLayout);
        data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        data.grabExcessHorizontalSpace = false;
        buttonComposite.setLayoutData(data);

        addButton = getWidgetFactory().createButton(buttonComposite, Messages._UI_ACTION_ADD, SWT.PUSH);
        data = new GridData();
        data.grabExcessHorizontalSpace = true;
        data.horizontalAlignment = GridData.FILL;
        data.verticalAlignment = GridData.BEGINNING;
        addButton.setLayoutData(data);
        addButton.addSelectionListener(this);

        addUsingDialogButton = getWidgetFactory().createButton(buttonComposite, Messages._UI_ACTION_ADD_WITH_DOTS,
                SWT.PUSH);
        data = new GridData();
        data.grabExcessHorizontalSpace = true;
        data.horizontalAlignment = GridData.FILL;
        data.verticalAlignment = GridData.BEGINNING;
        addUsingDialogButton.setLayoutData(data);
        addUsingDialogButton.addSelectionListener(this);

        editButton = getWidgetFactory().createButton(buttonComposite, Messages._UI_ACTION_EDIT_WITH_DOTS, SWT.PUSH);
        data = new GridData();
        data.grabExcessHorizontalSpace = true;
        data.horizontalAlignment = GridData.FILL;
        editButton.setLayoutData(data);
        editButton.addSelectionListener(this);

        deleteButton = getWidgetFactory().createButton(buttonComposite, Messages._UI_ACTION_DELETE, SWT.PUSH);

        data = new GridData();
        data.grabExcessHorizontalSpace = true;
        data.horizontalAlignment = GridData.FILL;
        deleteButton.setLayoutData(data);
        deleteButton.addSelectionListener(this);

        setButtonStates(kind);
        return composite;
    }

    public void handleEvent(Event event) {
        Table table = constraintsTableViewer.getTable();
        if (event.type == SWT.Resize && event.widget == table) {
            TableColumn tableColumn = table.getColumn(0);
            tableColumn.setWidth(table.getSize().x);
        }
    }

    public void setInput(Object input) {
        constraintsTableViewer.setInput(input);
        if (isReadOnly) {
            composite.setEnabled(false);
        } else {
            composite.setEnabled(true);
        }
        //    constraintsTableViewer.refresh();
    }

    public int getConstraintKind() {
        return this.kind;
    }

    protected void setButtonStates(int kind) {
        boolean add, addUsing, delete, edit;

        boolean listHasItems = false;
        StructuredSelection selection = (StructuredSelection) constraintsTableViewer.getSelection();
        if (selection != null) {
            if (selection.toList().size() > 0) {
                listHasItems = true;
            }
        }

        if (kind == ENUMERATION) {
            add = true;
            addUsing = true;
            edit = false;
        } else if (kind == PATTERN) {
            add = false;
            addUsing = true;
            edit = listHasItems;
        } else {
            add = true;
            addUsing = true;
            edit = true;
        }
        delete = listHasItems;

        if (!addButton.isDisposed()) {
            addButton.setEnabled(add);
        }
        if (!addUsingDialogButton.isDisposed()) {
            addUsingDialogButton.setEnabled(addUsing);
        }
        if (!deleteButton.isDisposed()) {
            deleteButton.setEnabled(delete);
        }
        if (!editButton.isDisposed()) {
            editButton.setEnabled(edit);
        }
    }

    public void widgetSelected(SelectionEvent e) {
        XSDSimpleTypeDefinition st = input;
        if (e.widget == addButton) {
            List enumList = st.getEnumerationFacets();
            String newName = XSDCommonUIUtils.createUniqueEnumerationValue("value", enumList); //$NON-NLS-1$

            if (kind == ENUMERATION) {
                CompoundCommand compoundCommand = new CompoundCommand();
                XSDSimpleTypeDefinition targetSimpleType = null;
                if (feature != null) {
                    XSDSimpleTypeDefinition anonymousSimpleType = XSDCommonUIUtils.getAnonymousSimpleType(feature,
                            input);
                    if (anonymousSimpleType == null) {
                        anonymousSimpleType = XSDFactory.eINSTANCE.createXSDSimpleTypeDefinition();
                        anonymousSimpleType.setBaseTypeDefinition(input);

                        ChangeToLocalSimpleTypeCommand changeToAnonymousCommand = new ChangeToLocalSimpleTypeCommand(
                                Messages._UI_ACTION_CHANGE_PATTERN, feature);
                        changeToAnonymousCommand.setAnonymousSimpleType(anonymousSimpleType);
                        compoundCommand.add(changeToAnonymousCommand);
                        input = anonymousSimpleType;
                    }
                    targetSimpleType = anonymousSimpleType;
                } else {
                    targetSimpleType = input;
                }

                AddEnumerationsCommand command = new AddEnumerationsCommand(Messages._UI_ACTION_ADD_ENUMERATION,
                        targetSimpleType);
                command.setValue(newName);
                compoundCommand.add(command);
                commandStack.execute(compoundCommand);
                setInput(input);
                constraintsTableViewer.refresh();
                int newItemIndex = constraintsTableViewer.getTable().getItemCount() - 1;
                constraintsTableViewer.editElement(constraintsTableViewer.getElementAt(newItemIndex), 0);
            }
        } else if (e.widget == addUsingDialogButton) {
            Display display = Display.getCurrent();
            // if it is null, get the default one
            display = display == null ? Display.getDefault() : display;
            Shell shell = display.getActiveShell();

            if (kind == PATTERN) {
                String initialValue = ""; //$NON-NLS-1$
                RegexWizard wizard = new RegexWizard(initialValue);

                WizardDialog wizardDialog = new WizardDialog(shell, wizard);
                wizardDialog.setBlockOnOpen(true);
                wizardDialog.create();

                int result = wizardDialog.open();

                if (result == Window.OK) {
                    String newPattern = wizard.getPattern();
                    CompoundCommand compoundCommand = new CompoundCommand();
                    XSDSimpleTypeDefinition targetSimpleType = null;
                    if (feature != null) {
                        XSDSimpleTypeDefinition anonymousSimpleType = XSDCommonUIUtils
                                .getAnonymousSimpleType(feature, input);
                        if (anonymousSimpleType == null) {
                            anonymousSimpleType = XSDFactory.eINSTANCE.createXSDSimpleTypeDefinition();
                            anonymousSimpleType.setBaseTypeDefinition(input);

                            ChangeToLocalSimpleTypeCommand changeToAnonymousCommand = new ChangeToLocalSimpleTypeCommand(
                                    Messages._UI_ACTION_CHANGE_PATTERN, feature);
                            changeToAnonymousCommand.setAnonymousSimpleType(anonymousSimpleType);
                            compoundCommand.add(changeToAnonymousCommand);
                            input = anonymousSimpleType;
                        }
                        targetSimpleType = anonymousSimpleType;
                    } else {
                        targetSimpleType = input;
                    }

                    UpdateXSDPatternFacetCommand command = new UpdateXSDPatternFacetCommand(
                            Messages._UI_ACTION_ADD_PATTERN, targetSimpleType, UpdateXSDPatternFacetCommand.ADD);
                    command.setValue(newPattern);
                    setInput(input);
                    compoundCommand.add(command);
                    commandStack.execute(compoundCommand);
                    facetSection.doSetInput();
                }
                constraintsTableViewer.refresh();
            } else {
                EnumerationsDialog dialog = new EnumerationsDialog(shell);
                dialog.setBlockOnOpen(true);
                int result = dialog.open();

                if (result == Window.OK) {
                    String text = dialog.getText();
                    String delimiter = dialog.getDelimiter();
                    StringTokenizer tokenizer = new StringTokenizer(text, delimiter);
                    CompoundCommand compoundCommand = new CompoundCommand(Messages._UI_ACTION_ADD_ENUMERATIONS);

                    XSDSimpleTypeDefinition targetSimpleType = null;
                    if (feature != null) {
                        XSDSimpleTypeDefinition anonymousSimpleType = XSDCommonUIUtils
                                .getAnonymousSimpleType(feature, input);
                        if (anonymousSimpleType == null) {
                            anonymousSimpleType = XSDFactory.eINSTANCE.createXSDSimpleTypeDefinition();
                            anonymousSimpleType.setBaseTypeDefinition(input);

                            ChangeToLocalSimpleTypeCommand changeToAnonymousCommand = new ChangeToLocalSimpleTypeCommand(
                                    "", feature); //$NON-NLS-1$
                            changeToAnonymousCommand.setAnonymousSimpleType(anonymousSimpleType);
                            compoundCommand.add(changeToAnonymousCommand);
                            input = anonymousSimpleType;
                        }
                        targetSimpleType = anonymousSimpleType;
                    } else {
                        targetSimpleType = input;
                    }

                    while (tokenizer.hasMoreTokens()) {
                        String token = tokenizer.nextToken();
                        if (dialog.isPreserveWhitespace() == false) {
                            token = token.trim();
                        }
                        AddEnumerationsCommand command = new AddEnumerationsCommand(
                                Messages._UI_ACTION_ADD_ENUMERATIONS, targetSimpleType);
                        command.setValue(token);
                        compoundCommand.add(command);
                    }
                    commandStack.execute(compoundCommand);
                }
                //setInput(input);
                facetSection.doSetInput();
                constraintsTableViewer.refresh();
            }
        } else if (e.widget == deleteButton) {
            StructuredSelection selection = (StructuredSelection) constraintsTableViewer.getSelection();
            CompoundCommand compoundCommand = new CompoundCommand();
            if (selection != null) {
                Iterator i = selection.iterator();
                if (selection.size() > 0) {
                    compoundCommand.setLabel(Messages._UI_ACTION_DELETE_CONSTRAINTS);
                } else {
                    compoundCommand.setLabel(Messages._UI_ACTION_DELETE_PATTERN);
                }
                while (i.hasNext()) {
                    Object obj = i.next();
                    if (obj != null) {
                        if (obj instanceof XSDPatternFacet) {
                            UpdateXSDPatternFacetCommand command = new UpdateXSDPatternFacetCommand("", input, //$NON-NLS-1$
                                    UpdateXSDPatternFacetCommand.DELETE);
                            command.setPatternToEdit((XSDPatternFacet) obj);
                            compoundCommand.add(command);
                        } else if (obj instanceof XSDEnumerationFacet) {
                            XSDEnumerationFacet enumFacet = (XSDEnumerationFacet) obj;
                            DeleteCommand deleteCommand = new DeleteCommand(Messages._UI_ACTION_DELETE_ENUMERATION,
                                    enumFacet);
                            compoundCommand.add(deleteCommand);
                        }
                    }
                }
                commandStack.execute(compoundCommand);
                constraintsTableViewer.refresh();
            }
        } else if (e.widget == editButton) {
            StructuredSelection selection = (StructuredSelection) constraintsTableViewer.getSelection();
            if (selection != null) {
                Object obj = selection.getFirstElement();
                if (obj instanceof XSDPatternFacet) {
                    XSDPatternFacet pattern = (XSDPatternFacet) obj;
                    String initialValue = pattern.getLexicalValue();
                    if (initialValue == null) {
                        initialValue = ""; //$NON-NLS-1$
                    }

                    Shell shell = Display.getCurrent().getActiveShell();

                    RegexWizard wizard = new RegexWizard(initialValue);

                    WizardDialog wizardDialog = new WizardDialog(shell, wizard);
                    wizardDialog.setBlockOnOpen(true);
                    wizardDialog.create();

                    int result = wizardDialog.open();

                    if (result == Window.OK) {
                        String newPattern = wizard.getPattern();
                        pattern.setLexicalValue(newPattern);
                        constraintsTableViewer.refresh();
                    }
                }
            }
        }

        setButtonStates(this.kind);
    }

    public void widgetDefaultSelected(SelectionEvent e) {

    }

    public void setConstraintKind(int kind) {
        this.kind = kind;
        setButtonStates(kind);
        constraintsTableViewer.setInput(input);
        constraintsTableViewer.refresh();
    }

    public void doModify(Object element, String property, Object value) {
        setButtonStates(this.kind);
        if (element instanceof TableItem && (value != null)) {
            TableItem item = (TableItem) element;

            if (item.getData() instanceof XSDPatternFacet) {
                XSDPatternFacet patternFacet = (XSDPatternFacet) item.getData();
                patternFacet.setLexicalValue((String) value);

                item.setData(patternFacet);
                item.setText((String) value);
            } else if (item.getData() instanceof XSDEnumerationFacet) {
                XSDEnumerationFacet enumFacet = (XSDEnumerationFacet) item.getData();
                SetXSDFacetValueCommand command = new SetXSDFacetValueCommand(
                        Messages._UI_ACTION_SET_ENUMERATION_VALUE, enumFacet);
                command.setValue((String) value);
                commandStack.execute(command);
                item.setData(enumFacet);
                item.setText((String) value);
            }
        }
    }

    public Object doGetValue(Object element, String property) {
        if (element instanceof XSDPatternFacet) {
            XSDPatternFacet patternFacet = (XSDPatternFacet) element;
            String value = patternFacet.getLexicalValue();
            if (value == null)
                value = ""; //$NON-NLS-1$
            return value;
        } else if (element instanceof XSDEnumerationFacet) {
            XSDEnumerationFacet enumFacet = (XSDEnumerationFacet) element;
            String value = enumFacet.getLexicalValue();
            if (value == null)
                value = ""; //$NON-NLS-1$
            return value;
        }

        return ""; //$NON-NLS-1$
    }

    class ConstraintsTableViewer extends NavigableTableViewer implements ICellModifier {
        protected String[] columnProperties = { Messages._UI_LABEL_PATTERN };

        protected CellEditor[] cellEditors;

        Table table;

        public ConstraintsTableViewer(Table table) {
            super(table);
            table = getTable();

            table.setLinesVisible(true);

            setContentProvider(new ConstraintsContentProvider());
            setLabelProvider(new ConstraintsTableLabelProvider());
            setColumnProperties(columnProperties);

            setCellModifier(this);

            TableColumn column = new TableColumn(table, SWT.NONE, 0);
            column.setText(columnProperties[0]);
            column.setAlignment(SWT.LEFT);
            column.setResizable(true);

            cellEditors = new CellEditor[1];

            TableLayout layout = new TableLayout();
            ColumnWeightData data = new ColumnWeightData(100);

            layout.addColumnData(data);
            cellEditors[0] = new TextCellEditor(table);

            getTable().setLayout(layout);
            setCellEditors(cellEditors);
        }

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

        public void modify(Object element, String property, Object value) {
            doModify(element, property, value);
        }

        public Object getValue(Object element, String property) {
            return doGetValue(element, property);
        }

    }

    class ConstraintsContentProvider implements IStructuredContentProvider {
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }

        public java.lang.Object[] getElements(java.lang.Object inputElement) {
            java.util.List list = new ArrayList();
            if (inputElement instanceof XSDSimpleTypeDefinition) {
                XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition) inputElement;
                boolean isDefined = false;
                Iterator iter;
                if (kind == PATTERN) {
                    iter = st.getPatternFacets().iterator();
                } else {
                    iter = st.getEnumerationFacets().iterator();
                }

                while (iter.hasNext()) {
                    XSDFacet facet = (XSDFacet) iter.next();
                    isDefined = (facet.getRootContainer() == facetSection.xsdSchema);
                }

                if (kind == PATTERN) {
                    if (isDefined) {
                        return st.getPatternFacets().toArray();
                    }
                } else {
                    if (isDefined) {
                        return st.getEnumerationFacets().toArray();
                    }
                }
            }
            return list.toArray();
        }

        public void dispose() {
        }
    }

    class ConstraintsTableLabelProvider extends LabelProvider implements ITableLabelProvider {
        public ConstraintsTableLabelProvider() {

        }

        public Image getColumnImage(Object element, int columnIndex) {
            if (kind == PATTERN) {
                return XSDEditorPlugin.getXSDImage("icons/XSDSimplePattern.gif"); //$NON-NLS-1$
            } else {
                return XSDEditorPlugin.getXSDImage("icons/XSDSimpleEnum.gif"); //$NON-NLS-1$
            }
        }

        public String getColumnText(Object element, int columnIndex) {
            if (element instanceof XSDPatternFacet) {
                XSDPatternFacet pattern = (XSDPatternFacet) element;
                String value = pattern.getLexicalValue();
                if (value == null)
                    value = ""; //$NON-NLS-1$
                return value;
            } else if (element instanceof XSDEnumerationFacet) {
                XSDEnumerationFacet enumFacet = (XSDEnumerationFacet) element;
                String value = enumFacet.getLexicalValue();
                if (value == null)
                    value = ""; //$NON-NLS-1$
                return value;
            }
            return ""; //$NON-NLS-1$
        }
    }

}