/******************************************************************************* * Copyright (c) 2007, 2012 IBM 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.managedbuilder.xlc.ui; import org.eclipse.cdt.core.cdtvariables.ICdtVariable; import org.eclipse.cdt.managedbuilder.core.IManagedProject; import org.eclipse.cdt.managedbuilder.internal.macros.BuildMacro; import org.eclipse.cdt.managedbuilder.macros.IBuildMacro; import org.eclipse.cdt.managedbuilder.macros.IBuildMacroProvider; import org.eclipse.cdt.managedbuilder.macros.IProjectBuildMacroSupplier; import org.eclipse.cdt.managedbuilder.xlc.ui.preferences.PreferenceConstants; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.QualifiedName; import org.eclipse.jface.preference.IPreferenceStore; /** * @author crecoskie * */ public class XLCProjectMacroSupplier implements IProjectBuildMacroSupplier { /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.macros.IProjectBuildMacroSupplier#getMacro(java.lang.String, org.eclipse.cdt.managedbuilder.core.IManagedProject, org.eclipse.cdt.managedbuilder.macros.IBuildMacroProvider) */ @Override public IBuildMacro getMacro(String macroName, IManagedProject project, IBuildMacroProvider provider) { if(macroName.equals(PreferenceConstants.P_XL_COMPILER_ROOT)) { String compilerPath = null; // figure out compiler path from properties and preferences // search for property first IProject theProject = (IProject) project.getOwner(); try { compilerPath = theProject.getPersistentProperty(new QualifiedName("", PreferenceConstants.P_XL_COMPILER_ROOT)); } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(compilerPath == null) { // use the workbench preference IPreferenceStore prefStore = XLCUIPlugin.getDefault().getPreferenceStore(); compilerPath = prefStore.getString(PreferenceConstants.P_XL_COMPILER_ROOT); } BuildMacro macro = new BuildMacro(macroName, ICdtVariable.VALUE_PATH_DIR, compilerPath); return macro; } else return provider.getMacro(macroName, IBuildMacroProvider.CONTEXT_PROJECT, project, true); } /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.macros.IProjectBuildMacroSupplier#getMacros(org.eclipse.cdt.managedbuilder.core.IManagedProject, org.eclipse.cdt.managedbuilder.macros.IBuildMacroProvider) */ @Override public IBuildMacro[] getMacros(IManagedProject project, IBuildMacroProvider provider) { String macroName = PreferenceConstants.P_XL_COMPILER_ROOT; String compilerPath = null; // figure out compiler path from properties and preferences // search for property first IProject theProject = (IProject) project.getOwner(); try { compilerPath = theProject.getPersistentProperty(new QualifiedName("", PreferenceConstants.P_XL_COMPILER_ROOT)); } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(compilerPath == null) { // use the workbench preference IPreferenceStore prefStore = XLCUIPlugin.getDefault().getPreferenceStore(); compilerPath = prefStore.getString(PreferenceConstants.P_XL_COMPILER_ROOT); } BuildMacro macro = new BuildMacro(macroName, ICdtVariable.VALUE_PATH_DIR, compilerPath); // our array consists of our macro, plus all the macros from our parent IBuildMacro[] parentMacros = provider.getMacros(IBuildMacroProvider.CONTEXT_PROJECT, project, true); // look for an existing macro definition int foundIndex = -1; for(int k = 0; k < parentMacros.length; k++) { if(parentMacros[k].getName().equals(macro.getName())) { foundIndex = k; break; } } int numMacros = (foundIndex == -1) ? parentMacros.length + 1 : parentMacros.length; IBuildMacro[] macros = new IBuildMacro[numMacros]; // if there was no existing value then add it to the front if(foundIndex == -1) { macros[0] = macro; for(int k = 1; k < macros.length; k++) { macros[k] = parentMacros[k-1]; } } else { // replace the old value for(int k = 0; k < macros.length; k++) { macros[k] = parentMacros[k]; } macros[foundIndex] = macro; } return macros; } }