srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/BuildTargetEntryInfo.java
--- /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);
+ }
+
+}