diff --git a/core/org.eclipse.cdt.ui/ChangeLog b/core/org.eclipse.cdt.ui/ChangeLog
index 55952c91bce..8946a75c053 100644
--- a/core/org.eclipse.cdt.ui/ChangeLog
+++ b/core/org.eclipse.cdt.ui/ChangeLog
@@ -1,3 +1,10 @@
+2004-08-16 Chris Wiebe
+
+ better handling of source folders in class wizard
+ * src/org/eclipse/cdt/internal/corext/util/CModelUtil.java
+ * src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassCreationWizardPage.java
+ * src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassCreationWizardMessages.properties
+
2004-08-16 Tanya Wolff
Fix for 70906: Duplicate entries in C/C++ preferences
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/corext/util/CModelUtil.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/corext/util/CModelUtil.java
index 681e5a49edf..9b7b6c495b5 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/corext/util/CModelUtil.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/corext/util/CModelUtil.java
@@ -10,7 +10,9 @@
***********************************************************************/
package org.eclipse.cdt.internal.corext.util;
+import org.eclipse.cdt.core.model.ICContainer;
import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ISourceRoot;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
@@ -57,6 +59,30 @@ public class CModelUtil {
return null;
}
+ /**
+ * Returns the source folder of ICElement
. If the given
+ * element is already a source folder, the element itself is returned.
+ */
+ public static ICContainer getSourceFolder(ICElement element) {
+ ICContainer folder = null;
+ if (element != null) {
+ boolean foundSourceRoot = false;
+ ICElement curr = element;
+ while (curr != null && !foundSourceRoot) {
+ if (curr instanceof ICContainer && folder == null) {
+ folder = (ICContainer)curr;
+ }
+ foundSourceRoot = (curr instanceof ISourceRoot);
+ curr = curr.getParent();
+ }
+ if (folder == null) {
+ ICProject cproject = element.getCProject();
+ folder = cproject.findSourceRoot(cproject.getProject());
+ }
+ }
+ return folder;
+ }
+
/**
* Returns true
if the given source root is
* referenced. This means it is own by a different project but is referenced
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassCreationWizardPage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassCreationWizardPage.java
index 05f003d3751..76c20a8f608 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassCreationWizardPage.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassCreationWizardPage.java
@@ -23,6 +23,7 @@ import org.eclipse.cdt.core.browser.QualifiedTypeName;
import org.eclipse.cdt.core.browser.TypeSearchScope;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
+import org.eclipse.cdt.core.model.ICContainer;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICModel;
import org.eclipse.cdt.core.model.ICProject;
@@ -94,7 +95,7 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
protected static final String SOURCE_FOLDER = PAGE_NAME + ".sourcefolder"; //$NON-NLS-1$
private StringButtonDialogField fSourceFolderDialogField;
protected IStatus fSourceFolderStatus;
- ISourceRoot fCurrentSourceFolder;
+ ICContainer fCurrentSourceFolder;
/** ID of the namespace input field. */
protected final static String NAMESPACE = PAGE_NAME + ".namespace"; //$NON-NLS-1$
@@ -126,9 +127,17 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
MethodStubsListDialogField fMethodStubsDialogField;
protected IStatus fMethodStubsStatus;
+ /** ID of the header file input field. */
+ protected final static String HEADERFILE = PAGE_NAME + ".headerfile"; //$NON-NLS-1$
StringButtonDialogField fHeaderFileDialogField;
+ protected IStatus fHeaderFileStatus;
+ IPath fCurrentHeaderFile;
+ /** ID of the header file input field. */
+ protected final static String SOURCEFILE = PAGE_NAME + ".sourcefile"; //$NON-NLS-1$
StringButtonDialogField fSourceFileDialogField;
+ protected IStatus fSourceFileStatus;
+ IPath fCurrentSourceFile;
private NewClassCodeGenerator fCodeGenerator = null;
@@ -190,10 +199,14 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
fClassNameStatus = new StatusInfo();
fBaseClassesStatus = new StatusInfo();
fMethodStubsStatus = new StatusInfo();
+ fHeaderFileStatus = new StatusInfo();
+ fSourceFileStatus = new StatusInfo();
fCurrentSourceFolder = null;
fCanModifyNamespace = true;
fCurrentEnclosingClass = null;
+ fCurrentHeaderFile = null;
+ fCurrentSourceFile = null;
fCanModifyEnclosingClass = true;
updateEnableState();
}
@@ -492,9 +505,7 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
setNamespace(namespace, true);
setEnclosingClass(enclosingClass, true);
setEnclosingClassSelection(false, true);
-
setClassName(className, true);
-
addMethodStub(new ConstructorMethodStub(), true);
addMethodStub(new DestructorMethodStub(), true);
}
@@ -505,29 +516,28 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
* @param elem the C element used to compute the initial folder
*/
protected void initSourceFolder(ICElement elem) {
- ISourceRoot initRoot = null;
+ ICContainer folder = null;
if (elem != null) {
- initRoot = CModelUtil.getSourceRoot(elem);
- if (initRoot == null) {
+ folder = CModelUtil.getSourceFolder(elem);
+ if (folder == null) {
ICProject cproject = elem.getCProject();
if (cproject != null) {
try {
- initRoot = null;
if (cproject.exists()) {
ISourceRoot[] roots = cproject.getSourceRoots();
if (roots != null && roots.length > 0)
- initRoot = roots[0];
+ folder = roots[0];
}
} catch (CModelException e) {
CUIPlugin.getDefault().log(e);
}
- if (initRoot == null) {
- initRoot = cproject.findSourceRoot(cproject.getResource());
+ if (folder == null) {
+ folder = cproject.findSourceRoot(cproject.getResource());
}
}
}
}
- setSourceFolder(initRoot, true);
+ setSourceFolder(folder, true);
}
/**
@@ -573,7 +583,7 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
private class SourceFolderFieldAdapter implements IStringButtonAdapter, IDialogFieldListener {
public void changeControlPressed(DialogField field) {
// take the current cproject as init element of the dialog
- ISourceRoot folder = chooseSourceFolder(fCurrentSourceFolder);
+ ICContainer folder = chooseSourceFolder(fCurrentSourceFolder);
if (folder != null) {
setSourceFolder(folder, true);
prepareTypeCache();
@@ -698,17 +708,33 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
private class HeaderFileFieldAdapter implements IStringButtonAdapter, IDialogFieldListener {
public void changeControlPressed(DialogField field) {
+ // take the current cproject as init element of the dialog
+ ITranslationUnit headerFile = chooseHeaderFile(fCurrentSourceFolder);
+ if (headerFile != null) {
+ setHeaderFile(headerFile.getPath(), true);
+ }
}
public void dialogFieldChanged(DialogField field) {
+ fHeaderFileStatus = headerFileChanged();
+ // tell all others
+ handleFieldChanged(HEADERFILE);
}
}
private class SourceFileFieldAdapter implements IStringButtonAdapter, IDialogFieldListener {
public void changeControlPressed(DialogField field) {
+ // take the current cproject as init element of the dialog
+ ITranslationUnit sourceFile = chooseSourceFile(fCurrentSourceFolder);
+ if (sourceFile != null) {
+ setSourceFile(sourceFile.getPath(), true);
+ }
}
public void dialogFieldChanged(DialogField field) {
+ fSourceFileStatus = sourceFileChanged();
+ // tell all others
+ handleFieldChanged(SOURCEFILE);
}
}
@@ -733,41 +759,29 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
}
IPath path = new Path(str);
IResource res = fWorkspaceRoot.findMember(path);
- if (res != null) {
+ if (res != null && res.exists()) {
int resType = res.getType();
if (resType == IResource.PROJECT || resType == IResource.FOLDER) {
IProject proj = res.getProject();
if (!proj.isOpen()) {
- status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.ProjectClosed", proj.getFullPath().toString())); //$NON-NLS-1$
+ status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.NotAFolder", str)); //$NON-NLS-1$
return status;
- }
- ICProject cproject = CoreModel.getDefault().create(proj);
- fCurrentSourceFolder = cproject.findSourceRoot(res);
- //TODO check for null
- if (res.exists()) {
-// try {
- if (!CoreModel.hasCCNature(proj) && !CoreModel.hasCNature(proj)) {
-// if (!proj.hasNature(CoreModel.NATURE_ID)) {
- if (resType == IResource.PROJECT) {
- status.setError(NewClassWizardMessages.getString("NewClassCreationWizardPage.warning.NotACProject")); //$NON-NLS-1$
- } else {
- status.setWarning(NewClassWizardMessages.getString("NewClassCreationWizardPage.warning.NotInACProject")); //$NON-NLS-1$
- }
- return status;
- }
-// } catch (CoreException e) {
-// status.setWarning(NewClassWizardMessages.getString("NewClassCreationWizardPage.warning.NotACProject")); //$NON-NLS-1$
-// }
-// if (!cproject.isOnClasspath(fCurrRoot)) {
-// if (!cproject.isOnSourceRoot(fCurrRoot)) {
-// status.setWarning(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.warning.NotOnClassPath", str)); //$NON-NLS-1$
-// }
-// if (fCurrRoot.isArchive()) {
-// status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.ContainerIsBinary", str)); //$NON-NLS-1$
-// return status;
-// }
}
- return status;
+ ICProject cproject = CoreModel.getDefault().create(proj);
+ ICElement e = CoreModel.getDefault().create(res.getFullPath());
+ fCurrentSourceFolder = CModelUtil.getSourceFolder(e);
+ if (fCurrentSourceFolder == null) {
+ status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.NotASourceFolder", str)); //$NON-NLS-1$
+ return status;
+ }
+ if (!CoreModel.hasCCNature(proj) && !CoreModel.hasCNature(proj)) {
+ if (resType == IResource.PROJECT) {
+ status.setError(NewClassWizardMessages.getString("NewClassCreationWizardPage.warning.NotACProject")); //$NON-NLS-1$
+ return status;
+ } else {
+ status.setWarning(NewClassWizardMessages.getString("NewClassCreationWizardPage.warning.NotInACProject")); //$NON-NLS-1$
+ }
+ }
} else {
status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.NotAFolder", str)); //$NON-NLS-1$
return status;
@@ -776,6 +790,7 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.SourceFolderDoesNotExist", str)); //$NON-NLS-1$
return status;
}
+ return status;
}
/**
@@ -856,17 +871,14 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
String enclosing = getEnclosingClass();
// must not be empty
if (enclosing.length() == 0) {
- status.setError(NewClassWizardMessages.getString("NewClassCreationWizardPage.error.EnterClassName")); //$NON-NLS-1$
+ status.setError(NewClassWizardMessages.getString("NewClassCreationWizardPage.error.EnterEnclosingClassName")); //$NON-NLS-1$
return status;
}
IStatus val = CConventions.validateClassName(enclosing);
if (val.getSeverity() == IStatus.ERROR) {
- status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.InvalidClassName", val.getMessage())); //$NON-NLS-1$
+ status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.InvalidEnclosingClassName", val.getMessage())); //$NON-NLS-1$
return status;
- } else if (val.getSeverity() == IStatus.WARNING) {
- status.setWarning(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.warning.ClassNameDiscouraged", val.getMessage())); //$NON-NLS-1$
- // continue checking
}
IProject project = getCurrentProject();
@@ -890,12 +902,18 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
types = AllTypesCache.getTypes(project, qualName, true);
for (int i = 0; i < types.length; ++i) {
if (types[i].getCElementType() == ICElement.C_CLASS) {
- status.setError(NewClassWizardMessages.getString("NewClassCreationWizardPage.error.ClassNameExistsDifferentCase")); //$NON-NLS-1$
+ status.setError(NewClassWizardMessages.getString("NewClassCreationWizardPage.error.EnclosingClassExistsDifferentCase")); //$NON-NLS-1$
return status;
}
}
- status.setError(NewClassWizardMessages.getString("NewClassCreationWizardPage.error.ClassNameNotExists")); //$NON-NLS-1$
+ status.setError(NewClassWizardMessages.getString("NewClassCreationWizardPage.error.EnclosingClassNotExists")); //$NON-NLS-1$
return status;
+ } else {
+ IProject enclosingProject = fCurrentEnclosingClass.getEnclosingProject();
+ if (enclosingProject == null || !enclosingProject.equals(project)) {
+ status.setError(NewClassWizardMessages.getString("NewClassCreationWizardPage.error.EnclosingClassNotExistsInProject")); //$NON-NLS-1$
+ return status;
+ }
}
}
return status;
@@ -993,6 +1011,20 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
*/
protected IStatus baseClassesChanged() {
StatusInfo status = new StatusInfo();
+
+ IProject project = getCurrentProject();
+ if (project != null) {
+ // make sure all classes belong to the project
+ IBaseClassInfo[] baseClasses = getBaseClasses();
+ for (int i = 0; i < baseClasses.length; ++i) {
+ ITypeInfo baseType = baseClasses[i].getType();
+ IProject baseProject = baseType.getEnclosingProject();
+ if (baseProject != null && !baseProject.equals(project)) {
+ status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.BaseClassNotExistsInProject", baseType.getQualifiedTypeName().toString())); //$NON-NLS-1$
+ return status;
+ }
+ }
+ }
return status;
}
@@ -1009,6 +1041,118 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
return status;
}
+ /**
+ * This method is a hook which gets called after the header file's
+ * text input field has changed. This default implementation updates
+ * the model and returns an error status. The underlying model
+ * is only valid if the returned status is OK.
+ *
+ * @return the model's error status
+ */
+ protected IStatus headerFileChanged() {
+ StatusInfo status = new StatusInfo();
+
+ fCurrentHeaderFile = null;
+ String str = getHeaderFileName();
+ if (str.length() == 0) {
+ status.setError(NewClassWizardMessages.getString("NewClassCreationWizardPage.error.EnterSourceFolderName")); //$NON-NLS-1$
+ return status;
+ }
+ IPath path = new Path(str);
+ IResource res = fWorkspaceRoot.findMember(path);
+ if (res != null && res.exists()) {
+ }
+// if (res.exists()) {
+//// try {
+// if (!CoreModel.hasCCNature(proj) && !CoreModel.hasCNature(proj)) {
+//// if (!proj.hasNature(CoreModel.NATURE_ID)) {
+// if (resType == IResource.PROJECT) {
+// status.setError(NewClassWizardMessages.getString("NewClassCreationWizardPage.warning.NotACProject")); //$NON-NLS-1$
+// } else {
+// status.setWarning(NewClassWizardMessages.getString("NewClassCreationWizardPage.warning.NotInACProject")); //$NON-NLS-1$
+// }
+// return status;
+// }
+//// } catch (CoreException e) {
+//// status.setWarning(NewClassWizardMessages.getString("NewClassCreationWizardPage.warning.NotACProject")); //$NON-NLS-1$
+//// }
+//// if (!cproject.isOnClasspath(fCurrRoot)) {
+//// if (!cproject.isOnSourceRoot(fCurrRoot)) {
+//// status.setWarning(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.warning.NotOnClassPath", str)); //$NON-NLS-1$
+//// }
+//// if (fCurrRoot.isArchive()) {
+//// status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.ContainerIsBinary", str)); //$NON-NLS-1$
+//// return status;
+//// }
+// }
+// return status;
+// } else {
+// status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.NotAFolder", str)); //$NON-NLS-1$
+// return status;
+// }
+// } else {
+// status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.SourceFolderDoesNotExist", str)); //$NON-NLS-1$
+// return status;
+// }
+ return status;
+ }
+
+ /**
+ * This method is a hook which gets called after the source file's
+ * text input field has changed. This default implementation updates
+ * the model and returns an error status. The underlying model
+ * is only valid if the returned status is OK.
+ *
+ * @return the model's error status
+ */
+ protected IStatus sourceFileChanged() {
+ StatusInfo status = new StatusInfo();
+
+ fCurrentHeaderFile = null;
+ String str = getHeaderFileName();
+ if (str.length() == 0) {
+ status.setError(NewClassWizardMessages.getString("NewClassCreationWizardPage.error.EnterSourceFolderName")); //$NON-NLS-1$
+ return status;
+ }
+ IPath path = new Path(str);
+ IResource res = fWorkspaceRoot.findMember(path);
+ if (res != null && res.exists()) {
+ }
+// if (res.exists()) {
+//// try {
+// if (!CoreModel.hasCCNature(proj) && !CoreModel.hasCNature(proj)) {
+//// if (!proj.hasNature(CoreModel.NATURE_ID)) {
+// if (resType == IResource.PROJECT) {
+// status.setError(NewClassWizardMessages.getString("NewClassCreationWizardPage.warning.NotACProject")); //$NON-NLS-1$
+// } else {
+// status.setWarning(NewClassWizardMessages.getString("NewClassCreationWizardPage.warning.NotInACProject")); //$NON-NLS-1$
+// }
+// return status;
+// }
+//// } catch (CoreException e) {
+//// status.setWarning(NewClassWizardMessages.getString("NewClassCreationWizardPage.warning.NotACProject")); //$NON-NLS-1$
+//// }
+//// if (!cproject.isOnClasspath(fCurrRoot)) {
+//// if (!cproject.isOnSourceRoot(fCurrRoot)) {
+//// status.setWarning(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.warning.NotOnClassPath", str)); //$NON-NLS-1$
+//// }
+//// if (fCurrRoot.isArchive()) {
+//// status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.ContainerIsBinary", str)); //$NON-NLS-1$
+//// return status;
+//// }
+// }
+// return status;
+// } else {
+// status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.NotAFolder", str)); //$NON-NLS-1$
+// return status;
+// }
+// } else {
+// status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.SourceFolderDoesNotExist", str)); //$NON-NLS-1$
+// return status;
+// }
+ return status;
+ }
+
/**
* Hook method that gets called when a field on this page has changed. For this page the
* method gets called when the source folder field changes.
@@ -1040,6 +1184,8 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
fClassNameStatus,
fBaseClassesStatus,
fMethodStubsStatus,
+ fHeaderFileStatus,
+ fSourceFileStatus
};
// the mode severe status will be displayed and the ok button enabled/disabled.
@@ -1172,7 +1318,7 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
public void setClassName(String name, boolean canBeModified) {
fClassNameDialogField.setText(name);
fClassNameDialogField.setEnabled(canBeModified);
- }
+ }
public void addBaseClass(ITypeInfo newBaseClass, ASTAccessVisibility access, boolean isVirtual) {
List baseClasses = fBaseClassesDialogField.getElements();
@@ -1260,7 +1406,7 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
* @param canBeModified if false
the source folder field can
* not be changed by the user. If true
the field is editable
*/
- public void setSourceFolder(ISourceRoot folder, boolean canBeModified) {
+ public void setSourceFolder(ICContainer folder, boolean canBeModified) {
fCurrentSourceFolder = folder;
String str = (folder == null) ? "" : folder.getPath().makeRelative().toString(); //$NON-NLS-1$
fSourceFolderDialogField.setText(str);
@@ -1320,6 +1466,40 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
updateEnableState();
}
+ /**
+ * Sets the current header file.
+ *
+ * @param path The new header path
+ * @param canBeModified if false
the header file field can
+ * not be changed by the user. If true
the field is editable
+ */
+ public void setHeaderFile(IPath headerPath, boolean canBeModified) {
+ fCurrentHeaderFile = headerPath;
+ if (fCurrentSourceFolder != null && fCurrentSourceFolder.getPath().isPrefixOf(headerPath)) {
+ headerPath = headerPath.removeFirstSegments(fCurrentSourceFolder.getPath().segmentCount());
+ }
+ String str = (headerPath == null) ? "" : headerPath.makeRelative().toString(); //$NON-NLS-1$
+ fHeaderFileDialogField.setText(str);
+ fHeaderFileDialogField.setEnabled(canBeModified);
+ }
+
+ /**
+ * Sets the current source file.
+ *
+ * @param path The new source path
+ * @param canBeModified if false
the header file field can
+ * not be changed by the user. If true
the field is editable
+ */
+ public void setSourceFile(IPath sourcePath, boolean canBeModified) {
+ fCurrentSourceFile = sourcePath;
+ if (fCurrentSourceFolder != null && fCurrentSourceFolder.getPath().isPrefixOf(sourcePath)) {
+ sourcePath = sourcePath.removeFirstSegments(fCurrentSourceFolder.getPath().segmentCount());
+ }
+ String str = (sourcePath == null) ? "" : sourcePath.makeRelative().toString(); //$NON-NLS-1$
+ fSourceFileDialogField.setText(str);
+ fSourceFileDialogField.setEnabled(canBeModified);
+ }
+
/*
* Updates the enable state of buttons related to the enclosing class selection checkbox.
*/
@@ -1327,32 +1507,32 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
boolean enclosing = isEnclosingClassSelected();
fNamespaceDialogField.setEnabled(fCanModifyNamespace && !enclosing);
fEnclosingClassDialogField.setEnabled(fCanModifyEnclosingClass && enclosing);
- }
+ }
- ISourceRoot chooseSourceFolder(ICElement initElement) {
- Class[] acceptedClasses = new Class[] { ISourceRoot.class, ICProject.class };
+ ICContainer chooseSourceFolder(ICElement initElement) {
+ Class[] acceptedClasses = new Class[] { ICContainer.class, ICProject.class };
TypedElementSelectionValidator validator = new TypedElementSelectionValidator(acceptedClasses, false) {
public boolean isSelectedValid(Object element) {
if (element instanceof ICProject) {
ICProject cproject = (ICProject)element;
IPath path = cproject.getProject().getFullPath();
return (cproject.findSourceRoot(path) != null);
- } else if (element instanceof ISourceRoot) {
- return true;
+ } else if (isValidSourceFolder(element)) {
+ return true;
}
return false;
}
};
- acceptedClasses = new Class[] { ICModel.class, ISourceRoot.class, ICProject.class };
+ acceptedClasses = new Class[] { ICModel.class, ICContainer.class, ICProject.class };
ViewerFilter filter = new TypedViewerFilter(acceptedClasses) {
public boolean select(Viewer viewer, Object parent, Object element) {
- if (element instanceof ISourceRoot) {
- return true;
- }
+ if (isValidSourceFolder(element)) {
+ return true;
+ }
return super.select(viewer, parent, element);
}
- };
+ };
CElementContentProvider provider = new CElementContentProvider();
ILabelProvider labelProvider = new CElementLabelProvider(CElementLabelProvider.SHOW_DEFAULT);
@@ -1370,14 +1550,29 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
if (element instanceof ICProject) {
ICProject cproject = (ICProject)element;
return cproject.findSourceRoot(cproject.getProject());
- } else if (element instanceof ISourceRoot) {
- return (ISourceRoot)element;
+ } else if (element instanceof ICContainer) {
+ return (ICContainer)element;
}
return null;
}
return null;
}
+ boolean isValidSourceFolder(Object obj) {
+ return (obj instanceof ICContainer
+ && CModelUtil.getSourceFolder((ICContainer)obj) != null);
+ }
+
+ boolean isValidHeaderFile(Object obj) {
+ return (obj instanceof ITranslationUnit
+ && CModelUtil.getSourceFolder((ITranslationUnit)obj) != null);
+ }
+
+ boolean isValidSourceFile(Object obj) {
+ return (obj instanceof ITranslationUnit
+ && CModelUtil.getSourceFolder((ITranslationUnit)obj) != null);
+ }
+
ITypeInfo chooseNamespace() {
ITypeSearchScope scope = prepareTypeCache();
if (scope == null)
@@ -1510,6 +1705,96 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
}
}
+ ITranslationUnit chooseHeaderFile(ICElement initElement) {
+ Class[] acceptedClasses = new Class[] { ITranslationUnit.class, ICContainer.class, ICProject.class };
+ TypedElementSelectionValidator validator = new TypedElementSelectionValidator(acceptedClasses, false) {
+ public boolean isSelectedValid(Object element) {
+ return isValidHeaderFile(element);
+ }
+ };
+
+ acceptedClasses = new Class[] { ICModel.class, ICContainer.class, ICProject.class, ITranslationUnit.class };
+ ViewerFilter filter = new TypedViewerFilter(acceptedClasses) {
+ public boolean select(Viewer viewer, Object parent, Object element) {
+ if (isValidHeaderFile(element)) {
+ return true;
+ }
+ return super.select(viewer, parent, element);
+ }
+ };
+
+ CElementContentProvider provider = new CElementContentProvider();
+ ILabelProvider labelProvider = new CElementLabelProvider(CElementLabelProvider.SHOW_DEFAULT);
+ ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), labelProvider, provider);
+ dialog.setValidator(validator);
+ dialog.setSorter(new CElementSorter());
+ dialog.setTitle(NewClassWizardMessages.getString("NewClassCreationWizardPage.ChooseHeaderFileDialog.title")); //$NON-NLS-1$
+ dialog.setMessage(NewClassWizardMessages.getString("NewClassCreationWizardPage.ChooseHeaderFileDialog.description")); //$NON-NLS-1$
+ dialog.addFilter(filter);
+ ICElement input = CoreModel.create(fWorkspaceRoot);
+ if (fCurrentSourceFolder != null) {
+ ICProject cproject = fCurrentSourceFolder.getCProject();
+ if (cproject != null)
+ input = cproject;
+ }
+ dialog.setInput(input);
+ dialog.setInitialSelection(initElement);
+
+ if (dialog.open() == Window.OK) {
+ Object element = dialog.getFirstResult();
+ if (element instanceof ITranslationUnit) {
+ return (ITranslationUnit)element;
+ }
+ return null;
+ }
+ return null;
+ }
+
+ ITranslationUnit chooseSourceFile(ICElement initElement) {
+ Class[] acceptedClasses = new Class[] { ITranslationUnit.class, ICContainer.class, ICProject.class };
+ TypedElementSelectionValidator validator = new TypedElementSelectionValidator(acceptedClasses, false) {
+ public boolean isSelectedValid(Object element) {
+ return isValidSourceFile(element);
+ }
+ };
+
+ acceptedClasses = new Class[] { ICModel.class, ICContainer.class, ICProject.class, ITranslationUnit.class };
+ ViewerFilter filter = new TypedViewerFilter(acceptedClasses) {
+ public boolean select(Viewer viewer, Object parent, Object element) {
+ if (isValidSourceFile(element)) {
+ return true;
+ }
+ return super.select(viewer, parent, element);
+ }
+ };
+
+ CElementContentProvider provider = new CElementContentProvider();
+ ILabelProvider labelProvider = new CElementLabelProvider(CElementLabelProvider.SHOW_DEFAULT);
+ ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), labelProvider, provider);
+ dialog.setValidator(validator);
+ dialog.setSorter(new CElementSorter());
+ dialog.setTitle(NewClassWizardMessages.getString("NewClassCreationWizardPage.ChooseSourceFileDialog.title")); //$NON-NLS-1$
+ dialog.setMessage(NewClassWizardMessages.getString("NewClassCreationWizardPage.ChooseSourceFileDialog.description")); //$NON-NLS-1$
+ dialog.addFilter(filter);
+ ICElement input = CoreModel.create(fWorkspaceRoot);
+ if (fCurrentSourceFolder != null) {
+ ICProject cproject = fCurrentSourceFolder.getCProject();
+ if (cproject != null)
+ input = cproject;
+ }
+ dialog.setInput(input);
+ dialog.setInitialSelection(initElement);
+
+ if (dialog.open() == Window.OK) {
+ Object element = dialog.getFirstResult();
+ if (element instanceof ITranslationUnit) {
+ return (ITranslationUnit)element;
+ }
+ return null;
+ }
+ return null;
+ }
+
// ---- creation ----------------
/**
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassWizardMessages.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassWizardMessages.properties
index d0a697a8c49..93ce43251ff 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassWizardMessages.properties
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassWizardMessages.properties
@@ -31,6 +31,7 @@ NewClassCreationWizardPage.ChooseSourceFolderDialog.description=&Choose a folder
NewClassCreationWizardPage.error.EnterSourceFolderName=Folder name is empty.
NewClassCreationWizardPage.error.SourceFolderDoesNotExist=Folder ''{0}'' does not exist.
NewClassCreationWizardPage.error.NotAFolder=''{0}'' must be a project or folder.
+NewClassCreationWizardPage.error.NotASourceFolder=''{0}'' is not a source folder.
NewClassCreationWizardPage.error.ProjectClosed=Project ''{0}'' must be accessible.
NewClassCreationWizardPage.warning.NotACProject=Folder is not a C/C++ project.
NewClassCreationWizardPage.warning.NotInACProject=Folder is not in a C/C++ project.
@@ -44,6 +45,11 @@ NewClassCreationWizardPage.warning.NamespaceDiscouraged=Namespace is discouraged
NewClassCreationWizardPage.enclosingClass.label=&Enclosing Class:
NewClassCreationWizardPage.enclosingClass.button=Br&owse...
+NewClassCreationWizardPage.error.EnterEnclosingClassName=Enclosing class name is empty.
+NewClassCreationWizardPage.error.EnclosingClassNotExists=Enclosing class does not exist.
+NewClassCreationWizardPage.error.EnclosingClassExistsDifferentCase=Enclosing class with same name but different case exists.
+NewClassCreationWizardPage.error.InvalidEnclosingClassName=Enclosing class name is not valid. {0}
+NewClassCreationWizardPage.error.EnclosingClassNotExistsInProject=Enclosing class does not exist in the current project.
NewClassCreationWizardPage.error.noTypeCache=Unable to access type cache.
@@ -57,15 +63,20 @@ NewClassCreationWizardPage.error.QualifiedName=Class name must not be qualified.
NewClassCreationWizardPage.warning.ClassNameDiscouraged=Class name is discouraged. {0}
NewClassCreationWizardPage.baseClasses.label=&Base Classes:
-NewClassCreationWizardPage.error.InvalidBaseClassName=Base class name is not valid.
+NewClassCreationWizardPage.error.InvalidBaseClassName=Base class name is not valid. {0}
+NewClassCreationWizardPage.error.BaseClassNotExistsInProject=Base class ''{0}'' does not exist in the current project.
NewClassCreationWizardPage.methodStubs.label=Method &Stubs:
NewClassCreationWizardPage.classDefinition.label=Class &Definition:
NewClassCreationWizardPage.classDefinition.button=Br&owse...
+NewClassCreationWizardPage.ChooseHeaderFileDialog.title=File Selection
+NewClassCreationWizardPage.ChooseHeaderFileDialog.description=&Choose a header file:
NewClassCreationWizardPage.classImplementation.button=Br&owse...
NewClassCreationWizardPage.classImplementation.label=Class &Implementation:
+NewClassCreationWizardPage.ChooseSourceFileDialog.title=File Selection
+NewClassCreationWizardPage.ChooseSourceFileDialog.description=&Choose a source file:
# -----------BaseClassesListDialogField -------------
BaseClassesListDialogField.buttons.add=&Add...