/******************************************************************************* * Copyright (c) 2001, 2006 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 org.eclipse.jface.viewers.CellEditor; //import org.eclipse.jface.viewers.ColumnWeightData; //import org.eclipse.jface.viewers.ICellModifier; //import org.eclipse.jface.viewers.ISelectionChangedListener; //import org.eclipse.jface.viewers.IStructuredContentProvider; //import org.eclipse.jface.viewers.ITableLabelProvider; //import org.eclipse.jface.viewers.LabelProvider; //import org.eclipse.jface.viewers.SelectionChangedEvent; //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.swt.SWT; //import org.eclipse.swt.events.MouseEvent; //import org.eclipse.swt.events.MouseTrackAdapter; //import org.eclipse.swt.graphics.Image; //import org.eclipse.swt.graphics.Point; //import org.eclipse.swt.widgets.Composite; //import org.eclipse.swt.widgets.Table; //import org.eclipse.swt.widgets.TableColumn; //import org.eclipse.swt.widgets.TableItem; //import org.eclipse.wst.common.ui.internal.viewers.NavigableTableViewer; //import org.eclipse.wst.xsd.ui.internal.editor.XSDEditorPlugin; //import org.eclipse.wst.xsd.ui.internal.actions.DOMAttribute; //import org.eclipse.wst.xsd.ui.internal.properties.XSDComboBoxPropertyDescriptor; //import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper; //import org.eclipse.xsd.XSDConstrainingFacet; //import org.eclipse.xsd.XSDFactory; //import org.eclipse.xsd.XSDMaxExclusiveFacet; //import org.eclipse.xsd.XSDMaxFacet; //import org.eclipse.xsd.XSDMaxInclusiveFacet; //import org.eclipse.xsd.XSDMinExclusiveFacet; //import org.eclipse.xsd.XSDMinFacet; //import org.eclipse.xsd.XSDMinInclusiveFacet; //import org.eclipse.xsd.XSDSimpleTypeDefinition; //import org.eclipse.xsd.util.XSDConstants; //import org.eclipse.xsd.util.XSDSchemaBuildingTools; //import org.w3c.dom.Element; public class FacetViewer //extends NavigableTableViewer implements ICellModifier { // public static final String FACET_NAME = XSDEditorPlugin.getXSDString("_UI_FACET_NAME"); // "Name"; // public static final String FACET_VALUE = XSDEditorPlugin.getXSDString("_UI_FACET_VALUE"); // "Value"; // public static final String FACET_OTHER = XSDEditorPlugin.getXSDString("_UI_FACET_FIXED"); // "Fixed"; // // protected FacetsTableLabelProvider facetsTableLabelProvider = new FacetsTableLabelProvider(); // protected FacetsTableContentProvider facetsTableContentProvider = new FacetsTableContentProvider(); // protected String[] columnProperties = { FACET_NAME, FACET_VALUE, FACET_OTHER }; // protected CellEditor[] cellEditors; // these cellEditors are used when // // non-whitespace facet is selected // protected CellEditor[] altCellEditors; // these cellEditors are used when // // whitespace facet is selected // // protected String[] whiteSpaceValues = new String[] { "", "preserve", "replace", "collapse" }; // protected String[] trueFalseValues = new String[] { "", "false", "true" }; // // /** // * @param parent // */ // public FacetViewer(Composite parent) // { // super(new Table(parent, SWT.FULL_SELECTION | SWT.SINGLE)); // // getTable().setLinesVisible(true); // getTable().setHeaderVisible(true); // // addSelectionChangedListener(new SelectionChangedListener()); // getTable().addMouseTrackListener(new MyMouseTrackListener()); // // setContentProvider(facetsTableContentProvider); // setLabelProvider(facetsTableLabelProvider); // setColumnProperties(columnProperties); // // setCellModifier(this); // // for (int i = 0; i < 3; i++) // { // TableColumn column = new TableColumn(getTable(), SWT.NONE, i); // column.setText(columnProperties[i]); // column.setAlignment(SWT.LEFT); // column.setResizable(true); // } // // cellEditors = new CellEditor[3]; // altCellEditors = new CellEditor[3]; // // TableLayout layout = new TableLayout(); // ColumnWeightData data = new ColumnWeightData(60, 80, true); // layout.addColumnData(data); // cellEditors[0] = null; // // ColumnWeightData data2 = new ColumnWeightData(120, 80, true); // layout.addColumnData(data2); // // cellEditors[1] = new TextCellEditor(getTable()); // XSDComboBoxPropertyDescriptor pd = new XSDComboBoxPropertyDescriptor("combo", "whitespace", whiteSpaceValues); // altCellEditors[1] = pd.createPropertyEditor(getTable()); // // ColumnWeightData data3 = new ColumnWeightData(60, 60, true); // layout.addColumnData(data3); // // XSDComboBoxPropertyDescriptor pd2 = new XSDComboBoxPropertyDescriptor("combo", "other", trueFalseValues); // cellEditors[2] = pd2.createPropertyEditor(getTable()); // altCellEditors[2] = pd2.createPropertyEditor(getTable()); // // getTable().setLayout(layout); // setCellEditors(cellEditors); // // } // // /* // * (non-Javadoc) // * // * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, // * java.lang.String) // */ // public boolean canModify(Object element, String property) // { // return property.equals(FACET_VALUE) || property.equals(FACET_OTHER); // } // // /* // * (non-Javadoc) // * // * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, // * java.lang.String) // */ // public Object getValue(Object element, String property) // { // int column = 0; // if (property.equals(columnProperties[0])) // { // column = 0; // } // else if (property.equals(columnProperties[1])) // { // column = 1; // } // else if (property.equals(columnProperties[2])) // { // column = 2; // } // // return facetsTableLabelProvider.getColumnText(element, column); // } // // /* // * (non-Javadoc) // * // * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, // * java.lang.String, java.lang.Object) // */ // public void modify(Object element, String property, Object value) // { // XSDSimpleTypeDefinition xsdSimpleType = (XSDSimpleTypeDefinition) getInput(); // TableItem item = (TableItem) element; // if (item != null) // { // Object o = item.getData(); // if (o != null) // { // if (o instanceof String) // { // String facet = (String) o; // // Element simpleTypeElement = xsdSimpleType.getElement(); // XSDDOMHelper xsdDOMHelper = new XSDDOMHelper(); // Element derivedByElement = xsdDOMHelper.getDerivedByElement(simpleTypeElement); // // String prefix = simpleTypeElement.getPrefix(); // prefix = (prefix == null) ? "" : (prefix + ":"); // // Element childNodeElement = null; // DOMAttribute valueAttr = null; // // XSDConstrainingFacet targetFacet = getXSDConstrainingFacet(facet); // // String newValue = ""; // if (value != null && value instanceof String) // { // newValue = (String) value; // } // // if (property.equals(columnProperties[1])) // { // if (targetFacet == null && newValue.length() > 0) // { // targetFacet = createFacet(facet); // childNodeElement = (derivedByElement.getOwnerDocument()).createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + facet); // valueAttr = new DOMAttribute(XSDConstants.VALUE_ATTRIBUTE, newValue); // childNodeElement.setAttribute(valueAttr.getName(), valueAttr.getValue()); // // add and format child // derivedByElement.appendChild(childNodeElement); // targetFacet.setElement(childNodeElement); // XSDDOMHelper.formatChild(childNodeElement); // // // XSDSchemaHelper.updateElement(xsdSimpleType); // } // if (targetFacet == null) // { // return; // } // // if (newValue.length() > 0) // { // targetFacet.setLexicalValue(newValue); // // if (targetFacet instanceof XSDMaxFacet || targetFacet instanceof XSDMinFacet) // { // if (targetFacet instanceof XSDMaxFacet) // { // if (targetFacet instanceof XSDMaxExclusiveFacet) // { // XSDMaxInclusiveFacet xsdMaxInclusiveFacet = xsdSimpleType.getMaxInclusiveFacet(); // if (xsdMaxInclusiveFacet != null) // { // Element xsdMaxInclusiveFacetElement = xsdMaxInclusiveFacet.getElement(); // XSDDOMHelper.removeNodeAndWhitespace(xsdMaxInclusiveFacetElement); // } // } // else if (targetFacet instanceof XSDMaxInclusiveFacet) // { // XSDMaxExclusiveFacet xsdMaxExclusiveFacet = xsdSimpleType.getMaxExclusiveFacet(); // if (xsdMaxExclusiveFacet != null) // { // Element xsdMaxExclusiveFacetElement = xsdMaxExclusiveFacet.getElement(); // XSDDOMHelper.removeNodeAndWhitespace(xsdMaxExclusiveFacetElement); // } // } // } // else if (targetFacet instanceof XSDMinFacet) // { // if (targetFacet instanceof XSDMinExclusiveFacet) // { // XSDMinInclusiveFacet xsdMinInclusiveFacet = xsdSimpleType.getMinInclusiveFacet(); // if (xsdMinInclusiveFacet != null) // { // Element xsdMinInclusiveFacetElement = xsdMinInclusiveFacet.getElement(); // XSDDOMHelper.removeNodeAndWhitespace(xsdMinInclusiveFacetElement); // } // } // else if (targetFacet instanceof XSDMinInclusiveFacet) // { // XSDMinExclusiveFacet xsdMinExclusiveFacet = xsdSimpleType.getMinExclusiveFacet(); // if (xsdMinExclusiveFacet != null) // { // Element xsdMinExclusiveFacetElement = xsdMinExclusiveFacet.getElement(); // XSDDOMHelper.removeNodeAndWhitespace(xsdMinExclusiveFacetElement); // } // } // } // } // } // else // // newValue.length == 0 // { // Element targetFacetElement = targetFacet.getElement(); // XSDDOMHelper.removeNodeAndWhitespace(targetFacetElement); // } // } // else if (property.equals(columnProperties[2])) // { // if (targetFacet != null) // { // if (newValue.length() > 0) // { // targetFacet.getElement().setAttribute(XSDConstants.FIXED_ATTRIBUTE, newValue); // } // else // { // targetFacet.getElement().removeAttribute(XSDConstants.FIXED_ATTRIBUTE); // } // } // } // xsdSimpleType.setElement(simpleTypeElement); // // xsdSimpleType.updateElement(); // refresh(); // } // } // } // } // // private XSDConstrainingFacet getXSDConstrainingFacet(String facetString) // { // XSDSimpleTypeDefinition xsdSimpleType = (XSDSimpleTypeDefinition) getInput(); // List list = xsdSimpleType.getFacetContents(); // if (list == null) // { // return null; // } // Iterator iter = list.iterator(); // XSDConstrainingFacet targetFacet = null; // // while (iter.hasNext()) // { // XSDConstrainingFacet xsdConstrainingFacet = (XSDConstrainingFacet) iter.next(); // if (xsdConstrainingFacet.getFacetName().equals(facetString)) // { // targetFacet = xsdConstrainingFacet; // break; // } // } // return targetFacet; // } // // private XSDConstrainingFacet createFacet(String facet) // { // XSDFactory factory = XSDSchemaBuildingTools.getXSDFactory(); // XSDConstrainingFacet xsdFacet = null; // if (facet.equals("length")) // { // xsdFacet = factory.createXSDLengthFacet(); // } // else if (facet.equals("minLength")) // { // xsdFacet = factory.createXSDMinLengthFacet(); // } // else if (facet.equals("maxLength")) // { // xsdFacet = factory.createXSDMaxLengthFacet(); // } // else if (facet.equals("minInclusive")) // { // xsdFacet = factory.createXSDMinInclusiveFacet(); // } // else if (facet.equals("minExclusive")) // { // xsdFacet = factory.createXSDMinExclusiveFacet(); // } // else if (facet.equals("maxInclusive")) // { // xsdFacet = factory.createXSDMaxInclusiveFacet(); // } // else if (facet.equals("maxExclusive")) // { // xsdFacet = factory.createXSDMaxExclusiveFacet(); // } // // else if (facet.equals("totalDigits")) // { // xsdFacet = factory.createXSDTotalDigitsFacet(); // } // else if (facet.equals("fractionDigits")) // { // xsdFacet = factory.createXSDFractionDigitsFacet(); // } // else if (facet.equals("whiteSpace")) // { // xsdFacet = factory.createXSDWhiteSpaceFacet(); // } // return xsdFacet; // } // // /** // * Get the tooltip for the facet // */ // public String getToolTip(String facet) // { // String key = ""; // if (facet.equals("length")) // { // key = "_UI_TOOLTIP_LENGTH"; // } // else if (facet.equals("minLength")) // { // key = "_UI_TOOLTIP_MIN_LEN"; // } // else if (facet.equals("maxLength")) // { // key = "_UI_TOOLTIP_MAX_LEN"; // } // // else if (facet.equals("minInclusive")) // { // key = "_UI_TOOLTIP_MIN_INCLUSIVE"; // } // else if (facet.equals("minExclusive")) // { // key = "_UI_TOOLTIP_MIN_EXCLUSIVE"; // } // // else if (facet.equals("maxInclusive")) // { // key = "_UI_TOOLTIP_MAX_INCLUSIVE"; // } // else if (facet.equals("maxExclusive")) // { // key = "_UI_TOOLTIP_MAX_EXCLUSIVE"; // } // // else if (facet.equals("totalDigits")) // { // key = "_UI_TOOLTIP_TOTAL_DIGITS"; // } // else if (facet.equals("fractionDigits")) // { // key = "_UI_TOOLTIP_FRACTION_DIGITS"; // } // // else if (facet.equals("whiteSpace")) // { // key = "_UI_TOOLTIP_WHITE_SPACE"; // } // // return (key != null) ? XSDEditorPlugin.getXSDString(key) : ""; // } // // /** // * This listener detects which row is selected and add a tool tip for that row // */ // public class MyMouseTrackListener extends MouseTrackAdapter // { // public void mouseHover(MouseEvent e) // { // TableItem item = getTable().getItem(new Point(e.x, e.y)); // if (item != null) // { // Object o = item.getData(); // if (o != null) // { // String facetName = (String) o; // getTable().setToolTipText(getToolTip(facetName)); // } // } // } // } // // /** // * Based on the selection, detects if it is a white space or not, and add the // * corresponding cell editors // */ // public class SelectionChangedListener implements ISelectionChangedListener // { // public void selectionChanged(SelectionChangedEvent event) // { // Object selection = event.getSelection(); // if (selection instanceof StructuredSelection) // { // Object o = ((StructuredSelection) selection).getFirstElement(); // if (o != null) // { // String facet = (String) o; // if (facet.equals("whiteSpace")) // { // setCellEditors(altCellEditors); // } // else // { // setCellEditors(cellEditors); // } // } // } // } // } // // class FacetsTableContentProvider implements IStructuredContentProvider // { // protected String facet; // // public void inputChanged(Viewer viewer, Object oldInput, Object newInput) // { // } // // public java.lang.Object[] getElements(java.lang.Object inputElement) // { // List v = new ArrayList(); // XSDSimpleTypeDefinition inputXSDSimpleType = (XSDSimpleTypeDefinition) inputElement; // XSDSimpleTypeDefinition base = inputXSDSimpleType.getPrimitiveTypeDefinition(); // // if (base != null) // { // Iterator validFacets = inputXSDSimpleType.getValidFacets().iterator(); // while (validFacets.hasNext()) // { // String aValidFacet = (String) validFacets.next(); // if (!(aValidFacet.equals("pattern") || aValidFacet.equals("enumeration"))) // { // v.add(aValidFacet); // } // } // } // return v.toArray(); // } // // public void dispose() // { // } // } // // class FacetsTableLabelProvider extends LabelProvider implements ITableLabelProvider // { // public Image getColumnImage(Object element, int columnIndex) // { // return null; // } // // public String getColumnText(Object element, int columnIndex) // { // if (element instanceof String) // { // String value = null; // XSDConstrainingFacet targetFacet = getXSDConstrainingFacet((String) element); // switch (columnIndex) // { // case 0: // { // value = (String) element; // break; // } // case 1: // { // if (targetFacet == null) // { // value = ""; // } // else // { // value = targetFacet.getLexicalValue(); // } // // break; // } // case 2: // { // if (targetFacet == null) // { // value = ""; // } // else // { // Element elem = targetFacet.getElement(); // value = elem.getAttribute(XSDConstants.FIXED_ATTRIBUTE); // if (value == null) // value = ""; // } // } // } // return value; // } // return ""; // } // } }