/******************************************************************************* * 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.dtresourceprovider; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.resources.IProject; import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil; import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode; /** * Manages IDTSkin instances and provides skin-related services. * * @author Ian Trimble - Oracle */ public class DTSkinManager { private static Map<IProject, DTSkinManager> dtSkinManagerMap = new HashMap<IProject, DTSkinManager>(); private Map<String, IDTSkin> currentDTSkinMap; private IProject project; /** * Constructs an instance (no public instantiation). * * @param project IProject instance for which this instance applies. */ private DTSkinManager(IProject project) { this.project = project; currentDTSkinMap = new HashMap<String, IDTSkin>(); } /** * Gets a DTSkinManager instance for the specified project instance. * * @param aProject IProject instance for which a DTSkinManager is being * requested. * @return A DTSkinManager instance for the specified project instance. */ public static synchronized DTSkinManager getInstance(IProject aProject) { DTSkinManager dtSkinManager = dtSkinManagerMap.get(aProject); if (dtSkinManager == null) { dtSkinManager = new DTSkinManager(aProject); dtSkinManagerMap.put(aProject, dtSkinManager); } return dtSkinManager; } /** * Gets a DTSkinManager instance for the IProject instance associated with * the specified IDOMNode instance. * * @param domNode IDOMNode instance for which a DTSkinManager is being * requested. * @return A DTSkinManager instance for the IProject instance associated * with the specified IDOMNode instance. */ public static DTSkinManager getInstance(IDOMNode domNode) { IDOMModel domModel = domNode.getModel(); IProject aProject = null; if (domModel != null) { aProject = StructuredModelUtil.getProjectFor(domModel); } return getInstance(aProject); } /** * Returns a List of available IDTSkin instances. * * @param id ID for which to get skins. * @return A List of available IDTSkin instances. List may be empty, but * will not be null. */ public List<IDTSkin> getSkins(String id) { List<IDTSkin> dtSkins = new ArrayList<IDTSkin>(); List<IDTResourceProvider> dtResourceProviders = DTResourceProviderFactory.getInstance().getActiveDTResourceProviders(project); for (IDTResourceProvider dtResourceProvider: dtResourceProviders) { if (dtResourceProvider.getId().equals(id)) { dtSkins.addAll(dtResourceProvider.getSkins()); } } return dtSkins; } /** * Returns the current IDTSkin instance for the specified ID. * * @param id The ID (typically nsURI) for which the current IDTSkin instance * is being requested. * @return The current IDTSkin instance for the specified ID. May return * null if there is no current IDTSkin instance for the specified ID. */ public IDTSkin getCurrentSkin(String id) { IDTSkin dtSkin = currentDTSkinMap.get(id); if (dtSkin == null) { dtSkin = getDefaultSkin(id); setCurrentSkin(id, dtSkin); } return dtSkin; } /** * Sets the current IDTSkin instance for the specified ID. * * @param id The ID (typically nsURI) for which the current IDTSkin instance * is being set. * @param dtSkin The current IDTSkin instance to be set for the specified ID. */ public void setCurrentSkin(String id, IDTSkin dtSkin) { if (id != null) { IDTSkin existingDTSkin = currentDTSkinMap.get(id); if (existingDTSkin != null) { existingDTSkin.releaseResources(); } if (dtSkin != null) { currentDTSkinMap.put(id, dtSkin); } else { currentDTSkinMap.remove(id); } } } /** * Returns a List of all current DTSkin instances (one per id). * * @return A List of all current DTSkin instances (one per id). */ public List<IDTSkin> getCurrentSkins() { List<IDTSkin> currentDTSkins = new ArrayList<IDTSkin>(); List <IDTResourceProvider> dtResourceProviders = DTResourceProviderFactory.getInstance().getActiveDTResourceProviders(project); for (IDTResourceProvider dtResourceProvider: dtResourceProviders) { IDTSkin dtSkin = getCurrentSkin(dtResourceProvider.getId()); if (dtSkin != null && !currentDTSkins.contains(dtSkin)) { currentDTSkins.add(dtSkin); } } return Collections.unmodifiableList(currentDTSkins); } /** * Returns the default IDTSkin instance for the specified ID. * * @param id The ID (typically nsURI) for which the default IDTSkin instance * is being requested. * @return The default IDTSkin instance for the specified ID. May return * null if there is no default IDTSkin instance for the specified ID. */ public IDTSkin getDefaultSkin(String id) { IDTSkin firstDTSkin = null; IDTSkin defaultDTSkin = null; for (IDTSkin dtSkin: getSkins(id)) { if (firstDTSkin == null) { firstDTSkin = dtSkin; } if (dtSkin.isDefault()) { defaultDTSkin = dtSkin; break; } } if (defaultDTSkin == null) { defaultDTSkin = firstDTSkin; } return defaultDTSkin; } }