*** empty log message ***
diff --git a/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/PDEResources.properties b/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/PDEResources.properties
index 8269caa..146877c 100644
--- a/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/PDEResources.properties
+++ b/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/PDEResources.properties
@@ -9,6 +9,11 @@
 

 MultiPageEditor.wrongEditor = Wrong editor for {0}

 

+

+CodeGenerator.missing.title = Missing Types 

+CodeGenerator.missing.type = The following Java type cannot be resolved: {0}. Check the Java build path for missing references.

+CodeGenerator.missing.types = The following Java types cannot be resolved: {0}, {1}. Check the Java build path for missing references.

+

 ###### Editors #######################################

 SourcePage.title = Source

 SourcePage.errorTitle = Source Errors

@@ -480,6 +485,9 @@
 NewExtensionWizard.PointSelectionPage.desc = Select an extension point from those available in the list.

 NewExtensionWizard.PointSelectionPage.pointId = Point ID

 NewExtensionWizard.PointSelectionPage.pointName = Point Name

+NewExtensionWizard.PointSelectionPage.missingTitle = Extensions

+NewExtensionWizard.PointSelectionPage.missingImport = The extension point "{0}" is defined in plug-in "{1}"  that is currently not on your dependency list.\

+ Add it before attempting to reference Java types defined by this extension point.

 

 NewExtensionPointWizard.title = New Extension Point

 NewExtensionPointWizard.desc = Specify id and name of the new extension point.

diff --git a/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/codegen/AttributeClassCodeGenerator.java b/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/codegen/AttributeClassCodeGenerator.java
index 0c3a62e..3cdf57c 100644
--- a/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/codegen/AttributeClassCodeGenerator.java
+++ b/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/codegen/AttributeClassCodeGenerator.java
@@ -12,8 +12,12 @@
 import org.eclipse.jdt.core.*;

 import java.io.PrintWriter;

 import org.eclipse.pde.internal.PDEPlugin;

+import org.eclipse.jface.dialogs.MessageDialog;

 

 public class AttributeClassCodeGenerator extends JavaCodeGenerator {

+	private static final String KEY_MISSING_TITLE = "CodeGenerator.missing.title";

+	private static final String KEY_MISSING_TYPE = "CodeGenerator.missing.type";

+	private static final String KEY_MISSING_TYPES = "CodeGenerator.missing.types";

 	private ISchemaAttribute attInfo;

 	private IJavaProject javaProject;

 	private IType expectedType;

@@ -136,9 +140,17 @@
 	}

 	try {

 		expectedType = findTypeForName(expectedTypeName);

-		if (expectedType==null) return;

-		if (expectedType.isClass() && expectedInterfaceName!=null) 

+		if (expectedType!=null && expectedType.isClass() && expectedInterfaceName!=null) 

 			expectedInterface = findTypeForName(expectedInterfaceName);

+		boolean missingType = expectedTypeName!=null && expectedType==null;

+		boolean missingInterface = expectedInterfaceName!=null 

+										&& expectedInterface==null;

+		if (missingType || missingInterface) {

+			String mtype = missingType?expectedTypeName:null;

+			String minter = missingInterface?expectedInterfaceName:null;

+			warnAboutMissingTypes(mtype, minter);

+		}

+		if (expectedType==null) return;

 		requiredMethods = new Vector();

 		if (expectedInterface!=null)

 		   addRequiredMethodsFor(expectedInterface);

@@ -147,6 +159,25 @@
 		PDEPlugin.logException(e);

 	}

 }

+

+private void warnAboutMissingTypes(String typeName, String interfaceName) {

+	String message;

+	if (typeName==null) {

+		message = PDEPlugin.getFormattedMessage(KEY_MISSING_TYPE, interfaceName);

+	}

+	else if (interfaceName==null) {

+		message = PDEPlugin.getFormattedMessage(KEY_MISSING_TYPE, typeName);

+	}

+	else {

+		message = PDEPlugin.getFormattedMessage(KEY_MISSING_TYPES, new String [] {

+									typeName, interfaceName });

+	}

+	MessageDialog.openWarning(PDEPlugin.getActiveWorkbenchShell(),

+			PDEPlugin.getResourceString(KEY_MISSING_TITLE),

+			message);

+}

+

+

 private IType findTypeForName(String typeName) throws JavaModelException {

 	IType type = null;

 	String fileName = typeName.replace('.', '/') + ".java";

diff --git a/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/editor/manifest/ExtensionElementPropertySource.java b/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/editor/manifest/ExtensionElementPropertySource.java
index 8f83987..b86318c 100644
--- a/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/editor/manifest/ExtensionElementPropertySource.java
+++ b/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/editor/manifest/ExtensionElementPropertySource.java
@@ -218,7 +218,8 @@
 		// Make sure we still return special values

 		if (isEditable() && attInfo != null) {

 			if (attInfo.getKind() == ISchemaAttribute.JAVA) {

-				return new JavaAttributeValue(project, attInfo, "");

+				IPluginModelBase model = att.getModel();

+				return new JavaAttributeValue(project, model, attInfo, "");

 			} else

 				if (attInfo.getKind() == ISchemaAttribute.RESOURCE) {

 					return new ResourceAttributeValue(project, "");

@@ -232,7 +233,8 @@
 		Object value = att.getValue();

 		if (attInfo != null) {

 			if (attInfo.getKind() == ISchemaAttribute.JAVA) {

-				return new JavaAttributeValue(project, attInfo, value.toString());

+				IPluginModelBase model = att.getModel();

+				return new JavaAttributeValue(project, model, attInfo, value.toString());

 			} else

 				if (attInfo.getKind() == ISchemaAttribute.RESOURCE) {

 					return new ResourceAttributeValue(project, value.toString());

diff --git a/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/editor/manifest/JavaAttributeCellEditor.java b/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/editor/manifest/JavaAttributeCellEditor.java
index 9b9b232..7fd2ce2 100644
--- a/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/editor/manifest/JavaAttributeCellEditor.java
+++ b/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/editor/manifest/JavaAttributeCellEditor.java
@@ -11,6 +11,7 @@
 import org.eclipse.swt.*;

 import org.eclipse.pde.internal.*;

 import org.eclipse.core.resources.*;

+import org.eclipse.pde.internal.base.model.plugin.*;

 

 public class JavaAttributeCellEditor extends DialogCellEditor {

 	private Label label;

@@ -28,9 +29,10 @@
 protected Object openDialogBox(Control cellEditorWindow) {

 	JavaAttributeValue value = (JavaAttributeValue)getValue();

 	IProject project = value.getProject();

+	IPluginModelBase model = value.getModel();

 	ISchemaAttribute attInfo = value.getAttributeInfo();

 

-	JavaAttributeWizard wizard = new JavaAttributeWizard(project, attInfo, value.getClassName());

+	JavaAttributeWizard wizard = new JavaAttributeWizard(project, model, attInfo, value.getClassName());

 	WizardDialog dialog =

 		new WizardDialog(PDEPlugin.getActiveWorkbenchShell(), wizard);

 	dialog.create();

diff --git a/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/editor/manifest/JavaAttributeValue.java b/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/editor/manifest/JavaAttributeValue.java
index eccdf34..69a7953 100644
--- a/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/editor/manifest/JavaAttributeValue.java
+++ b/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/editor/manifest/JavaAttributeValue.java
@@ -6,17 +6,23 @@
 

 import org.eclipse.pde.internal.base.schema.*;

 import org.eclipse.core.resources.*;

+import org.eclipse.pde.internal.base.model.plugin.*;

 

 public class JavaAttributeValue extends ResourceAttributeValue {

 	private ISchemaAttribute attInfo;

+	private IPluginModelBase model;

 

-public JavaAttributeValue(IProject project, ISchemaAttribute attInfo, String className) {

+public JavaAttributeValue(IProject project, IPluginModelBase model, ISchemaAttribute attInfo, String className) {

 	super(project, className);

 	this.attInfo = attInfo;

+	this.model = model;

 }

 public ISchemaAttribute getAttributeInfo() {

 	return attInfo;

 }

+public IPluginModelBase getModel() {

+	return model;

+}

 public String getClassName() {

 	return getStringValue();

 }

diff --git a/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/editor/manifest/JavaAttributeWizard.java b/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/editor/manifest/JavaAttributeWizard.java
index 4128fc0..bb0b473 100644
--- a/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/editor/manifest/JavaAttributeWizard.java
+++ b/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/editor/manifest/JavaAttributeWizard.java
@@ -19,27 +19,31 @@
 import org.eclipse.jface.wizard.*;

 import org.eclipse.pde.internal.*;

 import java.util.Hashtable;

+import org.eclipse.pde.internal.base.model.plugin.*;

 

 public class JavaAttributeWizard extends Wizard {

 	private String className;

 	private JavaAttributeWizardPage mainPage;

 	private IProject project;

 	private ISchemaAttribute attInfo;

+	private IPluginModelBase model;

 

-public JavaAttributeWizard(IProject project, ISchemaAttribute attInfo, String className) {

+public JavaAttributeWizard(IProject project, IPluginModelBase model, ISchemaAttribute attInfo, String className) {

 	this.className = className;

+	this.model = model;

 	this.project = project;

 	this.attInfo = attInfo;

 	setDefaultPageImageDescriptor(PDEPluginImages.DESC_NEWPPRJ_WIZ);

 	setDialogSettings(PDEPlugin.getDefault().getDialogSettings());

 	setNeedsProgressMonitor(true);

 }

+

 public void addPages() {

-	mainPage = new JavaAttributeWizardPage(project, attInfo, className);

+	mainPage = new JavaAttributeWizardPage(project, model, attInfo, className);

 	addPage(mainPage);

 }

 public Object getValue() {

-	return new JavaAttributeValue(project, attInfo, className);

+	return new JavaAttributeValue(project, model, attInfo, className);

 }

 public boolean performFinish() {

 	boolean result = mainPage.finish();

diff --git a/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/editor/manifest/JavaAttributeWizardPage.java b/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/editor/manifest/JavaAttributeWizardPage.java
index 04f9b58..36a07e0 100644
--- a/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/editor/manifest/JavaAttributeWizardPage.java
+++ b/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/editor/manifest/JavaAttributeWizardPage.java
@@ -26,6 +26,8 @@
 import org.eclipse.pde.internal.*;

 import org.eclipse.pde.internal.base.schema.*;

 import org.eclipse.jface.dialogs.*;

+import org.eclipse.pde.internal.base.model.plugin.*;

+import org.eclipse.pde.internal.base.model.build.*;

 

 public class JavaAttributeWizardPage extends WizardPage {

 	public static final String PAGE_TITLE = "JavaAttributeWizard.title";

@@ -67,10 +69,12 @@
 	private Composite searchPage;

 	private Composite generatePage;

 	private ModifyListener modifyListener;

+	private IPluginModelBase model;

 

-public JavaAttributeWizardPage(IProject project, ISchemaAttribute attInfo, String className) {

+public JavaAttributeWizardPage(IProject project, IPluginModelBase model, ISchemaAttribute attInfo, String className) {

 	super("classPage");

 	this.project = project;

+	this.model = model;

 	this.attInfo = attInfo;

 	this.className = className;

 	setTitle(PDEPlugin.getResourceString(PAGE_TITLE));

@@ -136,6 +140,7 @@
 	containerText = new Text(page, SWT.BORDER);

 	GridData gd = new GridData(GridData.FILL_HORIZONTAL);

 	containerText.setLayoutData(gd);

+	containerText.setText(computeSourceContainer());

 	containerText.addModifyListener(modifyListener);

 

 	Button button = new Button(page, SWT.PUSH);

@@ -185,6 +190,30 @@
 	openFileButton.setSelection(true);

 	generatePage = page;

 }

+

+private String computeSourceContainer() {

+	IBuildModel buildModel = model.getBuildModel();

+	if (buildModel==null || buildModel.isLoaded()==false) return "";

+	String candidate = null;

+	IBuildEntry [] entries = buildModel.getBuild().getBuildEntries();

+	for (int i=0; i<entries.length; i++) {

+		IBuildEntry entry = entries[i];

+		if (entry.getName().startsWith("source.")==false) continue;

+		if (candidate!=null) {

+			// more than one folder - abort

+			candidate = null;

+			break;

+		}

+		String [] tokens = entry.getTokens();

+		if (tokens.length >1) {

+			candidate = null;

+			break;

+		}

+		candidate = tokens[0];

+	}

+	return candidate!=null ? candidate: "";

+}

+

 private void createSearchPage() {

 	Composite page = new Composite(pageBook, SWT.NULL);

 	GridLayout layout = new GridLayout();

diff --git a/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/wizards/extension/PointSelectionPage.java b/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/wizards/extension/PointSelectionPage.java
index ac0e365..83d9954 100644
--- a/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/wizards/extension/PointSelectionPage.java
+++ b/ui/org.eclipse.pde.ui/Eclipse PDE UI/org/eclipse/pde/internal/wizards/extension/PointSelectionPage.java
@@ -16,6 +16,7 @@
 import org.eclipse.pde.internal.wizards.*;

 import org.eclipse.swt.graphics.*;

 import org.eclipse.pde.internal.*;

+import org.eclipse.jface.dialogs.MessageDialog;

 

 

 public class PointSelectionPage

@@ -34,6 +35,8 @@
 	private final static String KEY_POINT_ID = "NewExtensionWizard.PointSelectionPage.pointId";

 	private final static String KEY_POINT_NAME = "NewExtensionWizard.PointSelectionPage.pointName";

 	private final static String KEY_DESC = "NewExtensionWizard.PointSelectionPage.desc";

+	private final static String KEY_MISSING_TITLE = "NewExtensionWizard.PointSelectionPage.missingTitle";

+	private final static String KEY_MISSING_IMPORT = "NewExtensionWizard.PointSelectionPage.missingImport";

 	private Image pointImage;

 	private IPluginExtension newExtension;

 

@@ -195,11 +198,55 @@
 		if (id != null)

 			extension.setId(id);

 		pluginBase.add(extension);

+		ensureImportExists(pluginBase, currentPoint);

 	} catch (CoreException e) {

 		PDEPlugin.logException(e);

 	}

 	return true;

 }

+

+private void ensureImportExists(IPluginBase pluginBase, IPluginExtensionPoint point) throws CoreException {

+	IPlugin thisPlugin = getTargetPlugin(pluginBase);

+	IPlugin exPlugin = getTargetPlugin(point.getPluginBase());

+	if (thisPlugin==null || exPlugin==null) return;

+	

+	String exId = exPlugin.getId();

+	// Check if it is us

+	if (exId.equals(thisPlugin.getId())) return;

+	//Check if it is implicit

+	if (exId.equals("org.eclipse.core.boot") ||

+		exId.equals("org.eclipse.core.runtime")) return;

+	// We must have it

+	

+	IPluginImport [] iimports = thisPlugin.getImports();

+	for (int i=0; i<iimports.length; i++) {

+		IPluginImport iimport = iimports[i];

+		if (iimport.getId().equals(exId)) {

+			// found it

+			return;

+		}

+	}

+	// Don't have it - warn

+	String [] args = { point.getResourceString(point.getName()), 

+					   exPlugin.getResourceString(exPlugin.getName()) };

+	String message = PDEPlugin.getFormattedMessage(KEY_MISSING_IMPORT, 

+													args);

+	MessageDialog.openWarning(PDEPlugin.getActiveWorkbenchShell(),

+					PDEPlugin.getResourceString(KEY_MISSING_TITLE),

+					message);

+}

+

+private IPlugin getTargetPlugin(IPluginBase base) {

+	if (base instanceof IPlugin) return (IPlugin)base;

+	else {

+		IFragment fragment = (IFragment)base;

+		String targetId = fragment.getPluginId();

+		String targetVersion = fragment.getPluginVersion();

+		return PDEPlugin.getDefault().findPlugin(targetId, targetVersion);

+	}

+}

+

+

 public IPluginExtension getNewExtension() {

 	return newExtension;

 }