/** * Copyright 2005 Open Cloud Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.mobicents.eclipslee.servicecreation.wizards.generic; import java.util.Vector; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaModel; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.corext.util.JavaModelUtil; import org.eclipse.jdt.internal.ui.wizards.TypedViewerFilter; import org.eclipse.jdt.ui.JavaElementLabelProvider; import org.eclipse.jdt.ui.StandardJavaElementContentProvider; import org.eclipse.jface.dialogs.IDialogPage; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.IWizard; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionEvent; 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.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.dialogs.ElementListSelectionDialog; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; import org.mobicents.eclipslee.servicecreation.ServiceCreationPlugin; import org.mobicents.eclipslee.servicecreation.ui.TextButton; import org.mobicents.eclipslee.servicecreation.ui.TextButtonListener; import org.mobicents.eclipslee.servicecreation.util.SleeProjectWizardBuilder; import org.mobicents.eclipslee.servicecreation.wizards.deployable.DeployableUnitWizard; import org.mobicents.eclipslee.servicecreation.wizards.sbb.SbbWizard; import org.mobicents.eclipslee.servicecreation.wizards.service.ServiceWizard; /** * The "New" wizard page allows setting the container for * the new file as well as the file name. The page * will only accept file name without the extension OR * with the extension that matches the expected one (java). */ public class FilenamePage extends WizardPage { private static final String PAGE_DESCRIPTION = "Choose the Container (package) that this component should be created in, then choose a name for its main Java file."; /** * Constructor for SampleNewWizardPage. * @param pageName */ public FilenamePage(ISelection selection, String title, String ends) { super("wizardPage"); setTitle(title); setDescription(PAGE_DESCRIPTION); this.selection = selection; this.ends = ends; } private void refreshJars() { try { getSourceContainer().getProject() .getFolder("jars").refreshLocal(IResource.DEPTH_INFINITE, null); } catch(Exception ignore) { } } /** * @see IDialogPage#createControl(Composite) */ public void createControl(Composite parent) { refreshJars(); Composite container = new Composite(parent, SWT.NULL); GridLayout layout = new GridLayout(); container.setLayout(layout); layout.numColumns = 2; Label label = new Label(container, SWT.NULL); label.setText("&Source Folder:"); projectWidget = new TextButton(container, SWT.NULL); projectWidget.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL|GridData.FILL_HORIZONTAL)); label = new Label(container, SWT.NULL); label.setText("&Package:"); packageWidget = new TextButton(container, SWT.NULL); packageWidget.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL|GridData.FILL_HORIZONTAL)); PackageWidgetListener packageListener = new PackageWidgetListener(); packageWidget.addTextListener(packageListener); packageWidget.addButtonListener(packageListener); ProjectWidgetListener projectListener = new ProjectWidgetListener(); projectWidget.addTextListener(projectListener); projectWidget.addButtonListener(projectListener); label = new Label(container, SWT.NULL); label.setText("&Component File Name:"); fileText = new Text(container, SWT.BORDER | SWT.SINGLE); fileText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); fileText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { dialogChanged(); } }); initialize(); dialogChanged(); setControl(container); } /** * Tests if the current workbench selection is a suitable * container to use. */ private void initialize() { if (selection!=null && selection.isEmpty()==false && selection instanceof IStructuredSelection) { IJavaElement element = getInitialJavaElement((IStructuredSelection) selection); IPackageFragmentRoot initialRoot; initialRoot = JavaModelUtil.getPackageFragmentRoot(element); if (initialRoot == null || initialRoot.isArchive()) { IJavaProject javaProject = element.getJavaProject(); if (javaProject != null) { try { initialRoot = null; if (javaProject.exists()) { IPackageFragmentRoot roots[] = javaProject.getPackageFragmentRoots(); for (int i = 0; i < roots.length; i++) { if (roots[i].getKind() == IPackageFragmentRoot.K_SOURCE) { initialRoot = roots[i]; break; } } } } catch (JavaModelException e) { ServiceCreationPlugin.log("JavaModelException determining project root."); } if (initialRoot == null) { initialRoot = javaProject.getPackageFragmentRoot(javaProject.getResource()); } } } try { setSourceContainer((IFolder) initialRoot.getCorrespondingResource()); } catch (JavaModelException e) { ServiceCreationPlugin.log("JavaModelException thrown setting source container on FilenamePage"); } // Initialize the filename dialog fileText.setText("__Replace_Me__" + ends); if (element != null && element.getElementType() == IJavaElement.PACKAGE_FRAGMENT) { IPackageFragment fragment = (IPackageFragment) element; setPackage(fragment); return; } if (element != null && element.getElementType() == IJavaElement.COMPILATION_UNIT) { ICompilationUnit unit = (ICompilationUnit) element; IPackageFragment fragment = (IPackageFragment) unit.getParent(); setPackage(fragment); return; } setPackage(null); } } private IJavaElement getInitialJavaElement(IStructuredSelection selection) { IJavaElement element = null; if (selection != null && !selection.isEmpty()) { Object selectedElement = selection.getFirstElement(); if (selectedElement instanceof IAdaptable) { IAdaptable adaptable = (IAdaptable) selectedElement; element = (IJavaElement) adaptable.getAdapter(IJavaElement.class); if (element == null) { IResource resource = (IResource) adaptable.getAdapter(IResource.class); while (element == null && resource.getType() != IResource.PROJECT) { resource = resource.getParent(); element = (IJavaElement) resource.getAdapter(IJavaElement.class); } if (element == null) { element = JavaCore.create(resource); } } } } return element; } /** * Ensures that both text fields are set. */ private void dialogChanged() { String project = projectWidget.getText(); String pack = packageWidget.getText(); String fileName = getFileName(); if (project.length() == 0) { updateStatus("The Source Folder must be specified."); return; } // Zero-length package is the default package: don't check the default name. if (pack.length() > 0) { if (pack.charAt(0) == '.' || pack.charAt(pack.length() - 1) == '.') { updateStatus("The package name is invalid. Package names may not start or end with a dot."); return; } if (pack.indexOf("..") != -1) { updateStatus("The package name is invalid. Package names may not contain two or more consecutive dots."); return; } if (pack.indexOf(' ') >= 0) { updateStatus("The package name is invalid. Package names may not contain spaces."); return; } } if (fileName.length() == 0) { updateStatus("File name must be specified."); return; } if (!fileName.endsWith(ends)) { updateStatus("File name must end with \"" + ends + "\"."); return; } /* if(!projectRebuilt) setMessage("If you have just created new SLEE components, it is recommended to rebuild the project in order to acquire them."); else setMessage("");*/ // Update the doofus in the SbbEventsPage if this is an SbbWizard. IWizard wizard = this.getWizard(); if (wizard instanceof SbbWizard) ((SbbWizard) wizard).pageChanged(this); if (wizard instanceof ServiceWizard) ((ServiceWizard) wizard).pageChanged(this); if (wizard instanceof DeployableUnitWizard) ((DeployableUnitWizard) wizard).pageChanged(this); updateStatus(null); } /** * Gets the name of the chosen package. * @return the name of the chosen package */ public String getPackageName() { return packageWidget.getText(); } /** * Gets the name of the file to be created. * @return the name of the file to be created */ public String getFileName() { return fileText.getText(); } private void setPackageName(String t) { packageWidget.setText(t); } /* TODO: Remove private void setFileName(String t) { fileText.setText(t); } */ private void updateStatus(String message) { setErrorMessage(message); setPageComplete(message == null); } private void handleProjectBrowse() { // Get a list of the available source folders. IWorkspaceRoot workspace = ResourcesPlugin.getWorkspace().getRoot(); // Create a selection dialog for them. ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog( getShell(), new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT), new StandardJavaElementContentProvider() ); dialog.setTitle("Folder Selection"); dialog.setMessage("Choose a folder:"); dialog.setEmptyListMessage("You must create a Source Folder first."); Class[] acceptedClasses = new Class[] { IJavaModel.class, IPackageFragmentRoot.class, IJavaProject.class }; ViewerFilter filter = new TypedViewerFilter(acceptedClasses) { public boolean select(Viewer viewer, Object parent, Object element) { if (element instanceof IPackageFragmentRoot) { try { return (((IPackageFragmentRoot) element).getKind() == IPackageFragmentRoot.K_SOURCE); } catch (JavaModelException e) { return false; } } return super.select(viewer, parent, element); } }; dialog.addFilter(filter); // Filter out the cruft dialog.setInput(JavaCore.create(workspace)); if (getSourceContainer() != null) dialog.setInitialSelection(getSourceContainer()); // Open the dialog and set the project from the selected item. if (dialog.open() == Window.OK) { Object result = dialog.getFirstResult(); try { if (result instanceof IJavaProject) { setSourceContainer((IFolder) ((IJavaProject) result).getCorrespondingResource()); return; } if (result instanceof IPackageFragmentRoot) { setSourceContainer((IFolder) ((IPackageFragmentRoot) result).getCorrespondingResource()); return; } } catch (JavaModelException e) { ServiceCreationPlugin.log("JavaModelException setting source container."); } } } private void handlePackageBrowse() { // Get the packages in the current source folder and create a selection dialog. IJavaElement [] packages = getPackages(); ElementListSelectionDialog dialog = new ElementListSelectionDialog( getShell(), new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT)); dialog.setTitle("Package Selection"); dialog.setMessage("Choose a package:"); dialog.setEmptyListMessage("You must select a Source Folder first."); dialog.setElements(packages); // Get the IPackageFragment version of the current fragment and set the selected element in the dialog. for (int i = 0; i < packages.length; i++) { if (packages[i].getElementName().equals(getPackageName())) { dialog.setInitialSelections( new Object[] { packages[i] } ); break; } } // Open the dialog and set the package from the selected item. if (dialog.open() == Window.OK) { IJavaElement selectedPackage = (IJavaElement) dialog.getFirstResult(); setPackageName(selectedPackage.getElementName()); } } private IJavaElement[] getPackages() { IContainer resource = (IContainer) getSourceContainer(); // Unable to find the currently specified Source Folder. if (resource == null || !resource.exists() || !(resource instanceof IContainer)) { return new IJavaElement[0]; } // Get an IJavaProject object for the selected Source Folder. IProject project = resource.getProject(); IJavaProject javaProject = JavaCore.create(project); // Recurse through the packages and only select those not in a JAR file. try { Vector packages = new Vector(); IPackageFragmentRoot roots[] = javaProject.getPackageFragmentRoots(); for (int i = 0; i < roots.length; i++) { IPackageFragmentRoot root = roots[i]; if (!root.isArchive()) { IJavaElement children[] = root.getChildren(); for (int j = 0; j < children.length; j++) { IJavaElement child = (IJavaElement) children[j]; if (child instanceof IPackageFragment) { packages.add(child); addSubPackages((IPackageFragment) child, packages); } } } } // Convert the Vector to an array. IJavaElement [] elements = new IJavaElement[packages.size()]; elements = (IJavaElement []) packages.toArray(elements); return elements; } catch (JavaModelException e) { return new IJavaElement[0]; } } private void addSubPackages(IPackageFragment fragment, Vector packages) throws JavaModelException { IJavaElement children[] = fragment.getChildren(); for (int i = 0; i < children.length; i++) { if (children[i] instanceof IPackageFragment) { IPackageFragment packageFragment = (IPackageFragment) children[i]; packages.add(packageFragment); addSubPackages(packageFragment, packages); // Recurse } } } public IPackageFragment getPackage() { return pack; } public IFolder getSourceContainer() { return sourceContainer; } public void setPackage(IPackageFragment pack) { this.pack = pack; // Update the packageWidget if (pack == null) packageWidget.setText(""); else packageWidget.setText(pack.getElementName()); } public void setSourceContainer(IFolder folder) { sourceContainer = folder; if (sourceContainer == null) projectWidget.setText(""); else projectWidget.setText(sourceContainer.getFullPath().toOSString()); } private class PackageWidgetListener implements TextButtonListener { public void widgetDefaultSelected(SelectionEvent e) { handlePackageBrowse(); } public void widgetSelected(SelectionEvent e) { handlePackageBrowse(); } public void modifyText(ModifyEvent e) { dialogChanged(); } } private class ProjectWidgetListener implements TextButtonListener { public void widgetDefaultSelected(SelectionEvent e) { handleProjectBrowse(); } public void widgetSelected(SelectionEvent e) { handleProjectBrowse(); } public void modifyText(ModifyEvent e) { dialogChanged(); } } private IFolder sourceContainer; private IPackageFragment pack; private String ends; private TextButton packageWidget; private TextButton projectWidget; private Text fileText; private ISelection selection; }