New SDK preference page and SDK scanning mechanism; fix for Bug 10634. C3_BUILDER_WORK
authorstechong
Wed, 02 Jun 2010 17:08:00 -0500
branchC3_BUILDER_WORK
changeset 1421 587da7cb64b7
parent 1419 ab555eecf681
child 1422 efad5bbb7534
New SDK preference page and SDK scanning mechanism; fix for Bug 10634.
core/com.nokia.carbide.cpp.sdk.core/META-INF/MANIFEST.MF
core/com.nokia.carbide.cpp.sdk.core/src/com/nokia/carbide/cpp/internal/sdk/core/model/AbstractSDKManager.java
core/com.nokia.carbide.cpp.sdk.core/src/com/nokia/carbide/cpp/internal/sdk/core/model/SDKManager.java
core/com.nokia.carbide.cpp.sdk.core/src/com/nokia/carbide/cpp/internal/sdk/core/model/SDKManagerRaptorOnly.java
core/com.nokia.carbide.cpp.sdk.ui/META-INF/MANIFEST.MF
core/com.nokia.carbide.cpp.sdk.ui/plugin.properties
core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/SDKPreferencePage.java
core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/SDKPropertiesDialog.java
core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/SDKUIPreferenceConstants.java
core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/SDKUIPreferenceInitializer.java
core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/messages.properties
core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/sdk/ui/SDKUIPlugin.java
core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/sdk/ui/shared/AddSDKDialog.java
core/com.nokia.carbide.cpp.ui/src/com/nokia/carbide/cpp/ui/TextAndDialogCellEditor.java
--- a/core/com.nokia.carbide.cpp.sdk.core/META-INF/MANIFEST.MF	Wed Jun 02 12:02:03 2010 -0500
+++ b/core/com.nokia.carbide.cpp.sdk.core/META-INF/MANIFEST.MF	Wed Jun 02 17:08:00 2010 -0500
@@ -17,13 +17,13 @@
  com.nokia.cpp.utils.ui
 Bundle-ActivationPolicy: lazy
 Export-Package: com.nokia.carbide.cpp.internal.api.sdk,
- com.nokia.carbide.cpp.internal.sdk.core.model;x-friends:="com.nokia.carbide.cpp.sdk.core.test",
- com.nokia.carbide.cpp.internal.sdk.core.xml;x-friends:="com.nokia.carbide.cpp.sdk.core.test",
- com.nokia.carbide.cpp.sdk.core,
  com.nokia.carbide.cpp.internal.sdk.core.gen.Devices;x-friends:="com.nokia.carbide.cpp.sdk.core.test,com.nokia.carbide.cpp.sdk.ui",
  com.nokia.carbide.cpp.internal.sdk.core.gen.Devices.impl;x-friends:="com.nokia.carbide.cpp.sdk.core.test",
  com.nokia.carbide.cpp.internal.sdk.core.gen.Devices.util;x-friends:="com.nokia.carbide.cpp.sdk.core.test",
  com.nokia.carbide.cpp.internal.sdk.core.gen.SymbianMacroStore;x-friends:="com.nokia.carbide.cpp.sdk.core.test",
  com.nokia.carbide.cpp.internal.sdk.core.gen.SymbianMacroStore.impl;x-friends:="com.nokia.carbide.cpp.sdk.core.test",
- com.nokia.carbide.cpp.internal.sdk.core.gen.SymbianMacroStore.util;x-friends:="com.nokia.carbide.cpp.sdk.core.test"
+ com.nokia.carbide.cpp.internal.sdk.core.gen.SymbianMacroStore.util;x-friends:="com.nokia.carbide.cpp.sdk.core.test",
+ com.nokia.carbide.cpp.internal.sdk.core.model;x-friends:="com.nokia.carbide.cpp.sdk.core.test,com.nokia.carbide.cpp.sdk.ui",
+ com.nokia.carbide.cpp.internal.sdk.core.xml;x-friends:="com.nokia.carbide.cpp.sdk.core.test",
+ com.nokia.carbide.cpp.sdk.core
 Bundle-ClassPath: sdkCorePlugin.jar
--- a/core/com.nokia.carbide.cpp.sdk.core/src/com/nokia/carbide/cpp/internal/sdk/core/model/AbstractSDKManager.java	Wed Jun 02 12:02:03 2010 -0500
+++ b/core/com.nokia.carbide.cpp.sdk.core/src/com/nokia/carbide/cpp/internal/sdk/core/model/AbstractSDKManager.java	Wed Jun 02 17:08:00 2010 -0500
@@ -16,8 +16,6 @@
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStreamReader;
-import java.net.MalformedURLException;
-import java.net.URL;
 import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -41,10 +39,12 @@
 import org.eclipse.core.runtime.IExtensionPoint;
 import org.eclipse.core.runtime.IExtensionRegistry;
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Status;
-import org.eclipse.osgi.service.datalocation.Location;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
+import org.eclipse.core.runtime.jobs.Job;
 import org.osgi.framework.Version;
 import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
@@ -61,11 +61,11 @@
 import com.nokia.carbide.cpp.internal.api.sdk.SymbianBuildContextDataCache;
 import com.nokia.carbide.cpp.internal.api.sdk.SymbianMacroStore;
 import com.nokia.carbide.cpp.sdk.core.ICarbideInstalledSDKChangeListener;
+import com.nokia.carbide.cpp.sdk.core.ICarbideInstalledSDKChangeListener.SDKChangeEventType;
 import com.nokia.carbide.cpp.sdk.core.IRVCTToolChainInfo;
 import com.nokia.carbide.cpp.sdk.core.ISDKManager;
 import com.nokia.carbide.cpp.sdk.core.ISymbianSDK;
 import com.nokia.carbide.cpp.sdk.core.SDKCorePlugin;
-import com.nokia.carbide.cpp.sdk.core.ICarbideInstalledSDKChangeListener.SDKChangeEventType;
 import com.nokia.cpp.internal.api.utils.core.FileUtils;
 import com.nokia.cpp.internal.api.utils.core.ListenerList;
 import com.nokia.cpp.internal.api.utils.core.Logging;
@@ -77,6 +77,7 @@
 	
 	protected static List<ISymbianSDK> sdkList = new ArrayList<ISymbianSDK>();
 	protected HashMap<String,ISymbianSDK> missingSdkMap = new HashMap<String,ISymbianSDK>();
+	protected Job scanJob;
 
 	protected static final String CARBIDE_SDK_CACHE_FILE_NAME = "carbideSDKCache.xml";
 	protected static final String SDK_CACHE_ID_ATTRIB = "id";
@@ -125,6 +126,67 @@
 	
 	public AbstractSDKManager() {
 		macroStore = SymbianMacroStore.getInstance();
+		scanJob = new Job ("Scan System Drives") {
+			@Override
+			protected IStatus run(IProgressMonitor monitor) {
+				synchronized (sdkList)
+				{
+					ArrayList<ISymbianSDK> oldSDKList = new ArrayList<ISymbianSDK>(sdkList);
+					
+					getSBSv2Version(true);
+					
+					if (sdkList != null){
+						sdkList.clear();
+					}
+				
+					if (!doScanSDKs(monitor))
+						return Status.OK_STATUS;;
+					
+					// now these SDK's are newly added, remove from internal list
+					for (ISymbianSDK sdk : sdkList) {
+						if (SDKManagerInternalAPI.getMissingSdk(sdk.getUniqueId()) != null) {
+							SDKManagerInternalAPI.removeMissingSdk(sdk
+									.getUniqueId());
+						}
+					}
+
+					// now these SDK's are removed from the old list, add to
+					// internal list
+					for (ISymbianSDK oldSdk : oldSDKList) {
+						boolean found = false;
+						for (ISymbianSDK sdk : sdkList) {
+							if (sdk.getUniqueId().equals(oldSdk.getUniqueId())) {
+								found = true;
+								break;
+							}
+						}
+						if (found == false) {
+							SDKManagerInternalAPI.addMissingSdk(oldSdk
+									.getUniqueId());
+							// flush cache
+							SymbianBuildContextDataCache.refreshForSDKs(new ISymbianSDK[] { oldSdk });
+						}
+					}
+				}
+
+				// make sure we don't rescan over and over again
+				hasScannedSDKs = true;
+				
+				// tell others about it
+				fireInstalledSdkChanged(SDKChangeEventType.eSDKScanned);
+				scanCarbideSDKCache();
+				
+				// Notify any plugins that want to know if the SDKManager has scanned plugins.
+				if (!sdkHookExtenstionsNotified) {
+					notifySDKManagerLoaded();
+					sdkHookExtenstionsNotified = true;
+				}
+				if (monitor.isCanceled()) {
+					return Status.CANCEL_STATUS;
+				}
+				return Status.OK_STATUS;
+			}
+		};
 	}
 	
 	public SymbianMacroStore getSymbianMacroStore(){
@@ -132,61 +194,8 @@
 	}
 	
 	public void scanSDKs() {
-		synchronized (sdkList)
-		{
-			ArrayList<ISymbianSDK> oldSDKList = new ArrayList<ISymbianSDK>(sdkList);
-			
-			getSBSv2Version(true);
-			
-			if (sdkList != null){
-				sdkList.clear();
-			}
-		
-			if (!doScanSDKs())
-				return;
-			
-			// now these SDK's are newly added, remove from internal list
-			for (ISymbianSDK sdk : sdkList) {
-				if (SDKManagerInternalAPI.getMissingSdk(sdk.getUniqueId()) != null) {
-					SDKManagerInternalAPI.removeMissingSdk(sdk
-							.getUniqueId());
-				}
-			}
-
-			// now these SDK's are removed from the old list, add to
-			// internal list
-			for (ISymbianSDK oldSdk : oldSDKList) {
-				boolean found = false;
-				for (ISymbianSDK sdk : sdkList) {
-					if (sdk.getUniqueId().equals(oldSdk.getUniqueId())) {
-						found = true;
-						break;
-					}
-				}
-				if (found == false) {
-					SDKManagerInternalAPI.addMissingSdk(oldSdk
-							.getUniqueId());
-					// flush cache
-					SymbianBuildContextDataCache.refreshForSDKs(new ISymbianSDK[] { oldSdk });
-				}
-			}
-
-
-		}
-
-		// make sure we don't rescan over and over again
-		hasScannedSDKs = true;
-		
-		// tell others about it
-		fireInstalledSdkChanged(SDKChangeEventType.eSDKScanned);
-		scanCarbideSDKCache();
-		
-		// Notify any plugins that want to know if the SDKManager has scanned plugins.
-		if (!sdkHookExtenstionsNotified) {
-			notifySDKManagerLoaded();
-			sdkHookExtenstionsNotified = true;
-		}
-		
+		scanJob.setSystem(true);
+		scanJob.schedule();
 	}
 
 	/**
@@ -195,8 +204,19 @@
 	 * when SDKs are newly missing
 	 * @return true if scan succeeded
 	 */
-	abstract protected boolean doScanSDKs();
+	abstract protected boolean doScanSDKs(IProgressMonitor monitor);
 	
+	public void addScanJobListner(IJobChangeListener listener) {
+		if (scanJob != null) {
+			scanJob.addJobChangeListener(listener);
+		}
+	}
+
+	public void removeScanJobLisner(IJobChangeListener listener) {
+		if (scanJob != null) {
+			scanJob.removeJobChangeListener(listener);
+		}
+	}
 
 	protected void ensureScannedSDKs() {
 		if (!hasScannedSDKs) {
@@ -291,17 +311,8 @@
 			throw new RuntimeException(e);
 		}
 		
-		// NOTE: If debugging runtime workbench and you clear your configuraiton at each launch
-		// the data in the configuration location will be lost
-		Location configurationLocation = Platform.getConfigurationLocation();
 		try {
-			URL url = new URL(configurationLocation.getURL(), SDKCorePlugin.PLUGIN_ID);
-			File configFolder = new File(url.getFile());
-			if (!configFolder.exists()) {
-				configFolder.mkdirs();
-			}
-
-		    File carbideSDKCacheFile = new File(configFolder, CARBIDE_SDK_CACHE_FILE_NAME);
+		    File carbideSDKCacheFile = new File(System.getProperty("user.home"), CARBIDE_SDK_CACHE_FILE_NAME);
 		    if (!carbideSDKCacheFile.exists()){
 		    	try {
 		    	FileUtils.writeFileContents(carbideSDKCacheFile, EMPTY_STRING.toCharArray(), null);
@@ -413,84 +424,72 @@
 			return;
 		}
 		
-		Location configurationLocation = Platform.getConfigurationLocation();
-		try {
-					
-			URL url = new URL(configurationLocation.getURL(), SDKCorePlugin.PLUGIN_ID);
-			File configFolder = new File(url.getFile());
-			if (!configFolder.exists()) {
-				configFolder.mkdirs();
+		File carbideSDKCacheFile = new File(System.getProperty("user.home"), CARBIDE_SDK_CACHE_FILE_NAME);
+		if (!carbideSDKCacheFile.exists()){
+			try {
+			FileUtils.writeFileContents(carbideSDKCacheFile, EMPTY_STRING.toCharArray(), null);
+			} catch (CoreException e){
+				e.printStackTrace();
 			}
+		}
+		
+		Document d = docBuilder.newDocument();
+		Node sdks = d.appendChild(d.createElement("sdks"));
 			
-			File carbideSDKCacheFile = new File(configFolder, CARBIDE_SDK_CACHE_FILE_NAME);
-		    if (!carbideSDKCacheFile.exists()){
-		    	try {
-		    	FileUtils.writeFileContents(carbideSDKCacheFile, EMPTY_STRING.toCharArray(), null);
-		    	} catch (CoreException e){
-		    		e.printStackTrace();
-		    	}
-		    }
-		    
-			Document d = docBuilder.newDocument();
-			Node sdks = d.appendChild(d.createElement("sdks"));
+		synchronized(sdkList)
+		{
+			for (ISymbianSDK currSDK: sdkList) {
+				Node sdk = sdks.appendChild(d.createElement("sdk"));
+				NamedNodeMap attribs = sdk.getAttributes();
+				Node idNode = d.createAttribute(SDK_CACHE_ID_ATTRIB);
+				idNode.setNodeValue(currSDK.getUniqueId());
+				attribs.setNamedItem(idNode);
+					
+				// Hide the build config from view in the build config list?
+				Node enabledNode = d.createAttribute(SDK_CACHE_ENABLED_ATTRIB);
+				if (true == currSDK.isEnabled()) {
+					enabledNode.setNodeValue("true");
+				} else {
+					enabledNode.setNodeValue("false");
+				}
+				attribs.setNamedItem(enabledNode);
 				
-			synchronized(sdkList)
-			{
-				for (ISymbianSDK currSDK: sdkList) {
-					Node sdk = sdks.appendChild(d.createElement("sdk"));
-					NamedNodeMap attribs = sdk.getAttributes();
-					Node idNode = d.createAttribute(SDK_CACHE_ID_ATTRIB);
-					idNode.setNodeValue(currSDK.getUniqueId());
-					attribs.setNamedItem(idNode);
-						
-					// Hide the build config from view in the build config list?
-					Node enabledNode = d.createAttribute(SDK_CACHE_ENABLED_ATTRIB);
-					if (true == currSDK.isEnabled()) {
-						enabledNode.setNodeValue("true");
-					} else {
-						enabledNode.setNodeValue("false");
-					}
-					attribs.setNamedItem(enabledNode);
-					
-					Node wasScannedNode = d.createAttribute(SDK_SCANNED_FOR_PLUGINS);
-					if (true == currSDK.isPreviouslyScanned()) {
-						wasScannedNode.setNodeValue("true");
-					} else {
-						wasScannedNode.setNodeValue("false");
-					}
-					attribs.setNamedItem(wasScannedNode);
-					
-					Node osVerNode = d.createAttribute(SDK_CACHE_OS_VERSION_ATTRIB);
-					osVerNode.setNodeValue(currSDK.getOSVersion().toString());
-					attribs.setNamedItem(osVerNode);
-					
-					Node osBranchNode = d.createAttribute(SDK_CACHE_OS_BRANCH_ATTRIB);
-					osBranchNode.setNodeValue(currSDK.getSDKOSBranch());
-					attribs.setNamedItem(osBranchNode);
-					
-					Node sdkVerNode = d.createAttribute(SDK_CACHE_SDK_VERSION_ATTRIB);
-					sdkVerNode.setNodeValue(currSDK.getSDKVersion().toString());
-					attribs.setNamedItem(sdkVerNode);
-					
-					if (!isEPOCRootFixed()) {
-						Node sdkEpocRootNode = d.createAttribute(SDK_CACHE_EPOCROOT_ATTRIB);
-						sdkEpocRootNode.setNodeValue(currSDK.getEPOCROOT());
-						attribs.setNamedItem(sdkEpocRootNode);
-					}
+				Node wasScannedNode = d.createAttribute(SDK_SCANNED_FOR_PLUGINS);
+				if (true == currSDK.isPreviouslyScanned()) {
+					wasScannedNode.setNodeValue("true");
+				} else {
+					wasScannedNode.setNodeValue("false");
+				}
+				attribs.setNamedItem(wasScannedNode);
+				
+				Node osVerNode = d.createAttribute(SDK_CACHE_OS_VERSION_ATTRIB);
+				osVerNode.setNodeValue(currSDK.getOSVersion().toString());
+				attribs.setNamedItem(osVerNode);
+				
+				Node osBranchNode = d.createAttribute(SDK_CACHE_OS_BRANCH_ATTRIB);
+				osBranchNode.setNodeValue(currSDK.getSDKOSBranch());
+				attribs.setNamedItem(osBranchNode);
+				
+				Node sdkVerNode = d.createAttribute(SDK_CACHE_SDK_VERSION_ATTRIB);
+				sdkVerNode.setNodeValue(currSDK.getSDKVersion().toString());
+				attribs.setNamedItem(sdkVerNode);
+				
+				if (!isEPOCRootFixed()) {
+					Node sdkEpocRootNode = d.createAttribute(SDK_CACHE_EPOCROOT_ATTRIB);
+					sdkEpocRootNode.setNodeValue(currSDK.getEPOCROOT());
+					attribs.setNamedItem(sdkEpocRootNode);
 				}
 			}
-			DOMSource domSource = new DOMSource(d);
-			TransformerFactory transFactory = TransformerFactory.newInstance();
-			Result fileResult = new StreamResult(carbideSDKCacheFile);
-			try {
-				transFactory.newTransformer().transform(domSource, fileResult);
-			} catch (TransformerConfigurationException e) {
-				ResourcesPlugin.getPlugin().getLog().log(new Status(IStatus.ERROR, SDKCorePlugin.PLUGIN_ID, IStatus.ERROR, e.getMessage(), e));
-			} catch (TransformerException e) {
-				ResourcesPlugin.getPlugin().getLog().log(new Status(IStatus.ERROR, SDKCorePlugin.PLUGIN_ID, IStatus.ERROR, e.getMessage(), e));
-			} 
-		} catch (MalformedURLException e){
-			
+		}
+		DOMSource domSource = new DOMSource(d);
+		TransformerFactory transFactory = TransformerFactory.newInstance();
+		Result fileResult = new StreamResult(carbideSDKCacheFile);
+		try {
+			transFactory.newTransformer().transform(domSource, fileResult);
+		} catch (TransformerConfigurationException e) {
+			ResourcesPlugin.getPlugin().getLog().log(new Status(IStatus.ERROR, SDKCorePlugin.PLUGIN_ID, IStatus.ERROR, e.getMessage(), e));
+		} catch (TransformerException e) {
+			ResourcesPlugin.getPlugin().getLog().log(new Status(IStatus.ERROR, SDKCorePlugin.PLUGIN_ID, IStatus.ERROR, e.getMessage(), e));
 		}
 	}
 
--- a/core/com.nokia.carbide.cpp.sdk.core/src/com/nokia/carbide/cpp/internal/sdk/core/model/SDKManager.java	Wed Jun 02 12:02:03 2010 -0500
+++ b/core/com.nokia.carbide.cpp.sdk.core/src/com/nokia/carbide/cpp/internal/sdk/core/model/SDKManager.java	Wed Jun 02 17:08:00 2010 -0500
@@ -27,6 +27,7 @@
 import org.eclipse.cdt.utils.WindowsRegistry;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Status;
@@ -36,7 +37,9 @@
 import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.PlatformUI;
 
+import com.nokia.carbide.cpp.internal.sdk.core.gen.Devices.DefaultType;
 import com.nokia.carbide.cpp.internal.sdk.core.gen.Devices.DeviceType;
+import com.nokia.carbide.cpp.internal.sdk.core.gen.Devices.DevicesFactory;
 import com.nokia.carbide.cpp.internal.sdk.core.gen.Devices.DevicesType;
 import com.nokia.carbide.cpp.internal.sdk.core.xml.DevicesLoader;
 import com.nokia.carbide.cpp.sdk.core.ISymbianSDK;
@@ -54,7 +57,12 @@
 	private static final String WINDOWS_SYSTEM_ROOT_KEY = "SystemRoot";
 
 	private static final String EMPTY_DEVICES_XML_CONTENT = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><devices version=\"1.0\"></devices>";
-	
+
+	private static final String QMAKE_FILE = "epoc32/tools/qt/qmake" + HostOS.EXE_EXT; //$NON-NLS-1$
+	private static final String MIFCONV_FILE = "epoc32/tools/mifconv" + HostOS.EXE_EXT; //$NON-NLS-1$
+	private static final String ABLD_FILE = "epoc32/tools/abld.pl"; //$NON-NLS-1$
+	private static final long VALID_ABLD_SIZE = 1024;
+
 	static boolean hasPromptedForDevicesXML = false; // make sure we only ask once at startup if devices.xml does not exist
 	long devicesXLMLastModified;
 	
@@ -71,11 +79,10 @@
 	public SDKManager() {
 		super();
 		checkPerlInstallation();
-		
 	}
 	
-	protected boolean doScanSDKs() {
-		
+	protected boolean doScanSDKs(IProgressMonitor monitor) {
+		boolean result = true;
 		DevicesType devicesType;
 		try {
 			File devicesFile = getDevicesXMLFile();
@@ -87,25 +94,25 @@
 					hasPromptedForDevicesXML = true;
 					doAsynchPromptCreateDevicesXML();
 				}
-				return false; // no devices.xml file..
+				result = false; // no devices.xml file..
+			} else {
+				devicesXLMLastModified = devicesFile.lastModified();
+				devicesType = DevicesLoader.loadDevices(devicesFile.toURL());
+				EList devices = devicesType.getDevice();
+				for (Iterator iter = devices.iterator(); iter.hasNext();) {
+					SymbianSDK sdk = new SymbianSDK((DeviceType) iter.next());
+					sdkList.add(sdk);
+				}
 			}
+		} catch (Exception e) {
+			logError("Failed to scan devices.xml", e);
+			result = false;
+		}
 
-			devicesXLMLastModified = devicesFile.lastModified();
-			devicesType = DevicesLoader.loadDevices(devicesFile.toURL());
-			EList devices = devicesType.getDevice();
-			for (Iterator iter = devices.iterator(); iter.hasNext();) {
-				SymbianSDK sdk = new SymbianSDK((DeviceType) iter.next());
-				sdkList.add(sdk);
-			}
-
-			return true;
-		} catch (Exception e) {
-			logError("Failed to scan SDKs", e);
-			return false;
-		}
+		doScanDrives(monitor);
+		return result;
 	}
 
-
 	public void updateSDK(ISymbianSDK sdk) {
 		try {
 			File devicesFile = getDevicesXMLFile();
@@ -416,4 +423,101 @@
 	protected boolean isEPOCRootFixed() {
 		return true;
 	}
+
+	/**
+	 * Scan system drives for installed SDKs
+	 */
+	protected void doScanDrives(IProgressMonitor monitor) {
+		File[] drives = getSystemDrives();
+		monitor.beginTask("Scanning system drives for installed SDKs", drives.length);
+		for (File drive : drives) {
+			if (!isEPOCRoot(drive)) {
+				continue;
+			}
+
+			DeviceType deviceType = DevicesFactory.eINSTANCE.createDeviceType();
+			deviceType.setAlias(drive.toString());
+			deviceType.setDefault(DefaultType.NO_LITERAL);
+			deviceType.setEpocroot(drive.getAbsolutePath());
+			deviceType.setId(drive.toString().charAt(0) + "_SDK");
+			deviceType.setName("com.nokia.s60");
+			deviceType.setToolsroot(drive.getAbsolutePath());
+			deviceType.setUserdeletable("false");
+			deviceType.setUserdeletetable("false");
+			ISymbianSDK sdk = new SymbianSDK(deviceType);
+			if (!isSupportedSDK(sdk)) {
+				continue;
+			}
+			if (isInSDKList(sdk)) {
+				continue;
+			}
+
+			sdkList.add(sdk);
+			monitor.worked(1);
+			if (monitor.isCanceled()) {
+				monitor.done();
+				return;
+			}
+		}
+		monitor.done();
+	}
+
+	private File[] getSystemDrives() {
+		if (HostOS.IS_WIN32) {
+			return File.listRoots();
+		}
+		return new File[0];
+	}
+
+	private boolean hasAbldSupport(ISymbianSDK sdk) {
+		File abld = new File(sdk.getEPOCROOT(), ABLD_FILE);
+		if (abld.exists()) {
+			long size = abld.length();
+			if (size >= VALID_ABLD_SIZE)
+				return true;
+		}
+		return false;
+	}
+
+	private boolean hasQmake(ISymbianSDK sdk) {
+		File qmake = new File(sdk.getEPOCROOT(), QMAKE_FILE);
+		if (qmake.exists()) {
+			return true;
+		}
+		return false;
+	}
+
+	private boolean hasRaptor(ISymbianSDK sdk) {
+		File mifconv = new File(sdk.getEPOCROOT(), MIFCONV_FILE);
+		if (mifconv.exists()) {
+			return true;
+		}
+		return false;
+	}
+
+	private boolean isEPOCRoot(File drive) {
+		File epocRoot = new File(drive, "epoc32");
+		if (epocRoot.exists()) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	private boolean isInSDKList(ISymbianSDK sdk) {
+		for (ISymbianSDK entry : sdkList) {
+			if (entry.getEPOCROOT().equalsIgnoreCase(sdk.getEPOCROOT())) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	private boolean isSupportedSDK(ISymbianSDK sdk) {
+		if (!hasAbldSupport(sdk) || hasQmake(sdk) || hasRaptor(sdk)) {
+			return true;
+		}
+		return false;
+	}
+
 }
--- a/core/com.nokia.carbide.cpp.sdk.core/src/com/nokia/carbide/cpp/internal/sdk/core/model/SDKManagerRaptorOnly.java	Wed Jun 02 12:02:03 2010 -0500
+++ b/core/com.nokia.carbide.cpp.sdk.core/src/com/nokia/carbide/cpp/internal/sdk/core/model/SDKManagerRaptorOnly.java	Wed Jun 02 17:08:00 2010 -0500
@@ -19,6 +19,7 @@
 
 import java.io.File;
 
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.swt.widgets.Display;
 
@@ -39,7 +40,7 @@
 	 * @see com.nokia.carbide.cpp.internal.sdk.core.model.AbstractSDKManager#doScanSDKs()
 	 */
 	@Override
-	protected boolean doScanSDKs() {
+	protected boolean doScanSDKs(IProgressMonitor monitor) {
 		
 		String message = SBSv2Utils.scanSBSv2();
 		if (message != null) {
--- a/core/com.nokia.carbide.cpp.sdk.ui/META-INF/MANIFEST.MF	Wed Jun 02 12:02:03 2010 -0500
+++ b/core/com.nokia.carbide.cpp.sdk.ui/META-INF/MANIFEST.MF	Wed Jun 02 17:08:00 2010 -0500
@@ -10,6 +10,7 @@
  org.eclipse.core.runtime,
  org.eclipse.core.resources,
  com.nokia.carbide.cpp.sdk.core,
+ com.nokia.carbide.cpp.ui,
  com.nokia.carbide.templatewizard,
  com.nokia.cpp.utils.core,
  com.nokia.cpp.utils.ui
--- a/core/com.nokia.carbide.cpp.sdk.ui/plugin.properties	Wed Jun 02 12:02:03 2010 -0500
+++ b/core/com.nokia.carbide.cpp.sdk.ui/plugin.properties	Wed Jun 02 17:08:00 2010 -0500
@@ -1,6 +1,6 @@
 // Copyright 2007 Nokia, Inc.
 
-SDKUIPlugin.SDK_Preferences=SDK Preferences
+SDKUIPlugin.SDK_Preferences=Symbian SDKs
 SDKUIPlugin.Platform_Filtering_Preferences=Platform Filtering Preferences
 
 #Keywords for Carbide preferences
--- a/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/SDKPreferencePage.java	Wed Jun 02 12:02:03 2010 -0500
+++ b/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/SDKPreferencePage.java	Wed Jun 02 17:08:00 2010 -0500
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2009-2010 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"
@@ -16,198 +16,281 @@
 */
 package com.nokia.carbide.cpp.internal.sdk.ui;
 
-import java.io.*;
-import java.util.*;
+import java.io.File;
+import java.text.MessageFormat;
+import java.util.Iterator;
 import java.util.List;
 
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.viewers.*;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.ColumnViewer;
+import org.eclipse.jface.viewers.EditingSupport;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.TextCellEditor;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.*;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.*;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.PlatformUI;
 
 import com.nokia.carbide.cpp.internal.api.sdk.SymbianBuildContextDataCache;
 import com.nokia.carbide.cpp.internal.sdk.core.model.SDKManager;
-import com.nokia.carbide.cpp.sdk.core.*;
+import com.nokia.carbide.cpp.sdk.core.ISDKManager;
+import com.nokia.carbide.cpp.sdk.core.ISymbianSDK;
+import com.nokia.carbide.cpp.sdk.core.SDKCorePlugin;
 import com.nokia.carbide.cpp.sdk.ui.SDKUIPlugin;
 import com.nokia.carbide.cpp.sdk.ui.shared.AddSDKDialog;
+import com.nokia.carbide.cpp.ui.TextAndDialogCellEditor;
+import com.nokia.cpp.internal.api.utils.ui.BrowseDialogUtils;
 
 public class SDKPreferencePage
 	extends PreferencePage
 	implements IWorkbenchPreferencePage {
 	
-	ISDKManager sdkMgr;
+	private class SDKLabelProvider extends LabelProvider implements ITableLabelProvider {
+		public Image getColumnImage(Object element, int columnIndex) {
+			return null;
+		}
+
+		public String getColumnText(Object element, int columnIndex) {
+			ISymbianSDK sdk = (ISymbianSDK) element;
+			switch (columnIndex) {
+			case 1:
+				return sdk.getUniqueId();
+			case 2:
+				return sdk.getEPOCROOT();
+			default:
+				return "";
+			}
+		}
+	}
+
+	private class IdEditingSupport extends EditingSupport {
+		private TextCellEditor editor;
+
+		public IdEditingSupport(ColumnViewer viewer) {
+			super(viewer);
+			editor = new TextCellEditor((Composite) viewer.getControl());
+		}
+
+		@Override
+		protected boolean canEdit(Object element) {
+			if (element instanceof ISymbianSDK) {
+				return true;
+			}
+			return false;
+		}
+
+		@Override
+		protected CellEditor getCellEditor(Object element) {
+			return editor;
+		}
+
+		@Override
+		protected Object getValue(Object element) {
+			ISymbianSDK sdk = (ISymbianSDK) element;
+			return sdk.getUniqueId();
+		}
+
+		@Override
+		protected void setValue(Object element, Object value) {
+			ISymbianSDK sdk = (ISymbianSDK) element;
+			sdk.setUniqueID(value.toString());
+			SDKCorePlugin.getSDKManager().updateSDK(sdk);
+			getViewer().refresh();
+		}
+	}
+
+	private class LocationEditingSupport extends EditingSupport {
+		private LocationCellEditor editor;
+
+		public LocationEditingSupport(ColumnViewer viewer) {
+			super(viewer);
+			editor = new LocationCellEditor((Composite) viewer.getControl());
+		}
+
+		@Override
+		protected boolean canEdit(Object element) {
+			if (element instanceof ISymbianSDK) {
+				return true;
+			}
+			return false;
+		}
+
+		@Override
+		protected CellEditor getCellEditor(Object element) {
+			return editor;
+		}
+
+		@Override
+		protected Object getValue(Object element) {
+			ISymbianSDK sdk = (ISymbianSDK) element;
+			return sdk.getEPOCROOT();
+		}
+
+		@Override
+		protected void setValue(Object element, Object value) {
+			ISymbianSDK sdk = (ISymbianSDK) element;
+			sdk.setEPOCROOT(value.toString());
+			SDKCorePlugin.getSDKManager().updateSDK(sdk);
+			getViewer().refresh();
+		}
+	}
+
+	private class LocationCellEditor extends TextAndDialogCellEditor {
+		private Button button;
+		private Text text;
+
+		public LocationCellEditor(Composite parent) {
+			super(parent);
+		}
+
+		@Override
+		protected Control createContents(Composite parent) {
+			text = (Text) super.createContents(parent);
+			return text;
+		}
+
+		@Override
+		protected Control createControl(Composite parent) {
+			Control control = super.createControl(parent);
+			button = getButton();
+			button.setText(Messages.getString("SDKPreferencePage.Browse_Location_Label")); //$NON-NLS-1$
+			return control;
+		}
+
+		@Override
+		protected Object openDialogBox(Control cellEditorWindow) {
+			DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.OPEN);
+			BrowseDialogUtils.initializeFrom(dialog, text);
+			return dialog.open();
+		}		
+	}
+
+	private class ScanJobListener implements IJobChangeListener {
+		public void done(IJobChangeEvent event) {
+			Display.getDefault().asyncExec(new Runnable() {
+				public void run() {
+					rescanSDKs();
+				}
+			});
+		}
+
+		public void aboutToRun(IJobChangeEvent event) {}
+		public void awake(IJobChangeEvent event) {}
+		public void running(IJobChangeEvent event) {}
+		public void scheduled(IJobChangeEvent event) {}
+		public void sleeping(IJobChangeEvent event) {}
+		
+	}
+
+	private IPreferenceStore prefsStore;
+	private ISDKManager sdkMgr;
+	private List<ISymbianSDK> sdkList;
+	private ScanJobListener scanJobListner;
+	private boolean scanForNewPlugins;
 	private CheckboxTableViewer sdkListTableViewer;
-	private List<ISymbianSDK> sdkList; 
-	private Button sdkpropertiesButton;
-	private Button removeSdkButton;
-	private Button addNewSdkButton;
-	private Button rescanNowButton;
-	
-	private Label epocrootLabel;
-	private Label availablePlatformsLabel;
-	private Label osVersionLabel;
-	private Label diagnosticCheckLabel;
-	
-	private Button listenForDevicesXMLChangeButton;
-	
-	private static final String EPOCROOT_LABEL = "EPOCROOT: ";	//$NON-NLS-1$
-	private static final String PLATFORMS_LABEL = "Available Platforms: "; //$NON-NLS-1$
-	private static final String DIAGNOSTIC_CHECK_LABEL = "Diagnostic Check: "; //$NON-NLS-1$
-	private static final String OS_VERSION_LABEL = "OS Version: "; //$NON-NLS-1$
-	
-	private Color RED;
-	private Color BLACK;
-	private Color GRAY;
-	Shell shell;
-	
+	private Button addButton;
+	private Button deleteButton;
+	private Button propertiesButton;
+	private Button scanForNewPluginsButton;
+	private Button rescanButton;
+	private Label iconLabel;
+	private Label statusLabel;
+
+	private Color red;
+	private Color black;
+	private Color gray;
+
+	/**
+	 * Constructor.
+	 */
 	public SDKPreferencePage() {
 		super();
-		
-	}
-	
-	@Override
-	protected Control createContents(Composite parent) {
-		return null;
+		scanJobListner = new ScanJobListener();
 	}
 
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.preference.PreferencePage#createControl(org.eclipse.swt.widgets.Composite)
 	 */
-	public void init(IWorkbench workbench) {
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		
-		IPreferenceStore prefsStore = SDKUIPlugin.getDefault().getPreferenceStore();
+	public void createControl(Composite parent){
+		prefsStore = SDKUIPlugin.getDefault().getPreferenceStore();
 		sdkMgr = SDKCorePlugin.getSDKManager();
 		if (sdkMgr == null){
 			return; 
 		}
-		
-		shell = parent.getShell();
 		sdkList = sdkMgr.getSDKList();
-		RED = shell.getDisplay().getSystemColor(SWT.COLOR_RED);
-		BLACK = shell.getDisplay().getSystemColor(SWT.COLOR_BLACK);
-		GRAY = shell.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
-		
-		// check that devices.xml actually exists
-		if (sdkMgr instanceof SDKManager)
-			((SDKManager) sdkMgr).checkDevicesXMLExistAndCreate();
-		
-		Composite content = new Composite(parent, SWT.NONE);
-		setControl(content);
-		final GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 2;
-		content.setLayout(gridLayout);
-
-		final Group availableSymbianOsGroup = new Group(content, SWT.NONE);
-		availableSymbianOsGroup.setToolTipText(Messages.getString("SDKPreferencePage.OS_Group_ToolTip")); //$NON-NLS-1$
-		final GridData availableSymbianOsGridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
-		availableSymbianOsGridData.widthHint = 350;
-		availableSymbianOsGroup.setText(Messages.getString("SDKPreferencePage.Available_SDKs_Label")); //$NON-NLS-1$
-		availableSymbianOsGroup.setLayoutData(availableSymbianOsGridData);
-		availableSymbianOsGroup.setLayout(new GridLayout());
-
-		sdkListTableViewer = CheckboxTableViewer.newCheckList(availableSymbianOsGroup, SWT.BORDER);
-		sdkListTableViewer.getTable().setLayoutData(availableSymbianOsGridData);
-		
-		final Composite composite = new Composite(content, SWT.NONE);
-		composite.setLayoutData(new GridData());
-		final GridLayout gridLayout_1 = new GridLayout();
-		gridLayout_1.makeColumnsEqualWidth = true;
-		composite.setLayout(gridLayout_1);
+		if (sdkMgr instanceof SDKManager) {
+			SDKManager mgr = (SDKManager) sdkMgr;
+			mgr.addScanJobListner(scanJobListner);
+		}
 
-		removeSdkButton = new Button(composite, SWT.NONE);
-		removeSdkButton.setToolTipText(Messages.getString("SDKPreferencePage.Delete_SDK_ToolTip")); //$NON-NLS-1$
-		final GridData gridData = new GridData(SWT.LEFT, SWT.TOP, true, false);
-		removeSdkButton.setLayoutData(gridData);
-		removeSdkButton.setText(Messages.getString("SDKPreferencePage.Remove_SDK_Label")); //$NON-NLS-1$
-		addButtonListener(removeSdkButton);
-		
-		addNewSdkButton = new Button(composite, SWT.NONE);
-		addNewSdkButton.setToolTipText(Messages.getString("SDKPreferencePage.Add_New_SDK_ToolTip")); //$NON-NLS-1$
-		addNewSdkButton.setLayoutData(gridData);
-		addNewSdkButton.setText(Messages.getString("SDKPreferencePage.Add_New_SDK_Label")); //$NON-NLS-1$
-		addButtonListener(addNewSdkButton);
-		
-		sdkpropertiesButton = new Button(composite, SWT.NONE);
-		sdkpropertiesButton.setToolTipText(Messages.getString("SDKPreferencePage.SDK_Props_Button_ToolTip")); //$NON-NLS-1$
-		sdkpropertiesButton.setLayoutData(gridData);
-		sdkpropertiesButton.setText(Messages.getString("SDKPreferencePage.SDK_Props_Button_Label")); //$NON-NLS-1$
-		addButtonListener(sdkpropertiesButton);
-		
-		final Group sdkInformationGroup = new Group(content, SWT.NONE);
-		sdkInformationGroup.setToolTipText(Messages.getString("SDKPreferencePage.SDK_Info_ToolTip")); //$NON-NLS-1$
-		final GridData sdkInfoGridData = new GridData(SWT.FILL, SWT.FILL, true, true);
-		sdkInfoGridData.widthHint = 350;
-		sdkInformationGroup.setText(Messages.getString("SDKPreferencePage.SDK_Info_Label")); //$NON-NLS-1$
-		sdkInformationGroup.setLayoutData(sdkInfoGridData);
-		sdkInformationGroup.setLayout(new GridLayout());
-
-		epocrootLabel = new Label(sdkInformationGroup, SWT.WRAP);
-		epocrootLabel.setToolTipText(Messages.getString("SDKPreferencePage.EPOC32_Loc_ToolTip")); //$NON-NLS-1$
-		epocrootLabel.setLayoutData(new GridData(300, SWT.DEFAULT));
-		epocrootLabel.setText("EPOCROOT:"); //$NON-NLS-1$
+		super.createControl(parent);
 
-		osVersionLabel = new Label(sdkInformationGroup, SWT.WRAP);
-		osVersionLabel.setToolTipText(Messages.getString("SDKPreferencePage.OSVesions_ToolTip")); //$NON-NLS-1$
-		osVersionLabel.setLayoutData(new GridData(300, SWT.DEFAULT));
-		osVersionLabel.setText(Messages.getString("SDKPreferencePage.OSVersion_Label")); //$NON-NLS-1$
-
-		availablePlatformsLabel = new Label(sdkInformationGroup, SWT.WRAP);
-		availablePlatformsLabel.setToolTipText(Messages.getString("SDKPreferencePage.Platforms_ToolTip")); //$NON-NLS-1$
-		availablePlatformsLabel.setLayoutData(new GridData(300, SWT.DEFAULT));
-		availablePlatformsLabel.setText(Messages.getString("SDKPreferencePage.Available_Platforms")); //$NON-NLS-1$
-
-		diagnosticCheckLabel = new Label(sdkInformationGroup, SWT.WRAP);
-		diagnosticCheckLabel.setToolTipText(Messages.getString("SDKPreferencePage.Diagnostic_Check_ToolTip")); //$NON-NLS-1$
-		diagnosticCheckLabel.setLayoutData(sdkInfoGridData);
-		diagnosticCheckLabel.setText(Messages.getString("SDKPreferencePage.Diagnostic_Check_Label")); //$NON-NLS-1$
-		new Label(content, SWT.NONE);
+		// Hide "Restore Defaults" button
+		getDefaultsButton().setVisible(false);
 
-		listenForDevicesXMLChangeButton = new Button(content, SWT.CHECK);
-		listenForDevicesXMLChangeButton.setText(Messages.getString("SDKPreferencePage.listerForDevicesXML"));
-		listenForDevicesXMLChangeButton.setToolTipText(Messages.getString("SDKPreferencePage.listerForDevicesXML_Tooltip"));	//$NON-NLS-1$
-		listenForDevicesXMLChangeButton.setSelection(prefsStore.getBoolean(SDKUIPreferenceConstants.LISTEN_FOR_DEVICES_XML_CHANGE));
-		
-		new Label(content, SWT.WRAP); // filler
-		
-		rescanNowButton = new Button(content, SWT.NONE);
-		rescanNowButton.setToolTipText(Messages.getString("SDKPreferencePage.Rescan_Button_ToolTip")); //$NON-NLS-1$
-		rescanNowButton.setLayoutData(new GridData());
-		rescanNowButton.setText(Messages.getString("SDKPreferencePage.Rescan_Button_Label")); //$NON-NLS-1$
-		addButtonListener(rescanNowButton);
-		new Label(content, SWT.NONE);
-		
-		// Build the checked table of SDKs
-		addSDKComponentTableItems();
-		
-		ISymbianSDK sdk = (ISymbianSDK)sdkListTableViewer.getElementAt(0);
-		if (sdk != null){
-			sdkListTableViewer.setSelection(new StructuredSelection(sdk), true);
-			setSelectedSDKInfoText(sdk);
-		}
-		
-		
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(super.getControl(), SDKUIHelpIds.SDK_PREFERENCES_PAGE);
 	}
-	
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.DialogPage#dispose()
+	 */
+	public void dispose() {
+		if (sdkMgr != null && sdkMgr instanceof SDKManager){
+			SDKManager mgr = (SDKManager) sdkMgr;
+			mgr.removeScanJobLisner(scanJobListner);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+	 */
+	public void init(IWorkbench arg0) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
+	 */
 	public boolean performOk() {
-		
-		IPreferenceStore prefsStore = SDKUIPlugin.getDefault().getPreferenceStore();
-		prefsStore.setValue(SDKUIPreferenceConstants.LISTEN_FOR_DEVICES_XML_CHANGE, listenForDevicesXMLChangeButton.getSelection());
-		
+		// Save preference page specific values;
+		prefsStore.setValue(SDKUIPreferenceConstants.SCAN_FOR_NEW_PLUGINS, scanForNewPluginsButton.getSelection());
+
+		// Remember which SDK is enabled
 		for (ISymbianSDK sdk : sdkMgr.getSDKList()){
 			sdk.setEnabled(false);
 		}
@@ -218,341 +301,329 @@
 				sdk.setEnabled(true);
 			}
 		}
-		
-		ISDKManager sdkMgr =SDKCorePlugin.getSDKManager();
+
+		// Update cached SDK info
 		sdkMgr.updateCarbideSDKCache();
-		
 		return super.performOk();
 	}
-	
-	private void addSDKComponentTableItems() {
-		sdkListTableViewer.setContentProvider(new SDKTableComponentsContentProvider());
-		sdkListTableViewer.setLabelProvider(new SDKTableComponentsLabelProvider());
-		Table lTable = sdkListTableViewer.getTable();
-		
-		sdkList = SDKCorePlugin.getSDKManager().getSDKList();
-		sdkListTableViewer.setInput(sdkList);
-		lTable.setToolTipText(Messages.getString("SDKPreferencePage.List_of_Available_SDKs_ToolTip")); //$NON-NLS-1$
-		lTable.setVisible(true);
-		addSDKTableViewerSelectionListener();
-		//lTable.setLayoutData(grid);
-		if (sdkList == null || sdkList.size() == 0){
-			diagnosticCheckLabel.setText(DIAGNOSTIC_CHECK_LABEL + Messages.getString("SDKPreferencePage.No_SDKs_Available")); //$NON-NLS-1$
-			diagnosticCheckLabel.setForeground(RED);
-			diagnosticCheckLabel.setBackground(GRAY);
-		} else {
-			setCheckBoxes(sdkList);
-		}
-	}
-	
-	/**
-	 * Sets the checkbox state for enabled SDKs.
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
 	 */
-	private void setCheckBoxes(List<ISymbianSDK> sdkList) {
-		List<ISymbianSDK> sdkListCopy = new ArrayList<ISymbianSDK>();
-		for (ISymbianSDK sdkCheck : sdkList){
-			if (sdkCheck.isEnabled()){
-				sdkListCopy.add(sdkCheck);
-			}
-		}
-		sdkListTableViewer.setCheckedElements(sdkListCopy.toArray(new ISymbianSDK[sdkListCopy.size()]));			
-	}
-	
-	 /**
-	  *  Extends <code>LabelProvider</code> with the default implementation 
-	  *  and implements<code>ITableLabelProvider</code> with the methods
-	  *	 to provide the text and/or image for each column of a given element.  
-	  *	 Used by table viewers.
-	  */
-	
-	static class SDKTableComponentsLabelProvider extends LabelProvider implements ITableLabelProvider, ITableColorProvider  {
+	@Override
+	protected Control createContents(Composite parent) {
+		// Set up colors used in this preference page
+		Shell shell = parent.getShell();
+		red = shell.getDisplay().getSystemColor(SWT.COLOR_RED);
+		black = shell.getDisplay().getSystemColor(SWT.COLOR_BLACK);
+		gray = shell.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
+
+		Composite content = new Composite(parent, SWT.NONE);
+		GridLayout gridLayout = new GridLayout();
+		gridLayout.numColumns = 2;
+		content.setLayout(gridLayout);
+
+		// SDK table
+		sdkListTableViewer = CheckboxTableViewer.newCheckList(content, 
+				SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION);
+		createSDKTable();
 
-		/**
-		 * Returns the label image for the given column of the given element.
-		 * The default implementation returns null.
-		 * 
-		 * @return image object
-		 */
-		public Image getColumnImage(Object element, int columnIndex) {
-			return null;
-		}
+		// Buttons composite
+		Composite composite1 = new Composite(content, SWT.NONE);
+		composite1.setLayoutData(new GridData());
+		gridLayout = new GridLayout();
+		gridLayout.makeColumnsEqualWidth = true;
+		composite1.setLayout(gridLayout);
+		GridData gridData = new GridData(SWT.LEFT, SWT.TOP, true, false);
 
-		/**
-		 * Returns the label text for the given column of the given element.
-		 * 
-		 * @return string is the label text for the given column.
-		 */
-		public String getColumnText(Object arg0, int column) {
-			if (arg0 instanceof ISymbianSDK){
-				ISymbianSDK sdk = (ISymbianSDK)arg0;
-				return sdk.getUniqueId();
-			}
-			
-			return ""; //$NON-NLS-1$
-		}
+		// Add button
+		addButton = new Button(composite1, SWT.NONE);
+		addButton.setLayoutData(gridData);
+		addButton.setText(Messages.getString("SDKPreferencePage.Add_Button_Label")); //$NON-NLS-1$
+		addButton.setToolTipText(Messages.getString("SDKPreferencePage.Add_Button_ToolTip")); //$NON-NLS-1$
+		addButtonListener(addButton);
+
+		// Delete button
+		deleteButton = new Button(composite1, SWT.NONE);
+		deleteButton.setLayoutData(gridData);
+		deleteButton.setText(Messages.getString("SDKPreferencePage.Delete_Button_Label")); //$NON-NLS-1$
+		deleteButton.setToolTipText(Messages.getString("SDKPreferencePage.Delete_Button_ToolTip")); //$NON-NLS-1$
+		addButtonListener(deleteButton);
+
+		// Properties button
+		propertiesButton = new Button(composite1, SWT.NONE);
+		propertiesButton.setLayoutData(gridData);
+		propertiesButton.setText(Messages.getString("SDKPreferencePage.Properties_Button_Label")); //$NON-NLS-1$
+		propertiesButton.setToolTipText(Messages.getString("SDKPreferencePage.Properties_Button_ToolTip")); //$NON-NLS-1$
+		addButtonListener(propertiesButton);
 
-		private Color lBlack = Display.getDefault().getSystemColor(SWT.COLOR_BLACK);
-		private Color lRed =  Display.getDefault().getSystemColor(SWT.COLOR_RED);
+		// Status and Rescan composite
+		Composite composite2 = new Composite(content, SWT.NONE);
+		gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
+		gridData.widthHint = 350;
+		gridData.heightHint = 50;
+		composite2.setLayoutData(gridData);
+		gridLayout = new GridLayout();
+		gridLayout.numColumns = 2;
+		composite2.setLayout(gridLayout);
+
+		// IStatus icon label
+		iconLabel = new Label(composite2, SWT.NONE);
+		// IStatus text label
+		statusLabel = new Label(composite2, SWT.WRAP);
+		gridData = new GridData(SWT.LEFT, SWT.TOP, true, false);
+		gridData.verticalSpan = 2;
+		statusLabel.setLayoutData(gridData);
+
+		new Label(content, SWT.WRAP); // filler
 		
-		public Color getForeground(Object obj, int index) {
-			if (obj instanceof ISymbianSDK) {
-				ISymbianSDK sdk = (ISymbianSDK)obj;
-				File epocRootTest = new File(sdk.getEPOCROOT());
-				if ((sdk.getAvailablePlatforms().size() <= 0) || !epocRootTest.exists()) {
-					// There are no build configs and/or no epocroot exists
-					return lRed;
-				} else {
-					return lBlack;
-				}
-			}
-			return null;
-		}
-		
-		public Color getBackground(Object element, int columnIndex) {
-			return null;
-		}
-	}
-	
-	/** 
-	 * This implementation of <code>IStructuredContentProvider</code> handles
-	 * 	the case where the viewer input is an unchanging array or collection of elements.
-	 * 
-	 */
-	static class SDKTableComponentsContentProvider implements IStructuredContentProvider {
-		
+		// Scan SDK checkbox
+		scanForNewPluginsButton = new Button(content, SWT.CHECK);
+		scanForNewPluginsButton.setText(Messages.getString("SDKPreferencePage.ScanForNewPlugins_Button_Label")); //$NON-NLS-1$
+		scanForNewPluginsButton.setSelection(prefsStore.getBoolean(SDKUIPreferenceConstants.SCAN_FOR_NEW_PLUGINS));
+		addButtonListener(scanForNewPluginsButton);
+
 
-		/**
-		 * Returns the elements in the input
-		 * 
-		 * @return array of objects.
-		 */
-		public Object[] getElements(Object arg0) {
-			if (arg0 instanceof ArrayList) {
-				return ((ArrayList<?>)arg0).toArray();
-			}
-			return new Object[0];
-		}
+		new Label(content, SWT.WRAP); // filler
+		
+		// Rescan button
+		rescanButton = new Button(content, SWT.NONE);
+		rescanButton.setToolTipText(Messages.getString("SDKPreferencePage.Rescan_Button_ToolTip")); //$NON-NLS-1$
+		rescanButton.setText(Messages.getString("SDKPreferencePage.Rescan_Button_Label")); //$NON-NLS-1$
+		addButtonListener(rescanButton);
 
-		public void dispose() {
-		}
+		// Populate SDK table
+		addSDKComponentTableItems();
+		selectSDKEntry(0);
 
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			//do nothing
-		}
+		return content;
 	}
-	
-	/**
-	 * Sets the listener event to a button.
-	 * 
-	 * @param aButton
-	 */
-	private void addButtonListener( final Button aButton ) {
+
+	private void addButtonListener(final Button aButton) {
 		SelectionListener listener = new SelectionAdapter() {
-			public void widgetSelected( SelectionEvent e )  {
-				if (e.getSource().equals(sdkpropertiesButton)) {
-					sdkpropertiesButtonAction();
-				} else if (e.getSource().equals(addNewSdkButton)) {
-					addNewSdkButtonAction();
-				} else if (e.getSource().equals(removeSdkButton)) {
-					removeSdkButtonAction();
-				} else if (e.getSource().equals(rescanNowButton)) {
-					rescanNowButtonAction();
+			public void widgetSelected(SelectionEvent e)  {
+				if (e.getSource().equals(addButton)) {
+					handleAddButton();
+				} else if (e.getSource().equals(deleteButton)) {
+					handleDeleteButton();
+				} else if (e.getSource().equals(propertiesButton)) {
+					handlePropertiesButton();
+				} else if (e.getSource().equals(scanForNewPluginsButton)) {
+					handleScanForNewPluginsButton();
+				} else if (e.getSource().equals(rescanButton)) {
+					handleRescanButton();
 				}
-				
 			}
 		};
 		aButton.addSelectionListener(listener);
 	}
-	
-	private void sdkpropertiesButtonAction(){
+
+	private void addSDKComponentTableItems() {
+		sdkListTableViewer.setLabelProvider(new SDKLabelProvider());
+		sdkListTableViewer.setContentProvider(new ArrayContentProvider());
+		sdkList = sdkMgr.getSDKList();
+		sdkListTableViewer.setInput(sdkList.toArray());
+		sdkListTableViewer.getTable().setToolTipText(Messages.getString("SDKPreferencePage.List_of_Available_SDKs_ToolTip")); //$NON-NLS-1$
+		setCheckedElements();
+		addSDKTableViewerListeners();
+		if (sdkList == null || sdkList.size() == 0){
+			statusError(Messages.getString("SDKPreferencePage.No_SDKs_Available_Message")); //$NON-NLS-1$
+		}
+	}
+
+	private void addSDKTableViewerListeners(){
+		sdkListTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				if(event.getSelection() instanceof IStructuredSelection) {
+					IStructuredSelection selection = (IStructuredSelection)event.getSelection();
+					if (selection.size() == 1){
+						ISymbianSDK sdk = (ISymbianSDK)selection.getFirstElement();
+						deleteButton.setEnabled(true);
+						propertiesButton.setEnabled(true);		
+						updateSDKStatus(sdk);
+					}
+					else {
+						deleteButton.setEnabled(false);
+						propertiesButton.setEnabled(false);			        	   
+					}	
+				}
+			}
+		});
+	}
+
+	private void createSDKTable() {
+		final Table table = sdkListTableViewer.getTable();
+		GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
+		gridData.widthHint = 350;
+		gridData.heightHint = table.getItemHeight() * 6;
+		table.setLayoutData(gridData);
+		table.setHeaderVisible(true);
+		table.setLinesVisible(false);
+
+		TableViewerColumn enabledCol = new TableViewerColumn(sdkListTableViewer, SWT.LEFT);
+		enabledCol.getColumn().setText(Messages.getString("SDKPreferencePage.SDK_Table_Enabled_Column_Label")); //$NON-NLS-1$
+		enabledCol.getColumn().setWidth(50);
+
+		TableViewerColumn idCol = new TableViewerColumn(sdkListTableViewer, SWT.LEFT);
+		idCol.setEditingSupport(new IdEditingSupport(sdkListTableViewer)); //$NON-NLS-1$
+		idCol.getColumn().setText(Messages.getString("SDKPreferencePage.SDK_Table_ID_Column_Label"));
+		idCol.getColumn().setWidth(160);
+
+		TableViewerColumn locationCol = new TableViewerColumn(sdkListTableViewer, SWT.LEFT);
+		locationCol.setEditingSupport(new LocationEditingSupport(sdkListTableViewer));
+		locationCol.getColumn().setText(Messages.getString("SDKPreferencePage.SDK_Table_Location_Column_Label")); //$NON-NLS-1$
+		locationCol.getColumn().setWidth(170);
+	}
+
+	private void handleAddButton() {
+		AddSDKDialog dialog = new AddSDKDialog(getShell());
+		if (dialog.open() == AddSDKDialog.OK){
+			sdkList = sdkMgr.getSDKList();
+			sdkListTableViewer.setInput(sdkList.toArray());
+			setCheckedElements();
+			sdkListTableViewer.refresh();
+			selectSDKEntry(sdkList.size() - 1);
+		}
+	}
+
+	private void handleDeleteButton() {
+		ISymbianSDK sdk = (ISymbianSDK)((IStructuredSelection)sdkListTableViewer.getSelection()).getFirstElement();
+		int index = sdkListTableViewer.getTable().getSelectionIndex();
+		if (sdk != null){
+			if (sdkMgr.removeSDK(sdk.getUniqueId())){
+				sdkList = sdkMgr.getSDKList();
+				sdkListTableViewer.setInput(sdkList.toArray());
+				if (index > 0) {
+					selectSDKEntry(index - 1);
+				} else {
+					selectSDKEntry(index);
+				}
+				sdkListTableViewer.refresh();
+			}
+		}
+	}
+
+	private void handlePropertiesButton() {
 		ISymbianSDK sdk = (ISymbianSDK)((IStructuredSelection)sdkListTableViewer.getSelection()).getFirstElement();
 		if (sdk != null){
-			SDKPropertiesDialog sdkPropDlg = new SDKPropertiesDialog(getShell(), this, sdk);
+			SDKPropertiesDialog sdkPropDlg = new SDKPropertiesDialog(getShell(), sdk);
 			if (sdkPropDlg.open() == SDKPropertiesDialog.OK){
 				sdkListTableViewer.refresh();
-				setSelectedSDKInfoText(sdk);
+				updateSDKStatus(sdk);
 				// forcible rescan; dump cache
 				SymbianBuildContextDataCache.refreshForSDKs(new ISymbianSDK[] { sdk });
-				rescanSDKs(false);
+				sdkMgr.scanSDKs();
 			}
 		} else {
 			MessageDialog.openError(getShell(), Messages.getString("SDKPreferencePage.No_SDK_Selected"), Messages.getString("SDKPreferencePage.No_selected_SDK_detected")); //$NON-NLS-1$ //$NON-NLS-2$
 		}
-
 	}
-	
-	private void removeSdkButtonAction(){
-		ISymbianSDK sdk = (ISymbianSDK)((IStructuredSelection)sdkListTableViewer.getSelection()).getFirstElement();
-		if (sdk != null){
-			if (MessageDialog.openConfirm(getShell(), Messages.getString("SDKPreferencePage.Confirm_Delete") + sdk.getUniqueId() , Messages.getString("SDKPreferencePage.Confirm_Delete_Msg"))){ //$NON-NLS-1$ //$NON-NLS-2$
-				if (sdkMgr.removeSDK(sdk.getUniqueId())){
-					sdkList.remove(sdk);
-					sdkListTableViewer.refresh();
-					sdk = (ISymbianSDK)sdkListTableViewer.getElementAt(0);
-					if (sdk != null){
-						sdkListTableViewer.setSelection(new StructuredSelection(sdk), true);
-						setSelectedSDKInfoText(sdk);
-					}
-				}
-			}
-		}
+
+	private void handleScanForNewPluginsButton() {
+		scanForNewPlugins = scanForNewPluginsButton.getSelection();
 	}
-	
-	private void addNewSdkButtonAction(){
-		
-		AddSDKDialog dialog = new AddSDKDialog(getShell());
-		if (dialog.open() == AddSDKDialog.OK){
-			addSDKComponentTableItems();
-			sdkListTableViewer.refresh();
-		}
-	}
-	
-	private void rescanNowButtonAction(){
+
+	private void handleRescanButton() {
 		// forcible rescan; dump cache
 		SymbianBuildContextDataCache.refreshForSDKs(null);
-		rescanSDKs(true);
+		sdkMgr.scanSDKs();
 	}
-	
-	private void rescanSDKs(boolean scanForNewPlugins){
+
+	private void rescanSDKs(){
 		sdkListTableViewer.getTable().clearAll();
 		sdkListTableViewer.refresh();
 		sdkList.clear();
-		ISDKManager sdkMgr = SDKCorePlugin.getSDKManager();
-		sdkMgr.scanSDKs();
 		sdkList = sdkMgr.getSDKList();
 		addSDKComponentTableItems();
 		sdkListTableViewer.refresh();
-		
-		ISymbianSDK sdk = (ISymbianSDK)sdkListTableViewer.getElementAt(0);
-		if (sdk != null){
-			sdkListTableViewer.setSelection(new StructuredSelection(sdk), true);
-			setSelectedSDKInfoText(sdk);
-		}
-		
+		selectSDKEntry(0);
+
 		if (scanForNewPlugins){
 			NewPluginChecker.checkForNewlyInstalledPlugins(SDKUIPlugin.getDefault().getWorkbench());
 		}
 	}
-	
-	/**
-	 * Sets the selection listener action event to the CheckboxTableViewer.
-	 * 
-	 * @param sdkTable 
-	 */
-	private void addSDKTableViewerSelectionListener(){
-		sdkListTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			   public void selectionChanged(SelectionChangedEvent event) {
 
-			       if(event.getSelection() instanceof IStructuredSelection) {
-			           IStructuredSelection selection = (IStructuredSelection)event.getSelection();
-			           if (selection.size() == 1){
-			        	   ISymbianSDK sdk = (ISymbianSDK)selection.getFirstElement();
-			        	   sdkpropertiesButton.setEnabled(true);
-			          	   removeSdkButton.setEnabled(true);		
-			        	   setSelectedSDKInfoText(sdk);
-			        
-			           }else {
-			        	   sdkpropertiesButton.setEnabled(false);
-			        	   removeSdkButton.setEnabled(false);			        	   
-			           }	
-			       }
-			   }
-			} );
+	private void selectSDKEntry(int index) {
+		ISymbianSDK sdk = (ISymbianSDK)sdkListTableViewer.getElementAt(index);
+		if (sdk != null){
+			sdkListTableViewer.setSelection(new StructuredSelection(sdk), true);
+			sdkListTableViewer.getTable().setFocus();
+		}
+		updateSDKStatus(sdk);
 	}
-	
-	private void setSelectedSDKInfoText(ISymbianSDK sdk){
-		boolean sdkHasError = false;
-		String epocRootStr = sdk.getEPOCROOT();
-		File epocRootTest = new File(epocRootStr);
-		if (!epocRootTest.exists()) {
-			sdkHasError = true;
-			epocrootLabel.setText(EPOCROOT_LABEL + epocRootStr + Messages.getString("SDKPreferencePage.Path_Does_Not_Exist")); //$NON-NLS-1$
-			epocrootLabel.setForeground(RED);
-			epocrootLabel.setBackground(GRAY);
-		}
-		else {
-			epocrootLabel.setText(EPOCROOT_LABEL + epocRootStr);
-			epocrootLabel.setForeground(BLACK);
-			epocrootLabel.setBackground(GRAY);
-		}
-		
-		// Set platforms 
-		if (sdk.getAvailablePlatforms().size() == 0) {
-			sdkHasError = true;
-			availablePlatformsLabel.setText(PLATFORMS_LABEL + Messages.getString("SDKPreferencePage.Platforms_cannot_be_determined")); //$NON-NLS-1$
-			availablePlatformsLabel.setForeground(RED);
-			availablePlatformsLabel.setBackground(GRAY);
-		}
-		else {
-			availablePlatformsLabel.setText(PLATFORMS_LABEL + sdk.getAvailablePlatforms().toString());
-			availablePlatformsLabel.setForeground(BLACK);
-			availablePlatformsLabel.setBackground(GRAY);
+
+	private void setCheckedElements() {
+		Iterator<ISymbianSDK> iterator = sdkList.iterator();
+		while (iterator.hasNext()) {
+			ISymbianSDK sdk = iterator.next();
+			sdkListTableViewer.setChecked(sdk, sdk.isEnabled());
 		}
-		
-		// Set OS Version 
-		if (sdk.getOSVersion().getMajor() == 0) {
-			sdkHasError = true;
-			osVersionLabel.setText(OS_VERSION_LABEL + Messages.getString("SDKPreferencePage.OS_Version_Cannot_Be_Determined")); //$NON-NLS-1$
-			osVersionLabel.setForeground(RED);
-			osVersionLabel.setBackground(GRAY);
-		}
-		else if (!SDKCorePlugin.SUPPORTS_SBSV1_BUILDER && 
-				 (sdk.getOSVersion().getMajor() < 9 ||
-				 (sdk.getOSVersion().getMajor() == 9 && sdk.getOSVersion().getMinor() <= 4))){
-			sdkHasError = true;
-			osVersionLabel.setText(OS_VERSION_LABEL + "This OS version is not supported: " + sdk.getOSVersion()); 
-			osVersionLabel.setForeground(RED);
-			osVersionLabel.setBackground(GRAY);
-			
+	}
+
+	private void statusClear() {
+		iconLabel.setImage(null);
+		statusLabel.setText("");
+	}
+
+	private void statusError(String msg) {
+		String errorMsg = "Error : " + msg;
+		iconLabel.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_ERROR_TSK));
+		statusLabel.setText(errorMsg);
+		statusLabel.setForeground(red);
+		statusLabel.setBackground(gray);
+		statusLabel.update();
+		statusLabel.getParent().layout(true);
+	}
+
+	private void statusWarning(String msg) {
+		String warningMsg = "Warning : " + msg; //$NON-NLS-1$
+		iconLabel.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_WARN_TSK));
+		statusLabel.setText(warningMsg);
+		statusLabel.setForeground(black);
+		statusLabel.setBackground(gray);
+		statusLabel.update();
+		statusLabel.getParent().layout(true);
+	}
+
+	private void statusInfo(String msg) {
+		String infoMsg = "Info : " + msg; //$NON-NLS-1$
+		iconLabel.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_INFO_TSK));
+		statusLabel.setText(infoMsg);
+		statusLabel.setForeground(black);
+		statusLabel.setBackground(gray);
+		statusLabel.update();
+		statusLabel.getParent().layout(true);
+	}
+
+	private void updateSDKStatus(ISymbianSDK sdk){
+		// No SDK selected
+		if (sdk == null) {
+			statusWarning(Messages.getString("SDKPreferencePage.No_SDKs_Available_Message")); //$NON-NLS-1$
+			return;
 		} else {
-			if (sdk.getSDKOSBranch().length() > 0) {
-				osVersionLabel.setText(OS_VERSION_LABEL + sdk.getOSVersion().toString() + " (Branch = \"" + sdk.getSDKOSBranch() + "\")"); //$NON-NLS-1$ //$NON-NLS-2$
-			} else {
-				osVersionLabel.setText(OS_VERSION_LABEL + sdk.getOSVersion().toString());
+			// Check SDK EPOCROOT
+			String epocRootStr = sdk.getEPOCROOT();
+			IPath epocRoot = new Path(epocRootStr);
+			epocRoot = epocRoot.append("epoc32");
+			File epocRootFile = epocRoot.toFile();
+			if (!epocRootFile.exists()) {
+				statusError(Messages.getString("SDKPreferencePage.Invalid_Location_Message")); //$NON-NLS-1$
+				return;
 			}
-			osVersionLabel.setForeground(BLACK);
-			osVersionLabel.setBackground(GRAY);
-		}
-		
-		//  Get diagnostic check 
-		//if (lsdk.getSomeError().size() <= 0) {
-		if (sdkHasError){
-			diagnosticCheckLabel.setText(DIAGNOSTIC_CHECK_LABEL + Messages.getString("SDKPreferencePage.SDK_Cannot_Be_Used")); //$NON-NLS-1$
-			diagnosticCheckLabel.setForeground(RED);
-			diagnosticCheckLabel.setBackground(GRAY);
+
+			// Check SDK OS Version
+			if ((sdk.getOSVersion().getMajor() < 9 ||
+				(sdk.getOSVersion().getMajor() == 9 && sdk.getOSVersion().getMinor() < 5))) {
+				statusError(MessageFormat.format(
+						Messages.getString("SDKPreferencePage.Invalid_SDK_Message"),  //$NON-NLS-1$
+						sdk.getOSVersion().toString())); //$NON-NLS-1$
+				return;
+			}			
+
+			// No error
+			statusClear();
 		}
-		else {
-			// check for other types of errors:
-			if (!sdk.getToolsPath().toFile().exists()){
-				diagnosticCheckLabel.setText(DIAGNOSTIC_CHECK_LABEL + Messages.getString("SDKPreferencePage.No_Tools_Path") +  " " + sdk.getToolsPath().toOSString()); //$NON-NLS-1$
-				diagnosticCheckLabel.setForeground(RED);
-				diagnosticCheckLabel.setBackground(GRAY);
-			} else if (!sdk.getIncludePath().toFile().exists()){
-				diagnosticCheckLabel.setText(DIAGNOSTIC_CHECK_LABEL + Messages.getString("SDKPreferencePage.No_Include_Path") +  " " + sdk.getIncludePath().toOSString()); //$NON-NLS-1$
-				diagnosticCheckLabel.setForeground(RED);
-				diagnosticCheckLabel.setBackground(GRAY);
-			} else if ( ((sdk.getPrefixFile() == null) || (!sdk.getPrefixFile().exists())) && (sdk.getOSVersion().getMajor() >= 9)){
-					diagnosticCheckLabel.setText(DIAGNOSTIC_CHECK_LABEL + Messages.getString("SDKPreferencePage.No_HRH_File")); //$NON-NLS-1$
-					diagnosticCheckLabel.setForeground(RED);
-					diagnosticCheckLabel.setBackground(GRAY);
-			} else if ( ((sdk.isS60()) && sdk.getSDKVersion().getMajor() == 0)){
-				diagnosticCheckLabel.setText(DIAGNOSTIC_CHECK_LABEL + Messages.getString("SDKPreferencePage.No_SDK_Version")); //$NON-NLS-1$
-				diagnosticCheckLabel.setForeground(RED);
-				diagnosticCheckLabel.setBackground(GRAY);
-			} else {
-				// Everything is OK....
-				diagnosticCheckLabel.setText(DIAGNOSTIC_CHECK_LABEL + "OK\r\n "); //$NON-NLS-1$
-				diagnosticCheckLabel.setForeground(BLACK);
-				diagnosticCheckLabel.setBackground(GRAY);
-			}
-		}
-   } 
-	
-	protected List<ISymbianSDK> getSDKList(){
-		return sdkList;
 	}
-	
-	protected ISDKManager getSDKManager(){
-		return sdkMgr;
-	}
+
 }
\ No newline at end of file
--- a/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/SDKPropertiesDialog.java	Wed Jun 02 12:02:03 2010 -0500
+++ b/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/SDKPropertiesDialog.java	Wed Jun 02 17:08:00 2010 -0500
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2009-2010 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"
@@ -50,7 +50,6 @@
 
 public class SDKPropertiesDialog extends TrayDialog {
 	
-	SDKPreferencePage sdkPrefs;
 	ISymbianSDK sdk;
 	private CCombo osVersionCombo;
 	private CCombo sdkVersionCombo;
@@ -68,13 +67,12 @@
 	 * Create the dialog
 	 * @param parentShell
 	 */
-	public SDKPropertiesDialog(Shell parentShell, SDKPreferencePage sdkPrefs, ISymbianSDK sdk) {
+	public SDKPropertiesDialog(Shell parentShell, ISymbianSDK sdk) {
 		super(parentShell);
-		this.sdkPrefs = sdkPrefs;
 		this.sdk = sdk;
 		setShellStyle(getShellStyle() | SWT.RESIZE);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
 	 */
--- a/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/SDKUIPreferenceConstants.java	Wed Jun 02 12:02:03 2010 -0500
+++ b/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/SDKUIPreferenceConstants.java	Wed Jun 02 17:08:00 2010 -0500
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2009-2010 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"
@@ -27,4 +27,5 @@
 	public final static String PLAT_EKA2_ARMV5_ABIV1 = "platEKA2_ARMV5_ABIV1"; //$NON-NLS-1$
 	
 	public final static String LISTEN_FOR_DEVICES_XML_CHANGE = "listenForDevicesXMLChange"; //$NON-NLS-1$	
+	public final static String SCAN_FOR_NEW_PLUGINS = "scanForNewPlugins"; //$NON-NLS-1$	
 }
--- a/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/SDKUIPreferenceInitializer.java	Wed Jun 02 12:02:03 2010 -0500
+++ b/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/SDKUIPreferenceInitializer.java	Wed Jun 02 17:08:00 2010 -0500
@@ -34,6 +34,7 @@
 		IPreferenceStore store = SDKUIPlugin.getDefault().getPreferenceStore();
 		store.setDefault(SDKUIPreferenceConstants.ENABLE_BSF_SCANNER, false);
 		store.setDefault(SDKUIPreferenceConstants.LISTEN_FOR_DEVICES_XML_CHANGE, true);
+		store.setDefault(SDKUIPreferenceConstants.SCAN_FOR_NEW_PLUGINS, false);
 		
 		store.setDefault(SDKUIPreferenceConstants.PLAT_EKA2_WINSCW, true);
 		store.setDefault(SDKUIPreferenceConstants.PLAT_EKA2_GCCE, true);
--- a/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/messages.properties	Wed Jun 02 12:02:03 2010 -0500
+++ b/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/messages.properties	Wed Jun 02 17:08:00 2010 -0500
@@ -1,5 +1,4 @@
 SDKPropertiesDialog.SDK_Properties_For=SDK Properties for 
-SDKPreferencePage.Available_SDKs_Label=Available Symbian OS SDKs
 SDKPropertiesDialog.Available_SDK_Properties=Available SDK properties:
 SDKPropertiesDialog.Property=Property
 SDKPropertiesDialog.Value=Value
@@ -17,50 +16,38 @@
 SDKPropertiesDialog.Illegal_Verion_Title=Illegal Version Format Exception
 SDKPropertiesDialog.Illegal_SDKVerion_Msg=The SDK version is improperly formatted. Make sure it is of format major.minor[.increment].
 SDKPropertiesDialog.Publisher_Name=Publisher Name
-SDKPreferencePage.OS_Group_ToolTip=List of the SDKs found from devices.xml. Checkboxes indicate which SDKs you want to be available for Carbide.c++ use. SDKs in red are not configured properly.
-SDKPreferencePage.Remove_SDK_Label=Remove SDK
-SDKPreferencePage.SDK_Info_ToolTip=Displays information for the selected SDK.
 SDKPropertiesDialog.SDK_Description=SDK Description
 SDKPropertiesDialog.Duplicate_ID=Duplicate ID
-SDKPreferencePage.SDK_Info_Label=SDK Information
-SDKPreferencePage.Confirm_Delete=Confirm Delete 
 SDKPropertiesDialog.Duplicate_ID_Message=The SDK ID you have chosen is not unique. Please enter a unique SDK ID.
-SDKPreferencePage.SDK_Props_Button_Label=SDK Properties
-SDKPreferencePage.Diagnostic_Check_Label=Diagnostic Check:
 SDKPropertiesDialog.Zero_Len_ID=Zero Length ID
 SDKPropertiesDialog.Zero_Len_ID_Msg=Please enter a unique SDK ID
-SDKPreferencePage.Add_New_SDK_Label=Add New SDK
-SDKPreferencePage.OSVesions_ToolTip=The Symbian OS version (and branch) the selected OS is based on.
-SDKPreferencePage.Platforms_ToolTip=Platforms that are available in the SDK.
-SDKPreferencePage.No_SDKs_Available=No SDKs are available.
 SDKPropertiesDialog.Zero_Len_Name=Zero Length Name
-SDKPreferencePage.OSVersion_Label=OS Version:
-SDKPreferencePage.No_SDK_Selected=No SDK Selected
 SDKPropertiesDialog.Zero_Len_Name_Msg=Please enter an SDK name or choose one from the pop-up menu.
 SDKPropertiesDialog.EPOCROOT_No_Exist=EPOCROOT does not exist.
 SDKPropertiesDialog.EPOCROOT_No_Exist_Msg=Do you want to add an EPOCROOT value that does not exist?
 SDKPropertiesDialog.Zero_Len_EPOCROOT=Zero Length EPOCROOT
-SDKPreferencePage.Delete_SDK_ToolTip=Deletes an SDK from Carbide.c++ and devices.xml.
-SDKPreferencePage.Add_New_SDK_ToolTip=Adds a new SDK for use in Carbide.c++ and devices.xml.
-SDKPreferencePage.EPOC32_Loc_ToolTip=Location of the 'epoc32' folder.
-SDKPreferencePage.Available_Platforms=Available Platforms:
-SDKPreferencePage.Rescan_Button_Label=Rescan All SDKs
-SDKPreferencePage.Confirm_Delete_Msg=Are you sure you want to delete this SDK?\n\nThis entry will be removed from your devices.xml.
-SDKPreferencePage.Path_Does_Not_Exist=\ <- Path does not exist.
-SDKPreferencePage.SDK_Cannot_Be_Used=SDK cannot be used in Carbide.c++. Make sure your EPOCROOT is valid and the OS version is properly set.
 SDKPropertiesDialog.Zero_Len_EPOCROOT_Msg=Please enter an EPOCROOT.
 SDKPropertiesDialog.Invalid_Name_Attrib=Invalid 'name' attribute.
+SDKPropertiesDialog.Invalid_Name_Attrib_Msg=The SDK name must be of the format com.<vendor>.<sdk>
+
+SDKPreferencePage.Browse_Location_Label=...
+SDKPreferencePage.Add_Button_Label=Add
+SDKPreferencePage.Add_Button_ToolTip=Adds a new SDK for use in Carbide.c++.
+SDKPreferencePage.Delete_Button_Label=Delete
+SDKPreferencePage.Delete_Button_ToolTip=Delete an SDK from Carbide.c++.
+SDKPreferencePage.Properties_Button_Label=Properties
+SDKPreferencePage.Properties_Button_ToolTip=Show properties of the selected SDK.
+SDKPreferencePage.ScanForNewPlugins_Button_Label=Scan SDKs for installable Eclipse plugins
+SDKPreferencePage.Rescan_Button_Label=Rescan All SDKs
 SDKPreferencePage.Rescan_Button_ToolTip=Rebuilds all SDK entries (same as restarting the IDE).
-SDKPropertiesDialog.Invalid_Name_Attrib_Msg=The SDK name must be of the format com.<vendor>.<sdk>
-SDKPreferencePage.SDK_Props_Button_ToolTip=Shows editable and non-editable extended SDK properties for the selected SDK.
-SDKPreferencePage.Diagnostic_Check_ToolTip=Displays miscellaneous errors and warnings that may indicate problems with an SDK installation.
+SDKPreferencePage.No_SDKs_Available_Message=No SDKs are available.
 SDKPreferencePage.No_selected_SDK_detected=No selected SDK detected.
-SDKPreferencePage.No_Tools_Path=WARNING: Tools path does not exist:
-SDKPreferencePage.No_Include_Path=WARNING: Include path does not exist: 
-SDKPreferencePage.No_HRH_File=WARNING: Cannot find pre-include (HRH) file from \\epoc32\\tools\\variant\\variant.cfg."
-SDKPreferencePage.No_SDK_Version=WARNING: SDK version is not set. Some functionality may not work for this SDK.
-SDKPreferencePage.listerForDevicesXML=Listen for devices.xml changes outside of Carbide
-SDKPreferencePage.listerForDevicesXML_Tooltip=When enabled, Carbide will check for changes in the devices.xml file outside of Carbide and alert you when it has changed.
+SDKPreferencePage.List_of_Available_SDKs_ToolTip=List of available SDKs.
+SDKPreferencePage.SDK_Table_Enabled_Column_Label=Enabled
+SDKPreferencePage.SDK_Table_ID_Column_Label=SDK ID
+SDKPreferencePage.SDK_Table_Location_Column_Label=Location
+SDKPreferencePage.Invalid_Location_Message=Invalid location. '\\epoc32\\' does not exist at specified location.
+SDKPreferencePage.Invalid_SDK_Message=Invalid SDK. OS version {0} no supported. Must be verison 9.5 or higher.
 
 BuildPlatformFilterPage.Select_Platforms_Help=Select which platforms are visible when creating projects or new build configurations.
 BuildPlatformFilterPage.Specify_Platforms_Help=Specifies platforms to be displayed for OS 9.x and 8.1b
@@ -69,9 +56,6 @@
 BuildPlatformFilterPage.EKA1_Platforms_Label=EKA1 Platforms
 BuildPlatformFilterPage.BSF_Help=Scans for .bsf and/or .var files under \\epoc32\\tools for platform variants.
 BuildPlatformFilterPage.BSF_Label=Discover customization (.bsf) and Symbian Binary Variant (.var) platforms dynamically
-SDKPreferencePage.List_of_Available_SDKs_ToolTip=List of available SDKs from devices.xml.
-SDKPreferencePage.Platforms_cannot_be_determined=Platforms cannot be determined
-SDKPreferencePage.OS_Version_Cannot_Be_Determined=OS version cannot be determined
 NewPluginChecker.New_Plugins_Installed=New plugins have been installed from an SDK.
 NewPluginChecker.Restart_Msg=\n\nPress "Restart" to restart Carbide.c++ now or "Later" to apply changes next time you restart Carbide.c++.
 NewPluginChecker.Restart_Error=New plugins were installed into Carbide.c++ from an SDK. However, an error in the workbench prevented a Restart dialog from being displayed. You will need to restart Carbide in order to pick up the latest changes.
@@ -79,8 +63,6 @@
 RestartIDEDialog.Later=Later
 RestartIDEDialog.New_Plugin_Installed=New Plugins Installed
 AddSDKDialog.Add_New_SDK=Add New SDK
-AddSDKDialog.Missing_Vendor_Name=Missing Vendor/Name
-AddSDKDialog.Enter_Vendor_Name=Please enter an SDK vendor/name.
 AddSDKDialog.Missing_SDK_ID=Missing SDK ID.
 AddSDKDialog.Enter_SDK_ID=Please enter an SDK ID.
 AddSDKDialog.Malformed_EPOCROOT=Malformed EPOCROOT
@@ -96,21 +78,11 @@
 AddSDKDialog.SDK_ID_No_Spaces=SDK ID attribute cannot contain spaces.
 AddSDKDialog.Duplicate_ID=Duplicate device 'id'
 AddSDKDialog.Duplicate_ID_Msg=The SDK ID you have chosen already exists. Please choose another.
-AddSDKDialog.Invalid_name_attrib=Invalid 'name' attribute.
-AddSDKDialog.Invalid_name_attrib_msg=The SDK name must be of the format com.<vendor>.<sdk>
 AddSDKDialog.Enter_unique_id_for_sdk=Enter a unique identifier for the SDK you want to add.
 AddSDKDialog.SDK_ID=SDK ID:
 AddSDKDialog.Enter_location_where_epoc32_folder=Enter the location where the 'epoc32' folder exists.
 AddSDKDialog.Choose_folder_where_epoc32_exists=Choose the folder where 'epoc32' exists.
 AddSDKDialog.Browse=Browse...
-AddSDKDialog.Enter_name_of_sdk=Enter the name of the sdk. Format is com.<vendor>.<sdk>
-AddSDKDialog.Vendor=Vendor:
-AddSDKDialog.default_label_tooltip=Defines the default SDK for command-line builds. Has no impact on Carbide.c++ builds.
-AddSDKDialog.is_default=Is Default:
-AddSDKDialog.os_version_tooltip=Select the OS version. This will determine the available platforms you can build for.
-AddSDKDialog.os_version=OS Version:
-AddSDKDialog.select_sdk_tooltip=Select the SDK version (optional).
-AddSDKDialog.sdk_version=SDK Version:
 AddSDKDialog.Choose_location_for_EPOCROOT=Choose location for EPOCROOT.
 BuildTargetsPage.BuildTargetsTitle=Build Targets
 BuildTargetsPage.SymbianSDKS=Symbian OS SDKs
--- a/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/sdk/ui/SDKUIPlugin.java	Wed Jun 02 12:02:03 2010 -0500
+++ b/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/sdk/ui/SDKUIPlugin.java	Wed Jun 02 17:08:00 2010 -0500
@@ -27,11 +27,11 @@
 import com.nokia.carbide.cpp.internal.api.sdk.ICarbideDevicesXMLChangeListener;
 import com.nokia.carbide.cpp.internal.api.sdk.ISDKManagerInternal;
 import com.nokia.carbide.cpp.internal.api.sdk.ui.SBSv1PlatformFilterComposite;
-import com.nokia.carbide.cpp.internal.sdk.ui.NewPluginChecker;
 import com.nokia.carbide.cpp.internal.sdk.ui.SDKUIPreferenceConstants;
-import com.nokia.carbide.cpp.sdk.core.*;
+import com.nokia.carbide.cpp.sdk.core.ISDKManager;
+import com.nokia.carbide.cpp.sdk.core.SDKCorePlugin;
+import com.nokia.cpp.internal.api.utils.ui.QueryWithTristatePrefDialog;
 import com.nokia.cpp.internal.api.utils.ui.WorkbenchUtils;
-import com.nokia.cpp.internal.api.utils.ui.QueryWithTristatePrefDialog;
 
 /**
  * The activator class controls the plug-in life cycle
@@ -58,7 +58,6 @@
 	 */
 	public void start(BundleContext context) throws Exception {
 		super.start(context);
-		NewPluginChecker.checkForNewlyInstalledPlugins(getWorkbench());
 		
 		ISDKManager sdkMgr = SDKCorePlugin.getSDKManager();
 		sdkMgr.setPlatformList(SBSv1PlatformFilterComposite.getPlatFilterPrefsStore());	
--- a/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/sdk/ui/shared/AddSDKDialog.java	Wed Jun 02 12:02:03 2010 -0500
+++ b/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/sdk/ui/shared/AddSDKDialog.java	Wed Jun 02 17:08:00 2010 -0500
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2007-2010 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"
@@ -18,7 +18,6 @@
 package com.nokia.carbide.cpp.sdk.ui.shared;
 
 import java.io.File;
-import java.util.ArrayList;
 import java.util.List;
 
 import org.eclipse.jface.dialogs.IDialogConstants;
@@ -32,7 +31,6 @@
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.DirectoryDialog;
@@ -44,7 +42,6 @@
 
 import com.nokia.carbide.cpp.internal.sdk.ui.Messages;
 import com.nokia.carbide.cpp.internal.sdk.ui.SDKUIHelpIds;
-import com.nokia.carbide.cpp.sdk.core.ISDKManager;
 import com.nokia.carbide.cpp.sdk.core.ISymbianSDK;
 import com.nokia.carbide.cpp.sdk.core.SDKCorePlugin;
 import com.nokia.carbide.cpp.sdk.core.SymbianSDKFactory;
@@ -57,18 +54,10 @@
  */
 public class AddSDKDialog extends TrayDialog {
 
-	private Combo sdkVersionCombo;
-	private Combo osVersionCombo;
-	private Combo isDefaultCombo;
-	private Combo vendorCombo;
 	private Text deviceIDtext;
 	private Text epocRootText;
 	private Button browseEPOCROOTButton;
-	
-	public static final String DEFAULT_YES = "yes"; //$NON-NLS-1$
-	public static final String DEFAULT_NO  = "no"; //$NON-NLS-1$
-	public static final String AUTO_DETECT  = "(Auto-Detect)"; //$NON-NLS-1$
-	
+
 	/**
 	 * Create the dialog
 	 * @param parentShell
@@ -76,155 +65,17 @@
 	public AddSDKDialog(Shell parentShell) {
 		super(parentShell);
 	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+
+	/**
+	 * Create contents of the button bar
+	 * @param parent
 	 */
-	protected void configureShell(Shell shell) {
-		super.configureShell(shell);
-		shell.setText(Messages.getString("AddSDKDialog.Add_New_SDK")); //$NON-NLS-1$
-	}
-	
 	@Override
-	protected void okPressed() {
-		
-		if (deviceIDtext.getText().length() > 0){
-			if (!isValidIDName(deviceIDtext.getText())){
-				return;
-			}
-			
-			if (vendorCombo.getText().length() > 0){
-				if (!isValidVendorName(vendorCombo.getText())){
-					return;
-				}
-			} else {
-				MessageDialog.openError(getShell(), Messages.getString("AddSDKDialog.Missing_Vendor_Name"), Messages.getString("AddSDKDialog.Enter_Vendor_Name")); //$NON-NLS-1$ //$NON-NLS-2$
-				return;
-			}
-		} else {
-			MessageDialog.openError(getShell(), Messages.getString("AddSDKDialog.Missing_SDK_ID"), Messages.getString("AddSDKDialog.Enter_SDK_ID")); //$NON-NLS-1$ //$NON-NLS-2$
-			return;
-		}
-		
-		if (epocRootText.getText().length() > 1){
-			if (HostOS.IS_WIN32 && epocRootText.getText().charAt(1) != ':'){
-				MessageDialog.openError(getShell(), Messages.getString("AddSDKDialog.Malformed_EPOCROOT"), Messages.getString("AddSDKDialog.EPOCROOT_drive_spec")); //$NON-NLS-1$ //$NON-NLS-2$
-				return;
-			}
-			
-			if (epocRootText.getText().toUpperCase().endsWith("EPOC32") || epocRootText.getText().toUpperCase().endsWith("EPOC32\\")){ //$NON-NLS-1$ //$NON-NLS-2$
-				if (!MessageDialog.openConfirm(getShell(), Messages.getString("AddSDKDialog.Possible_wrong_epocroot"), Messages.getString("AddSDKDialog.EPOCROOT_Should_Point"))){ //$NON-NLS-1$ //$NON-NLS-2$
-					return;
-				}
-			} else {
-				File epocRootFile = new File(epocRootText.getText());
-				if (!epocRootFile.exists()){
-					if (!MessageDialog.openConfirm(getShell(), Messages.getString("AddSDKDialog.EPOCROOT_does_not_exist"), Messages.getString("AddSDKDialog.EPOCROOT_does_not_exist_msg"))){ //$NON-NLS-1$ //$NON-NLS-2$
-						return;
-					}
-				}
-				if (epocRootFile.toString().indexOf(" ") != -1){
-					// Paths should not have spaces...
-					MessageDialog.openError(getShell(), "EPOC Root Contains Spaces", Messages.getString("AddSDKDialog.EPOCROOT_contains_spaces")); //$NON-NLS-1$ //$NON-NLS-2$
-					return;
-					
-				}
-			}
-		} else {
-			if (epocRootText.getText().length() == 1 && epocRootText.getText().charAt(0) == '\\'){
-				// OK - Currently accept only a '\'. May need to reconsider side-effects
-			} else {
-				MessageDialog.openError(getShell(), Messages.getString("AddSDKDialog.Missing_EPOCROOT"), Messages.getString("AddSDKDialog.Please_enter_an_EPOCROOT")); //$NON-NLS-1$ //$NON-NLS-2$
-				return;
-			}
-		}
-		
-		// No objections raised, write the new device entry
-		String osVersionText = osVersionCombo.getText();
-		Version osVersion;
-		String osBranch = ""; //$NON-NLS-1$
-		if (osVersionText.equals(AUTO_DETECT)){
-			osVersion = new Version("0.0"); //$NON-NLS-1$
-		} else {
-			int len = osVersionText.length();
-			if (Character.isLetter(osVersionText.charAt(len-1))){
-				osBranch = osVersionText.substring(len-1);
-				osVersionText = osVersionText.substring(0, len-1);
-				osVersion = new Version(osVersionText);
-			} else {
-				osVersion = new Version(osVersionText);
-			}
-		}
-		
-		Version sdkVersion = new Version("0.0"); //$NON-NLS-1$
-		if (!sdkVersionCombo.getText().equals(AUTO_DETECT)){
-			sdkVersion = new Version(sdkVersionCombo.getText());
-		}
-		
-		ISymbianSDK sdk = SymbianSDKFactory.createInstance(deviceIDtext.getText(), 
-														   epocRootText.getText(), 
-														   vendorCombo.getText(), 
-														   osVersion,
-														   osBranch,
-														   sdkVersion, 
-														   false);
-		
-		SDKCorePlugin.getSDKManager().addSDK(sdk);
-		
-		List<ISymbianSDK> sdkList = SDKCorePlugin.getSDKManager().getSDKList();
-		if (sdkList != null){
-			sdkList.add(sdk);
-		}
-		
-		if (isDefaultCombo.getText().equals(DEFAULT_YES)){
-			sdk.setIsDefaultSDK(true);
-			SDKCorePlugin.getSDKManager().setDefaultSDK(sdk);
-		} else {
-			sdk.setIsDefaultSDK(false);
-		}
-		
-		super.okPressed();
-	}
-	
-	private boolean isValidIDName(String sdkID){
-		boolean isValid = true;
-		
-		
-		// check for spaces in ID
-		if (sdkID.contains(" ")){ //$NON-NLS-1$
-			MessageDialog.openError(getShell(), Messages.getString("AddSDKDialog.Invalid_SDK_ID"), Messages.getString("AddSDKDialog.SDK_ID_No_Spaces")); //$NON-NLS-1$ //$NON-NLS-2$
-			return false;
-		}
-		
-		// check that the ID is unique...
-		for (ISymbianSDK sdk : SDKCorePlugin.getSDKManager().getSDKList()){
-			if (sdk.getUniqueId().equalsIgnoreCase(sdkID)){
-				// id already exists, choose a different one...
-				MessageDialog.openError(getShell(), Messages.getString("AddSDKDialog.Duplicate_ID"), Messages.getString("AddSDKDialog.Duplicate_ID_Msg")); //$NON-NLS-1$ //$NON-NLS-2$
-				return false;
-			}
-		}
-		
-		return isValid;
-	}
-	
-	private boolean isValidVendorName(String vendor){
-		boolean isValid = true;
-		
-		String[] vendorSplit = vendor.split("[.]"); //$NON-NLS-1$
-		if (vendorSplit.length == 3){ 
-			if (!vendorSplit[0].toLowerCase().startsWith("com")){ //$NON-NLS-1$
-			isValid = false;
-			}
-		} else {
-			isValid = false;
-		}
-		
-		if (isValid == false){
-			MessageDialog.openError(getShell(), Messages.getString("AddSDKDialog.Invalid_name_attrib"), Messages.getString("AddSDKDialog.Invalid_name_attrib_msg")); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-			
-		return isValid;
+	protected void createButtonsForButtonBar(Composite parent) {
+		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
+				true);
+		createButton(parent, IDialogConstants.CANCEL_ID,
+				IDialogConstants.CANCEL_LABEL, false);
 	}
 
 	/**
@@ -257,81 +108,17 @@
 		browseEPOCROOTButton.setToolTipText(Messages.getString("AddSDKDialog.Choose_folder_where_epoc32_exists")); //$NON-NLS-1$
 		browseEPOCROOTButton.setText(Messages.getString("AddSDKDialog.Browse")); //$NON-NLS-1$
 		addButtonListener(browseEPOCROOTButton);
-		
-		final Label vendorLabel = new Label(container, SWT.NONE);
-		vendorLabel.setToolTipText(Messages.getString("AddSDKDialog.Enter_name_of_sdk")); //$NON-NLS-1$
-		vendorLabel.setText(Messages.getString("AddSDKDialog.Vendor")); //$NON-NLS-1$
 
-		vendorCombo = new Combo(container, SWT.NONE);
-		vendorCombo.setLayoutData(new GridData(250, SWT.DEFAULT));
-		new Label(container, SWT.NONE);
-		vendorCombo.add(ISymbianSDK.S60_SDK_NAME);
-		vendorCombo.add(ISymbianSDK.S80_SDK_NAME);
-		vendorCombo.add(ISymbianSDK.UIQ_SDK_NAME);
-		vendorCombo.add(ISymbianSDK.TECHVIEW_SDK_NAME);
-
-		final Label isDefaultLabel = new Label(container, SWT.NONE);
-		isDefaultLabel.setToolTipText(Messages.getString("AddSDKDialog.default_label_tooltip")); //$NON-NLS-1$
-		isDefaultLabel.setText(Messages.getString("AddSDKDialog.is_default")); //$NON-NLS-1$
-
-		isDefaultCombo = new Combo(container, SWT.READ_ONLY);
-		isDefaultCombo.setLayoutData(new GridData(250, SWT.DEFAULT));
-		new Label(container, SWT.NONE);
-		isDefaultCombo.add(DEFAULT_YES);
-		isDefaultCombo.add(DEFAULT_NO);
-		isDefaultCombo.select(1);
-
-		final Label osVersionLabel = new Label(container, SWT.NONE);
-		osVersionLabel.setToolTipText(Messages.getString("AddSDKDialog.os_version_tooltip")); //$NON-NLS-1$
-		osVersionLabel.setText(Messages.getString("AddSDKDialog.os_version")); //$NON-NLS-1$
-		//ISymbianMacroStore sms = 
-		List<String> osVersions = new ArrayList<String>();
-		ISDKManager sdkMgr = SDKCorePlugin.getSDKManager();
-		osVersions = sdkMgr.getSymbianMacroStore().getSupportedOSVersions();
-
-		osVersionCombo = new Combo(container, SWT.READ_ONLY);
-		osVersionCombo.setLayoutData(new GridData(250, SWT.DEFAULT));
-		new Label(container, SWT.NONE);
-		osVersionCombo.add(AUTO_DETECT);
-		
-		for (String currVer : osVersions){
-			osVersionCombo.add(currVer);
-		}
-		osVersionCombo.select(0);
-
-		final Label sdkVersionLabel = new Label(container, SWT.NONE);
-		sdkVersionLabel.setToolTipText(Messages.getString("AddSDKDialog.select_sdk_tooltip")); //$NON-NLS-1$
-		sdkVersionLabel.setText(Messages.getString("AddSDKDialog.sdk_version")); //$NON-NLS-1$
-
-		sdkVersionCombo = new Combo(container, SWT.READ_ONLY);
-		sdkVersionCombo.setLayoutData(new GridData(250, SWT.DEFAULT));
-		sdkVersionCombo.add(AUTO_DETECT);
-		sdkVersionCombo.select(0);
-		
-		List<String> sdkVerList = new ArrayList<String>();
-		sdkVerList = sdkMgr.getSymbianMacroStore().getSDKVersions();
-		for (String currVer : sdkVerList){
-			sdkVersionCombo.add(currVer);
-		}
-		
-		new Label(container, SWT.NONE);
-		
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, SDKUIHelpIds.SDK_ADD_DIALOG);
-
-		
 		return container;
 	}
 
-	/**
-	 * Create contents of the button bar
-	 * @param parent
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
 	 */
-	@Override
-	protected void createButtonsForButtonBar(Composite parent) {
-		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-				true);
-		createButton(parent, IDialogConstants.CANCEL_ID,
-				IDialogConstants.CANCEL_LABEL, false);
+	protected void configureShell(Shell shell) {
+		super.configureShell(shell);
+		shell.setText(Messages.getString("AddSDKDialog.Add_New_SDK")); //$NON-NLS-1$
 	}
 
 	/**
@@ -342,15 +129,84 @@
 		//return new Point(428, 256);
 		return super.getInitialSize();
 	}
-	
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
+	 */
+	@Override
+	protected void okPressed() {
+		
+		if (deviceIDtext.getText().length() > 0){
+			if (!isValidIDName(deviceIDtext.getText())){
+				return;
+			}
+		} else {
+			MessageDialog.openError(getShell(), Messages.getString("AddSDKDialog.Missing_SDK_ID"), Messages.getString("AddSDKDialog.Enter_SDK_ID")); //$NON-NLS-1$ //$NON-NLS-2$
+			return;
+		}
+
+		if (epocRootText.getText().length() > 1){
+			if (HostOS.IS_WIN32 && epocRootText.getText().charAt(1) != ':'){
+				MessageDialog.openError(getShell(), Messages.getString("AddSDKDialog.Malformed_EPOCROOT"), Messages.getString("AddSDKDialog.EPOCROOT_drive_spec")); //$NON-NLS-1$ //$NON-NLS-2$
+				return;
+			}
+			if (epocRootText.getText().toUpperCase().endsWith("EPOC32") || epocRootText.getText().toUpperCase().endsWith("EPOC32\\")){ //$NON-NLS-1$ //$NON-NLS-2$
+				if (!MessageDialog.openConfirm(getShell(), Messages.getString("AddSDKDialog.Possible_wrong_epocroot"), Messages.getString("AddSDKDialog.EPOCROOT_Should_Point"))){ //$NON-NLS-1$ //$NON-NLS-2$
+					return;
+				}
+			} else {
+				File epocRootFile = new File(epocRootText.getText());
+				if (!epocRootFile.exists()){
+					if (!MessageDialog.openConfirm(getShell(), Messages.getString("AddSDKDialog.EPOCROOT_does_not_exist"), Messages.getString("AddSDKDialog.EPOCROOT_does_not_exist_msg"))){ //$NON-NLS-1$ //$NON-NLS-2$
+						return;
+					}
+				}
+				if (epocRootFile.toString().indexOf(" ") != -1){
+					// Paths should not have spaces...
+					MessageDialog.openError(getShell(), "EPOC Root Contains Spaces", Messages.getString("AddSDKDialog.EPOCROOT_contains_spaces")); //$NON-NLS-1$ //$NON-NLS-2$
+					return;
+				}
+			}
+		} else {
+			if (epocRootText.getText().length() == 1 && epocRootText.getText().charAt(0) == '\\'){
+				// OK - Currently accept only a '\'. May need to reconsider side-effects
+			} else {
+				MessageDialog.openError(getShell(), Messages.getString("AddSDKDialog.Missing_EPOCROOT"), Messages.getString("AddSDKDialog.Please_enter_an_EPOCROOT")); //$NON-NLS-1$ //$NON-NLS-2$
+				return;
+			}
+		}
+
+		// No objections raised, write the new device entry
+		String vendorName = ISymbianSDK.S60_SDK_NAME;
+		Version osVersion = new Version("9.4.0"); //$NON-NLS-1$
+		String osBranch = ""; //$NON-NLS-1$
+		Version sdkVersion = new Version("0.0"); //$NON-NLS-1$
+		ISymbianSDK sdk = SymbianSDKFactory.createInstance(deviceIDtext.getText(), 
+														   epocRootText.getText(), 
+														   vendorName, 
+														   osVersion,
+														   osBranch,
+														   sdkVersion, 
+														   false);
+		sdk.setEnabled(true);
+		SDKCorePlugin.getSDKManager().addSDK(sdk);
+		List<ISymbianSDK> sdkList = SDKCorePlugin.getSDKManager().getSDKList();
+		if (sdkList != null){
+			sdkList.add(sdk);
+		}
+		sdk.setIsDefaultSDK(false);
+		super.okPressed();
+	}
+
 	/**
 	 * Sets the listener event to a button.
 	 * 
 	 * @param aButton
 	 */
-	private void addButtonListener( final Button aButton ) {
+	private void addButtonListener(final Button aButton) {
 		SelectionListener listener = new SelectionAdapter() {
-			public void widgetSelected( SelectionEvent e )  {
+			public void widgetSelected(SelectionEvent e)  {
 				if (e.getSource().equals(browseEPOCROOTButton)) {
 					browseEPOCROOT();
 				}
@@ -358,7 +214,7 @@
 		};
 		aButton.addSelectionListener(listener);
 	}
-	
+
 	private void browseEPOCROOT(){
         DirectoryDialog browseDir = new DirectoryDialog(getShell(), SWT.OPEN);
         browseDir.setMessage(Messages.getString("AddSDKDialog.Choose_location_for_EPOCROOT")); //$NON-NLS-1$
@@ -369,4 +225,25 @@
         }
 	}
 
+	private boolean isValidIDName(String sdkID){
+		boolean isValid = true;
+
+		// check for spaces in ID
+		if (sdkID.contains(" ")){ //$NON-NLS-1$
+			MessageDialog.openError(getShell(), Messages.getString("AddSDKDialog.Invalid_SDK_ID"), Messages.getString("AddSDKDialog.SDK_ID_No_Spaces")); //$NON-NLS-1$ //$NON-NLS-2$
+			return false;
+		}
+
+		// check that the ID is unique...
+		for (ISymbianSDK sdk : SDKCorePlugin.getSDKManager().getSDKList()){
+			if (sdk.getUniqueId().equalsIgnoreCase(sdkID)){
+				// id already exists, choose a different one...
+				MessageDialog.openError(getShell(), Messages.getString("AddSDKDialog.Duplicate_ID"), Messages.getString("AddSDKDialog.Duplicate_ID_Msg")); //$NON-NLS-1$ //$NON-NLS-2$
+				return false;
+			}
+		}
+
+		return isValid;
+	}
+
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/com.nokia.carbide.cpp.ui/src/com/nokia/carbide/cpp/ui/TextAndDialogCellEditor.java	Wed Jun 02 17:08:00 2010 -0500
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia Corporation
+ * 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:
+ *    Nokia - initial API and implementation
+ *******************************************************************************/
+
+package com.nokia.carbide.cpp.ui;
+
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.*;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.widgets.*;
+
+/**
+ * This class allows a CellEditor to provide editable text as well
+ * as a button which will launch a dialog to edit the data in a different way.
+ * @author dpodwall
+ * @author ddubrow
+ * @author eswartz
+ */
+public abstract class TextAndDialogCellEditor extends DialogCellEditor {
+
+	private TextAndDialogCellEditor.CustomTextCellEditor textCellEditor;
+	private Text text;
+	private Button dialogButton;
+	
+	public TextAndDialogCellEditor(Composite parent) {
+		super(parent);
+	}
+
+	@Override
+	protected Control createContents(Composite parent) {
+		textCellEditor = new CustomTextCellEditor(parent);
+		text = (Text) textCellEditor.getControl();
+		
+		// Forward all events from the TextCellEditor to
+		// this cell editor's listener
+		textCellEditor.addListener(new ICellEditorListener() {
+
+			public void applyEditorValue() {
+				// Ignore
+			}
+
+			public void cancelEditor() {
+				fireCancelEditor();
+			}
+
+			public void editorValueChanged(boolean oldValidState, boolean newValidState) {
+				fireEditorValueChanged(oldValidState, newValidState);
+			}
+		});
+		
+		textCellEditor.addPropertyChangeListener(new IPropertyChangeListener() {
+
+			public void propertyChange(PropertyChangeEvent event) {
+				// text cell editor uses fireEnablementChanged
+				fireEnablementChanged(event.getProperty());
+			}
+			
+		});
+		
+		return text;
+	}
+	
+	@Override
+	protected Button createButton(Composite parent) {
+		dialogButton = super.createButton(parent);
+		return dialogButton;
+	}
+	
+	protected Button getButton() {
+		return dialogButton;
+	}
+	
+	void applyEditorValueAndDeactivate() {
+		String newValue = (String)getValue();
+
+		doSetValue(newValue);
+		markDirty();
+		setValueValid(true);
+		fireApplyEditorValue();
+		deactivate();
+	}
+	
+    protected void keyReleaseOccured(KeyEvent keyEvent) {
+        if (keyEvent.character == '\r') { // Enter character
+        	applyEditorValueAndDeactivate();
+        }
+        else if (keyEvent.character == '\u001b') { // Escape character
+            fireCancelEditor();
+        } 
+        else if (keyEvent.character == '\t') { // tab key
+            applyEditorValueAndDeactivate();
+        }
+    }
+
+	@Override
+	protected void updateContents(Object value) {
+		textCellEditor.setValue(value != null ? value : ""); //$NON-NLS-1$
+	}
+
+	@Override
+	protected void doSetFocus() {
+		text.setVisible(true);		
+		textCellEditor.setFocus();
+	}
+
+	@Override
+	protected Object doGetValue() {
+		String result = (String) textCellEditor.getValue();
+		return result;
+	}
+
+	@Override
+	protected void doSetValue(Object value) {
+		textCellEditor.setValue(value);
+	}
+
+	@Override
+	protected void focusLost() {
+		super.focusLost();
+	}
+
+	public boolean isCopyEnabled() {
+		return textCellEditor.isCopyEnabled();
+	}
+
+	public boolean isCutEnabled() {
+		return textCellEditor.isCutEnabled();
+	}
+
+	public boolean isDeleteEnabled() {
+		return textCellEditor.isDeleteEnabled();
+	}
+
+	public boolean isFindEnabled() {
+		return textCellEditor.isFindEnabled();
+	}
+
+	public boolean isPasteEnabled() {
+		return textCellEditor.isPasteEnabled();
+	}
+
+	public boolean isRedoEnabled() {
+		return textCellEditor.isRedoEnabled();
+	}
+
+	public boolean isSaveAllEnabled() {
+		return textCellEditor.isSaveAllEnabled();
+	}
+
+	public boolean isSelectAllEnabled() {
+		return textCellEditor.isSelectAllEnabled();
+	}
+
+	public boolean isUndoEnabled() {
+		return textCellEditor.isUndoEnabled();
+	}
+
+	public boolean isValueValid() {
+		return textCellEditor.isValueValid();
+	}
+
+	public void performCopy() {
+		textCellEditor.performCopy();
+	}
+
+	public void performCut() {
+		textCellEditor.performCut();
+	}
+
+	public void performDelete() {
+		textCellEditor.performDelete();
+	}
+
+	public void performFind() {
+		textCellEditor.performFind();
+	}
+
+	public void performPaste() {
+		textCellEditor.performPaste();
+	}
+
+	public void performRedo() {
+		textCellEditor.performRedo();
+	}
+
+	public void performSelectAll() {
+		textCellEditor.performSelectAll();
+	}
+
+	public void performUndo() {
+		textCellEditor.performUndo();
+	}
+	
+	static class CustomTextCellEditor extends TextCellEditor {
+
+		public CustomTextCellEditor(Composite parent) {
+			super(parent);
+		}
+
+		@Override
+		protected void focusLost() {
+			// don't deactivate everything when focus is lost,
+			// it will be handled in the outer cell editor
+			if (isActivated()) {
+				fireApplyEditorValue();
+			}		
+		}
+	}
+	
+}
+
+
+