Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] New Tab for Paths and Symbols for Standard Make


To summarize,
This is a patch to allow users to add include path and defined symbol information to a standard make project. This information is required by clients like the indexer so that a proper index can be created. The interface to extract that information will follow. Details in the change logs.

Sean Evoy
Rational Software - IBM Software Group
Ottawa, Ontario, Canada
Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/ChangeLog,v
retrieving revision 1.110
diff -u -r1.110 ChangeLog
--- ChangeLog	25 Jun 2003 22:47:43 -0000	1.110
+++ ChangeLog	26 Jun 2003 14:16:55 -0000
@@ -1,3 +1,12 @@
+2003-06-26 Sean Evoy
+	Added a tab to the new standard make project wizard and CNature project
+	property page. User interacts with two list controls to add include paths
+	and proprocessor symbols to a standard make project.
+	* src/org/eclipse/cdt/ui/wizards/BuildPathInfoBlock.java
+	* src/org/eclipse/cdt/ui/wizards/StdMakeProjectWizard.java
+	* src/org/eclipse/cdt/internal/ui/preferences/CProjectPropertyPage.java
+	* src/org/eclipse/cdt/internal/ui/CPluginResources.properties
+
 2003-06-25 John Camelon
 	Create new interface and support for calculating lineNumber/offset mapping.  
 	Updated IASTClassSpecifier for qualified name query.  
Index: build/org/eclipse/cdt/ui/build/properties/BuildOptionListFieldEditor.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/build/org/eclipse/cdt/ui/build/properties/BuildOptionListFieldEditor.java,v
retrieving revision 1.1
diff -u -r1.1 BuildOptionListFieldEditor.java
--- build/org/eclipse/cdt/ui/build/properties/BuildOptionListFieldEditor.java	9 Jun 2003 19:22:19 -0000	1.1
+++ build/org/eclipse/cdt/ui/build/properties/BuildOptionListFieldEditor.java	26 Jun 2003 14:16:55 -0000
@@ -46,10 +46,11 @@
 	protected String getNewInputObject() {
 		// Create a dialog to prompt for a new symbol or path
 		InputDialog dialog = new InputDialog(getShell(), CUIPlugin.getResourceString(TITLE), fieldName, new String(), null);
+		String input = null;
 		if (dialog.open() == InputDialog.OK) {
-			return dialog.getValue();
+			input = dialog.getValue();
 		}
-		return new String();
+		return input.length() == 0 ? null : input;
 	}
 
 	/* (non-Javadoc)
Index: src/org/eclipse/cdt/internal/ui/CPluginResources.properties
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CPluginResources.properties,v
retrieving revision 1.13
diff -u -r1.13 CPluginResources.properties
--- src/org/eclipse/cdt/internal/ui/CPluginResources.properties	9 Jun 2003 19:22:19 -0000	1.13
+++ src/org/eclipse/cdt/internal/ui/CPluginResources.properties	26 Jun 2003 14:16:55 -0000
@@ -79,6 +79,15 @@
 ConfigurationBlock.build.continue=Continue On Error
 ConfigurationBlock.build.stop=Stop On Error
 
+# String constants for the build include path and preprocessor symbols
+BuildPathInfoBlock.label=Paths and Symbols
+BuildPathInfoBlock.paths=Include paths:
+BuildPathInfoBlock.symbols=Defined symbols:
+BuildPathInfoBlock.browse.path=New Include Path
+BuildPathInfoBlock.browse.path.label=Path:
+BuildPathInfoBlock.browse.symbol=New Defined Symbol
+BuildPathInfoBlock.browse.symbol.label=Symbol:
+
 StdMakeProjectWizard.op_error=Standard Make Error
 StdMakeProjectWizard.title=Standard Make Project
 StdMakeProjectWizard.description=Create a new Standard Make project.
Index: src/org/eclipse/cdt/internal/ui/preferences/CProjectPropertyPage.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CProjectPropertyPage.java,v
retrieving revision 1.8
diff -u -r1.8 CProjectPropertyPage.java
--- src/org/eclipse/cdt/internal/ui/preferences/CProjectPropertyPage.java	27 Nov 2002 04:50:03 -0000	1.8
+++ src/org/eclipse/cdt/internal/ui/preferences/CProjectPropertyPage.java	26 Jun 2003 14:16:56 -0000
@@ -12,6 +12,7 @@
 import org.eclipse.cdt.internal.ui.dialogs.StatusTool;
 import org.eclipse.cdt.ui.CUIPlugin;
 import org.eclipse.cdt.ui.wizards.BinaryParserBlock;
+import org.eclipse.cdt.ui.wizards.BuildPathInfoBlock;
 import org.eclipse.cdt.ui.wizards.IndexerBlock;
 import org.eclipse.cdt.ui.wizards.SettingsBlock;
 import org.eclipse.cdt.utils.ui.controls.TabFolderLayout;
@@ -43,6 +44,7 @@
 	SettingsBlock settingsBlock;
 	IndexerBlock indexerBlock;
 	BinaryParserBlock binaryParserBlock;
+	private BuildPathInfoBlock pathInfoBlock;
 
 	protected Control createContents(Composite parent) {
 		Composite composite= new Composite(parent, SWT.NONE);
@@ -88,6 +90,16 @@
 			item4.setImage(img4);
 		item4.setData(binaryParserBlock);
 		item4.setControl(binaryParserBlock.getControl(folder));
+		
+		pathInfoBlock = new BuildPathInfoBlock(this, getProject());
+		TabItem pathItem = new TabItem(folder, SWT.NONE);
+		pathItem.setText(pathInfoBlock.getLabel());
+		Image pathImg = pathInfoBlock.getImage();
+		if (pathImg != null) {
+			pathItem.setImage(pathImg);
+		}
+		pathItem.setData(pathInfoBlock);
+		pathItem.setControl(pathInfoBlock.getControl(folder));
 
 		WorkbenchHelp.setHelp(parent, ICHelpContextIds.PROJECT_PROPERTY_PAGE);	
 	}
@@ -112,6 +124,9 @@
 		if (ok && binaryParserBlock != null) {
 			ok = binaryParserBlock.isValid();
 		}
+		if (ok && pathInfoBlock != null) {
+			ok = pathInfoBlock.isValid();
+		}
 		setValid(ok);
 	}
 
@@ -134,6 +149,10 @@
 				if (binaryParserBlock != null) {
 					binaryParserBlock.doRun(getProject(), monitor);
 				}
+				monitor.worked(15);
+				if (pathInfoBlock != null) {
+					pathInfoBlock.doRun(getProject(), monitor);
+				}
 				monitor.worked(19);
 				monitor.done();
 			}
@@ -167,6 +186,7 @@
 			settingsBlock.setVisible(visible);
 			indexerBlock.setVisible(visible);
 			binaryParserBlock.setVisible(visible);
+			pathInfoBlock.setVisible(visible);
 			folder.setFocus();
 		}
 	}	
Index: src/org/eclipse/cdt/ui/wizards/BuildPathInfoBlock.java
===================================================================
RCS file: src/org/eclipse/cdt/ui/wizards/BuildPathInfoBlock.java
diff -N src/org/eclipse/cdt/ui/wizards/BuildPathInfoBlock.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/cdt/ui/wizards/BuildPathInfoBlock.java	26 Jun 2003 14:16:56 -0000
@@ -0,0 +1,660 @@
+package org.eclipse.cdt.ui.wizards;
+
+import java.util.StringTokenizer;
+
+import org.eclipse.cdt.core.CProjectNature;
+import org.eclipse.cdt.core.resources.IBuildInfo;
+import org.eclipse.cdt.internal.ui.util.SWTUtil;
+import org.eclipse.cdt.ui.CUIPlugin;
+import org.eclipse.cdt.utils.ui.controls.ControlFactory;
+import org.eclipse.cdt.utils.ui.swt.IValidation;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Shell;
+
+/**********************************************************************
+ * Copyright (c) 2002,2003 Rational Software Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Common Public License v0.5
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v05.html
+ * 
+ * Contributors: 
+ * IBM Rational Software - Initial API and implementation
+***********************************************************************/
+
+public class BuildPathInfoBlock implements IWizardTab {
+	private static final String PREFIX = "BuildPathInfoBlock"; //$NON-NLS-1$
+	private static final String LABEL = PREFIX + ".label"; //$NON-NLS-1$
+	private static final String PATHS = PREFIX + ".paths"; //$NON-NLS-1$
+	private static final String SYMBOLS = PREFIX + ".symbols"; //$NON-NLS-1$
+	private static final String BROWSE = PREFIX + ".browse"; //$NON-NLS-1$
+	private static final String PATH_TITLE = BROWSE + ".path"; //$NON-NLS-1$
+	private static final String PATH_LABEL = BROWSE + ".path.label"; //$NON-NLS-1$
+	private static final String SYMBOL_TITLE = BROWSE + ".symbol"; //$NON-NLS-1$
+	private static final String SYMBOL_LABEL = BROWSE + ".symbol.label"; //$NON-NLS-1$
+	private static final String NEW = "BuildPropertyCommon.label.new"; //$NON-NLS-1$
+	private static final String REMOVE = "BuildPropertyCommon.label.remove"; //$NON-NLS-1$
+	private static final String UP = "BuildPropertyCommon.label.up"; //$NON-NLS-1$
+	private static final String DOWN = "BuildPropertyCommon.label.down"; //$NON-NLS-1$
+
+	private IProject project;
+	private IValidation page;
+	private List pathList;
+	private List symbolList;
+	private Composite pathButtonComp;
+	private Button addPath;
+	private Button removePath;
+	private Button pathUp;
+	private Button pathDown;
+	private Composite symbolButtonComp;
+	private Button addSymbol;
+	private Button removeSymbol;
+	private Button symbolUp;
+	private Button symbolDown;
+	private Shell shell;
+	
+
+	/**
+	 * @param valid
+	 */
+	public BuildPathInfoBlock(IValidation valid) {
+		this(valid, null);
+	}
+
+	/**
+	 * @param page
+	 * @param project
+	 */
+	public BuildPathInfoBlock(IValidation valid, IProject project) {
+		this.page = valid;
+		this.project = project;
+	}
+
+	/**
+	 * @param composite
+	 */
+	private void createPathListButtons(Composite parent) {
+		// Create a composite for the buttons
+		pathButtonComp = ControlFactory.createComposite(parent, 1);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		pathButtonComp.setFont(parent.getFont());
+		
+		// Add the buttons
+		addPath = ControlFactory.createPushButton(pathButtonComp, CUIPlugin.getResourceString(NEW));
+		addPath.addSelectionListener(new SelectionAdapter() {
+		public void widgetSelected(SelectionEvent e) {
+				handleAddPath();
+			}
+		});
+		addPath.setEnabled(true);
+		addPath.setFont(parent.getFont());
+		addPath.setLayoutData(new GridData());
+		SWTUtil.setButtonDimensionHint(addPath);
+		
+		removePath = ControlFactory.createPushButton(pathButtonComp, CUIPlugin.getResourceString(REMOVE));
+		removePath.addSelectionListener(new SelectionAdapter() {
+		public void widgetSelected(SelectionEvent e) {
+				handleRemovePath();
+			}
+		});
+		removePath.setFont(parent.getFont());
+		removePath.setLayoutData(new GridData());
+		SWTUtil.setButtonDimensionHint(removePath);
+		
+		pathUp = ControlFactory.createPushButton(pathButtonComp, CUIPlugin.getResourceString(UP));
+		pathUp.addSelectionListener(new SelectionAdapter() {
+		public void widgetSelected(SelectionEvent e) {
+				handlePathUp();
+			}
+		});
+		pathUp.setFont(parent.getFont());
+		pathUp.setLayoutData(new GridData());
+		SWTUtil.setButtonDimensionHint(pathUp);
+		
+		pathDown = ControlFactory.createPushButton(pathButtonComp, CUIPlugin.getResourceString(DOWN));
+		pathDown.addSelectionListener(new SelectionAdapter() {
+		public void widgetSelected(SelectionEvent e) {
+				handlePathDown();
+			}
+		});
+		pathDown.setFont(parent.getFont());
+		pathDown.setLayoutData(new GridData());
+		SWTUtil.setButtonDimensionHint(pathDown);
+		
+	}
+
+	/**
+	 * @param composite
+	 */
+	private void createPathListControl(Composite parent, int numColumns) {
+		// Create the list
+		pathList = new List(parent, SWT.BORDER | SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL);
+		pathList.addSelectionListener(new SelectionAdapter () {
+			public void widgetSelected(SelectionEvent e) {
+				enablePathButtons();
+			}
+		});
+		pathList.addMouseListener(new MouseListener() {
+
+			public void mouseDoubleClick(MouseEvent e) {
+				editPathListItem();			
+			}
+
+			public void mouseDown(MouseEvent e) {
+				// Handled by the selection listener
+			}
+
+			public void mouseUp(MouseEvent e) {
+				// Handled by the selection listener
+			}
+		
+		});
+		
+		// Make it occupy the first 2 columns
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		gd.horizontalSpan = numColumns - 1;
+		pathList.setLayoutData(gd);
+		pathList.setFont(parent.getFont());
+	}
+
+	/**
+	 * @param composite
+	 */
+	private void createSymbolListButtons(Composite parent) {
+		// Create a composite for the buttons
+		symbolButtonComp = ControlFactory.createComposite(parent, 1);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		symbolButtonComp.setFont(parent.getFont());
+		
+		// Add the buttons
+		addSymbol = ControlFactory.createPushButton(symbolButtonComp, CUIPlugin.getResourceString(NEW));
+		addSymbol.addSelectionListener(new SelectionAdapter() {
+		public void widgetSelected(SelectionEvent e) {
+				handleAddSymbol();
+			}
+		});
+		addSymbol.setEnabled(true);
+		addSymbol.setFont(parent.getFont());
+		addSymbol.setLayoutData(new GridData());
+		SWTUtil.setButtonDimensionHint(addSymbol);
+		
+		removeSymbol = ControlFactory.createPushButton(symbolButtonComp, CUIPlugin.getResourceString(REMOVE));
+		removeSymbol.addSelectionListener(new SelectionAdapter() {
+		public void widgetSelected(SelectionEvent e) {
+				handleRemoveSymbol();
+			}
+		});
+		removeSymbol.setFont(parent.getFont());
+		removeSymbol.setLayoutData(new GridData());
+		SWTUtil.setButtonDimensionHint(removeSymbol);
+
+		symbolUp = ControlFactory.createPushButton(symbolButtonComp, CUIPlugin.getResourceString(UP));
+		symbolUp.addSelectionListener(new SelectionAdapter() {
+		public void widgetSelected(SelectionEvent e) {
+				handleSymbolUp();
+			}
+		});
+		symbolUp.setFont(parent.getFont());
+		symbolUp.setLayoutData(new GridData());
+		SWTUtil.setButtonDimensionHint(symbolUp);
+
+		symbolDown = ControlFactory.createPushButton(symbolButtonComp, CUIPlugin.getResourceString(DOWN));
+		symbolDown.addSelectionListener(new SelectionAdapter() {
+		public void widgetSelected(SelectionEvent e) {
+				handleSymbolDown();
+			}
+		});
+		symbolDown.setFont(parent.getFont());
+		symbolDown.setLayoutData(new GridData());
+		SWTUtil.setButtonDimensionHint(symbolDown);
+	}
+
+	/**
+	 * @param composite
+	 */
+	private void createSymbolListControl(Composite parent, int numColumns) {
+		// Create the list
+		symbolList = new List(parent, SWT.BORDER | SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL);
+		symbolList.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				enableSymbolButtons();
+			}
+		});
+		symbolList.addMouseListener(new MouseListener() {
+
+			public void mouseDoubleClick(MouseEvent e) {
+				editSymbolListItem();
+			}
+
+			public void mouseDown(MouseEvent e) {
+				// Handled by the selection event
+			}
+
+			public void mouseUp(MouseEvent e) {
+				// Handled by the selection event
+			}
+		});
+		
+		// Make it occupy the first n-1 columns
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		gd.horizontalSpan = numColumns - 1;
+		symbolList.setLayoutData(gd);
+		symbolList.setFont(parent.getFont());
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.ui.wizards.IWizardTab#doRun(org.eclipse.core.resources.IProject, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public void doRun(IProject project, IProgressMonitor monitor) {
+		try {
+			if (monitor == null) {
+				monitor = new NullProgressMonitor();
+			}
+			// Store the paths and symbols as comma-separated lists in the project's nature
+			CProjectNature nature = (CProjectNature) project.getNature(CProjectNature.C_NATURE_ID);
+			monitor.beginTask("Setting Include Paths", 1);
+			String paths = getPathListContents();
+			nature.setIncludePaths(paths, monitor);
+			monitor.beginTask("Setting Defined Symbols", 1);
+			String symbols = getSymbolListContents();
+			nature.setDefinedSymbols(symbols, monitor);
+			
+		}				
+		catch (CoreException e) {
+		}
+
+	}
+
+	/*
+	 * Double-click handler to allow edit of path information
+	 */
+	protected void editPathListItem() {
+		// Edit the selection index
+		int index = pathList.getSelectionIndex();
+		if (index != -1) {
+			String selItem = pathList.getItem(index);
+			if (selItem != null) {
+				InputDialog dialog = new InputDialog(shell, CUIPlugin.getResourceString(PATH_TITLE), CUIPlugin.getResourceString(PATH_LABEL), selItem, null);
+				String newItem = null;
+				if (dialog.open() == InputDialog.OK) {
+					newItem = dialog.getValue();
+					if (newItem != null && !newItem.equals(selItem)) {
+						pathList.setItem(index, newItem);
+					}
+				}
+			}
+		}
+	}
+
+	/*
+	 * Double-click handler to allow edit of symbol information
+	 */
+	protected void editSymbolListItem() {
+		// Edit the selection index
+		int index = symbolList.getSelectionIndex();
+		if (index != -1) {
+			String selItem = symbolList.getItem(index);
+			if (selItem != null) {
+				InputDialog dialog = new InputDialog(shell, CUIPlugin.getResourceString(SYMBOL_TITLE), CUIPlugin.getResourceString(SYMBOL_LABEL), selItem, null);
+				String newItem = null;
+				if (dialog.open() == InputDialog.OK) {
+					newItem = dialog.getValue();
+					if (newItem != null && !newItem.equals(selItem)) {
+						symbolList.setItem(index, newItem);
+					}
+				}
+			}
+		}
+	}
+
+	/*
+	 * Enables the buttons on the path control if the right conditions are met
+	 */
+	private void enablePathButtons() {
+		// Enable the remove button if there is at least 1 item in the list
+		int items = pathList.getItemCount();
+		if (items > 0){
+			removePath.setEnabled(true);
+			// Enable the up/down buttons depending on what item is selected
+			int index = pathList.getSelectionIndex();
+			pathUp.setEnabled(items > 1 && index > 0);
+			pathDown.setEnabled(items > 1 && index < (items - 1));
+		} else {
+			removePath.setEnabled(false);
+			pathUp.setEnabled(false);
+			pathDown.setEnabled(false);
+		}
+	}
+	
+	private void enableSymbolButtons() {
+		// Enable the remove button if there is at least 1 item in the list
+		int items = symbolList.getItemCount();
+		if (items > 0){
+			removeSymbol.setEnabled(true);
+			// Enable the up/down buttons depending on what item is selected
+			int index = symbolList.getSelectionIndex();
+			symbolUp.setEnabled(items > 1 && index > 0);
+			symbolDown.setEnabled(items > 1 && index < (items - 1));
+		} else {
+			removeSymbol.setEnabled(false);
+			symbolUp.setEnabled(false);
+			symbolDown.setEnabled(false);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.ui.wizards.IWizardTab#getControl(org.eclipse.swt.widgets.Composite)
+	 */
+	public Composite getControl(Composite parent) {
+		this.shell = parent.getShell();
+
+		// Create the composite control for the tab
+		int tabColumns = 3;
+		Font font = parent.getFont();
+		Composite composite = ControlFactory.createComposite(parent, tabColumns);
+		composite.setFont(font);
+		GridData gd;
+		
+		// Create a label for the include paths control
+		Label paths = ControlFactory.createLabel(composite, CUIPlugin.getResourceString(PATHS));
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.horizontalSpan = tabColumns;
+		paths.setLayoutData(gd);
+		paths.setFont(font);
+		
+		//Create the list and button controls
+		createPathListControl(composite, tabColumns);
+		createPathListButtons(composite);
+		enablePathButtons();
+
+		// Create a label for the symbols control
+		Label symbols = ControlFactory.createLabel(composite, CUIPlugin.getResourceString(SYMBOLS));
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.horizontalSpan = tabColumns;
+		symbols.setLayoutData(gd);
+		symbols.setFont(font);
+		
+		// Create list and button controls for symbols
+		createSymbolListControl(composite, tabColumns);
+		createSymbolListButtons(composite);
+		enableSymbolButtons();
+
+		return composite;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.ui.wizards.IWizardTab#getImage()
+	 */
+	public Image getImage() {
+		// We don't decorate the tabs for the wizard or property page
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.ui.wizards.IWizardTab#getLabel()
+	 */
+	public String getLabel() {
+		// Return the label defined in the CPluginProperties.resource file
+		return CUIPlugin.getResourceString(LABEL);
+	}
+
+	/**
+	 * @return
+	 */
+	private String getPathListContents() {
+		// Convert the contents of the path list into a comma-separated list
+		StringBuffer buffer = new StringBuffer();
+		if (pathList != null) {
+			String[] paths = pathList.getItems();
+			for (int i = 0; i < paths.length; i++) {
+				String string = paths[i];
+				buffer.append(string + IBuildInfo.SEPARATOR);
+			} 
+		}
+		return buffer.toString();
+	}
+
+	/**
+	 * @return
+	 */
+	private String getSymbolListContents() {
+		// Convert the contents of the symbol list into a comma-separated list
+		StringBuffer buffer = new StringBuffer();
+		if (symbolList != null) {
+			String[] symbols = symbolList.getItems();
+			for (int i = 0; i < symbols.length; i++) {
+				String symbol = symbols[i];
+				buffer.append(symbol + IBuildInfo.SEPARATOR);
+			} 
+		}
+		return buffer.toString();
+	}
+
+	/**
+	 * 
+	 */
+	protected void handleAddPath() {
+		// Popup an entry dialog
+		InputDialog dialog = new InputDialog(shell, CUIPlugin.getResourceString(PATH_TITLE), CUIPlugin.getResourceString(PATH_LABEL), "", null);
+		String path = null;
+		if (dialog.open() == InputDialog.OK) {
+			path = dialog.getValue();
+		}
+		if (path != null && path.length() > 0) {
+			pathList.add(path);
+			pathList.select(pathList.getItemCount() - 1);
+			enablePathButtons();
+		}
+	}
+
+	/**
+	 * 
+	 */
+	protected void handleAddSymbol() {
+		// Popup an entry dialog
+		InputDialog dialog = new InputDialog(shell, CUIPlugin.getResourceString(SYMBOL_TITLE), CUIPlugin.getResourceString(SYMBOL_LABEL), "", null);
+		String symbol = null;
+		if (dialog.open() == InputDialog.OK) {
+			symbol = dialog.getValue();
+		}
+		if (symbol != null && symbol.length() > 0) {
+			symbolList.add(symbol);
+			symbolList.select(symbolList.getItemCount() - 1);
+			enableSymbolButtons();
+		}
+	}
+
+	/**
+	 * 
+	 */
+	protected void handlePathDown() {
+		// Get the selection index
+		int index = pathList.getSelectionIndex();
+		int items = pathList.getItemCount();
+		if (index == -1 || index == items - 1) {
+			return;		
+		}
+		// Swap the items in the list
+		String selItem = pathList.getItem(index);
+		pathList.remove(index);
+		if (index + 1 == items) {
+			pathList.add(selItem);
+		} else {
+			pathList.add(selItem, ++index);
+		}
+		
+		// Keep the swapped item selected
+		pathList.select(index);
+		enablePathButtons();
+	}
+
+	/**
+	 * 
+	 */
+	protected void handlePathUp() {
+		// Get the selection index
+		int index = pathList.getSelectionIndex();
+		if (index == -1 || index == 0) {
+			return;		
+		}
+		// Swap the items in the list
+		String selItem = pathList.getItem(index);
+		pathList.remove(index);
+		pathList.add(selItem, --index);
+		
+		// Keep the index selected
+		pathList.select(index);
+		enablePathButtons();
+	}
+
+	/**
+	 * 
+	 */
+	protected void handleRemovePath() {
+		// Get the selection index
+		int index = pathList.getSelectionIndex();
+		if (index == -1) {
+			return;		
+		}
+		
+		// Remove the element at that index
+		pathList.remove(index);
+		index = index - 1 < 0 ? 0 : index -1;
+		pathList.select(index);
+		
+		// Check if the buttons should still be enabled
+		enablePathButtons();
+	}
+
+	/**
+	 * 
+	 */
+	protected void handleRemoveSymbol() {
+		// Get the selection index
+		int index = symbolList.getSelectionIndex();
+		if (index == -1) {
+			return;
+		}
+		// Remove the item at that index
+		symbolList.remove(index);
+		index = index - 1 < 0 ? 0 : index -1;
+		symbolList.select(index);
+		// Check if the button state should be toggled
+		enableSymbolButtons();
+	}
+
+	/**
+	 * 
+	 */
+	protected void handleSymbolDown() {
+		// Get the selection index
+		int index = symbolList.getSelectionIndex();
+		int items = symbolList.getItemCount();
+		if (index == -1 || index == items - 1) {
+			return;		
+		}
+		// Swap the items in the list
+		String selItem = symbolList.getItem(index);
+		symbolList.remove(index);
+		if (index + 1 == items) {
+			symbolList.add(selItem);
+		} else {
+			symbolList.add(selItem, ++index);
+		}
+		
+		// Keep the swapped item selected
+		symbolList.select(index);
+		enableSymbolButtons();
+	}
+
+	/**
+	 * 
+	 */
+	protected void handleSymbolUp() {
+		// Get the selection index
+		int index = symbolList.getSelectionIndex();
+		if (index == -1 || index == 0) {
+			return;		
+		}
+		// Swap the items in the list
+		String selItem = symbolList.getItem(index);
+		symbolList.remove(index);
+		symbolList.add(selItem, --index);
+		
+		// Keep the index selected
+		symbolList.select(index);
+		enableSymbolButtons();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.ui.wizards.IWizardTab#isValid()
+	 */
+	public boolean isValid() {
+		// Info on this page is not critical
+		return true;
+	}
+
+	private void setPathListContents() {
+		if (project != null) {
+			try {
+				CProjectNature nature = (CProjectNature)project.getNature(CProjectNature.C_NATURE_ID);
+				if (nature != null) {
+					String paths = nature.getIncludePaths();
+					StringTokenizer tokens = new StringTokenizer(paths, IBuildInfo.SEPARATOR);
+					while (tokens.hasMoreTokens()) {
+						pathList.add(tokens.nextToken());
+					}
+				}
+			} catch (CoreException e) {
+				// Just have an empty list
+			}
+		}
+	}
+	
+	private void setSymbolListContents() {
+		if (project != null) {
+			try {
+				CProjectNature nature = (CProjectNature)project.getNature(CProjectNature.C_NATURE_ID);
+				if (nature != null) {
+					String symbols = nature.getDefinedSymbols();
+					StringTokenizer tokens = new StringTokenizer(symbols, IBuildInfo.SEPARATOR);
+					while (tokens.hasMoreTokens()) {
+						symbolList.add(tokens.nextToken());
+					}
+				}
+			} catch (CoreException e) {
+				// Just have an empty list
+			}
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.ui.wizards.IWizardTab#setVisible(boolean)
+	 */
+	public void setVisible(boolean visible) {
+		// Set the content from the project
+		setPathListContents();
+		pathList.select(0);
+		enablePathButtons();
+		setSymbolListContents();
+		symbolList.select(0);
+		enableSymbolButtons();
+	}
+}
Index: src/org/eclipse/cdt/ui/wizards/StdMakeProjectWizard.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/wizards/StdMakeProjectWizard.java,v
retrieving revision 1.7
diff -u -r1.7 StdMakeProjectWizard.java
--- src/org/eclipse/cdt/ui/wizards/StdMakeProjectWizard.java	4 Feb 2003 20:00:45 -0000	1.7
+++ src/org/eclipse/cdt/ui/wizards/StdMakeProjectWizard.java	26 Jun 2003 14:16:56 -0000
@@ -30,6 +30,7 @@
 	private ReferenceBlock referenceBlock;
 	private SettingsBlock settingsBlock;
 	private BinaryParserBlock binaryParserBlock;
+	private BuildPathInfoBlock pathInfoBlock;
 
 	public StdMakeProjectWizard() {
 		this(CUIPlugin.getResourceString(WZ_TITLE), CUIPlugin.getResourceString(WZ_DESC));
@@ -72,6 +73,17 @@
 		item3.setData(binaryParserBlock);
 		item3.setControl(binaryParserBlock.getControl(folder));
 		addTabItem(binaryParserBlock);
+		
+		pathInfoBlock = new BuildPathInfoBlock(getValidation());
+		TabItem pathItem = new TabItem(folder, SWT.NONE);
+		pathItem.setText(pathInfoBlock.getLabel());
+		Image pathImg = pathInfoBlock.getImage();
+		if (pathImg != null) {
+			pathItem.setImage(pathImg);
+		}
+		pathItem.setData(pathInfoBlock);
+		pathItem.setControl(pathInfoBlock.getControl(folder));
+		addTabItem(pathInfoBlock);
 	}
 
 	protected void doRunPrologue(IProgressMonitor monitor) {
@@ -89,7 +101,7 @@
 			if (monitor == null) {
 				monitor = new NullProgressMonitor();
 			}
-			monitor.beginTask("Standard Make", 3);
+			monitor.beginTask("Standard Make", 4);
 			// Update the referenced project if provided.
 			if (referenceBlock != null) {
 				referenceBlock.doRun(newProject, new SubProgressMonitor(monitor, 1));
@@ -101,6 +113,10 @@
 			// Update the binary parser
 			if (binaryParserBlock != null) {
 				binaryParserBlock.doRun(newProject, new SubProgressMonitor(monitor, 1));
+			}
+			// Update the binary parser
+			if (pathInfoBlock != null) {
+				pathInfoBlock.doRun(newProject, new SubProgressMonitor(monitor, 1));
 			}
 		}
 	}
Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/ChangeLog,v
retrieving revision 1.105
diff -u -r1.105 ChangeLog
--- ChangeLog	24 Jun 2003 19:59:19 -0000	1.105
+++ ChangeLog	26 Jun 2003 14:16:40 -0000
@@ -1,3 +1,14 @@
+2003-06-26 Sean Evoy
+	Added methods to add and extract include paths and preprocessor 
+	symbols from standard make C and C++ projects.
+	
+	Getter and setter methods in:
+	* src/org/eclipse/cdt/core/BuildInfoFactory.java
+	* src/org/eclipse/cdt/core/CProjectNature.java
+	
+	Added new constant for comma-separated lists
+	* src/org/eclipse/cdt/core/resources/IBuildInfo.java
+
 2003-06-24 Alain Magloire
 
 	Patch form ando@xxxxxxxxxxxxxxx, to deal
Index: src/org/eclipse/cdt/core/BuildInfoFactory.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/src/org/eclipse/cdt/core/BuildInfoFactory.java,v
retrieving revision 1.3
diff -u -r1.3 BuildInfoFactory.java
--- src/org/eclipse/cdt/core/BuildInfoFactory.java	7 Aug 2002 14:35:53 -0000	1.3
+++ src/org/eclipse/cdt/core/BuildInfoFactory.java	26 Jun 2003 14:16:41 -0000
@@ -25,6 +25,8 @@
 	public static final String STOP_ON_ERROR = "stopOnError";
 //	public static final String CLEAR_CONSOLE = "clearConsole";
 	public static final String DEFAULT_BUILD_CMD = "useDefaultBuildCmd";
+	public static final String INCLUDE_PATHS = "includePaths";
+	public static final String DEFINED_SYMBOLS = "definedSymbols";
 	
 	public static abstract class Store implements IBuildInfo {
     	public String getBuildLocation() {
@@ -49,10 +51,18 @@
 			return getString(LOCATION);
     	}
     	
+    	public String getDefinedSymbols() {
+    		return getString(DEFINED_SYMBOLS);
+    	}
+    	
         public String getFullBuildArguments() {
         	return getString(FULL_ARGUMENTS);
         }
         
+        public String getIncludePaths() {
+        	return getString(INCLUDE_PATHS);
+        }
+        
         public String getIncrementalBuildArguments() {
         	return getString(INCREMENTAL_ARGUMENTS);
         }
@@ -65,14 +75,22 @@
 	    	putValue(LOCATION, location);
 	    }
 	    
+	    public void setDefinedSymbols(String argument) {
+	    	putValue(DEFINED_SYMBOLS, argument);
+	    }
+	    
         public void setFullBuildArguments(String arguments) {
         	putValue(FULL_ARGUMENTS, arguments);
         }
         
+		public void setIncludePaths(String arguments) {
+			putValue(INCLUDE_PATHS, arguments);	        
+		}
+		
         public void setIncrementalBuildArguments(String arguments) {
         	putValue(INCREMENTAL_ARGUMENTS, arguments);
         }
-        
+
 		public void setStopOnError(boolean on) {
         	putValue(STOP_ON_ERROR, new Boolean(on).toString());
 		}
Index: src/org/eclipse/cdt/core/CProjectNature.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CProjectNature.java,v
retrieving revision 1.3
diff -u -r1.3 CProjectNature.java
--- src/org/eclipse/cdt/core/CProjectNature.java	30 Oct 2002 19:55:58 -0000	1.3
+++ src/org/eclipse/cdt/core/CProjectNature.java	26 Jun 2003 14:16:41 -0000
@@ -106,6 +106,30 @@
 	    return new Path(buildLocation);
     }
 
+	/**
+	 * Answers a comma-separated list of defined preprocessor symbols
+	 * for the project, or an empty string if there are none.
+	 * 
+	 * @return
+	 * @throws CoreException
+	 */
+	public String getDefinedSymbols() throws CoreException {
+		String symbols = fBuildInfo.getDefinedSymbols();
+		return symbols == null ? new String() : symbols;
+	}
+	
+	/**
+	 * Sets the defined symbols for the project.
+	 * 
+	 * @param symbols
+	 */
+	public void setDefinedSymbols(String symbols, IProgressMonitor monitor) throws CoreException {
+		String oldSymbols = fBuildInfo.getDefinedSymbols();
+		if (symbols != null && !symbols.equals(oldSymbols)) {
+			fBuildInfo.setDefinedSymbols(symbols);
+		}
+	}
+	
     /**
      * Sets the arguments for the full build.
      */
@@ -126,7 +150,33 @@
 		}
 		return buildArguments;
     }
+    
+    /**
+     * Answers a comma-separated list of include paths defined for
+     * the project, or an empty string if there are none.
+     * 
+	 * @return
+	 * @throws CoreException
+	 */
+	public String getIncludePaths() throws CoreException {
+    	String paths = fBuildInfo.getIncludePaths();
+    	return paths == null ? new String() : paths;
+    }
 
+	/**
+	 * Sets the include path information for the project.
+	 * 
+	 * @param paths
+	 * @param monitor
+	 * @throws CoreException
+	 */
+	public void setIncludePaths(String paths, IProgressMonitor monitor) throws CoreException {
+		String oldPaths = fBuildInfo.getIncludePaths();
+		if (paths != null && !paths.equals(oldPaths)) {
+			fBuildInfo.setIncludePaths(paths);
+		}
+	}
+	
     /**
      * Sets the arguments for the incremental build.
      */
Index: src/org/eclipse/cdt/core/resources/IBuildInfo.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/IBuildInfo.java,v
retrieving revision 1.2
diff -u -r1.2 IBuildInfo.java
--- src/org/eclipse/cdt/core/resources/IBuildInfo.java	7 Aug 2002 14:35:53 -0000	1.2
+++ src/org/eclipse/cdt/core/resources/IBuildInfo.java	26 Jun 2003 14:16:41 -0000
@@ -6,14 +6,19 @@
  */
 
 public interface IBuildInfo {
-
+	public static final String SEPARATOR = ",";
+	
 	String getBuildLocation();
+	String getDefinedSymbols();
     String getFullBuildArguments();
+    String getIncludePaths();
     String getIncrementalBuildArguments();
     boolean isStopOnError();
 
 	void setBuildLocation(String location);
+	void setDefinedSymbols(String symbols);
     void setFullBuildArguments(String arguments);
+    void setIncludePaths(String paths);
     void setIncrementalBuildArguments(String arguments);
     void setStopOnError(boolean on);
 

Back to the top