diff options
author | gkessler | 2009-02-11 19:02:46 +0000 |
---|---|---|
committer | gkessler | 2009-02-11 19:02:46 +0000 |
commit | 31a1ff85371de0190eb1b17608796aae120c1e00 (patch) | |
tree | 7bc996d657a2245a45787e5032a751be247ff8a3 | |
parent | a854fecef2fad105cc8bedcf2fccdf51251ec21e (diff) | |
download | webtools.jsf-31a1ff85371de0190eb1b17608796aae120c1e00.tar.gz webtools.jsf-31a1ff85371de0190eb1b17608796aae120c1e00.tar.xz webtools.jsf-31a1ff85371de0190eb1b17608796aae120c1e00.zip |
[263718] Non-breaking API change required to support custom palette in WPE
- ported to HEAD
8 files changed, 258 insertions, 64 deletions
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/pageDesignerExtension.exsd b/jsf/plugins/org.eclipse.jst.pagedesigner/schema/pageDesignerExtension.exsd index 9bd9c05d1..7096161f0 100644 --- a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/pageDesignerExtension.exsd +++ b/jsf/plugins/org.eclipse.jst.pagedesigner/schema/pageDesignerExtension.exsd @@ -1,6 +1,6 @@ <?xml version='1.0' encoding='UTF-8'?> <!-- Schema file written by PDE --> -<schema targetNamespace="org.eclipse.jst.pagedesigner"> +<schema targetNamespace="org.eclipse.jst.pagedesigner" xmlns="http://www.w3.org/2001/XMLSchema"> <annotation> <appInfo> <meta.schema plugin="org.eclipse.jst.pagedesigner" id="pageDesignerExtension" name="Web Page Editor Extension"/> @@ -11,6 +11,11 @@ </annotation> <element name="extension"> + <annotation> + <appInfo> + <meta.element /> + </appInfo> + </annotation> <complexType> <sequence> <element ref="localDropHandler" minOccurs="0" maxOccurs="unbounded"/> @@ -21,6 +26,7 @@ <element ref="tagAttributeCellEditorFactory" minOccurs="0" maxOccurs="unbounded"/> <element ref="tagTransformOperation" minOccurs="0" maxOccurs="unbounded"/> <element ref="propertyPageFactory" minOccurs="0" maxOccurs="unbounded"/> + <element ref="paletteFactory" minOccurs="0" maxOccurs="unbounded"/> </sequence> <attribute name="point" type="string" use="required"> <annotation> @@ -192,9 +198,24 @@ The exception to this rule is that if the reference is not plugin-qualified, the <documentation> Provisional API. If an extension point is found in the system, the Web Page Editor will use the factory implementation to provide its property page. </documentation> - <appinfo> + <appInfo> <meta.attribute kind="java" basedOn="org.eclipse.jst.pagedesigner.editors.AbstractPropertySheetPageFactory:"/> - </appinfo> + </appInfo> + </annotation> + </attribute> + </complexType> + </element> + + <element name="paletteFactory"> + <complexType> + <attribute name="class" type="string" use="required"> + <annotation> + <documentation> + Provisional API. If an extension point is found in the system, the Web Page Editor will use the factory implementation to provide its paletteViewerPage + </documentation> + <appInfo> + <meta.attribute kind="java" basedOn="org.eclipse.jst.pagedesigner.editors.palette.AbstractPaletteFactory:"/> + </appInfo> </annotation> </attribute> </complexType> diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IJMTConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IJMTConstants.java index c6ee37ec8..6b6acb6ed 100644 --- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IJMTConstants.java +++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IJMTConstants.java @@ -99,4 +99,9 @@ public interface IJMTConstants { * extension for property page factory */ public static final String PROPERTY_PAGE_FACTORY = "propertyPageFactory"; //$NON-NLS-1$ + /** + * extension for palette viewer page factory + */ + public static final String PALETTE_FACTORY = "paletteFactory"; //$NON-NLS-1$ + } diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/HTMLEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/HTMLEditor.java index 0023a318c..d70a85940 100644 --- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/HTMLEditor.java +++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/HTMLEditor.java @@ -18,7 +18,6 @@ import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; @@ -28,8 +27,6 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Platform; import org.eclipse.gef.DefaultEditDomain; -import org.eclipse.gef.palette.PaletteRoot; -import org.eclipse.gef.ui.palette.PaletteViewerProvider; import org.eclipse.gef.ui.views.palette.PalettePage; import org.eclipse.gef.ui.views.palette.PaletteViewerPage; import org.eclipse.jface.text.IDocument; @@ -44,7 +41,6 @@ import org.eclipse.jst.pagedesigner.IJMTConstants; import org.eclipse.jst.pagedesigner.PDPlugin; import org.eclipse.jst.pagedesigner.dnd.internal.DesignerSourceMouseTrackAdapter; import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources; -import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager; import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider; import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IDocumentPageVariableAdapter; import org.eclipse.jst.pagedesigner.parts.DocumentEditPart; @@ -956,26 +952,18 @@ public final class HTMLEditor extends MultiPageEditorPart implements } return null; } - - private PaletteViewerPage getPaletteViewerPage() { - if (null == _paletteViewerPage) { - DefaultEditDomain editDomain = getEditDomain(); - PaletteItemManager manager = PaletteItemManager - .getInstance(getCurrentProject(getEditorInput())); - manager.reset(); - PaletteRoot paletteRoot = _designViewer.getPaletteRoot(); - editDomain.setPaletteRoot(paletteRoot); - - _paletteViewerPage = (PaletteViewerPage) _designViewer.getAdapter(PalettePage.class); - // if possible, try to use the - if (_paletteViewerPage == null) - { - PaletteViewerProvider provider = _designViewer.getPaletteViewerProvider2(); - _paletteViewerPage = new PaletteViewerPage(provider); - } - } - return _paletteViewerPage; - } + + /** + * @return PaletteViewerPage + */ + private PaletteViewerPage getPaletteViewerPage() + { + if (_paletteViewerPage == null) + { + _paletteViewerPage = _designViewer.createPaletteViewerPage(); + } + return _paletteViewerPage; + } /** * @return the edit domain @@ -1073,16 +1061,6 @@ public final class HTMLEditor extends MultiPageEditorPart implements return this._mode; } - private IProject getCurrentProject(IEditorInput input) { - IProject curProject = null; - IFile inputFile = null; - if (input instanceof IFileEditorInput) { - inputFile = ((IFileEditorInput) input).getFile(); - curProject = inputFile.getProject(); - } - return curProject; - } - public IEditorPart getActiveEditor() { IEditorPart result = null; if (_sash) { diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SimpleGraphicalEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SimpleGraphicalEditor.java index e644665b1..8ba9c022d 100644 --- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SimpleGraphicalEditor.java +++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SimpleGraphicalEditor.java @@ -15,7 +15,12 @@ import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtension; +import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Platform; import org.eclipse.gef.DefaultEditDomain; import org.eclipse.gef.EditPart; import org.eclipse.gef.GraphicalViewer; @@ -28,6 +33,7 @@ import org.eclipse.gef.ui.palette.PaletteViewerProvider; import org.eclipse.gef.ui.palette.FlyoutPaletteComposite.FlyoutPreferences; import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette; import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler; +import org.eclipse.gef.ui.views.palette.PaletteViewerPage; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; @@ -35,6 +41,7 @@ import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jst.pagedesigner.IJMTConstants; import org.eclipse.jst.pagedesigner.PDPlugin; import org.eclipse.jst.pagedesigner.actions.container.ContainerActionGroup; import org.eclipse.jst.pagedesigner.actions.menuextension.CustomedContextMenuActionGroup; @@ -54,6 +61,8 @@ import org.eclipse.jst.pagedesigner.editors.actions.RelatedViewActionGroup; import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteCustomizer; import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteRootFactory; import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteViewerProvider; +import org.eclipse.jst.pagedesigner.editors.palette.IPaletteFactory; +import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager; import org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar.DocumentPageVariableAdapter; import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.PageVariableAdapterFactory; import org.eclipse.jst.pagedesigner.parts.CSSStyleAdapterFactory; @@ -91,7 +100,7 @@ import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; public class SimpleGraphicalEditor extends GraphicalEditorWithFlyoutPalette implements IDesignViewer, IDocumentSelectionMediator { - private HTMLEditor _delegate; + private HTMLEditor _delegate; private IHTMLGraphicalViewer _viewer; @@ -99,6 +108,8 @@ public class SimpleGraphicalEditor extends GraphicalEditorWithFlyoutPalette impl /** Palette component, holding the tools and shapes. */ private PaletteRoot _palette; + + private PaletteViewerPage _paletteViewerPage; private SelectionSynchronizer _synchronizer = new SelectionSynchronizer( this); @@ -135,6 +146,10 @@ public class SimpleGraphicalEditor extends GraphicalEditorWithFlyoutPalette impl } }; + private PaletteViewerProvider _paletteViewerProvider; + + protected IPaletteFactory _paletteViewerPageFactory; + /** * @param delegate * @param editdomain @@ -142,7 +157,8 @@ public class SimpleGraphicalEditor extends GraphicalEditorWithFlyoutPalette impl public SimpleGraphicalEditor(HTMLEditor delegate, DefaultEditDomain editdomain) { _delegate = delegate; - this.setEditDomain(editdomain); + initPaletteFactory(); + this.setEditDomain(editdomain); } protected void createGraphicalViewer(Composite parent) { @@ -199,7 +215,7 @@ public class SimpleGraphicalEditor extends GraphicalEditorWithFlyoutPalette impl _viewer.addDropTargetListener(new PDTemplateTransferDropTargetListener( _viewer)); _viewer.addDropTargetListener(new ResouceDropTargetListener(_viewer)); - + // add double click support. _viewer.getControl().addMouseListener(new MouseAdapter() { public void mouseDoubleClick(MouseEvent e) { @@ -456,38 +472,74 @@ public class SimpleGraphicalEditor extends GraphicalEditorWithFlyoutPalette impl */ protected PaletteRoot getPaletteRoot() { if (_palette == null) { - _palette = DesignerPaletteRootFactory - .createPaletteRoot(getCurrentProject(_delegate.getEditorInput())); + if (_paletteViewerPageFactory != null) { + _palette = _paletteViewerPageFactory.createPaletteRoot(_delegate.getEditorInput()); + } + if (_palette == null) { + _palette = DesignerPaletteRootFactory + .createPaletteRoot(getCurrentProject(_delegate.getEditorInput())); + } } return _palette; } - /* + /* * (non-Javadoc) * * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#createPaletteViewerProvider() */ - protected PaletteViewerProvider createPaletteViewerProvider() { - return new DesignerPaletteViewerProvider(getEditDomain()) { - protected void configurePaletteViewer(PaletteViewer viewer) { - super.configurePaletteViewer(viewer); - viewer.setCustomizer(new DesignerPaletteCustomizer()); - - // create a drag source listener for this palette viewer - // together with an appropriate transfer drop target listener, - // this will enable - // model element creation by dragging a - // CombinatedTemplateCreationEntries - // from the palette into the editor - // @see ShapesEditor#createTransferDropTargetListener() - viewer - .addDragSourceListener(new DesignerTemplateTransferDragSourceListener( - viewer)); - } - }; - } + protected PaletteViewerProvider createPaletteViewerProvider() { + if (_paletteViewerProvider == null) { + if (_paletteViewerPageFactory != null) { + _paletteViewerProvider = _paletteViewerPageFactory.createPaletteViewerProvider(getEditDomain()); + } + if (_paletteViewerProvider == null) {//if still null + return new DesignerPaletteViewerProvider(getEditDomain()) { + protected void configurePaletteViewer(PaletteViewer viewer) { + super.configurePaletteViewer(viewer); + viewer.setCustomizer(new DesignerPaletteCustomizer()); + + // create a drag source listener for this palette viewer + // together with an appropriate transfer drop target listener, + // this will enable + // model element creation by dragging a + // CombinatedTemplateCreationEntries + // from the palette into the editor + // @see ShapesEditor#createTransferDropTargetListener() + viewer + .addDragSourceListener(new DesignerTemplateTransferDragSourceListener( + viewer)); + } + }; + } + } + return _paletteViewerProvider; + } + protected PaletteViewerPage createPaletteViewerPage() { + if (_paletteViewerPageFactory != null) { + _paletteViewerPage = _paletteViewerPageFactory.createPaletteViewerPage(createPaletteViewerProvider()); + } + if (_paletteViewerPage == null) { + DefaultEditDomain editDomain = getEditDomain(); + PaletteItemManager manager = PaletteItemManager + .getInstance(getCurrentProject(getEditorInput())); + manager.reset(); + PaletteRoot paletteRoot = getPaletteRoot(); + editDomain.setPaletteRoot(paletteRoot); + +// _paletteViewerPage = (PaletteViewerPage) super.getAdapter(PalettePage.class); + // if possible, try to use the + if (_paletteViewerPage == null) + { + PaletteViewerProvider provider = getPaletteViewerProvider2(); + _paletteViewerPage = new PaletteViewerPage(provider); + } + } + return _paletteViewerPage; + } + PaletteViewerProvider getPaletteViewerProvider2() { return getPaletteViewerProvider(); @@ -739,4 +791,69 @@ public class SimpleGraphicalEditor extends GraphicalEditorWithFlyoutPalette impl PageDesignerActionConstants.addStandardSelectActionGroups(selectSubMenu); } } + + + public PaletteViewerPage getPaletteViewerPage() { + if (_paletteViewerPage == null) { + _paletteViewerPage = createPaletteViewerPage(); + } + return _paletteViewerPage; + } + + protected IPaletteFactory initPaletteFactory() + { + if (_paletteViewerPageFactory == null) { + //List<IElementEditFactory> result = new ArrayList<IElementEditFactory>(); + IExtensionPoint extensionPoint = Platform.getExtensionRegistry() + .getExtensionPoint(PDPlugin.getPluginId(), + IJMTConstants.EXTENSION_POINT_PAGEDESIGNER); + IExtension[] extensions = extensionPoint.getExtensions(); + + for (int i = 0; i < extensions.length; i++) + { + IExtension ext = extensions[i]; + IConfigurationElement[] elementEditElement = ext + .getConfigurationElements(); + + for (int j = 0; j < elementEditElement.length; j++) + { + final IConfigurationElement element = elementEditElement[j]; + if (element.getName().equals( + IJMTConstants.PALETTE_FACTORY)) + { + elementEditElement[j].getAttribute("class"); //$NON-NLS-1$ + Object obj; + try + { + obj = elementEditElement[j] + .createExecutableExtension("class"); //$NON-NLS-1$ + + // TODO: we need a policy based solution here, + // but this will do for now + if (obj instanceof IPaletteFactory) + { + _paletteViewerPageFactory = (IPaletteFactory) obj; + } + } + catch (CoreException e) + { + PDPlugin.log("Problem loading element edit extension for "+element.toString(), e); //$NON-NLS-1$ + } + } + } + } + } + return _paletteViewerPageFactory; + } +// +// @Override +// public Object getAdapter(Class type) { +// if (type == PalettePage.class) { +// return getPaletteViewerPage(); +// } +// return super.getAdapter(type); +// } + + + } diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/AbstractPaletteFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/AbstractPaletteFactory.java new file mode 100644 index 000000000..646bdd572 --- /dev/null +++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/AbstractPaletteFactory.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2001, 2009 Oracle 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: + * Oracle Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jst.pagedesigner.editors.palette; + +import org.eclipse.gef.EditDomain; +import org.eclipse.gef.palette.PaletteRoot; +import org.eclipse.gef.ui.palette.PaletteViewerProvider; +import org.eclipse.gef.ui.views.palette.PaletteViewerPage; +import org.eclipse.ui.IEditorInput; + +/** + * Abstract class that all extenders must use to provide alternate palettes + * to the Web Page Editor. See also {@link IPaletteFactory} + */ +public abstract class AbstractPaletteFactory implements IPaletteFactory { + + public PaletteViewerPage createPaletteViewerPage(PaletteViewerProvider provider) {return null;} + public PaletteViewerProvider createPaletteViewerProvider(EditDomain domain) {return null;} + public PaletteRoot createPaletteRoot(IEditorInput editorInput){return null;} +} diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteFactory.java new file mode 100644 index 000000000..703ccf7bb --- /dev/null +++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteFactory.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * Copyright (c) 2001, 2009 Oracle 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: + * Oracle Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jst.pagedesigner.editors.palette; + +import org.eclipse.gef.EditDomain; +import org.eclipse.gef.palette.PaletteRoot; +import org.eclipse.gef.ui.palette.PaletteViewerProvider; +import org.eclipse.gef.ui.views.palette.PaletteViewerPage; +import org.eclipse.ui.IEditorInput; + +/** + * Create a palette parts to replace the default palette in + * the Web Page Editor. + * + * If any of the create methods return null, the default WPE behaviour will be used. + */ +public interface IPaletteFactory { + /** + * @param provider + * @return {@link PaletteViewerPage} - MAY return null. If null, the default palette viewer page will be used. + */ + public PaletteViewerPage createPaletteViewerPage(PaletteViewerProvider provider) ; + + /** + * @param domain + * @return {@link PaletteViewerProvider} - may return null. If null, the default paletteViewerProvider will be used. + */ + public PaletteViewerProvider createPaletteViewerProvider(EditDomain domain) ; + + /** + * @param editorInput + * @return PaletteRoot - may return null. If null, the default palette root will be used. + */ + public PaletteRoot createPaletteRoot(IEditorInput editorInput); +} diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolPaletteEntry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolPaletteEntry.java index 7f14afb96..40472bded 100644 --- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolPaletteEntry.java +++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolPaletteEntry.java @@ -50,7 +50,9 @@ public class TagToolPaletteEntry extends ToolEntry { * @return default prefix */ public String getDefaultPrefix(){ - return ((TaglibPaletteDrawer)getParent()).getDefaultPrefix(); + if (getParent() instanceof TaglibPaletteDrawer) + return ((TaglibPaletteDrawer)getParent()).getDefaultPrefix(); + return ""; //$NON-NLS-1$ } /** diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/CreationData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/CreationData.java index 76d29c869..cb5689fe0 100644 --- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/CreationData.java +++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/CreationData.java @@ -91,7 +91,7 @@ public final class CreationData protected static String getPrefix(String uri, IDOMModel model, String suggested) { // TODO: this shouldn't really add to the document - if (ITLDConstants.URI_HTML.equalsIgnoreCase(uri) + if (uri==null || ITLDConstants.URI_HTML.equalsIgnoreCase(uri) || ITLDConstants.URI_JSP.equalsIgnoreCase(uri) || CMDocType.JSP11_DOC_TYPE.equalsIgnoreCase(uri)) { return null; |