fix bug 11077 and bug 11033
authortimkelly
Fri, 23 Apr 2010 11:41:51 -0500
changeset 1270 ad41cb5ef65f
parent 1266 15644163b1a2
child 1272 12890c0d8bfd
fix bug 11077 and bug 11033
builder/com.nokia.carbide.cdt.builder/src/com/nokia/carbide/cdt/internal/api/builder/ui/ManageConfigurationsDialog.java
builder/com.nokia.carbide.cdt.builder/src/com/nokia/carbide/cdt/internal/api/builder/ui/messages.properties
core/com.nokia.carbide.cpp.sdk.core/src/com/nokia/carbide/cpp/internal/api/sdk/SBSv2Utils.java
core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/api/sdk/ui/BuildPlatformFilterPage.java
core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/api/sdk/ui/SBSv2PlatformFilterComposite.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/shared/BuildTargetsPage.java
--- a/builder/com.nokia.carbide.cdt.builder/src/com/nokia/carbide/cdt/internal/api/builder/ui/ManageConfigurationsDialog.java	Fri Apr 23 09:37:47 2010 -0500
+++ b/builder/com.nokia.carbide.cdt.builder/src/com/nokia/carbide/cdt/internal/api/builder/ui/ManageConfigurationsDialog.java	Fri Apr 23 11:41:51 2010 -0500
@@ -30,17 +30,22 @@
 import org.eclipse.jface.viewers.TreeNode;
 import org.eclipse.jface.viewers.TreeNodeContentProvider;
 import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.TreeItem;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;
+import org.eclipse.ui.dialogs.PreferencesUtil;
 
 import com.nokia.carbide.cdt.builder.CarbideBuilderPlugin;
 import com.nokia.carbide.cdt.builder.project.ICarbideBuildConfiguration;
@@ -51,7 +56,10 @@
 import com.nokia.carbide.cpp.internal.qt.core.QtConfigFilter;
 import com.nokia.carbide.cpp.internal.qt.core.QtCorePlugin;
 import com.nokia.carbide.cpp.internal.qt.core.QtSDKFilter;
-import com.nokia.carbide.cpp.sdk.core.*;
+import com.nokia.carbide.cpp.sdk.core.ISDKManager;
+import com.nokia.carbide.cpp.sdk.core.ISymbianBuildContext;
+import com.nokia.carbide.cpp.sdk.core.ISymbianSDK;
+import com.nokia.carbide.cpp.sdk.core.SDKCorePlugin;
 import com.nokia.carbide.cpp.sdk.ui.shared.BuildTargetTreeNode;
 import com.nokia.cpp.internal.api.utils.core.Check;
 
@@ -187,23 +195,8 @@
 			filteringContentProviderWrapper.setConfigFilter(new QtConfigFilter());
 		}
 		
-		boolean sbsv2Project = CarbideBuilderPlugin.getBuildManager().isCarbideSBSv2Project(cpi.getProject());
+		drawSDKConfigTree();
 		
-		properSdkViewer.setContentProvider(filteringContentProviderWrapper);
-		properSdkViewer.setInput(BuildTargetTreeNode.getTreeViewerInput(sbsv2Project));
-		propagateSdkTree();
-		properSdkViewer.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				// Disclose the tree if the user selected the parent node
-				Object obj = event.getElement();
-				if (obj instanceof BuildTargetTreeNode){
-					BuildTargetTreeNode bttn = (BuildTargetTreeNode)obj;
-						properSdkViewer.setExpandedState(bttn, true);
-				}
-				validatePage();
-			}
-		});
-
 		BrokenConfigurationInProjectTreeNode[] brokenTreeInput = BrokenConfigurationInProjectTreeNode.getTreeViewerInput(cpi);
 		if (brokenTreeInput.length > 0) {
 			final Label uninstalledSdkConfigLabel = new Label(container, SWT.NONE);
@@ -234,11 +227,44 @@
 		sdkStaticHelp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
 		sdkStaticHelp.setText(Messages.getString("ManageConfigurationsDialog.Select_config_help_text")); //$NON-NLS-1$
 		
+		Link fLink = new Link(parent, SWT.WRAP);
+		fLink.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		fLink.setText("\n " + Messages.getString("ManageConfigurationsDialog.Select_Filtering_Prefs_Link")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		fLink.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1));
+		fLink.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				// I don't see a way to open it to a specific tab, only the page
+				if (Window.OK == PreferencesUtil.createPreferenceDialogOn(getShell(), "com.nokia.carbide.cpp.sdk.ui.preferences.BuildPlatformFilterPage", null, null, 0).open()){ //$NON-NLS-1$
+					drawSDKConfigTree();
+				}
+			}
+		});
+		
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, CarbideCPPBuilderUIHelpIds.CARBIDE_BUILDER_MANAGE_CONFIGURATIONS_DLG);
 		
 		return container;
 	}
 
+	private void drawSDKConfigTree() {
+		boolean sbsv2Project = CarbideBuilderPlugin.getBuildManager().isCarbideSBSv2Project(cpi.getProject());
+	
+		properSdkViewer.setContentProvider(filteringContentProviderWrapper);
+		properSdkViewer.setInput(BuildTargetTreeNode.getTreeViewerInput(sbsv2Project));
+		propagateSdkTree();
+		properSdkViewer.addCheckStateListener(new ICheckStateListener() {
+			public void checkStateChanged(CheckStateChangedEvent event) {
+				// Disclose the tree if the user selected the parent node
+				Object obj = event.getElement();
+				if (obj instanceof BuildTargetTreeNode){
+					BuildTargetTreeNode bttn = (BuildTargetTreeNode)obj;
+						properSdkViewer.setExpandedState(bttn, true);
+				}
+				validatePage();
+			}
+		});
+		
+	}
+
 	/**
 	 * Create contents of the button bar
 	 * @param parent
--- a/builder/com.nokia.carbide.cdt.builder/src/com/nokia/carbide/cdt/internal/api/builder/ui/messages.properties	Fri Apr 23 09:37:47 2010 -0500
+++ b/builder/com.nokia.carbide.cdt.builder/src/com/nokia/carbide/cdt/internal/api/builder/ui/messages.properties	Fri Apr 23 11:41:51 2010 -0500
@@ -4,6 +4,7 @@
 ManageConfigurationsDialog.Unavailable_Config_Label_ToolTip=Show the SDKs and build configurations that are unavailable to the current project
 ManageConfigurationsDialog.Unavailable_SDks_and_Configs=\n Unavailable SDKs and Configurations:\n\n
 ManageConfigurationsDialog.Select_config_help_text=\n Checkmark a configuration to add it to the current project, or uncheck a configuration to remove it from the build configuration.
+ManageConfigurationsDialog.Select_Filtering_Prefs_Link=See <a>Platform Filtering Preferences</a> to configure displayed build configurations.
 
 MMPSelectionUI.BuildOrderColumnLabel=Build order
 MMPSelectionUI.FileNameColumnLabel=File name
--- a/core/com.nokia.carbide.cpp.sdk.core/src/com/nokia/carbide/cpp/internal/api/sdk/SBSv2Utils.java	Fri Apr 23 09:37:47 2010 -0500
+++ b/core/com.nokia.carbide.cpp.sdk.core/src/com/nokia/carbide/cpp/internal/api/sdk/SBSv2Utils.java	Fri Apr 23 11:41:51 2010 -0500
@@ -30,6 +30,7 @@
 import org.eclipse.core.filesystem.URIUtil;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Preferences;
 import org.eclipse.core.runtime.preferences.IEclipsePreferences;
 import org.eclipse.core.runtime.preferences.InstanceScope;
 import org.osgi.framework.Version;
@@ -54,6 +55,7 @@
 public class SBSv2Utils {
 
 	private static final String SBSV2_FILTERED_CONFIGS_STORE = "sbsv2FilteredConfigs"; //$NON-NLS-1$
+	private static final String SBSV2_FILTERED_CONFIGS_STORE_INITED = "sbsv2FilteredConfigsInited"; //$NON-NLS-1$
 	private static final String SBSV2_FILTERED_CONFIGS_DELIMETER = ";"; //$NON-NLS-1$
 
 	/**
@@ -201,6 +203,8 @@
 	public static List<ISymbianBuildContext> getFilteredSBSv2BuildContexts(ISymbianSDK sdk) {
 		List<ISymbianBuildContext> contexts = new ArrayList<ISymbianBuildContext>();
 		
+		initDefaultConfigsToFilter();
+		
 		Iterator it = getUnfilteredSBSv2BuildConfigurations(false).entrySet().iterator();
 		
 		while (it.hasNext()){
@@ -243,6 +247,31 @@
 	}
 
 	/**
+	 * There are many build aliases presented by default from Raptor
+	 * Filter out those that are less commonly used on new workspace creation.
+	 */
+	public static void initDefaultConfigsToFilter() {
+		IEclipsePreferences prefs = new InstanceScope().getNode(SDKCorePlugin.getPluginId());
+		String inited = prefs.get(SBSV2_FILTERED_CONFIGS_STORE_INITED, "");
+		if (inited == null || inited.length() == 0){
+			Iterator it = getUnfilteredSBSv2BuildConfigurations(false).entrySet().iterator(); 
+			List<String> defaultConfigsToFilter = new ArrayList<String>();
+			while (it.hasNext()){ 
+				Map.Entry buildConfigPair = (Map.Entry)it.next();
+				String buildAlias = (String)buildConfigPair.getKey();
+				if (buildAlias.toLowerCase().startsWith("armv6") ||
+					buildAlias.toLowerCase().startsWith("armv7") ||
+					buildAlias.toLowerCase().startsWith("armv9")){
+					defaultConfigsToFilter.add(buildAlias);
+				}
+			}
+			prefs.put(SBSV2_FILTERED_CONFIGS_STORE_INITED, "true");
+			setSBSv2ConfigurationsToFilter(defaultConfigsToFilter.toArray(new String[defaultConfigsToFilter.size()]));
+			
+		}
+	}
+
+	/**
 	 * Whether or not to display SBSv1 builder UI
 	 * @return true if SBSv1 is available, false otherwise
 	 */
@@ -365,9 +394,9 @@
 		return sbsPath != null ? sbsPath : new Path(sbsScriptName);  // dummy
 	}
 	
-	private static List<ISymbianBuildContext> sortContexts(List<ISymbianBuildContext> contexts){
-		
-		// 3 sorting stages to handle long Raptor aliases, and multiple aliases that have a similar platform and target prefix (e.g. armv5_urel)
+	private static List<ISymbianBuildContext> sortContexts(List<ISymbianBuildContext> contexts){ 
+    	
+		// 2 sorting stages to handle long Raptor aliases, and multiple aliases that have a similar platform and target prefix (e.g. armv5_urel)
 		
 		Collections.sort(contexts, new Comparator<ISymbianBuildContext>() {
 
@@ -377,10 +406,23 @@
 				String sbsAlias2 = o2.getSBSv2Alias();
 				
 				if (o1.getPlatformString().equals(o2.getPlatformString())) {
-					if (o1.getSBSv2Alias().split("_").length == 2 && o2.getSBSv2Alias().split("_").length == 2)
+					if (o1.getSBSv2Alias().split("_").length != o2.getSBSv2Alias().split("_").length)
 						return o1.getTargetString().compareTo(o2.getTargetString());
-					else if (sbsAlias1.split("_").length >= 3 && sbsAlias1.split("_").length >= 3)
-						return 1;
+					else if (sbsAlias1.split("_").length >= 3){
+						String temp1[] = sbsAlias1.split("_");
+						String temp2[] = sbsAlias2.split("_");
+						String suffix1 = "";
+						String suffix2 = "";
+						for (int i = 2; i < temp1.length; i++){
+							suffix1 += temp1[i] + "_";
+						}
+						
+						for (int i = 2; i < temp2.length; i++){
+							suffix2 += temp2[i] + "_";
+						}
+						
+						return suffix1.compareTo(suffix2);
+					} 
 				} else {
 					if (sbsAlias1.toUpperCase().startsWith(ISymbianBuildContext.EMULATOR_PLATFORM)) {
 						return -1;
@@ -389,7 +431,6 @@
 					} 
 				}
 				return sbsAlias1.compareTo(sbsAlias2);
-				
 			}
 			
 		});
@@ -401,7 +442,10 @@
 				String sbsAlias1 = o1.getSBSv2Alias();
 				String sbsAlias2 = o2.getSBSv2Alias();
 				
-				if (sbsAlias1.split("_").length >= 3 && sbsAlias1.split("_").length >= 3 && !sbsAlias1.equals(sbsAlias2)){
+				if (o1.getSBSv2Alias().split("_").length == 3 && o2.getSBSv2Alias().split("_").length == 3 &&
+						o1.getPlatformString().equals(o2.getPlatformString()))
+					return o1.getTargetString().compareTo(o2.getTargetString());
+				else if (sbsAlias1.split("_").length >= 3 && sbsAlias1.split("_").length >= 3 && !sbsAlias1.equals(sbsAlias2)){
 					String temp1[] = sbsAlias1.split("_");
 					String temp2[] = sbsAlias2.split("_");
 					String suffix1 = "";
@@ -421,34 +465,8 @@
 			}
 		});
 		
-		// Sort the target string for long aliases
-		Collections.sort(contexts, new Comparator<ISymbianBuildContext>() {
-
-			public int compare(ISymbianBuildContext o1, ISymbianBuildContext o2) {
-				String sbsAlias1 = o1.getSBSv2Alias();
-				String sbsAlias2 = o2.getSBSv2Alias();
-				String temp1[] = sbsAlias1.split("_");
-				String temp2[] = sbsAlias2.split("_");
-				String suffix1 = "";
-				String suffix2 = "";
-				for (int i = 2; i < temp1.length; i++){
-					suffix1 += temp1[i] + "_";
-				}
-				
-				for (int i = 2; i < temp2.length; i++){
-					suffix2 += temp2[i] + "_";
-				}
-				
-				if (sbsAlias1.split("_").length >= 3 && sbsAlias1.split("_").length >= 3 && suffix1.equals(suffix2)){
-					return o1.getTargetString().compareTo(o2.getTargetString());
-				} 
-				
-				return 0;	
-			}
-		});
-		
-		return contexts;
-	}
+    	return contexts; 
+    }
 	
 	/**
 	 * If a variant is defined and it changes the output directory, return the directory name.
--- a/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/api/sdk/ui/BuildPlatformFilterPage.java	Fri Apr 23 09:37:47 2010 -0500
+++ b/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/api/sdk/ui/BuildPlatformFilterPage.java	Fri Apr 23 11:41:51 2010 -0500
@@ -53,6 +53,16 @@
 		GridData tabFolderGridData = new GridData(SWT.FILL, SWT.FILL, true, true);
 		tabFolder.setLayoutData(tabFolderGridData);
 		
+		if (SBSv2Utils.enableSBSv2Support()) {
+			TabItem sbsv2TabItem = new TabItem(tabFolder, SWT.NONE);
+			sbsv2TabItem.setText(Messages.getString("BuildPlatformFilterPage.SBSv2TabText")); //$NON-NLS-1$
+			sbsv2TabItem.setToolTipText(Messages.getString("BuildPlatformFilterPage.SBSv2TabToolTip")); //$NON-NLS-1$
+
+			sbsv2Tab = new SBSv2PlatformFilterComposite(tabFolder);
+			sbsv2Tab.createControls();
+			sbsv2TabItem.setControl(sbsv2Tab);
+		}
+		
 		if (SBSv2Utils.enableSBSv1Support()) {
 			TabItem sbsv1TabItem = new TabItem(tabFolder, SWT.NONE);
 			sbsv1TabItem.setText(Messages.getString("BuildPlatformFilterPage.SBSv1TabText")); //$NON-NLS-1$
@@ -62,16 +72,6 @@
 			sbsv1Tab.createControls();
 			sbsv1TabItem.setControl(sbsv1Tab);
 		}
-		
-		if (SBSv2Utils.enableSBSv2Support()) {
-			TabItem sbsv2TabItem = new TabItem(tabFolder, SWT.NONE);
-			sbsv2TabItem.setText(Messages.getString("BuildPlatformFilterPage.SBSv2TabText")); //$NON-NLS-1$
-			sbsv2TabItem.setToolTipText(Messages.getString("BuildPlatformFilterPage.SBSv2TabToolTip")); //$NON-NLS-1$
-
-			sbsv2Tab = new SBSv2PlatformFilterComposite(tabFolder);
-			sbsv2Tab.createControls();
-			sbsv2TabItem.setControl(sbsv2Tab);
-		}
 
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(super.getControl(), SDKUIHelpIds.SDK_BUILD_FILTER_PAGE);
 		
--- a/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/api/sdk/ui/SBSv2PlatformFilterComposite.java	Fri Apr 23 09:37:47 2010 -0500
+++ b/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/api/sdk/ui/SBSv2PlatformFilterComposite.java	Fri Apr 23 11:41:51 2010 -0500
@@ -98,6 +98,8 @@
 	
 	private void initTable(boolean refreshList) {
 
+		SBSv2Utils.initDefaultConfigsToFilter();
+		
 		Object[] keySet = SBSv2Utils.getUnfilteredSBSv2BuildConfigurations(refreshList).keySet().toArray();
 		List<String> sbsAliases = new ArrayList<String>();
 		for (Object key : keySet)
@@ -123,7 +125,12 @@
 	public void setDefaults(){
 		initTable(true);
 		for (TableItem item : tableViewer.getTable().getItems()) {
-			if (item.getText().toLowerCase().startsWith("tool") || item.getText().toLowerCase().startsWith("gccxml")) {
+			if (item.getText().toLowerCase().startsWith("tool")  || 
+				item.getText().toLowerCase().startsWith("gccxml") ||
+				item.getText().toLowerCase().startsWith("armv6")  ||
+				item.getText().toLowerCase().startsWith("armv7")  || 
+				item.getText().toLowerCase().startsWith("armv7")  ||
+				item.getText().toLowerCase().startsWith("armv9")) {
 				tableViewer.setChecked(item.getData(), false);
 			} else {
 				tableViewer.setChecked(item.getData(), true);
--- a/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/messages.properties	Fri Apr 23 09:37:47 2010 -0500
+++ b/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/messages.properties	Fri Apr 23 11:41:51 2010 -0500
@@ -123,6 +123,7 @@
 BuildTargetsPage.NoBuildConfigsSelectedError=Please select at least one build configuration.
 BuildTargetsPage.DifferentDrivesError=There are known build problems when the bld.inf file and SDK are on different drives ({0})
 BuildTargetsPage.NoDriveSpecWarning=You have chosen an SDK EPOCROOT without a drive specification. Building will work but other features such as the indexer and MMP editor may not fully function.
+BuildTargetsPage.Select_Filtering_Prefs_Link=See <a>Platform Filtering Preferences</a> to configure displayed build configurations.
 
 BuildPlatformFilterPage.SBSv1TabText=SBSv1
 BuildPlatformFilterPage.SBSv1TabToolTip=Symbian OS Build System version 1 builder platform filtering
--- a/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/sdk/ui/shared/BuildTargetsPage.java	Fri Apr 23 09:37:47 2010 -0500
+++ b/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/sdk/ui/shared/BuildTargetsPage.java	Fri Apr 23 11:41:51 2010 -0500
@@ -18,14 +18,24 @@
 package com.nokia.carbide.cpp.sdk.ui.shared;
 
 import java.text.MessageFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.jface.dialogs.DialogPage;
 import org.eclipse.jface.dialogs.IDialogPage;
-import org.eclipse.jface.viewers.*;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.IFilter;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TreeNode;
+import org.eclipse.jface.viewers.TreeNodeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
 import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
@@ -33,9 +43,14 @@
 import org.eclipse.swt.graphics.Font;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.*;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.TreeItem;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;
+import org.eclipse.ui.dialogs.PreferencesUtil;
 
 import com.nokia.carbide.cpp.internal.api.sdk.ui.TemplateUtils;
 import com.nokia.carbide.cpp.internal.sdk.ui.Messages;
@@ -192,20 +207,7 @@
 		configLabel.setText(Messages.getString("BuildTargetsPage.BuildConfigsLabel")); //$NON-NLS-1$
 		configLabel.setToolTipText(Messages.getString("BuildTargetsPage.BuildConfigsToolTip")); //$NON-NLS-1$
 		
-		viewer = new ContainerCheckedTreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		viewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
-		viewer.setLabelProvider(new LabelProvider());
-		TreeNodeContentProvider treeNodeContentProvider = new TreeNodeContentProvider();
-		filteringContentProviderWrapper = 
-			new FilteringContentProviderWrapper(treeNodeContentProvider);
-		viewer.setContentProvider(filteringContentProviderWrapper);
-		viewer.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				setPageComplete(validatePage());
-			}
-		});
-		viewer.getControl().setData(UID, "buildConfigsTree"); //$NON-NLS-1$
-		viewer.getControl().setData("viewer", viewer); //$NON-NLS-1$
+        drawSDKConfigView(parent);
 		
         filterCheckbox = new Button(parent, SWT.CHECK);
         filterCheckbox.setText(Messages.getString("BuildTargetsPage.FilterText")); //$NON-NLS-1$
@@ -224,11 +226,54 @@
         });
 		filterCheckbox.setData(UID, "filterCheckbox"); //$NON-NLS-1$
 
+		Link fLink = new Link(parent, SWT.WRAP);
+		fLink.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		fLink.setText(Messages.getString("BuildTargetsPage.Select_Filtering_Prefs_Link")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		fLink.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1));
+		fLink.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				// I don't see a way to open it to a specific tab, only the page
+				if (Window.OK == PreferencesUtil.createPreferenceDialogOn(getShell(), "com.nokia.carbide.cpp.sdk.ui.preferences.BuildPlatformFilterPage", null, null, 0).open()){ //$NON-NLS-1$
+					inited = false;
+					setVisible(true);
+					drawSDKConfigView(getControl().getParent());
+					TemplateSDKFilter filter = filterCheckbox.getSelection() ? templateFilter
+							: null;
+					filteringContentProviderWrapper.setFilter(filter);
+					viewer.getTree().clearAll(true);
+					viewer.refresh();
+					setPageComplete(validatePage());
+				}
+			}
+
+		});
+		
 		addOtherControls(parent);
 		
 		setPageComplete(validatePage());
 	}
 	
+	private void drawSDKConfigView(Composite parent) {
+		
+		if (viewer == null){
+			viewer = new ContainerCheckedTreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+			viewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
+			viewer.setLabelProvider(new LabelProvider());
+		}
+		TreeNodeContentProvider treeNodeContentProvider = new TreeNodeContentProvider();
+		filteringContentProviderWrapper = 
+			new FilteringContentProviderWrapper(treeNodeContentProvider);
+		viewer.setContentProvider(filteringContentProviderWrapper);
+		viewer.addCheckStateListener(new ICheckStateListener() {
+			public void checkStateChanged(CheckStateChangedEvent event) {
+				setPageComplete(validatePage());
+			}
+		});
+		viewer.getControl().setData(UID, "buildConfigsTree"); //$NON-NLS-1$
+		viewer.getControl().setData("viewer", viewer); //$NON-NLS-1$
+		
+	}
+
 	/**
 	 * Add more controls after the tree and filter checkbox.  Allows subclasses to add
 	 * more controls.