Java tutorial
/******************************************************************************* * Copyright (c) 2005, 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 *******************************************************************************/ package org.eclipse.cdt.managedbuilder.ui.properties; import java.util.Collection; import org.eclipse.cdt.core.settings.model.ICResourceDescription; import org.eclipse.cdt.core.settings.model.ICSettingBase; import org.eclipse.cdt.managedbuilder.core.BuildException; import org.eclipse.cdt.managedbuilder.core.IConfiguration; import org.eclipse.cdt.managedbuilder.core.IHoldsOptions; import org.eclipse.cdt.managedbuilder.core.IManagedCommandLineGenerator; import org.eclipse.cdt.managedbuilder.core.IManagedCommandLineInfo; import org.eclipse.cdt.managedbuilder.core.IOption; import org.eclipse.cdt.managedbuilder.core.IOptionCategory; import org.eclipse.cdt.managedbuilder.core.IResourceInfo; import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.cdt.managedbuilder.internal.core.Option; import org.eclipse.cdt.managedbuilder.internal.core.Tool; import org.eclipse.cdt.managedbuilder.internal.macros.BuildMacroProvider; import org.eclipse.cdt.managedbuilder.internal.macros.BuildfileMacroSubstitutor; import org.eclipse.cdt.utils.cdtvariables.SupplierBasedCdtVariableSubstitutor; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.ListenerList; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; /** * @noextend This class is not intended to be subclassed by clients. * @noinstantiate This class is not intended to be instantiated by clients. */ public class ToolSettingsPrefStore implements IPreferenceStore { public static final String DEFAULT_SEPERATOR = ";"; //$NON-NLS-1$ private final static String EMPTY_STRING = new String(); static ToolSettingsPrefStore store = null; public final static String ALL_OPTIONS_ID = EMPTY_STRING; public final static String COMMAND_LINE_SUFFIX = "org.eclipse.commandLinePatternId"; //$NON-NLS-1$ private IResourceInfo rcInfo = null; private IOptionCategory optCategory; private ToolListElement selectedElement; private ListenerList listenerList; private boolean dirtyFlag; public static ToolSettingsPrefStore getDefault() { if (store == null) store = new ToolSettingsPrefStore(); return store; } public void setSelection(ICResourceDescription rd, ToolListElement element, IOptionCategory category) { selectedElement = element; optCategory = category; rcInfo = get(rd); } public IConfiguration getSelectedConfig() { return rcInfo.getParent(); } public String getOptionId(IOption option) { IOption extOption = getExtensionOption(option); if (extOption != null) return extOption.getId(); return option.getId(); } private static IOption getExtensionOption(IOption option) { for (; option != null && (!option.isExtensionElement() || ((Option) option).isAdjustedExtension() || ((Option) option).wasOptRef()); option = option.getSuperClass()) { } return option; } @Override public void addPropertyChangeListener(IPropertyChangeListener listener) { listenerList.add(listener); } @Override public boolean contains(String name) { if (optCategory instanceof Tool) { if (optCategory.getId().equals(name)) return true; else if ((optCategory.getId() + COMMAND_LINE_SUFFIX).equals(name)) return true; else if (ALL_OPTIONS_ID.equals(name)) return true; } else if (getOptionValue(name) != null) { return true; } return false; } @Override public void firePropertyChangeEvent(String name, Object oldValue, Object newValue) { Object[] listeners = listenerList.getListeners(); if (listeners.length > 0 && (oldValue == null || !oldValue.equals(newValue))) { PropertyChangeEvent pe = new PropertyChangeEvent(this, name, oldValue, newValue); for (int i = 0; i < listeners.length; ++i) { IPropertyChangeListener l = (IPropertyChangeListener) listeners[i]; l.propertyChange(pe); } } } @Override public boolean getBoolean(String name) { Object val = getOptionValue(name); if (val instanceof Boolean) return ((Boolean) val).booleanValue(); return getDefaultBoolean(name); } @Override public boolean getDefaultBoolean(String name) { return false; } @Override public double getDefaultDouble(String name) { return 0; } @Override public float getDefaultFloat(String name) { return 0; } @Override public int getDefaultInt(String name) { return 0; } @Override public long getDefaultLong(String name) { return 0; } @Override public String getDefaultString(String name) { return EMPTY_STRING; } @Override public double getDouble(String name) { return getDefaultDouble(name); } @Override public float getFloat(String name) { return getDefaultFloat(name); } @Override public int getInt(String name) { return getDefaultInt(name); } @Override public long getLong(String name) { return getDefaultLong(name); } @Override @SuppressWarnings("unchecked") public String getString(String name) { if (optCategory instanceof Tool) { if (optCategory.getId().equals(name)) return ((Tool) optCategory).getToolCommand(); else if ((optCategory.getId() + COMMAND_LINE_SUFFIX).equals(name)) return ((Tool) optCategory).getCommandLinePattern(); else if (ALL_OPTIONS_ID.equals(name)) { SupplierBasedCdtVariableSubstitutor macroSubstitutor = new BuildfileMacroSubstitutor(null, EMPTY_STRING, " "); //$NON-NLS-1$ Tool tool = (Tool) optCategory; String[] flags = tool.getToolCommandFlags(null, null, macroSubstitutor, obtainMacroProvider()); IManagedCommandLineGenerator cmdLGen = tool.getCommandLineGenerator(); IManagedCommandLineInfo cmdLInfo = cmdLGen.generateCommandLineInfo(tool, EMPTY_STRING, flags, EMPTY_STRING, EMPTY_STRING, EMPTY_STRING, null, tool.getCommandLinePattern()); return cmdLInfo.getFlags(); } } else { Object val = getOptionValue(name); if (val instanceof String) return (String) val; else if (val instanceof Collection) return listToString((String[]) ((Collection) val).toArray(new String[0])); } return getDefaultString(name); } public BuildMacroProvider obtainMacroProvider() { return (BuildMacroProvider) ManagedBuildManager.getBuildMacroProvider(); } public static String listToString(String[] items) { return listToString(items, DEFAULT_SEPERATOR); } protected Object getOptionValue(String name) { Object option[] = getOption(name); if (option != null) { try { IOption opt = (IOption) option[1]; Object val = opt.getValue(); if ((opt.getValueType() == IOption.ENUMERATED || opt.getValueType() == IOption.TREE) && val instanceof String) val = opt.getName((String) val); return val; } catch (BuildException e) { } } return null; } public Object[] getOption(String id) { if (selectedElement == null) return null; IHoldsOptions selectedHolder = selectedElement.getHoldOptions(); if (selectedHolder == null) selectedHolder = selectedElement.getTool(); Object options[][] = optCategory.getOptions(rcInfo, selectedHolder); if (options == null) return null; for (int i = 0; i < options.length; i++) { IHoldsOptions ho = (IHoldsOptions) options[i][0]; if (ho == null) break; IOption option = (IOption) options[i][1]; if ((option.getId().equals(id)) || ((!option.isExtensionElement() || ((Option) option).isAdjustedExtension() || ((Option) option).wasOptRef()) && option.getSuperClass() != null && option.getSuperClass().getId().equals(id))) return options[i]; } return null; } @Override public boolean isDefault(String name) { return false; } @Override public boolean needsSaving() { return dirtyFlag; } @Override public void putValue(String name, String value) { setValue(name, value); } @Override public void removePropertyChangeListener(IPropertyChangeListener listener) { listenerList.remove(listener); } @Override public void setDefault(String name, double value) { } @Override public void setDefault(String name, float value) { } @Override public void setDefault(String name, int value) { } @Override public void setDefault(String name, long value) { } @Override public void setDefault(String name, String defaultObject) { } @Override public void setDefault(String name, boolean value) { } @Override public void setToDefault(String name) { } protected void setDirty(boolean isDirty) { dirtyFlag = isDirty; } @Override public void setValue(String name, double value) { } @Override public void setValue(String name, float value) { } @Override public void setValue(String name, int value) { } @Override public void setValue(String name, long value) { } @Override public void setValue(String name, String value) { if (optCategory instanceof Tool) { if (optCategory.getId().equals(name)) ((Tool) optCategory).setToolCommand(value); else if ((optCategory.getId() + COMMAND_LINE_SUFFIX).equals(name)) ((Tool) optCategory).setCommandLinePattern(value); } else setOptionValue(name, value); } @Override public void setValue(String name, boolean value) { setOptionValue(name, new Boolean(value)); } protected void setOptionValue(String name, Object value) { Object opt[] = getOption(name); if (opt != null) { IOption option = (IOption) opt[1]; IHoldsOptions holder = (IHoldsOptions) opt[0]; IOption newOption = null; try { switch (option.getValueType()) { case IOption.STRING: if (value instanceof String) { newOption = rcInfo.setOption(holder, option, (String) value); } break; case IOption.BOOLEAN: if (value instanceof Boolean) { boolean val = ((Boolean) value).booleanValue(); newOption = rcInfo.setOption(holder, option, val); } break; case IOption.ENUMERATED: case IOption.TREE: if (value instanceof String) { String val = (String) value; String enumId = option.getId(val); newOption = rcInfo.setOption(holder, option, (enumId != null && enumId.length() > 0) ? enumId : val); } break; case IOption.INCLUDE_PATH: case IOption.STRING_LIST: case IOption.PREPROCESSOR_SYMBOLS: case IOption.LIBRARIES: case IOption.OBJECTS: case IOption.INCLUDE_FILES: case IOption.LIBRARY_PATHS: case IOption.LIBRARY_FILES: case IOption.MACRO_FILES: case IOption.UNDEF_INCLUDE_PATH: case IOption.UNDEF_PREPROCESSOR_SYMBOLS: case IOption.UNDEF_INCLUDE_FILES: case IOption.UNDEF_LIBRARY_PATHS: case IOption.UNDEF_LIBRARY_FILES: case IOption.UNDEF_MACRO_FILES: if (value instanceof String) { String val[] = parseString((String) value); newOption = rcInfo.setOption(holder, option, val); } break; default: break; } if (newOption != option) { //TODO: ??? } } catch (BuildException e) { } } } public static String[] parseString(String stringList) { if (stringList == null || stringList.length() == 0) { return new String[0]; } else { return stringList.split(DEFAULT_SEPERATOR); } } public static String listToString(String items[], String separator) { StringBuffer path = new StringBuffer(""); //$NON-NLS-1$ for (int i = 0; i < items.length; i++) { path.append(items[i]); if (i < (items.length - 1)) { path.append(separator); } } return path.toString(); } private IResourceInfo get(ICResourceDescription cfgd) { IConfiguration cfg = ManagedBuildManager.getConfigurationForDescription(cfgd.getConfiguration()); if (cfgd.getType() == ICSettingBase.SETTING_PROJECT || cfgd.getType() == ICSettingBase.SETTING_CONFIGURATION) return cfg.getRootFolderInfo(); IPath p = cfgd.getPath(); IResourceInfo ri = cfg.getResourceInfo(p, true); if (ri != null && p.equals(ri.getPath())) { return ri; } if (cfgd.getType() == ICSettingBase.SETTING_FILE) { ri = cfg.createFileInfo(p); } else if (cfgd.getType() == ICSettingBase.SETTING_FOLDER) { ri = cfg.createFolderInfo(p); } return ri; } }