/*******************************************************************************
* Copyright (c) 2007, 2010 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
* James Blackburn (Broadcom Corp.)
*******************************************************************************/
package org.eclipse.cdt.internal.core.settings.model;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.cdt.core.settings.model.CExternalSetting;
import org.eclipse.cdt.core.settings.model.ICSettingEntry;
import org.eclipse.cdt.core.settings.model.ICStorageElement;
import org.eclipse.cdt.internal.core.settings.model.CExternalSettinsDeltaCalculator.ExtSettingMapKey;
/**
* The raw external settings as exported by a project configuration.
*/
public class CExternalSettingsHolder extends CExternalSettingsContainer {
private Map<ExtSettingMapKey, CExternalSetting> fSettingsMap;
static final String ELEMENT_EXT_SETTINGS_CONTAINER = "externalSettings"; //$NON-NLS-1$
private boolean fIsModified;
CExternalSettingsHolder(){
}
CExternalSettingsHolder(ICStorageElement element){
ICStorageElement children[] = element.getChildren();
List<CExternalSetting> externalSettingList = null;
for(int i = 0; i < children.length; i++){
ICStorageElement child = children[i];
String name = child.getName();
if(CExternalSettingSerializer.ELEMENT_SETTING_INFO.equals(name)){
if(externalSettingList == null)
externalSettingList = new ArrayList<CExternalSetting>();
CExternalSetting setting = CExternalSettingSerializer.load(child);
externalSettingList.add(setting);
}
}
if(externalSettingList != null && externalSettingList.size() != 0){
for(int i = 0; i < externalSettingList.size(); i++){
CExternalSetting setting = externalSettingList.get(i);
createExternalSetting(setting.getCompatibleLanguageIds(),
setting.getCompatibleContentTypeIds(),
setting.getCompatibleExtensions(),
setting.getEntries());
}
}
}
CExternalSettingsHolder(CExternalSettingsHolder base){
if(base.fSettingsMap != null)
fSettingsMap = new HashMap<ExtSettingMapKey, CExternalSetting>(base.fSettingsMap);
}
@Override
public CExternalSetting[] getExternalSettings(){
if(fSettingsMap != null)
return fSettingsMap.values().toArray(new CExternalSetting[fSettingsMap.size()]);
return EMPTY_EXT_SETTINGS_ARRAY;
}
void setExternalSettings(CExternalSetting[] settings, boolean add){
if(!add)
removeExternalSettings();
if(settings != null){
for(int i = 0; i < settings.length; i++){
CExternalSetting setting = settings[i];
createExternalSetting(setting.getCompatibleLanguageIds(),
setting.getCompatibleContentTypeIds(),
setting.getCompatibleExtensions(),
setting.getEntries());
}
}
fIsModified = true;
}
void addExternalSettings(CExternalSetting[] settings){
setExternalSettings(settings, true);
}
public CExternalSetting createExternalSetting(String[] languageIDs,
String[] contentTypeIDs, String[] extensions,
ICSettingEntry[] entries) {
return createExternalSetting(new CExternalSetting(languageIDs, contentTypeIDs, extensions, entries));
}
private CExternalSetting createExternalSetting(CExternalSetting setting){
ExtSettingMapKey key = new ExtSettingMapKey(setting);
CExternalSetting newSetting;
if(fSettingsMap != null){
newSetting = fSettingsMap.get(key);
if(newSetting == null){
newSetting = new CExternalSetting(setting);
} else {
newSetting = new CExternalSetting(newSetting, setting.getEntries());
}
fSettingsMap.put(key, newSetting);
} else {
newSetting = new CExternalSetting(setting);
fSettingsMap = new HashMap<ExtSettingMapKey, CExternalSetting>();
fSettingsMap.put(key, newSetting);
}
fIsModified = true;
return newSetting;
}
public void removeExternalSetting(CExternalSetting setting) {
if(fSettingsMap != null){
ExtSettingMapKey key = new ExtSettingMapKey(setting);
CExternalSetting settingToRemove = fSettingsMap.get(key);
if(setting.equals(settingToRemove)){
fSettingsMap.remove(key);
fIsModified = true;
}
}
}
public void removeExternalSettings() {
if(fSettingsMap != null){
fSettingsMap.clear();
fSettingsMap = null;
fIsModified = true;
}
}
public void serialize(ICStorageElement el){
if(fSettingsMap != null && fSettingsMap.size() != 0){
for(Iterator<CExternalSetting> iter = fSettingsMap.values().iterator(); iter.hasNext();){
CExternalSetting setting = iter.next();
ICStorageElement child = el.createChild(CExternalSettingSerializer.ELEMENT_SETTING_INFO);
CExternalSettingSerializer.store(setting, child);
}
}
}
public boolean isModified(){
return fIsModified;
}
}