srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/BuildTargetEntryInfo.java
changeset 0 a02c979e8dfd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/BuildTargetEntryInfo.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,275 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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.s60tools.appdep.ui.wizards;
+
+import org.eclipse.swt.SWTException;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.IBuildType;
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.appdep.core.data.CacheIndex;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.wizards.BuildTargetEntry.BuildTargetStatusEnum;
+import com.nokia.s60tools.sdk.SdkInformation;
+
+/**
+ * This build target info object can be bound with UI object
+ * presenting build target related info, but this class binds
+ * <code>BuildTargetEntry</code> class into concrete world
+ * and provides information for it about the real build target.
+ * @see BuildTargetEntry
+ */
+public class BuildTargetEntryInfo implements ICacheIndexCreatorObserver {
+	
+	//
+	// Public constants
+	//
+	/**
+	 * Constant for unresolved component count.
+	 */
+	public static final int UNRESOLVED_COMPONENT_COUNT = -1;
+		
+	//
+	// Constants and members
+	//
+		
+	/**
+	 * Target type of the available build target e.g. armv5 Release.
+	 */
+	private ITargetPlatform targetPlatform;
+	
+	/**
+	 * Target's build type (urel/udeb).
+	 */
+	private IBuildType buildType;
+	
+	/**
+	 * Build target status. Initially unresolved.
+	 */
+	private BuildTargetStatusEnum status = BuildTargetStatusEnum.EUnresolved;
+
+	/**
+	 * Amount of components found from the target. 
+	 */
+	private int componentCount = UNRESOLVED_COMPONENT_COUNT;
+
+	/**
+	 * SDK information object the target belongs to.
+	 */
+	private final SdkInformation sdkInfo;
+	
+	/**
+	 * Currently used settings.
+	 */
+	private final AppDepSettings settings;
+
+	/**
+	 * Interface to notify about need to refresh UI.
+	 * Used to notify component count finishing for the target.
+	 */
+	private final IRefreshable notifyUIRefreshIf;
+
+	/**
+	 * Constructor.
+	 * @param settings Currently active settings. 
+	 * @param notifyUIRefreshIf Interface to notify about need to refresh UI. Used to notify component count finishing for the target.
+	 * @param sdkInfo SDK information object the target belongs to.
+	 * @param targetType target type of the available build target e.g. armv5 Release 
+	 * @param buildType target's build type (urel/udeb).
+	 * @param isSuppported set to <code>true</code> if target type is supported, otherwise <code>false</code>.
+	 */
+	public BuildTargetEntryInfo(IRefreshable notifyUIRefreshIf, AppDepSettings settings, SdkInformation sdkInfo, ITargetPlatform targetType, IBuildType buildType, boolean isSuppported){
+		validateArguments(notifyUIRefreshIf, settings, sdkInfo, targetType, buildType);
+		this.notifyUIRefreshIf = notifyUIRefreshIf;
+		this.settings = settings;
+		this.sdkInfo = sdkInfo;
+		this.targetPlatform = targetType;
+		this.buildType = buildType;
+		if(!isSuppported){
+			// In case target is not supported => no need to resolve any other information further
+			this.status = BuildTargetStatusEnum.ENotSupported;
+		}
+	}
+
+	/**
+	 * Validates that entry fields passed have some values.
+	 * @param notifyUIRefreshIf Interface to notify about need to refresh UI. Used to notify component count finishing for the target.
+	 * @param settings Currently active settings. 
+	 * @param sdkInfo SDK information object the target belongs to.
+	 * @param targetType target type of the available build target e.g. armv5 Release 
+	 * @param buildType target's build type (urel/udeb).
+	 * @throws IllegalArgumentException
+	 */
+	private void validateArguments(IRefreshable notifyUIRefreshIf, AppDepSettings settings, SdkInformation sdkInfo, ITargetPlatform targetType, IBuildType buildType) throws IllegalArgumentException{
+		if( (notifyUIRefreshIf == null || settings == null || sdkInfo == null || targetType == null || buildType == null)){
+			throw new IllegalArgumentException(new String(Messages.getString("BuildTargetEntryInfo.BuildTargetInfoValidateFailed_ErrMsg"))); //$NON-NLS-1$
+			}
+	}
+	
+	/**
+	 * @return the targetType
+	 */
+	public String getTargetType() {
+		return targetPlatform.getId();
+	}
+
+	/**
+	 * Get build target's build type.
+	 * @return build target's build type.
+	 */
+	public IBuildType getBuildType() {
+		return buildType;
+	}
+	
+	/**
+	 * Gets status for the entry.
+	 * @return status for the entry.
+	 */
+	public BuildTargetStatusEnum getStatus() {
+		if(status != BuildTargetStatusEnum.ENotSupported){
+			checkAndUpdateTargetStatus();
+		}
+		return status;
+	}
+	
+	/**
+	 * Checks current build target status and updates status field accordingly.
+	 */
+	private void checkAndUpdateTargetStatus() {
+		
+		// By default cache is not yet created for target or not under creation.
+		BuildTargetStatusEnum resolveStatus = BuildTargetStatusEnum.ENoCache;
+		
+		// Resolving current target status
+		if(getComponentCount() == 0){
+			resolveStatus = BuildTargetStatusEnum.EEmptyTarget;
+		}		
+		else if (settings.isCacheGenerationOngoingForTarget(sdkInfo, targetPlatform.getId(), buildType)){
+			resolveStatus = BuildTargetStatusEnum.ECacheIsBeingGenerated;				
+		}			
+		else if (isTargetCached()){						
+			String cacheFileAbsolutePathName = settings.getCacheFileAbsolutePathNameForSdkAndPlatform(
+																									sdkInfo,
+																									targetPlatform.getId(),
+																									buildType
+																								);
+			if (! CacheIndex.cacheIndexCreatedFor(cacheFileAbsolutePathName)){
+				resolveStatus = BuildTargetStatusEnum.ECachesIsBeingIndexed;									
+			}		
+			else if(settings.cacheNeedsUpdate(sdkInfo, new ITargetPlatform[]{targetPlatform}, buildType)){
+				resolveStatus = BuildTargetStatusEnum.ECacheNeedsUpdate;									
+			}
+			else{
+				resolveStatus = BuildTargetStatusEnum.ECacheReady;									
+			}
+		}			
+		// Updating status field with latest status info
+		status = resolveStatus;								
+	}
+
+	/**
+	 * Gets component count for the entry.
+	 * @return component count for the entry.
+	 */
+	public int getComponentCount() {
+		// Getting component count only once
+		if(componentCount == UNRESOLVED_COMPONENT_COUNT){
+			getComponentCountForSdkAndPlatform(settings, sdkInfo, targetPlatform.getId(), buildType);
+		}
+		return componentCount;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.wizards.ICacheIndexCreatorObserver#cacheIndexCreated(com.nokia.s60tools.appdep.core.data.CacheIndex)
+	 */
+	public void cacheIndexCreated(CacheIndex cacheIndexObj) {
+		// Not needing this information now but may be useful later on to get handle to created index object.
+	}
+
+	/**
+	 * Checks targets caching status. 
+	 * @return Returns <code>true</code> if target is cached, otherwise <code>false</code>.
+	 */
+	public boolean isTargetCached() {
+		return settings.isTargetPlatformCached(sdkInfo.getSdkId(), targetPlatform.getId(), buildType);
+	}
+	
+	/**
+	 * Gets component count for the target build pointed by given 
+	 * parameters. This is wrapper method for the corresponding method
+	 * in AppDepSettings class.
+	 * 
+	 * NOTE: The query may take some time! Therefore the actual query
+	 * is run in background thread withouth blockin UI.
+	 * 
+	 * @param settings Used AppDep settings. 
+	 * @param sdkInfo	SDK information for the queried SDK/Platform
+	 * @param targetName Target from the SDK/Platform.
+	 * @param buildType Build type for the target.
+	 * @return Component count for the selected target and build type.
+	 * @see com.nokia.s60tools.appdep.core.AppDepSettings#getComponentCountForSdkAndPlatform
+	 */
+	void getComponentCountForSdkAndPlatform(AppDepSettings settings, SdkInformation sdkInfo, 
+			                               String targetName, IBuildType buildType){
+		
+		final AppDepSettings settingsFinal = settings;
+		final SdkInformation sdkInfoFinal = sdkInfo; 
+        final String targetNameFinal = targetName;
+        final IBuildType buildTypeFinal = buildType;
+		
+		Thread queryComponentCountRunnable = new Thread(){
+			public void run(){
+				// Triggering component count calculation
+				int count = settingsFinal.getComponentCountForSdkAndPlatform(sdkInfoFinal, 
+						                                    targetNameFinal,
+						                                    buildTypeFinal);
+				// Updating component count member variable
+				componentCount = count;
+				// Requesting UI refresh
+				notifyUiRefresh();
+			}
+		};
+		// Run component
+		queryComponentCountRunnable.start();		
+	}
+
+	/**
+	 * Notifies UI to refresh itself.
+	 */
+	private void notifyUiRefresh() {
+		Runnable queryComponentCountRunnable = new Runnable(){
+			public void run(){
+				try {
+					notifyUIRefreshIf.refresh();					
+				} catch (SWTException e) {
+					// We'll get 'SWTException: Widget is disposed' exceptions whenever
+					// wizard dialog's page has been closed and try to do refresh.
+					// This exception can be therefore ignored safely.
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+			}
+		};
+		// Refresh request is scheduled to UI thread because there is need to modify 
+		// UI components which cannot be done from background thread.
+		PlatformUI.getWorkbench().getDisplay().asyncExec(queryComponentCountRunnable);		
+	}	
+	
+}