class creation wizard, implementation for dojo.
diff --git a/bundles/org.eclipse.wst.jsdt.web.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.jsdt.web.ui/META-INF/MANIFEST.MF index 99d245e..095e2f3 100644 --- a/bundles/org.eclipse.wst.jsdt.web.ui/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.wst.jsdt.web.ui/META-INF/MANIFEST.MF
@@ -47,3 +47,5 @@ org.eclipse.wst.jsdt.manipulation;bundle-version="[1.0.0,2.0.0)" Eclipse-LazyStart: true Bundle-RequiredExecutionEnvironment: J2SE-1.4 +Import-Package: org.eclipse.core.filesystem, + org.eclipse.ui.views.contentoutline
diff --git a/bundles/org.eclipse.wst.jsdt.web.ui/icons/eye_icon.gif b/bundles/org.eclipse.wst.jsdt.web.ui/icons/eye_icon.gif new file mode 100644 index 0000000..078398e --- /dev/null +++ b/bundles/org.eclipse.wst.jsdt.web.ui/icons/eye_icon.gif Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.web.ui/plugin.properties b/bundles/org.eclipse.wst.jsdt.web.ui/plugin.properties index fe0dbb7..5b067c8 100644 --- a/bundles/org.eclipse.wst.jsdt.web.ui/plugin.properties +++ b/bundles/org.eclipse.wst.jsdt.web.ui/plugin.properties
@@ -8,7 +8,8 @@ # Contributors: # IBM Corporation - initial API and implementation ############################################################################### - +wizard.name.0 = New Dojo Class +wizard.description.0 = Create a new Dojo JavaScript class Bundle-Vendor.0 = Eclipse.org Bundle-Name.0 = JSDT Web Support UI target.name.0 = JavaScirpt Source
diff --git a/bundles/org.eclipse.wst.jsdt.web.ui/plugin.xml b/bundles/org.eclipse.wst.jsdt.web.ui/plugin.xml index b7a3c36..c58ca51 100644 --- a/bundles/org.eclipse.wst.jsdt.web.ui/plugin.xml +++ b/bundles/org.eclipse.wst.jsdt.web.ui/plugin.xml
@@ -701,6 +701,21 @@ id="org.eclipse.wst.jsdt.internal.web.ui.convertProjects"> </action> </objectContribution> + </extension> + <extension + point="org.eclipse.ui.newWizards"> + <wizard + name="%wizard.name.0" + icon="/icons/eye_icon.gif" + category="org.eclipse.wst.jsdt.ui.java" + id="org.eclipse.wst.jsdt.ui.wizards.NewClassCreationWizard"> + <class class="org.eclipse.wst.jsdt.internal.ui.wizards.dojo.NewClassCreationWizard"> + <parameter name="javatype" value="true"/> + </class> + <description> + %wizard.description.0 + </description> + </wizard> </extension> <!-- Uncomment for Standalone + HTML as seperate options --> <!--
diff --git a/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/internal/ui/wizards/dojo/NewClassCreationWizard.java b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/internal/ui/wizards/dojo/NewClassCreationWizard.java new file mode 100644 index 0000000..046e3f5 --- /dev/null +++ b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/internal/ui/wizards/dojo/NewClassCreationWizard.java
@@ -0,0 +1,88 @@ +package org.eclipse.wst.jsdt.internal.ui.wizards.dojo; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.wst.jsdt.core.IJavaScriptElement; +import org.eclipse.wst.jsdt.internal.ui.JavaScriptPlugin; +import org.eclipse.wst.jsdt.internal.ui.JavaPluginImages; +import org.eclipse.wst.jsdt.internal.ui.wizards.NewElementWizard; + +public class NewClassCreationWizard extends NewElementWizard { + + private NewClassWizardPage fPage; + private boolean fOpenEditorOnFinish; + + public NewClassCreationWizard() { + setDefaultPageImageDescriptor(JavaPluginImages.DESC_WIZBAN_NEWCLASS); + setDialogSettings(JavaScriptPlugin.getDefault().getDialogSettings()); + setWindowTitle("New Dojo Class"); + + fPage = null; + fOpenEditorOnFinish = true; + + } + + /* + * @see Wizard#createPages + */ + public void addPages() { + super.addPages(); + if (fPage == null) { + fPage = new NewClassWizardPage(); + fPage.init(getSelection()); + fPage.setWizard(this); + } + addPage(fPage); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.wst.jsdt.internal.ui.wizards.NewElementWizard#canRunForked() + */ + protected boolean canRunForked() { + return !fPage.isEnclosingTypeSelected(); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.wst.jsdt.internal.ui.wizards.NewElementWizard#finishPage(org.eclipse.core.runtime.IProgressMonitor) + */ + protected void finishPage(IProgressMonitor monitor) + throws InterruptedException, CoreException { + fPage.createType(monitor); // use the full progress monitor + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.wizard.IWizard#performFinish() + */ + public boolean performFinish() { + warnAboutTypeCommentDeprecation(); + boolean res = super.performFinish(); + if (res) { + IResource resource = fPage.getModifiedResource(); + if (resource != null) { + selectAndReveal(resource); + if (fOpenEditorOnFinish) { + openResource((IFile) resource); + } + } + } + return res; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.wst.jsdt.internal.ui.wizards.NewElementWizard#getCreatedElement() + */ + public IJavaScriptElement getCreatedElement() { + return fPage.getCreatedType(); + } + +}
diff --git a/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/internal/ui/wizards/dojo/NewClassWizardPage.java b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/internal/ui/wizards/dojo/NewClassWizardPage.java new file mode 100644 index 0000000..87b1136 --- /dev/null +++ b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/internal/ui/wizards/dojo/NewClassWizardPage.java
@@ -0,0 +1,504 @@ +/******************************************************************************* + * Copyright (c) 2008 IBM Corporation and others. + * All rights reserved. + *******************************************************************************/ +package org.eclipse.wst.jsdt.internal.ui.wizards.dojo; + +import java.io.ByteArrayInputStream; +import java.io.IOException; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogSettings; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.ui.PlatformUI; +import org.eclipse.wst.jsdt.core.IJavaScriptProject; +import org.eclipse.wst.jsdt.core.IJavaScriptUnit; +import org.eclipse.wst.jsdt.internal.ui.IJavaHelpContextIds; +import org.eclipse.wst.jsdt.internal.ui.wizards.NewWizardMessages; +import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.DialogField; +import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.LayoutUtil; +import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.SelectionButtonDialogFieldGroup; +import org.eclipse.wst.jsdt.web.core.javascript.IJsTranslation; +import org.eclipse.wst.jsdt.web.core.javascript.JsTranslationAdapter; +import org.eclipse.wst.jsdt.web.core.javascript.JsTranslationAdapterFactory; +import org.eclipse.wst.sse.core.StructuredModelManager; +import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel; +import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument; +import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; + + +/** + * Wizard page to create a new class. + * <p> + * Note: This class is not intended to be subclassed, but clients can + * instantiate. To implement a different kind of a new class wizard page, extend + * <code>NewTypeWizardPage</code>. + * </p> + * + * @since 2.0 + */ +public class NewClassWizardPage extends NewTypeWizardPage { + + private final static String PAGE_NAME = "NewClassWizardPage"; //$NON-NLS-1$ + + private final static String SETTINGS_CREATEMAIN = "create_main"; //$NON-NLS-1$ + private final static String SETTINGS_CREATECONSTR = "create_constructor"; //$NON-NLS-1$ + private final static String SETTINGS_CREATEUNIMPLEMENTED = "create_unimplemented"; //$NON-NLS-1$ + + private SelectionButtonDialogFieldGroup fMethodStubsButtons; + + /** + * Creates a new <code>NewClassWizardPage</code> + */ + public NewClassWizardPage() { + super(true, PAGE_NAME); + + setTitle("Dojo Class"); + setDescription("Create a new Dojo Class"); + + // String[] buttonNames3= new String[] { + // NewWizardMessages.NewClassWizardPage_methods_main, + // NewWizardMessages.NewClassWizardPage_methods_constructors, + // NewWizardMessages.NewClassWizardPage_methods_inherited + // }; + String[] buttonNames3 = new String[] { "initializer", "statics" }; + fMethodStubsButtons = new SelectionButtonDialogFieldGroup(SWT.CHECK, + buttonNames3, 1); + fMethodStubsButtons + .setLabelText(NewWizardMessages.NewClassWizardPage_methods_label); + } + + // -------- Initialization --------- + + /** + * The wizard owning this page is responsible for calling this method with + * the current selection. The selection is used to initialize the fields of + * the wizard page. + * + * @param selection + * used to initialize the fields + */ + public void init(IStructuredSelection selection) { + getInitialJavaElement(selection); + // initContainerPage(jelem.getJavaProject()); + initContainerPage(selection); + initTypePage(selection); + doStatusUpdate(); + + boolean createMain = false; + boolean createConstructors = false; + boolean createUnimplemented = true; + IDialogSettings dialogSettings = getDialogSettings(); + if (dialogSettings != null) { + IDialogSettings section = dialogSettings.getSection(PAGE_NAME); + if (section != null) { + createMain = section.getBoolean(SETTINGS_CREATEMAIN); + createConstructors = section.getBoolean(SETTINGS_CREATECONSTR); + createUnimplemented = section + .getBoolean(SETTINGS_CREATEUNIMPLEMENTED); + } + } + + setMethodStubSelection(createMain, createConstructors, + createUnimplemented, true); + } + + // ------ validation -------- + protected void doStatusUpdate() { + // status of all used components + // IStatus[] status= new IStatus[] { + // fContainerStatus, + // isEnclosingTypeSelected() ? fEnclosingTypeStatus : fPackageStatus, + // fTypeNameStatus, + // fModifierStatus, + // fSuperClassStatus, + // fSuperInterfacesStatus + // }; + + // the mode severe status will be displayed and the OK button + // enabled/disabled. + String newFileName = getNewFileName(); + + String existingFileName = getExistingFileName(); + getFolderName(); + String className = getTypeName(); + getJavaProject(); + getExtends(); + boolean shouldUseExisting = shouldUseExisting(); + isCreateInit(); + isCreateStatic(); + + if (className == null || className.equals("")) { + updateStatus(new Status(IStatus.ERROR, "com.ibm.jsdt.dojo.core", + "Missing Class Name")); + } else if ((!shouldUseExisting) + && (newFileName == null || newFileName.equals(""))) { + updateStatus(new Status(IStatus.ERROR, "com.ibm.jsdt.dojo.core", + "No File Specified for new Class")); + + } else if ((shouldUseExisting) + && (existingFileName == null || existingFileName.equals(""))) { + updateStatus(new Status(IStatus.ERROR, "com.ibm.jsdt.dojo.core", + "No File Specified for new Class")); + } else { + + updateStatus(new Status(IStatus.OK, "com.ibm.jsdt.dojo.core", "")); + } + } + + /* + * @see NewContainerWizardPage#handleFieldChanged + */ + protected void handleFieldChanged(String fieldName) { + super.handleFieldChanged(fieldName); + + doStatusUpdate(); + } + + // ------ UI -------- + + /* + * @see WizardPage#createControl + */ + public void createControl(Composite parent) { + initializeDialogUnits(parent); + + Composite composite = new Composite(parent, SWT.NONE); + composite.setFont(parent.getFont()); + + int nColumns = 4; + + GridLayout layout = new GridLayout(); + layout.numColumns = nColumns; + composite.setLayout(layout); + + // pick & choose the wanted UI components + + createContainerControls(composite, nColumns); + createPackageControls(composite, nColumns); + createEnclosingTypeControls(composite, nColumns); + + createSeparator(composite, nColumns); + + createTypeNameControls(composite, nColumns); + // createModifierControls(composite, nColumns); + + // createSuperClassControls(composite, nColumns); + createSuperInterfacesControls(composite, nColumns); + + createMethodStubSelectionControls(composite, nColumns); + + // createCommentControls(composite, nColumns); + // enableCommentControl(true); + + setControl(composite); + + Dialog.applyDialogFont(composite); + PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, + IJavaHelpContextIds.NEW_CLASS_WIZARD_PAGE); + } + + /* + * @see WizardPage#becomesVisible + */ + public void setVisible(boolean visible) { + super.setVisible(visible); + if (visible) { + setFocus(); + } else { + IDialogSettings dialogSettings = getDialogSettings(); + if (dialogSettings != null) { + IDialogSettings section = dialogSettings.getSection(PAGE_NAME); + if (section == null) { + section = dialogSettings.addNewSection(PAGE_NAME); + } + section.put(SETTINGS_CREATEMAIN, isCreateInit()); + section.put(SETTINGS_CREATECONSTR, isCreateStatic()); + + } + } + } + + private void createMethodStubSelectionControls(Composite composite, + int nColumns) { + Control labelControl = fMethodStubsButtons.getLabelControl(composite); + LayoutUtil.setHorizontalSpan(labelControl, nColumns); + + DialogField.createEmptySpace(composite); + + Control buttonGroup = fMethodStubsButtons + .getSelectionButtonsGroup(composite); + LayoutUtil.setHorizontalSpan(buttonGroup, nColumns - 1); + } + + /** + * Returns the current selection state of the 'Create Main' checkbox. + * + * @return the selection state of the 'Create Main' checkbox + */ + public boolean isCreateStatic() { + return fMethodStubsButtons.isSelected(1); + } + + /** + * Returns the current selection state of the 'Create Constructors' + * checkbox. + * + * @return the selection state of the 'Create Constructors' checkbox + */ + public boolean isCreateInit() { + return fMethodStubsButtons.isSelected(0); + } + + /** + * Sets the selection state of the method stub checkboxes. + * + * @param createMain + * initial selection state of the 'Create Main' checkbox. + * @param createConstructors + * initial selection state of the 'Create Constructors' checkbox. + * @param createInherited + * initial selection state of the 'Create inherited abstract + * methods' checkbox. + * @param canBeModified + * if <code>true</code> the method stub checkboxes can be + * changed by the user. If <code>false</code> the buttons are + * "read-only" + */ + public void setMethodStubSelection(boolean createMain, + boolean createConstructors, boolean createInherited, + boolean canBeModified) { + fMethodStubsButtons.setSelection(0, createMain); + fMethodStubsButtons.setSelection(1, createConstructors); + fMethodStubsButtons.setSelection(2, createInherited); + + fMethodStubsButtons.setEnabled(canBeModified); + } + + // // ---- creation ---------------- + // + // /* + // * @see NewTypeWizardPage#createTypeMembers + // */ + // protected void createTypeMembers(IType type, ImportsManager imports, + // IProgressMonitor monitor) throws CoreException { + // boolean doMain= isCreateMain(); + // boolean doConstr= isCreateConstructors(); + // boolean doInherited= isCreateInherited(); + // createInheritedMethods(type, doConstr, doInherited, imports, new + // SubProgressMonitor(monitor, 1)); + // + // if (doMain) { + // StringBuffer buf= new StringBuffer(); + // final String lineDelim= "\n"; // OK, since content is formatted afterwards + // //$NON-NLS-1$ + // String comment= CodeGeneration.getMethodComment(type.getCompilationUnit(), + // type.getTypeQualifiedName('.'), "main", new String[] {"args"}, new String[0], + // Signature.createTypeSignature("void", true), null, lineDelim); //$NON-NLS-1$ + // //$NON-NLS-2$ //$NON-NLS-3$ + // if (comment != null) { + // buf.append(comment); + // buf.append(lineDelim); + // } + // buf.append("public static void main("); //$NON-NLS-1$ + // buf.append(imports.addImport("java.lang.String")); //$NON-NLS-1$ + // buf.append("[] args) {"); //$NON-NLS-1$ + // buf.append(lineDelim); + // final String content= + // CodeGeneration.getMethodBodyContent(type.getCompilationUnit(), + // type.getTypeQualifiedName('.'), "main", false, "", lineDelim); //$NON-NLS-1$ + // //$NON-NLS-2$ + // if (content != null && content.length() != 0) + // buf.append(content); + // buf.append(lineDelim); + // buf.append("}"); //$NON-NLS-1$ + // type.createMethod(buf.toString(), null, false, null); + // } + // + // if (monitor != null) { + // monitor.done(); + // } + // } + public void createType(IProgressMonitor monitor) throws CoreException, + InterruptedException { + if (monitor == null) { + monitor = new NullProgressMonitor(); + } + + monitor.beginTask("Create Dojo Class...", 8); + + String newFileName = getNewFileName(); + String existingFileName = getExistingFileName(); + String newPath = getFolderName(); + String className = getTypeName(); + IJavaScriptProject project = getJavaProject(); + String[] extendedClasses = getExtends(); + boolean shouldUseExisting = shouldUseExisting(); + boolean shouldCreateInit = isCreateInit(); + boolean shouldCreateStatic = isCreateStatic(); + // boolean shouldGenerateComments = isAddComments(); + String typeText1 = ""; + String typeText2 = ""; + String typeText3 = ""; + String typeText4 = ""; + String typeText5 = ""; + + typeText1 = "dojo.declare(\"" + className + "\""; + + /* Build the mixins in the typeText2 string */ + if (extendedClasses != null && extendedClasses.length > 0) { + typeText1 += ","; + } + + if (extendedClasses != null && extendedClasses.length > 1) { + typeText2 += "["; + } + for (int i = 0; extendedClasses != null && i < extendedClasses.length; i++) { + typeText2 += extendedClasses[i]; + if (i < extendedClasses.length - 1) + typeText2 += ","; + } + if (extendedClasses != null && extendedClasses.length > 1) { + typeText2 += "]"; + } + + /* Start the class body */ + + typeText3 += ",{\n\t/* Class Body */\n\n"; + + if (shouldCreateInit) { + typeText4 += "\tinitializer: function() {\n\t/* Class Initializer */\n\n\t}"; + + } + + if (shouldCreateInit && shouldCreateStatic) { + typeText4 += ","; + } + + if (shouldCreateStatic) { + typeText4 += "\n\tstatics: {\n\t\t /* declare static variables and functions here */\n\n\t}\n"; + + } + + typeText5 += "});"; + + String typeText = typeText1 + typeText2 + typeText3 + typeText4 + + typeText5; + + if (shouldUseExisting) { + + String fileExtension = (new Path(existingFileName)) + .getFileExtension(); + + if (fileExtension != null && fileExtension.equalsIgnoreCase(".js")) { + + if (existingFileName.length() > 0 + && existingFileName.charAt(0) == '/' + || existingFileName.charAt(0) == '\\') { + existingFileName = existingFileName.substring(1); + } + /* Create type in an existing file */ + IJavaScriptUnit jElm = (IJavaScriptUnit) project + .findElement(new Path(existingFileName)); + + if (jElm == null) + return; + + jElm.becomeWorkingCopy(monitor); + jElm.getBuffer().append(typeText); + jElm.commitWorkingCopy(true, monitor); + jElm.discardWorkingCopy(); + } else if (fileExtension != null + && (fileExtension.equalsIgnoreCase("html") + || fileExtension.equalsIgnoreCase("htm") || fileExtension + .equalsIgnoreCase("jsp"))) { + /* handle dojo class creation in an html file */ + IFile toHtml = project.getProject().getFile(existingFileName); + insertInThml(toHtml, typeText); + + } + } else { + /* Create the type in a new file */ + IPath newFilePath = new Path(newPath + "/" + newFileName); + IFile theFile = project.getProject().getFile(newFilePath); + + String fileExtension = theFile.getFileExtension(); + + if (fileExtension != null + && (fileExtension.equalsIgnoreCase("html") + || fileExtension.equalsIgnoreCase("htm") || fileExtension + .equalsIgnoreCase("jsp"))) { + /* a little special casing for HTML/JSP */ + typeText = "<html>\n<head>\n<script>\n" + typeText + + "\n</script>\n</head>\n</html>"; + + } + ByteArrayInputStream str = new ByteArrayInputStream(typeText + .getBytes()); + theFile.create(str, true, monitor); + + } + + } + + private void insertInThml(IFile htmlFile, String text) { + boolean existing = true; + IDOMModel xmlModel = null; + try { + xmlModel = (IDOMModel) StructuredModelManager.getModelManager() + .getExistingModelForEdit(htmlFile); + if (xmlModel == null) { + try { + existing = false; + xmlModel = (IDOMModel) StructuredModelManager + .getModelManager().getModelForEdit(htmlFile); + } catch (IOException ex) { + // TODO Auto-generated catch block + ex.printStackTrace(); + } catch (CoreException ex) { + // TODO Auto-generated catch block + ex.printStackTrace(); + } + } + if (!existing) + JsTranslationAdapterFactory.setupAdapterFactory(xmlModel); + IDOMDocument xmlDoc = xmlModel.getDocument(); + + JsTranslationAdapter fTranslationAdapter = (JsTranslationAdapter) xmlDoc + .getAdapterFor(IJsTranslation.class); + if (fTranslationAdapter != null) { + IJsTranslation translation = fTranslationAdapter + .getJSPTranslation(false); + translation.insertInFirstScriptRegion(text); + + } + if (!existing) + removeAdapterFactory(xmlModel); + } finally { + if (xmlModel != null) + xmlModel.releaseFromEdit(); + + } + + } + + + + private void removeAdapterFactory(IStructuredModel sm) { + if (sm.getFactoryRegistry().getFactoryFor(IJsTranslation.class) != null) { + sm.getFactoryRegistry().removeFactoriesFor(IJsTranslation.class); + } + } +}
diff --git a/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/internal/ui/wizards/dojo/NewContainerWizardPage.java b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/internal/ui/wizards/dojo/NewContainerWizardPage.java new file mode 100644 index 0000000..450ae20 --- /dev/null +++ b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/internal/ui/wizards/dojo/NewContainerWizardPage.java
@@ -0,0 +1,235 @@ +/******************************************************************************* + * Copyright (c) 2008 IBM Corporation and others. + * All rights reserved. + *******************************************************************************/ +package org.eclipse.wst.jsdt.internal.ui.wizards.dojo; + +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IWorkspaceRoot; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.views.contentoutline.ContentOutline; +import org.eclipse.wst.jsdt.core.IJavaScriptElement; +import org.eclipse.wst.jsdt.core.IJavaScriptProject; +import org.eclipse.wst.jsdt.core.JavaScriptCore; +import org.eclipse.wst.jsdt.core.JavaScriptModelException; +import org.eclipse.wst.jsdt.internal.ui.JavaScriptPlugin; +import org.eclipse.wst.jsdt.internal.ui.viewsupport.IViewPartInputProvider; +import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.DialogField; +import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.IDialogFieldListener; +import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.LayoutUtil; +import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.StringDialogField; +import org.eclipse.wst.jsdt.ui.wizards.NewElementWizardPage; + +/** + * Wizard page that acts as a base class for wizard pages that create new Java + * elements. The class provides a input field for source folders (called + * container in this class) and API to validate the enter source folder name. + * + * <p> + * Clients may subclass. + * </p> + * + * @since 2.0 + */ +public abstract class NewContainerWizardPage extends NewElementWizardPage { + + /** Id of the container field */ + protected static final String CONTAINER = "NewContainerWizardPage.container"; //$NON-NLS-1$ + + /** The status of the last validation. */ + protected IStatus fContainerStatus; + + private StringDialogField fNewFileName; + + private IJavaScriptProject fJavaProject; + + private IWorkspaceRoot fWorkspaceRoot; + + /** + * Create a new <code>NewContainerWizardPage</code> + * + * @param name + * the wizard page's name + */ + public NewContainerWizardPage(String name) { + super(name); + fWorkspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); + fNewFileName = new StringDialogField();// new + // StringButtonDialogField(adapter); + fNewFileName.setLabelText("New File Name"); + fNewFileName.setDialogFieldListener(new IDialogFieldListener() { + + public void dialogFieldChanged(DialogField field) { + doStatusUpdate(); + + } + + }); + // fContainerDialogField.setButtonLabel("Br&owse"); + + // fContainerStatus= new StatusInfo(); + // fCurrRoot= null; + } + + protected void doStatusUpdate() { + + } + + protected void shouldDisableFolderSelection(boolean enabled) { + fNewFileName.setEnabled(enabled); + } + + /** + * Initializes the source folder field with a valid package fragment root. + * The package fragment root is computed from the given Java element. + * + * @param elem + * the Java element used to compute the initial package fragment + * root used as the source folder + */ + + protected void initContainerPage(IStructuredSelection selection) { + IJavaScriptElement initialElement = getInitialJavaElement(selection); + + fJavaProject = initialElement != null ? initialElement.getJavaScriptProject() + : null; + fNewFileName.setEnabled(true); + fNewFileName.setFocus(); + } + + /** + * Utility method to inspect a selection to find a Java element. + * + * @param selection + * the selection to be inspected + * @return a Java element to be used as the initial selection, or + * <code>null</code>, if no Java element exists in the given + * selection + */ + protected IJavaScriptElement getInitialJavaElement(IStructuredSelection selection) { + IJavaScriptElement jelem = null; + if (selection != null && !selection.isEmpty()) { + Object selectedElement = selection.getFirstElement(); + if (selectedElement instanceof IAdaptable) { + IAdaptable adaptable = (IAdaptable) selectedElement; + + jelem = (IJavaScriptElement) adaptable.getAdapter(IJavaScriptElement.class); + if (jelem == null) { + IResource resource = (IResource) adaptable + .getAdapter(IResource.class); + if (resource != null + && resource.getType() != IResource.ROOT) { + while (jelem == null + && resource.getType() != IResource.PROJECT) { + resource = resource.getParent(); + jelem = (IJavaScriptElement) resource + .getAdapter(IJavaScriptElement.class); + } + if (jelem == null) { + jelem = JavaScriptCore.create(resource); // java project + } + } + } + } + } + if (jelem == null) { + IWorkbenchPart part = JavaScriptPlugin.getActivePage().getActivePart(); + if (part instanceof ContentOutline) { + part = JavaScriptPlugin.getActivePage().getActiveEditor(); + } + + if (part instanceof IViewPartInputProvider) { + Object elem = ((IViewPartInputProvider) part) + .getViewPartInput(); + if (elem instanceof IJavaScriptElement) { + jelem = (IJavaScriptElement) elem; + } + } + } + + if (jelem == null || jelem.getElementType() == IJavaScriptElement.JAVASCRIPT_MODEL) { + try { + IJavaScriptProject[] projects = JavaScriptCore.create(getWorkspaceRoot()) + .getJavaScriptProjects(); + if (projects.length == 1) { + jelem = projects[0]; + } + } catch (JavaScriptModelException e) { + JavaScriptPlugin.log(e); + } + } + return jelem; + } + + /** + * 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(40); + } + + /** + * Creates the necessary controls (label, text field and browse button) to + * edit the source folder location. The method expects that the parent + * composite uses a <code>GridLayout</code> as its layout manager and that + * the grid layout has at least 3 columns. + * + * @param parent + * the parent composite + * @param nColumns + * the number of columns to span. This number must be greater or + * equal three + */ + protected void createContainerControls(Composite parent, int nColumns) { + fNewFileName.doFillIntoGrid(parent, nColumns); + LayoutUtil.setWidthHint(fNewFileName.getTextControl(null), + getMaxFieldWidth()); + + } + + /** + * Sets the focus to the source folder's text field. + */ + protected void setFocusOnContainer() { + fNewFileName.setFocus(); + } + + /** + * Returns the workspace root. + * + * @return the workspace root + */ + protected IWorkspaceRoot getWorkspaceRoot() { + return fWorkspaceRoot; + } + + /** + * Returns the Java project of the currently selected package fragment root + * or <code>null</code> if no package fragment root is configured. + * + * @return The current Java project or <code>null</code>. + * @since 3.3 + */ + public IJavaScriptProject getJavaProject() { + return fJavaProject; + } + + public void setJavaProject(IJavaScriptProject project) { + fJavaProject = project; + } + + protected String getNewFileName() { + return fNewFileName.getText(); + } + +}
diff --git a/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/internal/ui/wizards/dojo/NewTypeWizardPage.java b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/internal/ui/wizards/dojo/NewTypeWizardPage.java new file mode 100644 index 0000000..5a4bbaf --- /dev/null +++ b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/internal/ui/wizards/dojo/NewTypeWizardPage.java
@@ -0,0 +1,2567 @@ +/******************************************************************************* + * Copyright (c) 2008 IBM Corporation and others. + * All rights reserved. + * + *******************************************************************************/ +package org.eclipse.wst.jsdt.internal.ui.wizards.dojo; + +import java.lang.reflect.InvocationTargetException; +import java.net.URI; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + + +import org.eclipse.core.filesystem.EFS; +import org.eclipse.core.filesystem.IFileStore; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IFolder; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.SubProgressMonitor; +import org.eclipse.jface.contentassist.SubjectControlContentAssistant; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.preference.PreferenceDialog; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.templates.Template; +import org.eclipse.jface.text.templates.TemplateException; +import org.eclipse.jface.viewers.CellEditor; +import org.eclipse.jface.viewers.ICellModifier; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.ViewerFilter; +import org.eclipse.jface.window.Window; +import org.eclipse.swt.SWT; +import org.eclipse.swt.accessibility.AccessibleAdapter; +import org.eclipse.swt.accessibility.AccessibleEvent; +import org.eclipse.swt.events.KeyAdapter; +import org.eclipse.swt.events.KeyEvent; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Item; +import org.eclipse.swt.widgets.Link; +import org.eclipse.swt.widgets.Text; +import org.eclipse.text.edits.TextEdit; +import org.eclipse.ui.contentassist.ContentAssistHandler; +import org.eclipse.ui.dialogs.ISelectionStatusValidator; +import org.eclipse.ui.dialogs.PreferencesUtil; +import org.eclipse.ui.model.WorkbenchContentProvider; +import org.eclipse.ui.model.WorkbenchLabelProvider; +import org.eclipse.wst.jsdt.core.Flags; +import org.eclipse.wst.jsdt.core.IJavaScriptUnit; +import org.eclipse.wst.jsdt.core.IJavaScriptElement; +import org.eclipse.wst.jsdt.core.IJavaScriptProject; +import org.eclipse.wst.jsdt.core.IFunction; +import org.eclipse.wst.jsdt.core.IPackageFragment; +import org.eclipse.wst.jsdt.core.IType; +import org.eclipse.wst.jsdt.core.JavaScriptConventions; +import org.eclipse.wst.jsdt.core.JavaScriptCore; +import org.eclipse.wst.jsdt.core.compiler.IProblem; +import org.eclipse.wst.jsdt.core.dom.AST; +import org.eclipse.wst.jsdt.core.dom.ASTParser; +import org.eclipse.wst.jsdt.core.dom.JavaScriptUnit; +import org.eclipse.wst.jsdt.core.dom.ITypeBinding; +import org.eclipse.wst.jsdt.core.dom.rewrite.ImportRewrite; +import org.eclipse.wst.jsdt.core.search.IJavaScriptSearchConstants; +import org.eclipse.wst.jsdt.core.search.IJavaScriptSearchScope; +import org.eclipse.wst.jsdt.core.search.SearchEngine; +import org.eclipse.wst.jsdt.internal.corext.codemanipulation.AddUnimplementedConstructorsOperation; +import org.eclipse.wst.jsdt.internal.corext.codemanipulation.AddUnimplementedMethodsOperation; +import org.eclipse.wst.jsdt.internal.corext.dom.ASTNodes; +import org.eclipse.wst.jsdt.internal.corext.refactoring.StubTypeContext; +import org.eclipse.wst.jsdt.internal.corext.refactoring.TypeContextChecker; +import org.eclipse.wst.jsdt.internal.corext.template.java.JavaContext; +import org.eclipse.wst.jsdt.internal.corext.util.JavaModelUtil; +import org.eclipse.wst.jsdt.internal.corext.util.Messages; +import org.eclipse.wst.jsdt.internal.corext.util.Resources; +import org.eclipse.wst.jsdt.internal.ui.JavaScriptPlugin; +import org.eclipse.wst.jsdt.internal.ui.JavaPluginImages; +import org.eclipse.wst.jsdt.internal.ui.dialogs.FilteredTypesSelectionDialog; +import org.eclipse.wst.jsdt.internal.ui.dialogs.StatusInfo; +import org.eclipse.wst.jsdt.internal.ui.dialogs.TableTextCellEditor; +import org.eclipse.wst.jsdt.internal.ui.dialogs.TextFieldNavigationHandler; +import org.eclipse.wst.jsdt.internal.ui.preferences.CodeTemplatePreferencePage; +import org.eclipse.wst.jsdt.internal.ui.preferences.JavaPreferencesSettings; +import org.eclipse.wst.jsdt.internal.ui.refactoring.contentassist.CompletionContextRequestor; +import org.eclipse.wst.jsdt.internal.ui.refactoring.contentassist.ControlContentAssistHelper; +import org.eclipse.wst.jsdt.internal.ui.refactoring.contentassist.JavaPackageCompletionProcessor; +import org.eclipse.wst.jsdt.internal.ui.refactoring.contentassist.JavaTypeCompletionProcessor; +import org.eclipse.wst.jsdt.internal.ui.util.SWTUtil; +import org.eclipse.wst.jsdt.internal.ui.wizards.NewWizardMessages; +import org.eclipse.wst.jsdt.internal.ui.wizards.TypedViewerFilter; +import org.eclipse.wst.jsdt.internal.ui.wizards.buildpaths.FolderSelectionDialog; +import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.DialogField; +import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.IDialogFieldListener; +import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.IListAdapter; +import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.IStringButtonAdapter; +import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.LayoutUtil; +import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.ListDialogField; +import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.SelectionButtonDialogField; +import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.SelectionButtonDialogFieldGroup; +import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.Separator; +import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.StringButtonDialogField; +import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.StringButtonStatusDialogField; +import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.StringDialogField; +import org.eclipse.wst.jsdt.ui.CodeStyleConfiguration; +import org.eclipse.wst.jsdt.ui.wizards.NewInterfaceWizardPage; + +/** + * The class <code>NewTypeWizardPage</code> contains controls and validation + * routines for a 'New Type WizardPage'. Implementors decide which components to + * add and to enable. Implementors can also customize the validation code. + * <code>NewTypeWizardPage</code> is intended to serve as base class of all + * wizards that create types like applets, servlets, classes, interfaces, etc. + * <p> + * See {@link NewClassWizardPage} or {@link NewInterfaceWizardPage} for an + * example usage of the <code>NewTypeWizardPage</code>. + * </p> + * + * @see org.eclipse.wst.jsdt.ui.wizards.NewClassWizardPage + * @see org.eclipse.wst.jsdt.ui.wizards.NewInterfaceWizardPage + * @see org.eclipse.wst.jsdt.ui.wizards.NewEnumWizardPage + * @see org.eclipse.wst.jsdt.ui.wizards.NewAnnotationWizardPage + * + * @since 2.0 + */ +public abstract class NewTypeWizardPage extends NewContainerWizardPage { + + /** + * Class used in stub creation routines to add needed imports to a + * compilation unit. + */ + public static class ImportsManager { + + private ImportRewrite fImportsRewrite; + + /* package */ImportsManager(JavaScriptUnit astRoot) + throws CoreException { + fImportsRewrite = CodeStyleConfiguration.createImportRewrite( + astRoot, true); + } + + /* package */IJavaScriptUnit getCompilationUnit() { + return fImportsRewrite.getCompilationUnit(); + } + + /** + * Adds a new import declaration that is sorted in the existing imports. + * If an import already exists or the import would conflict with an + * import of an other type with the same simple name, the import is not + * added. + * + * @param qualifiedTypeName + * The fully qualified name of the type to import (dot + * separated). + * @return Returns the simple type name that can be used in the code or + * the fully qualified type name if an import conflict prevented + * the import. + */ + public String addImport(String qualifiedTypeName) { + return fImportsRewrite.addImport(qualifiedTypeName); + } + + /** + * Adds a new import declaration that is sorted in the existing imports. + * If an import already exists or the import would conflict with an + * import of an other type with the same simple name, the import is not + * added. + * + * @param typeBinding + * the binding of the type to import + * + * @return Returns the simple type name that can be used in the code or + * the fully qualified type name if an import conflict prevented + * the import. + */ + public String addImport(ITypeBinding typeBinding) { + return fImportsRewrite.addImport(typeBinding); + } + + /** + * Adds a new import declaration for a static type that is sorted in the + * existing imports. If an import already exists or the import would + * conflict with an import of an other static import with the same + * simple name, the import is not added. + * + * @param declaringTypeName + * The qualified name of the static's member declaring type + * @param simpleName + * the simple name of the member; either a field or a method + * name. + * @param isField + * <code>true</code> specifies that the member is a field, + * <code>false</code> if it is a method. + * @return returns either the simple member name if the import was + * successful or else the qualified name if an import conflict + * prevented the import. + * + * @since 3.2 + */ + public String addStaticImport(String declaringTypeName, + String simpleName, boolean isField) { + return fImportsRewrite.addStaticImport(declaringTypeName, + simpleName, isField); + } + + /* package */void create(boolean needsSave, IProgressMonitor monitor) + throws CoreException { + TextEdit edit = fImportsRewrite.rewriteImports(monitor); + JavaModelUtil.applyEdit(fImportsRewrite.getCompilationUnit(), edit, + needsSave, null); + } + + /* package */void removeImport(String qualifiedName) { + fImportsRewrite.removeImport(qualifiedName); + } + + /* package */void removeStaticImport(String qualifiedName) { + fImportsRewrite.removeStaticImport(qualifiedName); + } + } + + /** + * Public access flag. See The Java Virtual Machine Specification for more + * details. + */ + public int F_PUBLIC = Flags.AccPublic; + /** + * Private access flag. See The Java Virtual Machine Specification for more + * details. + */ + public int F_PRIVATE = Flags.AccPrivate; + /** + * Protected access flag. See The Java Virtual Machine Specification for + * more details. + */ + public int F_PROTECTED = Flags.AccProtected; + /** + * Static access flag. See The Java Virtual Machine Specification for more + * details. + */ + public int F_STATIC = Flags.AccStatic; + /** + * Final access flag. See The Java Virtual Machine Specification for more + * details. + */ + public int F_FINAL = Flags.AccFinal; + /** + * Abstract property flag. See The Java Virtual Machine Specification for + * more details. + */ + public int F_ABSTRACT = Flags.AccAbstract; + + private final static String PAGE_NAME = "NewTypeWizardPage"; //$NON-NLS-1$ + + /** Field ID of the package input field. */ + protected final static String PACKAGE = PAGE_NAME + ".package"; //$NON-NLS-1$ + /** Field ID of the enclosing type input field. */ + protected final static String ENCLOSING = PAGE_NAME + ".enclosing"; //$NON-NLS-1$ + /** Field ID of the enclosing type checkbox. */ + protected final static String ENCLOSINGSELECTION = ENCLOSING + ".selection"; //$NON-NLS-1$ + /** Field ID of the type name input field. */ + protected final static String TYPENAME = PAGE_NAME + ".typename"; //$NON-NLS-1$ + /** Field ID of the super type input field. */ + protected final static String SUPER = PAGE_NAME + ".superclass"; //$NON-NLS-1$ + /** Field ID of the super interfaces input field. */ + protected final static String INTERFACES = PAGE_NAME + ".interfaces"; //$NON-NLS-1$ + /** Field ID of the modifier check boxes. */ + protected final static String MODIFIERS = PAGE_NAME + ".modifiers"; //$NON-NLS-1$ + /** Field ID of the method stubs check boxes. */ + protected final static String METHODS = PAGE_NAME + ".methods"; //$NON-NLS-1$ + + private static class InterfaceWrapper { + public String interfaceName; + + public InterfaceWrapper(String interfaceName) { + this.interfaceName = interfaceName; + } + + public int hashCode() { + return interfaceName.hashCode(); + } + + public boolean equals(Object obj) { + return obj != null + && getClass().equals(obj.getClass()) + && ((InterfaceWrapper) obj).interfaceName + .equals(interfaceName); + } + } + + private static class InterfacesListLabelProvider extends LabelProvider { + private Image fInterfaceImage; + + public InterfacesListLabelProvider() { + fInterfaceImage = JavaPluginImages + .get(JavaPluginImages.IMG_OBJS_CLASS); + } + + public String getText(Object element) { + return ((InterfaceWrapper) element).interfaceName; + } + + public Image getImage(Object element) { + return fInterfaceImage; + } + } + + private StringButtonStatusDialogField fFolderName; + + private SelectionButtonDialogField fUseExistingFileTick; + private StringButtonDialogField fExistingFileName; + + private IPackageFragment fCurrPackage; + + private IType fCurrEnclosingType; + /** + * a handle to the type to be created (does usually not exist, can be null) + */ + private IType fCurrType; + private StringDialogField fTypeNameDialogField; + + private StringButtonDialogField fSuperClassDialogField; + private ListDialogField fSuperInterfacesDialogField; + + private SelectionButtonDialogFieldGroup fAccMdfButtons; + private SelectionButtonDialogFieldGroup fOtherMdfButtons; + + private IType fCreatedType; + + private JavaPackageCompletionProcessor fCurrPackageCompletionProcessor; + private JavaTypeCompletionProcessor fEnclosingTypeCompletionProcessor; + private StubTypeContext fSuperClassStubTypeContext; + private StubTypeContext fSuperInterfaceStubTypeContext; + + private final int PUBLIC_INDEX = 0, DEFAULT_INDEX = 1, PRIVATE_INDEX = 2, + PROTECTED_INDEX = 3; + private final int ABSTRACT_INDEX = 0, FINAL_INDEX = 1, STATIC_INDEX = 2, + ENUM_ANNOT_STATIC_INDEX = 1; + + private int fTypeKind; + + /** + * Constant to signal that the created type is a class. + * + * @since 3.1 + */ + public static final int CLASS_TYPE = 1; + + /** + * Constant to signal that the created type is a interface. + * + * @since 3.1 + */ + public static final int INTERFACE_TYPE = 2; + + /** + * Constant to signal that the created type is an enum. + * + * @since 3.1 + */ + public static final int ENUM_TYPE = 3; + + /** + * Constant to signal that the created type is an annotation. + * + * @since 3.1 + */ + public static final int ANNOTATION_TYPE = 4; + + /** + * Creates a new <code>NewTypeWizardPage</code>. + * + * @param isClass + * <code>true</code> if a new class is to be created; otherwise + * an interface is to be created + * @param pageName + * the wizard page's name + */ + public NewTypeWizardPage(boolean isClass, String pageName) { + this(isClass ? CLASS_TYPE : INTERFACE_TYPE, pageName); + } + + /** + * Creates a new <code>NewTypeWizardPage</code>. + * + * @param typeKind + * Signals the kind of the type to be created. Valid kinds are + * {@link #CLASS_TYPE}, {@link #INTERFACE_TYPE}, + * {@link #ENUM_TYPE} and {@link #ANNOTATION_TYPE} + * @param pageName + * the wizard page's name + * @since 3.1 + */ + public NewTypeWizardPage(int typeKind, String pageName) { + super(pageName); + fTypeKind = typeKind; + + fCreatedType = null; + + TypeFieldsAdapter adapter = new TypeFieldsAdapter(); + + fFolderName = new StringButtonStatusDialogField(adapter); + fFolderName.setDialogFieldListener(adapter); + fFolderName.setLabelText("Folder"); + fFolderName + .setButtonLabel(NewWizardMessages.NewTypeWizardPage_package_button); + // fPackageDialogField.setStatusWidthHint(NewWizardMessages.NewTypeWizardPage_default); + + fUseExistingFileTick = new SelectionButtonDialogField(SWT.CHECK); + fUseExistingFileTick.setDialogFieldListener(adapter); + fUseExistingFileTick.setLabelText("Existing File"); + + fExistingFileName = new StringButtonDialogField(adapter); + fExistingFileName.setDialogFieldListener(adapter); + fExistingFileName + .setButtonLabel(NewWizardMessages.NewTypeWizardPage_enclosing_button); + + fTypeNameDialogField = new StringDialogField(); + fTypeNameDialogField.setDialogFieldListener(adapter); + fTypeNameDialogField.setLabelText(getTypeNameLabel()); + + fSuperClassDialogField = new StringButtonDialogField(adapter); + fSuperClassDialogField.setDialogFieldListener(adapter); + fSuperClassDialogField.setLabelText("Super Class"); + fSuperClassDialogField + .setButtonLabel(NewWizardMessages.NewTypeWizardPage_superclass_button); + + String[] addButtons = new String[] { + NewWizardMessages.NewTypeWizardPage_interfaces_add, + /* 1 */null, + NewWizardMessages.NewTypeWizardPage_interfaces_remove }; + fSuperInterfacesDialogField = new ListDialogField(adapter, addButtons, + new InterfacesListLabelProvider()); + fSuperInterfacesDialogField.setDialogFieldListener(adapter); + fSuperInterfacesDialogField + .setTableColumns(new ListDialogField.ColumnsDescription(1, + false)); + fSuperInterfacesDialogField.setLabelText(getSuperInterfacesLabel()); + fSuperInterfacesDialogField.setRemoveButtonIndex(2); + + String[] buttonNames1 = new String[] { + NewWizardMessages.NewTypeWizardPage_modifiers_public, + NewWizardMessages.NewTypeWizardPage_modifiers_default, + NewWizardMessages.NewTypeWizardPage_modifiers_private, + NewWizardMessages.NewTypeWizardPage_modifiers_protected }; + fAccMdfButtons = new SelectionButtonDialogFieldGroup(SWT.RADIO, + buttonNames1, 4); + fAccMdfButtons.setDialogFieldListener(adapter); + fAccMdfButtons.setLabelText(getModifiersLabel()); + fAccMdfButtons.setSelection(0, true); + + String[] buttonNames2; + if (fTypeKind == CLASS_TYPE) { + buttonNames2 = new String[] { + NewWizardMessages.NewTypeWizardPage_modifiers_abstract, + NewWizardMessages.NewTypeWizardPage_modifiers_final, + NewWizardMessages.NewTypeWizardPage_modifiers_static }; + } else { + if (fTypeKind == ENUM_TYPE || fTypeKind == ANNOTATION_TYPE) { + buttonNames2 = new String[] { + NewWizardMessages.NewTypeWizardPage_modifiers_abstract, + NewWizardMessages.NewTypeWizardPage_modifiers_static }; + } else + buttonNames2 = new String[] {}; + } + + fOtherMdfButtons = new SelectionButtonDialogFieldGroup(SWT.CHECK, + buttonNames2, 4); + fOtherMdfButtons.setDialogFieldListener(adapter); + + fAccMdfButtons.enableSelectionButton(PRIVATE_INDEX, false); + fAccMdfButtons.enableSelectionButton(PROTECTED_INDEX, false); + fOtherMdfButtons.enableSelectionButton(STATIC_INDEX, false); + + if (fTypeKind == ENUM_TYPE || fTypeKind == ANNOTATION_TYPE) { + fOtherMdfButtons.enableSelectionButton(ABSTRACT_INDEX, false); + fOtherMdfButtons.enableSelectionButton(ENUM_ANNOT_STATIC_INDEX, + false); + } + + // fAddCommentButton= new SelectionButtonDialogField(SWT.CHECK); + // fAddCommentButton.setLabelText(NewWizardMessages.NewTypeWizardPage_addcomment_label); + + updateEnableState(); + + } + + /** + * Initializes all fields provided by the page with a given selection. + * + * @param elem + * the selection used to initialize this page or <code> + * null</code> + * if no selection was available + */ + protected void initTypePage(IStructuredSelection selection) { + ArrayList initSuperinterfaces = new ArrayList(5); + + Object o = selection.getFirstElement(); + + String initFolder = null; + String initFile = null; + + if (o instanceof IFolder) { + initFolder = ((IFolder) o).getProjectRelativePath().toString(); + } else if (o instanceof IFile) { + // initFolder = + // ((IFile)o).getProjectRelativePath().removeLastSegments(1).toString(); + initFile = ((IFile) o).getProjectRelativePath().toString(); + setEnclosingTypeSelection(true, false); + + } + + if (initFile == null && initFolder != null) + fFolderName.setText(initFolder); + if (initFile != null) { + fExistingFileName.setText(initFile); + + } + // if (elem != null) { + // // evaluate the enclosing type + // project= elem.getJavaProject(); + // pack= (IPackageFragment) elem.getAncestor(IJavaScriptElement.PACKAGE_FRAGMENT); + // IType typeInCU= (IType) elem.getAncestor(IJavaScriptElement.TYPE); + // if (typeInCU != null) { + // if (typeInCU.getCompilationUnit() != null) { + // enclosingType= typeInCU; + // } + // } else { + // IJavaScriptUnit cu= (IJavaScriptUnit) + // elem.getAncestor(IJavaScriptElement.COMPILATION_UNIT); + // if (cu != null) { + // enclosingType= cu.findPrimaryType(); + // } + // } + // + // try { + // IType type= null; + // if (elem.getElementType() == IJavaScriptElement.TYPE) { + // type= (IType)elem; + // if (type.exists()) { + // String superName= JavaModelUtil.getFullyQualifiedName(type); + // if (type.isInterface()) { + // initSuperinterfaces.add(superName); + // } else { + // initSuperclass= superName; + // } + // } + // } + // } catch (JavaScriptModelException e) { + // JavaScriptPlugin.log(e); + // // ignore this exception now + // } + // } + + // setTypeName(typeName, true); + // setSuperClass(initSuperclass, true); + setSuperInterfaces(initSuperinterfaces, true); + + // setAddComments(StubUtility.doAddComments(project), true); // from project + // or workspace + } + + private static IStatus validateJavaTypeName(String text, + IJavaScriptProject project) { + if (project == null || !project.exists()) { + return JavaScriptConventions.validateJavaScriptTypeName(text, + JavaScriptCore.VERSION_1_3, JavaScriptCore.VERSION_1_3); + } + String sourceLevel = project.getOption(JavaScriptCore.COMPILER_SOURCE, true); + String compliance = project.getOption(JavaScriptCore.COMPILER_COMPLIANCE, + true); + return JavaScriptConventions.validateJavaScriptTypeName(text, sourceLevel, + compliance); + } + + /** + * Returns the label that is used for the type name input field. + * + * @return the label that is used for the type name input field. + * @since 3.2 + */ + protected String getTypeNameLabel() { + return NewWizardMessages.NewTypeWizardPage_typename_label; + } + + /** + * Returns the label that is used for the modifiers input field. + * + * @return the label that is used for the modifiers input field + * @since 3.2 + */ + protected String getModifiersLabel() { + return NewWizardMessages.NewTypeWizardPage_modifiers_acc_label; + } + + /** + * Returns the label that is used for the super interfaces input field. + * + * @return the label that is used for the super interfaces input field. + * @since 3.2 + */ + protected String getSuperInterfacesLabel() { + return "Super Types:"; + // if (fTypeKind != INTERFACE_TYPE) + // return NewWizardMessages.NewTypeWizardPage_interfaces_class_label; + // return NewWizardMessages.NewTypeWizardPage_interfaces_ifc_label; + } + + /** + * Creates a separator line. Expects a <code>GridLayout</code> with at + * least 1 column. + * + * @param composite + * the parent composite + * @param nColumns + * number of columns to span + */ + protected void createSeparator(Composite composite, int nColumns) { + (new Separator(SWT.SEPARATOR | SWT.HORIZONTAL)).doFillIntoGrid( + composite, nColumns, convertHeightInCharsToPixels(1)); + } + + /** + * Creates the controls for the package name field. Expects a + * <code>GridLayout</code> with at least 4 columns. + * + * @param composite + * the parent composite + * @param nColumns + * number of columns to span + */ + protected void createPackageControls(Composite composite, int nColumns) { + fFolderName.doFillIntoGrid(composite, nColumns); + Text text = fFolderName.getTextControl(null); + LayoutUtil.setWidthHint(text, getMaxFieldWidth()); + LayoutUtil.setHorizontalGrabbing(text); + ControlContentAssistHelper.createTextContentAssistant(text, + fCurrPackageCompletionProcessor); + TextFieldNavigationHandler.install(text); + } + + /** + * Creates the controls for the enclosing type name field. Expects a + * <code>GridLayout</code> with at least 4 columns. + * + * @param composite + * the parent composite + * @param nColumns + * number of columns to span + */ + protected void createEnclosingTypeControls(Composite composite, int nColumns) { + // #6891 + Composite tabGroup = new Composite(composite, SWT.NONE); + GridLayout layout = new GridLayout(); + layout.marginWidth = 0; + layout.marginHeight = 0; + tabGroup.setLayout(layout); + + fUseExistingFileTick.doFillIntoGrid(tabGroup, 1); + + Text text = fExistingFileName.getTextControl(composite); + text.getAccessible().addAccessibleListener(new AccessibleAdapter() { + public void getName(AccessibleEvent e) { + e.result = NewWizardMessages.NewTypeWizardPage_enclosing_field_description; + } + }); + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.widthHint = getMaxFieldWidth(); + gd.horizontalSpan = 2; + text.setLayoutData(gd); + + Button button = fExistingFileName.getChangeControl(composite); + gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL); + gd.widthHint = SWTUtil.getButtonWidthHint(button); + button.setLayoutData(gd); + ControlContentAssistHelper.createTextContentAssistant(text, + fEnclosingTypeCompletionProcessor); + TextFieldNavigationHandler.install(text); + } + + /** + * Creates the controls for the type name field. Expects a + * <code>GridLayout</code> with at least 2 columns. + * + * @param composite + * the parent composite + * @param nColumns + * number of columns to span + */ + protected void createTypeNameControls(Composite composite, int nColumns) { + fTypeNameDialogField.doFillIntoGrid(composite, nColumns - 1); + DialogField.createEmptySpace(composite); + + Text text = fTypeNameDialogField.getTextControl(null); + LayoutUtil.setWidthHint(text, getMaxFieldWidth()); + TextFieldNavigationHandler.install(text); + } + + /** + * Creates the controls for the modifiers radio/checkbox buttons. Expects a + * <code>GridLayout</code> with at least 3 columns. + * + * @param composite + * the parent composite + * @param nColumns + * number of columns to span + */ + // protected void createModifierControls(Composite composite, int nColumns) { + // LayoutUtil.setHorizontalSpan(fAccMdfButtons.getLabelControl(composite), 1); + // + // Control control= fAccMdfButtons.getSelectionButtonsGroup(composite); + // GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL); + // gd.horizontalSpan= nColumns - 2; + // control.setLayoutData(gd); + // + // DialogField.createEmptySpace(composite); + // + // if (fTypeKind == CLASS_TYPE) { + // DialogField.createEmptySpace(composite); + // + // control= fOtherMdfButtons.getSelectionButtonsGroup(composite); + // gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL); + // gd.horizontalSpan= nColumns - 2; + // control.setLayoutData(gd); + // + // DialogField.createEmptySpace(composite); + // } + // } + /** + * Creates the controls for the superclass name field. Expects a + * <code>GridLayout</code> with at least 3 columns. + * + * @param composite + * the parent composite + * @param nColumns + * number of columns to span + */ + protected void createSuperClassControls(Composite composite, int nColumns) { + fSuperClassDialogField.doFillIntoGrid(composite, nColumns); + Text text = fSuperClassDialogField.getTextControl(null); + LayoutUtil.setWidthHint(text, getMaxFieldWidth()); + + JavaTypeCompletionProcessor superClassCompletionProcessor = new JavaTypeCompletionProcessor( + false, false, true); + superClassCompletionProcessor + .setCompletionContextRequestor(new CompletionContextRequestor() { + public StubTypeContext getStubTypeContext() { + return getSuperClassStubTypeContext(); + } + }); + + ControlContentAssistHelper.createTextContentAssistant(text, + superClassCompletionProcessor); + TextFieldNavigationHandler.install(text); + } + + /** + * Creates the controls for the superclass name field. Expects a + * <code>GridLayout</code> with at least 3 columns. + * + * @param composite + * the parent composite + * @param nColumns + * number of columns to span + */ + protected void createSuperInterfacesControls(Composite composite, + int nColumns) { + final String INTERFACE = "Super Classes"; //$NON-NLS-1$ + fSuperInterfacesDialogField.doFillIntoGrid(composite, nColumns); + final TableViewer tableViewer = fSuperInterfacesDialogField + .getTableViewer(); + tableViewer.setColumnProperties(new String[] { INTERFACE }); + + TableTextCellEditor cellEditor = new TableTextCellEditor(tableViewer, 0) { + protected void doSetFocus() { + if (text != null) { + text.setFocus(); + text.setSelection(text.getText().length()); + checkSelection(); + checkDeleteable(); + checkSelectable(); + } + } + }; + JavaTypeCompletionProcessor superInterfaceCompletionProcessor = new JavaTypeCompletionProcessor( + false, false, true); + superInterfaceCompletionProcessor + .setCompletionContextRequestor(new CompletionContextRequestor() { + public StubTypeContext getStubTypeContext() { + return getSuperInterfacesStubTypeContext(); + } + }); + SubjectControlContentAssistant contentAssistant = ControlContentAssistHelper + .createJavaContentAssistant(superInterfaceCompletionProcessor); + Text cellEditorText = cellEditor.getText(); + ContentAssistHandler.createHandlerForText(cellEditorText, + contentAssistant); + TextFieldNavigationHandler.install(cellEditorText); + cellEditor.setContentAssistant(contentAssistant); + + tableViewer.setCellEditors(new CellEditor[] { cellEditor }); + tableViewer.setCellModifier(new ICellModifier() { + public void modify(Object element, String property, Object value) { + if (element instanceof Item) + element = ((Item) element).getData(); + + ((InterfaceWrapper) element).interfaceName = (String) value; + fSuperInterfacesDialogField.elementChanged(element); + } + + public Object getValue(Object element, String property) { + return ((InterfaceWrapper) element).interfaceName; + } + + public boolean canModify(Object element, String property) { + return true; + } + }); + tableViewer.getTable().addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent event) { + if (event.keyCode == SWT.F2 && event.stateMask == 0) { + ISelection selection = tableViewer.getSelection(); + if (!(selection instanceof IStructuredSelection)) + return; + IStructuredSelection structuredSelection = (IStructuredSelection) selection; + tableViewer.editElement(structuredSelection + .getFirstElement(), 0); + } + } + }); + GridData gd = (GridData) fSuperInterfacesDialogField.getListControl( + null).getLayoutData(); + if (fTypeKind == CLASS_TYPE) { + gd.heightHint = convertHeightInCharsToPixels(3); + } else { + gd.heightHint = convertHeightInCharsToPixels(6); + } + gd.grabExcessVerticalSpace = false; + gd.widthHint = getMaxFieldWidth(); + } + + /** + * Creates the controls for the preference page links. Expects a + * <code>GridLayout</code> with at least 3 columns. + * + * @param composite + * the parent composite + * @param nColumns + * number of columns to span + * + * @since 3.1 + */ + protected void createCommentControls(Composite composite, int nColumns) { + Link link = new Link(composite, SWT.NONE); + link + .setText(NewWizardMessages.NewTypeWizardPage_addcomment_description); + link.addSelectionListener(new TypeFieldsAdapter()); + link.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, + false, nColumns, 1)); + DialogField.createEmptySpace(composite); + // fAddCommentButton.doFillIntoGrid(composite, nColumns - 1); + } + + /** + * Sets the focus on the type name input field. + */ + protected void setFocus() { + fTypeNameDialogField.setFocus(); + } + + // -------- TypeFieldsAdapter -------- + + private class TypeFieldsAdapter implements IStringButtonAdapter, + IDialogFieldListener, IListAdapter, SelectionListener { + + // -------- IStringButtonAdapter + public void changeControlPressed(DialogField field) { + typePageChangeControlPressed(field); + } + + // -------- IListAdapter + public void customButtonPressed(ListDialogField field, int index) { + typePageCustomButtonPressed(field, index); + } + + public void selectionChanged(ListDialogField field) { + } + + // -------- IDialogFieldListener + public void dialogFieldChanged(DialogField field) { + typePageDialogFieldChanged(field); + } + + public void doubleClicked(ListDialogField field) { + } + + public void widgetSelected(SelectionEvent e) { + typePageLinkActivated(e); + } + + public void widgetDefaultSelected(SelectionEvent e) { + typePageLinkActivated(e); + } + } + + private void typePageLinkActivated(SelectionEvent e) { + IJavaScriptProject project = getJavaProject(); + if (project != null) { + PreferenceDialog dialog = PreferencesUtil.createPropertyDialogOn( + getShell(), project.getProject(), + CodeTemplatePreferencePage.PROP_ID, null, null); + dialog.open(); + } else { + String title = NewWizardMessages.NewTypeWizardPage_configure_templates_title; + String message = NewWizardMessages.NewTypeWizardPage_configure_templates_message; + MessageDialog.openInformation(getShell(), title, message); + } + } + + private void typePageChangeControlPressed(DialogField field) { + if (field == fFolderName) { + IResource pack = chooseFolder(); + if (pack != null) { + fFolderName.setText(pack.getName()); + } + } else if (field == fExistingFileName) { + IResource type = chooseExistingFile(); + if (type != null) { + String pathInWorkspace = type.getProjectRelativePath() + .toString(); + fExistingFileName.setText(pathInWorkspace); + } + } else if (field == fSuperClassDialogField) { + IType type = chooseSuperClass(); + if (type != null) { + fSuperClassDialogField.setText(JavaModelUtil + .getFullyQualifiedName(type)); + } + } + } + + private void typePageCustomButtonPressed(DialogField field, int index) { + if (field == fSuperInterfacesDialogField) { + chooseSuperInterfaces(); + List interfaces = fSuperInterfacesDialogField.getElements(); + if (!interfaces.isEmpty()) { + Object element = interfaces.get(interfaces.size() - 1); + fSuperInterfacesDialogField.editElement(element); + } + } + } + + /* + * A field on the type has changed. The fields' status and all dependent + * status are updated. + */ + private void typePageDialogFieldChanged(DialogField field) { + String fieldName = null; + if (field == fFolderName) { + packageChanged(); + updatePackageStatusLabel(); + typeNameChanged(); + superClassChanged(); + fieldName = PACKAGE; + } else if (field == fExistingFileName) { + enclosingTypeChanged(); + typeNameChanged(); + superClassChanged(); + // fieldName= ENCLOSING; + } else if (field == fUseExistingFileTick) { + updateEnableState(); + boolean isEnclosedType = isEnclosingTypeSelected(); + shouldDisableFolderSelection(!isEnclosedType); + if (!isEnclosedType) { + if (fAccMdfButtons.isSelected(PRIVATE_INDEX) + || fAccMdfButtons.isSelected(PROTECTED_INDEX)) { + fAccMdfButtons.setSelection(PRIVATE_INDEX, false); + fAccMdfButtons.setSelection(PROTECTED_INDEX, false); + fAccMdfButtons.setSelection(PUBLIC_INDEX, true); + } + if (fOtherMdfButtons.isSelected(STATIC_INDEX)) { + fOtherMdfButtons.setSelection(STATIC_INDEX, false); + } + } + fAccMdfButtons.enableSelectionButton(PRIVATE_INDEX, isEnclosedType); + fAccMdfButtons.enableSelectionButton(PROTECTED_INDEX, + isEnclosedType); + fOtherMdfButtons + .enableSelectionButton(STATIC_INDEX, isEnclosedType); + typeNameChanged(); + superClassChanged(); + fieldName = ENCLOSINGSELECTION; + } else if (field == fTypeNameDialogField) { + typeNameChanged(); + // fieldName= TYPENAME; + } else if (field == fSuperClassDialogField) { + // fSuperClassStatus= superClassChanged(); + // fieldName= SUPER; + } else if (field == fSuperInterfacesDialogField) { + // fSuperInterfacesStatus= superInterfacesChanged(); + // fieldName= INTERFACES; + } else if (field == fOtherMdfButtons || field == fAccMdfButtons) { + modifiersChanged(); + fieldName = MODIFIERS; + } else { + // fieldName= METHODS; + } + // tell all others + handleFieldChanged(fieldName); + } + + // -------- update message ---------------- + + /* + * @see org.eclipse.wst.jsdt.ui.wizards.NewContainerWizardPage#handleFieldChanged(String) + */ + protected void handleFieldChanged(String fieldName) { + + if (fieldName == CONTAINER) { + enclosingTypeChanged(); + + } + } + + // ---- set / get ---------------- + + /** + * Returns the text of the package input field. + * + * @return the text of the package input field + */ + public String getPackageText() { + return fFolderName.getText(); + } + + /** + * Returns the text of the enclosing type input field. + * + * @return the text of the enclosing type input field + */ + public String getEnclosingTypeText() { + return fExistingFileName.getText(); + } + + /** + * Returns the package fragment corresponding to the current input. + * + * @return a package fragment or <code>null</code> if the input could not + * be resolved. + */ + public IPackageFragment getPackageFragment() { + if (!isEnclosingTypeSelected()) { + return fCurrPackage; + } else { + if (fCurrEnclosingType != null) { + return fCurrEnclosingType.getPackageFragment(); + } + } + return null; + } + + /** + * Sets the package fragment to the given value. The method updates the + * model and the text of the control. + * + * @param pack + * the package fragment to be set + * @param canBeModified + * if <code>true</code> the package fragment is editable; + * otherwise it is read-only. + */ + // public void setPackageFragment(IPackageFragment pack, boolean canBeModified) + // { + // fCurrPackage= pack; + // fCanModifyPackage= canBeModified; + // String str= (pack == null) ? "" : pack.getElementName(); //$NON-NLS-1$ + // fFolderName.setText(str); + // updateEnableState(); + // } + /** + * Returns the enclosing type corresponding to the current input. + * + * @return the enclosing type or <code>null</code> if the enclosing type + * is not selected or the input could not be resolved + */ + public IType getEnclosingType() { + if (isEnclosingTypeSelected()) { + return fCurrEnclosingType; + } + return null; + } + + /** + * Sets the enclosing type. The method updates the underlying model and the + * text of the control. + * + * @param type + * the enclosing type + * @param canBeModified + * if <code>true</code> the enclosing type field is editable; + * otherwise it is read-only. + */ + public void setEnclosingType(IType type, boolean canBeModified) { + fCurrEnclosingType = type; + String str = (type == null) ? "" : JavaModelUtil.getFullyQualifiedName(type); //$NON-NLS-1$ + fExistingFileName.setText(str); + updateEnableState(); + } + + /** + * Returns the selection state of the enclosing type checkbox. + * + * @return the selection state of the enclosing type checkbox + */ + public boolean isEnclosingTypeSelected() { + return fUseExistingFileTick.isSelected(); + } + + /** + * Sets the enclosing type checkbox's selection state. + * + * @param isSelected + * the checkbox's selection state + * @param canBeModified + * if <code>true</code> the enclosing type checkbox is + * modifiable; otherwise it is read-only. + */ + public void setEnclosingTypeSelection(boolean isSelected, + boolean canBeModified) { + fUseExistingFileTick.setSelection(isSelected); + fUseExistingFileTick.setEnabled(canBeModified); + updateEnableState(); + } + + /** + * Returns the type name entered into the type input field. + * + * @return the type name + */ + public String getTypeName() { + return fTypeNameDialogField.getText(); + } + + /** + * Sets the type name input field's text to the given value. Method doesn't + * update the model. + * + * @param name + * the new type name + * @param canBeModified + * if <code>true</code> the type name field is editable; + * otherwise it is read-only. + */ + public void setTypeName(String name, boolean canBeModified) { + fTypeNameDialogField.setText(name); + fTypeNameDialogField.setEnabled(canBeModified); + } + + /** + * Returns the selected modifiers. + * + * @return the selected modifiers + * @see Flags + */ + public int getModifiers() { + int mdf = 0; + if (fAccMdfButtons.isSelected(PUBLIC_INDEX)) { + mdf += F_PUBLIC; + } else if (fAccMdfButtons.isSelected(PRIVATE_INDEX)) { + mdf += F_PRIVATE; + } else if (fAccMdfButtons.isSelected(PROTECTED_INDEX)) { + mdf += F_PROTECTED; + } + if (fOtherMdfButtons.isSelected(ABSTRACT_INDEX)) { + mdf += F_ABSTRACT; + } + if (fOtherMdfButtons.isSelected(FINAL_INDEX)) { + mdf += F_FINAL; + } + if (fOtherMdfButtons.isSelected(STATIC_INDEX)) { + mdf += F_STATIC; + } + return mdf; + } + + /** + * Sets the modifiers. + * + * @param modifiers + * <code>F_PUBLIC</code>, <code>F_PRIVATE</code>, + * <code>F_PROTECTED</code>, <code>F_ABSTRACT</code>, + * <code>F_FINAL</code> or <code>F_STATIC</code> or a valid + * combination. + * @param canBeModified + * if <code>true</code> the modifier fields are editable; + * otherwise they are read-only + * @see Flags + */ + public void setModifiers(int modifiers, boolean canBeModified) { + if (Flags.isPublic(modifiers)) { + fAccMdfButtons.setSelection(PUBLIC_INDEX, true); + } else if (Flags.isPrivate(modifiers)) { + fAccMdfButtons.setSelection(PRIVATE_INDEX, true); + } else if (Flags.isProtected(modifiers)) { + fAccMdfButtons.setSelection(PROTECTED_INDEX, true); + } else { + fAccMdfButtons.setSelection(DEFAULT_INDEX, true); + } + if (Flags.isAbstract(modifiers)) { + fOtherMdfButtons.setSelection(ABSTRACT_INDEX, true); + } + if (Flags.isFinal(modifiers)) { + fOtherMdfButtons.setSelection(FINAL_INDEX, true); + } + if (Flags.isStatic(modifiers)) { + fOtherMdfButtons.setSelection(STATIC_INDEX, true); + } + + fAccMdfButtons.setEnabled(canBeModified); + fOtherMdfButtons.setEnabled(canBeModified); + } + + /** + * Returns the content of the superclass input field. + * + * @return the superclass name + */ + public String getSuperClass() { + return fSuperClassDialogField.getText(); + } + + /** + * Sets the super class name. + * + * @param name + * the new superclass name + * @param canBeModified + * if <code>true</code> the superclass name field is editable; + * otherwise it is read-only. + */ + public void setSuperClass(String name, boolean canBeModified) { + fSuperClassDialogField.setText(name); + fSuperClassDialogField.setEnabled(canBeModified); + } + + /** + * Returns the chosen super interfaces. + * + * @return a list of chosen super interfaces. The list's elements are of + * type <code>String</code> + */ + public List getSuperInterfaces() { + List interfaces = fSuperInterfacesDialogField.getElements(); + ArrayList result = new ArrayList(interfaces.size()); + for (Iterator iter = interfaces.iterator(); iter.hasNext();) { + InterfaceWrapper wrapper = (InterfaceWrapper) iter.next(); + result.add(wrapper.interfaceName); + } + return result; + } + + /** + * Sets the super interfaces. + * + * @param interfacesNames + * a list of super interface. The method requires that the list's + * elements are of type <code>String</code> + * @param canBeModified + * if <code>true</code> the super interface field is editable; + * otherwise it is read-only. + */ + public void setSuperInterfaces(List interfacesNames, boolean canBeModified) { + ArrayList interfaces = new ArrayList(interfacesNames.size()); + for (Iterator iter = interfacesNames.iterator(); iter.hasNext();) { + interfaces.add(new InterfaceWrapper((String) iter.next())); + } + fSuperInterfacesDialogField.setElements(interfaces); + fSuperInterfacesDialogField.setEnabled(canBeModified); + } + + /** + * Adds a super interface to the end of the list and selects it if it is not + * in the list yet. + * + * @param superInterface + * the fully qualified type name of the interface. + * @return returns <code>true</code>if the interfaces has been added, + * <code>false</code> if the interface already is in the list. + * @since 3.2 + */ + public boolean addSuperInterface(String superInterface) { + return fSuperInterfacesDialogField.addElement(new InterfaceWrapper( + superInterface)); + } + + /** + * Sets 'Add comment' checkbox. The value set will only be used when + * creating source when the comment control is enabled (see + * {@link #enableCommentControl(boolean)} + * + * @param doAddComments + * if <code>true</code>, comments are added. + * @param canBeModified + * if <code>true</code> check box is editable; otherwise it is + * read-only. + * @since 3.1 + */ + // public void setAddComments(boolean doAddComments, boolean canBeModified) { + // //fAddCommentButton.setSelection(doAddComments); + // //fAddCommentButton.setEnabled(canBeModified); + // } + /** + * Sets to use the 'Add comment' checkbox value. Clients that use the 'Add + * comment' checkbox additionally have to enable the control. This has been + * added for backwards compatibility. + * + * @param useAddCommentValue + * if <code>true</code>, + * @since 3.1 + */ + // public void enableCommentControl(boolean useAddCommentValue) { + // fUseAddCommentButtonValue= useAddCommentValue; + // } + + /** + * Returns if comments are added. This method can be overridden by clients. + * The selection of the comment control is taken if enabled (see + * {@link #enableCommentControl(boolean)}, otherwise the settings as + * specified in the preferences is used. + * + * @return Returns <code>true</code> if comments can be added + * @since 3.1 + */ + // public boolean isAddComments() { + // if (fUseAddCommentButtonValue) { + // return fAddCommentButton.isSelected(); + // } + // return StubUtility.doAddComments(getJavaProject()); + // } + // + /** + * Returns the resource handle that corresponds to the compilation unit to + * was or will be created or modified. + * + * @return A resource or null if the page contains illegal values. + * @since 3.0 + */ + public IResource getModifiedResource() { + IType enclosing = getEnclosingType(); + if (enclosing != null) { + return enclosing.getResource(); + } + IPackageFragment pack = getPackageFragment(); + if (pack != null) { + String cuName = getCompilationUnitName(getTypeNameWithoutParameters()); + return pack.getJavaScriptUnit(cuName).getResource(); + } + return null; + } + + // ----------- validation ---------- + + /* + * @see org.eclipse.wst.jsdt.ui.wizards.NewContainerWizardPage#containerChanged() + */ + protected IStatus containerChanged() { + return null; + // IStatus status= super.containerChanged(); + // // IPackageFragmentRoot root= getPackageFragmentRoot(); + // if ((fTypeKind == ANNOTATION_TYPE || fTypeKind == ENUM_TYPE) && + // !status.matches(IStatus.ERROR)) { + // if (root != null && !JavaModelUtil.is50OrHigher(root.getJavaProject())) { + // // error as createType will fail otherwise (bug 96928) + // return new StatusInfo(IStatus.ERROR, + // Messages.format(NewWizardMessages.NewTypeWizardPage_warning_NotJDKCompliant, + // root.getJavaProject().getElementName())); + // } + // if (fTypeKind == ENUM_TYPE) { + // try { + // // if findType(...) == null then Enum is unavailable + // if (findType(root.getJavaProject(), "java.lang.Enum") == null) //$NON-NLS-1$ + // return new StatusInfo(IStatus.WARNING, + // NewWizardMessages.NewTypeWizardPage_warning_EnumClassNotFound); + // } catch (JavaScriptModelException e) { + // JavaScriptPlugin.log(e); + // } + // } + // } + // + // fCurrPackageCompletionProcessor.setPackageFragmentRoot(root); + // if (root != null) { + // fEnclosingTypeCompletionProcessor.setPackageFragment(root.getPackageFragment("")); + // //$NON-NLS-1$ + // } + // return status; + } + + /** + * A hook method that gets called when the package field has changed. The + * method validates the package name and returns the status of the + * validation. The validation also updates the package fragment model. + * <p> + * Subclasses may extend this method to perform their own validation. + * </p> + * + * @return the status of the validation + */ + protected IStatus packageChanged() { + // StatusInfo status= new StatusInfo(); + // IPackageFragmentRoot root= getPackageFragmentRoot(); + // fPackageDialogField.enableButton(root != null); + // + // IJavaScriptProject project= root != null ? root.getJavaProject() : null; + // + // String packName= getPackageText(); + // if (packName.length() > 0) { + // IStatus val= validatePackageName(packName, project); + // if (val.getSeverity() == IStatus.ERROR) { + // status.setError(Messages.format(NewWizardMessages.NewTypeWizardPage_error_InvalidPackageName, + // val.getMessage())); + // return status; + // } else if (val.getSeverity() == IStatus.WARNING) { + // status.setWarning(Messages.format(NewWizardMessages.NewTypeWizardPage_warning_DiscouragedPackageName, + // val.getMessage())); + // // continue + // } + // } else { + // status.setWarning(NewWizardMessages.NewTypeWizardPage_warning_DefaultPackageDiscouraged); + // } + // + // if (project != null) { + // if (project.exists() && packName.length() > 0) { + // try { + // IPath rootPath= root.getPath(); + // IPath outputPath= project.getOutputLocation(); + // if (rootPath.isPrefixOf(outputPath) && !rootPath.equals(outputPath)) { + // // if the bin folder is inside of our root, don't allow to name a package + // // like the bin folder + // IPath packagePath= rootPath.append(packName.replace('.', '/')); + // if (outputPath.isPrefixOf(packagePath)) { + // status.setError(NewWizardMessages.NewTypeWizardPage_error_ClashOutputLocation); + // return status; + // } + // } + // } catch (JavaScriptModelException e) { + // JavaScriptPlugin.log(e); + // // let pass + // } + // } + // + // fCurrPackage= root.getPackageFragment(packName); + // } else { + // status.setError(""); //$NON-NLS-1$ + // } + // return status; + return null; + } + + /* + * Updates the 'default' label next to the package field. + */ + private void updatePackageStatusLabel() { + // String packName= getPackageText(); + // + // if (packName.length() == 0) { + // fPackageDialogField.setStatus(NewWizardMessages.NewTypeWizardPage_default); + // } else { + // fPackageDialogField.setStatus(""); //$NON-NLS-1$ + // } + } + + /* + * Updates the enable state of buttons related to the enclosing type + * selection checkbox. + */ + private void updateEnableState() { + boolean enclosing = isEnclosingTypeSelected(); + fFolderName.setEnabled(!enclosing); + fExistingFileName.setEnabled(enclosing); + fOtherMdfButtons.enableSelectionButton(ABSTRACT_INDEX, enclosing); + fOtherMdfButtons.enableSelectionButton(ENUM_ANNOT_STATIC_INDEX, + enclosing); + + // if (fTypeKind == ENUM_TYPE || fTypeKind == ANNOTATION_TYPE) { + // fOtherMdfButtons.enableSelectionButton(ABSTRACT_INDEX, enclosing); + // fOtherMdfButtons.enableSelectionButton(ENUM_ANNOT_STATIC_INDEX, enclosing); + // } + } + + /** + * Hook method that gets called when the enclosing type name has changed. + * The method validates the enclosing type and returns the status of the + * validation. It also updates the enclosing type model. + * <p> + * Subclasses may extend this method to perform their own validation. + * </p> + * + * @return the status of the validation + */ + protected IStatus enclosingTypeChanged() { + return null; + // StatusInfo status= new StatusInfo(); + // fCurrEnclosingType= null; + // + // IPackageFragmentRoot root= getPackageFragmentRoot(); + // + // fEnclosingTypeDialogField.enableButton(root != null); + // if (root == null) { + // status.setError(""); //$NON-NLS-1$ + // return status; + // } + // + // String enclName= getEnclosingTypeText(); + // if (enclName.length() == 0) { + // status.setError(NewWizardMessages.NewTypeWizardPage_error_EnclosingTypeEnterName); + // return status; + // } + // try { + // IType type= findType(root.getJavaProject(), enclName); + // if (type == null) { + // status.setError(NewWizardMessages.NewTypeWizardPage_error_EnclosingTypeNotExists); + // return status; + // } + // + // if (type.getCompilationUnit() == null) { + // status.setError(NewWizardMessages.NewTypeWizardPage_error_EnclosingNotInCU); + // return status; + // } + // if (!JavaModelUtil.isEditable(type.getCompilationUnit())) { + // status.setError(NewWizardMessages.NewTypeWizardPage_error_EnclosingNotEditable); + // return status; + // } + // + // fCurrEnclosingType= type; + // IPackageFragmentRoot enclosingRoot= + // JavaModelUtil.getPackageFragmentRoot(type); + // if (!enclosingRoot.equals(root)) { + // status.setWarning(NewWizardMessages.NewTypeWizardPage_warning_EnclosingNotInSourceFolder); + // } + // return status; + // } catch (JavaScriptModelException e) { + // status.setError(NewWizardMessages.NewTypeWizardPage_error_EnclosingTypeNotExists); + // JavaScriptPlugin.log(e); + // return status; + // } + } + + private String getTypeNameWithoutParameters() { + String typeNameWithParameters = getTypeName(); + int angleBracketOffset = typeNameWithParameters.indexOf('<'); + if (angleBracketOffset == -1) { + return typeNameWithParameters; + } else { + return typeNameWithParameters.substring(0, angleBracketOffset); + } + } + + /** + * Hook method that is called when evaluating the name of the compilation + * unit to create. By default, a file extension <code>java</code> is added + * to the given type name, but implementors can override this behavior. + * + * @param typeName + * the name of the type to create the compilation unit for. + * @return the name of the compilation unit to be created for the given name + * + * @since 3.2 + */ + protected String getCompilationUnitName(String typeName) { + return typeName + JavaModelUtil.DEFAULT_CU_SUFFIX; + } + + /** + * Hook method that gets called when the type name has changed. The method + * validates the type name and returns the status of the validation. + * <p> + * Subclasses may extend this method to perform their own validation. + * </p> + * + * @return the status of the validation + */ + protected IStatus typeNameChanged() { + StatusInfo status = new StatusInfo(); + fCurrType = null; + String typeNameWithParameters = getTypeName(); + // must not be empty + if (typeNameWithParameters.length() == 0) { + status + .setError(NewWizardMessages.NewTypeWizardPage_error_EnterTypeName); + return status; + } + + String typeName = getTypeNameWithoutParameters(); + if (typeName.indexOf('.') != -1) { + status + .setError(NewWizardMessages.NewTypeWizardPage_error_QualifiedName); + return status; + } + + IJavaScriptProject project = getJavaProject(); + IStatus val = validateJavaTypeName(typeName, project); + if (val.getSeverity() == IStatus.ERROR) { + status.setError(Messages.format( + NewWizardMessages.NewTypeWizardPage_error_InvalidTypeName, + val.getMessage())); + return status; + } else if (val.getSeverity() == IStatus.WARNING) { + status + .setWarning(Messages + .format( + NewWizardMessages.NewTypeWizardPage_warning_TypeNameDiscouraged, + val.getMessage())); + // continue checking + } + + // must not exist + if (!isEnclosingTypeSelected()) { + IPackageFragment pack = getPackageFragment(); + if (pack != null) { + IJavaScriptUnit cu = pack + .getJavaScriptUnit(getCompilationUnitName(typeName)); + fCurrType = cu.getType(typeName); + IResource resource = cu.getResource(); + + if (resource.exists()) { + status + .setError(NewWizardMessages.NewTypeWizardPage_error_TypeNameExists); + return status; + } + URI location = resource.getLocationURI(); + if (location != null) { + try { + IFileStore store = EFS.getStore(location); + if (store.fetchInfo().exists()) { + status + .setError(NewWizardMessages.NewTypeWizardPage_error_TypeNameExistsDifferentCase); + return status; + } + } catch (CoreException e) { + status + .setError(Messages + .format( + NewWizardMessages.NewTypeWizardPage_error_uri_location_unkown, + Resources + .getLocationString(resource))); + } + } + } + } else { + IType type = getEnclosingType(); + if (type != null) { + fCurrType = type.getType(typeName); + if (fCurrType.exists()) { + status + .setError(NewWizardMessages.NewTypeWizardPage_error_TypeNameExists); + return status; + } + } + } + + if (!typeNameWithParameters.equals(typeName) && project != null) { + if (!JavaModelUtil.is50OrHigher(project)) { + status + .setError(NewWizardMessages.NewTypeWizardPage_error_TypeParameters); + return status; + } + String typeDeclaration = "class " + typeNameWithParameters + " {}"; //$NON-NLS-1$//$NON-NLS-2$ + ASTParser parser = ASTParser.newParser(AST.JLS3); + parser.setSource(typeDeclaration.toCharArray()); + parser.setProject(project); + JavaScriptUnit compilationUnit = (JavaScriptUnit) parser + .createAST(null); + IProblem[] problems = compilationUnit.getProblems(); + if (problems.length > 0) { + status + .setError(Messages + .format( + NewWizardMessages.NewTypeWizardPage_error_InvalidTypeName, + problems[0].getMessage())); + return status; + } + } + return status; + } + + /** + * Hook method that gets called when the superclass name has changed. The + * method validates the superclass name and returns the status of the + * validation. + * <p> + * Subclasses may extend this method to perform their own validation. + * </p> + * + * @return the status of the validation + */ + protected IStatus superClassChanged() { + return null; + // StatusInfo status= new StatusInfo(); + // IPackageFragmentRoot root= getPackageFragmentRoot(); + // fSuperClassDialogField.enableButton(root != null); + // + // fSuperClassStubTypeContext= null; + // + // String sclassName= getSuperClass(); + // if (sclassName.length() == 0) { + // // accept the empty field (stands for java.lang.Object) + // return status; + // } + // + // if (root != null) { + // Type type= TypeContextChecker.parseSuperClass(sclassName); + // if (type == null) { + // status.setError(NewWizardMessages.NewTypeWizardPage_error_InvalidSuperClassName); + // return status; + // } + // if (type instanceof ParameterizedType && ! + // JavaModelUtil.is50OrHigher(root.getJavaProject())) { + // status.setError(NewWizardMessages.NewTypeWizardPage_error_SuperClassNotParameterized); + // return status; + // } + // } else { + // status.setError(""); //$NON-NLS-1$ + // } + // return status; + } + + private StubTypeContext getSuperClassStubTypeContext() { + if (fSuperClassStubTypeContext == null) { + String typeName; + if (fCurrType != null) { + typeName = getTypeName(); + } else { + typeName = JavaTypeCompletionProcessor.DUMMY_CLASS_NAME; + } + fSuperClassStubTypeContext = TypeContextChecker + .createSuperClassStubTypeContext(typeName, + getEnclosingType(), getPackageFragment()); + } + return fSuperClassStubTypeContext; + } + + /** + * Hook method that gets called when the list of super interface has + * changed. The method validates the super interfaces and returns the status + * of the validation. + * <p> + * Subclasses may extend this method to perform their own validation. + * </p> + * + * @return the status of the validation + */ + protected IStatus superInterfacesChanged() { + return null; + // StatusInfo status= new StatusInfo(); + // + // IPackageFragmentRoot root= getPackageFragmentRoot(); + // fSuperInterfacesDialogField.enableButton(0, root != null); + // + // if (root != null) { + // List elements= fSuperInterfacesDialogField.getElements(); + // int nElements= elements.size(); + // for (int i= 0; i < nElements; i++) { + // String intfname= ((InterfaceWrapper) elements.get(i)).interfaceName; + // Type type= TypeContextChecker.parseSuperInterface(intfname); + // if (type == null) { + // status.setError(Messages.format(NewWizardMessages.NewTypeWizardPage_error_InvalidSuperInterfaceName, + // intfname)); + // return status; + // } + // if (type instanceof ParameterizedType && ! + // JavaModelUtil.is50OrHigher(root.getJavaProject())) { + // status.setError(Messages.format(NewWizardMessages.NewTypeWizardPage_error_SuperInterfaceNotParameterized, + // intfname)); + // return status; + // } + // } + // } + // return status; + } + + private StubTypeContext getSuperInterfacesStubTypeContext() { + if (fSuperInterfaceStubTypeContext == null) { + String typeName; + if (fCurrType != null) { + typeName = getTypeName(); + } else { + typeName = JavaTypeCompletionProcessor.DUMMY_CLASS_NAME; + } + fSuperInterfaceStubTypeContext = TypeContextChecker + .createSuperInterfaceStubTypeContext(typeName, + getEnclosingType(), getPackageFragment()); + } + return fSuperInterfaceStubTypeContext; + } + + /** + * Hook method that gets called when the modifiers have changed. The method + * validates the modifiers and returns the status of the validation. + * <p> + * Subclasses may extend this method to perform their own validation. + * </p> + * + * @return the status of the validation + */ + protected IStatus modifiersChanged() { + StatusInfo status = new StatusInfo(); + int modifiers = getModifiers(); + if (Flags.isFinal(modifiers) && Flags.isAbstract(modifiers)) { + status + .setError(NewWizardMessages.NewTypeWizardPage_error_ModifiersFinalAndAbstract); + } + return status; + } + + // selection dialogs + + protected IResource chooseFolder() { + IProject fCurrProject = getJavaProject() != null ? getJavaProject() + .getProject() : null; + if (fCurrProject == null) + return null; + + // IWorkspaceRoot root= fCurrProject.getWorkspace().getRoot(); + final Class[] acceptedClasses = new Class[] { IFolder.class }; + + ILabelProvider lp = new WorkbenchLabelProvider(); + ITreeContentProvider cp = new WorkbenchContentProvider(); + + IResource initSelection = fCurrProject; + + Object[] rejects = new Object[] { fCurrProject.findMember(".settings") }; + + ViewerFilter filter = new TypedViewerFilter(acceptedClasses, rejects); + + FolderSelectionDialog dialog = new FolderSelectionDialog(getShell(), + lp, cp); + + dialog.setTitle("Folder Selection"); + dialog + .setMessage(NewWizardMessages.NewTypeWizardPage_ChoosePackageDialog_description); + // dialog.setEmptyListMessage(NewWizardMessages.NewTypeWizardPage_ChoosePackageDialog_empty); + // dialog.setElements( new Object[] {head}); + + dialog.addFilter(filter); + dialog.setHelpAvailable(false); + dialog.setAllowMultiple(false); + dialog.setInput(initSelection); + if (dialog.open() == Window.OK) { + return (IResource) dialog.getFirstResult(); + } + return null; + } + + /** + * Opens a selection dialog that allows to select a package. + * + * @return returns the selected package or <code>null</code> if the dialog + * has been canceled. The caller typically sets the result to the + * package input field. + * <p> + * Clients can override this method if they want to offer a + * different dialog. + * </p> + * + * @since 3.2 + */ + // protected IPackageFragment choosePackage2() { + // IJavaScriptProject javaProject = getJavaProject(); + // IPackageFragmentRoot froot= null;; + // IJavaScriptElement[] packages= null; + // try { + // if (froot != null && froot.exists()) { + // packages= froot.getChildren(); + // } + // } catch (JavaScriptModelException e) { + // JavaScriptPlugin.log(e); + // } + // if (packages == null) { + // packages= new IJavaScriptElement[0]; + // } + // + // ElementListSelectionDialog dialog= new ElementListSelectionDialog(getShell(), + // new JavaScriptElementLabelProvider(JavaScriptElementLabelProvider.SHOW_DEFAULT)); + // dialog.setIgnoreCase(false); + // dialog.setTitle(NewWizardMessages.NewTypeWizardPage_ChoosePackageDialog_title); + // dialog.setMessage(NewWizardMessages.NewTypeWizardPage_ChoosePackageDialog_description); + // dialog.setEmptyListMessage(NewWizardMessages.NewTypeWizardPage_ChoosePackageDialog_empty); + // dialog.setElements(packages); + // dialog.setHelpAvailable(false); + // + // IPackageFragment pack= getPackageFragment(); + // if (pack != null) { + // dialog.setInitialSelections(new Object[] { pack }); + // } + // + // if (dialog.open() == Window.OK) { + // return (IPackageFragment) dialog.getFirstResult(); + // } + // return null; + // } + /** + * Opens a selection dialog that allows to select an enclosing type. + * + * @return returns the selected type or <code>null</code> if the dialog + * has been canceled. The caller typically sets the result to the + * enclosing type input field. + * <p> + * Clients can override this method if they want to offer a + * different dialog. + * </p> + * + * @since 3.2 + */ + protected IResource chooseExistingFile() { + IProject fCurrProject = getJavaProject() != null ? getJavaProject() + .getProject() : null; + if (fCurrProject == null) + return null; + + // IWorkspaceRoot root= fCurrProject.getWorkspace().getRoot(); + final Class[] acceptedClasses = new Class[] { IFile.class, + IFolder.class }; + + ILabelProvider lp = new WorkbenchLabelProvider(); + ITreeContentProvider cp = new WorkbenchContentProvider(); + + IResource initSelection = fCurrProject; + + Object[] rejects = new Object[] { fCurrProject.findMember(".settings") }; + + ViewerFilter filter = new TypedViewerFilter(acceptedClasses, rejects); + + FolderSelectionDialog dialog = new FolderSelectionDialog(getShell(), + lp, cp); + + final String[] validFileExtensions = { "js"/* ,"html","htm" */}; + dialog.setValidator(new ISelectionStatusValidator() { + + public IStatus validate(Object[] selection) { + if (selection == null || selection.length > 1 + || selection.length == 0) + return new Status(IStatus.ERROR, "org.ibm.jsdt.dojo", + "You must select a valid JavaScript source file."); + + if (selection[0] instanceof IFile) { + IFile theFile = (IFile) selection[0]; + String fileExtension = theFile.getFileExtension(); + for (int i = 0; i < validFileExtensions.length; i++) { + if (fileExtension != null + && fileExtension + .equalsIgnoreCase(validFileExtensions[i])) { + return new Status(IStatus.OK, "org.ibm.jsdt.dojo", + "Great Job!"); + } + } + + } + + return new Status(IStatus.ERROR, "org.ibm.jsdt.dojo", + "You must select a valid JavaScript source file."); + } + }); + + dialog.setTitle("Existing File Selection"); + dialog.setMessage("Choose a file"); + // dialog.setEmptyListMessage(NewWizardMessages.NewTypeWizardPage_ChoosePackageDialog_empty); + // dialog.setElements( new Object[] {head}); + + dialog.addFilter(filter); + dialog.setHelpAvailable(false); + dialog.setAllowMultiple(false); + dialog.setInput(initSelection); + if (dialog.open() == Window.OK) { + return (IResource) dialog.getFirstResult(); + } + return null; + } + + /** + * Opens a selection dialog that allows to select a super class. + * + * @return returns the selected type or <code>null</code> if the dialog + * has been canceled. The caller typically sets the result to the + * super class input field. + * <p> + * Clients can override this method if they want to offer a + * different dialog. + * </p> + * + * @since 3.2 + */ + protected IType chooseSuperClass() { + IJavaScriptProject project = getJavaProject(); + if (project == null) { + return null; + } + + IJavaScriptElement[] elements = new IJavaScriptElement[] { project }; + IJavaScriptSearchScope scope = SearchEngine.createJavaSearchScope(elements); + + FilteredTypesSelectionDialog dialog = new FilteredTypesSelectionDialog( + getShell(), false, getWizard().getContainer(), scope, + IJavaScriptSearchConstants.CLASS); + dialog + .setTitle(NewWizardMessages.NewTypeWizardPage_SuperClassDialog_title); + dialog + .setMessage(NewWizardMessages.NewTypeWizardPage_SuperClassDialog_message); + dialog.setInitialPattern(getSuperClass()); + + if (dialog.open() == Window.OK) { + return (IType) dialog.getFirstResult(); + } + return null; + } + + /** + * Opens a selection dialog that allows to select the super interfaces. The + * selected interfaces are directly added to the wizard page using + * {@link #addSuperInterface(String)}. + * + * <p> + * Clients can override this method if they want to offer a different + * dialog. + * </p> + * + * @since 3.2 + */ + protected void chooseSuperInterfaces() { + IJavaScriptProject project = getJavaProject(); + if (project == null) { + return; + } + + SuperInterfaceSelectionDialog dialog = new SuperInterfaceSelectionDialog( + getShell(), getWizard().getContainer(), this, project); + dialog.setTitle(getInterfaceDialogTitle()); + dialog.setMessage("&Choose JavaScript Types"); + dialog.open(); + } + + private String getInterfaceDialogTitle() { + if (fTypeKind == INTERFACE_TYPE) + return NewWizardMessages.NewTypeWizardPage_InterfacesDialog_interface_title; + return "JavaScript Type Selection"; + } + + // ---- creation ---------------- + + /** + * Creates the new type using the entered field values. + * + * @param monitor + * a progress monitor to report progress. + * @throws CoreException + * Thrown when the creation failed. + * @throws InterruptedException + * Thrown when the operation was canceled. + */ + public void createType(IProgressMonitor monitor) throws CoreException, + InterruptedException { + // if (monitor == null) { + // monitor= new NullProgressMonitor(); + // } + // + // monitor.beginTask("Create Dojo Class...", 8); + // + // String newFileName; + // String existingFileName; + // String newPath; + // String className; + // String[] extendedClasses; + + // IPackageFragmentRoot root= getPackageFragmentRoot(); + // IPackageFragment pack= getPackageFragment(); + // if (pack == null) { + // pack= root.getPackageFragment(""); //$NON-NLS-1$ + // } + // + // if (!pack.exists()) { + // String packName= pack.getElementName(); + // pack= root.createPackageFragment(packName, true, new + // SubProgressMonitor(monitor, 1)); + // } else { + // monitor.worked(1); + // } + // + // boolean needsSave; + // IJavaScriptUnit connectedCU= null; + // + // try { + // String typeName= getTypeNameWithoutParameters(); + // + // boolean isInnerClass= isEnclosingTypeSelected(); + // + // IType createdType; + // ImportsManager imports; + // int indent= 0; + // + // Set /* String (import names) */ existingImports; + // + // String lineDelimiter= null; + // if (!isInnerClass) { + // lineDelimiter= StubUtility.getLineDelimiterUsed(pack.getJavaProject()); + // + // String cuName= getCompilationUnitName(typeName); + // IJavaScriptUnit parentCU= pack.createCompilationUnit(cuName, "", false, new + // SubProgressMonitor(monitor, 2)); //$NON-NLS-1$ + // // create a working copy with a new owner + // + // needsSave= true; + // parentCU.becomeWorkingCopy(new SubProgressMonitor(monitor, 1)); // cu is now + // a (primary) working copy + // connectedCU= parentCU; + // + // IBuffer buffer= parentCU.getBuffer(); + // + // String simpleTypeStub= constructSimpleTypeStub(); + // String cuContent= constructCUContent(parentCU, simpleTypeStub, + // lineDelimiter); + // buffer.setContents(cuContent); + // + // JavaScriptUnit astRoot= createASTForImports(parentCU); + // existingImports= getExistingImports(astRoot); + // + // imports= new ImportsManager(astRoot); + // // add an import that will be removed again. Having this import solves 14661 + // imports.addImport(JavaModelUtil.concatenateName(pack.getElementName(), + // typeName)); + // + // String typeContent= constructTypeStub(parentCU, imports, lineDelimiter); + // + // int index= cuContent.lastIndexOf(simpleTypeStub); + // if (index == -1) { + // AbstractTypeDeclaration typeNode= (AbstractTypeDeclaration) + // astRoot.types().get(0); + // int start= ((ASTNode) typeNode.modifiers().get(0)).getStartPosition(); + // int end= typeNode.getStartPosition() + typeNode.getLength(); + // buffer.replace(start, end - start, typeContent); + // } else { + // buffer.replace(index, simpleTypeStub.length(), typeContent); + // } + // + // createdType= parentCU.getType(typeName); + // } else { + // IType enclosingType= getEnclosingType(); + // + // IJavaScriptUnit parentCU= enclosingType.getCompilationUnit(); + // + // needsSave= !parentCU.isWorkingCopy(); + // parentCU.becomeWorkingCopy(new SubProgressMonitor(monitor, 1)); // cu is now + // for sure (primary) a working copy + // connectedCU= parentCU; + // + // JavaScriptUnit astRoot= createASTForImports(parentCU); + // imports= new ImportsManager(astRoot); + // existingImports= getExistingImports(astRoot); + // + // + // // add imports that will be removed again. Having the imports solves 14661 + // IType[] topLevelTypes= parentCU.getTypes(); + // for (int i= 0; i < topLevelTypes.length; i++) { + // imports.addImport(topLevelTypes[i].getFullyQualifiedName('.')); + // } + // + // lineDelimiter= StubUtility.getLineDelimiterUsed(enclosingType); + // StringBuffer content= new StringBuffer(); + // + // String comment= getTypeComment(parentCU, lineDelimiter); + // if (comment != null) { + // content.append(comment); + // content.append(lineDelimiter); + // } + // + // content.append(constructTypeStub(parentCU, imports, lineDelimiter)); + // IJavaScriptElement sibling= null; + // if (enclosingType.isEnum()) { + // IField[] fields = enclosingType.getFields(); + // if (fields.length > 0) { + // for (int i = 0, max = fields.length; i < max; i++) { + // if (!fields[i].isEnumConstant()) { + // sibling = fields[i]; + // break; + // } + // } + // } + // } else { + // IJavaScriptElement[] elems= enclosingType.getChildren(); + // sibling = elems.length > 0 ? elems[0] : null; + // } + // + // createdType= enclosingType.createType(content.toString(), sibling, false, new + // SubProgressMonitor(monitor, 2)); + // + // indent= StubUtility.getIndentUsed(enclosingType) + 1; + // } + // if (monitor.isCanceled()) { + // throw new InterruptedException(); + // } + // + // // add imports for superclass/interfaces, so types can be resolved correctly + // + // IJavaScriptUnit cu= createdType.getCompilationUnit(); + // + // imports.create(false, new SubProgressMonitor(monitor, 1)); + // + // JavaModelUtil.reconcile(cu); + // + // if (monitor.isCanceled()) { + // throw new InterruptedException(); + // } + // + // // set up again + // JavaScriptUnit astRoot= createASTForImports(imports.getCompilationUnit()); + // imports= new ImportsManager(astRoot); + // + // createTypeMembers(createdType, imports, new SubProgressMonitor(monitor, 1)); + // + // // add imports + // imports.create(false, new SubProgressMonitor(monitor, 1)); + // + // removeUnusedImports(cu, existingImports, false); + // + // JavaModelUtil.reconcile(cu); + // + // ISourceRange range= createdType.getSourceRange(); + // + // IBuffer buf= cu.getBuffer(); + // String originalContent= buf.getText(range.getOffset(), range.getLength()); + // + // String formattedContent= + // CodeFormatterUtil.format(CodeFormatter.K_CLASS_BODY_DECLARATIONS, + // originalContent, indent, null, lineDelimiter, pack.getJavaProject()); + // formattedContent= Strings.trimLeadingTabsAndSpaces(formattedContent); + // buf.replace(range.getOffset(), range.getLength(), formattedContent); + // if (!isInnerClass) { + // String fileComment= getFileComment(cu); + // if (fileComment != null && fileComment.length() > 0) { + // buf.replace(0, 0, fileComment + lineDelimiter); + // } + // } + // fCreatedType= createdType; + // + // if (needsSave) { + // cu.commitWorkingCopy(true, new SubProgressMonitor(monitor, 1)); + // } else { + // monitor.worked(1); + // } + // + // } finally { + // if (connectedCU != null) { + // connectedCU.discardWorkingCopy(); + // } + // monitor.done(); + // } + } + + /** + * Uses the New Java file template from the code template page to generate a + * compilation unit with the given type content. + * + * @param cu + * The new created compilation unit + * @param typeContent + * The content of the type, including signature and type body. + * @param lineDelimiter + * The line delimiter to be used. + * @return String Returns the result of evaluating the new file template + * with the given type content. + * @throws CoreException + * @since 2.1 + */ + protected String constructCUContent(IJavaScriptUnit cu, + String typeContent, String lineDelimiter) throws CoreException { + // String fileComment= getFileComment(cu, lineDelimiter); + // String typeComment= getTypeComment(cu, lineDelimiter); + IPackageFragment pack = (IPackageFragment) cu.getParent(); + String content = null;// CodeGeneration.getCompilationUnitContent(cu, + // fileComment, typeComment, typeContent, + // lineDelimiter); + if (content != null) { + ASTParser parser = ASTParser.newParser(AST.JLS3); + parser.setProject(cu.getJavaScriptProject()); + parser.setSource(content.toCharArray()); + JavaScriptUnit unit = (JavaScriptUnit) parser.createAST(null); + if ((pack.isDefaultPackage() || unit.getPackage() != null) + && !unit.types().isEmpty()) { + return content; + } + } + StringBuffer buf = new StringBuffer(); + if (!pack.isDefaultPackage()) { + buf.append("package ").append(pack.getElementName()).append(';'); //$NON-NLS-1$ + } + buf.append(lineDelimiter).append(lineDelimiter); + // if (typeComment != null) { + // buf.append(typeComment).append(lineDelimiter); + // } + buf.append(typeContent); + return buf.toString(); + } + + /** + * Returns the created type or <code>null</code> is the type has not been + * created yet. The method only returns a valid type after + * <code>createType</code> has been called. + * + * @return the created type + * @see #createType(IProgressMonitor) + */ + public IType getCreatedType() { + return fCreatedType; + } + + // ---- construct CU body---------------- + + private void writeSuperClass(StringBuffer buf, ImportsManager imports) { + String superclass = getSuperClass(); + if (fTypeKind == CLASS_TYPE && superclass.length() > 0 + && !"java.lang.Object".equals(superclass)) { //$NON-NLS-1$ + buf.append(" extends "); //$NON-NLS-1$ + + ITypeBinding binding = null; + if (fCurrType != null) { + binding = TypeContextChecker.resolveSuperClass(superclass, + fCurrType, getSuperClassStubTypeContext()); + } + if (binding != null) { + buf.append(imports.addImport(binding)); + } else { + buf.append(imports.addImport(superclass)); + } + } + } + + private void writeSuperInterfaces(StringBuffer buf, ImportsManager imports) { + List interfaces = getSuperInterfaces(); + int last = interfaces.size() - 1; + if (last >= 0) { + if (fTypeKind != INTERFACE_TYPE) { + buf.append(" implements "); //$NON-NLS-1$ + } else { + buf.append(" extends "); //$NON-NLS-1$ + } + String[] intfs = (String[]) interfaces + .toArray(new String[interfaces.size()]); + ITypeBinding[] bindings; + if (fCurrType != null) { + bindings = TypeContextChecker.resolveSuperInterfaces(intfs, + fCurrType, getSuperInterfacesStubTypeContext()); + } else { + bindings = new ITypeBinding[intfs.length]; + } + for (int i = 0; i <= last; i++) { + ITypeBinding binding = bindings[i]; + if (binding != null) { + buf.append(imports.addImport(binding)); + } else { + buf.append(imports.addImport(intfs[i])); + } + if (i < last) { + buf.append(','); + } + } + } + } + + /** + * @param parentCU + * the current compilation unit + * @return returns the file template or <code>null</code> + * @deprecated Instead of file templates, the new type code template + * specifies the stub for a compilation unit. + */ + protected String getFileComment(IJavaScriptUnit parentCU) { + return null; + } + + /** + * @param name + * the name of the template + * @param parentCU + * the current compilation unit + * @return returns the template or <code>null</code> + * @deprecated Use getTemplate(String,IJavaScriptUnit,int) + */ + protected String getTemplate(String name, IJavaScriptUnit parentCU) { + return getTemplate(name, parentCU, 0); + } + + /** + * Returns the string resulting from evaluation the given template in the + * context of the given compilation unit. This accesses the normal template + * page, not the code templates. To use code templates use + * <code>constructCUContent</code> to construct a compilation unit stub or + * getTypeComment for the comment of the type. + * + * @param name + * the template to be evaluated + * @param parentCU + * the templates evaluation context + * @param pos + * a source offset into the parent compilation unit. The template + * is evaluated at the given source offset + * @return return the template with the given name or <code>null</code> if + * the template could not be found. + */ + protected String getTemplate(String name, IJavaScriptUnit parentCU, int pos) { + try { + Template template = JavaScriptPlugin.getDefault().getTemplateStore() + .findTemplate(name); + if (template != null) { + return JavaContext.evaluateTemplate(template, parentCU, pos); + } + } catch (CoreException e) { + JavaScriptPlugin.log(e); + } catch (BadLocationException e) { + JavaScriptPlugin.log(e); + } catch (TemplateException e) { + JavaScriptPlugin.log(e); + } + return null; + } + + /** + * Creates the bodies of all unimplemented methods and constructors and adds + * them to the type. Method is typically called by implementers of + * <code>NewTypeWizardPage</code> to add needed method and constructors. + * + * @param type + * the type for which the new methods and constructor are to be + * created + * @param doConstructors + * if <code>true</code> unimplemented constructors are created + * @param doUnimplementedMethods + * if <code>true</code> unimplemented methods are created + * @param imports + * an import manager to add all needed import statements + * @param monitor + * a progress monitor to report progress + * @return the created methods. + * @throws CoreException + * thrown when the creation fails. + */ + protected IFunction[] createInheritedMethods(IType type, + boolean doConstructors, boolean doUnimplementedMethods, + ImportsManager imports, IProgressMonitor monitor) + throws CoreException { + final IJavaScriptUnit cu = type.getJavaScriptUnit(); + JavaModelUtil.reconcile(cu); + IFunction[] typeMethods = type.getFunctions(); + Set handleIds = new HashSet(typeMethods.length); + for (int index = 0; index < typeMethods.length; index++) + handleIds.add(typeMethods[index].getHandleIdentifier()); + ArrayList newMethods = new ArrayList(); + JavaPreferencesSettings + .getCodeGenerationSettings(type.getJavaScriptProject()); + // settings.createComments= isAddComments(); + ASTParser parser = ASTParser.newParser(AST.JLS3); + parser.setResolveBindings(true); + parser.setSource(cu); + JavaScriptUnit unit = (JavaScriptUnit) parser + .createAST(new SubProgressMonitor(monitor, 1)); + final ITypeBinding binding = ASTNodes.getTypeBinding(unit, type); + if (binding != null) { + if (doUnimplementedMethods) { + AddUnimplementedMethodsOperation operation = new AddUnimplementedMethodsOperation( + unit, binding, null, -1, false, true, false); + // operation.setCreateComments(isAddComments()); + operation.run(monitor); + createImports(imports, operation.getCreatedImports()); + } + if (doConstructors) { + AddUnimplementedConstructorsOperation operation = new AddUnimplementedConstructorsOperation( + unit, binding, null, -1, false, true, false); + operation.setOmitSuper(true); + // operation.setCreateComments(isAddComments()); + operation.run(monitor); + createImports(imports, operation.getCreatedImports()); + } + } + JavaModelUtil.reconcile(cu); + typeMethods = type.getFunctions(); + for (int index = 0; index < typeMethods.length; index++) + if (!handleIds.contains(typeMethods[index].getHandleIdentifier())) + newMethods.add(typeMethods[index]); + IFunction[] methods = new IFunction[newMethods.size()]; + newMethods.toArray(methods); + return methods; + } + + private void createImports(ImportsManager imports, String[] createdImports) { + for (int index = 0; index < createdImports.length; index++) + imports.addImport(createdImports[index]); + } + + // ---- creation ---------------- + + /** + * Returns the runnable that creates the type using the current settings. + * The returned runnable must be executed in the UI thread. + * + * @return the runnable to create the new type + */ + public IRunnableWithProgress getRunnable() { + return new IRunnableWithProgress() { + public void run(IProgressMonitor monitor) + throws InvocationTargetException, InterruptedException { + try { + if (monitor == null) { + monitor = new NullProgressMonitor(); + } + createType(monitor); + } catch (CoreException e) { + throw new InvocationTargetException(e); + } + } + }; + } + + public String getFolderName() { + return fFolderName.getText(); + } + + public String getExistingFileName() { + return fExistingFileName.getText(); + } + + public boolean shouldUseExisting() { + return fUseExistingFileTick.isSelected(); + } + + public String getNewTypeName() { + return this.fTypeNameDialogField.getText(); + } + + public String[] getExtends() { + List elements = fSuperInterfacesDialogField.getElements(); + String[] elementNames = new String[elements.size()]; + for (int i = 0; i < elements.size(); i++) { + InterfaceWrapper element = (InterfaceWrapper) elements.get(i); + elementNames[i] = element.interfaceName; + } + return elementNames; + } + + // public boolean shouldGenComments() { + // return fAddCommentButton.isEnabled(); + // } +}
diff --git a/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/internal/ui/wizards/dojo/SuperInterfaceSelectionDialog.java b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/internal/ui/wizards/dojo/SuperInterfaceSelectionDialog.java new file mode 100644 index 0000000..c2c0de4 --- /dev/null +++ b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/internal/ui/wizards/dojo/SuperInterfaceSelectionDialog.java
@@ -0,0 +1,223 @@ +/******************************************************************************* + * Copyright (c) 2008 IBM Corporation and others. + * All rights reserved. + *******************************************************************************/ +package org.eclipse.wst.jsdt.internal.ui.wizards.dojo; + +import java.util.Iterator; +import java.util.List; + +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.dialogs.IDialogSettings; +import org.eclipse.jface.operation.IRunnableContext; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.PlatformUI; +import org.eclipse.wst.jsdt.core.IJavaScriptProject; +import org.eclipse.wst.jsdt.core.search.IJavaScriptSearchConstants; +import org.eclipse.wst.jsdt.core.search.IJavaScriptSearchScope; +import org.eclipse.wst.jsdt.core.search.SearchEngine; +import org.eclipse.wst.jsdt.core.search.TypeNameMatch; +import org.eclipse.wst.jsdt.internal.corext.util.JavaModelUtil; +import org.eclipse.wst.jsdt.internal.corext.util.Messages; +import org.eclipse.wst.jsdt.internal.ui.IJavaHelpContextIds; +import org.eclipse.wst.jsdt.internal.ui.JavaScriptPlugin; +import org.eclipse.wst.jsdt.internal.ui.dialogs.OpenTypeSelectionDialog; +import org.eclipse.wst.jsdt.internal.ui.dialogs.StatusInfo; + +/** + * A type selection dialog providing means to open interface(s). + */ +public class SuperInterfaceSelectionDialog extends OpenTypeSelectionDialog { + + private static final int ADD_ID = IDialogConstants.CLIENT_ID + 1; + + private NewTypeWizardPage fTypeWizardPage; + private List fOldContent; + + /** + * Creates new instance of SuperInterfaceSelectionDialog + * + * @param parent + * shell to parent the dialog on + * @param context + * context used to execute long-running operations associated + * with this dialog + * @param page + * page that opened this dialog + * @param p + * the java project which will be considered when searching for + * interfaces + */ + public SuperInterfaceSelectionDialog(Shell parent, + IRunnableContext context, NewTypeWizardPage page, IJavaScriptProject p) { + super(parent, true, context, createSearchScope(p), + IJavaScriptSearchConstants.CLASS); + fTypeWizardPage = page; + // to restore the content of the dialog field if the dialog is canceled + fOldContent = fTypeWizardPage.getSuperInterfaces(); + setStatusLineAboveButtons(true); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ui.dialogs.SelectionDialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite) + */ + protected void createButtonsForButtonBar(Composite parent) { + createButton(parent, ADD_ID, "&Add", true); + super.createButtonsForButtonBar(parent); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsSettings() + */ + protected IDialogSettings getDialogBoundsSettings() { + return JavaScriptPlugin.getDefault().getDialogSettingsSection( + "DialogBounds_SuperInterfaceSelectionDialog"); //$NON-NLS-1$ + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ui.dialogs.SelectionStatusDialog#updateButtonsEnableState(org.eclipse.core.runtime.IStatus) + */ + protected void updateButtonsEnableState(IStatus status) { + super.updateButtonsEnableState(status); + Button addButton = getButton(ADD_ID); + if (addButton != null && !addButton.isDisposed()) + addButton.setEnabled(!status.matches(IStatus.ERROR)); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.window.Window#handleShellCloseEvent() + */ + protected void handleShellCloseEvent() { + super.handleShellCloseEvent(); + // Handle the closing of the shell by selecting the close icon + fTypeWizardPage.setSuperInterfaces(fOldContent, true); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.dialogs.Dialog#cancelPressed() + */ + protected void cancelPressed() { + fTypeWizardPage.setSuperInterfaces(fOldContent, true); + super.cancelPressed(); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int) + */ + protected void buttonPressed(int buttonId) { + if (buttonId == ADD_ID) { + addSelectedInterfaces(); + } else { + super.buttonPressed(buttonId); + } + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ui.dialogs.SelectionStatusDialog#okPressed() + */ + protected void okPressed() { + addSelectedInterfaces(); + super.okPressed(); + } + + /* + * Adds selected interfaces to the list. + */ + private void addSelectedInterfaces() { + StructuredSelection selection = getSelectedItems(); + if (selection == null) + return; + for (Iterator iter = selection.iterator(); iter.hasNext();) { + Object obj = iter.next(); + if (obj instanceof TypeNameMatch) { + accessedHistoryItem(obj); + TypeNameMatch type = (TypeNameMatch) obj; + String qualifiedName = JavaModelUtil.getFullyQualifiedName(type + .getType()); + String message; + + if (fTypeWizardPage.addSuperInterface(qualifiedName)) { + message = Messages.format("\"{0}\" added.", qualifiedName); + } else { + message = Messages.format("\"{0}\" already in list.", + qualifiedName); + } + updateStatus(new StatusInfo(IStatus.INFO, message)); + } + } + } + + /* + * Creates a searching scope including only one project. + */ + private static IJavaScriptSearchScope createSearchScope(IJavaScriptProject p) { + return SearchEngine.createJavaSearchScope(new IJavaScriptProject[] { p }); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#handleDoubleClick() + */ + protected void handleDoubleClick() { + buttonPressed(ADD_ID); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#handleSelected(org.eclipse.jface.viewers.StructuredSelection) + */ + protected void handleSelected(StructuredSelection selection) { + super.handleSelected(selection); + + if (selection.size() == 0 + && fTypeWizardPage.getSuperInterfaces().size() > fOldContent + .size()) { + // overrides updateStatus() from handleSelected() if + // list of super interfaces was modified + // the <code>super.handleSelected(selection)</code> has to be + // called, because superclass implementation of this class updates + // state of the table. + + updateStatus(new Status(IStatus.OK, JavaScriptPlugin.getPluginId(), + IStatus.OK, "", null)); //$NON-NLS-1$ + + getButton(ADD_ID).setEnabled(false); + } else { + // if selection isn't empty, the add button should be enabled in + // exactly the same scenarios as the OK button + getButton(ADD_ID).setEnabled(getButton(OK).isEnabled()); + } + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.wst.jsdt.internal.ui.dialogs.OpenTypeSelectionDialog2#configureShell(org.eclipse.swt.widgets.Shell) + */ + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell, + IJavaHelpContextIds.SUPER_INTERFACE_SELECTION_DIALOG); + } +}