/*******************************************************************************
* 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
* QNX Software Systems - [272416] Rework the working set configurations
*******************************************************************************/
package org.eclipse.cdt.ui.newui;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.TreeSet;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.ui.newui.Messages;
import org.eclipse.cdt.internal.ui.workingsets.WorkingSetConfigurationManager;
/**
* @noextend This class is not intended to be subclassed by clients.
* @noinstantiate This class is not intended to be instantiated by clients.
*/
public class CDTPrefUtil {
// boolean keys (KEY_NO-s are to be inverted !)
public static final String KEY_NOSUPP = "wizard.show.unsupported.disable"; //$NON-NLS-1$
public static final String KEY_OTHERS = "wizard.group.others.enable"; //$NON-NLS-1$
public static final String KEY_NOMNG = "properties.manage.config.disable"; //$NON-NLS-1$
public static final String KEY_DTREE = "properties.data.hierarchy.enable"; //$NON-NLS-1$
public static final String KEY_NOTOOLM = "properties.toolchain.modification.disable"; //$NON-NLS-1$
public static final String KEY_EXPORT = "properties.export.page.enable"; //$NON-NLS-1$
/** @since 5.2 Show the "Include Files" settings entry tab */
public static final String KEY_SHOW_INC_FILES = "properties.includefiles.page.enable"; //$NON-NLS-1$
/** @since 5.2 */
public static final String KEY_TIPBOX = "properties.option.tipbox.enable"; //$NON-NLS-1$
// string keys
public static final String KEY_PREFTC = "wizard.preferred.toolchains"; //$NON-NLS-1$
public static final String KEY_CONFSET = "workingsets.selected.configs"; //$NON-NLS-1$
// integer keys
public static final String KEY_POSSAVE = "properties.save.position"; //$NON-NLS-1$
public static final int POSITION_SAVE_SIZE = 0;
public static final int POSITION_SAVE_NONE = 2;
public static final int POSITION_SAVE_BOTH = 3;
public static final String KEY_DISC_NAMES = "properties.discovery.naming"; //$NON-NLS-1$
public static final int DISC_NAMING_UNIQUE_OR_BOTH = 0;
public static final int DISC_NAMING_UNIQUE_OR_IDS = 1;
public static final int DISC_NAMING_ALWAYS_BOTH = 2;
public static final int DISC_NAMING_ALWAYS_IDS = 3;
public static final int DISC_NAMING_DEFAULT = DISC_NAMING_UNIQUE_OR_BOTH;
/** Property key used for string list display mode for multi-configuration edits (conjunction/disjunction) */
public static final String KEY_DMODE = "properties.multi.displ.mode"; //$NON-NLS-1$
/** Conjunction implies showing only common elements (intersection) */
public static final int DMODE_CONJUNCTION = 1;
/** Disjunction implies showing all elements (union) */
public static final int DMODE_DISJUNCTION = 2;
/** Property key used for string list write mode for multi-configuration edits (modify/replace) */
public static final String KEY_WMODE = "properties.multi.write.mode"; //$NON-NLS-1$
/** Modify implies changing only given elements and not changing any others */
public static final int WMODE_MODIFY = 4;
/** Replace implies replacing the whole list with the given one, overwriting old entries */
public static final int WMODE_REPLACE = 8;
public static final String NULL = "NULL"; //$NON-NLS-1$
private static final IPreferenceStore pref = CUIPlugin.getDefault().getPreferenceStore();
private static final String DELIMITER = " "; //$NON-NLS-1$
public static final String CONFSETDEL = "\f"; //$NON-NLS-1$
private static LinkedList<String> preferredTCs = null;
public static final Object[] EMPTY_ARRAY = new Object[0];
// low-level methods
public static boolean getBool(String key) { return pref.getBoolean(key); }
public static void setBool(String key, boolean val) { pref.setValue(key, val); }
public static int getInt(String key) { return pref.getInt(key); }
public static void setInt(String key, int val) { pref.setValue(key, val); }
public static String getStr(String key) { return pref.getString(key); }
public static void setStr(String key, String val) { pref.setValue(key, val); }
// up-level methods
public static void readPreferredTCs() {
preferredTCs = new LinkedList<String>(Arrays.asList(getStr(KEY_PREFTC).split(DELIMITER)));
}
public static List<String> getPreferredTCs() {
if (preferredTCs == null) readPreferredTCs();
return preferredTCs;
}
public static void delPreferredTC(String s) {
if (preferredTCs == null) readPreferredTCs();
preferredTCs.remove(s);
}
public static void addPreferredTC(String s) {
if (preferredTCs == null) readPreferredTCs();
if (!preferredTCs.contains(s)) preferredTCs.add(s);
}
public static void cleanPreferredTCs() {
setStr(KEY_PREFTC, IPreferenceStore.STRING_DEFAULT_DEFAULT);
readPreferredTCs();
}
public static void savePreferredTCs() {
if (preferredTCs == null) return;
Iterator<String> it = preferredTCs.iterator();
StringBuilder b = new StringBuilder();
while (it.hasNext()) {
String s = it.next();
if (s == null) continue;
b.append(s);
b.append(DELIMITER);
}
setStr(KEY_PREFTC, b.toString().trim());
}
/**
* Returns string list display mode for multi-configuration edits (conjunction/disjunction).
*
* @return the mode which can be either {@link CDTPrefUtil#DMODE_CONJUNCTION} (default value)
* or else {@link CDTPrefUtil#DMODE_DISJUNCTION}.
*
* @since 5.3
*/
public static int getMultiCfgStringListDisplayMode() {
int mode = getInt(KEY_DMODE);
if (mode!=DMODE_CONJUNCTION && mode!=DMODE_DISJUNCTION) {
mode = DMODE_CONJUNCTION;
}
return mode;
}
/**
* Sets string list display mode for multi-configuration edits (conjunction/disjunction).
*
* @param mode must be either {@link CDTPrefUtil#DMODE_CONJUNCTION}
* or {@link CDTPrefUtil#DMODE_DISJUNCTION}.
*
* @since 5.3
*/
public static void setMultiCfgStringListDisplayMode(int mode) {
setInt(KEY_DMODE, mode);
}
/**
* Returns string list write mode for multi-configuration edits (modify/replace).
*
* @return the mode which can be either {@link CDTPrefUtil#WMODE_MODIFY} (default value)
* or else {@link CDTPrefUtil#WMODE_REPLACE}.
*
* @since 5.3
*/
public static int getMultiCfgStringListWriteMode() {
int mode = getInt(KEY_WMODE);
if (mode!=WMODE_MODIFY && mode!=WMODE_REPLACE) {
mode = WMODE_MODIFY;
}
return mode;
}
/**
* Sets string list write mode for multi-configuration edits (modify/replace).
*
* @param mode must be either {@link CDTPrefUtil#WMODE_MODIFY}
* or {@link CDTPrefUtil#WMODE_REPLACE}.
*
* @since 5.3
*/
public static void setMultiCfgStringListWriteMode(int mode) {
setInt(KEY_WMODE, mode);
}
/**
* @deprecated as of CDT 8.0. Use {@link StringListModeControl} to display string list modes.
*/
@Deprecated
public static String getDMode() {
String s = null;
switch(getMultiCfgStringListDisplayMode()) {
case DMODE_CONJUNCTION:
s = Messages.EnvironmentTab_17;
break;
case DMODE_DISJUNCTION:
s = Messages.EnvironmentTab_18;
break;
}
return Messages.EnvironmentTab_19 + s;
}
/**
* @deprecated as of CDT 8.0. Use {@link StringListModeControl} to display string list modes.
*/
@Deprecated
public static String getWMode() {
String s = null;
switch(getMultiCfgStringListWriteMode()) {
case WMODE_MODIFY:
s = Messages.EnvironmentTab_24;
break;
case WMODE_REPLACE:
s = Messages.EnvironmentTab_21;
break;
}
return Messages.EnvironmentTab_22 + s;
}
/**
* Toggle string list display mode: conjunction <-> disjunction.
*/
public static void spinDMode() {
int mode = getMultiCfgStringListDisplayMode();
if (mode==DMODE_CONJUNCTION) {
mode = DMODE_DISJUNCTION;
} else {
mode = DMODE_CONJUNCTION;
}
setMultiCfgStringListDisplayMode(mode);
}
/**
* Toggle string list display mode: modify <-> replace.
*/
public static void spinWMode() {
int mode = getMultiCfgStringListWriteMode();
if (mode==WMODE_MODIFY) {
mode = WMODE_REPLACE;
} else {
mode = WMODE_MODIFY;
}
setMultiCfgStringListWriteMode(mode);
}
public static final String[] getStrListForDisplay(String[][] input) {
return getStrListForDisplay(input, getMultiCfgStringListDisplayMode());
}
private static final String[] getStrListForDisplay(String[][] input, int mode) {
Object[] ob = getListForDisplay(input, getMultiCfgStringListDisplayMode(), null);
String[] ss = new String[ob.length];
System.arraycopy(ob, 0, ss, 0, ob.length);
return ss;
}
public static final Object[] getListForDisplay(Object[][] input, Comparator<Object> cmp) {
return getListForDisplay(input, getMultiCfgStringListDisplayMode(), cmp);
}
/**
* Utility method forms string list
* according to current list display mode
*
* @param input - array of string arrays
* @return
*/
private static final Object[] getListForDisplay(Object[][] input, int mode, Comparator<Object> cmp) {
if (input == null || input.length == 0)
return EMPTY_ARRAY;
if (input.length == 1) {
return (input[0] == null) ?
EMPTY_ARRAY :
input[0];
}
Object[] s1 = input[0];
if (s1 == null ||
s1.length == 0)
return EMPTY_ARRAY;
if (getMultiCfgStringListDisplayMode() == DMODE_CONJUNCTION)
{
ArrayList<Object> lst = new ArrayList<Object>();
for (int i=0; i<s1.length; i++) {
if (s1[i] == null)
continue;
boolean found = true;
for (int k = 1; k<input.length; k++) {
Object[] s2 = input[k];
if (s2 == null || s2.length == 0)
return EMPTY_ARRAY;
if (i == 0)
Arrays.sort(s2, cmp);
if (Arrays.binarySearch(s2, s1[i], cmp) < 0) {
found = false;
break;
}
}
if (found) {
lst.add(s1[i]);
}
}
return lst.toArray();
}
TreeSet<Object> lst = new TreeSet<Object>(cmp); // set, to avoid doubles
for (Object[] element : input) {
if (element == null ||
element.length == 0)
continue;
for (Object element2 : element)
lst.add(element2);
}
s1 = lst.toArray();
Arrays.sort(s1, cmp);
return s1;
}
/**
* @deprecated Use the {@link WorkingSetConfigurationManager} class, instead.
*/
@Deprecated
public static List<String> readConfigSets() {
return new LinkedList<String>(Arrays.asList(getStr(KEY_CONFSET).split(CONFSETDEL)));
}
/**
* @deprecated Use the {@link WorkingSetConfigurationManager} class, instead.
*/
@Deprecated
public static void saveConfigSets(List<String> out) {
StringBuilder b = new StringBuilder();
for (String s : out) {
if (s == null) continue;
b.append(s);
b.append(CONFSETDEL);
}
setStr(KEY_CONFSET, b.toString());
}
}