Add WPE toolbar skin management button with drop-down menu. Update skin icon image.
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/skin.png b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/skin.png
new file mode 100644
index 0000000..8f229e9
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/skin.png
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/skin_obj.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/skin_obj.gif
deleted file mode 100644
index b135bb6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/skin_obj.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.properties
index 6944ae3..d57d3c1 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.properties
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.properties
@@ -41,3 +41,4 @@
 Navigate.Menu=Navigate
 Style.Menu=Style
 Insert.Menu=Insert
+ManageSkinsAction.Text=Manage Skins
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ManageSkinsAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ManageSkinsAction.java
new file mode 100644
index 0000000..4a9a79d
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ManageSkinsAction.java
@@ -0,0 +1,181 @@
+package org.eclipse.jst.pagedesigner.editors.actions;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jst.pagedesigner.PDPlugin;
+import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.dialogs.PropertyDialogAction;
+import org.eclipse.ui.internal.Workbench;
+
+/**
+ * Action to change the current DT skin.
+ * 
+ * @author Ian Trimble - Oracle
+ */
+public class ManageSkinsAction extends Action {
+
+	/**
+	 * Constructs an instance.
+	 */
+	public ManageSkinsAction() {
+		super(ActionsMessages.getString("ManageSkinsAction.Text"), AS_DROP_DOWN_MENU); //$NON-NLS-1$
+		setImageDescriptor(PDPlugin.getDefault().getImageDescriptor("skin.png")); //$NON-NLS-1$
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	@Override
+	public void run() {
+		IEditorPart editorPart = Workbench.getInstance().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+		if (editorPart instanceof HTMLEditor) {
+			IEditorInput editorInput = editorPart.getEditorInput();
+			if (editorInput instanceof IFileEditorInput) {
+				IFile file = ((IFileEditorInput)editorInput).getFile();
+				IProject project = file.getProject();
+				if (project != null) {
+					SelectionProvider selectionProvider = new SelectionProvider();
+					selectionProvider.setSelection(new StructuredSelection(project));
+			        PropertyDialogAction propertyDialogAction = new PropertyDialogAction(editorPart.getEditorSite(), selectionProvider);
+			        PreferenceDialog dialog = propertyDialogAction.createDialog();
+			        if (dialog != null) {
+			        	dialog.setSelectedNode("org.eclipse.jst.pagedesigner.WPEPropertyPage"); //$NON-NLS-1$
+			        	//yes, we create AGAIN - cannot find another way to get the selected node to stick
+			        	dialog = propertyDialogAction.createDialog();
+			        	if (dialog != null) {
+			        		dialog.open();
+			        	}
+			        }
+				}
+			}
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#getMenuCreator()
+	 */
+	@Override
+	public IMenuCreator getMenuCreator() {
+		return new MenuCreator();
+	}
+
+
+
+	/**
+	 * Simple selection provider for creation of the property dialog.
+	 */
+	private class SelectionProvider implements ISelectionProvider {
+		private ISelection selection;
+		/*
+		 * (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
+		 */
+		public void addSelectionChangedListener(ISelectionChangedListener listener) {
+			//do nothing - we don't care here
+		}
+		/*
+		 * (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
+		 */
+		public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+			//do nothing - we don't care here
+		}
+		/*
+		 * (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
+		 */
+		public void setSelection(ISelection selection) {
+			this.selection = selection;
+		}
+		/*
+		 * (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
+		 */
+		public ISelection getSelection() {
+			return selection;
+		}
+	}
+
+
+
+	/**
+	 * Store last created menu so we can dispose on next creation.
+	 */
+	private static Menu lastMenu;
+	/**
+	 * Menu creator for the drop-down button.
+	 */
+	private class MenuCreator implements IMenuCreator {
+		/*
+		 * (non-Javadoc)
+		 * @see org.eclipse.jface.action.IMenuCreator#dispose()
+		 */
+		public void dispose() {
+			if (lastMenu != null) {
+				lastMenu.dispose();
+			}
+		}
+		/*
+		 * (non-Javadoc)
+		 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control)
+		 */
+		public Menu getMenu(Control control) {
+			dispose();
+			lastMenu = new Menu(control);
+			buildMenu(lastMenu);
+			return lastMenu;
+		}
+		/*
+		 * (non-Javadoc)
+		 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu)
+		 */
+		public Menu getMenu(Menu menu) {
+			dispose();
+			lastMenu = new Menu(menu);
+			buildMenu(lastMenu);
+			return lastMenu;
+		}
+		private void buildMenu(Menu menu) {
+			MenuItem menuItem = new MenuItem(lastMenu, SWT.PUSH);
+			menuItem.setText(ActionsMessages.getString("ManageSkinsAction.Text")); //$NON-NLS-1$
+			menuItem.addSelectionListener(new SelectionListener() {
+				public void widgetSelected(SelectionEvent event) {
+					run();
+				}
+				public void widgetDefaultSelected(SelectionEvent event) {
+					widgetSelected(event);
+				}
+			});
+			IEditorPart editorPart = Workbench.getInstance().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+			if (editorPart instanceof HTMLEditor) {
+				IEditorInput editorInput = editorPart.getEditorInput();
+				if (editorInput instanceof IFileEditorInput) {
+					IFile file = ((IFileEditorInput)editorInput).getFile();
+					IProject project = file.getProject();
+					if (project != null) {
+						SkinsMenuItemBuilder skinsMenuItemBuilder =
+							new SkinsMenuItemBuilder(project);
+						skinsMenuItemBuilder.buildMenuItems(menu);
+					}
+				}
+			}
+		}
+	}
+
+}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PageDesignerActionBarContributor2.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PageDesignerActionBarContributor2.java
index 718bb96..b081c16 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PageDesignerActionBarContributor2.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PageDesignerActionBarContributor2.java
@@ -14,6 +14,7 @@
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.IStatusLineManager;
 import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.Separator;
 import org.eclipse.jst.pagedesigner.IJMTConstants;
 import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
 import org.eclipse.jst.pagedesigner.editors.SimpleGraphicalEditor;
@@ -67,6 +68,8 @@
 
 		if (actionBars != null) {
 			initCommonActionBarContributor(actionBars);
+			actionBars.getToolBarManager().add(new ManageSkinsAction());
+			actionBars.getToolBarManager().add(new Separator());
 			initDesignViewerActionBarContributor(actionBars);
 			initSourceViewerActionContributor(actionBars);
 		}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/SkinsMenuItemBuilder.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/SkinsMenuItemBuilder.java
new file mode 100644
index 0000000..f5541cb
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/SkinsMenuItemBuilder.java
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Oracle Corporation.
+ * 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:
+ *    Ian Trimble - initial API and implementation
+ *******************************************************************************/ 
+package org.eclipse.jst.pagedesigner.editors.actions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.jsf.common.metadata.Model;
+import org.eclipse.jst.jsf.common.metadata.Trait;
+import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
+import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
+import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
+import org.eclipse.jst.pagedesigner.dtresourceprovider.DTResourceProviderFactory;
+import org.eclipse.jst.pagedesigner.dtresourceprovider.DTSkinManager;
+import org.eclipse.jst.pagedesigner.dtresourceprovider.IDTResourceProvider;
+import org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin;
+import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.internal.Workbench;
+
+/**
+ * Builds menu items for managing skins.
+ * 
+ * @author Ian Trimble - Oracle
+ */
+public class SkinsMenuItemBuilder {
+
+	private static final String DATAKEY_DTSKIN = "DATAKEY_DTSKIN"; //$NON-NLS-1$
+	private static final String DATAKEY_NSURI = "DTATKEY_NSURI"; //$NON-NLS-1$
+
+	private static List<Menu> menuList = new ArrayList<Menu>();
+
+	private IProject project;
+
+	/**
+	 * Constructs an instance.
+	 * 
+	 * @param project IProject instance for which to get skin information.
+	 */
+	public SkinsMenuItemBuilder(IProject project) {
+		this.project = project;
+	}
+
+	/**
+	 * Builds menu items (adds a separator and then menu items to end of
+	 * specified menu.
+	 * 
+	 * @param menu Menu instance to which to add menu items.
+	 */
+	public void buildMenuItems(Menu menu) {
+		for (Menu oldMenu: menuList) {
+			oldMenu.dispose();
+		}
+		if (menu != null) {
+			new MenuItem(menu, SWT.SEPARATOR);
+			List<TaglibData> taglibDataList = getTaglibDataList();
+			for (TaglibData taglibData: taglibDataList) {
+				String nsURI = taglibData.getNSURI();
+				DTSkinManager dtSkinManager = DTSkinManager.getInstance(project);
+				IDTSkin currentDTSkin = dtSkinManager.getCurrentSkin(nsURI);
+				MenuItem menuItem = new MenuItem(menu, SWT.CASCADE);
+				menuItem.setText(taglibData.getName());
+				Menu skinMenu = new Menu(menuItem);
+				menuList.add(skinMenu);
+				menuItem.setMenu(skinMenu);
+				List<IDTSkin> dtSkins = dtSkinManager.getSkins(nsURI);
+				for (IDTSkin dtSkin: dtSkins) {
+					MenuItem skinMenuItem;
+					if (currentDTSkin == dtSkin) {
+						skinMenuItem = new MenuItem(skinMenu, SWT.CHECK);
+					} else {
+						skinMenuItem = new MenuItem(skinMenu, SWT.PUSH);
+					}
+					skinMenuItem.setText(dtSkin.getName());
+					skinMenuItem.setData(DATAKEY_DTSKIN, dtSkin);
+					skinMenuItem.setData(DATAKEY_NSURI, nsURI);
+					skinMenuItem.addSelectionListener(new SkinSelectionListener());
+				}
+			}
+		}
+	}
+
+	private List<TaglibData> getTaglibDataList() {
+		List<TaglibData> taglibDataList = new ArrayList<TaglibData>();
+		List<IDTResourceProvider> dtResourceProviders =
+			DTResourceProviderFactory.getInstance().getActiveDTResourceProviders(project);
+		for (IDTResourceProvider dtResourceProvider: dtResourceProviders) {
+			TaglibData taglibData = new TaglibData(dtResourceProvider.getId());
+			if (!taglibDataList.contains(taglibData)) {
+				taglibDataList.add(taglibData);
+			}
+		}
+		return taglibDataList;
+	}
+
+
+
+	/**
+	 * Used to hold and pass taglib-related data.
+	 */
+	private class TaglibData {
+		private String nsURI;
+		private String name;
+		public TaglibData(String nsURI) {
+			this.nsURI = nsURI;
+			ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, nsURI);
+			Model model = TaglibDomainMetaDataQueryHelper.getModel(modelContext);
+			Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model, "display-label"); //$NON-NLS-1$
+			this.name = TraitValueHelper.getValueAsString(trait);
+		}
+		public String getNSURI() {
+			return nsURI;
+		}
+		public String getName() {
+			return name;
+		}
+		/*
+		 * (non-Javadoc)
+		 * @see java.lang.Object#hashCode()
+		 */
+		public int hashCode() {
+			int nsURIHashCode = 0;
+			if (nsURI != null) {
+				nsURIHashCode = nsURI.hashCode();
+			}
+			int nameHashCode = 0;
+			if (name != null) {
+				nameHashCode = name.hashCode();
+			}
+			return nameHashCode | nsURIHashCode ;
+		}
+	}
+
+
+
+	/**
+	 * Selection listener for skin menu items.
+	 */
+	private class SkinSelectionListener implements SelectionListener {
+		/*
+		 * (non-Javadoc)
+		 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+		 */
+		public void widgetSelected(SelectionEvent event) {
+			String nsURI = (String)event.widget.getData(DATAKEY_NSURI);
+			IDTSkin dtSkin = (IDTSkin)event.widget.getData(DATAKEY_DTSKIN);
+			DTSkinManager.getInstance(project).setCurrentSkin(nsURI, dtSkin);
+			IEditorPart editorPart = Workbench.getInstance().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+			if (editorPart instanceof HTMLEditor) {
+				((HTMLEditor)editorPart).refreshDesignViewer();
+			}
+		}
+		/*
+		 * (non-Javadoc)
+		 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+		 */
+		public void widgetDefaultSelected(SelectionEvent event) {
+			widgetSelected(event);
+		}
+	}
+
+}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/WPEPropertyPage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/WPEPropertyPage.java
index 8a10dac..22b6689 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/WPEPropertyPage.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/WPEPropertyPage.java
@@ -173,6 +173,7 @@
 			localCurrentSkinMap.put(nsURI, defaultDTSkin);
 		}
 		skinsTable.refresh();
+		updateButtons();
 		super.performDefaults();
 	}
 
@@ -361,6 +362,10 @@
 		public String getName() {
 			return name;
 		}
+		/*
+		 * (non-Javadoc)
+		 * @see java.lang.Object#hashCode()
+		 */
 		public int hashCode() {
 			int nsURIHashCode = 0;
 			if (nsURI != null) {
@@ -423,7 +428,7 @@
 		public Image getImage(Object element) {
 			Image image = null;
 			if (element instanceof IDTSkin) {
-				image = PDPlugin.getDefault().getImage("skin_obj.gif"); //$NON-NLS-1$
+				image = PDPlugin.getDefault().getImage("skin.png"); //$NON-NLS-1$
 			}
 			return image;
 		}