core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/sdk/ui/shared/BuildTargetTreeNode.java
author timkelly
Tue, 31 Aug 2010 17:03:48 -0500
changeset 1931 d7c1f804f316
parent 1820 5c955fcfdc3d
child 1974 71a660e8393e
permissions -rw-r--r--
using IRunnableContext for retrieving BuildTargetTreeNode input so progress dialog can be displayed for wizards or in the status bar when on the UI thread (e.g. ManageConfigurationsDialog) Removes API in BuildTargetTreeNode that presumed all nodes were SBSv1 (didn't appear to be used anywhere)

/*
* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/


package com.nokia.carbide.cpp.sdk.ui.shared;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.TreeNode;

import com.nokia.carbide.cpp.internal.api.sdk.ISBSv2BuildContext;
import com.nokia.carbide.cpp.internal.api.sdk.SBSv2Utils;
import com.nokia.carbide.cpp.sdk.core.ISDKManager;
import com.nokia.carbide.cpp.sdk.core.ISymbianBuildContext;
import com.nokia.carbide.cpp.sdk.core.ISymbianBuilderID;
import com.nokia.carbide.cpp.sdk.core.ISymbianSDK;
import com.nokia.carbide.cpp.sdk.core.SDKCorePlugin;

/**
 * A tree node representing a Symbian OS SDK.  This node's children will be the
 * list of available build configurations.
 */
@SuppressWarnings("restriction")
public class BuildTargetTreeNode extends TreeNode {

	public static final String SDK_NODE_ERROR_EPOCROOT_INVALID = " SDK location does not exist! Check Symbian SDKs!"; //$NON-NLS

	/**
	 * Constructs a new tree node for the given SDK
	 * @param value the SDK to create the tree node for
	 */
	public BuildTargetTreeNode(ISymbianSDK value) {
		this(value, false);
	}

	/**
	 * Constructs a new tree node for the given SDK
	 * @param value the SDK to create the tree node for
	 * @since 1.4
	 */
	public BuildTargetTreeNode(ISymbianSDK value, boolean sbsv2Project) {
		super(value);
		
		List<ISymbianBuildContext> configurations = sbsv2Project ? 
				value.getBuildInfo(ISymbianBuilderID.SBSV2_BUILDER).getFilteredBuildConfigurations() : 
				value.getBuildInfo(ISymbianBuilderID.SBSV1_BUILDER).getFilteredBuildConfigurations();
				
		if (configurations == null){
			return;
		}
		TreeNode[] children = new TreeNode[configurations.size()];
		int index = 0;
		for (ISymbianBuildContext config : configurations) {
			children[index++] = new TreeNode(config) {
				@Override
				public String toString() {
					ISymbianBuildContext context = (ISymbianBuildContext)getValue();
					String sdkId = context.getSDK().getUniqueId();
					String newDisplayString = stripSDKIDFromConfigName(context.getDisplayString(), sdkId);
					if (context instanceof ISBSv2BuildContext){
						ISBSv2BuildContext v2Context = (ISBSv2BuildContext)context;
						if (v2Context.getConfigQueryData().getConfigurationErrorMessage() != null && 
							v2Context.getConfigQueryData().getConfigurationErrorMessage().length() > 0){
							newDisplayString += " ERROR: " + v2Context.getConfigQueryData().getConfigurationErrorMessage();
						}
					} 
					return newDisplayString;
				}
			};
		}
		setChildren(children);
	}

	/**
	 * Returns the unique id the SDK associated with this node
	 */
	public String toString() {
		ISymbianSDK value = (ISymbianSDK) getValue();
		File f = new File(value.getEPOCROOT());
		if (!f.exists()){
			return value.getUniqueId() + " (" + f.getAbsolutePath() + ") " + SDK_NODE_ERROR_EPOCROOT_INVALID;
		}
		return value.getUniqueId();
	}
	
	/**
	 * Get the SDK for this node
	 * @return the ISymbianSDK object for this tree node
	 */
	public ISymbianSDK getSymbianSDK() {
		return (ISymbianSDK) getValue();
	}
	
	/**
	 * Gets the list of SDK tree nodes for use in a tree viewer.  The SDK's are gathered
	 * from the SDK preferences page.  Only enabled SDK's are used.  Each SDK node will
	 * have build configurations for children appropriate for the SDK.  These configurations
	 * are filtered based on the platform filtering preference panel.
	 * @param sbsv2Project true if this is an SBSv2 project which affects how the build
	 * configuration list is calculated
	 * @param IRunnableContext - a runnable context for which to update a progress monitor. Cannot be null.
	 * @return array of BuildTargetTreeNode, or null
	 * @since 1.4
	 */
	public static BuildTargetTreeNode[] getTreeViewerInput(final boolean sbsv2Project, IRunnableContext runnableContext) {
		
		final List<BuildTargetTreeNode> assembledInput = new ArrayList<BuildTargetTreeNode>();
		
		try {
			runnableContext.run(true, false, new IRunnableWithProgress(){

				public void run(IProgressMonitor monitor)
						throws InvocationTargetException, InterruptedException {
					
					String msgPrefix = "Building SDK/Configuration Model: "; //$NON-NLS-N$
					
					ISDKManager sdkMgr = SDKCorePlugin.getSDKManager();
					List<ISymbianSDK> sdkList = sdkMgr.getSDKList();
					monitor.beginTask(msgPrefix, sdkList.size() + 2);
					if (sdkList == null)
						return;
					
					monitor.worked(1);
					List<ISymbianSDK> sdkListCopy = new ArrayList<ISymbianSDK>();
					// Only add SDKs that are enabled
					for (ISymbianSDK currSDK : sdkList) {
						if (currSDK.isEnabled()) {
							sdkListCopy.add(currSDK);
						}
					}

					if (sbsv2Project) {
						// filter non-SBSv2 supported SDK's
						sdkListCopy = SBSv2Utils.getSupportedSDKs(sdkListCopy);
					}

					BuildTargetTreeNode[] input = new BuildTargetTreeNode[sdkListCopy
							.size()];
					int index = 0;
					monitor.worked(1);
					for (ISymbianSDK sdk : sdkListCopy) {
						monitor.worked(1);
						monitor.setTaskName(msgPrefix + sdk.getUniqueId());
						BuildTargetTreeNode treeNode = new BuildTargetTreeNode(
								sdk, sbsv2Project);
						if (treeNode.getChildren() != null || sbsv2Project) {
							input[index++] = treeNode;
						}
					}

					// Filter out any SDKs that don't have configs
					monitor.worked(1);
					for (BuildTargetTreeNode currNode : input) {
						if (currNode != null) {
							assembledInput.add(currNode);
						}
					}
					monitor.done();
				}
			
			
			});
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		if (assembledInput.size() == 0){
			return null;
		}

		return assembledInput.toArray(new BuildTargetTreeNode[assembledInput.size()]);
	}
	
	private static String stripSDKIDFromConfigName(String configName, String sdkID){
		return configName.replace("[" + sdkID + "]", "");
	}


}