/******************************************************************************* * 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 java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.eclipse.cdt.core.settings.model.ICLanguageSetting; import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; import org.eclipse.cdt.core.settings.model.ICSettingBase; import org.eclipse.cdt.core.settings.model.extension.CLanguageData; import org.eclipse.cdt.core.settings.model.extension.impl.CDefaultLanguageData; import org.eclipse.cdt.core.settings.model.util.CDataUtil; import org.eclipse.cdt.core.settings.model.util.EntryStore; import org.eclipse.cdt.core.settings.model.util.KindBasedStore; public class CLanguageSetting extends CDataProxy implements ICLanguageSetting { CLanguageSetting(CLanguageData data, CDataProxyContainer parent, CConfigurationDescription cfg) { super(data, parent, cfg); } public final int getType() { return ICSettingBase.SETTING_LANGUAGE; } // public IContentType getHeaderContentType() { // CLanguageData data = getCLanguageData(false); // return data.getHeaderContentType(); // } public String getLanguageId() { CLanguageData data = getCLanguageData(false); return data.getLanguageId(); } public void setLanguageId(String id){ CLanguageData data = getCLanguageData(true); data.setLanguageId(id); } private CLanguageData getCLanguageData(boolean write){ return (CLanguageData)getData(write); } //TODO: public ICLanguageSettingEntry[] getSettingEntries() { // return getSettingEntries(ICLanguageSettingEntry.ALL); // } public ICLanguageSettingEntry[] getSettingEntries(int kind) { CLanguageData data = getCLanguageData(false); return data.getEntries(kind); } public List<ICLanguageSettingEntry> getSettingEntriesList(int kind) { CLanguageData data = getCLanguageData(false); ICLanguageSettingEntry entries[] = data.getEntries(kind); if (entries!=null) return new ArrayList<ICLanguageSettingEntry>(Arrays.asList(entries)); return new ArrayList<ICLanguageSettingEntry>(); } public String[] getSourceContentTypeIds() { CLanguageData data = getCLanguageData(false); String ids[] = data.getSourceContentTypeIds(); if(ids != null) return ids; return CDefaultLanguageData.EMPTY_STRING_ARRAY; } public int getSupportedEntryKinds() { CLanguageData data = getCLanguageData(false); return data.getSupportedEntryKinds(); } public boolean supportsEntryKind(int kind) { return (getSupportedEntryKinds() & kind) == kind; } /* public String[] getHeaderExtensions() { CLanguageData data = getCLanguageData(false); IContentType type = data.getHeaderContentType(); String[] exts; if(type != null) { exts = getContentTypeFileSpecs(type); } else { exts = data.getHeaderExtensions(); if(exts != null) exts = (String[])exts.clone(); else exts = new String[0]; } return exts; } */ public String[] getSourceExtensions() { CLanguageData data = getCLanguageData(false); return CDataUtil.getSourceExtensions(getProject(), data); // String[] exts = null; // String[] typeIds = data.getSourceContentTypeIds(); // if(typeIds != null && typeIds.length != 0){ // exts = CProjectDescriptionManager.getInstance().getExtensionsFromContentTypes(getProject(), typeIds); // } else { // exts = data.getSourceExtensions(); // if(exts != null && exts.length != 0) // exts = (String[])exts.clone(); // else // exts = CDefaultLanguageData.EMPTY_STRING_ARRAY; // } // // if(exts == null) // exts = CDefaultLanguageData.EMPTY_STRING_ARRAY; // return exts; } /* private Map fillNameToEntryMap(ICLanguageSettingEntry entries[], Map map){ if(map == null) map = new HashMap(); for(int i = 0; i < entries.length; i++){ ICLanguageSettingEntry entry = entries[i]; map.put(entry.getName(), entry); } return map; } private class SettingChangeInfo implements ICSettingsChangeInfo { CLanguageData fData; ICLanguageSettingEntry fNewEntries[]; int fKind; ICLanguageSettingEntryInfo fAddedInfo[]; ICLanguageSettingEntry fRemoved[]; SettingChangeInfo(int kind, ICLanguageSettingEntry newEntries[], CLanguageData data){ fNewEntries = newEntries; fData = data; fKind = kind; } SettingChangeInfo(int kind, ICLanguageSettingEntryInfo addedEntriesInfo[], ICLanguageSettingEntry removed[], CLanguageData data){ fAddedInfo = addedEntriesInfo; fRemoved = removed; fData = data; fKind = kind; } public ICLanguageSettingEntryInfo[] getAddedEntriesInfo() { // TODO Auto-generated method stub return null; } public ICLanguageSettingEntry[] getEntries() { if(fNewEntries == null){ ICLanguageSettingEntry oldEntries[] = fData.getSettingEntries(fKind); List list = new ArrayList(); for(int i = 0; i < oldEntries.length; i++){ ICLanguageSettingEntry entry = oldEntries[i]; if(entry.getKind() != fKind) continue; list.add(entry); } } return fNewEntries; } public int getKind() { return fKind; } public ICLanguageSettingEntry[] getRemovedEntries() { // TODO Auto-generated method stub return null; } } public void changeEntries(ICLanguageSettingEntryInfo[] added, ICLanguageSettingEntry[] removed) { CLanguageData data = getCLanguageData(true); Map map = null; if(added != null && added.length > 0){ map = sortEntries(added, true, map); } if(removed != null && removed.length > 0){ map = sortEntries(removed, false, map); } if(map != null){ for(Iterator iter = map.entrySet().iterator(); iter.hasNext();){ Map.Entry entry = (Map.Entry)iter.next(); int kind = ((Integer)entry.getKey()).intValue(); List lists[] = (List[])entry.getValue(); List aList = lists[0]; List rList = lists[1]; ICLanguageSettingEntry sortedAdded[] = aList != null ? (ICLanguageSettingEntry[])aList.toArray(new ICLanguageSettingEntry[aList.size()]) : null; ICLanguageSettingEntry sortedRemoved[] = rList != null ? (ICLanguageSettingEntry[])rList.toArray(new ICLanguageSettingEntry[rList.size()]) : null; data.changeEntries(kind, sortedAdded, sortedRemoved); } } } private Map sortEntries(ICLanguageSettingEntry entries[], boolean added, Map map){ if(map == null) map = new HashMap(); int index = added ? 0 : 1; for(int i = 0; i < entries.length; i++){ ICLanguageSettingEntry entry = entries[i]; if(entry != null){ Integer iKind = new Integer(entry.getKind()); List[] addedRemovedListArr = (List[])map.get(iKind); if(addedRemovedListArr == null){ addedRemovedListArr = new List[2]; map.put(iKind, addedRemovedListArr); } List list = addedRemovedListArr[index]; if(list == null){ list = new ArrayList(); addedRemovedListArr[index] = list; } list.add(entry); } } return map; } */ public void setSettingEntries(int kind, ICLanguageSettingEntry[] entries) { CLanguageData data = getCLanguageData(true); EntryStore store = new EntryStore(); // KindBasedStore nameSetStore = new KindBasedStore(); int eKind; if(entries != null){ if(entries.length != 0){ for(int i = 0; i < entries.length; i++){ ICLanguageSettingEntry entry = entries[i]; eKind = entry.getKind(); if((kind & eKind) != 0 && (data.getSupportedEntryKinds() & eKind) != 0){ store.addEntry(entry); } } } else { int kinds[] = KindBasedStore.getLanguageEntryKinds(); for(int i = 0; i < kinds.length; i++){ if((kinds[i] & kind) != 0){ store.storeEntries(kinds[i], new ICLanguageSettingEntry[0]); } } } } setSettingEntries(kind, data, store); } private int[] flagsToArray(int flags){ int arr[] = new int[32]; int num = 0; for(int i = 1; i != 0; i = i << 1){ if((flags & i) != 0) arr[num++] = i; } if(num == arr.length) return arr; else if(num == 0) return new int[0]; int result[] = new int[num]; System.arraycopy(arr, 0, result, 0, num); return result; } public void setSettingEntries(int kind, List<ICLanguageSettingEntry> list) { CLanguageData data = getCLanguageData(true); EntryStore store = new EntryStore(); // KindBasedStore nameSetStore = new KindBasedStore(); int eKind; if(list != null){ if(list.size() != 0){ for(ICLanguageSettingEntry entry : list){ eKind = entry.getKind(); if((kind & eKind) != 0 && (data.getSupportedEntryKinds() & eKind) != 0){ store.addEntry(entry); } } } else { int kinds[] = KindBasedStore.getLanguageEntryKinds(); for(int k : kinds){ if((k & kind) != 0){ store.storeEntries(k, new ICLanguageSettingEntry[0]); } } } } setSettingEntries(kind, data, store); } private void setSettingEntries(int kind, CLanguageData data, EntryStore store){ int oredk = getSupportedEntryKinds(); int kinds[] = flagsToArray(oredk); // int kinds[] = KindBasedStore.getSupportedKinds(); for(int i = 0; i < kinds.length; i++){ ICLanguageSettingEntry sortedEntries[] = store.containsEntriesList(kinds[i]) ? store.getEntries(kinds[i]) : null; if((kind & kinds[i]) != 0){ data.setEntries(kinds[i], sortedEntries); if(sortedEntries == null) CExternalSettingsManager.getInstance().restoreDefaults(this, kind); } } } /* private boolean shouldAdd(ICLanguageSettingEntry entry){ int kind = entry.getKind(); Set set = (Set)store.get(kind); if(set == null){ set = new HashSet(); store.put(kind, set); } return set.add(entry.getName()); } */ //TODO: public ICLanguageSettingEntry[] getResolvedSettingEntries() { // TODO Auto-generated method stub // return getSettingEntries(); // } public ICLanguageSettingEntry[] getResolvedSettingEntries(int kind) { ICLanguageSettingEntry entries[] = getSettingEntries(kind); entries = CDataUtil.resolveEntries(entries, getConfiguration()); return entries; } public void setSourceContentTypeIds(String[] ids) { CLanguageData data = getCLanguageData(true); data.setSourceContentTypeIds(ids); } public void setSourceExtensions(String[] exts) { CLanguageData data = getCLanguageData(true); data.setSourceExtensions(exts); } }