/**
* 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;
}