/******************************************************************************* * 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.jface.action.Action; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jst.jsf.common.metadata.Model; import org.eclipse.jst.jsf.common.metadata.Trait; import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataDomainContext; import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper; import org.eclipse.jst.jsf.common.metadata.query.internal.MetaDataQueryContextFactory; import org.eclipse.jst.jsf.common.metadata.query.internal.MetaDataQueryFactory; import org.eclipse.jst.jsf.common.metadata.query.internal.taglib.ITaglibDomainMetaDataQuery; 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.utils.EditorUtil; 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.IWorkbenchActionConstants; /** * 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) { List<TaglibData> taglibDataList = getTaglibDataList(); if (taglibDataList.size() > 0) { new MenuItem(menu, SWT.SEPARATOR); } 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); skinMenuItem.setSelection(true); } 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()); } } } } /** * Builds menu managers. * * @param parent Parent menu manager to which to append new menu managers. */ public void buildMenuManagers(IMenuManager parent) { List<TaglibData> taglibDataList = getTaglibDataList(); if (taglibDataList.size() > 0) { parent.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, new Separator()); } for (TaglibData taglibData: taglibDataList) { String nsURI = taglibData.getNSURI(); MenuManager newMgr = new MenuManager(taglibData.getName()); DTSkinManager dtSkinManager = DTSkinManager.getInstance(project); IDTSkin currentDTSkin = dtSkinManager.getCurrentSkin(nsURI); List<IDTSkin> dtSkins = dtSkinManager.getSkins(nsURI); for (IDTSkin dtSkin: dtSkins) { newMgr.add(new ChangeCurrentSkinAction(nsURI, dtSkin, dtSkin == currentDTSkin)); } parent.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, newMgr); } } 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; final IMetaDataDomainContext context = MetaDataQueryContextFactory.getInstance().createTaglibDomainModelContext(project); final ITaglibDomainMetaDataQuery query = MetaDataQueryFactory.getInstance().createQuery(context); final Model model = query.findTagLibraryModel(nsURI); final Trait trait = query.findTrait(model, "display-label"); //$NON-NLS-1$ this.name = TraitValueHelper.getValueAsString(trait); } public String getNSURI() { return nsURI; } public String getName() { if (name == null) { return nsURI; } 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); EditorUtil.refreshAllWPEDesignViewers(); } /* * (non-Javadoc) * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent) */ public void widgetDefaultSelected(SelectionEvent event) { widgetSelected(event); } } /** * Action for changing current skin. */ private class ChangeCurrentSkinAction extends Action { private String nsURI; private IDTSkin dtSkin; /** * Creates an instance. * * @param nsURI NSURI of taglib. * @param dtSkin IDTSkin instance. * @param checked true if IDTSkin instance is current for nsURI. */ public ChangeCurrentSkinAction(String nsURI, IDTSkin dtSkin, boolean checked) { super(dtSkin.getName()); this.nsURI = nsURI; this.dtSkin = dtSkin; setChecked(checked); } /* * (non-Javadoc) * @see org.eclipse.jface.action.Action#run() */ public void run() { DTSkinManager.getInstance(project).setCurrentSkin(nsURI, dtSkin); EditorUtil.refreshAllWPEDesignViewers(); } } }