diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/util/SettingsSet.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/util/SettingsSet.java index 86b0ff9a5c8..c5dba340082 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/util/SettingsSet.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/util/SettingsSet.java @@ -13,13 +13,14 @@ package org.eclipse.cdt.core.settings.model.util; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; +import org.eclipse.cdt.core.settings.model.ICMacroEntry; +import org.eclipse.cdt.core.settings.model.ICSettingEntry; public class SettingsSet { public static final int READ_ONLY = 1; @@ -31,12 +32,12 @@ public class SettingsSet { private int fFlagsToClear; private boolean fIsReadOnly; private boolean fIsOverrideSupported; - private LinkedHashMap fEntries; - HashSet fOverrideSet; + private LinkedHashMap fEntries; + HashSet fOverrideSet; private Object fContext; private SettingLevel(){ - fEntries = new LinkedHashMap(); + fEntries = new LinkedHashMap(); } public boolean isReadOnly(){ @@ -79,10 +80,11 @@ public class SettingsSet { return (baseFlags | fFlagsToSet) & (~fFlagsToClear); } - public Set getOverrideSet(){ + @SuppressWarnings("unchecked") + public Set getOverrideSet(){ if(fOverrideSet != null) - return (HashSet)fOverrideSet.clone(); - return new HashSet(); + return (HashSet)fOverrideSet.clone(); + return new HashSet(); } public void addEntries(ICLanguageSettingEntry entries[]){ @@ -93,11 +95,9 @@ public class SettingsSet { } } - public void addEntries(List list){ - int size = list.size(); - for(int i = 0; i < size; i++){ - addEntry((ICLanguageSettingEntry)list.get(i)); - } + public void addEntries(List list){ + for(ICLanguageSettingEntry se : list) + addEntry(se); } public void addEntry(ICLanguageSettingEntry entry){ @@ -107,23 +107,23 @@ public class SettingsSet { public void addEntry(ICLanguageSettingEntry entry, Object customInfo){ entry = CDataUtil.createEntry(entry, fFlagsToSet, fFlagsToClear); EntryInfo info = new EntryInfo(entry, customInfo); - fEntries.put(info.getNameKey(), info); + fEntries.put(info.getContentsKey(), info); } public void addOverrideName(String name){ if(fOverrideSet == null) - fOverrideSet = new HashSet(); + fOverrideSet = new HashSet(); fOverrideSet.add(name); } - public void addOverrideNameSet(Set set){ + public void addOverrideNameSet(Set set){ if(set == null) return; if(fOverrideSet != null){ fOverrideSet.addAll(set); } else if(set.size() != 0){ - fOverrideSet = new HashSet(set); + fOverrideSet = new HashSet(set); } } @@ -142,33 +142,33 @@ public class SettingsSet { fOverrideSet = null; } - public Map clearAndGetMap(){ - Map map = fEntries; - fEntries = new LinkedHashMap(); + public Map clearAndGetMap(){ + Map map = fEntries; + fEntries = new LinkedHashMap(); fOverrideSet = null; return map; } public EntryInfo[] getInfos(){ - return (EntryInfo[])fEntries.values().toArray(new EntryInfo[fEntries.size()]); + return fEntries.values().toArray(new EntryInfo[fEntries.size()]); } public ICLanguageSettingEntry[] getEntries(){ - List list = getEntriesList(false); - return (ICLanguageSettingEntry[])list.toArray(new ICLanguageSettingEntry[list.size()]); + List list = getEntriesList(false); + return list.toArray(new ICLanguageSettingEntry[list.size()]); } public ICLanguageSettingEntry[] getEntries(boolean includeOverridden){ - List list = getEntriesList(includeOverridden); - return (ICLanguageSettingEntry[])list.toArray(new ICLanguageSettingEntry[list.size()]); + List list = getEntriesList(includeOverridden); + return list.toArray(new ICLanguageSettingEntry[list.size()]); } - public List getEntriesList(boolean includeOverridden){ - List list = new ArrayList(); + public List getEntriesList(boolean includeOverridden){ + List list = new ArrayList(); EntryInfo infos[] = getInfos(); - for(int i = 0; i < infos.length; i++){ - if(includeOverridden || !infos[i].isOverridden()) - list.add(infos[i].getEntry()); + for(EntryInfo info : infos){ + if(includeOverridden || !info.isOverridden()) + list.add(info.getEntry()); } return list; @@ -194,7 +194,7 @@ public class SettingsSet { fCustomInfo = customInfo; } - public EntryNameKey getNameKey(){ + public EntryNameKey getContentsKey(){ if(fNameKey == null){ fNameKey = new EntryNameKey(fEntry); } @@ -230,7 +230,7 @@ public class SettingsSet { } public void adjustOverrideState(){ - Set set = new HashSet(); + Set set = new HashSet(); SettingLevel level; for(int i = 0; i < fLevels.length; i++){ level = fLevels[i]; @@ -240,11 +240,8 @@ public class SettingsSet { } } - private void adjustOverrideState(SettingLevel level, Set overridenSet){ - EntryInfo[] infos = level.getInfos(); - EntryInfo info; - for(int i = 0; i < infos.length; i++){ - info = infos[i]; + private void adjustOverrideState(SettingLevel level, Set overridenSet){ + for(EntryInfo info : level.getInfos()){ if(overridenSet.add(info.getEntry().getName())){ info.makeOverridden(false); } else { @@ -259,23 +256,18 @@ public class SettingsSet { public ICLanguageSettingEntry[] getEntries(int types){ adjustOverrideState(); - List entries = new ArrayList(); - for(int i = 0; i < fLevels.length; i++){ - if(isCompatible(fLevels[i], types)) - getEntries(fLevels[i], entries); + List entries = new ArrayList(); + for(SettingLevel sl : fLevels){ + if(isCompatible(sl, types)) + getEntries(sl, entries); } - - return (ICLanguageSettingEntry[])entries.toArray(new ICLanguageSettingEntry[entries.size()]); + return entries.toArray(new ICLanguageSettingEntry[entries.size()]); } - private void getEntries(SettingLevel level, List list){ - EntryInfo[] infos = level.getInfos(); - EntryInfo info; - for(int i = 0; i < infos.length; i++){ - info = infos[i]; + private void getEntries(SettingLevel level, List list){ + for(EntryInfo info : level.getInfos()) if(!info.isOverridden()) list.add(info.getEntry()); - } } private boolean isCompatible(SettingLevel level, int types){ @@ -305,33 +297,31 @@ public class SettingsSet { return -1; } + @SuppressWarnings("unchecked") public void applyEntries(ICLanguageSettingEntry[] entries){ - HashMap map = getEntryLevelMap(WRITABLE | READ_ONLY); - Map mapCopy = (HashMap)map.clone(); - - Map[] clearedInfos = new Map[fLevels.length]; + HashMap map = getEntryLevelMap(WRITABLE | READ_ONLY); + Map mapCopy = (HashMap)map.clone(); + Map[] clearedInfos = new Map [fLevels.length]; for(int i = 0; i < fLevels.length; i++){ - if(!fLevels[i].isReadOnly()){ + if(!fLevels[i].isReadOnly()) clearedInfos[i] = fLevels[i].clearAndGetMap(); - } } Integer levelInteger; int levelNum; - EntryNameKey key; ICLanguageSettingEntry entry; int writableLevel = getWritableLevelNum(); SettingLevel level; for(int i = 0; i < entries.length; i++){ entry = entries[i]; - key = new EntryNameKey(entry); + EntryNameKey key = new EntryNameKey(entry); Object[] o = (Object[])map.get(key); - if(o != null){ + if(o != null && valueMatches(entry, o[1])){ mapCopy.remove(key); - levelInteger = (Integer)o[0]; + levelInteger = (Integer)o[0]; } else { levelInteger = null; } @@ -340,7 +330,7 @@ public class SettingsSet { if(levelNum >= 0){ level = fLevels[levelNum]; if(!level.isReadOnly()){ - Map clearedInfo = clearedInfos[levelNum]; + Map clearedInfo = clearedInfos[levelNum]; Object customInfo = null; if(clearedInfo != null){ EntryInfo info = (EntryInfo)clearedInfo.get(key); @@ -356,10 +346,12 @@ public class SettingsSet { if(overrideLevel >= 0){ level = fLevels[overrideLevel]; if(level.isOverrideSupported() && !mapCopy.isEmpty()){ - String str; - for(Iterator iter = mapCopy.keySet().iterator(); iter.hasNext();){ - str = ((EntryNameKey)iter.next()).getEntry().getName(); - if(str != null) + for(EntryNameKey enk : mapCopy.keySet()){ + ICSettingEntry e = enk.getEntry(); + if ((e.getFlags() & ICSettingEntry.BUILTIN) == 0) + continue; + String str = e.getName(); + if(str != null) level.addOverrideName(str); } } @@ -367,26 +359,38 @@ public class SettingsSet { adjustOverrideState(); } - public HashMap getEntryLevelMap(int types){ - HashMap map = new HashMap(); + public HashMap getEntryLevelMap(int types){ + HashMap map = new HashMap(); for(int i = 0; i < fLevels.length; i++){ if(isCompatible(fLevels[i], types)) addLevelInfoToMap(fLevels[i], i, map); } - return map; - } - private void addLevelInfoToMap(SettingLevel level, int l, Map map){ - EntryInfo infos[] = level.getInfos(); - EntryInfo info; - EntryNameKey key; - for(int i = 0; i < infos.length; i++){ - info = infos[i]; - key = info.getNameKey(); + private void addLevelInfoToMap(SettingLevel level, int l, Map map){ + for(EntryInfo info : level.getInfos()){ + EntryNameKey key = info.getContentsKey(); if(!map.containsKey(key)) map.put(key, new Object[]{new Integer(l), info.getEntry()}); } } + + private static boolean valueMatches(ICLanguageSettingEntry e, Object o) { + if (!(e instanceof ICMacroEntry)) + return true; // ignore values for other entries + if (!(o instanceof ICMacroEntry)) + return false; // cannot compare different entries + String s1 = e.getValue(); + String s2 = ((ICMacroEntry)o).getValue(); + if (s1 == null && s2 == null) + return true; + if (s1 != null) + return s1.equals(s2); + else + return s2.equals(s1); + } + + + } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractLangsListTab.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractLangsListTab.java index 78e0cf93147..92ca3b6904d 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractLangsListTab.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractLangsListTab.java @@ -83,7 +83,7 @@ public abstract class AbstractLangsListTab extends AbstractCPropertyTab { protected TableColumn columnToFit = null; protected ICLanguageSetting lang; - protected LinkedList incs; + protected LinkedList shownEntries; protected ArrayList exported; protected SashForm sashForm; protected ICLanguageSetting [] ls; // all languages known @@ -221,9 +221,10 @@ public abstract class AbstractLangsListTab extends AbstractCPropertyTab { boolean canExport = index != -1; boolean canEdit = canExport && ids.length == 1; boolean canDelete = canExport; + ICLanguageSettingEntry ent = null; if (canExport) { - ICLanguageSettingEntry ent = (ICLanguageSettingEntry)(table.getItem(index).getData()); - if (ent.isBuiltIn() || ent.isReadOnly()) canEdit = false; + ent = (ICLanguageSettingEntry)(table.getItem(index).getData()); + if (ent.isReadOnly()) canEdit = false; if (ent.isReadOnly()) canDelete = false; if (exported.contains(ent)) buttonSetText(3, UIMessages.getString("AbstractLangsListTab.4")); //$NON-NLS-1$ @@ -232,10 +233,10 @@ public abstract class AbstractLangsListTab extends AbstractCPropertyTab { } else { buttonSetText(3, UIMessages.getString("AbstractLangsListTab.2")); //$NON-NLS-1$ } - boolean canMoveUp = canEdit && index > 0; - boolean canMoveDown = canEdit && (index < table.getItemCount() - 1); + boolean canMoveUp = canEdit && index > 0 && !ent.isBuiltIn(); + boolean canMoveDown = canEdit && (index < table.getItemCount() - 1) && !ent.isBuiltIn(); if (canMoveDown && showBIButton.getSelection()) { - ICLanguageSettingEntry ent = (ICLanguageSettingEntry)(table.getItem(index+1).getData()); + ent = (ICLanguageSettingEntry)(table.getItem(index+1).getData()); if (ent.isBuiltIn()) canMoveDown = false; // cannot exchange with built in } buttonSetEnabled(0, canAdd); // add @@ -306,8 +307,8 @@ public abstract class AbstractLangsListTab extends AbstractCPropertyTab { if (x == -1) x = 0; else x += shift; // used only for UP/DOWN - incs = getIncs(); - tv.setInput(incs.toArray(new Object[incs.size()])); + shownEntries = getIncs(); + tv.setInput(shownEntries.toArray(new Object[shownEntries.size()])); if (table.getItemCount() > x) table.select(x); else if (table.getItemCount() > 0) table.select(0); } @@ -395,29 +396,48 @@ public abstract class AbstractLangsListTab extends AbstractCPropertyTab { addToAll(ent); } else { if (isWModifyMode() && (lang instanceof MultiLanguageSetting)) { - performMulti(ent, false); + performMulti(ent, null); } else { - incs.add(ent); - setSettingEntries(getKind(), incs, toAllLang); + changeIt(ent, null); } } update(); } } - private void performMulti(ICLanguageSettingEntry ent, boolean delete) { + private void changeIt(ICLanguageSettingEntry add, ICLanguageSettingEntry[] del) { + List ls = getSettingEntriesList(getKind()); + if (del != null) { + for (ICLanguageSettingEntry d : del) { + for (ICLanguageSettingEntry e : ls) { + if (d.getName().equals(e.getName())) { + ls.remove(e); + break; + } + } + } + } + if (add != null) + ls.add(add); + setSettingEntries(getKind(), ls, toAllLang); + } + + private void performMulti(ICLanguageSettingEntry ent, ICLanguageSettingEntry del) { MultiLanguageSetting ms = (MultiLanguageSetting)lang; ICLanguageSetting[] ls = (ICLanguageSetting[])ms.getItems(); ICLanguageSettingEntry[][] es = ms.getSettingEntriesM(getKind()); for (int i=0; i entries = new ArrayList(Arrays.asList(es[i])); - for (ICLanguageSettingEntry e : entries) - if (e.getName().equals(ent.getName())) { - entries.remove(e); - break; + if (del != null) { + for (ICLanguageSettingEntry e : entries) { + if (e.getName().equals(del.getName())) { + entries.remove(e); + break; + } } - if (!delete) + } + if (ent != null) entries.add(ent); ls[i].setSettingEntries(getKind(), entries); } @@ -428,14 +448,15 @@ public abstract class AbstractLangsListTab extends AbstractCPropertyTab { ICLanguageSettingEntry old = (ICLanguageSettingEntry)(table.getItem(n).getData()); if (old.isReadOnly()) return; ICLanguageSettingEntry ent = doEdit(old); + toAllLang = false; if (ent != null) { if (isWModifyMode() && (lang instanceof MultiLanguageSetting)) { - performMulti(ent, false); + performMulti(ent, old); } else { - int toModify = incs.indexOf(old); - incs.remove(toModify); - incs.add(toModify, ent); - setSettingEntries(getKind(), incs, false); + ICLanguageSettingEntry[] del = null; + if (! ent.getName().equals(old.getName())) + del = new ICLanguageSettingEntry[] {old}; + changeIt(ent, del); } update(); } @@ -447,15 +468,16 @@ public abstract class AbstractLangsListTab extends AbstractCPropertyTab { if (isWModifyMode() && (lang instanceof MultiLanguageSetting)) { for (int x=ids.length-1; x>=0; x--) { ICLanguageSettingEntry old = (ICLanguageSettingEntry)(table.getItem(ids[x]).getData()); - performMulti(old, true); + performMulti(null, old); } } else { + ICLanguageSettingEntry[] del = new ICLanguageSettingEntry[ids.length]; for (int x=ids.length-1; x>=0; x--) { ICLanguageSettingEntry old = (ICLanguageSettingEntry)(table.getItem(ids[x]).getData()); - if (old.isReadOnly()) continue; - incs.remove(old); +// if (old.isReadOnly()) continue; + del[x] = old; } - setSettingEntries(getKind(), incs, false); + changeIt(null, del); } update(); @@ -497,16 +519,17 @@ public abstract class AbstractLangsListTab extends AbstractCPropertyTab { case 5: // move up case 6: // move down old = (ICLanguageSettingEntry)(table.getItem(n).getData()); - int x = incs.indexOf(old); + int x = shownEntries.indexOf(old); if (x < 0) break; if (i == 6) x++; // "down" simply means "up underlying item" - old = incs.get(x); - ICLanguageSettingEntry old2 = incs.get(x - 1); - incs.remove(x); - incs.remove(x - 1); - incs.add(x - 1, old); - incs.add(x, old2); - setSettingEntries(getKind(), incs, false); + old = shownEntries.get(x); + ICLanguageSettingEntry old2 = shownEntries.get(x - 1); + shownEntries.remove(x); + shownEntries.remove(x - 1); + shownEntries.add(x - 1, old); + shownEntries.add(x, old2); + + setSettingEntries(getKind(), shownEntries, false); update(i == 5 ? -1 : 1); break; default: diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/SymbolTab.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/SymbolTab.java index a1dc0fcede2..ce762559979 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/SymbolTab.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/SymbolTab.java @@ -11,9 +11,7 @@ *******************************************************************************/ package org.eclipse.cdt.ui.newui; -import java.util.ArrayList; import java.util.Collections; -import java.util.Iterator; import org.eclipse.swt.SWT; import org.eclipse.swt.accessibility.AccessibleAdapter; @@ -73,20 +71,15 @@ public class SymbolTab extends AbstractLangsListTab { public void update() { if (lang != null) { int x = table.getSelectionIndex(); - if (x == -1) x = 0; - incs = getIncs(); - ArrayList lst = new ArrayList(); - if (incs != null) { - Iterator it = incs.iterator(); - while (it.hasNext()) { - ICLanguageSettingEntry ent = (ICLanguageSettingEntry)it.next(); - if (!(ent.isBuiltIn() && (!showBIButton.getSelection()))) lst.add(ent); - } - Collections.sort(lst, CDTListComparator.getInstance()); - } - tv.setInput(lst.toArray(new Object[lst.size()])); - if (table.getItemCount() > x) table.select(x); - else if (table.getItemCount() > 0) table.select(0); + if (x == -1) + x = 0; + shownEntries = getIncs(); + Collections.sort(shownEntries, CDTListComparator.getInstance()); + tv.setInput(shownEntries.toArray(new Object[shownEntries.size()])); + if (table.getItemCount() > x) + table.select(x); + else if (table.getItemCount() > 0) + table.select(0); } updateLbs(lb1, lb2); updateButtons();