/******************************************************************************* * 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, UpdateXSDPatternFacetCommand.DELETE); //$NON-NLS-1$ 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$ } } }