core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/SDKPreferencePage.java
branchC3_BUILDER_WORK
changeset 1421 587da7cb64b7
parent 1352 2953a4d4c5d9
child 1431 536cdcdc768b
--- 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