/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.xsd.ui.editor; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.dialogs.InputDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IEditorPart; import org.eclipse.xsd.XSDSchema; import org.eclipse.xsd.XSDSimpleFinal; import org.eclipse.xsd.XSDSimpleTypeDefinition; import org.eclipse.xsd.XSDWhiteSpace; import org.teiid.designer.core.workspace.ModelResource; import org.teiid.designer.ui.editors.ModelEditor; import org.teiid.designer.ui.editors.ModelEditorManager; import org.teiid.designer.ui.forms.CheckboxComponentSet; import org.teiid.designer.ui.forms.ComponentCategory; import org.teiid.designer.ui.forms.DialogProvider; import org.teiid.designer.ui.forms.FormTextComponentSet; import org.teiid.designer.ui.forms.FormTextObjectEditor; import org.teiid.designer.ui.forms.HyperlinkComponentSet; import org.teiid.designer.ui.forms.LinkedComponentSet; import org.teiid.designer.ui.forms.MultiComponentSet; import org.teiid.designer.ui.forms.TextComponentSet; import org.teiid.designer.ui.viewsupport.ModelUtilities; import org.teiid.designer.xsd.ui.ModelerXsdUiConstants; import org.teiid.designer.xsd.ui.ModelerXsdUiPlugin; /** * @since 8.0 */ public class GUIFacetHelper extends FacetHelper { public static final String CATEGORY_NONE = "NONE"; //$NON-NLS-1$ public static final String CATEGORY_FORMAT = "format"; //$NON-NLS-1$ public static final String CATEGORY_NUMERIC = "numeric"; //$NON-NLS-1$ public static final String CATEGORY_BOUNDS = "bounds"; //$NON-NLS-1$ public static final String CATEGORY_LENGTH = "length"; //$NON-NLS-1$ public static final String CATEGORY_ENTERPRISE = "enterprise"; //$NON-NLS-1$ public static final String CATEGORY_INHERITANCE = "inheritance"; //$NON-NLS-1$ public static final String CATEGORY_ID = "id"; //$NON-NLS-1$ private static final String[] FACET_CATEGORIES = {CATEGORY_NONE, CATEGORY_ID, CATEGORY_INHERITANCE, CATEGORY_ENTERPRISE, CATEGORY_LENGTH, CATEGORY_FORMAT, CATEGORY_BOUNDS, CATEGORY_NUMERIC}; public static final String FAKE_FACET_PREVENT_RESTRICTIONS = "preventrestrictions"; //$NON-NLS-1$ public static final String FAKE_FACET_RUNTIME = "runtime"; //$NON-NLS-1$ public static final String FAKE_FACET_ENTERPRISE = "enterprise"; //$NON-NLS-1$ public static final String FAKE_FACET_BASETYPE = "basetype"; //$NON-NLS-1$ public static final String FAKE_FACET_DESCRIPTION = "description"; //$NON-NLS-1$ public static final String FAKE_FACET_NAMESPACE = "namespace"; //$NON-NLS-1$ public static final String FAKE_FACET_NAME = "name"; //$NON-NLS-1$ public static final String FAKE_FACET_CREATE_SUBTYPE = "createsubtype"; //$NON-NLS-1$ public static final String FAKE_FACET_FIND_SUBTYPES = "findsubtypes"; //$NON-NLS-1$ public static final String FAKE_FACET_FIND_USES = "finduses"; //$NON-NLS-1$ public static final String FAKE_FACET_OPEN_HIERARCHY = "openhierarchy"; //$NON-NLS-1$ private static final String GROUP_INHERITANCE_LINKS = "inherit-links"; //$NON-NLS-1$ public static final String GROUP_INHERITANCE_LINKS_AND_PREVENT = "links-and-prevent"; //$NON-NLS-1$ public static final String FORM_CHANGE = getString("GUIFacetHelper.formChange"); //$NON-NLS-1$ public static final String FORM_DESCRIPTION_ADD = getString("GUIFacetHelper.formDescription.add"); //$NON-NLS-1$ private static final String DIALOG_NAME_TITLE_ID = "GUIFacetHelper.dialog.name.title"; //$NON-NLS-1$ private static final String DIALOG_NAME_DESC_ID = "GUIFacetHelper.dialog.name.desc"; //$NON-NLS-1$ private static final String DIALOG_NAMESPACE_TITLE_ID = "GUIFacetHelper.dialog.namespace.title"; //$NON-NLS-1$ private static final String DIALOG_NAMESPACE_DESC_ID = "GUIFacetHelper.dialog.namespace.desc"; //$NON-NLS-1$ private static final String DIALOG_CREATE_DESC = getString("GUIFacetHelper.dialog.create.desc"); //$NON-NLS-1$ private static final String DIALOG_CREATE_TITLE = getString("GUIFacetHelper.dialog.create.title"); //$NON-NLS-1$ static final String MESSAGE_NO_NAMESPACE = getString("GUIFacetHelper.message.noNamespace"); //$NON-NLS-1$ private static final String PREFIX_CATEGORY = "GUIFacetHelper.facetcategory."; //$NON-NLS-1$ private static final String PREFIX_FACET = "GUIFacetHelper.facet."; //$NON-NLS-1$ private static final String PREFIX_RESTRICTION = "GUIFacetHelper.restriction."; //$NON-NLS-1$ private static final String PREFIX_WHITESPACE = "GUIFacetHelper.whitespace."; //$NON-NLS-1$ private static final String SUFFIX_NAME = ".name"; //$NON-NLS-1$ private static final String SUFFIX_DESCRIPTION = ".desc"; //$NON-NLS-1$ private static final String RESTRICTION_LIST = XSDSimpleFinal.LIST_LITERAL.getName(); private static final String RESTRICTION_UNION = XSDSimpleFinal.UNION_LITERAL.getName(); private static final String RESTRICTION_ATOMIC = XSDSimpleFinal.RESTRICTION_LITERAL.getName(); private static final String[] RESTRICTION_OPTION_IDS = {RESTRICTION_ATOMIC, RESTRICTION_LIST, RESTRICTION_UNION}; private static final String[] RESTRICTION_OPTION_NAMES = {getString(PREFIX_RESTRICTION + RESTRICTION_ATOMIC), getString(PREFIX_RESTRICTION + RESTRICTION_LIST), getString(PREFIX_RESTRICTION + RESTRICTION_UNION)}; private static final String WHITESPACE_PRESERVE = XSDWhiteSpace.PRESERVE_LITERAL.getName(); private static final String WHITESPACE_REPLACE = XSDWhiteSpace.REPLACE_LITERAL.getName(); public static final String WHITESPACE_COLLAPSE = XSDWhiteSpace.COLLAPSE_LITERAL.getName(); private static final String[] WHITESPACE_OPTION_IDS = {WHITESPACE_PRESERVE, WHITESPACE_REPLACE, WHITESPACE_COLLAPSE,}; private static final String[] WHITESPACE_OPTION_NAMES = {getString(PREFIX_WHITESPACE + WHITESPACE_PRESERVE), getString(PREFIX_WHITESPACE + WHITESPACE_REPLACE), getString(PREFIX_WHITESPACE + WHITESPACE_COLLAPSE)}; private static final int DEFAULT_MAX_SPIN = DEFAULT_MAX_BOUNDS; private static Map catIDtoFacetList = new HashMap(); static { // TODO this stuff ought to be data-driven List l = new ArrayList(); l.add(new FormTextComponentSet(FAKE_FACET_NAMESPACE, getString(PREFIX_FACET + FAKE_FACET_NAMESPACE), FORM_CHANGE, false, new TextDialogProvider(FORM_CHANGE, DIALOG_NAMESPACE_TITLE_ID, DIALOG_NAMESPACE_DESC_ID))); catIDtoFacetList.put(CATEGORY_NONE, l); // ID: l = new ArrayList(); l.add(new FormTextComponentSet(FAKE_FACET_NAME, getString(PREFIX_FACET + FAKE_FACET_NAME), FORM_CHANGE, false, new TextDialogProvider(FORM_CHANGE, DIALOG_NAME_TITLE_ID, DIALOG_NAME_DESC_ID))); l.add(new TextComponentSet(FAKE_FACET_DESCRIPTION, GUIFacetHelper.getString(PREFIX_FACET + FAKE_FACET_DESCRIPTION), SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.WRAP)); catIDtoFacetList.put(CATEGORY_ID, l); // Inheritance: l = new ArrayList(); l.add(new FormTextComponentSet(FAKE_FACET_BASETYPE, getString(PREFIX_FACET + FAKE_FACET_BASETYPE), FORM_CHANGE, true, new BaseTypeDialogProvider(FORM_CHANGE)) { @Override protected String getUserDisplayString( Object o ) { if (o instanceof XSDSimpleTypeDefinition) { XSDSimpleTypeDefinition std = (XSDSimpleTypeDefinition)o; String targetNamespace = std.getTargetNamespace(); if (targetNamespace == null) { targetNamespace = MESSAGE_NO_NAMESPACE; } // endif return std.getName() + FormTextObjectEditor.HTML_LINK_END + " (" + targetNamespace + ") " + FormTextObjectEditor.HTML_LINK_VAL_BEGIN; //$NON-NLS-1$//$NON-NLS-2$ } // endif return super.getUserDisplayString(o); } @Override protected void valueClicked( Object value ) { showObject((EObject)value); } }); MultiComponentSet linkSet = new MultiComponentSet(GROUP_INHERITANCE_LINKS, new LinkedComponentSet[] { new HyperlinkComponentSet(FAKE_FACET_CREATE_SUBTYPE, getString(PREFIX_FACET + FAKE_FACET_CREATE_SUBTYPE), true), new HyperlinkComponentSet(FAKE_FACET_OPEN_HIERARCHY, getString(PREFIX_FACET + FAKE_FACET_OPEN_HIERARCHY)),}, SWT.VERTICAL); MultiComponentSet linkAndCheckSet = new MultiComponentSet(GROUP_INHERITANCE_LINKS_AND_PREVENT, new LinkedComponentSet[] { linkSet, new CheckboxComponentSet(FAKE_FACET_PREVENT_RESTRICTIONS, getString(PREFIX_FACET + FAKE_FACET_PREVENT_RESTRICTIONS), RESTRICTION_OPTION_IDS, RESTRICTION_OPTION_NAMES, SWT.VERTICAL)}, SWT.HORIZONTAL); l.add(linkAndCheckSet); catIDtoFacetList.put(CATEGORY_INHERITANCE, l); // Enterprise: l = new ArrayList(); l.add(new CheckboxComponentSet(FAKE_FACET_ENTERPRISE, getString(PREFIX_FACET + FAKE_FACET_ENTERPRISE))); l.add(new FormTextFacetSet(FAKE_FACET_RUNTIME, getString(PREFIX_FACET + FAKE_FACET_RUNTIME), null, false, new EnterpriseTypeDialogProvider(FORM_CHANGE))); catIDtoFacetList.put(CATEGORY_ENTERPRISE, l); // Length: l = new ArrayList(); l.add(new SpinnerFacetSet(FACET_LENGTH, getString(PREFIX_FACET + FACET_LENGTH), false, 0, DEFAULT_MAX_SPIN)); l.add(new SpinnerFacetSet(FACET_MINLENGTH, getString(PREFIX_FACET + FACET_MINLENGTH), false, 0, DEFAULT_MAX_SPIN)); l.add(new SpinnerFacetSet(FACET_MAXLENGTH, getString(PREFIX_FACET + FACET_MAXLENGTH), false, 0, DEFAULT_MAX_SPIN)); catIDtoFacetList.put(CATEGORY_LENGTH, l); // Format: l = new ArrayList(); DialogProvider dlp = new FacetValueEditorDialog(); l.add(new ComboFacetSet(FACET_WHITESPACE, getString(PREFIX_FACET + FACET_WHITESPACE), WHITESPACE_OPTION_IDS, WHITESPACE_OPTION_NAMES, WHITESPACE_COLLAPSE)); l.add(new TableFacetSet(FACET_ENUMERATION, getString(PREFIX_FACET + FACET_ENUMERATION), dlp)); l.add(new TableFacetSet(FACET_PATTERN, getString(PREFIX_FACET + FACET_PATTERN), dlp)); catIDtoFacetList.put(CATEGORY_FORMAT, l); // Bounds: l = new ArrayList(); l.add(new SpinnerFacetSet(FAKE_FACET_MINIMUM, getString(PREFIX_FACET + FAKE_FACET_MINIMUM), true, -DEFAULT_MAX_SPIN, DEFAULT_MAX_SPIN)); l.add(new SpinnerFacetSet(FAKE_FACET_MAXIMUM, getString(PREFIX_FACET + FAKE_FACET_MAXIMUM), true, -DEFAULT_MAX_SPIN, DEFAULT_MAX_SPIN)); catIDtoFacetList.put(CATEGORY_BOUNDS, l); // Numeric l = new ArrayList(); l.add(new SpinnerFacetSet(FACET_TOTALDIGITS, getString(PREFIX_FACET + FACET_TOTALDIGITS), false, 0, DEFAULT_MAX_SPIN)); l.add(new SpinnerFacetSet(FACET_FRACTIONDIGITS, getString(PREFIX_FACET + FACET_FRACTIONDIGITS), false, 0, DEFAULT_MAX_SPIN)); catIDtoFacetList.put(CATEGORY_NUMERIC, l); } public static ComponentCategory[] getCategories( Object transactionSource ) { ComponentCategory[] rv = new ComponentCategory[FACET_CATEGORIES.length]; for (int i = 0; i < rv.length; i++) { String id = FACET_CATEGORIES[i]; String name = getString(PREFIX_CATEGORY + id + SUFFIX_NAME); String desc = getString(PREFIX_CATEGORY + id + SUFFIX_DESCRIPTION); rv[i] = new ComponentCategory(id, name, desc, id != CATEGORY_NONE); addFacets(rv[i], transactionSource); rv[i].setVisible(false); } // endfor return rv; } private static void addFacets( ComponentCategory category, Object transactionSource ) { String id = category.getID(); List l = (List)catIDtoFacetList.get(id); if (l != null) { Iterator itor = l.iterator(); while (itor.hasNext()) { // make a new copy of the LCS: LinkedComponentSet lcs = ((LinkedComponentSet)itor.next()).cloneSet(); lcs.setCategory(category); if (lcs instanceof TableFacetSet) { TableFacetSet tfs = (TableFacetSet)lcs; tfs.setTransactionSource(transactionSource); } // endif category.addComponentSet(lcs); } // endwhile // make sure it will show: category.setVisible(true); } else { // no facets available, hide: category.setVisible(false); } // endif } public static String getString( String i18id ) { return ModelerXsdUiConstants.Util.getString(i18id); } public static boolean isReady( Control c ) { return c != null && !c.isDisposed(); } public static void showObject( EObject o ) { ModelResource mRes = ModelUtilities.getModelResourceForModelObject(o); if (mRes != null) { // MEM can handle the request: ModelEditorManager.open(o, true); } else { // no modelResource; likely a built-in type. Try to navigate to it: IEditorPart activeEditor = ModelerXsdUiPlugin.getDefault().getCurrentWorkbenchWindow().getActivePage().getActiveEditor(); if (activeEditor instanceof ModelEditor) { ModelEditor me = (ModelEditor)activeEditor; activeEditor = me.getActiveEditor(); if (activeEditor instanceof XsdSimpleDatatypesEditorPage) { XsdSimpleDatatypesEditorPage simpPage = (XsdSimpleDatatypesEditorPage)activeEditor; simpPage.openContext(o); } // endif } // endif } // endif } public static XSDSimpleTypeDefinition createType( XSDSchema location, XSDSimpleTypeDefinition baseType ) { return createType(null, location, baseType); } public static XSDSimpleTypeDefinition createType( Shell s, XSDSchema location, XSDSimpleTypeDefinition baseType ) { // TODO eventually provide a file picker to choose where to new this at. InputDialog idlg = new InputDialog(s, DIALOG_CREATE_TITLE, DIALOG_CREATE_DESC, "", null); //$NON-NLS-1$ idlg.setBlockOnOpen(true); idlg.open(); String typeName = idlg.getValue(); XSDSimpleTypeDefinition std = null; if (typeName != null) { // not cancelled; create: std = FacetHelper.createAtomicSimpleTypeDefinintion(location, typeName, baseType); } // endif return std; } }