/******************************************************************************* * Copyright (c) 2007, 2011 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 * James Blackburn (Broadcom Corp.) *******************************************************************************/ package org.eclipse.cdt.managedbuilder.ui.wizards; import java.util.ArrayList; import org.eclipse.cdt.managedbuilder.core.IConfiguration; import org.eclipse.cdt.managedbuilder.core.IProjectType; import org.eclipse.cdt.managedbuilder.core.IToolChain; import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.cdt.managedbuilder.internal.ui.Messages; /** * This class is intended for data exchange between * Configuration page and Handlers. * It may hold configuration in case of managed project * or to be a placeholder in case of make project * * @noextend This class is not intended to be subclassed by clients. * @noinstantiate This class is not intended to be instantiated by clients. */ public class CfgHolder { private static final String DELIMITER = "_with_"; //$NON-NLS-1$ private static final String LBR = " (v "; //$NON-NLS-1$ private static final String RBR = ")"; //$NON-NLS-1$ private String name; private IConfiguration cfg; private IToolChain tc; public CfgHolder(IToolChain _tc, IConfiguration _cfg) { tc = _tc; cfg = _cfg; if (cfg == null) { if (tc == null || tc.getParent() == null) name = Messages.StdProjectTypeHandler_2; else name = tc.getParent().getName(); } else name = cfg.getName(); } /** * @since 8.0 */ public void setConfiguration(IConfiguration cfg) { this.cfg = cfg; } public boolean isSystem() { if (cfg == null) return false; return (cfg.isSystemObject()); } public boolean isSupported() { if (cfg == null) return true; return (cfg.isSupported()); } /** * Checks whether names are unique * * @param its array of CfgHolders * @return boolean if CfgHolder name appears more than once */ public static boolean hasDoubles(CfgHolder[] its) { for (int i=0; i<its.length; i++) { String s = its[i].name; for (int j=0; j<its.length; j++) { if (i == j) continue; if (s.equals(its[j].name)) return true; } } return false; } /** * Creates array of {@link CfgHolder}s based on the passed in * {@link IConfiguration}s * * @param cfgs {@link IConfiguration}s to turn to CfgHolders * @return CfgHolder[] */ public static CfgHolder[] cfgs2items(IConfiguration[] cfgs) { CfgHolder[] its = new CfgHolder[cfgs.length]; for (int i=0; i<cfgs.length; i++) { its[i] = new CfgHolder(cfgs[i].getToolChain(), cfgs[i]); } return its; } /** * Makes configuration's names unique. * Adds either version number or toolchain name. * If it does not help, simply adds index. * * @param its - list of items. * @return the same list with unique names. */ public static CfgHolder[] unique(CfgHolder[] its) { // if names are not unique, add version name if (hasDoubles(its)) { for (int k=0; k<its.length; k++) { if (its[k].tc != null) { String ver = ManagedBuildManager.getVersionFromIdAndVersion(its[k].tc.getId()); if(ver != null) its[k].name = its[k].name + LBR + ver + RBR; } } } // if names are still not unique, add toolchain name if (hasDoubles(its)) { for (int k=0; k<its.length; k++) { String s = its[k].name; int x = s.indexOf(LBR); if (x >= 0) s = s.substring(0, x); IToolChain tc = its[k].tc; if (tc == null && its[k].cfg != null) tc = its[k].cfg.getToolChain(); if (tc != null) its[k].name = s + DELIMITER + tc.getUniqueRealName(); } } // if names are still not unique, add index if (hasDoubles(its)) { for (int k=0; k<its.length; k++) { its[k].name = its[k].name + k; } } return its; } /** * Returns corresponding project type * obtained either from configuration * (if any) or from toolchain. * * @return projectType */ public IProjectType getProjectType() { if (cfg != null) return cfg.getProjectType(); if (tc != null && tc.getParent() != null) return tc.getParent().getProjectType(); return null; } /** * Reorders selected configurations in "physical" order. * Although toolchains are displayed in alphabetical * order in Wizard, it's required to create corresponding * configurations in the same order as they are listed * in xml file, inside of single project type. * * @param its - items in initial order. * @return - items in "physical" order. */ public static CfgHolder[] reorder(CfgHolder[] its) { ArrayList<CfgHolder> ls = new ArrayList<CfgHolder>(its.length); boolean found = true; while (found) { found = false; for (int i=0; i<its.length; i++) { if (its[i] == null) continue; found = true; IProjectType pt = its[i].getProjectType(); if (pt == null) { ls.add(its[i]); its[i] = null; continue; } IConfiguration[] cfs = pt.getConfigurations(); for (int j=0; j<cfs.length; j++) { for (int k=0; k<its.length; k++) { if (its[k] == null) continue; if (cfs[j].equals(its[k].getTcCfg())) { ls.add(its[k]); its[k] = null; } } } } } return ls.toArray(new CfgHolder[ls.size()]); } /* * Note that null configurations are ignored ! */ public static IConfiguration[] items2cfgs(CfgHolder[] its) { ArrayList<IConfiguration> lst = new ArrayList<IConfiguration>(its.length); for (CfgHolder h : its) if (h.cfg != null) lst.add(h.cfg); return lst.toArray(new IConfiguration[lst.size()]); } public IConfiguration getTcCfg() { if (tc != null) return tc.getParent(); return null; } /** * @return the IConfiguration stored in this holder. * @since 8.0 */ public IConfiguration getConfiguration() { return cfg; } public String getName() { return name; } /** * @return the IToolchain stored in this holder * @since 8.0 */ public IToolChain getToolChain() { return tc; } }