[263718] Non-breaking API change required to support custom palette in WPE
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/pageDesignerExtension.exsd b/jsf/plugins/org.eclipse.jst.pagedesigner/schema/pageDesignerExtension.exsd
index b733b6e..bd84af6 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/pageDesignerExtension.exsd
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/schema/pageDesignerExtension.exsd
@@ -26,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>
@@ -204,6 +205,20 @@
          </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>
+   </element>
 
    <annotation>
       <appinfo>
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 c6ee37e..6b6acb6 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 @@
 	 * 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 90492c8..7f530f5 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.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.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.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;
@@ -958,27 +954,18 @@
         return null;
     }
 
+    
+    /**
+     * @return PaletteViewerPage
+     */
     private PaletteViewerPage getPaletteViewerPage()
     {
-        if (null == _paletteViewerPage)
+        if (_paletteViewerPage == null)
         {
-            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;
-	}
+            _paletteViewerPage = _designViewer.createPaletteViewerPage();
+        }
+        return _paletteViewerPage;
+    }	
 
 	/**
 	 * @return the edit domain
@@ -1076,16 +1063,6 @@
 		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 4c2c043..ccb5a12 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 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.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.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.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 @@
 public class SimpleGraphicalEditor extends GraphicalEditorWithFlyoutPalette implements
 		IDesignViewer, IDocumentSelectionMediator {
 
-    private HTMLEditor _delegate;
+	private HTMLEditor _delegate;
 
 	private IHTMLGraphicalViewer _viewer;
 
@@ -99,6 +108,8 @@
 
 	/** Palette component, holding the tools and shapes. */
 	private PaletteRoot _palette;
+	
+	private PaletteViewerPage _paletteViewerPage;
 
 	private SelectionSynchronizer _synchronizer = new SelectionSynchronizer(
 			this);
@@ -135,6 +146,10 @@
 		}
 	};
 
+	private PaletteViewerProvider _paletteViewerProvider;
+
+	protected IPaletteFactory _paletteViewerPageFactory;
+
 	/**
 	 * @param delegate
 	 * @param editdomain
@@ -142,7 +157,8 @@
 	public SimpleGraphicalEditor(HTMLEditor delegate,
 			DefaultEditDomain editdomain) {
 		_delegate = delegate;
-		this.setEditDomain(editdomain);
+		initPaletteFactory();
+		this.setEditDomain(editdomain);		
 	}
 
 	protected void createGraphicalViewer(Composite parent) {
@@ -199,7 +215,7 @@
 		_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 @@
 	 */
 	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());
+    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));
-			}
-		};
-	}
+    					// 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 @@
             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 0000000..646bdd5
--- /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 0000000..703ccf7
--- /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 7f14afb..0986d02 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 @@
 	 * @return default prefix 
 	 */
 	public String getDefaultPrefix(){
-		return ((TaglibPaletteDrawer)getParent()).getDefaultPrefix();
+		if (getParent() instanceof TaglibPaletteDrawer)
+			return ((TaglibPaletteDrawer)getParent()).getDefaultPrefix();
+		return "";
 	}
 
 	/**
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 e4d908c..df87769 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 @@
     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;