/******************************************************************************* * Copyright (c) 2007, 2009 Intel 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: * Intel Corporation - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.internal.core.settings.model; import org.eclipse.cdt.core.settings.model.ICFolderDescription; import org.eclipse.cdt.core.settings.model.ICLanguageSetting; import org.eclipse.cdt.core.settings.model.ICResourceDescription; import org.eclipse.cdt.core.settings.model.ICSettingBase; import org.eclipse.cdt.core.settings.model.extension.CDataObject; import org.eclipse.cdt.core.settings.model.extension.CFolderData; import org.eclipse.cdt.core.settings.model.extension.CLanguageData; import org.eclipse.cdt.core.settings.model.extension.CResourceData; import org.eclipse.cdt.core.settings.model.util.PathSettingsContainer; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; public class CFolderDescription extends CDataProxyContainer implements ICFolderDescription, IProxyFactory, IInternalResourceDescription { private ResourceDescriptionHolder fRcHolder; private PathSettingsContainer fCache; CFolderDescription(CFolderData data, CConfigurationDescription cfg) { super(data, cfg, cfg); } public IPath getPath() { CResourceData data = (CResourceData)getData(false); return ResourceDescriptionHolder.normalizePath(data.getPath()); } public boolean isExcluded() { CConfigurationDescription cfg = (CConfigurationDescription)getConfiguration(); return cfg.isExcluded(getPath()); } public void setExcluded(boolean excluded) { CConfigurationDescription cfg = (CConfigurationDescription)getConfiguration(); cfg.setExcluded(getPath(), true, excluded); } public void setPath(IPath path) { path = ResourceDescriptionHolder.normalizePath(path); if(getPath().equals(path)) return; CResourceData data = (CResourceData)getData(true); data.setPath(path); } protected CFolderData getFolderData(boolean write){ return (CFolderData)getData(write); } @Override protected IProxyProvider createChildProxyProvider() { ICDataScope scope = new ICDataScope(){ public CDataObject[] getChildren() { return getFolderData(false).getLanguageDatas(); } public boolean isStatic() { return !containsWritableData(); } }; IProxyCache cache = new MapProxyCache(); return new ProxyProvider(scope, cache, this); } public ICResourceDescription getNestedResourceDescription(IPath relPath, boolean exactPath) { return getRcHolder().getResourceDescription(relPath, exactPath); } public ICResourceDescription[] getNestedResourceDescriptions(int kind) { return getRcHolder().getResourceDescriptions(kind); } public ICLanguageSetting getLanguageSettingForFile(String fileName) { IProject project = getConfiguration().getProjectDescription().getProject(); return CProjectDescriptionManager.getInstance().findLanguagSettingForFile(fileName, project, getLanguageSettings()); } public ICLanguageSetting[] getLanguageSettings() { IProxyProvider provider = getChildrenProxyProvider(); CFolderData data = (CFolderData)getData(false); CLanguageData lDatas[] = data.getLanguageDatas(); ICLanguageSetting settings[] = new ICLanguageSetting[lDatas.length]; for(int i = 0; i < lDatas.length; i++){ settings[i] = (ICLanguageSetting)provider.getProxy(lDatas[i]); } return settings; } public CDataProxy createProxy(CDataObject data) { if(data instanceof CLanguageData) return new CLanguageSetting((CLanguageData)data, this, (CConfigurationDescription)getConfiguration()); return null; } private ResourceDescriptionHolder getRcHolder(){ if(fRcHolder == null){ fRcHolder = ((CConfigurationDescription)getConfiguration()).createHolder(this); } return fRcHolder; } @Override void setData(CDataObject data) { super.setData(data); IPath cachedPath = getCachedPath(); IPath newPath = ((CResourceData)data).getPath(); if(cachedPath != null && !cachedPath.equals(newPath)){ fCache.setPath(newPath, true); } } public IPath getCachedPath() { if(fCache != null) return fCache.getPath(); return null; } public final int getType() { return ICSettingBase.SETTING_FOLDER; } public void setPathContainer(PathSettingsContainer cr) { fCache = cr; } public PathSettingsContainer getPathContainer(){ return fCache; } public ICResourceDescription[] getNestedResourceDescriptions() { return getNestedResourceDescriptions(ICSettingBase.SETTING_FILE | ICSettingBase.SETTING_FOLDER); } public ICFolderDescription getParentFolderDescription() { return getRcHolder().getParentFolderDescription(); } public ICLanguageSetting createLanguageSettingForContentTypes( String languageId, String[] typeIds) throws CoreException { CFolderData data = getFolderData(true); CLanguageData lData = data.createLanguageDataForContentTypes(languageId, typeIds); if(lData == null) throw ExceptionFactory.createCoreException(SettingsModelMessages.getString("CFolderDescription.0")); //$NON-NLS-1$ CDataProxy proxy = getChildrenProxyProvider().getProxy(lData); if(!(proxy instanceof ICLanguageSetting)) throw ExceptionFactory.createCoreException(SettingsModelMessages.getString("CFolderDescription.1") + proxy.getClass().getName()); //$NON-NLS-1$ return (ICLanguageSetting)proxy; } public ICLanguageSetting createLanguageSettingForExtensions( String languageId, String[] extensions) throws CoreException { CFolderData data = getFolderData(true); CLanguageData lData = data.createLanguageDataForExtensions(languageId, extensions); if(lData == null) throw ExceptionFactory.createCoreException(SettingsModelMessages.getString("CFolderDescription.2")); //$NON-NLS-1$ CDataProxy proxy = getChildrenProxyProvider().getProxy(lData); if(!(proxy instanceof ICLanguageSetting)) throw ExceptionFactory.createCoreException(SettingsModelMessages.getString("CFolderDescription.3") + proxy.getClass().getName()); //$NON-NLS-1$ return (ICLanguageSetting)proxy; } public boolean isRoot() { return getPath().segmentCount() == 0; } public boolean canExclude(boolean exclude) { CConfigurationDescription cfg = (CConfigurationDescription)getConfiguration(); return cfg.canExclude(getPath(), true, exclude); } /** * For debugging purpose only */ @Override public String toString() { String str = getPath().toString(); return str.length()==0 ? "/" : str; //$NON-NLS-1$ } }