org.openquark.cal.eclipse.ui.wizards.NewModuleWizard.java Source code

Java tutorial

Introduction

Here is the source code for org.openquark.cal.eclipse.ui.wizards.NewModuleWizard.java

Source

/*******************************************************************************
 * Copyright (c) 2007 Business Objects SA and others.
 * All rights reserved. 
 * This file is made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Business Objects Software Limited
 *******************************************************************************/
/*
 * NewModuleWizard.java
 * Created: Apr 25, 2007
 * By: Greg McClement
 */

package org.openquark.cal.eclipse.ui.wizards;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import org.eclipse.core.resources.IContainer;
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.resources.IStorage;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaElement;
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.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
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.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.ide.IDE.SharedImages;
import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;
import org.openquark.cal.compiler.LanguageInfo;
import org.openquark.cal.compiler.ModuleName;
import org.openquark.cal.eclipse.core.CALModelManager;
import org.openquark.cal.eclipse.ui.CALEclipseUIPlugin;
import org.openquark.cal.eclipse.ui.CALUIMessages;
import org.openquark.cal.eclipse.ui.util.CoreUtility;
import org.openquark.cal.eclipse.ui.util.Messages;
import org.openquark.cal.services.CALSourcePathMapper;

/**
 * This dialog is for creating a CAL Module in the package explorer. This is accessed from 
 * the File/New menu.
 * 
 * @author Greg McClement
 */
public class NewModuleWizard extends BasicNewResourceWizard {
    // only page of the new module wizard
    private WizardNewModuleCreationPage mainPage;

    final private IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();

    private static Image image_nav_namespace = null;

    /* (non-Javadoc)
     * @see org.eclipse.ui.wizards.newresource.BasicNewResourceWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
     */
    @Override
    public void init(IWorkbench workbench, IStructuredSelection selection) {
        super.init(workbench, selection);
        setWindowTitle(CALUIMessages.CALNewModuleWizard_title);
        setNeedsProgressMonitor(true);
    }

    private boolean isJavaProject(IProject project) throws CoreException {
        return project.hasNature(JavaCore.NATURE_ID);
    }

    private boolean isJavaSourceFolder(final IFolder folder) {
        final IJavaProject jProject = JavaCore.create(folder.getProject());

        IClasspathEntry[] classPathEntries;
        try {
            classPathEntries = jProject.getRawClasspath();
        } catch (JavaModelException e) {
            // not in class path
            return false;
        }
        boolean alreadyExists = false;
        for (int iClassPathEntries = 0; iClassPathEntries < classPathEntries.length; ++iClassPathEntries) {
            final IClasspathEntry cpe = classPathEntries[iClassPathEntries];
            if (cpe.getPath().equals(folder.getFullPath())) {
                alreadyExists = true;
                break;
            }
        }
        return alreadyExists;
    }

    private boolean isJavaSourceFolder(final IPackageFragmentRoot folder) {
        final IJavaProject jProject = folder.getJavaProject();

        IClasspathEntry[] classPathEntries;
        try {
            classPathEntries = jProject.getRawClasspath();
        } catch (JavaModelException e) {
            // not in class path
            return false;
        }
        boolean alreadyExists = false;
        for (int iClassPathEntries = 0; iClassPathEntries < classPathEntries.length; ++iClassPathEntries) {
            final IClasspathEntry cpe = classPathEntries[iClassPathEntries];
            if (cpe.getPath().equals(folder.getPath())) {
                alreadyExists = true;
                break;
            }
        }
        return alreadyExists;
    }

    private class WizardNewModuleCreationPage extends WizardPage
            implements ISelectionChangedListener, ModifyListener {
        private TreeViewer treeViewer;
        private Text moduleNameText;
        private Text containerNameText;

        WizardNewModuleCreationPage(String pageName, IStructuredSelection selection) {
            super(pageName);
        }

        private IProject getProject() {
            String[] components = containerNameText.getText().replace('.', '/').split("/");
            return workspaceRoot.getProject(components[0]);
        }

        /**
         * @return the name of the module specified in the UI. This assumes that validatePage succeeded.
         */
        private String getModuleNameString() {
            final String moduleNameString;
            final String containerNameString = containerNameText.getText();
            final int indexOfFirstDot = containerNameString.indexOf("/");
            final int indexOfSecondDot = containerNameString.indexOf(".", indexOfFirstDot + 1);
            if (indexOfSecondDot != -1) {
                moduleNameString = containerNameString.substring(indexOfSecondDot + 1) + "."
                        + moduleNameText.getText();
            } else {
                moduleNameString = moduleNameText.getText();
            }
            return moduleNameString;
        }

        /**
         * Create a new IFile object corresponding the the module information described in the wizard
         */
        private IFile createNewFile() throws CoreException {
            final String containerNameString = containerNameText.getText();
            final IProject project = getProject();
            String moduleNameString;
            final int indexOfFirstSlash = containerNameString.indexOf("/");
            if (indexOfFirstSlash == -1) {
                final int indexOfSecondDot = containerNameString.indexOf(".", indexOfFirstSlash + 1);
                if (indexOfSecondDot != -1) {
                    moduleNameString = containerNameString.substring(indexOfSecondDot + 1) + "."
                            + moduleNameText.getText();
                } else {
                    moduleNameString = moduleNameText.getText();
                }
                final ModuleName moduleName = ModuleName.make(moduleNameString);
                final String[] moduleNameComponents = moduleName.getComponents();
                final String[] components = new String[moduleNameComponents.length + 1];
                components[0] = "CAL";
                System.arraycopy(moduleNameComponents, 0, components, 1, moduleNameComponents.length);
                final int justBeforeLastComponent = components.length - 1;

                // Make sure that the component paths exists as folders
                IFolder lastComponent = null;
                for (int i = 0; i < justBeforeLastComponent; ++i) {
                    final String componentName = components[i];
                    if (lastComponent == null) {
                        lastComponent = project.getFolder(components[0]);
                    } else {
                        lastComponent = lastComponent.getFolder(componentName);
                    }
                    if (!lastComponent.exists()) {
                        lastComponent.create(false, true, null);
                    }
                }
                final IFile file = lastComponent.getFile(moduleName.getLastComponent() + ".cal");
                file.create(getInitialContents(moduleName), false, null);
                return file;
            } else {
                final int indexOfSecondDot = containerNameString.indexOf(".", indexOfFirstSlash + 1);
                String sourceFolderName;
                if (indexOfSecondDot != -1) {
                    sourceFolderName = containerNameString.substring(indexOfFirstSlash + 1, indexOfSecondDot);
                    moduleNameString = containerNameString.substring(indexOfSecondDot + 1) + "."
                            + moduleNameText.getText();
                } else {
                    sourceFolderName = containerNameString.substring(indexOfFirstSlash + 1);
                    moduleNameString = moduleNameText.getText();
                }

                final IFolder CALFolder = initializeCALContainer(project.getFolder(sourceFolderName));
                final ModuleName moduleName = ModuleName.make(moduleNameString);
                final String[] moduleNameComponents = moduleName.getComponents();
                final int justBeforeLastComponent = moduleNameComponents.length - 1;

                // Make sure that the component paths exists as folders
                IFolder lastComponent = CALFolder;
                for (int i = 0; i < justBeforeLastComponent; ++i) {
                    final String componentName = moduleNameComponents[i];
                    lastComponent = lastComponent.getFolder(componentName);
                    if (!lastComponent.exists()) {
                        lastComponent.create(false, true, null);
                    }
                }

                final IFile file = lastComponent.getFile(moduleName.getLastComponent() + ".cal");
                file.create(getInitialContents(moduleName), false, null);

                return file;
            }
        }

        /**
         * Get the initial contents of the new module
         */
        private InputStream getInitialContents(ModuleName moduleName) {
            String initialContents = "module " + moduleName.toSourceText() + ";\n" + "\n"
                    + "import Cal.Core.Prelude;\n" + "\n";
            return new ByteArrayInputStream(initialContents.getBytes());
        }

        /**
         * Create a CAL folder if none exists
         */
        private IFolder initializeCALContainer(IFolder srcFolder) throws CoreException {
            IFolder CALFolder = srcFolder.getFolder(CALSourcePathMapper.SCRIPTS_BASE_FOLDER);
            if (!CALFolder.exists()) {
                CALFolder.create(false, true, null);
            }
            return CALFolder;
        }

        /**
         * The content provider for the list of container that the module can be put in.
         */
        private class TreeContentProvider implements IStructuredContentProvider, ITreeContentProvider {
            IWorkspaceRoot workspace;

            public Object[] getElements(Object inputElement) {
                IProject[] projects = workspace.getProjects();
                ArrayList<IJavaProject> javaProjects = new ArrayList<IJavaProject>();
                for (int i = 0; i < projects.length; ++i) {
                    final IProject project = projects[i];
                    try {
                        if (isJavaProject(project)) {
                            //                          javaProjects.add(project);
                            javaProjects.add(JavaCore.create(project));
                        }
                    } catch (CoreException e) {
                        // no doesn't have the nature
                    }
                }
                return javaProjects.toArray();
            }

            public void dispose() {
            }

            /* (non-Javadoc)
             * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
             */
            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
                workspace = (IWorkspaceRoot) newInput;
            }

            /* (non-Javadoc)
             * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
             */
            public Object[] getChildren(Object parentElement) {
                if (parentElement instanceof IJavaProject) {
                    final IJavaProject project = (IJavaProject) parentElement;
                    try {
                        final IJavaElement[] javaElements = project.getChildren();
                        final ArrayList<IPackageFragmentRoot> sourceFolders = new ArrayList<IPackageFragmentRoot>();
                        for (int i = 0; i < javaElements.length; ++i) {
                            final IJavaElement javaElement = javaElements[i];
                            if (javaElement instanceof IPackageFragmentRoot) {
                                final IPackageFragmentRoot folder = (IPackageFragmentRoot) javaElement;
                                if (folder.getJavaProject() == folder.getParent() && !folder.isArchive()
                                        && folder.getElementName().length() != 0) {
                                    if (isJavaSourceFolder(folder)) {
                                        sourceFolders.add(folder);
                                    }
                                }
                            }
                        }
                        return sourceFolders.toArray();
                    } catch (CoreException e) {
                        return new Object[0];
                    }
                } else if (parentElement instanceof IProject) {
                    final IProject project = (IProject) parentElement;
                    try {
                        IResource[] allMembers = project.members();
                        ArrayList<IResource> folders = new ArrayList<IResource>();
                        for (int i = 0; i < allMembers.length; ++i) {
                            IResource member = allMembers[i];
                            if (member instanceof IFolder) {
                                IFolder memberFolder = (IFolder) member;
                                if (isJavaSourceFolder(memberFolder)) {
                                    folders.add(member);
                                }
                            }
                        }
                        return folders.toArray();
                    } catch (CoreException e) {
                        return new Object[0];
                    }
                } else if (parentElement instanceof IFolder) {
                    final IFolder folder = (IFolder) parentElement;
                    IFolder CALFolder = folder;
                    if (folder.getParent() instanceof IProject) {
                        CALFolder = folder.getFolder("CAL");
                        if (CALFolder == null || !CALFolder.exists()) {
                            return new Object[0];
                        }
                    }

                    try {
                        IResource[] allMembers = CALFolder.members();
                        ArrayList<IFolder> folders = new ArrayList<IFolder>();
                        for (int i = 0; i < allMembers.length; ++i) {
                            IResource member = allMembers[i];
                            if (member instanceof IFolder) {
                                IFolder memberFolder = (IFolder) member;
                                // Only add paths that are valid hierachical component names.
                                if (LanguageInfo.isValidModuleNameComponent(memberFolder.getName())) {
                                    folders.add(memberFolder);
                                }
                            }
                        }
                        return folders.toArray();
                    } catch (CoreException e) {
                        return new Object[0];
                    }
                } else if (parentElement instanceof IPackageFragmentRoot) {
                    final IPackageFragmentRoot pfr = (IPackageFragmentRoot) parentElement;

                    final IFolder folder = (IFolder) pfr.getResource();

                    IFolder CALFolder = folder;
                    if (pfr.getParent() instanceof IJavaProject) {
                        CALFolder = folder.getFolder("CAL");
                        if (CALFolder == null || !CALFolder.exists()) {
                            return new Object[0];
                        }
                    }

                    try {
                        IResource[] allMembers = CALFolder.members();
                        ArrayList<IFolder> folders = new ArrayList<IFolder>();
                        for (int i = 0; i < allMembers.length; ++i) {
                            IResource member = allMembers[i];
                            if (member instanceof IFolder) {
                                IFolder memberFolder = (IFolder) member;
                                // Only add paths that are valid hierachical component names.
                                if (LanguageInfo.isValidModuleNameComponent(memberFolder.getName())) {
                                    folders.add(memberFolder);
                                }
                            }
                        }
                        return folders.toArray();
                    } catch (CoreException e) {
                        return new Object[0];
                    }
                }

                return new Object[0];
            }

            /* (non-Javadoc)
             * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
             */
            public boolean hasChildren(Object element) {
                return getChildren(element).length > 0;
            }

            /* (non-Javadoc)
             * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
             */
            public Object getParent(Object element) {
                if (element instanceof IJavaProject || element instanceof IProject) {
                    return workspace;
                } else if (element instanceof IPackageFragmentRoot) {
                    return ((IPackageFragmentRoot) element).getJavaProject();
                } else if (element instanceof IFolder) {
                    final IFolder parentFolder = (IFolder) ((IFolder) element).getParent();
                    if (parentFolder.getName().equals("CAL")) {
                        return JavaCore.create(parentFolder.getParent());
                    } else {
                        return parentFolder;
                    }
                } else if (element instanceof IPackageFragment) {
                    return ((IPackageFragment) element).getParent();
                } else {
                    return null;
                }
            }
        }

        /**
         * The label provider for the list of containers that the module can be put in.
         */
        public class TreeLabelProvider extends LabelProvider {
            /* (non-Javadoc)
             * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
             */
            @Override
            public String getText(Object element) {
                if (element instanceof IJavaProject) {
                    return ((IJavaProject) element).getElementName();
                } else if (element instanceof IProject) {
                    return ((IProject) element).getName();
                } else if (element instanceof IFolder) {
                    return ((IFolder) element).getName();
                } else if (element instanceof IPackageFragmentRoot) {
                    IPackageFragmentRoot pfr = (IPackageFragmentRoot) element;
                    return pfr.getPath().removeFirstSegments(1).toString();
                }
                return element.toString();
            }

            /* (non-Javadoc)
             * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
             */
            @Override
            public Image getImage(Object element) {
                if (element instanceof IProject) {
                    String imageKey = SharedImages.IMG_OBJ_PROJECT;
                    return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
                } else if (element instanceof IJavaProject) {
                    String imageKey = SharedImages.IMG_OBJ_PROJECT;
                    return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
                } else if (element instanceof IFolder) {
                    IFolder folder = (IFolder) element;
                    if (folder.getParent() instanceof IProject) {
                        String imageKey = ISharedImages.IMG_OBJ_FOLDER;
                        return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
                    } else {
                        if (image_nav_namespace == null) {
                            image_nav_namespace = CALEclipseUIPlugin.getImageDescriptor("/icons/nav_namespace.png")
                                    .createImage();
                        }
                        return image_nav_namespace;
                    }
                } else if (element instanceof IPackageFragmentRoot) {
                    //                    IPackageFragmentRoot folder = (IPackageFragmentRoot) element;
                    //                    if (folder.getParent() instanceof IProject){ 
                    String imageKey = ISharedImages.IMG_OBJ_FOLDER;
                    return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
                    //                    }
                    //                    else{
                    //                        if (image_nav_namespace == null){
                    //                            image_nav_namespace = CALEclipseUIPlugin.getImageDescriptor("/icons/nav_namespace.png").createImage();
                    //                        }
                    //                        return image_nav_namespace;
                    //                    }
                }

                assert false;
                return null;
            }
        }

        /* (non-Javadoc)
         * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
         */
        public void modifyText(ModifyEvent arg0) {
            this.getContainer().updateButtons();
        }

        /* (non-Javadoc)
         * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
         */
        @Override
        public boolean isPageComplete() {
            return validatePage();
        }

        private String getName(Object treeElement) {
            if (treeElement instanceof IJavaProject) {
                IJavaProject project = (IJavaProject) treeElement;
                return project.getProject().getName();
            } else if (treeElement instanceof IProject) {
                return ((IProject) treeElement).getName();
            } else if (treeElement instanceof IPackageFragmentRoot) {
                IPackageFragmentRoot pfr = (IPackageFragmentRoot) treeElement;
                final String projectName = pfr.getJavaProject().getProject().getName();
                final String folderName = pfr.getPath().removeFirstSegments(1).toString();
                return projectName + "/" + folderName;

            } else if (treeElement instanceof IPackageFragment) {
                final IPackageFragment packageFragment = (IPackageFragment) treeElement;
                final String name = packageFragment.getElementName();
                final IPackageFragmentRoot folder = (IPackageFragmentRoot) packageFragment.getParent();
                if (folder.getJavaProject() == folder.getParent() && !folder.isArchive()) {
                    final String projectName = folder.getJavaProject().getProject().getName();
                    final String folderName;
                    if (folder.getResource() == folder.getJavaProject().getProject()) {
                        folderName = "";
                    } else {
                        folderName = "/" + folder.getElementName();
                    }
                    final int startOfSlash = name.indexOf("/");
                    String componentNames = "";
                    if (startOfSlash != -1) {
                        componentNames = "." + name.substring(startOfSlash + 1);
                    }
                    return projectName + folderName + componentNames;
                } else {
                    return "";
                }
            } else if (treeElement instanceof IContainer) {
                StringBuilder sb = new StringBuilder();
                IContainer container = (IContainer) treeElement;
                // Separator for package names is '/'
                String separator = ".";
                while (true) {
                    final Object next;
                    if (container.getName().equals("CAL")) {
                        // Separator for java packages is '/'
                        separator = "/";
                        next = container.getParent();
                    } else {
                        sb.insert(0, container.getName());
                        next = container.getParent();
                        if (next instanceof IProject) {
                            sb.insert(0, "/");
                            break;
                        } else {
                            sb.insert(0, separator);
                        }
                    }

                    // This is not a place that CAL Files can be put so use the project
                    if (container == null) {
                        return getName(((IContainer) treeElement).getProject());
                    } else if (next instanceof IContainer) {
                        container = (IContainer) next;
                    } else {
                        // something wicked this way comes
                        assert false;
                        return getName(((IContainer) treeElement).getProject());
                    }
                }
                sb.insert(0, container.getProject().getName());
                return sb.toString();
            } else {
                return "";
            }

        }

        /* (non-Javadoc)
         * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
         */
        public void createControl(Composite parent) {
            Composite topLevel = new Composite(parent, SWT.NONE);
            topLevel.setLayout(new GridLayout());
            topLevel.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
            topLevel.setFont(parent.getFont());

            Label containerNameLabel = new Label(topLevel, 0);
            containerNameLabel.setText(CALUIMessages.CALNewModuleWizard_containerNameLabel);
            containerNameLabel.setFont(parent.getFont());

            containerNameText = new Text(topLevel, SWT.BORDER);
            containerNameText.addModifyListener(this);
            containerNameText.setFont(parent.getFont());
            containerNameText
                    .setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));

            {
                treeViewer = new TreeViewer(topLevel, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
                treeViewer.addSelectionChangedListener(this);
                treeViewer.setContentProvider(new TreeContentProvider());
                treeViewer.setLabelProvider(new TreeLabelProvider());
                treeViewer.setInput(workspaceRoot);
                treeViewer.getControl().setFont(parent.getFont());
                treeViewer.getControl().setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL
                        | GridData.GRAB_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_VERTICAL));
            }

            Label moduleNameLabel = new Label(topLevel, 0);
            moduleNameLabel.setText(CALUIMessages.CALNewModuleWizard_moduleNameLabel);
            moduleNameLabel.setFont(parent.getFont());

            moduleNameText = new Text(topLevel, SWT.BORDER);
            moduleNameText.addModifyListener(this);
            moduleNameText.setFont(parent.getFont());
            moduleNameText.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));

            // Figure out what the current selection corresponds to
            {
                final ISelection selection = getSelection();
                Object selectedObject = null;
                if (selection instanceof TreeSelection) {
                    final TreeSelection treeSelection = (TreeSelection) selection;
                    if (!treeSelection.isEmpty()) {
                        selectedObject = treeSelection.getFirstElement();
                    }
                } else if (selection instanceof StructuredSelection) {
                    final StructuredSelection structureSelection = (StructuredSelection) selection;
                    selectedObject = structureSelection.getFirstElement();
                }

                if (selectedObject != null) {
                    setTreeSelection(selectedObject);
                }
            }

            // all done, finish up
            setErrorMessage(null);
            setMessage(null);
            setControl(topLevel);

            // if the container name is valid set the focus to the module name
            {
                Object[] validateMessage = getValidateMessage();
                if (validateMessage != null && ((Boolean) validateMessage[0]).booleanValue()) {
                    moduleNameText.setFocus();
                }
            }
        }

        private void setTreeSelection(Object selectedObject) {
            if (selectedObject instanceof IJavaProject) {
                containerNameText.setText(getName(selectedObject));
                // Set current selection
                {
                    // If there is a valid source folder then initialize
                    // the container with the first source folder in the 
                    // project.
                    IJavaProject project = (IJavaProject) selectedObject;
                    try {
                        for (IJavaElement je : project.getChildren()) {
                            if (je instanceof IPackageFragmentRoot) {
                                setTreeSelection(je);
                                return;
                            }
                        }
                    } catch (JavaModelException e) {
                        // No biggie, use the default of selecting the current project.
                    }
                    final Object[] pathObjects = new Object[2];
                    pathObjects[0] = workspaceRoot;
                    pathObjects[1] = project;
                    treeViewer.setSelection(new TreeSelection(new TreePath(pathObjects)));
                }
            } else if (selectedObject instanceof IPackageFragmentRoot) {
                final IPackageFragmentRoot pfr = (IPackageFragmentRoot) selectedObject;
                if (pfr.getJavaProject() == pfr.getParent() && !pfr.isArchive()) {
                    if (pfr.getResource() instanceof IFolder) {
                        containerNameText.setText(getName(selectedObject));

                        // Set current selection
                        {
                            final Object[] pathObjects = new Object[3];
                            pathObjects[0] = workspaceRoot;
                            pathObjects[1] = pfr.getJavaProject();
                            pathObjects[2] = pfr;
                            treeViewer.setSelection(new TreeSelection(new TreePath(pathObjects)));
                        }
                    } else if (pfr.getResource() instanceof IProject) {
                        containerNameText.setText(getName(pfr.getJavaProject()));

                        // Set current selection
                        {
                            final Object[] pathObjects = new Object[2];
                            pathObjects[0] = workspaceRoot;
                            pathObjects[1] = pfr.getJavaProject();
                            treeViewer.setSelection(new TreeSelection(new TreePath(pathObjects)));
                        }
                    }
                } else {
                    containerNameText.setText(getName(pfr.getJavaProject()));

                    // Set current selection
                    {
                        final Object[] pathObjects = new Object[1];
                        pathObjects[0] = workspaceRoot;
                        treeViewer.setSelection(new TreeSelection(new TreePath(pathObjects)));
                    }
                }
            } else if (selectedObject instanceof IFolder) {
                final IFolder folder = (IFolder) selectedObject;
                containerNameText.setText(getName(folder.getProject()));

                IJavaElement javaElement = JavaCore.create(folder);
                // If the navigator is used to invoke the new module
                // wizard then the current selection will not be a java
                // element. But if the folder corresponds to a java element
                // then initialize the dialog using that. Otherwise just initialize 
                // the container with the current package.
                if (javaElement != null) {
                    setTreeSelection(javaElement);
                } else {
                    // Set selection in tree viewer
                    final ArrayList<IAdaptable> pathObjects = new ArrayList<IAdaptable>();
                    pathObjects.add(workspaceRoot);
                    {
                        IJavaProject javaProject = JavaCore.create(folder.getProject());
                        if (javaProject != null) {
                            pathObjects.add(javaProject);
                        }
                    }

                    treeViewer.setSelection(new TreeSelection(new TreePath(pathObjects.toArray())));
                }
            } else if (selectedObject instanceof IProject) {
                final IProject project = (IProject) selectedObject;
                final IJavaElement javaElement = JavaCore.create(project);
                // If the navigator is used to invoke the new module
                // wizard then the current selection will not be a java
                // element. But if the project corresponds to a java element
                // then initialize the dialog using that. 
                if (javaElement != null) {
                    setTreeSelection(javaElement);
                } else {
                    // no valid initialization possible
                }
            } else if (selectedObject instanceof IFile) {
                final IFile file = (IFile) selectedObject;
                containerNameText.setText(getName(file.getProject()));

                // Set selection in tree viewer
                {
                    final ArrayList<IAdaptable> pathObjects = new ArrayList<IAdaptable>();
                    pathObjects.add(workspaceRoot);
                    {
                        IJavaProject javaProject = JavaCore.create(file.getProject());
                        if (javaProject != null) {
                            pathObjects.add(javaProject);
                        }
                    }

                    treeViewer.setSelection(new TreeSelection(new TreePath(pathObjects.toArray())));
                }
            } else if (selectedObject instanceof IPackageFragment) {
                final IPackageFragment packageFragment = (IPackageFragment) selectedObject;
                final String name = packageFragment.getElementName();
                final String[] components = name.split("\\.", 0);
                if (components[0].equals("CAL")) {
                    final IPackageFragmentRoot packageFragmentRoot = (IPackageFragmentRoot) packageFragment
                            .getParent();
                    if (packageFragmentRoot.getJavaProject() == packageFragmentRoot.getParent()
                            && !packageFragmentRoot.isArchive()) {
                        containerNameText.setText(getName(selectedObject));

                        // Set current selection
                        {
                            final ArrayList<IAdaptable> pathObjects = new ArrayList<IAdaptable>();
                            pathObjects.add(workspaceRoot);
                            pathObjects.add(packageFragmentRoot.getJavaProject());
                            if (packageFragmentRoot.getResource() instanceof IFolder) {
                                pathObjects.add(packageFragmentRoot);
                            }
                            {
                                IFolder folder = null;

                                if (packageFragmentRoot.getResource() instanceof IFolder) {
                                    folder = ((IFolder) packageFragmentRoot.getResource()).getFolder("CAL");
                                } else if (packageFragmentRoot.getResource() instanceof IProject) {
                                    folder = ((IProject) packageFragmentRoot.getResource()).getFolder("CAL");
                                } else {
                                    // skip this
                                }

                                if (folder != null) {
                                    if (folder == null || !folder.exists()) {
                                        // cannot go deeper
                                    } else {
                                        for (int iC = 1; iC < components.length; ++iC) {
                                            final String componentName = components[iC];
                                            if (LanguageInfo.isValidModuleNameComponent(componentName)) {
                                                folder = folder.getFolder(componentName);
                                                pathObjects.add(folder);
                                            }
                                        }
                                    }
                                }
                            }
                            treeViewer.setSelection(new TreeSelection(new TreePath(pathObjects.toArray())));
                        }
                    }
                }
            } else {
            }
        }

        private String getModuleName() {
            return moduleNameText.getText();
        }

        /**
         * @return true if all the entries on the current page are valid otherwise the error message is set and false is returned
         */
        protected boolean validatePage() {
            setErrorMessage(null);
            Object[] result = getValidateMessage();
            if (result != null) {
                String message = (String) result[1];
                setErrorMessage(message);
                return false;
            }
            return true;
        }

        /**
         * @return an array where the first element is a boolean that is true if the container is valid
         * and false when it is not. The second element is the error message. If there is no problem
         * then null is returned.
         */
        private Object[] getValidateMessage() {
            // Project not null check
            {
                String containerNameString = containerNameText.getText();
                if (containerNameString.length() == 0) {
                    return new Object[] { Boolean.valueOf(false),
                            CALUIMessages.CALNewModuleWizard_error_containerNameMustNotBeNull };
                }
            }

            {
                IProject project;
                try {
                    project = getProject();
                } catch (IllegalArgumentException e) {
                    return new Object[] { Boolean.valueOf(false), e.toString() };
                }
                if (project == null || !project.exists()) {
                    return new Object[] { Boolean.valueOf(false),
                            CALUIMessages.CALNewModuleWizard_error_containerMustHaveProjectName };
                }

                final String containerNameString = containerNameText.getText();
                // first component is the project name
                // the second is the source folders
                // the third are any hierarchical components
                final String sourceFolders;
                final String hierarchicalComponents;
                {
                    int indexOfFirstSlash = containerNameString.indexOf('/');
                    if (indexOfFirstSlash == -1) {
                        int indexOfFirstDot = containerNameString.indexOf('.', indexOfFirstSlash);
                        if (indexOfFirstDot == -1) {
                            sourceFolders = "";
                            hierarchicalComponents = "";
                        } else {
                            sourceFolders = "";
                            hierarchicalComponents = containerNameString.substring(indexOfFirstDot + 1);
                        }
                        containerNameString.split("\\.");
                    } else {
                        int indexOfFirstDot = containerNameString.indexOf('.', indexOfFirstSlash);
                        if (indexOfFirstDot == -1) {
                            sourceFolders = containerNameString.substring(indexOfFirstSlash + 1);
                            hierarchicalComponents = "";
                        } else {
                            sourceFolders = containerNameString.substring(indexOfFirstSlash + 1, indexOfFirstDot);
                            hierarchicalComponents = containerNameString.substring(indexOfFirstDot + 1);
                        }
                        containerNameString.split("\\.");

                        // Check the source folder exists. This can happen when the project has no source folders
                        if (sourceFolders.length() == 0) {
                            final String message = CALUIMessages.CALNewModuleWizard_error_sourceFolderMustBeSpecified;
                            return new Object[] { Boolean.valueOf(false), message };
                        }

                        // Check the source folder exists
                        {
                            IJavaProject jProject = JavaCore.create(project);
                            try {
                                IFolder srcFolder = jProject.getProject().getFolder(sourceFolders);
                                if (!srcFolder.exists()) {
                                    final String message = Messages.format(
                                            CALUIMessages.CALNewModuleWizard_error_sourceFolderMustExist,
                                            new Object[] { srcFolder.getName() });
                                    return new Object[] { Boolean.valueOf(false), message };
                                }
                            } catch (IllegalArgumentException ex) {
                                // go on to the next test 
                            }
                        }
                    }
                }

                // Check the hierarchical component names for validity
                {
                    String[] components = hierarchicalComponents.split("\\.");
                    for (int i = 1; i < components.length; ++i) {
                        final String component = components[i];
                        if (!LanguageInfo.isValidModuleNameComponent(component)) {
                            final String message = Messages.format(
                                    CALUIMessages.CALNewModuleWizard_error_invalidContainerComponent,
                                    new Object[] { component });
                            return new Object[] { Boolean.valueOf(false), message };
                        }
                    }
                }
                // Split ignores trailing dots
                if (containerNameString.endsWith("/")) {
                    return new Object[] { Boolean.valueOf(false),
                            CALUIMessages.CALNewModuleWizard_error_noTrailingDot };
                }
            }

            // Check the module name
            {
                // does the name have valid structure

                if (!LanguageInfo.isValidModuleName(getModuleName())) {
                    return new Object[] { Boolean.valueOf(true),
                            CALUIMessages.CALNewModuleWizard_error_invalidModuleName };
                }

                final String moduleNameString = getModuleNameString();

                // Split ignores trailing dots
                if (moduleNameString.endsWith(".")) {
                    return new Object[] { Boolean.valueOf(true),
                            CALUIMessages.CALNewModuleWizard_error_invalidModuleName };
                }

                // make sure a module with this name does not exist
                {
                    final CALModelManager cmm = CALModelManager.getCALModelManager();
                    final ModuleName moduleName = ModuleName.make(moduleNameString);
                    final IStorage thisStorage = cmm.getInputSourceFile(moduleName);
                    if (thisStorage instanceof IFile) {
                        return new Object[] { Boolean.valueOf(true),
                                CALUIMessages.CALNewModuleWizard_error_moduleAlreadyExists };
                    }
                }
            }
            return null;
        }

        public void selectionChanged(SelectionChangedEvent event) {
            TreeSelection selection = (TreeSelection) event.getSelection();
            Object selectedElement = selection.getFirstElement();
            containerNameText.setText(getName(selectedElement));
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.wizard.Wizard#addPages()
     */
    @Override
    public void addPages() {
        super.addPages();
        // The new module page

        {
            mainPage = new WizardNewModuleCreationPage("newFilePage1", getSelection()) {
                //                protected String getNewFileLabel(){
                //                    return CALUIMessages.CALNewModuleWizard_newFileLabel;
                //                }            
            };
            mainPage.setTitle(CALUIMessages.CALNewModuleWizard_pageTitle);
            mainPage.setDescription(CALUIMessages.CALNewModuleWizard_description);
            addPage(mainPage);
        }
    }

    /* (non-Javadoc)
     * Method declared on BasicNewResourceWizard.
     */
    @Override
    protected void initializeDefaultPageImageDescriptor() {
        //       ImageDescriptor desc = CALEclipseUIPlugin.getImageDescriptor("/icons/nav_module.png");//$NON-NLS-1$
        //       setDefaultPageImageDescriptor(desc);
    }

    /* (non-Javadoc)
     * Method declared on IWizard.
     */
    @Override
    public boolean performFinish() {
        IFile file;
        try {
            file = mainPage.createNewFile();
        } catch (CoreException e) {
            // TODO Auto-generated catch block
            mainPage.setErrorMessage(e.getMessage());
            return false;
        }
        if (file == null) {
            return false;
        }

        IProject project = file.getProject();

        // Ensure the the project has the CAL Nature so that the builder will work on it.
        CoreUtility.turnOnNature(project);

        // For the src folder, ensure an exclude pattern for the lecc_runtime/ folder so that the package explorer isn't littered.
        CoreUtility.ensureLeccFolderSrcExclude(file);

        selectAndReveal(file);

        // Open editor on new file.
        IWorkbenchWindow dw = getWorkbench().getActiveWorkbenchWindow();
        try {
            if (dw != null) {
                IWorkbenchPage page = dw.getActivePage();
                if (page != null) {
                    IDE.openEditor(page, file, true);
                }
            }
        } catch (PartInitException e) {
            CoreUtility.showMessage(CALUIMessages.CALNewModuleWizard_errorTitle, e.getMessage(), IStatus.ERROR);
        }

        if (!CoreUtility.addReferenceToQuarkBinariesIfNeeded(project)) {
            CoreUtility.showMessage(CALUIMessages.CALNewModuleWizard_errorTitle,
                    CALUIMessages.CALNewModuleWizard_missingQuarkBinariesProject, IStatus.WARNING);
        }

        return true;
    }
}