com.ebmwebsourcing.petals.studio.dev.properties.internal.wizards.GenerateConstantsWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for com.ebmwebsourcing.petals.studio.dev.properties.internal.wizards.GenerateConstantsWizardPage.java

Source

/******************************************************************************
 * Copyright (c) 2009-2013, Linagora
 *
 * All rights reserved. This program and the accompanying materials
 * are 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:
 *       Linagora - initial API and implementation
 *******************************************************************************/

package com.ebmwebsourcing.petals.studio.dev.properties.internal.wizards;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
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.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;

import com.ebmwebsourcing.petals.studio.dev.properties.internal.PetalsStudioDevPlugin;
import com.ebmwebsourcing.petals.studio.dev.properties.internal.Utils;

/**
 * The only required page to create a new 'jbi.xml' file.
 * @author Vincent Zurczak - EBM WebSourcing
 */
public class GenerateConstantsWizardPage extends WizardPage {

    private IPackageFragmentRoot target;
    private final IProject originalSelection;
    private String javaPackage, className;

    /**
     * Constructor.
     * @param project
     */
    public GenerateConstantsWizardPage(IProject project) {
        super("MainPage");
        this.originalSelection = project;
        setTitle("Constants Generation");
        setDescription("Generate a Java class with model constants.");
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.dialogs.IDialogPage
     * #createControl(org.eclipse.swt.widgets.Composite)
     */
    @Override
    public void createControl(Composite parent) {

        // Create the composite container and define its layout
        final Composite container = new Composite(parent, SWT.NONE);
        GridLayoutFactory.swtDefaults().extendedMargins(15, 15, 15, 10).numColumns(2).applyTo(container);
        container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        // Container viewer
        Label l = new Label(container, SWT.NONE);
        l.setText("Select the output directory to generate the Java constants.");
        GridDataFactory.swtDefaults().span(2, 1).applyTo(l);

        TreeViewer viewer = new TreeViewer(container, SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL | SWT.HIDE_SELECTION);
        GridData layoutData = new GridData(GridData.FILL_BOTH);
        layoutData.heightHint = 100;
        layoutData.horizontalSpan = 2;
        viewer.getTree().setLayoutData(layoutData);
        viewer.setLabelProvider(new WorkbenchLabelProvider());
        viewer.setContentProvider(new WorkbenchContentProvider() {

            /*
             * (non-Javadoc)
             * @see org.eclipse.ui.model.BaseWorkbenchContentProvider
             * #getChildren(java.lang.Object)
             */
            @Override
            public Object[] getChildren(Object o) {

                List<Object> children = new ArrayList<Object>();
                try {
                    if (o instanceof IJavaProject) {
                        for (IPackageFragmentRoot root : ((IJavaProject) o).getPackageFragmentRoots()) {
                            if (root.getResource() instanceof IContainer)
                                children.add(root);
                        }

                    } else if (o instanceof IWorkspaceRoot) {
                        for (IProject p : ((IWorkspaceRoot) o).getProjects()) {
                            if (!p.isAccessible() || !p.hasNature(JavaCore.NATURE_ID))
                                continue;

                            IJavaProject jp = JavaCore.create(p);
                            if (jp != null)
                                children.add(jp);
                        }
                    }

                } catch (CoreException e) {
                    PetalsStudioDevPlugin.log(e, IStatus.ERROR);
                }

                return children.toArray(new Object[0]);
            }

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

        // Set page input
        viewer.setInput(ResourcesPlugin.getWorkspace().getRoot());
        if (this.originalSelection != null) {
            try {
                IJavaProject jp = JavaCore.create(this.originalSelection);
                for (IPackageFragmentRoot root : jp.getPackageFragmentRoots()) {
                    if (root.getResource() instanceof IContainer) {
                        GenerateConstantsWizardPage.this.target = root;
                        break;
                    }
                }

            } catch (JavaModelException e) {
                PetalsStudioDevPlugin.log(e, IStatus.ERROR, "This should not happen (check in the handler).");
            }
        }

        if (this.target != null) {
            viewer.setSelection(new StructuredSelection(this.target), true);
            viewer.expandToLevel(this.target, 1);
            viewer.getTree().notifyListeners(SWT.Selection, new Event());
        }

        // Java meta
        new Label(container, SWT.NONE).setText("Java Package:");
        final Text packageText = new Text(container, SWT.SINGLE | SWT.BORDER);
        packageText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        packageText.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                GenerateConstantsWizardPage.this.javaPackage = ((Text) e.widget).getText().trim();
                validate();
            }
        });

        new Label(container, SWT.NONE).setText("Java Class Name:");
        final Text classText = new Text(container, SWT.SINGLE | SWT.BORDER);
        classText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        classText.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                GenerateConstantsWizardPage.this.className = ((Text) e.widget).getText().trim();
                validate();
            }
        });

        // Add the missing listeners
        viewer.addPostSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {

                Object o = ((IStructuredSelection) event.getSelection()).getFirstElement();
                if (o instanceof IPackageFragmentRoot) {

                    GenerateConstantsWizardPage.this.target = (IPackageFragmentRoot) o;
                    String pName = GenerateConstantsWizardPage.this.target.getJavaProject().getProject().getName();
                    packageText.setText(pName.replaceAll("-", ".") + ".generated");

                    int index = pName.lastIndexOf('.') + 1;
                    if (index <= 0 || index > pName.length())
                        pName = "Default";
                    else
                        pName = pName.substring(index);
                    classText.setText(pName);

                } else {
                    GenerateConstantsWizardPage.this.target = null;
                }
            }
        });

        // Set control
        setControl(container);
    }

    /**
     * Validates the page entries.
     */
    private void validate() {

        String errorMsg = null;
        if (this.target == null)
            errorMsg = "You must select a source folder to generate the code.";
        else if (Utils.isEmpty(this.javaPackage))
            errorMsg = "You must specify a Java package name.";
        else if (Utils.isEmpty(this.className))
            errorMsg = "You must specify a Java class name.";

        setErrorMessage(errorMsg);
        setPageComplete(errorMsg == null);
    }

    /**
     * @return the javaPackage
     */
    public String getJavaPackage() {
        return this.javaPackage;
    }

    /**
     * @return the className
     */
    public String getClassName() {
        return this.className;
    }

    /**
     * @return the target
     */
    public IPackageFragmentRoot getTarget() {
        return this.target;
    }
}