1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

2004-08-18 Chris Wiebe

added source/header file selection dialog
	* src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassCreationWizardPage.java
	* src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassCodeGenerator.java
	* src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassCreationWizardMessages.properties
	* src/org/eclipse/cdt/internal/ui/wizards/classwizard/SourceFileSelectionDialog.java
This commit is contained in:
Chris Wiebe 2004-08-18 22:06:06 +00:00
parent fe76ef6a11
commit d9bdbc066c
5 changed files with 726 additions and 140 deletions

View file

@ -1,3 +1,11 @@
2004-08-18 Chris Wiebe
added source/header file selection dialog
* src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassCreationWizardPage.java
* src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassCodeGenerator.java
* src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassCreationWizardMessages.properties
* src/org/eclipse/cdt/internal/ui/wizards/classwizard/SourceFileSelectionDialog.java
2004-08-16 Chris Wiebe
better handling of source folders in class wizard

View file

@ -156,13 +156,25 @@ public class NewClassCodeGenerator {
//TODO should use code templates
StringBuffer text = new StringBuffer();
int insertionPos = -1;
int appendFirstCharPos = -1;
if (oldContents != null) {
insertionPos = getInsertionPos(oldContents);
if (insertionPos == -1)
int insertionPos = getInsertionPos(oldContents);
if (insertionPos == -1) {
text.append(oldContents);
else
text.append(oldContents.substring(0, insertionPos));
} else {
// skip over whitespace
int prependLastCharPos = insertionPos - 1;
while (prependLastCharPos >= 0 && Character.isWhitespace(oldContents.charAt(prependLastCharPos))) {
--prependLastCharPos;
}
if (prependLastCharPos >= 0) {
text.append(oldContents.substring(0, prependLastCharPos + 1));
}
appendFirstCharPos = prependLastCharPos + 1;
}
text.append(fLineDelimiter);
// insert a blank line before class definition
text.append(fLineDelimiter);
}
@ -202,9 +214,18 @@ public class NewClassCodeGenerator {
endNamespace(text);
}
if (oldContents != null && insertionPos != -1) {
if (oldContents != null && appendFirstCharPos != -1) {
// insert a blank line after class definition
text.append(fLineDelimiter);
text.append(oldContents.substring(insertionPos));
// skip over any extra whitespace
int len = oldContents.length();
while (appendFirstCharPos < len && Character.isWhitespace(oldContents.charAt(appendFirstCharPos))) {
++appendFirstCharPos;
}
if (appendFirstCharPos < len) {
text.append(oldContents.substring(appendFirstCharPos));
}
}
return text.toString();
@ -440,7 +461,7 @@ public class NewClassCodeGenerator {
}
}
private IPath makeRelativePathToProjectIncludes(IPath fullPath, IProject project) {
public static IPath makeRelativePathToProjectIncludes(IPath fullPath, IProject project) {
IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(project);
if (provider != null) {
IScannerInfo info = provider.getScannerInformation(project);
@ -465,7 +486,7 @@ public class NewClassCodeGenerator {
return null;
}
private IPath makeRelativePath(IPath path, IPath relativeTo) {
public static IPath makeRelativePath(IPath path, IPath relativeTo) {
int segments = relativeTo.matchingFirstSegments(path);
if (segments > 0) {
IPath prefix = relativeTo.removeFirstSegments(segments).removeLastSegments(1);
@ -479,7 +500,7 @@ public class NewClassCodeGenerator {
return null;
}
private String getIncludeString(String fileName, boolean isSystemInclude) {
private static String getIncludeString(String fileName, boolean isSystemInclude) {
StringBuffer buf = new StringBuffer();
buf.append("#include "); //$NON-NLS-1$
if (isSystemInclude)

View file

@ -184,14 +184,14 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
HeaderFileFieldAdapter headerFileAdapter = new HeaderFileFieldAdapter();
fHeaderFileDialogField = new StringButtonDialogField(headerFileAdapter);
fHeaderFileDialogField.setDialogFieldListener(headerFileAdapter);
fHeaderFileDialogField.setLabelText(NewClassWizardMessages.getString("NewClassCreationWizardPage.classDefinition.label")); //$NON-NLS-1$
fHeaderFileDialogField.setButtonLabel(NewClassWizardMessages.getString("NewClassCreationWizardPage.classDefinition.button")); //$NON-NLS-1$
fHeaderFileDialogField.setLabelText(NewClassWizardMessages.getString("NewClassCreationWizardPage.headerFile.label")); //$NON-NLS-1$
fHeaderFileDialogField.setButtonLabel(NewClassWizardMessages.getString("NewClassCreationWizardPage.headerFile.button")); //$NON-NLS-1$
SourceFileFieldAdapter sourceFileAdapter = new SourceFileFieldAdapter();
fSourceFileDialogField = new StringButtonDialogField(sourceFileAdapter);
fSourceFileDialogField.setDialogFieldListener(sourceFileAdapter);
fSourceFileDialogField.setLabelText(NewClassWizardMessages.getString("NewClassCreationWizardPage.classImplementation.label")); //$NON-NLS-1$
fSourceFileDialogField.setButtonLabel(NewClassWizardMessages.getString("NewClassCreationWizardPage.classImplementation.button")); //$NON-NLS-1$
fSourceFileDialogField.setLabelText(NewClassWizardMessages.getString("NewClassCreationWizardPage.sourceFile.label")); //$NON-NLS-1$
fSourceFileDialogField.setButtonLabel(NewClassWizardMessages.getString("NewClassCreationWizardPage.sourceFile.button")); //$NON-NLS-1$
fSourceFolderStatus = new StatusInfo();
fNamespaceStatus = new StatusInfo();
@ -583,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
ICContainer folder = chooseSourceFolder(fCurrentSourceFolder);
ICElement folder = chooseSourceFolder(fCurrentSourceFolder);
if (folder != null) {
setSourceFolder(folder, true);
prepareTypeCache();
@ -593,6 +593,7 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
public void dialogFieldChanged(DialogField field) {
fSourceFolderStatus = sourceFolderChanged();
// tell all others
updateEnableState();
handleFieldChanged(SOURCE_FOLDER);
}
}
@ -674,6 +675,7 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
}
fClassNameStatus = classNameChanged();
// tell all others
updateEnableState();
handleFieldChanged(CLASSNAME);
}
}
@ -682,9 +684,10 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
public void customButtonPressed(ListDialogField field, int index) {
if (index == 0) {
chooseBaseClasses();
fBaseClassesStatus = baseClassesChanged();
handleFieldChanged(BASECLASSES);
}
fBaseClassesStatus = baseClassesChanged();
updateEnableState();
handleFieldChanged(BASECLASSES);
}
public void selectionChanged(ListDialogField field) {
@ -708,32 +711,32 @@ 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);
IPath filePath = chooseSourceFile(getHeaderFilePath(), NewClassWizardMessages.getString("NewClassCreationWizardPage.ChooseHeaderFileDialog.title")); //$NON-NLS-1$
if (filePath != null) {
setHeaderFile(filePath, true);
}
}
public void dialogFieldChanged(DialogField field) {
fHeaderFileStatus = headerFileChanged();
// tell all others
updateEnableState();
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);
IPath filePath = chooseSourceFile(getSourceFilePath(), NewClassWizardMessages.getString("NewClassCreationWizardPage.ChooseSourceFileDialog.title")); //$NON-NLS-1$
if (filePath != null) {
setSourceFile(filePath, true);
}
}
public void dialogFieldChanged(DialogField field) {
fSourceFileStatus = sourceFileChanged();
// tell all others
updateEnableState();
handleFieldChanged(SOURCEFILE);
}
}
@ -767,7 +770,6 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.NotAFolder", str)); //$NON-NLS-1$
return status;
}
ICProject cproject = CoreModel.getDefault().create(proj);
ICElement e = CoreModel.getDefault().create(res.getFullPath());
fCurrentSourceFolder = CModelUtil.getSourceFolder(e);
if (fCurrentSourceFolder == null) {
@ -787,7 +789,7 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
return status;
}
} else {
status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.SourceFolderDoesNotExist", str)); //$NON-NLS-1$
status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.FolderDoesNotExist", str)); //$NON-NLS-1$
return status;
}
return status;
@ -914,6 +916,11 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
status.setError(NewClassWizardMessages.getString("NewClassCreationWizardPage.error.EnclosingClassNotExistsInProject")); //$NON-NLS-1$
return status;
}
// ITypeReference ref = fCurrentEnclosingClass.getResolvedReference();
// if (ref == null || enclosingProject.getFullPath().isPrefixOf(ref.getPath())) {
// status.setError(NewClassWizardMessages.getString("NewClassCreationWizardPage.error.EnclosingClassNotExistsInProject")); //$NON-NLS-1$
// return status;
// }
}
}
return status;
@ -1091,7 +1098,7 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
// return status;
// }
// } else {
// status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.SourceFolderDoesNotExist", str)); //$NON-NLS-1$
// status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.FolderDoesNotExist", str)); //$NON-NLS-1$
// return status;
// }
return status;
@ -1147,7 +1154,7 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
// return status;
// }
// } else {
// status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.SourceFolderDoesNotExist", str)); //$NON-NLS-1$
// status.setError(NewClassWizardMessages.getFormattedString("NewClassCreationWizardPage.error.FolderDoesNotExist", str)); //$NON-NLS-1$
// return status;
// }
return status;
@ -1265,6 +1272,19 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
return fHeaderFileDialogField.getText();
}
public IPath getHeaderFilePath() {
String name = getHeaderFileName();
if (name.length() > 0) {
IPath headerPath = new Path(name);
if (headerPath.isAbsolute()) {
return headerPath;
} else if (fCurrentSourceFolder != null) {
return fCurrentSourceFolder.getPath().append(headerPath);
}
}
return null;
}
/**
* Returns the type name entered into the type input field.
*
@ -1274,6 +1294,19 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
return fSourceFileDialogField.getText();
}
public IPath getSourceFilePath() {
String name = getSourceFileName();
if (name.length() > 0) {
IPath headerPath = new Path(name);
if (headerPath.isAbsolute()) {
return headerPath;
} else if (fCurrentSourceFolder != null) {
return fCurrentSourceFolder.getPath().append(headerPath);
}
}
return null;
}
public IProject getCurrentProject() {
if (fCurrentSourceFolder != null) {
return fCurrentSourceFolder.getCProject().getProject();
@ -1406,8 +1439,12 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
* @param canBeModified if <code>false</code> the source folder field can
* not be changed by the user. If <code>true</code> the field is editable
*/
public void setSourceFolder(ICContainer folder, boolean canBeModified) {
fCurrentSourceFolder = folder;
public void setSourceFolder(ICElement folder, boolean canBeModified) {
if (folder instanceof ICContainer) {
fCurrentSourceFolder = (ICContainer)folder;
} else {
fCurrentSourceFolder = null;
}
String str = (folder == null) ? "" : folder.getPath().makeRelative().toString(); //$NON-NLS-1$
fSourceFolderDialogField.setText(str);
fSourceFolderDialogField.setEnabled(canBeModified);
@ -1474,9 +1511,12 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
* not be changed by the user. If <code>true</code> 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());
fCurrentHeaderFile = headerPath;
if (fCurrentSourceFolder != null) {
IPath sourcePath = fCurrentSourceFolder.getPath();
IPath relPath = NewClassCodeGenerator.makeRelativePath(headerPath, sourcePath);
if (relPath != null)
headerPath = relPath;
}
String str = (headerPath == null) ? "" : headerPath.makeRelative().toString(); //$NON-NLS-1$
fHeaderFileDialogField.setText(str);
@ -1504,12 +1544,18 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
* Updates the enable state of buttons related to the enclosing class selection checkbox.
*/
void updateEnableState() {
IProject project = getCurrentProject();
boolean validProject = (project != null);
fBaseClassesDialogField.setEnabled(validProject);
fHeaderFileDialogField.setEnabled(validProject);
fSourceFileDialogField.setEnabled(validProject);
boolean enclosing = isEnclosingClassSelected();
fNamespaceDialogField.setEnabled(fCanModifyNamespace && !enclosing);
fEnclosingClassDialogField.setEnabled(fCanModifyEnclosingClass && enclosing);
fNamespaceDialogField.setEnabled(validProject && fCanModifyNamespace && !enclosing);
fEnclosingClassDialogField.setEnabled(validProject && fCanModifyEnclosingClass && enclosing);
}
ICContainer chooseSourceFolder(ICElement initElement) {
ICElement chooseSourceFolder(ICElement initElement) {
Class[] acceptedClasses = new Class[] { ICContainer.class, ICProject.class };
TypedElementSelectionValidator validator = new TypedElementSelectionValidator(acceptedClasses, false) {
public boolean isSelectedValid(Object element) {
@ -1546,14 +1592,17 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
dialog.setInitialSelection(initElement);
if (dialog.open() == Window.OK) {
Object element = dialog.getFirstResult();
if (element instanceof ICProject) {
ICProject cproject = (ICProject)element;
return cproject.findSourceRoot(cproject.getProject());
} else if (element instanceof ICContainer) {
return (ICContainer)element;
Object result = dialog.getFirstResult();
if (result instanceof ICElement) {
ICElement element = (ICElement)result;
if (element instanceof ICProject) {
ICProject cproject = (ICProject)element;
ISourceRoot folder = cproject.findSourceRoot(cproject.getProject());
if (folder != null)
return folder;
}
return element;
}
return null;
}
return null;
}
@ -1705,32 +1754,8 @@ 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);
IPath chooseSourceFile(IPath filePath, String title) {
SourceFileSelectionDialog dialog = new SourceFileSelectionDialog(getShell());
ICElement input = CoreModel.create(fWorkspaceRoot);
if (fCurrentSourceFolder != null) {
ICProject cproject = fCurrentSourceFolder.getCProject();
@ -1738,63 +1763,19 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
input = cproject;
}
dialog.setInput(input);
dialog.setInitialSelection(initElement);
if (filePath != null) {
dialog.setInitialFields(filePath.removeLastSegments(1).toString(), filePath.lastSegment());
} else if (fCurrentSourceFolder != null) {
dialog.setInitialFields(fCurrentSourceFolder.getPath().toString(), null);
}
if (dialog.open() == Window.OK) {
Object element = dialog.getFirstResult();
if (element instanceof ITranslationUnit) {
return (ITranslationUnit)element;
}
return null;
return dialog.getFilePath();
}
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 ----------------
/**
@ -1805,13 +1786,9 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
* @throws InterruptedException Thrown when the operation was cancelled.
*/
public void createClass(IProgressMonitor monitor) throws CoreException, InterruptedException {
IPath containerPath = fCurrentSourceFolder.getPath();
IPath headerPath = containerPath.append(getHeaderFileName());
IPath sourcePath = containerPath.append(getSourceFileName());
fCodeGenerator = new NewClassCodeGenerator(
headerPath,
sourcePath,
getHeaderFilePath(),
getSourceFilePath(),
getClassName(),
getNamespace(),
getBaseClasses(),

View file

@ -27,11 +27,11 @@ NewClassCreationWizardPage.getClasses.noclasses.message=No classes available.
NewClassCreationWizardPage.sourceFolder.label=Source &Folder:
NewClassCreationWizardPage.sourceFolder.button=Br&owse...
NewClassCreationWizardPage.ChooseSourceFolderDialog.title=Folder Selection
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.ChooseSourceFolderDialog.description=&Choose a source folder:
NewClassCreationWizardPage.error.EnterSourceFolderName=Source folder name is empty.
NewClassCreationWizardPage.error.FolderDoesNotExist=Folder ''{0}'' does not exist.
NewClassCreationWizardPage.error.NotAFolder=''{0}'' is not a project or folder.
NewClassCreationWizardPage.error.NotASourceFolder=Folder ''{0}'' is not a valid 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.
@ -68,15 +68,13 @@ NewClassCreationWizardPage.error.BaseClassNotExistsInProject=Base class ''{0}''
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.headerFile.label=Class &Definition:
NewClassCreationWizardPage.headerFile.button=Br&owse...
NewClassCreationWizardPage.ChooseHeaderFileDialog.title=Header File Selection
NewClassCreationWizardPage.classImplementation.button=Br&owse...
NewClassCreationWizardPage.classImplementation.label=Class &Implementation:
NewClassCreationWizardPage.ChooseSourceFileDialog.title=File Selection
NewClassCreationWizardPage.ChooseSourceFileDialog.description=&Choose a source file:
NewClassCreationWizardPage.sourceFile.button=Br&owse...
NewClassCreationWizardPage.sourceFile.label=Class &Implementation:
NewClassCreationWizardPage.ChooseSourceFileDialog.title=Source File Selection
# -----------BaseClassesListDialogField -------------
BaseClassesListDialogField.buttons.add=&Add...
@ -126,6 +124,22 @@ NewBaseClassSelectionDialog.getClasses.exception.message=Unexpected exception. S
NewBaseClassSelectionDialog.getClasses.noclasses.title=Class Selection
NewBaseClassSelectionDialog.getClasses.noclasses.message=No classes available.
# ------- SourceFileSelectionDialog -----
SourceFileSelectionDialog.folderName.label=Folder Name:
SourceFileSelectionDialog.fileName.label=File Name:
SourceFileSelectionDialog.message.emptyList=No items.
SourceFileSelectionDialog.error.EnterFolderName=Folder name is empty.
SourceFileSelectionDialog.error.FolderDoesNotExist=Folder ''{0}'' does not exist.
SourceFileSelectionDialog.error.NotAFolder=''{0}'' must be a project or folder.
SourceFileSelectionDialog.error.NotASourceFolder=Folder ''{0}'' is not a valid source folder.
SourceFileSelectionDialog.error.ProjectClosed=Project ''{0}'' must be accessible.
SourceFileSelectionDialog.warning.NotACProject=Folder is not a C/C++ project.
SourceFileSelectionDialog.warning.NotInACProject=Folder is not in a C/C++ project.
SourceFileSelectionDialog.error.EnterFileName=File name is empty.
SourceFileSelectionDialog.error.NotAFile=''{0}'' is not a source file.
SourceFileSelectionDialog.error.NotASourceFile=''{0}'' is not a valid source file.
SourceFileSelectionDialog.warning.SourceFileExists=New class contents will be appended to existing file ''{0}''.
# -----------NewClassCodeGeneration -------------
NewClassCodeGeneration.createType.task=Creating type....
NewClassCodeGeneration.createFile.task=Creating

View file

@ -0,0 +1,566 @@
/*******************************************************************************
* 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.internal.ui.wizards.classwizard;
import java.util.ArrayList;
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.ICElementVisitor;
import org.eclipse.cdt.core.model.ICModel;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.internal.corext.util.CModelUtil;
import org.eclipse.cdt.internal.ui.dialogs.StatusInfo;
import org.eclipse.cdt.internal.ui.dialogs.StatusUtil;
import org.eclipse.cdt.internal.ui.wizards.TypedViewerFilter;
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.LayoutUtil;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.StringDialogField;
import org.eclipse.cdt.ui.CElementContentProvider;
import org.eclipse.cdt.ui.CElementLabelProvider;
import org.eclipse.cdt.ui.CElementSorter;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.dialogs.SelectionStatusDialog;
public class SourceFileSelectionDialog extends SelectionStatusDialog {
private TreeViewer fViewer;
private final ITreeContentProvider fContentProvider = new CElementContentProvider();
private final ILabelProvider fLabelProvider = new CElementLabelProvider(CElementLabelProvider.SHOW_DEFAULT);
private IStatus fCurrStatus = new StatusInfo();
private IStatus fFolderNameStatus = new StatusInfo();
private IStatus fFileNameStatus = new StatusInfo();
private ICElement fInput;
private int fWidth = 60;
private int fHeight = 18;
private StringDialogField fFolderNameDialogField;
private StringDialogField fFileNameDialogField;
private IWorkspaceRoot fWorkspaceRoot;
private final FieldsAdapter fFieldsAdapter = new FieldsAdapter();
private ICElement fCurrentFolder = null;
private String fCurrentFileString = null;
private String fInitialFolderName = null;
private String fInitialFileName = null;
private final class FieldsAdapter extends SelectionAdapter
implements ISelectionChangedListener, IDoubleClickListener, IDialogFieldListener {
// -- SelectionAdapter --
public void widgetDefaultSelected(SelectionEvent e) {
doStatusUpdate();
if (fCurrStatus.isOK())
buttonPressed(IDialogConstants.OK_ID);
}
// -- ISelectionChangedListener --
public void selectionChanged(SelectionChangedEvent event) {
setResult(((IStructuredSelection) event.getSelection()).toList());
ISelection sel = event.getSelection();
if (sel instanceof IStructuredSelection) {
Object obj = ((IStructuredSelection) sel).getFirstElement();
if (obj instanceof ICElement) {
ICElement elem = (ICElement) obj;
IPath path = elem.getPath();
String fileName = fFileNameDialogField.getText();
String folderName = fFolderNameDialogField.getText();
if (elem instanceof ICContainer || elem instanceof ICProject) {
folderName = path.toString();
} else {
folderName = path.removeLastSegments(1).toString();
fileName = path.lastSegment();
}
setPathFields(folderName, fileName);
}
}
doStatusUpdate();
}
// -- IDoubleClickListener --
public void doubleClick(DoubleClickEvent event) {
doStatusUpdate();
ISelection selection = event.getSelection();
if (selection instanceof IStructuredSelection) {
Object item = ((IStructuredSelection)selection).getFirstElement();
if (fCurrStatus.getSeverity() != IStatus.ERROR) {
if (item instanceof ITranslationUnit) {
setResult(((IStructuredSelection)selection).toList());
close();
return;
}
}
if (fViewer.getExpandedState(item))
fViewer.collapseToLevel(item, 1);
else
fViewer.expandToLevel(item, 1);
}
}
// -- IDialogFieldListener --
public void dialogFieldChanged(DialogField field) {
if (field == fFolderNameDialogField) {
fFolderNameStatus = folderNameChanged();
fFileNameStatus = fileNameChanged();
} else if (field == fFileNameDialogField) {
fFileNameStatus = fileNameChanged();
}
doStatusUpdate();
}
}
private static final Class[] FILTER_TYPES = new Class[] {
ICModel.class,
ICProject.class,
ICContainer.class,
ITranslationUnit.class
};
private final class Filter extends TypedViewerFilter {
private Filter() {
super(FILTER_TYPES);
}
public boolean select(Viewer viewer, Object parent, Object obj) {
if (obj instanceof ICElement) {
ICElement elem = (ICElement)obj;
if (!(fInput instanceof ICModel)) {
return elem.getCProject().equals(fInput.getCProject());
}
return true;
}
return super.select(viewer, parent, obj);
}
}
/**
* Constructs an instance of <code>ElementTreeSelectionDialog</code>.
*
* @param parent
* The parent shell for the dialog
* @param labelProvider
* the label provider to render the entries
* @param contentProvider
* the content provider to evaluate the tree structure
*/
public SourceFileSelectionDialog(Shell parent) {
super(parent);
fWorkspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
fInput = CoreModel.create(fWorkspaceRoot);
fFolderNameDialogField = new StringDialogField();
fFolderNameDialogField.setDialogFieldListener(fFieldsAdapter);
fFolderNameDialogField.setLabelText(NewClassWizardMessages.getString("SourceFileSelectionDialog.folderName.label")); //$NON-NLS-1$
fFileNameDialogField = new StringDialogField();
fFileNameDialogField.setDialogFieldListener(fFieldsAdapter);
fFileNameDialogField.setLabelText(NewClassWizardMessages.getString("SourceFileSelectionDialog.fileName.label")); //$NON-NLS-1$
setResult(new ArrayList(0));
setStatusLineAboveButtons(true);
int shellStyle = getShellStyle();
setShellStyle(shellStyle | SWT.MAX | SWT.RESIZE);
}
/**
* Sets the tree input.
*
* @param input
* the tree input.
*/
public void setInput(ICElement input) {
fInput = input;
}
protected void doStatusUpdate() {
// status of all used components
IStatus[] status = new IStatus[] {
fFolderNameStatus,
fFileNameStatus
};
// the mode severe status will be displayed and the ok button enabled/disabled.
updateStatus(status);
}
/**
* Updates the status line and the ok button according to the given status
*
* @param status status to apply
*/
protected void updateStatus(IStatus status) {
fCurrStatus = status;
super.updateStatus(status);
}
/**
* Updates the status line and the ok button according to the status evaluate from
* an array of status. The most severe error is taken. In case that two status with
* the same severity exists, the status with lower index is taken.
*
* @param status the array of status
*/
protected void updateStatus(IStatus[] status) {
updateStatus(StatusUtil.getMostSevere(status));
}
private IStatus folderNameChanged() {
StatusInfo status = new StatusInfo();
fCurrentFolder = null;
String str = fFolderNameDialogField.getText();
if (str.length() == 0) {
status.setError(NewClassWizardMessages.getString("SourceFileSelectionDialog.error.EnterFolderName")); //$NON-NLS-1$
return status;
}
IPath path = new Path(str);
IResource res = fWorkspaceRoot.findMember(path);
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("SourceFileSelectionDialog.error.NotAFolder", str)); //$NON-NLS-1$
return status;
}
ICElement e = CoreModel.getDefault().create(res.getFullPath());
fCurrentFolder = CModelUtil.getSourceFolder(e);
if (fCurrentFolder == null) {
status.setError(NewClassWizardMessages.getFormattedString("SourceFileSelectionDialog.error.NotASourceFolder", str)); //$NON-NLS-1$
return status;
}
if (!CoreModel.hasCCNature(proj) && !CoreModel.hasCNature(proj)) {
if (resType == IResource.PROJECT) {
status.setError(NewClassWizardMessages.getString("SourceFileSelectionDialog.warning.NotACProject")); //$NON-NLS-1$
return status;
} else {
status.setWarning(NewClassWizardMessages.getString("SourceFileSelectionDialog.warning.NotInACProject")); //$NON-NLS-1$
}
}
} else {
status.setError(NewClassWizardMessages.getFormattedString("SourceFileSelectionDialog.error.NotAFolder", str)); //$NON-NLS-1$
return status;
}
} else {
status.setError(NewClassWizardMessages.getFormattedString("SourceFileSelectionDialog.error.FolderDoesNotExist", str)); //$NON-NLS-1$
return status;
}
return status;
}
private IStatus fileNameChanged() {
StatusInfo status = new StatusInfo();
fCurrentFileString = null;
ICElement existingFile = null;
String str = fFileNameDialogField.getText();
if (str.length() == 0) {
status.setError(NewClassWizardMessages.getString("SourceFileSelectionDialog.error.EnterFileName")); //$NON-NLS-1$
return status;
}
if (fCurrentFolder != null) {
IPath folderPath = fCurrentFolder.getPath();
IPath path = new Path(str);
IResource res = fWorkspaceRoot.findMember(folderPath.append(path));
if (res == null)
res = fWorkspaceRoot.findMember(path);
if (res != null && res.exists()) {
int resType = res.getType();
if (resType == IResource.FILE) {
IProject proj = res.getProject();
if (!proj.isOpen()) {
status.setError(NewClassWizardMessages.getFormattedString("SourceFileSelectionDialog.error.NotAFile", str)); //$NON-NLS-1$
return status;
}
ICElement e = CoreModel.getDefault().create(res.getFullPath());
if (e instanceof ITranslationUnit) {
existingFile = (ITranslationUnit) e;
}
if (existingFile == null) {
status.setError(NewClassWizardMessages.getFormattedString("SourceFileSelectionDialog.error.NotASourceFile", str)); //$NON-NLS-1$
return status;
}
if (!CoreModel.hasCCNature(proj) && !CoreModel.hasCNature(proj)) {
status.setWarning(NewClassWizardMessages.getString("SourceFileSelectionDialog.warning.NotInACProject")); //$NON-NLS-1$
}
} else {
status.setError(NewClassWizardMessages.getFormattedString("SourceFileSelectionDialog.error.NotAFile", str)); //$NON-NLS-1$
return status;
}
}
}
if (existingFile != null) {
status.setWarning(NewClassWizardMessages.getFormattedString("SourceFileSelectionDialog.warning.SourceFileExists", str)); //$NON-NLS-1$
}
fCurrentFileString = str;
return status;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.window.Window#open()
*/
public int open() {
super.open();
return getReturnCode();
}
/**
* Handles cancel button pressed event.
*/
protected void cancelPressed() {
setResult(null);
super.cancelPressed();
}
/*
* @see SelectionStatusDialog#computeResult()
*/
protected void computeResult() {
setResult(((IStructuredSelection) fViewer.getSelection()).toList());
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.window.Window#create()
*/
public void create() {
BusyIndicator.showWhile(null, new Runnable() {
public void run() {
superCreate();
fViewer.setSelection(new StructuredSelection(getInitialElementSelections()), true);
setPathFields(fInitialFolderName, fInitialFileName);
fFileNameDialogField.setFocus();
doStatusUpdate();
}
});
}
private void superCreate() {
super.create();
}
/*
* @see Dialog#createDialogArea(Composite)
*/
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
// Label messageLabel = createMessageArea(composite);
int nColumns = 4;
fFolderNameDialogField.doFillIntoGrid(composite, nColumns - 1);
DialogField.createEmptySpace(composite);
LayoutUtil.setWidthHint(fFolderNameDialogField.getTextControl(null), getMaxFieldWidth());
TreeViewer treeViewer = createTreeViewer(composite);
GridData data = new GridData(GridData.FILL_BOTH);
data.widthHint = convertWidthInCharsToPixels(fWidth);
data.heightHint = convertHeightInCharsToPixels(fHeight);
Tree treeWidget = treeViewer.getTree();
treeWidget.setLayoutData(data);
treeWidget.setFont(parent.getFont());
fFileNameDialogField.doFillIntoGrid(composite, nColumns - 1);
DialogField.createEmptySpace(composite);
LayoutUtil.setWidthHint(fFileNameDialogField.getTextControl(null), getMaxFieldWidth());
return composite;
}
/**
* Returns the recommended maximum width for text fields (in pixels). This
* method requires that createContent has been called before this method is
* call. Subclasses may override to change the maximum width for text
* fields.
*
* @return the recommended maximum width for text fields.
*/
protected int getMaxFieldWidth() {
return convertWidthInCharsToPixels(60);
}
/**
* Creates the tree viewer.
*
* @param parent
* the parent composite
* @return the tree viewer
*/
protected TreeViewer createTreeViewer(Composite parent) {
int style = (SWT.BORDER | SWT.SINGLE);
fViewer = new TreeViewer(new Tree(parent, style));
fViewer.setContentProvider(fContentProvider);
fViewer.setLabelProvider(fLabelProvider);
fViewer.addSelectionChangedListener(fFieldsAdapter);
fViewer.setSorter(new CElementSorter());
fViewer.addFilter(new Filter());
Tree tree = fViewer.getTree();
tree.addSelectionListener(fFieldsAdapter);
fViewer.addDoubleClickListener(fFieldsAdapter);
fViewer.setInput(fInput.getCModel());
return fViewer;
}
/**
* Returns the tree viewer.
*
* @return the tree viewer
*/
protected TreeViewer getTreeViewer() {
return fViewer;
}
/**
* @see org.eclipse.jface.window.Window#handleShellCloseEvent()
*/
protected void handleShellCloseEvent() {
super.handleShellCloseEvent();
//Handle the closing of the shell by selecting the close icon
if (getReturnCode() == CANCEL)
setResult(null);
}
public String getFolderName() {
if (fCurrentFolder != null) {
return fCurrentFolder.getPath().toString();
}
return null;
}
public String getFileName() {
return fCurrentFileString;
}
public IPath getFilePath() {
IPath path = null;
if (fCurrentFolder != null) {
path = fCurrentFolder.getPath();
if (fCurrentFileString != null)
path = path.append(fCurrentFileString);
} else if (fCurrentFileString != null) {
path = new Path(fCurrentFileString);
}
return path;
}
private void setPathFields(String folderName, String fileName) {
fFolderNameDialogField.setTextWithoutUpdate(folderName != null ? folderName : ""); //$NON-NLS-1$
fFileNameDialogField.setTextWithoutUpdate(fileName != null ? fileName : ""); //$NON-NLS-1$
fFolderNameStatus = folderNameChanged();
fFileNameStatus = fileNameChanged();
}
/**
* Sets the initial selection. Convenience method.
*
* @param selection
* the initial selection.
*/
public void setInitialFields(String folderName, String fileName) {
fInitialFolderName = folderName;
fInitialFileName = fileName;
final IPath folderPath;
final IPath filePath;
if (folderName != null && folderName.length() > 0) {
folderPath = new Path(folderName);
} else {
folderPath = null;
}
if (folderPath != null && fileName != null && fileName.length() > 0) {
filePath = folderPath.append(fileName);
} else {
filePath = null;
}
if (fInput != null && folderPath != null) {
final ICElement[] foundElem = {/*base_folder*/ null, /*exact_folder*/ null, /*exact_file*/ null};
try {
fInput.accept(new ICElementVisitor() {
public boolean visit(ICElement elem) {
IPath path = elem.getPath();
if (path.isPrefixOf(folderPath)) {
if (foundElem[0] == null || path.segmentCount() > foundElem[0].getPath().segmentCount()) {
foundElem[0] = elem; /*base_folder*/
}
if (path.equals(folderPath)) {
foundElem[1] = elem; /*exact_folder*/
if (filePath == null)
return false; // no need to search children
} else if (filePath != null && path.equals(filePath)) {
foundElem[2] = elem; /*exact_file*/
return false; // no need to search children
}
return true;
}
return false;
}
});
ICElement selectedElement = foundElem[2]; /*exact_file*/
if (selectedElement == null)
selectedElement = foundElem[1]; /*exact_folder*/
if (selectedElement == null)
selectedElement = foundElem[0]; /*base_folder*/
if (selectedElement != null) {
setInitialSelections(new Object[] { selectedElement });
}
} catch (CoreException e) {
}
}
}
}