diff --git a/build/org.eclipse.cdt.make.core/plugin.xml b/build/org.eclipse.cdt.make.core/plugin.xml
index 42c7d7129f5..41fe367bf82 100644
--- a/build/org.eclipse.cdt.make.core/plugin.xml
+++ b/build/org.eclipse.cdt.make.core/plugin.xml
@@ -151,5 +151,12 @@
+
+
+
+
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeCorePlugin.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeCorePlugin.java
index 1e972e6de1c..b66bed941de 100644
--- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeCorePlugin.java
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeCorePlugin.java
@@ -18,6 +18,7 @@ import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.make.core.makefile.IMakefile;
+import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager;
import org.eclipse.cdt.make.core.scannerconfig.IExternalScannerInfoProvider;
import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo;
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoConsoleParser;
@@ -25,6 +26,7 @@ import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigBuilder;
import org.eclipse.cdt.make.internal.core.BuildInfoFactory;
import org.eclipse.cdt.make.internal.core.MakeTargetManager;
import org.eclipse.cdt.make.internal.core.makefile.gnu.GNUMakefile;
+import org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredPathManager;
import org.eclipse.cdt.make.internal.core.scannerconfig.ScannerConfigInfoFactory;
import org.eclipse.cdt.make.internal.core.scannerconfig.util.TraceUtil;
import org.eclipse.core.resources.IFile;
@@ -49,7 +51,6 @@ import org.osgi.framework.BundleContext;
public class MakeCorePlugin extends Plugin {
public static final String PLUGIN_ID = "org.eclipse.cdt.make.core"; //$NON-NLS-1$
public static final String MAKE_PROJECT_ID = MakeCorePlugin.getUniqueIdentifier() + ".make"; //$NON-NLS-1$
- private MakeTargetManager fTargetManager;
public static final String OLD_BUILDER_ID = "org.eclipse.cdt.core.cbuilder"; //$NON-NLS-1$
public static final String EXTERNAL_SI_PROVIDER_SIMPLE_ID = "ExternalScannerInfoProvider"; //$NON-NLS-1$
@@ -58,6 +59,8 @@ public class MakeCorePlugin extends Plugin {
public static final String GCC_SPECS_CONSOLE_PARSER_ID = MakeCorePlugin.getUniqueIdentifier() + ".GCCSpecsConsoleParser"; //$NON-NLS-1$
public static final String GCC_SCANNER_INFO_CONSOLE_PARSER_ID = MakeCorePlugin.getUniqueIdentifier() + ".GCCScannerInfoConsoleParser"; //$NON-NLS-1$
+ private MakeTargetManager fTargetManager;
+ private DiscoveredPathManager fDiscoveryPathManager;
//The shared instance.
private static MakeCorePlugin plugin;
@@ -208,6 +211,13 @@ public class MakeCorePlugin extends Plugin {
return MakeCorePlugin.getDefault().getStateLocation();
}
+ public IDiscoveredPathManager getDiscoveryManager() {
+ if ( fDiscoveryPathManager == null) {
+ fDiscoveryPathManager = new DiscoveredPathManager();
+ }
+ return fDiscoveryPathManager;
+ }
+
/**
* @param id - id specifying external scanner info provider
* @return provider - new instance of an external scanner info provider
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeScannerInfo.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeScannerInfo.java
index 9dc04c204ba..3b69ebf25da 100644
--- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeScannerInfo.java
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeScannerInfo.java
@@ -20,6 +20,12 @@ import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
+/**
+ * @deprecated
+ * @author DInglis
+ *
+ */
+
public class MakeScannerInfo implements IScannerInfo {
private IProject project;
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeScannerProvider.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeScannerProvider.java
index 3a510c2972a..8efb2b61721 100644
--- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeScannerProvider.java
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeScannerProvider.java
@@ -7,38 +7,45 @@
*
* Contributors:
* QNX Software Systems - Initial API and implementation
-***********************************************************************/
+ ***********************************************************************/
package org.eclipse.cdt.make.core;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
-import java.util.ListIterator;
import java.util.Map;
+import java.util.Map.Entry;
-import org.eclipse.cdt.core.AbstractCExtension;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICDescriptor;
+import org.eclipse.cdt.core.model.CoreModel;
+import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.core.model.IIncludeEntry;
+import org.eclipse.cdt.core.model.IMacroEntry;
+import org.eclipse.cdt.core.model.IPathEntry;
import org.eclipse.cdt.core.parser.IScannerInfo;
-import org.eclipse.cdt.core.parser.IScannerInfoChangeListener;
-import org.eclipse.cdt.core.parser.IScannerInfoProvider;
-import org.eclipse.core.resources.IFile;
+import org.eclipse.cdt.core.resources.ScannerProvider;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.QualifiedName;
-import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
-public class MakeScannerProvider extends AbstractCExtension implements IScannerInfoProvider {
+/**
+ * @deprecated @author DInglis
+ *
+ */
+public class MakeScannerProvider extends ScannerProvider {
// This is the id of the IScannerInfoProvider extension point entry
public static final String INTERFACE_IDENTITY = MakeCorePlugin.getUniqueIdentifier() + ".MakeScannerProvider"; //$NON-NLS-1$
// Name we will use to store build property with the project
- private static final QualifiedName scannerInfoProperty = new QualifiedName(MakeCorePlugin.getUniqueIdentifier(), "makeBuildInfo"); //$NON-NLS-1$
+ private static final QualifiedName scannerInfoProperty = new QualifiedName(MakeCorePlugin.getUniqueIdentifier(),
+ "makeBuildInfo"); //$NON-NLS-1$
private static final String CDESCRIPTOR_ID = MakeCorePlugin.getUniqueIdentifier() + ".makeScannerInfo"; //$NON-NLS-1$
public static final String INCLUDE_PATH = "includePath"; //$NON-NLS-1$
@@ -46,9 +53,6 @@ public class MakeScannerProvider extends AbstractCExtension implements IScannerI
public static final String DEFINED_SYMBOL = "definedSymbol"; //$NON-NLS-1$
public static final String SYMBOL = "symbol"; //$NON-NLS-1$
- // Listeners interested in build model changes
- private static Map listeners;
-
private static MakeScannerProvider defaultProvider;
public static MakeScannerProvider getDefault() {
@@ -67,6 +71,8 @@ public class MakeScannerProvider extends AbstractCExtension implements IScannerI
// Try to load one for the project
if (scannerInfo == null) {
scannerInfo = loadScannerInfo(project);
+ } else {
+ return scannerInfo;
}
// There is nothing persisted for the session, or saved in a file so
@@ -74,56 +80,35 @@ public class MakeScannerProvider extends AbstractCExtension implements IScannerI
if (scannerInfo != null && cacheInfo == true) {
project.setSessionProperty(scannerInfoProperty, scannerInfo);
}
+
+ // migrate to new C Path Entries
+ if (scannerInfo != null) {
+ updateScannerInfo(scannerInfo);
+ }
+ ICDescriptor descriptor = CCorePlugin.getDefault().getCProjectDescription(project);
+ descriptor.remove(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID); // remove scanner provider which will fallback to default cpath
+ // provider.
return scannerInfo;
}
- /*
- * @return
- */
- private synchronized static Map getListeners() {
- if (listeners == null) {
- listeners = new HashMap();
- }
- return listeners;
- }
-
- /**
- * @param project
- * @param info
- */
- private static void notifyInfoListeners(IProject project, IScannerInfo info) {
- // Call in the cavalry
- List listeners = (List)getListeners().get(project);
- if (listeners == null) {
- return;
- }
- ListIterator iter = listeners.listIterator();
- while (iter.hasNext()) {
- ((IScannerInfoChangeListener)iter.next()).changeNotification(project, info);
- }
-
- }
-
/*
* (non-Javadoc)
*
* @see org.eclipse.cdt.core.parser.IScannerInfoProvider#getScannerInformation(org.eclipse.core.resources.IResource)
*/
public IScannerInfo getScannerInformation(IResource resource) {
- IScannerInfo info = null;
try {
- info = getMakeScannerInfo(resource.getProject(), true);
+ getMakeScannerInfo(resource.getProject(), true);
} catch (CoreException e) {
}
- return info;
+ return super.getScannerInformation(resource);
}
/*
- * Loads the build file and parses the nodes for build information. The
- * information is then associated with the resource for the duration of the
- * session.
+ * Loads the build file and parses the nodes for build information. The information is then associated with the resource for the
+ * duration of the session.
*/
- public MakeScannerInfo loadScannerInfo(IProject project) throws CoreException {
+ private MakeScannerInfo loadScannerInfo(IProject project) throws CoreException {
ICDescriptor descriptor = CCorePlugin.getDefault().getCProjectDescription(project);
Node child = descriptor.getProjectData(CDESCRIPTOR_ID).getFirstChild();
ArrayList includes = new ArrayList();
@@ -131,10 +116,10 @@ public class MakeScannerProvider extends AbstractCExtension implements IScannerI
while (child != null) {
if (child.getNodeName().equals(INCLUDE_PATH)) {
// Add the path to the property list
- includes.add(((Element)child).getAttribute(PATH));
+ includes.add( ((Element)child).getAttribute(PATH));
} else if (child.getNodeName().equals(DEFINED_SYMBOL)) {
// Add the symbol to the symbol list
- symbols.add(((Element)child).getAttribute(SYMBOL));
+ symbols.add( ((Element)child).getAttribute(SYMBOL));
}
child = child.getNextSibling();
}
@@ -144,13 +129,36 @@ public class MakeScannerProvider extends AbstractCExtension implements IScannerI
return info;
}
+ private static void migrateToCPathEntries(MakeScannerInfo info) throws CoreException {
+ Map symbols = info.getDefinedSymbols();
+ String[] includes = info.getIncludePaths();
+ ICProject cProject = CoreModel.getDefault().create(info.getProject());
+ IPathEntry[] entries = cProject.getRawPathEntries();
+ List cPaths = new ArrayList(Arrays.asList(entries));
+
+ for (int i = 0; i < includes.length; i++) {
+ IIncludeEntry include = CoreModel.newIncludeEntry(info.getProject().getFullPath(), null, new Path(includes[i]));
+ if (!cPaths.contains(include)) {
+ cPaths.add(include);
+ }
+ }
+ Iterator syms = symbols.entrySet().iterator();
+ while (syms.hasNext()) {
+ Map.Entry entry = (Entry)syms.next();
+ IMacroEntry sym = CoreModel.newMacroEntry(info.getProject().getFullPath(), (String)entry.getKey(),
+ (String)entry.getValue());
+ if (!cPaths.contains(sym)) {
+ cPaths.add(sym);
+ }
+ }
+ cProject.setRawPathEntries((IPathEntry[])cPaths.toArray(new IPathEntry[cPaths.size()]), null);
+ }
+
/**
- * The build model manager for standard builds only caches the build
- * information for a resource on a per-session basis. This method allows
- * clients of the build model manager to programmatically remove the
- * association between the resource and the information while the reource
- * is still open or in the workspace. The Eclipse core will take care of
- * removing it if a resource is closed or deleted.
+ * The build model manager for standard builds only caches the build information for a resource on a per-session basis. This
+ * method allows clients of the build model manager to programmatically remove the association between the resource and the
+ * information while the reource is still open or in the workspace. The Eclipse core will take care of removing it if a resource
+ * is closed or deleted.
*
* @param resource
*/
@@ -162,22 +170,14 @@ public class MakeScannerProvider extends AbstractCExtension implements IScannerI
}
/**
- * Persists build-specific information in the build file. Build information
- * for standard make projects consists of preprocessor symbols and includes
- * paths. Other project-related information is stored in the persistent
- * properties of the project.
+ * Persists build-specific information in the build file. Build information for standard make projects consists of preprocessor
+ * symbols and includes paths. Other project-related information is stored in the persistent properties of the project.
*
* @param project
*/
public static void updateScannerInfo(MakeScannerInfo scannerInfo) throws CoreException {
IProject project = scannerInfo.getProject();
- // See if there's already one associated with the resource for this
- // session
- if (project.getSessionProperty(scannerInfoProperty) != null) {
- project.setSessionProperty(scannerInfoProperty, scannerInfo);
- }
-
ICDescriptor descriptor = CCorePlugin.getDefault().getCProjectDescription(project);
Element rootElement = descriptor.getProjectData(CDESCRIPTOR_ID);
@@ -190,79 +190,7 @@ public class MakeScannerProvider extends AbstractCExtension implements IScannerI
child = rootElement.getFirstChild();
}
- // Save the build info
- if (scannerInfo != null) {
- // Serialize the include paths
- Document doc = rootElement.getOwnerDocument();
- ListIterator iter = Arrays.asList(scannerInfo.getIncludePaths()).listIterator();
- while (iter.hasNext()) {
- Element pathElement = doc.createElement(INCLUDE_PATH);
- pathElement.setAttribute(PATH, (String)iter.next());
- rootElement.appendChild(pathElement);
- }
- // Now do the same for the symbols
- iter = Arrays.asList(scannerInfo.getPreprocessorSymbols()).listIterator();
- while (iter.hasNext()) {
- Element symbolElement = doc.createElement(DEFINED_SYMBOL);
- symbolElement.setAttribute(SYMBOL, (String)iter.next());
- rootElement.appendChild(symbolElement);
- }
- descriptor.saveProjectData();
- }
- notifyInfoListeners(project, scannerInfo);
+ descriptor.saveProjectData();
+ migrateToCPathEntries(scannerInfo);
}
-
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.cdt.core.parser.IScannerInfoProvider#subscribe(org.eclipse.core.resources.IResource,
- * org.eclipse.cdt.core.parser.IScannerInfoChangeListener)
- */
- public synchronized void subscribe(IResource resource, IScannerInfoChangeListener listener) {
- IResource project = null;
- if (resource instanceof IProject) {
- project = resource;
- } else if (resource instanceof IFile) {
- project = ((IFile)resource).getProject();
- } else {
- return;
- }
- // Get listeners for this resource
- Map map = getListeners();
- List list = (List)map.get(project);
- if (list == null) {
- // Create a new list
- list = new ArrayList();
- }
- if (!list.contains(listener)) {
- // Add the new listener for the resource
- list.add(listener);
- map.put(project, list);
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.cdt.core.parser.IScannerInfoProvider#unsubscribe(org.eclipse.core.resources.IResource,
- * org.eclipse.cdt.core.parser.IScannerInfoChangeListener)
- */
- public synchronized void unsubscribe(IResource resource, IScannerInfoChangeListener listener) {
- IResource project = null;
- if (resource instanceof IProject) {
- project = resource;
- } else if (resource instanceof IFile) {
- project = ((IFile)resource).getProject();
- } else {
- return;
- }
- // Remove the listener
- Map map = getListeners();
- List list = (List)map.get(project);
- if (list != null && !list.isEmpty()) {
- // The list is not empty so try to remove listener
- list.remove(listener);
- map.put(project, list);
- }
- }
-}
+}
\ No newline at end of file
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/DiscoveredScannerInfo.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/DiscoveredScannerInfo.java
index 0bf398da93c..4c4f25d5ee8 100644
--- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/DiscoveredScannerInfo.java
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/DiscoveredScannerInfo.java
@@ -17,14 +17,13 @@ import java.util.List;
import java.util.Map;
import org.eclipse.cdt.core.parser.IScannerInfo;
-import org.eclipse.cdt.make.core.MakeScannerInfo;
import org.eclipse.cdt.make.internal.core.scannerconfig.util.ScannerConfigUtil;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
/**
* Discovered portion of scanner configuration
- *
+ * @deprecated
* @author vhirsl
*/
public class DiscoveredScannerInfo implements IScannerInfo {
@@ -38,7 +37,7 @@ public class DiscoveredScannerInfo implements IScannerInfo {
private ArrayList activeSymbols;
private ArrayList removedSymbols;
- private MakeScannerInfo userInfo;
+ private org.eclipse.cdt.make.core.MakeScannerInfo userInfo;
/**
* @param project
@@ -69,10 +68,11 @@ public class DiscoveredScannerInfo implements IScannerInfo {
return iPaths;
}
- public MakeScannerInfo getUserScannerInfo() {
+ public org.eclipse.cdt.make.core.MakeScannerInfo getUserScannerInfo() {
return userInfo;
}
- public synchronized void setUserScannerInfo(MakeScannerInfo info) {
+
+ public synchronized void setUserScannerInfo( org.eclipse.cdt.make.core.MakeScannerInfo info) {
userInfo = info;
}
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/DiscoveredScannerInfoProvider.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/DiscoveredScannerInfoProvider.java
index 7f03f66a784..c2d9916fe33 100644
--- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/DiscoveredScannerInfoProvider.java
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/DiscoveredScannerInfoProvider.java
@@ -10,72 +10,39 @@
**********************************************************************/
package org.eclipse.cdt.make.core.scannerconfig;
-import java.io.ByteArrayOutputStream;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.FactoryConfigurationError;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.TransformerFactoryConfigurationError;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-import org.eclipse.cdt.core.AbstractCExtension;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICDescriptor;
+import org.eclipse.cdt.core.model.CoreModel;
+import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.core.model.IContainerEntry;
+import org.eclipse.cdt.core.model.IPathEntry;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.IScannerInfoChangeListener;
-import org.eclipse.cdt.core.parser.IScannerInfoProvider;
+import org.eclipse.cdt.core.resources.ScannerProvider;
import org.eclipse.cdt.make.core.MakeCorePlugin;
-import org.eclipse.cdt.make.core.MakeScannerInfo;
-import org.eclipse.cdt.make.core.MakeScannerProvider;
-import org.eclipse.cdt.make.internal.core.MakeMessages;
-import org.eclipse.cdt.make.internal.core.scannerconfig.util.ScannerConfigUtil;
-import org.eclipse.cdt.make.internal.core.scannerconfig.util.SymbolEntry;
+import org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredPathContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.Status;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.xml.sax.SAXException;
/**
* Provider of both user specified and discovered scanner info
*
- * @author vhirsl
+ * @deprecated @author vhirsl
*/
-public class DiscoveredScannerInfoProvider extends AbstractCExtension implements IScannerInfoProvider {
-
+public class DiscoveredScannerInfoProvider extends ScannerProvider {
+
// This is the id of the IScannerInfoProvider extension point entry
public static final String INTERFACE_IDENTITY = MakeCorePlugin.getUniqueIdentifier() + ".DiscoveredScannerInfoProvider"; //$NON-NLS-1$
// Name we will use to store build property with the project
- private static final QualifiedName scannerInfoProperty = new QualifiedName(MakeCorePlugin.getUniqueIdentifier(), "discoveredMakeBuildInfo"); //$NON-NLS-1$
- private static final String CDESCRIPTOR_ID = MakeCorePlugin.getUniqueIdentifier() + ".discoveredScannerInfo"; //$NON-NLS-1$
-
- public static final String INCLUDE_PATH = "includePath"; //$NON-NLS-1$
- public static final String PATH = "path"; //$NON-NLS-1$
- public static final String DEFINED_SYMBOL = "definedSymbol"; //$NON-NLS-1$
- public static final String SYMBOL = "symbol"; //$NON-NLS-1$
- public static final String REMOVED = "removed"; //$NON-NLS-1$
-
- private static final String ROOT_ELEM_NAME = "DiscoveredScannerInfo"; //$NON-NLS-1$
+ private static final QualifiedName scannerInfoProperty = new QualifiedName(MakeCorePlugin.getUniqueIdentifier(),
+ "discoveredMakeBuildInfo"); //$NON-NLS-1$
// Singleton
private static DiscoveredScannerInfoProvider instance;
@@ -85,31 +52,38 @@ public class DiscoveredScannerInfoProvider extends AbstractCExtension implements
}
return instance;
}
-
- /* (non-Javadoc)
+
+ /*
+ * (non-Javadoc)
+ *
* @see org.eclipse.cdt.core.parser.IScannerInfoProvider#getScannerInformation(org.eclipse.core.resources.IResource)
*/
public IScannerInfo getScannerInformation(IResource resource) {
- IScannerInfo info = null;
try {
- info = getDiscoveredScannerInfo(resource.getProject(), true);
+ getDiscoveredScannerInfo(resource.getProject(), true);
} catch (CoreException e) {
}
- return info;
+ return super.getScannerInformation(resource);
}
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.core.parser.IScannerInfoProvider#subscribe(org.eclipse.core.resources.IResource, org.eclipse.cdt.core.parser.IScannerInfoChangeListener)
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.cdt.core.parser.IScannerInfoProvider#subscribe(org.eclipse.core.resources.IResource,
+ * org.eclipse.cdt.core.parser.IScannerInfoChangeListener)
*/
public void subscribe(IResource resource, IScannerInfoChangeListener listener) {
- MakeScannerProvider.getDefault().subscribe(resource, listener);
+ super.subscribe(resource, listener);
}
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.core.parser.IScannerInfoProvider#unsubscribe(org.eclipse.core.resources.IResource, org.eclipse.cdt.core.parser.IScannerInfoChangeListener)
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.cdt.core.parser.IScannerInfoProvider#unsubscribe(org.eclipse.core.resources.IResource,
+ * org.eclipse.cdt.core.parser.IScannerInfoChangeListener)
*/
public void unsubscribe(IResource resource, IScannerInfoChangeListener listener) {
- MakeScannerProvider.getDefault().unsubscribe(resource, listener);
+ super.unsubscribe(resource, listener);
}
public DiscoveredScannerInfo getDiscoveredScannerInfo(IProject project, boolean cacheInfo) throws CoreException {
@@ -118,86 +92,39 @@ public class DiscoveredScannerInfoProvider extends AbstractCExtension implements
// session
scannerInfo = (DiscoveredScannerInfo)project.getSessionProperty(scannerInfoProperty);
- // Try to load one for the project
- if (scannerInfo == null) {
- scannerInfo = loadScannerInfo(project);
- }
- else {
- // TODO VMIR temporary
- // get the separately stored MakeScannerInfo in case someone accessed it
- // not through DiscoveredScannerInfoProvider
- MakeScannerInfo makeScannerInfo = MakeScannerProvider.getDefault().getMakeScannerInfo(project, cacheInfo);
- scannerInfo.setUserScannerInfo(makeScannerInfo);
- }
+ // this will convert user info
+ org.eclipse.cdt.make.core.MakeScannerInfo makeScannerInfo = org.eclipse.cdt.make.core.MakeScannerProvider.getDefault().getMakeScannerInfo(
+ project, cacheInfo);
- // There is nothing persisted for the session, or saved in a file so
- // create a build info object
- if (scannerInfo != null && cacheInfo == true) {
+ if (scannerInfo == null) {
+ scannerInfo = new DiscoveredScannerInfo(project);
+ scannerInfo.setUserScannerInfo(makeScannerInfo);
+
+ // migrate to new C Path Entries
+ IContainerEntry container = CoreModel.newContainerEntry(DiscoveredPathContainer.CONTAINER_ID);
+ ICProject cProject = CoreModel.getDefault().create(project);
+ if (cProject != null) {
+ IPathEntry[] entries = cProject.getRawPathEntries();
+ List newEntries = new ArrayList(Arrays.asList(entries));
+ if (!newEntries.contains(container)) {
+ newEntries.add(container);
+ cProject.setRawPathEntries((IPathEntry[])newEntries.toArray(new IPathEntry[newEntries.size()]), null);
+ }
+ }
+ ICDescriptor descriptor = CCorePlugin.getDefault().getCProjectDescription(project);
+ descriptor.remove(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID); // remove scanner provider which will fallback to default
+ // cpath provider.
+ // place holder to that we don't convert again.
project.setSessionProperty(scannerInfoProperty, scannerInfo);
}
return scannerInfo;
}
- /*
- * Loads the build file and parses the nodes for build information. The
- * information is then associated with the resource for the duration of the
- * session.
- */
- private DiscoveredScannerInfo loadScannerInfo(IProject project) throws CoreException {
- LinkedHashMap includes = new LinkedHashMap();
- LinkedHashMap symbols = new LinkedHashMap();
-// loadDiscoveredScannerInfoFromCDescriptor(project, includes, symbols);
- loadDiscoveredScannerInfoFromState(project, includes, symbols);
- MakeScannerInfo userInfo = MakeScannerProvider.getDefault().loadScannerInfo(project);
- DiscoveredScannerInfo info = new DiscoveredScannerInfo(project);
- info.setUserScannerInfo(userInfo);
- info.setDiscoveredIncludePaths(includes);
- info.setDiscoveredSymbolDefinitions(symbols);
- return info;
- }
-
/**
- * Loads discovered scanner configuration from .cdtproject file
- * @param project
- * @param includes
- * @param symbols
- * @throws CoreException
- */
- private void loadDiscoveredScannerInfoFromCDescriptor(IProject project, LinkedHashMap includes, LinkedHashMap symbols) throws CoreException {
- ICDescriptor descriptor = CCorePlugin.getDefault().getCProjectDescription(project);
- Node child = descriptor.getProjectData(CDESCRIPTOR_ID).getFirstChild();
- loadDiscoveredScannerInfo(includes, symbols, child);
- }
-
- /**
- * @param includes
- * @param symbols
- * @param child
- */
- private void loadDiscoveredScannerInfo(LinkedHashMap includes, LinkedHashMap symbols, Node child) {
- while (child != null) {
- if (child.getNodeName().equals(INCLUDE_PATH)) {
- // Add the path to the property list
- includes.put(((Element)child).getAttribute(PATH),
- Boolean.valueOf(((Element)child).getAttribute(REMOVED)));
- } else if (child.getNodeName().equals(DEFINED_SYMBOL)) {
- // Add the symbol to the symbol list
- String symbol = ((Element)child).getAttribute(SYMBOL);
- String removed = ((Element)child).getAttribute(REMOVED);
- boolean bRemoved = (removed != null && removed.equals("true")); //$NON-NLS-1$
- ScannerConfigUtil.scAddSymbolString2SymbolEntryMap(symbols, symbol, !bRemoved);
- }
- child = child.getNextSibling();
- }
- }
-
- /**
- * The build model manager for standard builds only caches the build
- * information for a resource on a per-session basis. This method allows
- * clients of the build model manager to programmatically remove the
- * association between the resource and the information while the reource
- * is still open or in the workspace. The Eclipse core will take care of
- * removing it if a resource is closed or deleted.
+ * The build model manager for standard builds only caches the build information for a resource on a per-session basis. This
+ * method allows clients of the build model manager to programmatically remove the association between the resource and the
+ * information while the reource is still open or in the workspace. The Eclipse core will take care of removing it if a resource
+ * is closed or deleted.
*
* @param resource
*/
@@ -209,179 +136,12 @@ public class DiscoveredScannerInfoProvider extends AbstractCExtension implements
}
/**
- * Persists build-specific information in the build file. Build information
- * for standard make projects consists of preprocessor symbols and includes
- * paths. Other project-related information is stored in the persistent
- * properties of the project.
+ * Persists build-specific information in the build file. Build information for standard make projects consists of preprocessor
+ * symbols and includes paths. Other project-related information is stored in the persistent properties of the project.
*
* @param scannerInfo
*/
static void updateScannerInfo(DiscoveredScannerInfo scannerInfo) throws CoreException {
- IProject project = scannerInfo.getProject();
-
- // See if there's already one associated with the resource for this
- // session
- if (project.getSessionProperty(scannerInfoProperty) != null) {
- project.setSessionProperty(scannerInfoProperty, scannerInfo);
- }
-
-// saveDiscoveredScannerInfoToCDescriptor(scannerInfo, project);
- saveDiscoveredScannerInfoToState(scannerInfo, project);
-
- MakeScannerProvider.updateScannerInfo(scannerInfo.getUserScannerInfo());
-// listeners are notified by MakeScannerProvider.updateScannerInfo
-// notifyInfoListeners(project, scannerInfo);
+ // no longer supported!
}
-
- /**
- * Save discovered scanner configuration to .cdtproject file
- * @param scannerInfo
- * @param project
- * @throws CoreException
- */
- private static void saveDiscoveredScannerInfoToCDescriptor(DiscoveredScannerInfo scannerInfo, IProject project) throws CoreException {
- ICDescriptor descriptor = CCorePlugin.getDefault().getCProjectDescription(project);
-
- Element rootElement = descriptor.getProjectData(CDESCRIPTOR_ID);
-
- // Clear out all current children
- // Note: Probably would be a better idea to merge in the data
- Node child = rootElement.getFirstChild();
- while (child != null) {
- rootElement.removeChild(child);
- child = rootElement.getFirstChild();
- }
- Document doc = rootElement.getOwnerDocument();
-
- saveDiscoveredScannerInfo(scannerInfo, rootElement, doc);
- }
-
- /**
- * @param scannerInfo
- * @param rootElement
- * @param doc
- */
- private static void saveDiscoveredScannerInfo(DiscoveredScannerInfo scannerInfo, Element rootElement, Document doc) {
- // Save the build info
- if (scannerInfo != null) {
- // Serialize the include paths
- Map discoveredIncludes = scannerInfo.getDiscoveredIncludePaths();
- Iterator iter = discoveredIncludes.keySet().iterator();
- while (iter.hasNext()) {
- Element pathElement = doc.createElement(INCLUDE_PATH);
- String include = (String) iter.next();
- pathElement.setAttribute(PATH, include);
- Boolean removed = (Boolean) discoveredIncludes.get(include);
- if (removed != null && removed.booleanValue() == true) {
- pathElement.setAttribute(REMOVED, "true"); //$NON-NLS-1$
- }
- rootElement.appendChild(pathElement);
- }
- // Now do the same for the symbols
- Map discoveredSymbols = scannerInfo.getDiscoveredSymbolDefinitions();
- iter = discoveredSymbols.keySet().iterator();
- while (iter.hasNext()) {
- String symbol = (String) iter.next();
- SymbolEntry se = (SymbolEntry) discoveredSymbols.get(symbol);
- for (Iterator i = se.getActiveRaw().iterator(); i.hasNext(); ) {
- String value = (String) i.next();
- Element symbolElement = doc.createElement(DEFINED_SYMBOL);
- symbolElement.setAttribute(SYMBOL, value);
- rootElement.appendChild(symbolElement);
- }
- for (Iterator i = se.getRemovedRaw().iterator(); i.hasNext(); ) {
- String value = (String) i.next();
- Element symbolElement = doc.createElement(DEFINED_SYMBOL);
- symbolElement.setAttribute(SYMBOL, value);
- symbolElement.setAttribute(REMOVED, "true"); //$NON-NLS-1$
- rootElement.appendChild(symbolElement);
- }
- }
-// descriptor is saved by MakeScannerProvider.updateScannerInfo
-// descriptor.saveProjectData();
- }
- }
-
- private void loadDiscoveredScannerInfoFromState(IProject project, LinkedHashMap includes, LinkedHashMap symbols) throws CoreException {
- // Save the document
- IPath path = MakeCorePlugin.getWorkingDirectory();
- path = path.append(project.getName() + ".sc"); //$NON-NLS-1$
- if (path.toFile().exists()) {
- try {
- FileInputStream file = new FileInputStream(path.toFile());
- DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
- Document document = parser.parse(file);
- Node rootElement = document.getFirstChild();
- if (rootElement.getNodeName().equals("scannerInfo")) { //$NON-NLS-1$
- Node child = rootElement.getFirstChild();
- loadDiscoveredScannerInfo(includes, symbols, child);
- }
- } catch (IOException e) {
- throw new CoreException(new Status(IStatus.ERROR,
- MakeCorePlugin.getUniqueIdentifier(), -1,
- MakeMessages.getString("GCCScannerConfigUtil.Error_Message"), e)); //$NON-NLS-1$
- } catch (ParserConfigurationException e) {
- MakeCorePlugin.log(e);
- } catch (FactoryConfigurationError e) {
- MakeCorePlugin.log(e);
- } catch (SAXException e) {
- MakeCorePlugin.log(e);
- }
- }
- }
-
- private static void saveDiscoveredScannerInfoToState(DiscoveredScannerInfo scannerInfo, IProject project) throws CoreException {
- // Create document
- try {
- DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
- Document doc = builder.newDocument();
- Element rootElement = doc.createElement("scannerInfo"); //$NON-NLS-1$
- rootElement.setAttribute("id", CDESCRIPTOR_ID); //$NON-NLS-1$
- doc.appendChild(rootElement);
-
- saveDiscoveredScannerInfo(scannerInfo, rootElement, doc);
-
- // Transform the document to something we can save in a file
- ByteArrayOutputStream stream = new ByteArrayOutputStream();
- Transformer transformer = TransformerFactory.newInstance().newTransformer();
- transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
- transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //$NON-NLS-1$
- transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
- DOMSource source = new DOMSource(doc);
- StreamResult result = new StreamResult(stream);
- transformer.transform(source, result);
-
- // Save the document
- IPath path = MakeCorePlugin.getWorkingDirectory();
- path = path.append(project.getName() + ".sc"); //$NON-NLS-1$
- try {
- FileOutputStream file = new FileOutputStream(path.toFile());
- file.write(stream.toByteArray());
- file.close();
- } catch (IOException e) {
- throw new CoreException(new Status(IStatus.ERROR,
- MakeCorePlugin.getUniqueIdentifier(), -1,
- MakeMessages.getString("GCCScannerConfigUtil.Error_Message"), e)); //$NON-NLS-1$
- }
-
- // Close the streams
- stream.close();
- } catch (ParserConfigurationException e) {
- MakeCorePlugin.log(e);
- } catch (FactoryConfigurationError e) {
- MakeCorePlugin.log(e);
- } catch (TransformerConfigurationException e) {
- MakeCorePlugin.log(e);
- } catch (TransformerFactoryConfigurationError e) {
- MakeCorePlugin.log(e);
- } catch (TransformerException e) {
- MakeCorePlugin.log(e);
- } catch (IOException e) {
- MakeCorePlugin.log(e);
- } catch (CoreException e) {
- // Save to IFile failed
- MakeCorePlugin.log(e.getStatus());
- }
-
- }
-}
+}
\ No newline at end of file
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/IDiscoveredPathManager.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/IDiscoveredPathManager.java
new file mode 100644
index 00000000000..4e3a341a69c
--- /dev/null
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/IDiscoveredPathManager.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004 QNX Software Systems and others. All rights reserved. This
+ * program and the accompanying materials are made available under the terms of
+ * the Common Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: QNX Software Systems - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.cdt.make.core.scannerconfig;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+
+public interface IDiscoveredPathManager {
+
+ interface IDiscoveredPathInfo {
+
+ IProject getProject();
+
+ IPath[] getIncludePaths();
+ Map getSymbols();
+
+ void setIncludeMap(LinkedHashMap map);
+ void setSymbolMap(LinkedHashMap map);
+
+ LinkedHashMap getIncludeMap();
+ LinkedHashMap getSymbolMap();
+ }
+
+ interface IDiscoveredInfoListener {
+
+ void infoChanged(IDiscoveredPathInfo info);
+ void infoRemoved(IProject project);
+ }
+
+ IDiscoveredPathInfo getDiscoveredInfo(IProject project) throws CoreException;
+ void removeDiscoveredInfo(IProject project);
+ void updateDiscoveredInfo(IDiscoveredPathInfo info) throws CoreException;
+
+ void addDiscoveredInfoListener(IDiscoveredInfoListener listener);
+ void removeDiscoveredInfoListener(IDiscoveredInfoListener listener);
+}
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/ScannerConfigNature.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/ScannerConfigNature.java
index 62616bed04f..0c94933e4de 100644
--- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/ScannerConfigNature.java
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/ScannerConfigNature.java
@@ -10,15 +10,12 @@
**********************************************************************/
package org.eclipse.cdt.make.core.scannerconfig;
-import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.make.core.MakeCorePlugin;
-import org.eclipse.cdt.make.core.MakeScannerProvider;
-import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.resources.ICommand;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IProjectNature;
+import org.eclipse.core.runtime.CoreException;
/**
* @see IProjectNature
@@ -93,8 +90,6 @@ public class ScannerConfigNature implements IProjectNature {
description.setNatureIds(newIds);
project.setDescription(description, null);
- // set DiscoveredScannerInfoProvider as a default one for the project
- updateProjectsScannerInfoProvider(project, true);
}
public static void removeScannerConfigNature(IProject project) throws CoreException {
@@ -112,8 +107,6 @@ public class ScannerConfigNature implements IProjectNature {
}
}
- // fall back to MakeScannerProvider
- updateProjectsScannerInfoProvider(project, false);
}
/**
@@ -135,19 +128,4 @@ public class ScannerConfigNature implements IProjectNature {
return null;
}
- /**
- * @param project
- * @param b
- */
- private static void updateProjectsScannerInfoProvider(IProject project, boolean discovered) {
- try {
- ICDescriptor desc = CCorePlugin.getDefault().getCProjectDescription(project);
- desc.remove(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID);
- desc.create(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID, (discovered)?
- DiscoveredScannerInfoProvider.INTERFACE_IDENTITY:
- MakeScannerProvider.INTERFACE_IDENTITY);
- } catch (CoreException e) {
- MakeCorePlugin.log(e.getStatus());
- }
- }
}
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/MakeMessages.properties b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/MakeMessages.properties
index 9e4dc8d618f..1b84ffdf528 100644
--- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/MakeMessages.properties
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/MakeMessages.properties
@@ -30,3 +30,5 @@ ScannerInfoCollector.Processing=Processing discovered scanner configuration ...
ScannerInfoCollector.Updating=Updating Scanner Configuration for project
GCCScannerConfigUtil.Error_Message=Error creating specs file
+
+DiscoveredContainer.description=Discovered Paths
\ No newline at end of file
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/MakeProject.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/MakeProject.java
index 2727d8c669f..f00b1d321cf 100644
--- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/MakeProject.java
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/MakeProject.java
@@ -15,7 +15,6 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.core.ICOwner;
import org.eclipse.cdt.make.core.MakeCorePlugin;
-import org.eclipse.cdt.make.core.scannerconfig.DiscoveredScannerInfoProvider;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Preferences;
@@ -24,14 +23,10 @@ public class MakeProject implements ICOwner {
public void configure(ICDescriptor cDescriptor) throws CoreException {
cDescriptor.remove(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID);
cDescriptor.remove(CCorePlugin.BUILDER_MODEL_ID);
- cDescriptor.create(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID, DiscoveredScannerInfoProvider.INTERFACE_IDENTITY);
updateBinaryParsers(cDescriptor);
}
public void update(ICDescriptor cDescriptor, String extensionID) throws CoreException {
- if (extensionID.equals(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID)) {
- cDescriptor.create(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID, DiscoveredScannerInfoProvider.INTERFACE_IDENTITY);
- }
if (extensionID.equals(CCorePlugin.BINARY_PARSER_UNIQ_ID)) {
updateBinaryParsers(cDescriptor);
}
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DiscoverdPathInitializer.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DiscoverdPathInitializer.java
new file mode 100644
index 00000000000..4812de19660
--- /dev/null
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DiscoverdPathInitializer.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004 QNX Software Systems and others. All rights reserved. This
+ * program and the accompanying materials are made available under the terms of
+ * the Common Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: QNX Software Systems - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.cdt.make.internal.core.scannerconfig;
+
+import org.eclipse.cdt.core.model.CoreModel;
+import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.core.model.PathEntryContainerInitializer;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+
+
+public class DiscoverdPathInitializer extends PathEntryContainerInitializer {
+
+ public void initialize(IPath containerPath, ICProject project) throws CoreException {
+ CoreModel.getDefault().setPathEntryContainer(new ICProject[]{project}, new DiscoveredPathContainer(project.getProject()), null);
+ }
+
+}
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DiscoveredPathContainer.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DiscoveredPathContainer.java
new file mode 100644
index 00000000000..9227e128c8d
--- /dev/null
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DiscoveredPathContainer.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2004 QNX Software Systems and others. All rights reserved. This
+ * program and the accompanying materials are made available under the terms of
+ * the Common Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: QNX Software Systems - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.cdt.make.internal.core.scannerconfig;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.eclipse.cdt.core.model.CoreModel;
+import org.eclipse.cdt.core.model.IPathEntry;
+import org.eclipse.cdt.core.model.IPathEntryContainer;
+import org.eclipse.cdt.make.core.MakeCorePlugin;
+import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredInfoListener;
+import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo;
+import org.eclipse.cdt.make.internal.core.MakeMessages;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+
+public class DiscoveredPathContainer implements IPathEntryContainer {
+
+ public static IPath CONTAINER_ID = new Path("org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"); //$NON-NLS-1$
+
+ private final IProject fProject;
+ private static Map fgPathEntries;
+
+ public DiscoveredPathContainer(IProject project) {
+ fProject = project;
+ }
+
+ public static IPathEntry[] getPathEntries(IProject project) throws CoreException {
+ if (fgPathEntries == null) {
+ fgPathEntries = new HashMap(10);
+ IDiscoveredInfoListener listener = new IDiscoveredInfoListener() {
+
+ public void infoRemoved(IProject project) {
+ fgPathEntries.remove(project);
+ }
+
+ public void infoChanged(IDiscoveredPathInfo info) {
+ fgPathEntries.remove(info.getProject());
+ }
+ };
+ MakeCorePlugin.getDefault().getDiscoveryManager().addDiscoveredInfoListener(listener);
+ }
+ IPathEntry[] entries = (IPathEntry[])fgPathEntries.get(project);
+ if (entries == null) {
+ entries = computeNewPathEntries(project);
+ fgPathEntries.put(project, entries);
+ }
+ return entries;
+ }
+
+ private static IPathEntry[] computeNewPathEntries(IProject project) throws CoreException {
+ IDiscoveredPathInfo info = MakeCorePlugin.getDefault().getDiscoveryManager().getDiscoveredInfo(project);
+ IPath[] includes = info.getIncludePaths();
+ Map syms = info.getSymbols();
+ List entries = new ArrayList(includes.length + syms.size());
+ for (int i = 0; i < includes.length; i++) {
+ entries.add(CoreModel.newIncludeEntry(Path.EMPTY, Path.EMPTY, includes[i])); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ Iterator iter = syms.entrySet().iterator();
+ while (iter.hasNext()) {
+ Entry entry = (Entry)iter.next();
+ entries.add(CoreModel.newMacroEntry(Path.EMPTY, (String)entry.getKey(), (String)entry.getValue())); //$NON-NLS-1$
+ }
+ return (IPathEntry[])entries.toArray(new IPathEntry[entries.size()]);
+ }
+
+ public IPathEntry[] getPathEntries() {
+ IPathEntry[] fPathEntries;
+ try {
+ fPathEntries = getPathEntries(fProject);
+ } catch (CoreException e) {
+ MakeCorePlugin.log(e);
+ return new IPathEntry[0];
+ }
+ return fPathEntries;
+ }
+
+ public String getDescription() {
+ return MakeMessages.getString("DiscoveredContainer.description"); //$NON-NLS-1$
+ }
+
+ public IPath getPath() {
+ return CONTAINER_ID;
+ }
+
+}
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DiscoveredPathInfo.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DiscoveredPathInfo.java
new file mode 100644
index 00000000000..b577a2294b5
--- /dev/null
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DiscoveredPathInfo.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2004 QNX Software Systems and others. All rights reserved. This
+ * program and the accompanying materials are made available under the terms of
+ * the Common Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: QNX Software Systems - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.cdt.make.internal.core.scannerconfig;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo;
+import org.eclipse.cdt.make.internal.core.scannerconfig.util.ScannerConfigUtil;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+
+
+public class DiscoveredPathInfo implements IDiscoveredPathInfo {
+ final private IProject project;
+ private LinkedHashMap discoveredPaths;
+ private LinkedHashMap discoveredSymbols;
+
+ private List activePaths;
+ private Map activeSymbols;
+
+ public DiscoveredPathInfo(IProject project) {
+ this.project = project;
+ }
+
+ public IProject getProject() {
+ return project;
+ }
+
+ public synchronized Map getSymbols() {
+ if (activeSymbols == null) {
+ createSymbolsMap();
+ }
+ Map dSymbols = ScannerConfigUtil.scSymbolEntryMap2Map(discoveredSymbols);
+ return dSymbols;
+ }
+
+ public synchronized IPath[] getIncludePaths() {
+ if ( activePaths == null) {
+ createPathLists();
+ }
+ return (IPath[])activePaths.toArray(new IPath[activePaths.size()]);
+ }
+
+ public LinkedHashMap getIncludeMap() {
+ if (discoveredPaths == null) {
+ return new LinkedHashMap();
+ }
+ return new LinkedHashMap(discoveredPaths);
+ }
+
+ public synchronized void setIncludeMap(LinkedHashMap paths) {
+ discoveredPaths = new LinkedHashMap(paths);
+ activePaths = null;
+ }
+
+ /**
+ * Populates active and removed include path lists
+ */
+ private void createPathLists() {
+ List aPaths = getActivePathList();
+ aPaths.clear();
+
+ for (Iterator i = discoveredPaths.keySet().iterator(); i.hasNext(); ) {
+ String path = (String) i.next();
+ Boolean removed = (Boolean) discoveredPaths.get(path);
+ if (removed == null || removed.booleanValue() == false) {
+ aPaths.add(new Path(path));
+ }
+ }
+ }
+
+ public LinkedHashMap getSymbolMap() {
+ if (discoveredSymbols == null) {
+ return new LinkedHashMap();
+ }
+ return new LinkedHashMap(discoveredSymbols);
+ }
+
+ public synchronized void setSymbolMap(LinkedHashMap symbols) {
+ discoveredSymbols = new LinkedHashMap(symbols);
+ activeSymbols = null;
+ }
+
+ /**
+ * Populates active symbols sets
+ */
+ private void createSymbolsMap() {
+ Map aSymbols = getActiveSymbolsMap();
+ aSymbols.clear();
+
+ aSymbols.putAll(ScannerConfigUtil.scSymbolEntryMap2Map(discoveredSymbols));
+ }
+
+ private List getActivePathList() {
+ if (activePaths == null) {
+ activePaths = new ArrayList();
+ }
+ return activePaths;
+ }
+
+ private Map getActiveSymbolsMap() {
+ if (activeSymbols == null) {
+ activeSymbols = new HashMap();
+ }
+ return activeSymbols;
+ }
+}
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DiscoveredPathManager.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DiscoveredPathManager.java
new file mode 100644
index 00000000000..0dfe51b788f
--- /dev/null
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DiscoveredPathManager.java
@@ -0,0 +1,284 @@
+/*******************************************************************************
+ * Copyright (c) 2004 QNX Software Systems and others. All rights reserved. This
+ * program and the accompanying materials are made available under the terms of
+ * the Common Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: QNX Software Systems - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.cdt.make.internal.core.scannerconfig;
+
+import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.make.core.MakeCorePlugin;
+import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager;
+import org.eclipse.cdt.make.internal.core.MakeMessages;
+import org.eclipse.cdt.make.internal.core.scannerconfig.util.ScannerConfigUtil;
+import org.eclipse.cdt.make.internal.core.scannerconfig.util.SymbolEntry;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.xml.sax.SAXException;
+
+public class DiscoveredPathManager implements IDiscoveredPathManager {
+
+ private static final String CDESCRIPTOR_ID = MakeCorePlugin.getUniqueIdentifier() + ".discoveredScannerInfo"; //$NON-NLS-1$
+ public static final String INCLUDE_PATH = "includePath"; //$NON-NLS-1$
+ public static final String PATH = "path"; //$NON-NLS-1$
+ public static final String DEFINED_SYMBOL = "definedSymbol"; //$NON-NLS-1$
+ public static final String SYMBOL = "symbol"; //$NON-NLS-1$
+ public static final String REMOVED = "removed"; //$NON-NLS-1$
+
+ private static final String ROOT_ELEM_NAME = "DiscoveredScannerInfo"; //$NON-NLS-1$
+
+ private Map fDiscoveredMap = new HashMap();
+ private List listeners = Collections.synchronizedList(new Vector());
+
+ private static final int INFO_CHANGED = 1;
+ private static final int INFO_REMOVED = 2;
+
+ public IDiscoveredPathInfo getDiscoveredInfo(IProject project) throws CoreException {
+ DiscoveredPathInfo info = (DiscoveredPathInfo)fDiscoveredMap.get(project);
+ if (info == null) {
+ info = loadPathInfo(project);
+ fDiscoveredMap.put(project, info);
+ }
+ return info;
+ }
+
+ private DiscoveredPathInfo loadPathInfo(IProject project) throws CoreException {
+ LinkedHashMap includes = new LinkedHashMap();
+ LinkedHashMap symbols = new LinkedHashMap();
+ loadDiscoveredScannerInfoFromState(project, includes, symbols);
+ DiscoveredPathInfo info = new DiscoveredPathInfo(project);
+ info.setIncludeMap(includes);
+ info.setSymbolMap(symbols);
+ return info;
+ }
+
+ public void removeDiscoveredInfo(IProject project) {
+ IPath path = MakeCorePlugin.getWorkingDirectory();
+ path = path.append(project.getName() + ".sc"); //$NON-NLS-1$
+ if (path.toFile().exists()) {
+ path.toFile().delete();
+ }
+ DiscoveredPathInfo info = (DiscoveredPathInfo)fDiscoveredMap.remove(project);
+ fireUpdate(INFO_REMOVED, info);
+ }
+
+ public void updateDiscoveredInfo(IDiscoveredPathInfo info) throws CoreException {
+ if (fDiscoveredMap.get(info.getProject()) != null) {
+ saveDiscoveredScannerInfoToState((DiscoveredPathInfo)info);
+ fireUpdate(INFO_CHANGED, info);
+ }
+ }
+
+ private void loadDiscoveredScannerInfoFromState(IProject project, LinkedHashMap includes, LinkedHashMap symbols)
+ throws CoreException {
+ // Save the document
+ IPath path = MakeCorePlugin.getWorkingDirectory();
+ path = path.append(project.getName() + ".sc"); //$NON-NLS-1$
+ if (path.toFile().exists()) {
+ try {
+ FileInputStream file = new FileInputStream(path.toFile());
+ DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+ Document document = parser.parse(file);
+ Node rootElement = document.getFirstChild();
+ if (rootElement.getNodeName().equals("scannerInfo")) { //$NON-NLS-1$
+ Node child = rootElement.getFirstChild();
+ loadDiscoveredScannerInfo(includes, symbols, child);
+ }
+ } catch (IOException e) {
+ throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1,
+ MakeMessages.getString("GCCScannerConfigUtil.Error_Message"), e)); //$NON-NLS-1$
+ } catch (ParserConfigurationException e) {
+ MakeCorePlugin.log(e);
+ throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1,
+ MakeMessages.getString("GCCScannerConfigUtil.Error_Message"), e)); //$NON-NLS-1$
+ } catch (SAXException e) {
+ MakeCorePlugin.log(e);
+ throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1,
+ MakeMessages.getString("GCCScannerConfigUtil.Error_Message"), e)); //$NON-NLS-1$
+ }
+ }
+ }
+
+ /**
+ * @param includes
+ * @param symbols
+ * @param child
+ */
+ private void loadDiscoveredScannerInfo(LinkedHashMap includes, LinkedHashMap symbols, Node child) {
+ while (child != null) {
+ if (child.getNodeName().equals(INCLUDE_PATH)) {
+ // Add the path to the property list
+ includes.put( ((Element)child).getAttribute(PATH), Boolean.valueOf( ((Element)child).getAttribute(REMOVED)));
+ } else if (child.getNodeName().equals(DEFINED_SYMBOL)) {
+ // Add the symbol to the symbol list
+ String symbol = ((Element)child).getAttribute(SYMBOL);
+ String removed = ((Element)child).getAttribute(REMOVED);
+ boolean bRemoved = (removed != null && removed.equals("true")); //$NON-NLS-1$
+ ScannerConfigUtil.scAddSymbolString2SymbolEntryMap(symbols, symbol, !bRemoved);
+ }
+ child = child.getNextSibling();
+ }
+ }
+
+ /**
+ * @param scannerInfo
+ * @param rootElement
+ * @param doc
+ */
+ private static void saveDiscoveredScannerInfo(DiscoveredPathInfo info, Element rootElement, Document doc) {
+ // Save the build info
+ if (info != null) {
+ // Serialize the include paths
+ Map discoveredIncludes = info.getIncludeMap();
+ Iterator iter = discoveredIncludes.keySet().iterator();
+ while (iter.hasNext()) {
+ Element pathElement = doc.createElement(INCLUDE_PATH);
+ String include = (String)iter.next();
+ pathElement.setAttribute(PATH, include);
+ Boolean removed = (Boolean)discoveredIncludes.get(include);
+ if (removed != null && removed.booleanValue() == true) {
+ pathElement.setAttribute(REMOVED, "true"); //$NON-NLS-1$
+ }
+ rootElement.appendChild(pathElement);
+ }
+ // Now do the same for the symbols
+ Map discoveredSymbols = info.getSymbolMap();
+ iter = discoveredSymbols.keySet().iterator();
+ while (iter.hasNext()) {
+ String symbol = (String)iter.next();
+ SymbolEntry se = (SymbolEntry)discoveredSymbols.get(symbol);
+ for (Iterator i = se.getActiveRaw().iterator(); i.hasNext();) {
+ String value = (String)i.next();
+ Element symbolElement = doc.createElement(DEFINED_SYMBOL);
+ symbolElement.setAttribute(SYMBOL, value);
+ rootElement.appendChild(symbolElement);
+ }
+ for (Iterator i = se.getRemovedRaw().iterator(); i.hasNext();) {
+ String value = (String)i.next();
+ Element symbolElement = doc.createElement(DEFINED_SYMBOL);
+ symbolElement.setAttribute(SYMBOL, value);
+ symbolElement.setAttribute(REMOVED, "true"); //$NON-NLS-1$
+ rootElement.appendChild(symbolElement);
+ }
+ }
+ }
+ }
+
+ private static void saveDiscoveredScannerInfoToState(DiscoveredPathInfo info) throws CoreException {
+ // Create document
+ try {
+ DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+ Document doc = builder.newDocument();
+ Element rootElement = doc.createElement("scannerInfo"); //$NON-NLS-1$
+ rootElement.setAttribute("id", CDESCRIPTOR_ID); //$NON-NLS-1$
+ doc.appendChild(rootElement);
+
+ saveDiscoveredScannerInfo(info, rootElement, doc);
+
+ // Transform the document to something we can save in a file
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ Transformer transformer = TransformerFactory.newInstance().newTransformer();
+ transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
+ transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //$NON-NLS-1$
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
+ DOMSource source = new DOMSource(doc);
+ StreamResult result = new StreamResult(stream);
+ transformer.transform(source, result);
+
+ // Save the document
+ IPath path = MakeCorePlugin.getWorkingDirectory();
+ path = path.append(info.getProject().getName() + ".sc"); //$NON-NLS-1$
+ try {
+ FileOutputStream file = new FileOutputStream(path.toFile());
+ file.write(stream.toByteArray());
+ file.close();
+ } catch (IOException e) {
+ throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1,
+ MakeMessages.getString("GCCScannerConfigUtil.Error_Message"), e)); //$NON-NLS-1$
+ }
+
+ // Close the streams
+ stream.close();
+ } catch (TransformerException e) {
+ MakeCorePlugin.log(e);
+ throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1,
+ MakeMessages.getString("GCCScannerConfigUtil.Error_Message"), e)); //$NON-NLS-1$
+ } catch (IOException e) {
+ MakeCorePlugin.log(e);
+ throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1,
+ MakeMessages.getString("GCCScannerConfigUtil.Error_Message"), e)); //$NON-NLS-1$
+ } catch (ParserConfigurationException e) {
+ MakeCorePlugin.log(e);
+ throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1,
+ MakeMessages.getString("GCCScannerConfigUtil.Error_Message"), e)); //$NON-NLS-1$
+ }
+ }
+
+ private void fireUpdate(final int type, final IDiscoveredPathInfo info) {
+ synchronized (listeners) {
+ final Iterator iterator = listeners.iterator();
+ while (iterator.hasNext()) {
+ Platform.run(new ISafeRunnable() {
+
+ public void handleException(Throwable exception) {
+ IStatus status = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, -1,
+ CCorePlugin.getResourceString("CDescriptorManager.exception.listenerError"), exception); //$NON-NLS-1$
+ CCorePlugin.log(status);
+ }
+
+ public void run() throws Exception {
+ switch (type) {
+ case INFO_CHANGED :
+ ((IDiscoveredInfoListener)iterator.next()).infoChanged(info);
+ break;
+ case INFO_REMOVED :
+ ((IDiscoveredInfoListener)iterator.next()).infoRemoved(info.getProject());
+ break;
+ }
+ }
+ });
+ }
+ }
+ }
+
+ public void addDiscoveredInfoListener(IDiscoveredInfoListener listener) {
+ listeners.add(listener);
+ }
+
+ public void removeDiscoveredInfoListener(IDiscoveredInfoListener listener) {
+ listeners.remove(listener);
+ }
+
+}
\ No newline at end of file
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/ScannerInfoCollector.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/ScannerInfoCollector.java
index d6467013b66..b99fd411ee0 100644
--- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/ScannerInfoCollector.java
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/ScannerInfoCollector.java
@@ -18,10 +18,18 @@ import java.util.List;
import java.util.Map;
import org.eclipse.cdt.core.CCProjectNature;
-import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.CProjectNature;
-import org.eclipse.cdt.core.parser.IScannerInfo;
-import org.eclipse.cdt.core.parser.IScannerInfoProvider;
+import org.eclipse.cdt.make.core.MakeCorePlugin;
+import org.eclipse.cdt.make.core.MakeProjectNature;
+import org.eclipse.cdt.make.core.scannerconfig.IExternalScannerInfoProvider;
+import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo;
+import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector;
+import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigBuilder;
+import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo;
+import org.eclipse.cdt.make.internal.core.MakeMessages;
+import org.eclipse.cdt.make.internal.core.scannerconfig.util.CygpathTranslator;
+import org.eclipse.cdt.make.internal.core.scannerconfig.util.ScannerConfigUtil;
+import org.eclipse.cdt.make.internal.core.scannerconfig.util.TraceUtil;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
@@ -31,18 +39,6 @@ import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.cdt.make.core.MakeProjectNature;
-
-import org.eclipse.cdt.make.core.MakeCorePlugin;
-import org.eclipse.cdt.make.core.scannerconfig.DiscoveredScannerInfo;
-import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo;
-import org.eclipse.cdt.make.core.scannerconfig.IExternalScannerInfoProvider;
-import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector;
-import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigBuilder;
-import org.eclipse.cdt.make.internal.core.MakeMessages;
-import org.eclipse.cdt.make.internal.core.scannerconfig.util.CygpathTranslator;
-import org.eclipse.cdt.make.internal.core.scannerconfig.util.ScannerConfigUtil;
-import org.eclipse.cdt.make.internal.core.scannerconfig.util.TraceUtil;
/**
@@ -152,27 +148,21 @@ public class ScannerInfoCollector implements IScannerInfoCollector {
* @param project
* @param monitor
*/
- private void updateScannerConfig(IProject project, IProgressMonitor monitor) {
- IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(project);
+ private void updateScannerConfig(IProject project, IProgressMonitor monitor) throws CoreException {
+ IDiscoveredPathInfo pathInfo = MakeCorePlugin.getDefault().getDiscoveryManager().getDiscoveredInfo(project);
monitor.beginTask(MakeMessages.getString("ScannerInfoCollector.Processing"), 100); //$NON-NLS-1$
- if (provider != null) {
- IScannerInfo scanInfo = provider.getScannerInformation(project);
- if (scanInfo != null) {
- if (scanInfo instanceof DiscoveredScannerInfo) {
- DiscoveredScannerInfo discScanInfo = (DiscoveredScannerInfo)scanInfo;
- String projectName = project.getName();
- monitor.subTask(MakeMessages.getString("ScannerInfoCollector.Processing")); //$NON-NLS-1$
- if (scannerConfigNeedsUpdate(discScanInfo, projectName)) {
- monitor.worked(50);
- monitor.subTask(MakeMessages.getString("ScannerInfoCollector.Updating") + projectName); //$NON-NLS-1$
- try {
- // update scanner configuration
- discScanInfo.update();
- monitor.worked(50);
- } catch (CoreException e) {
- MakeCorePlugin.log(e);
- }
- }
+ if (pathInfo != null) {
+ String projectName = project.getName();
+ monitor.subTask(MakeMessages.getString("ScannerInfoCollector.Processing")); //$NON-NLS-1$
+ if (scannerConfigNeedsUpdate(pathInfo)) {
+ monitor.worked(50);
+ monitor.subTask(MakeMessages.getString("ScannerInfoCollector.Updating") + projectName); //$NON-NLS-1$
+ try {
+ // update scanner configuration
+ MakeCorePlugin.getDefault().getDiscoveryManager().updateDiscoveredInfo(pathInfo);
+ monitor.worked(50);
+ } catch (CoreException e) {
+ MakeCorePlugin.log(e);
}
}
}
@@ -186,12 +176,12 @@ public class ScannerInfoCollector implements IScannerInfoCollector {
* @param projectName
* @return
*/
- private boolean scannerConfigNeedsUpdate(DiscoveredScannerInfo discScanInfo, String projectName) {
- List includes = (List) discoveredIncludes.get(projectName);
- List symbols = (List) discoveredSymbols.get(projectName);
+ private boolean scannerConfigNeedsUpdate(IDiscoveredPathInfo discPathInfo) {
+ List includes = (List) discoveredIncludes.get(discPathInfo.getProject().getName());
+ List symbols = (List) discoveredSymbols.get(discPathInfo.getProject().getName());
- boolean addedIncludes = includePathsNeedUpdate(discScanInfo, projectName, includes);
- boolean addedSymbols = definedSymbolsNeedUpdate(discScanInfo, projectName, symbols);
+ boolean addedIncludes = includePathsNeedUpdate(discPathInfo, includes);
+ boolean addedSymbols = definedSymbolsNeedUpdate(discPathInfo, symbols);
return (addedIncludes | addedSymbols);
}
@@ -199,13 +189,14 @@ public class ScannerInfoCollector implements IScannerInfoCollector {
/**
* Compare include paths with already discovered.
*
- * @param discScanInfo
+ * @param discPathInfo
* @param projectName
* @param includes
* @return
*/
- private boolean includePathsNeedUpdate(DiscoveredScannerInfo discScanInfo, String projectName, List includes) {
+ private boolean includePathsNeedUpdate(IDiscoveredPathInfo discPathInfo, List includes) {
boolean addedIncludes = false;
+ String projectName = discPathInfo.getProject().getName();
if (includes != null) {
// Step 1. Add discovered scanner config to the existing discovered scanner config
// add the includes from the latest discovery
@@ -222,7 +213,7 @@ public class ScannerInfoCollector implements IScannerInfoCollector {
List finalSumIncludes = translateIncludePaths(sumIncludes);
// Step 2. Get project's scanner config
- LinkedHashMap persistedIncludes = discScanInfo.getDiscoveredIncludePaths();
+ LinkedHashMap persistedIncludes = discPathInfo.getIncludeMap();
// Step 3. Merge scanner config from steps 1 and 2
// order is important, use list to preserve it
@@ -248,7 +239,7 @@ public class ScannerInfoCollector implements IScannerInfoCollector {
}
// Step 4. Set resulting scanner config
- discScanInfo.setDiscoveredIncludePaths(newPersistedIncludes);
+ discPathInfo.setIncludeMap(newPersistedIncludes);
// Step 5. Invalidate discovered include paths
discoveredIncludes.put(projectName, null);
@@ -259,13 +250,14 @@ public class ScannerInfoCollector implements IScannerInfoCollector {
/**
* Compare symbol definitions with already discovered.
*
- * @param discScanInfo
+ * @param discPathInfo
* @param projectName
* @param symbols
* @return
*/
- private boolean definedSymbolsNeedUpdate(DiscoveredScannerInfo discScanInfo, String projectName, List symbols) {
+ private boolean definedSymbolsNeedUpdate(IDiscoveredPathInfo discPathInfo, List symbols) {
boolean addedSymbols = false;
+ String projectName = discPathInfo.getProject().getName();
if (symbols != null) {
// Step 1. Add discovered scanner config to the existing discovered scanner config
// add the symbols from the latest discovery
@@ -277,14 +269,14 @@ public class ScannerInfoCollector implements IScannerInfoCollector {
addedSymbols = ScannerConfigUtil.scAddSymbolsList2SymbolEntryMap(sumSymbols, symbols, false);
// Step 2. Get project's scanner config
- LinkedHashMap persistedSymbols = discScanInfo.getDiscoveredSymbolDefinitions();
+ LinkedHashMap persistedSymbols = discPathInfo.getSymbolMap();
// Step 3. Merge scanner config from steps 1 and 2
LinkedHashMap candidateSymbols = new LinkedHashMap(persistedSymbols);
addedSymbols |= ScannerConfigUtil.scAddSymbolEntryMap2SymbolEntryMap(candidateSymbols, sumSymbols);
// Step 4. Set resulting scanner config
- discScanInfo.setDiscoveredSymbolDefinitions(candidateSymbols);
+ discPathInfo.setSymbolMap(candidateSymbols);
// Step 5. Invalidate discovered symbol definitions
discoveredSymbols.put(projectName, null);
@@ -376,7 +368,7 @@ public class ScannerInfoCollector implements IScannerInfoCollector {
* @param project
* @param monitor
*/
- public synchronized void updateScannerConfiguration(IProject project, IProgressMonitor monitor) {
+ public synchronized void updateScannerConfiguration(IProject project, IProgressMonitor monitor) throws CoreException {
currentProject = project;
String projectName = project.getName();
// check TSO for the project
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/util/ScannerConfigUtil.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/util/ScannerConfigUtil.java
index cb29f869517..8c57ee51005 100644
--- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/util/ScannerConfigUtil.java
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/util/ScannerConfigUtil.java
@@ -19,6 +19,8 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
+import org.eclipse.core.runtime.IPath;
+
/**
* Utility class that handles some Scanner Config specifig collection conversions
*
@@ -270,4 +272,18 @@ public final class ScannerConfigUtil {
}
return (String[]) allTokens.toArray(new String[allTokens.size()]);
}
+
+ /**
+ * Converts array of IPath-s to array of String-s
+ *
+ * @param paths
+ * @return
+ */
+ public static String[] iPathArray2StringArray(IPath[] paths) {
+ String[] rv = new String[paths.length];
+ for (int i = 0; i < paths.length; ++i) {
+ rv[i] = paths[i].toString();
+ }
+ return rv;
+ }
}
diff --git a/build/org.eclipse.cdt.make.ui/plugin.properties b/build/org.eclipse.cdt.make.ui/plugin.properties
index 7363042ce42..10a6aab3306 100644
--- a/build/org.eclipse.cdt.make.ui/plugin.properties
+++ b/build/org.eclipse.cdt.make.ui/plugin.properties
@@ -44,4 +44,7 @@ ActionDefinition.uncomment.description= Uncomment the selected # style comment l
MakefileEditor.name=Makefile Editor
-ProjectPathProperies.name=C/C++ Project Paths
+IncludeSymbolProperties.name=C/C++ Include Paths & Symbols
+ProjectPathProperties.name=C/C++ Project Paths
+
+DiscoveredScannerInfoContainer.name=Discovered scanner configuration container
diff --git a/build/org.eclipse.cdt.make.ui/plugin.xml b/build/org.eclipse.cdt.make.ui/plugin.xml
index d94e7877267..52075e83a69 100644
--- a/build/org.eclipse.cdt.make.ui/plugin.xml
+++ b/build/org.eclipse.cdt.make.ui/plugin.xml
@@ -300,7 +300,7 @@
@@ -308,7 +308,26 @@
name="nature"
value="org.eclipse.cdt.make.core.makeNature">
-
+
+
+
+
+
+
+
+
@@ -437,4 +456,11 @@
-
+
+
+
+
diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/MakeProjectOptionBlock.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/MakeProjectOptionBlock.java
index 395841f1485..3b1861720bc 100644
--- a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/MakeProjectOptionBlock.java
+++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/MakeProjectOptionBlock.java
@@ -10,7 +10,7 @@ package org.eclipse.cdt.make.internal.ui;
import org.eclipse.cdt.make.core.MakeBuilder;
import org.eclipse.cdt.make.core.MakeCorePlugin;
-import org.eclipse.cdt.make.ui.dialogs.BuildPathInfoBlock;
+import org.eclipse.cdt.make.ui.dialogs.DiscoveryOptionsBlock;
import org.eclipse.cdt.make.ui.dialogs.SettingsBlock;
import org.eclipse.cdt.ui.dialogs.BinaryParserBlock;
import org.eclipse.cdt.ui.dialogs.ICOptionContainer;
@@ -30,7 +30,7 @@ public class MakeProjectOptionBlock extends TabFolderOptionBlock {
addTab(new SettingsBlock(MakeCorePlugin.getDefault().getPluginPreferences(), MakeBuilder.BUILDER_ID));
addTab(new ErrorParserBlock(MakeCorePlugin.getDefault().getPluginPreferences()));
addTab(new BinaryParserBlock());
- addTab(new BuildPathInfoBlock());
+ addTab(new DiscoveryOptionsBlock());
}
}
diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/MakeResources.properties b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/MakeResources.properties
index d9a51f22a51..bcb0e20b019 100644
--- a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/MakeResources.properties
+++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/MakeResources.properties
@@ -219,7 +219,8 @@ ManageDefinedSymbolsDialog.userGroup.title=User specified symbol definitions
ManageDefinedSymbolsDialog.discoveredGroup.title=Discovered symbol definitions
# --- ScannerConfigOptionsDialog ---
-ScannerConfigOptionsDialog.title=Scanner configuration discovery options
+ScannerConfigOptionsDialog.title=Discovery Options
+ScannerConfigOptionsDialog.description=Set the scanner configuration discovery options for this project
ScannerConfigOptionsDialog.siBuilder.parser.group_label=Build output parser options
ScannerConfigOptionsDialog.siBuilder.parser.enable.label=Enable build output parser
ScannerConfigOptionsDialog.siBuilder.parser.label=Make build output parser:
@@ -230,3 +231,8 @@ ScannerConfigOptionsDialog.siProvider.cmd.use_default=Use default
ScannerConfigOptionsDialog.siProvider.cmd.label=Generate scanner info command:
ScannerConfigOptionsDialog.siProvider.parser.label=Command output parser:
ScannerConfigOptionsDialog.siProvider.cmd.error_message=Must enter a 'generate scanner info' command
+
+# --- DiscoveredScannerConfigurationContainerPage ---
+DiscoveredScannerConfigurationContainerPage.title=Edit container
+DiscoveredScannerConfigurationContainerPage.description=Manage discovered scanner configuration
+DiscoveredScannerConfigurationContainerPage.list.title=Discovered include paths and symbol definitions
diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/scannerconfig/DiscoveredElement.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/scannerconfig/DiscoveredElement.java
new file mode 100644
index 00000000000..2818087aeee
--- /dev/null
+++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/scannerconfig/DiscoveredElement.java
@@ -0,0 +1,221 @@
+/**********************************************************************
+ * Copyright (c) 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.cdt.make.internal.ui.scannerconfig;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.core.resources.IProject;
+
+/**
+ * Similar to CPElement. Describes discovered paths and symbols available
+ * through DiscoveredPathInfo instead of CPathEntry.
+ *
+ * @author vhirsl
+ */
+public class DiscoveredElement {
+ public static final int CONTAINER = 1;
+ public static final int INCLUDE_PATH = 2;
+ public static final int SYMBOL_DEFINITION = 3;
+ public static final int PATHS_GROUP = 4;
+ public static final int SYMBOLS_GROUP = 5;
+
+ private IProject fProject;
+ private String fEntry;
+ private int fEntryKind;
+ private boolean fRemoved;
+ private boolean fSystem;
+
+ private ArrayList fChildren = new ArrayList();
+ private DiscoveredElement fParent;
+
+ public DiscoveredElement(IProject project, String entry, int kind, boolean removed, boolean system) {
+ fProject = project;
+ fEntry = entry;
+ fEntryKind = kind;
+ fRemoved = removed;
+ fSystem = system;
+ }
+
+ public static DiscoveredElement createNew(DiscoveredElement parent,
+ IProject project,
+ String entry,
+ int kind,
+ boolean removed,
+ boolean system) {
+ DiscoveredElement rv = null;
+ switch (kind) {
+ case CONTAINER: {
+ rv = new DiscoveredElement(project, entry, kind, removed, system);
+ DiscoveredElement group = new DiscoveredElement(project, null, PATHS_GROUP, false, false);
+ rv.fChildren.add(group);
+ group.fParent = rv;
+ group = new DiscoveredElement(project, null, SYMBOLS_GROUP, false, false);
+ rv.fChildren.add(group);
+ group.fParent = rv;
+ }
+ break;
+ case INCLUDE_PATH: {
+ if (parent != null) {
+ DiscoveredElement group = null;
+ if (parent.getEntryKind() == PATHS_GROUP) {
+ parent = parent.getParent();
+ group = parent;
+ }
+ else if (parent.getEntryKind() == CONTAINER) {
+ for (Iterator i = parent.fChildren.iterator(); i.hasNext(); ) {
+ DiscoveredElement child = (DiscoveredElement) i.next();
+ if (child.getEntryKind() == PATHS_GROUP) {
+ group = child;
+ break;
+ }
+ }
+ if (group == null) {
+ return null;
+ }
+ }
+ if (parent.getEntryKind() == CONTAINER) {
+ rv = new DiscoveredElement(project, entry, kind, removed, system);
+ group.fChildren.add(rv);
+ rv.setParent(group);
+ }
+ }
+ }
+ break;
+ case SYMBOL_DEFINITION: {
+ if (parent != null) {
+ DiscoveredElement group = null;
+ if (parent.getEntryKind() == SYMBOLS_GROUP) {
+ parent = parent.getParent();
+ group = parent;
+ }
+ else if (parent.getEntryKind() == CONTAINER) {
+ for (Iterator i = parent.fChildren.iterator(); i.hasNext(); ) {
+ DiscoveredElement child = (DiscoveredElement) i.next();
+ if (child.getEntryKind() == SYMBOLS_GROUP) {
+ group = child;
+ break;
+ }
+ }
+ if (group == null) {
+ return null;
+ }
+ }
+ if (parent.getEntryKind() == CONTAINER) {
+ rv = new DiscoveredElement(project, entry, kind, removed, system);
+ group.fChildren.add(rv);
+ rv.setParent(group);
+ }
+ }
+ }
+ break;
+ }
+ return rv;
+ }
+ /**
+ * @return Returns the fProject.
+ */
+ public IProject getProject() {
+ return fProject;
+ }
+ /**
+ * @return Returns the fEntry.
+ */
+ public String getEntry() {
+ return fEntry;
+ }
+ /**
+ * @param string
+ */
+ public void setEntry(String entry) {
+ fEntry = entry;
+ }
+ /**
+ * @return Returns the fEntryKind.
+ */
+ public int getEntryKind() {
+ return fEntryKind;
+ }
+ /**
+ * @param entryKind The fEntryKind to set.
+ */
+ public void setEntryKind(int entryKind) {
+ fEntryKind = entryKind;
+ }
+ /**
+ * @return Returns the fRemoved.
+ */
+ public boolean isRemoved() {
+ return fRemoved;
+ }
+ /**
+ * @param removed The fRemoved to set.
+ */
+ public void setRemoved(boolean removed) {
+ fRemoved = removed;
+ }
+ /**
+ * @return Returns the fParent.
+ */
+ public DiscoveredElement getParent() {
+ return fParent;
+ }
+ /**
+ * @param parent The fParent to set.
+ */
+ private void setParent(DiscoveredElement parent) {
+ fParent = parent;
+ }
+
+ /**
+ * Returns children of the discovered element
+ * @return
+ */
+ public Object[] getChildren() {
+ switch(fEntryKind) {
+ case INCLUDE_PATH:
+ case SYMBOL_DEFINITION:
+ return new Object[0];
+ }
+ return fChildren.toArray();
+ }
+
+ public boolean hasChildren() {
+ switch(fEntryKind) {
+ case INCLUDE_PATH:
+ case SYMBOL_DEFINITION:
+ return false;
+ }
+ return (fChildren.size() > 0);
+ }
+
+ public void setChildren(Object[] children) {
+ fChildren = new ArrayList(Arrays.asList(children));
+ }
+
+ /**
+ *
+ */
+ public boolean delete() {
+ boolean rc = false;
+ DiscoveredElement parent = getParent();
+ if (parent != null) {
+ rc = parent.fChildren.remove(this);
+ for (Iterator i = fChildren.iterator(); i.hasNext(); ) {
+ DiscoveredElement child = (DiscoveredElement) i.next();
+ child.setParent(null);
+ rc |= true;
+ }
+ }
+ return rc;
+ }
+}
diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/scannerconfig/DiscoveredElementLabelProvider.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/scannerconfig/DiscoveredElementLabelProvider.java
new file mode 100644
index 00000000000..5a81083ccd2
--- /dev/null
+++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/scannerconfig/DiscoveredElementLabelProvider.java
@@ -0,0 +1,181 @@
+/**********************************************************************
+ * Copyright (c) 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.cdt.make.internal.ui.scannerconfig;
+
+import org.eclipse.cdt.internal.ui.CPluginImages;
+import org.eclipse.cdt.internal.ui.dialogs.cpaths.CPathEntryMessages;
+import org.eclipse.cdt.internal.ui.util.ImageDescriptorRegistry;
+import org.eclipse.cdt.ui.CUIPlugin;
+import org.eclipse.jface.resource.CompositeImageDescriptor;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IColorProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Label provider for DiscoveredElement-s. DiscoveredElement can be active or removed.
+ *
+ * @author vhirsl
+ */
+public class DiscoveredElementLabelProvider extends LabelProvider implements IColorProvider {
+ private final Color inDirect = new Color(Display.getDefault(), new RGB(170, 170, 170));
+
+ private ImageDescriptor fIncludeIcon, fMacroIcon, fContainerImage;
+ private ImageDescriptor fRemovedIncludeIcon, fRemovedMacroIcon;
+ private ImageDescriptorRegistry fRegistry;
+
+ public DiscoveredElementLabelProvider() {
+ fRegistry = CUIPlugin.getImageDescriptorRegistry();
+ fIncludeIcon = CPluginImages.DESC_OBJS_INCLUDES_FOLDER;
+ fMacroIcon = CPluginImages.DESC_OBJS_MACRO;
+ fContainerImage = CPluginImages.DESC_OBJS_LIBRARY;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
+ */
+ public Image getImage(Object element) {
+ if (element instanceof DiscoveredElement) {
+ DiscoveredElement elem = (DiscoveredElement) element;
+ Image image = composeImage(elem);
+ if (image != null) {
+ return image;
+ }
+ }
+ return super.getImage(element);
+ }
+ /**
+ * @param elem
+ * @return
+ */
+ private Image composeImage(DiscoveredElement elem) {
+ Image image = null;
+ switch (elem.getEntryKind()) {
+ case DiscoveredElement.PATHS_GROUP:
+ image = CPluginImages.get(CPluginImages.IMG_OBJS_INCLUDES_CONTAINER);
+ break;
+ case DiscoveredElement.CONTAINER:
+ image = fRegistry.get(fContainerImage);
+ break;
+ case DiscoveredElement.INCLUDE_PATH:
+ image = fRegistry.get(fIncludeIcon);
+ break;
+ case DiscoveredElement.SYMBOLS_GROUP:
+ case DiscoveredElement.SYMBOL_DEFINITION:
+ image = fRegistry.get(fMacroIcon);
+ break;
+ }
+ if (image != null && elem.isRemoved()) {
+ image = new DiscoveredElementImageDescriptor(image, true).createImage();
+ }
+ return image;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
+ */
+ public String getText(Object element) {
+ if (element instanceof DiscoveredElement) {
+ DiscoveredElement elem = (DiscoveredElement) element;
+ switch (elem.getEntryKind()) {
+ case DiscoveredElement.PATHS_GROUP:
+ return CPathEntryMessages.getString("CPElementLabelProvider.Includes"); //$NON-NLS-1$
+ case DiscoveredElement.SYMBOLS_GROUP:
+ return CPathEntryMessages.getString("CPElementLabelProvider.PreprocessorSymbols"); //$NON-NLS-1$
+ case DiscoveredElement.CONTAINER:
+ case DiscoveredElement.INCLUDE_PATH:
+ case DiscoveredElement.SYMBOL_DEFINITION:
+ return elem.getEntry() + (elem.isRemoved() ? " (removed)" : "");
+ }
+ }
+ return super.getText(element);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
+ */
+ public Color getForeground(Object element) {
+ if (element instanceof DiscoveredElement) {
+ DiscoveredElement elem = (DiscoveredElement) element;
+ switch (elem.getEntryKind()) {
+ case DiscoveredElement.INCLUDE_PATH:
+ case DiscoveredElement.SYMBOL_DEFINITION:
+ if (elem.isRemoved()) {
+ return inDirect;
+ }
+ }
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
+ */
+ public Color getBackground(Object element) {
+ return null;
+ }
+
+ /**
+ * ComositeImageDescriptor adds 'removed' image overlay to the DiscoveredElement
+ *
+ * @author vhirsl
+ */
+ private class DiscoveredElementImageDescriptor extends CompositeImageDescriptor {
+ private Image fBaseImage;
+ private boolean showRemoved;
+ private Point fSize;
+
+ public DiscoveredElementImageDescriptor(Image baseImage, boolean removed) {
+ fBaseImage = baseImage;
+ showRemoved = removed;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.resource.CompositeImageDescriptor#drawCompositeImage(int, int)
+ */
+ protected void drawCompositeImage(int width, int height) {
+ ImageData bg = fBaseImage.getImageData();
+ if (bg == null) {
+ bg = DEFAULT_IMAGE_DATA;
+ }
+ drawImage(bg, 0, 0);
+ drawOverlays();
+ }
+
+ /**
+ * Add any overlays to the image as specified in the flags.
+ */
+ protected void drawOverlays() {
+ ImageData data = null;
+ if (showRemoved) {
+ data = CPluginImages.DESC_OVR_ERROR.getImageData();
+ drawImage(data, 0, 0);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.resource.CompositeImageDescriptor#getSize()
+ */
+ protected Point getSize() {
+ if (fSize == null) {
+ ImageData data = fBaseImage.getImageData();
+ fSize = new Point(data.width, data.height);
+ }
+ return fSize;
+ }
+
+ }
+}
diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/scannerconfig/DiscoveredElementSorter.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/scannerconfig/DiscoveredElementSorter.java
new file mode 100644
index 00000000000..b3ed67622f1
--- /dev/null
+++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/scannerconfig/DiscoveredElementSorter.java
@@ -0,0 +1,58 @@
+/**********************************************************************
+ * Copyright (c) 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.cdt.make.internal.ui.scannerconfig;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+
+/**
+ * TODO Provide description
+ *
+ * @author vhirsl
+ */
+public class DiscoveredElementSorter extends ViewerSorter {
+ private static final int CONTAINER = 0;
+ private static final int PATHS_GROUP = 1;
+ private static final int SYMBOLS_GROUP = 2;
+ private static final int OTHER = 5;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ViewerSorter#category(java.lang.Object)
+ */
+ public int category(Object element) {
+ if (element instanceof DiscoveredElement) {
+ DiscoveredElement elem = (DiscoveredElement) element;
+ switch (elem.getEntryKind()) {
+ case DiscoveredElement.CONTAINER:
+ return CONTAINER;
+ case DiscoveredElement.PATHS_GROUP:
+ return PATHS_GROUP;
+ case DiscoveredElement.SYMBOLS_GROUP:
+ return SYMBOLS_GROUP;
+ }
+ }
+ return OTHER;
+ }
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ViewerSorter#sort(org.eclipse.jface.viewers.Viewer, java.lang.Object[])
+ */
+ public void sort(Viewer viewer, Object[] elements) {
+ if (elements.length > 0 && elements[0] instanceof DiscoveredElement) {
+ DiscoveredElement firstElem = (DiscoveredElement) elements[0];
+ switch (firstElem.getEntryKind()) {
+ case DiscoveredElement.INCLUDE_PATH:
+ case DiscoveredElement.SYMBOL_DEFINITION:
+ return;
+ }
+ }
+ super.sort(viewer, elements);
+ }
+}
diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/IMakeHelpContextIds.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/IMakeHelpContextIds.java
index 4aaf08d4815..559dc1d55bf 100644
--- a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/IMakeHelpContextIds.java
+++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/IMakeHelpContextIds.java
@@ -17,4 +17,5 @@ public interface IMakeHelpContextIds {
public static final String MAKE_PATH_SYMBOL_SETTINGS = PREFIX + "cdt_paths_symbols_page"; //$NON-NLS-1$
public static final String MAKE_BUILDER_SETTINGS = PREFIX + "cdt_make_builder_page"; //$NON-NLS-1$
+ public static final String SCANNER_CONFIG_DISCOVERY_OPTIONS = PREFIX + "cdt_discovery_options_page"; //$NON-NLS-1$
}
diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/BuildPathInfoBlock.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/BuildPathInfoBlock.java
index 7127e5ab5f5..30d22e83c33 100644
--- a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/BuildPathInfoBlock.java
+++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/BuildPathInfoBlock.java
@@ -12,16 +12,15 @@
package org.eclipse.cdt.make.ui.dialogs;
import java.util.ArrayList;
+import java.util.LinkedHashMap;
import java.util.StringTokenizer;
-import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.internal.ui.util.SWTUtil;
import org.eclipse.cdt.make.core.MakeCorePlugin;
import org.eclipse.cdt.make.core.MakeProjectNature;
-import org.eclipse.cdt.make.core.MakeScannerInfo;
-import org.eclipse.cdt.make.core.scannerconfig.DiscoveredScannerInfo;
+import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo;
import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigNature;
+import org.eclipse.cdt.make.internal.core.scannerconfig.util.ScannerConfigUtil;
import org.eclipse.cdt.make.internal.ui.MakeUIPlugin;
import org.eclipse.cdt.make.ui.IMakeHelpContextIds;
import org.eclipse.cdt.ui.dialogs.AbstractCOptionPage;
@@ -243,26 +242,17 @@ public class BuildPathInfoBlock extends AbstractCOptionPage {
if (project != null) {
// Store the paths and symbols
monitor.beginTask(MakeUIPlugin.getResourceString("BuildPathInfoBlock.monitor.settingScannerInfo"), 3); //$NON-NLS-1$
- IScannerInfo info = CCorePlugin.getDefault().getScannerInfoProvider(project).getScannerInformation(project);
- if (info instanceof MakeScannerInfo) {
- MakeScannerInfo mInfo = (MakeScannerInfo) info;
- mInfo.setIncludePaths(getPathListContents());
- monitor.worked(1);
- mInfo.setPreprocessorSymbols(getSymbolListContents());
- monitor.worked(1);
- mInfo.update();
- monitor.done();
+ IDiscoveredPathInfo info = MakeCorePlugin.getDefault().getDiscoveryManager().getDiscoveredInfo(project);
+ boolean changed = manageIncludesDialog.saveTo(info);
+ monitor.worked(1);
+ changed |= manageSymbolsDialog.saveTo(info);
+ monitor.worked(1);
+ if (changed) {
+ MakeCorePlugin.getDefault().getDiscoveryManager().updateDiscoveredInfo(info);
}
- else if (info instanceof DiscoveredScannerInfo) {
- DiscoveredScannerInfo dInfo = (DiscoveredScannerInfo) info;
- manageIncludesDialog.saveTo(dInfo);
- monitor.worked(1);
- manageSymbolsDialog.saveTo(dInfo);
- monitor.worked(1);
- dInfo.update();
- monitor.done();
- }
- } else {
+ monitor.done();
+ }
+ else {
setIncludes(MakeCorePlugin.getDefault().getPluginPreferences());
setSymbols(MakeCorePlugin.getDefault().getPluginPreferences());
}
@@ -276,10 +266,10 @@ public class BuildPathInfoBlock extends AbstractCOptionPage {
pathList.removeAll();
symbolList.removeAll();
- if (getContainer().getProject() != null) {
- pathList.setItems(getIncludes(MakeCorePlugin.getDefault().getPluginPreferences()));
- symbolList.setItems(getSymbols(MakeCorePlugin.getDefault().getPluginPreferences()));
- }
+// if (getContainer().getProject() != null) {
+// pathList.setItems(getIncludes(MakeCorePlugin.getDefault().getPluginPreferences()));
+// symbolList.setItems(getSymbols(MakeCorePlugin.getDefault().getPluginPreferences()));
+// }
manageIncludesDialog.restore();
manageSymbolsDialog.restore();
getContainer().updateContainer();
@@ -475,20 +465,25 @@ public class BuildPathInfoBlock extends AbstractCOptionPage {
private void setListContents() {
IProject project = getContainer().getProject();
if (project != null) {
- IScannerInfo info = CCorePlugin.getDefault().getScannerInfoProvider(project).getScannerInformation(project);
- if (info instanceof MakeScannerInfo) {
- MakeScannerInfo mInfo = (MakeScannerInfo) info;
- pathList.setItems(mInfo.getIncludePaths());
- symbolList.setItems(mInfo.getPreprocessorSymbols());
+// IScannerInfo info = CCorePlugin.getDefault().getScannerInfoProvider(project).getScannerInformation(project);
+// if (info != null) {
+// pathList.setItems(info.getIncludePaths());
+// symbolList.setItems(info.getPreprocessorSymbols());
+// }
+ try {
+ IDiscoveredPathInfo info = MakeCorePlugin.getDefault().getDiscoveryManager().getDiscoveredInfo(project);
+ pathList.setItems(ScannerConfigUtil.iPathArray2StringArray(info.getIncludePaths()));
+ LinkedHashMap discoveredSymbols = info.getSymbolMap();
+ ArrayList activeSymbols = new ArrayList();
+ activeSymbols.addAll(ScannerConfigUtil.scSymbolsSymbolEntryMap2List(discoveredSymbols, true));
+ symbolList.setItems((String[]) activeSymbols.toArray(new String[activeSymbols.size()]));
+ } catch (CoreException e) {
+ MakeCorePlugin.log(e);
}
- else if (info instanceof DiscoveredScannerInfo) {
- DiscoveredScannerInfo dInfo = (DiscoveredScannerInfo) info;
- pathList.setItems(dInfo.getIncludePaths());
- symbolList.setItems(dInfo.getPreprocessorSymbols());
- }
- } else {
- pathList.setItems(getIncludes(MakeCorePlugin.getDefault().getPluginPreferences()));
- symbolList.setItems(getSymbols(MakeCorePlugin.getDefault().getPluginPreferences()));
}
+// else {
+// pathList.setItems(getIncludes(MakeCorePlugin.getDefault().getPluginPreferences()));
+// symbolList.setItems(getSymbols(MakeCorePlugin.getDefault().getPluginPreferences()));
+// }
}
}
diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/DiscoveredPathContainerPage.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/DiscoveredPathContainerPage.java
new file mode 100644
index 00000000000..e9c4a212726
--- /dev/null
+++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/DiscoveredPathContainerPage.java
@@ -0,0 +1,619 @@
+/**********************************************************************
+ * Copyright (c) 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.cdt.make.ui.dialogs;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+import org.eclipse.cdt.core.model.CModelException;
+import org.eclipse.cdt.core.model.CoreModel;
+import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.core.model.IContainerEntry;
+import org.eclipse.cdt.core.model.IPathEntry;
+import org.eclipse.cdt.core.model.IPathEntryContainer;
+import org.eclipse.cdt.internal.ui.CPluginImages;
+import org.eclipse.cdt.internal.ui.util.PixelConverter;
+import org.eclipse.cdt.internal.ui.wizards.dialogfields.DialogField;
+import org.eclipse.cdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
+import org.eclipse.cdt.internal.ui.wizards.dialogfields.ITreeListAdapter;
+import org.eclipse.cdt.internal.ui.wizards.dialogfields.LayoutUtil;
+import org.eclipse.cdt.internal.ui.wizards.dialogfields.TreeListDialogField;
+import org.eclipse.cdt.make.core.MakeCorePlugin;
+import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo;
+import org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredPathContainer;
+import org.eclipse.cdt.make.internal.core.scannerconfig.ScannerInfoCollector;
+import org.eclipse.cdt.make.internal.core.scannerconfig.util.ScannerConfigUtil;
+import org.eclipse.cdt.make.internal.core.scannerconfig.util.SymbolEntry;
+import org.eclipse.cdt.make.internal.ui.MakeUIPlugin;
+import org.eclipse.cdt.make.internal.ui.scannerconfig.DiscoveredElement;
+import org.eclipse.cdt.make.internal.ui.scannerconfig.DiscoveredElementLabelProvider;
+import org.eclipse.cdt.make.internal.ui.scannerconfig.DiscoveredElementSorter;
+import org.eclipse.cdt.ui.wizards.ICPathContainerPage;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * A dialog page to manage discovered scanner configuration
+ *
+ * @author vhirsl
+ */
+public class DiscoveredPathContainerPage extends WizardPage implements ICPathContainerPage {
+ private static final String PREFIX = "DiscoveredScannerConfigurationContainerPage"; //$NON-NLS-1$
+
+ private static final String DISC_COMMON_PREFIX = "ManageScannerConfigDialogCommon"; //$NON-NLS-1$
+ private static final String UP = DISC_COMMON_PREFIX + ".discoveredGroup.buttons.up.label"; //$NON-NLS-1$
+ private static final String DOWN = DISC_COMMON_PREFIX + ".discoveredGroup.buttons.down.label"; //$NON-NLS-1$
+ private static final String REMOVE = DISC_COMMON_PREFIX + ".discoveredGroup.buttons.remove.label"; //$NON-NLS-1$
+ private static final String RESTORE = DISC_COMMON_PREFIX + ".discoveredGroup.buttons.restore.label"; //$NON-NLS-1$
+ private static final String DELETE = DISC_COMMON_PREFIX + ".discoveredGroup.buttons.delete.label"; //$NON-NLS-1$
+
+ private static final String CONTAINER_LABEL = PREFIX + ".title"; //$NON-NLS-1$
+ private static final String CONTAINER_DESCRIPTION = PREFIX + ".description"; //$NON-NLS-1$
+ private static final String CONTAINER_LIST_LABEL = PREFIX + ".list.title"; //$NON-NLS-1$
+
+ private final int IDX_UP = 0;
+ private final int IDX_DOWN = 1;
+ private final int IDX_REMOVE = 2;
+ private final int IDX_RESTORE = 3;
+
+ private final int IDX_DELETE = 5;
+
+ private static final int DISC_UP = 0;
+ private static final int DISC_DOWN = 1;
+
+ private static final int DO_REMOVE = 0;
+ private static final int DO_RESTORE = 1;
+
+ private ICProject fCProject;
+ private IContainerEntry fPathEntry;
+
+ private TreeListDialogField fDiscoveredContainerList;
+ private boolean dirty;
+
+ public DiscoveredPathContainerPage() {
+ super("DiscoveredScannerConfigurationContainerPage"); //$NON-NLS-1$
+
+ setTitle(MakeUIPlugin.getResourceString(CONTAINER_LABEL));
+ setDescription(MakeUIPlugin.getResourceString(CONTAINER_DESCRIPTION));
+ setImageDescriptor(CPluginImages.DESC_WIZBAN_ADD_LIBRARY);
+
+ String[] buttonLabels = new String[]{
+ /* IDX_UP */ MakeUIPlugin.getResourceString(UP),
+ /* IDX_DOWN */ MakeUIPlugin.getResourceString(DOWN),
+ /* IDX_REMOVE */MakeUIPlugin.getResourceString(REMOVE),
+ /* IDX_RESTORE */MakeUIPlugin.getResourceString(RESTORE),
+ null,
+ /* IDX_DELETE */MakeUIPlugin.getResourceString(DELETE),
+ };
+
+ DiscoveredContainerAdapter adapter = new DiscoveredContainerAdapter();
+
+ fDiscoveredContainerList = new TreeListDialogField(adapter, buttonLabels, new DiscoveredElementLabelProvider());
+ fDiscoveredContainerList.setDialogFieldListener(adapter);
+ fDiscoveredContainerList.setLabelText(MakeUIPlugin.getResourceString(CONTAINER_LIST_LABEL)); //$NON-NLS-1$
+
+ fDiscoveredContainerList.setViewerSorter(new DiscoveredElementSorter());
+ dirty = false;
+ }
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.ui.wizards.ICPathContainerPage#initialize(org.eclipse.cdt.core.model.ICProject, org.eclipse.cdt.core.model.IPathEntry[])
+ */
+ public void initialize(ICProject project, IPathEntry[] currentEntries) {
+ fCProject = project;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.ui.wizards.ICPathContainerPage#finish()
+ */
+ public boolean finish() {
+ if (!dirty) {
+ return true;
+ }
+ IDiscoveredPathInfo info;
+ try {
+ info = MakeCorePlugin.getDefault().
+ getDiscoveryManager().getDiscoveredInfo(fCProject.getProject());
+
+ LinkedHashMap includes = new LinkedHashMap();
+ LinkedHashMap symbols = new LinkedHashMap();
+
+ DiscoveredElement container = (DiscoveredElement) fDiscoveredContainerList.getElement(0);
+ if (container != null && container.getEntryKind() == DiscoveredElement.CONTAINER) {
+ Object[] cChildren = container.getChildren();
+ if (cChildren != null) {
+ for (int i = 0; i < cChildren.length; ++i) {
+ DiscoveredElement group = (DiscoveredElement) cChildren[i];
+ switch (group.getEntryKind()) {
+ case DiscoveredElement.PATHS_GROUP: {
+ // get the include paths
+ Object[] gChildren = group.getChildren();
+ if (gChildren != null) {
+ for (int j = 0; j < gChildren.length; ++j) {
+ DiscoveredElement include = (DiscoveredElement) gChildren[j];
+ includes.put(include.getEntry(), Boolean.valueOf(include.isRemoved()));
+ }
+ }
+ }
+ break;
+ case DiscoveredElement.SYMBOLS_GROUP: {
+ // get the symbol definitions
+ Object[] gChildren = group.getChildren();
+ if (gChildren != null) {
+ for (int j = 0; j < gChildren.length; ++j) {
+ DiscoveredElement symbol = (DiscoveredElement) gChildren[j];
+ ScannerConfigUtil.scAddSymbolString2SymbolEntryMap(symbols, symbol.getEntry(), !symbol.isRemoved());
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+ info.setIncludeMap(includes);
+ info.setSymbolMap(symbols);
+
+ try {
+ // update scanner configuration
+ MakeCorePlugin.getDefault().getDiscoveryManager().updateDiscoveredInfo(info);
+ return true;
+ } catch (CoreException e) {
+ MakeCorePlugin.log(e);
+ }
+ } catch (CoreException e) {
+ MakeCorePlugin.log(e);
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.ui.wizards.ICPathContainerPage#getContainerEntries()
+ */
+ public IPathEntry[] getContainerEntries() {
+ return new IPathEntry[] { fPathEntry };
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.ui.wizards.ICPathContainerPage#setSelection(org.eclipse.cdt.core.model.IPathEntry)
+ */
+ public void setSelection(IPathEntry containerEntry) {
+ if (containerEntry != null) {
+ if (containerEntry.getEntryKind() == IPathEntry.CDT_CONTAINER) {
+ fPathEntry = (IContainerEntry) containerEntry;
+ }
+ }
+ else {
+ fPathEntry = CoreModel.newContainerEntry(DiscoveredPathContainer.CONTAINER_ID);
+ }
+ if (fPathEntry != null) {
+ DiscoveredElement element = populateDiscoveredElements(fPathEntry);
+ ArrayList elements = new ArrayList();
+ elements.add(element);
+ fDiscoveredContainerList.addElements(elements);
+ }
+ }
+
+ /**
+ * @param pathEntry
+ * @return
+ */
+ private DiscoveredElement populateDiscoveredElements(IContainerEntry pathEntry) {
+ IDiscoveredPathInfo info;
+ DiscoveredElement container = null;
+ try {
+ info = MakeCorePlugin.getDefault().
+ getDiscoveryManager().getDiscoveredInfo(fCProject.getProject());
+ container = DiscoveredElement.createNew(null, fCProject.getProject(), null,
+ DiscoveredElement.CONTAINER, false, false);
+ try {
+ IPathEntryContainer peContainer = CoreModel.getPathEntryContainer(pathEntry.getPath(), fCProject);
+ if (peContainer != null) {
+ container.setEntry(peContainer.getDescription());
+ }
+ // get include paths
+ LinkedHashMap paths = info.getIncludeMap();
+ for (Iterator i = paths.keySet().iterator(); i.hasNext(); ) {
+ String include = (String) i.next();
+ Boolean removed = (Boolean) paths.get(include);
+ removed = (removed == null) ? Boolean.FALSE : removed;
+ DiscoveredElement.createNew(container, fCProject.getProject(), include,
+ DiscoveredElement.INCLUDE_PATH, removed.booleanValue(), false);
+ }
+ // get defined symbols
+ LinkedHashMap symbols = info.getSymbolMap();
+ for (Iterator i = symbols.keySet().iterator(); i.hasNext(); ) {
+ String symbol = (String) i.next();
+ SymbolEntry se = (SymbolEntry) symbols.get(symbol);
+ for (Iterator j = se.getActiveRaw().iterator(); j.hasNext();) {
+ String value = (String) j.next();
+ DiscoveredElement.createNew(container, fCProject.getProject(), value,
+ DiscoveredElement.SYMBOL_DEFINITION, false, false);
+ }
+ for (Iterator j = se.getRemovedRaw().iterator(); j.hasNext();) {
+ String value = (String) j.next();
+ DiscoveredElement.createNew(container, fCProject.getProject(), value,
+ DiscoveredElement.SYMBOL_DEFINITION, true, false);
+ }
+ }
+ } catch (CModelException e) {
+ MakeUIPlugin.log(e.getStatus());
+ }
+ } catch (CoreException e) {
+ MakeUIPlugin.log(e);
+ }
+ return container;
+ }
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ public void createControl(Composite parent) {
+ PixelConverter converter = new PixelConverter(parent);
+
+ Composite composite = new Composite(parent, SWT.NONE);
+
+ LayoutUtil.doDefaultLayout(composite, new DialogField[]{fDiscoveredContainerList}, true);
+ LayoutUtil.setHorizontalGrabbing(fDiscoveredContainerList.getTreeControl(null));
+
+ int buttonBarWidth = converter.convertWidthInCharsToPixels(24);
+ fDiscoveredContainerList.setButtonsMinWidth(buttonBarWidth);
+
+ fDiscoveredContainerList.getTreeViewer().addFilter(new ViewerFilter() {
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ if (element instanceof DiscoveredElement) {
+ DiscoveredElement elem = (DiscoveredElement) element;
+ switch (elem.getEntryKind()) {
+ case DiscoveredElement.PATHS_GROUP:
+ case DiscoveredElement.SYMBOLS_GROUP:
+ return elem.getChildren().length != 0;
+ }
+ }
+ return true;
+ }
+ });
+
+ setControl(composite);
+ }
+
+ /**
+ * @author vhirsl
+ */
+ private class DiscoveredContainerAdapter implements IDialogFieldListener, ITreeListAdapter {
+ private final Object[] EMPTY_ARR = new Object[0];
+
+ // ---------- IDialogFieldListener --------
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.ui.wizards.dialogfields.IDialogFieldListener#dialogFieldChanged(org.eclipse.cdt.internal.ui.wizards.dialogfields.DialogField)
+ */
+ public void dialogFieldChanged(DialogField field) {
+ // TODO Auto-generated method stub
+
+ }
+
+ // -------- IListAdapter --------
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.ui.wizards.dialogfields.ITreeListAdapter#customButtonPressed(org.eclipse.cdt.internal.ui.wizards.dialogfields.TreeListDialogField, int)
+ */
+ public void customButtonPressed(TreeListDialogField field, int index) {
+ containerPageCustomButtonPressed(field, index);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.ui.wizards.dialogfields.ITreeListAdapter#selectionChanged(org.eclipse.cdt.internal.ui.wizards.dialogfields.TreeListDialogField)
+ */
+ public void selectionChanged(TreeListDialogField field) {
+ containerPageSelectionChanged(field);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.ui.wizards.dialogfields.ITreeListAdapter#doubleClicked(org.eclipse.cdt.internal.ui.wizards.dialogfields.TreeListDialogField)
+ */
+ public void doubleClicked(TreeListDialogField field) {
+ // TODO Auto-generated method stub
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.ui.wizards.dialogfields.ITreeListAdapter#keyPressed(org.eclipse.cdt.internal.ui.wizards.dialogfields.TreeListDialogField, org.eclipse.swt.events.KeyEvent)
+ */
+ public void keyPressed(TreeListDialogField field, KeyEvent event) {
+ // TODO Auto-generated method stub
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.ui.wizards.dialogfields.ITreeListAdapter#getChildren(org.eclipse.cdt.internal.ui.wizards.dialogfields.TreeListDialogField, java.lang.Object)
+ */
+ public Object[] getChildren(TreeListDialogField field, Object element) {
+ if (element instanceof DiscoveredElement) {
+ DiscoveredElement elem = (DiscoveredElement) element;
+ return elem.getChildren();
+ }
+ return EMPTY_ARR;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.ui.wizards.dialogfields.ITreeListAdapter#getParent(org.eclipse.cdt.internal.ui.wizards.dialogfields.TreeListDialogField, java.lang.Object)
+ */
+ public Object getParent(TreeListDialogField field, Object element) {
+ if (element instanceof DiscoveredElement) {
+ DiscoveredElement elem = (DiscoveredElement) element;
+ return elem.getParent();
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.ui.wizards.dialogfields.ITreeListAdapter#hasChildren(org.eclipse.cdt.internal.ui.wizards.dialogfields.TreeListDialogField, java.lang.Object)
+ */
+ public boolean hasChildren(TreeListDialogField field, Object element) {
+ if (element instanceof DiscoveredElement) {
+ DiscoveredElement elem = (DiscoveredElement) element;
+ return elem.hasChildren();
+ }
+ return false;
+ }
+ }
+
+ /**
+ * @param field
+ * @param index
+ */
+ private void containerPageCustomButtonPressed(TreeListDialogField field, int index) {
+ DiscoveredElement[] containers = null;
+ switch (index) {
+ case IDX_UP:
+ /* move entry up */
+ dirty |= moveUp();
+ break;
+ case IDX_DOWN:
+ /* move entry down */
+ dirty |= moveDown();
+ break;
+ case IDX_REMOVE:
+ /* remove */
+ dirty |= removeRestoreEntry(DO_REMOVE);
+ break;
+ case IDX_RESTORE:
+ /* restore */
+ dirty |= removeRestoreEntry(DO_RESTORE);
+ break;
+ case IDX_DELETE:
+ /* delete */
+ dirty |= deleteEntry();
+ break;
+ }
+ }
+ /**
+ *
+ */
+ private boolean moveUp() {
+ boolean rc = false;
+ List selElements = fDiscoveredContainerList.getSelectedElements();
+ for (Iterator i = selElements.iterator(); i.hasNext(); ) {
+ DiscoveredElement elem = (DiscoveredElement) i.next();
+ DiscoveredElement parent = elem.getParent();
+ Object[] children = parent.getChildren();
+ for (int j = 0; j < children.length; ++j) {
+ DiscoveredElement child = (DiscoveredElement) children[j];
+ if (elem.equals(child)) {
+ int prevIndex = j - 1;
+ if (prevIndex >= 0) {
+ // swap the two
+ children[j] = children[prevIndex];
+ children[prevIndex] = elem;
+ rc = true;
+ break;
+ }
+ }
+ }
+ parent.setChildren(children);
+ }
+ fDiscoveredContainerList.refresh();
+ fDiscoveredContainerList.postSetSelection(new StructuredSelection(selElements));
+ fDiscoveredContainerList.setFocus();
+ return rc;
+ }
+ /**
+ *
+ */
+ private boolean moveDown() {
+ boolean rc = false;
+ List selElements = fDiscoveredContainerList.getSelectedElements();
+ List revSelElements = new ArrayList(selElements);
+ Collections.reverse(revSelElements);
+ for (Iterator i = revSelElements.iterator(); i.hasNext(); ) {
+ DiscoveredElement elem = (DiscoveredElement) i.next();
+ DiscoveredElement parent = elem.getParent();
+ Object[] children = parent.getChildren();
+ for (int j = children.length - 1; j >= 0; --j) {
+ DiscoveredElement child = (DiscoveredElement) children[j];
+ if (elem.equals(child)) {
+ int prevIndex = j + 1;
+ if (prevIndex < children.length) {
+ // swap the two
+ children[j] = children[prevIndex];
+ children[prevIndex] = elem;
+ rc = true;
+ break;
+ }
+ }
+ }
+ parent.setChildren(children);
+ }
+ fDiscoveredContainerList.refresh();
+ fDiscoveredContainerList.postSetSelection(new StructuredSelection(selElements));
+ fDiscoveredContainerList.setFocus();
+ return rc;
+ }
+ /**
+ *
+ * @param remove
+ */
+ private boolean removeRestoreEntry(int action) {
+ boolean rc = false;
+ boolean remove = (action == DO_REMOVE);
+ List selElements = fDiscoveredContainerList.getSelectedElements();
+ for (int i = selElements.size() - 1; i >= 0; --i) {
+ DiscoveredElement elem = (DiscoveredElement) selElements.get(i);
+ switch (elem.getEntryKind()) {
+ case DiscoveredElement.INCLUDE_PATH:
+ case DiscoveredElement.SYMBOL_DEFINITION:
+ elem.setRemoved(remove);
+ rc = true;
+ }
+ }
+ fDiscoveredContainerList.refresh();
+ fDiscoveredContainerList.setFocus();
+ return rc;
+ }
+ /**
+ *
+ */
+ private boolean deleteEntry() {
+ boolean rc = false;
+ List newSelection = new ArrayList();
+ List selElements = fDiscoveredContainerList.getSelectedElements();
+ for (int i = 0; i < selElements.size(); ++i) {
+ DiscoveredElement elem = (DiscoveredElement) selElements.get(i);
+ if (elem.getEntryKind() != DiscoveredElement.CONTAINER) {
+ DiscoveredElement parent = elem.getParent();
+ if (parent != null) {
+ Object[] children = parent.getChildren();
+ if (elem.delete()) {
+ switch (elem.getEntryKind()) {
+ case DiscoveredElement.PATHS_GROUP:
+ ScannerInfoCollector.getInstance().deleteAllPaths(fCProject.getProject());
+ break;
+ case DiscoveredElement.SYMBOLS_GROUP:
+ ScannerInfoCollector.getInstance().deleteAllSymbols(fCProject.getProject());
+ break;
+ case DiscoveredElement.INCLUDE_PATH:
+ ScannerInfoCollector.getInstance().deletePath(fCProject.getProject(), elem.getEntry());
+ break;
+ case DiscoveredElement.SYMBOL_DEFINITION:
+ ScannerInfoCollector.getInstance().deleteSymbol(fCProject.getProject(), elem.getEntry());
+ break;
+ }
+ rc = true;
+ // set new selection
+ for (int j = 0; j < children.length; ++j) {
+ DiscoveredElement child = (DiscoveredElement) children[j];
+ if (elem.equals(child)) {
+ newSelection.clear();
+ if (j + 1 < children.length) {
+ newSelection.add(children[j + 1]);
+ }
+ else if (j - 1 >= 0) {
+ newSelection.add(children[j - 1]);
+ }
+ else {
+ newSelection.add(parent);
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ fDiscoveredContainerList.refresh();
+ fDiscoveredContainerList.postSetSelection(new StructuredSelection(newSelection));
+ fDiscoveredContainerList.setFocus();
+ return rc;
+ }
+
+ /**
+ * @param field
+ */
+ private void containerPageSelectionChanged(TreeListDialogField field) {
+ List selElements = fDiscoveredContainerList.getSelectedElements();
+ fDiscoveredContainerList.enableButton(IDX_UP, canMoveUpDown(selElements, DISC_UP));
+ fDiscoveredContainerList.enableButton(IDX_DOWN, canMoveUpDown(selElements, DISC_DOWN));
+ fDiscoveredContainerList.enableButton(IDX_REMOVE, canRemoveRestore(selElements));
+ fDiscoveredContainerList.enableButton(IDX_RESTORE, canRemoveRestore(selElements));
+ fDiscoveredContainerList.enableButton(IDX_DELETE, canDelete(selElements));
+ }
+ /**
+ * @param selElements
+ * @return
+ */
+ private boolean canMoveUpDown(List selElements, int direction) {
+ if (selElements.size() == 0) {
+ return false;
+ }
+ for (int i = 0; i < selElements.size(); i++) {
+ DiscoveredElement elem = (DiscoveredElement) selElements.get(i);
+ switch (elem.getEntryKind()) {
+ case DiscoveredElement.CONTAINER:
+ case DiscoveredElement.PATHS_GROUP:
+ case DiscoveredElement.SYMBOLS_GROUP:
+ case DiscoveredElement.SYMBOL_DEFINITION:
+ return false;
+ }
+ DiscoveredElement parent = elem.getParent();
+ DiscoveredElement borderElem = null;
+ int borderElementIndex = (direction == DISC_UP) ? 0 : parent.getChildren().length - 1;
+ if (parent.getEntryKind() == DiscoveredElement.PATHS_GROUP) {
+ borderElem = (DiscoveredElement)(parent.getChildren())[borderElementIndex];
+ }
+ if (borderElem != null) {
+ if (borderElem.equals(elem)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+ /**
+ * @param selElements
+ * @return
+ */
+ private boolean canRemoveRestore(List selElements) {
+ if (selElements.size() == 0) {
+ return false;
+ }
+ for (int i = 0; i < selElements.size(); i++) {
+ DiscoveredElement elem = (DiscoveredElement) selElements.get(i);
+ switch (elem.getEntryKind()) {
+ case DiscoveredElement.CONTAINER:
+ case DiscoveredElement.PATHS_GROUP:
+ case DiscoveredElement.SYMBOLS_GROUP:
+ return false;
+ }
+ }
+ return true;
+ }
+ /**
+ * @param selElements
+ * @return
+ */
+ private boolean canDelete(List selElements) {
+ if (selElements.size() == 0) {
+ return false;
+ }
+ for (int i = 0; i < selElements.size(); i++) {
+ DiscoveredElement elem = (DiscoveredElement) selElements.get(i);
+ if (elem.getEntryKind() == DiscoveredElement.CONTAINER) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/DiscoveryOptionsBlock.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/DiscoveryOptionsBlock.java
new file mode 100644
index 00000000000..fde30175afe
--- /dev/null
+++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/DiscoveryOptionsBlock.java
@@ -0,0 +1,563 @@
+/**********************************************************************
+ * Copyright (c) 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.cdt.make.ui.dialogs;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.cdt.core.model.CModelException;
+import org.eclipse.cdt.core.model.CoreModel;
+import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.core.model.IPathEntry;
+import org.eclipse.cdt.make.core.MakeCorePlugin;
+import org.eclipse.cdt.make.core.MakeProjectNature;
+import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo;
+import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigBuilder;
+import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigNature;
+import org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredPathContainer;
+import org.eclipse.cdt.make.internal.ui.MakeUIPlugin;
+import org.eclipse.cdt.make.ui.IMakeHelpContextIds;
+import org.eclipse.cdt.ui.dialogs.AbstractCOptionPage;
+import org.eclipse.cdt.ui.dialogs.ICOptionContainer;
+import org.eclipse.cdt.utils.ui.controls.ControlFactory;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Font;
+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.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.help.WorkbenchHelp;
+
+/**
+ * A dialog to set scanner config discovery options
+ *
+ * @author vhirsl
+ */
+public class DiscoveryOptionsBlock extends AbstractCOptionPage {
+ private static final String PREFIX_BP = "BuildPathInfoBlock"; //$NON-NLS-1$
+ private static final String SC_GROUP_LABEL = PREFIX_BP + ".scGroup.label"; //$NON-NLS-1$
+ private static final String SC_ENABLED_LABEL = PREFIX_BP + ".scGroup.enabled.label"; //$NON-NLS-1$
+// private static final String SC_OPTIONS_LABEL = PREFIX + ".scGroup.options.label"; //$NON-NLS-1$
+ private static final String MISSING_BUILDER_MSG = "ScannerConfigOptionsDialog.label.missingBuilderInformation"; //$NON-NLS-1$
+
+ private static final String PREFIX = "ScannerConfigOptionsDialog"; //$NON-NLS-1$
+ private static final String DIALOG_TITLE = PREFIX + ".title"; //$NON-NLS-1$
+ private static final String DIALOG_DESCRIPTION = PREFIX + ".description"; //$NON-NLS-1$
+ private static final String SI_BUILD_PARSER_GROUP = PREFIX + ".siBuilder.parser.group_label"; //$NON-NLS-1$
+ private static final String ENABLE_SI_BUILD_PARSER = PREFIX + ".siBuilder.parser.enable.label"; //$NON-NLS-1$
+ private static final String SI_BUILD_PARSER_LABEL = PREFIX + ".siBuilder.parser.label"; //$NON-NLS-1$
+ private static final String SI_PROVIDER_CMD_GROUP = PREFIX + ".siProvider.cmd.group_label"; //$NON-NLS-1$
+ private static final String ENABLE_SI_PROVIDER_COMMAND = PREFIX + ".siProvider.cmd.enable.label"; //$NON-NLS-1$
+ private static final String SI_PROVIDER_CMD_USE_DEFAULT = PREFIX + ".siProvider.cmd.use_default"; //$NON-NLS-1$
+ private static final String SI_PROVIDER_CMD_LABEL = PREFIX + ".siProvider.cmd.label"; //$NON-NLS-1$
+ private static final String SI_PROVIDER_PARSER_LABEL = PREFIX + ".siProvider.parser.label"; //$NON-NLS-1$
+ private static final String SI_PROVIDER_CMD_ERROR_MESSAGE = PREFIX + ".siProvider.cmd.error_message"; //$NON-NLS-1$
+
+ private Button scEnabledButton;
+ private boolean needsSCNature = false;
+
+ private Button defESIProviderCommandButton;
+ private Text esiProviderCommand;
+ private Button enableBuilderParserButton;
+ private Combo makeBuilderSIParserComboBox;
+ private Button enableProviderCommandButton;
+ private Combo esiProviderParserComboBox;
+
+ private Preferences fPrefs;
+ private IScannerConfigBuilderInfo fBuildInfo;
+ private boolean fInitialized = false;
+ private Map builderParsers = new HashMap();
+ private String initialBuilderParserId = null;
+ private Map providerParsers = new HashMap();
+ private String initialProviderParserId = null;
+ private boolean fCreatePathContainer = false;
+
+
+ public DiscoveryOptionsBlock() {
+ super(MakeUIPlugin.getResourceString(DIALOG_TITLE));
+ setDescription(MakeUIPlugin.getResourceString(DIALOG_DESCRIPTION));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.ui.dialogs.ICOptionPage#setContainer(org.eclipse.cdt.ui.dialogs.ICOptionContainer)
+ */
+ public void setContainer(ICOptionContainer container) {
+ super.setContainer(container);
+
+ fPrefs = getContainer().getPreferences();
+ IProject project = getContainer().getProject();
+
+ fInitialized = true;
+ if (project != null) {
+ try {
+ fBuildInfo = MakeCorePlugin.createScannerConfigBuildInfo(project, ScannerConfigBuilder.BUILDER_ID);
+ }
+ catch (CoreException e) {
+ fInitialized = false;
+ fBuildInfo = MakeCorePlugin.createScannerConfigBuildInfo(fPrefs, ScannerConfigBuilder.BUILDER_ID, true);
+ }
+ }
+ else {
+ fBuildInfo = MakeCorePlugin.createScannerConfigBuildInfo(fPrefs, ScannerConfigBuilder.BUILDER_ID, false);
+ fCreatePathContainer = true;
+ }
+ retrieveSIConsoleParsers();
+ initialBuilderParserId = fBuildInfo.getMakeBuilderConsoleParserId(); //$NON-NLS-1$
+ initialProviderParserId = fBuildInfo.getESIProviderConsoleParserId(); //$NON-NLS-1$
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.ui.dialogs.ICOptionPage#performApply(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void performApply(IProgressMonitor monitor) throws CoreException {
+ IProject project = getContainer().getProject();
+ IScannerConfigBuilderInfo buildInfo;
+ if (project != null) {
+ buildInfo = MakeCorePlugin.createScannerConfigBuildInfo(project, ScannerConfigBuilder.BUILDER_ID);
+ if (fCreatePathContainer) {
+ createDiscoveredPathContainer(project);
+ }
+ }
+ else {
+ buildInfo = MakeCorePlugin.createScannerConfigBuildInfo(fPrefs, ScannerConfigBuilder.BUILDER_ID, false);
+ }
+
+ buildInfo.setAutoDiscoveryEnabled(isScannerConfigDiscoveryEnabled());
+ if (isScannerConfigDiscoveryEnabled()) {
+ buildInfo.setMakeBuilderConsoleParserEnabled(isBuilderParserEnabled());
+ if (isBuilderParserEnabled()) {
+ buildInfo.setMakeBuilderConsoleParserId((String) builderParsers.get(makeBuilderSIParserComboBox.getText()));
+ }
+ buildInfo.setESIProviderCommandEnabled(isProviderCommandEnabled());
+ if (isProviderCommandEnabled()) {
+ buildInfo.setUseDefaultESIProviderCmd(useDefaultESIProviderCmd());
+ if (!useDefaultESIProviderCmd()) {
+ storeSIProviderCommandLine(buildInfo);
+ }
+ buildInfo.setESIProviderConsoleParserId((String) providerParsers.get(esiProviderParserComboBox.getText()));
+ }
+ }
+ }
+
+ /**
+ * @param project
+ * @throws CModelException
+ */
+ private void createDiscoveredPathContainer(IProject project) throws CModelException {
+ IPathEntry container = CoreModel.newContainerEntry(DiscoveredPathContainer.CONTAINER_ID);
+ ICProject cProject = CoreModel.getDefault().create(project);
+ if (cProject != null) {
+ IPathEntry[] entries = cProject.getRawPathEntries();
+ List newEntries = new ArrayList(Arrays.asList(entries));
+ if (!newEntries.contains(container)) {
+ newEntries.add(container);
+ cProject.setRawPathEntries((IPathEntry[])newEntries.
+ toArray(new IPathEntry[newEntries.size()]), new NullProgressMonitor());
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.ui.dialogs.ICOptionPage#performDefaults()
+ */
+ public void performDefaults() {
+ IScannerConfigBuilderInfo info;
+ // Populate with the default values
+ if (getContainer().getProject() != null) {
+ // get the preferences
+ info = MakeCorePlugin.createScannerConfigBuildInfo(fPrefs, ScannerConfigBuilder.BUILDER_ID, false);
+ }
+ else {
+ // get the defaults
+ info = MakeCorePlugin.createScannerConfigBuildInfo(fPrefs, ScannerConfigBuilder.BUILDER_ID, true);
+ }
+
+ setScannerConfigDiscoveryEnabled(info.isAutoDiscoveryEnabled());
+ enableBuilderParserButton.setSelection(info.isMakeBuilderConsoleParserEnabled());
+ makeBuilderSIParserComboBox.setText(getParserName(builderParsers, info.getMakeBuilderConsoleParserId()));
+ enableProviderCommandButton.setSelection(info.isESIProviderCommandEnabled());
+ defESIProviderCommandButton.setSelection(info.isDefaultESIProviderCmd());
+ setESIProviderCommand(info);
+ esiProviderParserComboBox.setText(getParserName(providerParsers, info.getESIProviderConsoleParserId()));
+
+ enableAllControls();
+ }
+
+ /**
+ * @param parsers
+ * @param consoleParserId
+ * @return
+ */
+ private String getParserName(Map parsers, String consoleParserId) {
+ for (Iterator i = parsers.keySet().iterator(); i.hasNext(); ) {
+ String parserName = (String) i.next();
+ String parserId = (String) parsers.get(parserName);
+ if (parserId.equals(consoleParserId)) {
+ return parserName;
+ }
+ }
+ return consoleParserId;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ public void createControl(Composite parent) {
+ // Create the composite control for the tab
+ int tabColumns = 2;
+ Font font = parent.getFont();
+ Composite composite = ControlFactory.createComposite(parent, tabColumns);
+ ((GridLayout) composite.getLayout()).makeColumnsEqualWidth = false;
+ composite.setFont(font);
+ GridData gd;
+ setControl(composite);
+
+ WorkbenchHelp.setHelp(getControl(), IMakeHelpContextIds.SCANNER_CONFIG_DISCOVERY_OPTIONS);
+
+ // Create a group for scanner config discovery
+ if (createScannerConfigControls(composite, tabColumns)) {
+ createBuildOutputParserControls(composite);
+ createAfterBuildCmdControls(composite);
+ // enable controls depending on the state of auto discovery
+ enableAllControls();
+ }
+ }
+
+ /**
+ * @param composite
+ */
+ private boolean createScannerConfigControls(Composite parent, int numColumns) {
+ // Check if it is an old project
+ IProject project = getContainer().getProject();
+ boolean showMissingBuilder = false;
+ try {
+ if (project != null &&
+ project.hasNature(MakeProjectNature.NATURE_ID) &&
+ !project.hasNature(ScannerConfigNature.NATURE_ID)) {
+ needsSCNature = true; // an old project
+ }
+ }
+ catch (CoreException e) {
+ showMissingBuilder = true;
+ }
+
+ Group scGroup = ControlFactory.createGroup(parent, MakeUIPlugin.getResourceString(SC_GROUP_LABEL), numColumns);
+ scGroup.setFont(parent.getFont());
+ ((GridData) scGroup.getLayoutData()).grabExcessHorizontalSpace = true;
+ ((GridData) scGroup.getLayoutData()).horizontalSpan = numColumns;
+ ((GridData) scGroup.getLayoutData()).horizontalAlignment = GridData.FILL;
+
+ if (showMissingBuilder || (!needsSCNature && !fInitialized)) {
+ ControlFactory.createLabel(scGroup, MakeUIPlugin.getResourceString(MISSING_BUILDER_MSG));
+ return false;
+ }
+
+ // Add checkbox
+ scEnabledButton = ControlFactory.createCheckBox(scGroup, MakeUIPlugin.getResourceString(SC_ENABLED_LABEL));
+ scEnabledButton.setFont(parent.getFont());
+ ((GridData) scEnabledButton.getLayoutData()).horizontalSpan = numColumns;
+ ((GridData) scEnabledButton.getLayoutData()).grabExcessHorizontalSpace = true;
+ // VMIR* old projects will have discovery disabled by default
+ scEnabledButton.setSelection(needsSCNature ? false : fBuildInfo.isAutoDiscoveryEnabled());
+ scEnabledButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ handleScannerConfigEnable();
+ }
+ });
+// handleScannerConfigEnable(); Only if true in VMIR*
+ return true;
+ }
+
+ /**
+ * Handles scanner configuration discovery selection change
+ */
+ protected void handleScannerConfigEnable() {
+ boolean enable = scEnabledButton.getSelection();
+ if (enable && needsSCNature) {
+ // first install the SC nature
+ try {
+ ScannerConfigNature.addScannerConfigNature(getContainer().getProject());
+ needsSCNature = false;
+ }
+ catch (CoreException e) {
+ MakeCorePlugin.log(e.getStatus());
+ }
+ }
+ enableAllControls();
+ }
+
+ /**
+ * Fills console parser maps
+ */
+ private void retrieveSIConsoleParsers() {
+ IExtensionPoint ep = Platform.getExtensionRegistry().
+ getExtensionPoint(MakeCorePlugin.getUniqueIdentifier(), MakeCorePlugin.SI_CONSOLE_PARSER_SIMPLE_ID);
+ if (ep != null) {
+ IExtension[] extensions = ep.getExtensions();
+ for (int i = 0; i < extensions.length; ++i) {
+ String parserId = extensions[i].getUniqueIdentifier();
+ String label = extensions[i].getLabel();
+ IConfigurationElement[] elements = extensions[i].getConfigurationElements();
+ String commandId = elements[0].getAttribute("commandId"); //$NON-NLS-1$
+ if (commandId.equals("makeBuilder") || commandId.equals("all")) { //$NON-NLS-1$//$NON-NLS-2$
+ builderParsers.put(label, parserId);
+ }
+ if (commandId.equals("externalScannerInfoProvider") || commandId.equals("all")) { //$NON-NLS-1$//$NON-NLS-2$
+ providerParsers.put(label, parserId);
+ }
+ }
+ }
+ }
+
+ private void createBuildOutputParserControls(Composite parent) {
+// ControlFactory.insertSpace(parent, 1, 10);
+ Group bopGroup = ControlFactory.createGroup(parent,
+ MakeUIPlugin.getResourceString(SI_BUILD_PARSER_GROUP), 2);
+ ((GridLayout)bopGroup.getLayout()).marginHeight = 5;
+ ((GridLayout)bopGroup.getLayout()).marginWidth = 5;
+ ((GridData)bopGroup.getLayoutData()).verticalAlignment = GridData.FILL;
+ ((GridData)bopGroup.getLayoutData()).horizontalSpan = 2;
+
+ enableBuilderParserButton = ControlFactory.createCheckBox(bopGroup,
+ MakeUIPlugin.getResourceString(ENABLE_SI_BUILD_PARSER));
+ ((GridData)enableBuilderParserButton.getLayoutData()).horizontalSpan = 2;
+ boolean enabledBuilderParser = fBuildInfo.isMakeBuilderConsoleParserEnabled();
+ enableBuilderParserButton.setSelection(enabledBuilderParser);
+ enableBuilderParserButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ makeBuilderSIParserComboBox.setEnabled(isBuilderParserEnabled());
+ }
+ });
+
+ Label label = ControlFactory.createLabel(bopGroup,
+ MakeUIPlugin.getResourceString(SI_BUILD_PARSER_LABEL));
+ ((GridData)label.getLayoutData()).grabExcessHorizontalSpace = false;
+
+ makeBuilderSIParserComboBox = new Combo(bopGroup, SWT.DROP_DOWN | SWT.READ_ONLY);
+
+ // fill the combobox and set the initial value
+ for (Iterator items = builderParsers.keySet().iterator(); items.hasNext(); ) {
+ String parser = (String) items.next();
+ makeBuilderSIParserComboBox.add(parser);
+ if (initialBuilderParserId.equals(builderParsers.get(parser))) {
+ makeBuilderSIParserComboBox.setText(parser);
+ }
+ }
+ makeBuilderSIParserComboBox.setEnabled(enabledBuilderParser);
+ }
+
+ private void createAfterBuildCmdControls(Composite parent) {
+ Group abcGroup = ControlFactory.createGroup(parent,
+ MakeUIPlugin.getResourceString(SI_PROVIDER_CMD_GROUP), 2);
+ ((GridData)abcGroup.getLayoutData()).horizontalSpan = 2;
+
+ enableProviderCommandButton = ControlFactory.createCheckBox(abcGroup,
+ MakeUIPlugin.getResourceString(ENABLE_SI_PROVIDER_COMMAND));
+ ((GridData)enableProviderCommandButton.getLayoutData()).horizontalSpan = 2;
+ ((GridData)enableProviderCommandButton.getLayoutData()).horizontalAlignment = GridData.FILL_HORIZONTAL;
+ boolean enabledProviderCommand = fBuildInfo.isESIProviderCommandEnabled();
+ enableProviderCommandButton.setSelection(enabledProviderCommand);
+ enableProviderCommandButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ defESIProviderCommandButton.setEnabled(isProviderCommandEnabled());
+ esiProviderCommand.setEnabled(isProviderCommandEnabled() && !useDefaultESIProviderCmd());
+ esiProviderParserComboBox.setEnabled(isProviderCommandEnabled());
+ getContainer().updateContainer();
+ }
+ });
+
+ createESIProviderCmdControls(abcGroup);
+
+ Label label = ControlFactory.createLabel(abcGroup,
+ MakeUIPlugin.getResourceString(SI_PROVIDER_PARSER_LABEL));
+ ((GridData)label.getLayoutData()).grabExcessHorizontalSpace = false;
+
+ esiProviderParserComboBox = new Combo(abcGroup, SWT.DROP_DOWN | SWT.READ_ONLY);
+
+ // fill the combobox and set the initial value
+ for (Iterator items = providerParsers.keySet().iterator(); items.hasNext(); ) {
+ String parser = (String) items.next();
+ esiProviderParserComboBox.add(parser);
+ if (initialProviderParserId.equals(providerParsers.get(parser))) {
+ esiProviderParserComboBox.setText(parser);
+ }
+ }
+ defESIProviderCommandButton.setEnabled(enabledProviderCommand);
+ esiProviderCommand.setEnabled(enabledProviderCommand && !useDefaultESIProviderCmd());
+ esiProviderParserComboBox.setEnabled(enabledProviderCommand);
+ }
+
+ private void createESIProviderCmdControls(Composite parent) {
+ defESIProviderCommandButton = ControlFactory.createCheckBox(parent,
+ MakeUIPlugin.getResourceString(SI_PROVIDER_CMD_USE_DEFAULT));
+ defESIProviderCommandButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ esiProviderCommand.setEnabled(!useDefaultESIProviderCmd());
+ getContainer().updateContainer();
+ }
+ });
+ ((GridData) (defESIProviderCommandButton.getLayoutData())).horizontalAlignment = GridData.FILL_HORIZONTAL;
+ ((GridData) (defESIProviderCommandButton.getLayoutData())).horizontalSpan = 2;
+ Label label = ControlFactory.createLabel(parent,
+ MakeUIPlugin.getResourceString(SI_PROVIDER_CMD_LABEL));
+ ((GridData) (label.getLayoutData())).horizontalAlignment = GridData.BEGINNING;
+ ((GridData) (label.getLayoutData())).grabExcessHorizontalSpace = false;
+ esiProviderCommand = ControlFactory.createTextField(parent, SWT.SINGLE | SWT.BORDER);
+ ((GridData) (esiProviderCommand.getLayoutData())).horizontalAlignment = GridData.FILL;
+ ((GridData) (esiProviderCommand.getLayoutData())).grabExcessHorizontalSpace = true;
+ setESIProviderCommand(fBuildInfo);
+ if (fBuildInfo.isDefaultESIProviderCmd()) {
+ esiProviderCommand.setEnabled(false);
+ }
+ esiProviderCommand.addListener(SWT.Modify, new Listener() {
+ public void handleEvent(Event e) {
+ getContainer().updateContainer();
+ }
+ });
+ defESIProviderCommandButton.setSelection(fBuildInfo.isDefaultESIProviderCmd());
+ }
+
+ /**
+ *
+ */
+ private void setESIProviderCommand(IScannerConfigBuilderInfo buildInfo) {
+ IPath sCommand = buildInfo.getESIProviderCommand();
+ if (sCommand != null) {
+ StringBuffer cmd = new StringBuffer(sCommand.toOSString());
+ String args = buildInfo.getESIProviderArguments();
+ if (args != null && args.length() > 0) {
+ cmd.append(' ');
+ cmd.append(args);
+ }
+ esiProviderCommand.setText(cmd.toString());
+ }
+ }
+
+ /**
+ * @param enable
+ */
+ private void enableAllControls() {
+ enableBuilderParserButton.setEnabled(isScannerConfigDiscoveryEnabled());
+ makeBuilderSIParserComboBox.setEnabled(isScannerConfigDiscoveryEnabled() && isBuilderParserEnabled());
+ enableProviderCommandButton.setEnabled(isScannerConfigDiscoveryEnabled());
+ defESIProviderCommandButton.setEnabled(isScannerConfigDiscoveryEnabled() && isProviderCommandEnabled());
+ esiProviderCommand.setEnabled(isScannerConfigDiscoveryEnabled() && isProviderCommandEnabled() && !useDefaultESIProviderCmd());
+ esiProviderParserComboBox.setEnabled(isScannerConfigDiscoveryEnabled() && isProviderCommandEnabled());
+ }
+
+ private boolean useDefaultESIProviderCmd() {
+ return defESIProviderCommandButton.getSelection();
+ }
+
+ private String getSIProviderCommandLine() {
+ return esiProviderCommand.getText().trim();
+ }
+
+ private boolean isBuilderParserEnabled() {
+ return enableBuilderParserButton.getSelection();
+ }
+
+ private boolean isProviderCommandEnabled() {
+ return enableProviderCommandButton.getSelection();
+ }
+
+ /**
+ * Retrieves the state of scanner config discovery
+ *
+ * @return boolean
+ */
+ private boolean isScannerConfigDiscoveryEnabled() {
+ return scEnabledButton.getSelection();
+ }
+
+ /**
+ * Enables or disables the scanner config discovery
+ *
+ * @param enabled (boolean)
+ */
+ private void setScannerConfigDiscoveryEnabled(boolean enabled) {
+ scEnabledButton.setSelection(enabled);
+ }
+
+ /**
+ * @param buildInfo
+ * @throws CoreException
+ */
+ private void storeSIProviderCommandLine(IScannerConfigBuilderInfo buildInfo) throws CoreException {
+ String esiProviderLine = getSIProviderCommandLine();
+ int start = 0;
+ int end = -1;
+ if (esiProviderLine.startsWith("\"")) { //$NON-NLS-1$
+ start = 1;
+ end = esiProviderLine.indexOf('"', 1);
+ }
+ else {
+ end = esiProviderLine.indexOf(' ');
+ }
+ IPath path;
+ if (end == -1) {
+ path = new Path(esiProviderLine);
+ } else {
+ path = new Path(esiProviderLine.substring(start, end));
+ }
+ buildInfo.setESIProviderCommand(path);
+ String args = ""; //$NON-NLS-1$
+ if (end != -1) {
+ args = esiProviderLine.substring(end + 1);
+ }
+ buildInfo.setESIProviderArguments(args);
+ }
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.ui.dialogs.ICOptionPage#isValid()
+ */
+ public boolean isValid() {
+ if (isProviderCommandEnabled() == true &&
+ useDefaultESIProviderCmd() == false) {
+ String cmd = getSIProviderCommandLine();
+ if (cmd == null || cmd.length() == 0) {
+ return false;
+ }
+ }
+ return true;
+ }
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.IDialogPage#getErrorMessage()
+ */
+ public String getErrorMessage() {
+ if (!isValid()) {
+ return MakeUIPlugin.getResourceString(SI_PROVIDER_CMD_ERROR_MESSAGE);
+ }
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/ManageDefinedSymbolsDialog.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/ManageDefinedSymbolsDialog.java
index 9d56bbdf6e8..9a0c0a201d7 100644
--- a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/ManageDefinedSymbolsDialog.java
+++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/ManageDefinedSymbolsDialog.java
@@ -19,9 +19,8 @@ import java.util.StringTokenizer;
import org.eclipse.cdt.internal.ui.util.SWTUtil;
import org.eclipse.cdt.make.core.MakeCorePlugin;
-import org.eclipse.cdt.make.core.MakeScannerInfo;
-import org.eclipse.cdt.make.core.scannerconfig.DiscoveredScannerInfo;
-import org.eclipse.cdt.make.core.scannerconfig.DiscoveredScannerInfoProvider;
+import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo;
+import org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredPathInfo;
import org.eclipse.cdt.make.internal.core.scannerconfig.ScannerInfoCollector;
import org.eclipse.cdt.make.internal.core.scannerconfig.util.ScannerConfigUtil;
import org.eclipse.cdt.make.internal.core.scannerconfig.util.SymbolEntry;
@@ -30,14 +29,11 @@ import org.eclipse.cdt.make.internal.ui.MessageLine;
import org.eclipse.cdt.ui.dialogs.ICOptionContainer;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.FontData;
@@ -94,7 +90,6 @@ public class ManageDefinedSymbolsDialog extends Dialog {
boolean alreadyCreated; // Set when dialog is created for the first time (vs. reopened)
private ArrayList returnSymbols;
- private ArrayList userSymbols;
private ArrayList deletedDiscoveredSymbols;
private LinkedHashMap discoveredSymbols;
private LinkedHashMap workingDiscoveredSymbols; // working copy of discoveredSymbols, until either OK or CANCEL is pressed
@@ -106,11 +101,6 @@ public class ManageDefinedSymbolsDialog extends Dialog {
private Shell fShell;
private MessageLine fStatusLine;
- private List userList;
- private Button addSymbol;
- private Button editSymbol;
- private Button removeSymbol;
-
private Group discoveredGroup;
private Label selectedLabel;
private Label removedLabel;
@@ -129,19 +119,18 @@ public class ManageDefinedSymbolsDialog extends Dialog {
fShell = parentShell;
fContainer = container;
fProject = fContainer.getProject();
- DiscoveredScannerInfo scanInfo;
+ IDiscoveredPathInfo scanInfo;
if (fProject != null) {
- scanInfo = (DiscoveredScannerInfo) DiscoveredScannerInfoProvider.getDefault().getScannerInformation(fProject);
+ try {
+ scanInfo = MakeCorePlugin.getDefault().getDiscoveryManager().getDiscoveredInfo(fProject);
+ } catch (CoreException e) {
+ scanInfo = new DiscoveredPathInfo(fProject);
+ }
}
else {
- scanInfo = new DiscoveredScannerInfo(null);
- MakeScannerInfo makeInfo = new MakeScannerInfo(null);
- Preferences store = MakeCorePlugin.getDefault().getPluginPreferences();
- makeInfo.setPreprocessorSymbols(BuildPathInfoBlock.getSymbols(store));
- scanInfo.setUserScannerInfo(makeInfo);
+ scanInfo = new DiscoveredPathInfo(fProject);
}
- userSymbols = new ArrayList(Arrays.asList(scanInfo.getUserSymbolDefinitions()));
- discoveredSymbols = scanInfo.getDiscoveredSymbolDefinitions();
+ discoveredSymbols = scanInfo.getSymbolMap();
setDirty(false);
fDirty = false;
}
@@ -179,13 +168,10 @@ public class ManageDefinedSymbolsDialog extends Dialog {
fStatusLine.setLayoutData(gd);
fStatusLine.setMessage(getTitle(DIALOG_TITLE));
- createUserControls(composite);
createOptionsControls(composite);
createDiscoveredControls(composite);
setListContents();
- userList.select(0);
- enableUserButtons();
discActiveList.select(0);
enableDiscoveredButtons();
@@ -198,7 +184,6 @@ public class ManageDefinedSymbolsDialog extends Dialog {
private void setListContents() {
workingDiscoveredSymbols = new LinkedHashMap(discoveredSymbols);
- userList.setItems((String[]) userSymbols.toArray(new String[userSymbols.size()]));
discActiveList.setItems(getDiscDefinedSymbols(workingDiscoveredSymbols, ACTIVE));
discRemovedList.setItems(getDiscDefinedSymbols(workingDiscoveredSymbols, REMOVED));
}
@@ -235,141 +220,6 @@ public class ManageDefinedSymbolsDialog extends Dialog {
return new String[0];
}
- /**
- * @param composite
- */
- private void createUserControls(Composite composite) {
- // Create group
- Group userGroup = ControlFactory.createGroup(composite, getTitle(USER_GROUP), 3);
- ((GridData) userGroup.getLayoutData()).horizontalSpan = 2;
- ((GridData) userGroup.getLayoutData()).grabExcessHorizontalSpace = false;
-
- // Create list
- userList = new List(userGroup, SWT.BORDER | SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL);
- userList.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent e) {
- enableUserButtons();
- }
- });
- userList.addMouseListener(new MouseAdapter() {
- public void mouseDoubleClick(MouseEvent e) {
- editUserListItem();
- }
- });
-
- // Make it occupy the first column
- GridData gd = new GridData(GridData.FILL_BOTH);
- gd.grabExcessHorizontalSpace = true;
- gd.horizontalSpan = 1;
- gd.heightHint = getDefaultFontHeight(userList, PROJECT_LIST_MULTIPLIER);
- gd.widthHint = convertWidthInCharsToPixels(INITIAL_LIST_WIDTH);
- userList.setLayoutData(gd);
-
- // Create buttons
- // Create a composite for the buttons
- Composite pathButtonComp = ControlFactory.createComposite(userGroup, 1);
-
- // Add the buttons
- addSymbol = ControlFactory.createPushButton(pathButtonComp, getTitle(NEW));
- addSymbol.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent e) {
- handleAddSymbol();
- }
- });
- addSymbol.setEnabled(true);
- SWTUtil.setButtonDimensionHint(addSymbol);
-
- editSymbol = ControlFactory.createPushButton(pathButtonComp, getTitle(EDIT));
- editSymbol.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent e) {
- editUserListItem();
- }
- });
- editSymbol.setEnabled(true);
- SWTUtil.setButtonDimensionHint(editSymbol);
-
- removeSymbol = ControlFactory.createPushButton(pathButtonComp, getTitle(REMOVE));
- removeSymbol.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent e) {
- handleRemoveSymbol();
- }
- });
- SWTUtil.setButtonDimensionHint(removeSymbol);
- }
-
- protected void handleAddSymbol() {
- // Popup an entry dialog
- InputDialog dialog = new InputDialog(fShell, getTitle(SYMBOL_TITLE),
- getTitle(SYMBOL_LABEL), "", null); //$NON-NLS-1$
- String symbol = null;
- if (dialog.open() == Window.OK) {
- symbol = dialog.getValue();
- if (symbol != null && symbol.length() > 0) {
- setDirty(true);
- userList.add(symbol);
- userList.select(userList.getItemCount() - 1);
- enableUserButtons();
- }
- }
- }
-
- /*
- * Double-click handler to allow edit of path information
- */
- protected void editUserListItem() {
- // Edit the selection index
- int index = userList.getSelectionIndex();
- if (index != -1) {
- String selItem = userList.getItem(index);
- if (selItem != null) {
- InputDialog dialog = new InputDialog(fShell, getTitle(EDIT_SYMBOL_TITLE),
- getTitle(SYMBOL_LABEL), selItem, null);
- String newItem = null;
- if (dialog.open() == Window.OK) {
- newItem = dialog.getValue();
- if (newItem != null && !newItem.equals(selItem)) {
- userList.setItem(index, newItem);
- setDirty(true);
- }
- }
- }
- }
- }
-
- protected void handleRemoveSymbol() {
- // Get the selection index
- int index = userList.getSelectionIndex();
- if (index == -1) {
- return;
- }
-
- // Remove the element at that index
- userList.remove(index);
- index = index - 1 < 0 ? 0 : index - 1;
- userList.select(index);
- setDirty(true);
-
- // Check if the buttons should still be enabled
- enableUserButtons();
- }
-
- /*
- * Enables the buttons on the path control if the right conditions are met
- */
- protected void enableUserButtons() {
- // Enable the remove button if there is at least 1 item in the list
- int items = userList.getItemCount();
- if (items > 0) {
- editSymbol.setEnabled(true);
- removeSymbol.setEnabled(true);
- // Enable the up/down buttons depending on what item is selected
- int index = userList.getSelectionIndex();
- } else {
- editSymbol.setEnabled(false);
- removeSymbol.setEnabled(false);
- }
- }
-
/**
* @param composite
*/
@@ -630,13 +480,10 @@ public class ManageDefinedSymbolsDialog extends Dialog {
*/
protected void buttonPressed(int buttonId) {
if (IDialogConstants.OK_ID == buttonId) {
- // Store user part
- userSymbols = new ArrayList(Arrays.asList(userList.getItems()));
// Store discovered part
discoveredSymbols = workingDiscoveredSymbols;
// Return sum of user and active discovered paths
- returnSymbols = new ArrayList(userSymbols.size() + discActiveList.getItemCount());
- returnSymbols.addAll(userSymbols);
+ returnSymbols = new ArrayList(discActiveList.getItemCount());
returnSymbols.addAll(new ArrayList(Arrays.asList(discActiveList.getItems())));
fDirty = fWorkingDirty;
@@ -656,11 +503,11 @@ public class ManageDefinedSymbolsDialog extends Dialog {
/**
* Called by BuildPathInfoBlock.performApply
* @param info
+ * @return boolean - true if changed
*/
- public void saveTo(DiscoveredScannerInfo info) {
+ public boolean saveTo(IDiscoveredPathInfo info) {
if (fDirty || (fProject == null && fContainer.getProject() != null)) {// New Standard Make project wizard
- info.setUserDefinedSymbols(userSymbols);
- info.setDiscoveredSymbolDefinitions(discoveredSymbols);
+ info.setSymbolMap(discoveredSymbols);
// remove deleted symbols from discovered SC
if (deletedDiscoveredSymbols != null) {
for (Iterator i = deletedDiscoveredSymbols.iterator(); i.hasNext(); ) {
@@ -670,7 +517,9 @@ public class ManageDefinedSymbolsDialog extends Dialog {
}
}
setDirty(false);
+ boolean rc = fDirty;
fDirty = false;
+ return rc;
}
/**
@@ -678,14 +527,9 @@ public class ManageDefinedSymbolsDialog extends Dialog {
*/
public void restore() {
if (fProject != null) {
- userSymbols = new ArrayList(Arrays.asList(BuildPathInfoBlock.getSymbols(
- MakeCorePlugin.getDefault().getPluginPreferences())));
// remove discovered symbols
ScannerInfoCollector.getInstance().deleteAllSymbols(fProject);
}
- else {
- userSymbols = new ArrayList();
- }
discoveredSymbols = new LinkedHashMap();
deletedDiscoveredSymbols = null;
fDirty = true;
diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/ManageIncludePathsDialog.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/ManageIncludePathsDialog.java
index b5ee6967683..4c3790898ec 100644
--- a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/ManageIncludePathsDialog.java
+++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/ManageIncludePathsDialog.java
@@ -18,23 +18,19 @@ import java.util.StringTokenizer;
import org.eclipse.cdt.internal.ui.util.SWTUtil;
import org.eclipse.cdt.make.core.MakeCorePlugin;
-import org.eclipse.cdt.make.core.MakeScannerInfo;
-import org.eclipse.cdt.make.core.scannerconfig.DiscoveredScannerInfo;
-import org.eclipse.cdt.make.core.scannerconfig.DiscoveredScannerInfoProvider;
+import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo;
+import org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredPathInfo;
import org.eclipse.cdt.make.internal.core.scannerconfig.ScannerInfoCollector;
import org.eclipse.cdt.make.internal.ui.MakeUIPlugin;
import org.eclipse.cdt.make.internal.ui.MessageLine;
import org.eclipse.cdt.ui.dialogs.ICOptionContainer;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.FontData;
@@ -95,7 +91,6 @@ public class ManageIncludePathsDialog extends Dialog {
private static final int DISC_DOWN = 1;
private ArrayList returnPaths;
- private ArrayList userPaths;
private ArrayList deletedDiscoveredPaths;
private LinkedHashMap discoveredPaths;
private LinkedHashMap workingDiscoveredPaths; // working copy of discoveredPaths, until either OK or CANCEL is pressed
@@ -107,13 +102,6 @@ public class ManageIncludePathsDialog extends Dialog {
private Shell fShell;
private MessageLine fStatusLine;
- private List userList;
- private Button addPath;
- private Button editPath;
- private Button removePath;
- private Button pathUp;
- private Button pathDown;
-
private Group discoveredGroup;
private Label selectedLabel;
private Label removedLabel;
@@ -134,19 +122,18 @@ public class ManageIncludePathsDialog extends Dialog {
fShell = parentShell;
fContainer = container;
fProject = fContainer.getProject();
- DiscoveredScannerInfo scanInfo;
+ IDiscoveredPathInfo scanInfo;
if (fProject != null) {
- scanInfo = (DiscoveredScannerInfo) DiscoveredScannerInfoProvider.getDefault().getScannerInformation(fProject);
+ try {
+ scanInfo = MakeCorePlugin.getDefault().getDiscoveryManager().getDiscoveredInfo(fProject);
+ } catch (CoreException e) {
+ scanInfo = new DiscoveredPathInfo(fProject);
+ }
}
else {
- scanInfo = new DiscoveredScannerInfo(null);
- MakeScannerInfo makeInfo = new MakeScannerInfo(null);
- Preferences store = MakeCorePlugin.getDefault().getPluginPreferences();
- makeInfo.setIncludePaths(BuildPathInfoBlock.getIncludes(store));
- scanInfo.setUserScannerInfo(makeInfo);
+ scanInfo = new DiscoveredPathInfo(fProject);
}
- userPaths = new ArrayList(Arrays.asList(scanInfo.getUserIncludePaths()));
- discoveredPaths = scanInfo.getDiscoveredIncludePaths();
+ discoveredPaths = scanInfo.getIncludeMap();
setDirty(false);
fDirty = false;
}
@@ -183,14 +170,10 @@ public class ManageIncludePathsDialog extends Dialog {
fStatusLine.setLayoutData(gd);
fStatusLine.setMessage(getTitle(DIALOG_TITLE));
- createUserControls(composite);
createOptionsControls(composite);
createDiscoveredControls(composite);
setListContents();
- userList.select(0);
- userList.setFocus();
- enableUserButtons();
discActiveList.select(0);
discActiveList.setFocus();
enableDiscoveredButtons();
@@ -204,7 +187,6 @@ public class ManageIncludePathsDialog extends Dialog {
private void setListContents() {
workingDiscoveredPaths = new LinkedHashMap(discoveredPaths);
- userList.setItems((String[]) userPaths.toArray(new String[userPaths.size()]));
discActiveList.setItems(getDiscIncludePaths(workingDiscoveredPaths, ACTIVE));
discRemovedList.setItems(getDiscIncludePaths(workingDiscoveredPaths, REMOVED));
}
@@ -242,200 +224,6 @@ public class ManageIncludePathsDialog extends Dialog {
return new String[0];
}
- /**
- * @param composite
- */
- private void createUserControls(Composite composite) {
- // Create group
- Group userGroup = ControlFactory.createGroup(composite, getTitle(USER_GROUP), 3);
- ((GridData) userGroup.getLayoutData()).horizontalSpan = 2;
- ((GridData) userGroup.getLayoutData()).grabExcessHorizontalSpace = false;
-
- // Create list
- userList = new List(userGroup, SWT.BORDER | SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL);
- userList.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent e) {
- enableUserButtons();
- }
- });
- userList.addMouseListener(new MouseAdapter() {
- public void mouseDoubleClick(MouseEvent e) {
- editUserListItem();
- }
- });
-
- // Make it occupy the first column
- GridData gd = new GridData(GridData.FILL_BOTH);
- gd.grabExcessHorizontalSpace = true;
- gd.horizontalSpan = 1;
- gd.heightHint = getDefaultFontHeight(userList, PROJECT_LIST_MULTIPLIER);
- gd.widthHint = convertWidthInCharsToPixels(INITIAL_LIST_WIDTH);
- userList.setLayoutData(gd);
-
- // Create buttons
- // Create a composite for the buttons
- Composite pathButtonComp = ControlFactory.createComposite(userGroup, 1);
-
- // Add the buttons
- addPath = ControlFactory.createPushButton(pathButtonComp, getTitle(NEW));
- addPath.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent e) {
- handleAddPath();
- }
- });
- addPath.setEnabled(true);
- SWTUtil.setButtonDimensionHint(addPath);
-
- editPath = ControlFactory.createPushButton(pathButtonComp, getTitle(EDIT));
- editPath.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent e) {
- editUserListItem();
- }
- });
- editPath.setEnabled(true);
- SWTUtil.setButtonDimensionHint(editPath);
-
- removePath = ControlFactory.createPushButton(pathButtonComp, getTitle(REMOVE));
- removePath.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent e) {
- handleRemovePath();
- }
- });
- SWTUtil.setButtonDimensionHint(removePath);
-
- pathUp = ControlFactory.createPushButton(pathButtonComp, getTitle(UP));
- pathUp.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent e) {
- handlePathUp();
- }
- });
- SWTUtil.setButtonDimensionHint(pathUp);
-
- pathDown = ControlFactory.createPushButton(pathButtonComp, getTitle(DOWN));
- pathDown.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent e) {
- handlePathDown();
- }
- });
- SWTUtil.setButtonDimensionHint(pathDown);
- }
-
- protected void handleAddPath() {
- // Popup an entry dialog
- InputDialog dialog = new BuildPathInfoBlock.
- SelectPathInputDialog(fShell, getTitle(PATH_TITLE), getTitle(PATH_LABEL), "", null); //$NON-NLS-1$
- String path = null;
- if (dialog.open() == Window.OK) {
- path = dialog.getValue();
- if (path != null && path.length() > 0) {
- setDirty(true);
- userList.add(path);
- userList.select(userList.getItemCount() - 1);
- enableUserButtons();
- }
- }
- }
-
- /*
- * Double-click handler to allow edit of path information
- */
- protected void editUserListItem() {
- // Edit the selection index
- int index = userList.getSelectionIndex();
- if (index != -1) {
- String selItem = userList.getItem(index);
- if (selItem != null) {
- InputDialog dialog = new BuildPathInfoBlock.SelectPathInputDialog(
- fShell, getTitle(EDIT_PATH_TITLE), getTitle(PATH_LABEL), selItem, null);
- String newItem = null;
- if (dialog.open() == Window.OK) {
- newItem = dialog.getValue();
- if (newItem != null && !newItem.equals(selItem)) {
- userList.setItem(index, newItem);
- setDirty(true);
- }
- }
- }
- }
- }
-
- protected void handleRemovePath() {
- // Get the selection index
- int index = userList.getSelectionIndex();
- if (index == -1) {
- return;
- }
-
- // Remove the element at that index
- userList.remove(index);
- index = index - 1 < 0 ? 0 : index - 1;
- userList.select(index);
- setDirty(true);
-
- // Check if the buttons should still be enabled
- enableUserButtons();
- }
-
- protected void handlePathUp() {
- // Get the selection index
- int index = userList.getSelectionIndex();
- if (index == -1 || index == 0) {
- return;
- }
- // Swap the items in the list
- String selItem = userList.getItem(index);
- userList.remove(index);
- userList.add(selItem, --index);
- setDirty(true);
-
- // Keep the index selected
- userList.select(index);
- enableUserButtons();
- }
-
- protected void handlePathDown() {
- // Get the selection index
- int index = userList.getSelectionIndex();
- int items = userList.getItemCount();
- if (index == -1 || index == items - 1) {
- return;
- }
- // Swap the items in the list
- String selItem = userList.getItem(index);
- userList.remove(index);
- if (index + 1 == items) {
- userList.add(selItem);
- } else {
- userList.add(selItem, ++index);
- }
- setDirty(true);
-
- // Keep the swapped item selected
- userList.select(index);
- enableUserButtons();
- }
-
- /*
- * Enables the buttons on the path control if the right conditions are met
- */
- protected void enableUserButtons() {
- // Enable the remove button if there is at least 1 item in the list
- int items = userList.getItemCount();
- if (items > 0) {
- editPath.setEnabled(true);
- removePath.setEnabled(true);
- // Enable the up/down buttons depending on what item is selected
- int index = userList.getSelectionIndex();
- pathUp.setEnabled(items > 1 && index > 0);
- pathDown.setEnabled(items > 1 && index < (items - 1));
- } else {
- editPath.setEnabled(false);
- removePath.setEnabled(false);
- pathUp.setEnabled(false);
- pathDown.setEnabled(false);
- }
- }
-
/**
* @param composite
*/
@@ -753,13 +541,10 @@ public class ManageIncludePathsDialog extends Dialog {
*/
protected void buttonPressed(int buttonId) {
if (IDialogConstants.OK_ID == buttonId) {
- // Store user part
- userPaths = new ArrayList(Arrays.asList(userList.getItems()));
// Store discovered part
discoveredPaths = workingDiscoveredPaths;
// Return sum of user and active discovered paths
- returnPaths = new ArrayList(userPaths.size() + discActiveList.getItemCount());
- returnPaths.addAll(userPaths);
+ returnPaths = new ArrayList(discActiveList.getItemCount());
returnPaths.addAll(new ArrayList(Arrays.asList(discActiveList.getItems())));
fDirty = fWorkingDirty;
@@ -779,11 +564,11 @@ public class ManageIncludePathsDialog extends Dialog {
/**
* Called by BuildPathInfoBlock.performApply
* @param info
+ * @return boolean - true if changed
*/
- public void saveTo(DiscoveredScannerInfo info) {
+ public boolean saveTo(IDiscoveredPathInfo info) {
if (fDirty || (fProject == null && fContainer.getProject() != null)) {// New Standard Make project wizard
- info.setUserIncludePaths(userPaths);
- info.setDiscoveredIncludePaths(discoveredPaths);
+ info.setIncludeMap(discoveredPaths);
// remove deleted paths from discovered SC
if (deletedDiscoveredPaths != null) {
for (Iterator i = deletedDiscoveredPaths.iterator(); i.hasNext(); ) {
@@ -793,7 +578,9 @@ public class ManageIncludePathsDialog extends Dialog {
}
}
setDirty(false);
+ boolean rc = fDirty;
fDirty = false;
+ return rc;
}
/**
@@ -801,14 +588,9 @@ public class ManageIncludePathsDialog extends Dialog {
*/
public void restore() {
if (fProject != null) {
- userPaths = new ArrayList(Arrays.asList(BuildPathInfoBlock.getIncludes(
- MakeCorePlugin.getDefault().getPluginPreferences())));
// remove discovered paths
ScannerInfoCollector.getInstance().deleteAllPaths(fProject);
}
- else {
- userPaths = new ArrayList();
- }
discoveredPaths = new LinkedHashMap();
deletedDiscoveredPaths = null;
fDirty = true;