org.entirej.ide.ui.wizards.form.NewEntireJFormPage.java Source code

Java tutorial

Introduction

Here is the source code for org.entirej.ide.ui.wizards.form.NewEntireJFormPage.java

Source

/*******************************************************************************
 * Copyright 2013 Mojave Innovations GmbH
 * 
 * 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.
 * 
 * Contributors:
 *     Mojave Innovations GmbH - initial API and implementation
 ******************************************************************************/
package org.entirej.ide.ui.wizards.form;

import java.net.URI;
import java.util.ArrayList;
import java.util.List;

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.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.ui.IJavaElementSearchConstants;
import org.eclipse.jdt.ui.wizards.NewTypeWizardPage;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.IWizard;
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.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.entirej.framework.core.actionprocessor.EJDefaultFormActionProcessor;
import org.entirej.framework.core.actionprocessor.interfaces.EJFormActionProcessor;
import org.entirej.framework.dev.EJDevConstants;
import org.entirej.framework.plugin.framework.properties.EJPluginFormProperties;
import org.entirej.framework.plugin.framework.properties.EJPluginRenderer;
import org.entirej.framework.plugin.framework.properties.EntirejPluginPropertiesEnterpriseEdition;
import org.entirej.framework.plugin.framework.properties.EntirejPropertiesUtils;
import org.entirej.framework.plugin.framework.properties.writer.FormPropertiesWriter;
import org.entirej.framework.plugin.preferences.EJPropertyRetriever;
import org.entirej.ide.core.EJCoreLog;
import org.entirej.ide.ui.EJUIPlugin;
import org.entirej.ide.ui.utils.JavaAccessUtils;
import org.entirej.ide.ui.wizards.NewWizard;

public class NewEntireJFormPage extends NewTypeWizardPage {

    public static String P_FORM_HEIGHT = "FORM_HEIGHT";
    public static String P_FORM_WIDTH = "FORM_WIDTH";
    private String formTitle;

    protected IStatus fFormRendererStatus = new Status(IStatus.OK, EJUIPlugin.getID(), null);
    protected IStatus fFormTitleStatus = new Status(IStatus.OK, EJUIPlugin.getID(), null);

    private EJPluginRenderer formRenderer;

    private ComboViewer formRenderersViewer;

    public NewEntireJFormPage() {
        super(false, "ej.form");
    }

    /**
     * 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) {
        IJavaElement jelem = getInitialJavaElement(selection);
        initContainerPage(jelem);
        initTypePage(jelem);
        doStatusUpdate();

        setSuperClass(EJDefaultFormActionProcessor.class.getName(), true);
    }

    private void doStatusUpdate() {
        // status of all used components
        IStatus[] status = new IStatus[] { fContainerStatus, fPackageStatus, fTypeNameStatus, fFormRendererStatus,
                fFormTitleStatus };

        // the mode severe status will be displayed and the OK button
        // enabled/disabled.
        updateStatus(status);
    }

    protected void handleFieldChanged(String fieldName) {
        super.handleFieldChanged(fieldName);

        doStatusUpdate();
    }

    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);
        createSeparator(composite, nColumns);
        createTypeNameControls(composite, nColumns);
        createFormTitleControls(composite, nColumns);
        createFormRendererControls(composite, nColumns);
        createSuperClassControls(composite, nColumns);
        setControl(composite);
        Dialog.applyDialogFont(composite);
    }

    public String getTitleText() {
        return formTitle;
    }

    @Override
    protected String getTypeNameLabel() {
        return "Form Name:";
    }

    @Override
    protected String getSuperClassLabel() {
        return "Action Processor:";
    }

    protected IType chooseSuperClass() {
        IJavaProject project = getJavaProject();
        if (project == null) {
            return null;
        }

        return JavaAccessUtils.selectType(getShell(), project.getResource(),
                IJavaElementSearchConstants.CONSIDER_CLASSES, getSuperClass(),
                EJFormActionProcessor.class.getName());
    }

    private void createFormTitleControls(Composite composite, int nColumns) {
        Label formTitleLabel = new Label(composite, SWT.NULL);
        formTitleLabel.setText("Form Title:");
        GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
        gd.horizontalSpan = 1;
        formTitleLabel.setLayoutData(gd);
        final Text formTitleText = new Text(composite, SWT.BORDER | SWT.SINGLE);

        gd = new GridData();
        gd.horizontalAlignment = GridData.FILL;
        gd.grabExcessHorizontalSpace = false;
        gd.horizontalSpan = 2;
        formTitleText.setLayoutData(gd);
        formTitleText.addModifyListener(new ModifyListener() {

            public void modifyText(ModifyEvent e) {
                formTitle = formTitleText.getText();
                fFormTitleStatus = formTitleChanged();
                doStatusUpdate();
            }
        });
        fFormTitleStatus = formTitleChanged();
        createEmptySpace(composite, 1);
    }

    private void createFormRendererControls(Composite composite, int nColumns) {
        Label formTitleLabel = new Label(composite, SWT.NULL);
        formTitleLabel.setText("Form Renderer:");
        GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
        gd.horizontalSpan = 1;
        formTitleLabel.setLayoutData(gd);
        formRenderersViewer = new ComboViewer(composite);

        gd = new GridData();
        gd.horizontalAlignment = GridData.FILL;
        gd.grabExcessHorizontalSpace = false;
        gd.horizontalSpan = 2;
        formRenderersViewer.getCombo().setLayoutData(gd);
        formRenderersViewer.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof EJPluginRenderer) {
                    EJPluginRenderer renderer = ((EJPluginRenderer) element);
                    return String.format("%s", renderer.getAssignedName(), renderer.getRendererClassName());
                }
                return super.getText(element);
            }

        });

        formRenderersViewer.setContentProvider(new IStructuredContentProvider() {

            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            }

            public void dispose() {
            }

            public Object[] getElements(Object inputElement) {
                List<EJPluginRenderer> renderers = new ArrayList<EJPluginRenderer>();

                IJavaProject project = getJavaProject();
                if (project != null) {
                    try {

                        EntirejPluginPropertiesEnterpriseEdition entirejProperties = EntirejPropertiesUtils
                                .retrieveEntirejProperties(project);
                        renderers.addAll(entirejProperties.getFormRendererContainer().getAllRenderers());
                    } catch (CoreException e) {
                        fFormRendererStatus = new Status(IStatus.ERROR, EJUIPlugin.getID(), e.getMessage());
                        doStatusUpdate();
                    }
                }

                return renderers.toArray();
            }
        });

        formRenderersViewer.addSelectionChangedListener(new ISelectionChangedListener() {

            public void selectionChanged(SelectionChangedEvent event) {

                if (formRenderersViewer.getSelection() instanceof IStructuredSelection)
                    formRenderer = (EJPluginRenderer) ((IStructuredSelection) formRenderersViewer.getSelection())
                            .getFirstElement();

                fFormRendererStatus = formRendererChanged();
                doStatusUpdate();
            }
        });
        createEmptySpace(composite, 1);
        refreshFormRenderers();
    }

    public void refreshFormRenderers() {
        if (formRenderersViewer != null) {
            formRenderersViewer.setInput(new Object());
            formRenderersViewer.getCombo().select(-1);
            if (formRenderersViewer.getCombo().getItemCount() > 0
                    && formRenderersViewer.getCombo().getSelectionIndex() == -1) {
                formRenderersViewer.getCombo().select(0);
                if (formRenderersViewer.getSelection() instanceof IStructuredSelection)
                    formRenderer = (EJPluginRenderer) ((IStructuredSelection) formRenderersViewer.getSelection())
                            .getFirstElement();
            }
            fFormRendererStatus = formRendererChanged();
            doStatusUpdate();
        }
    }

    protected IStatus typeNameChanged() {

        String typeName = getTypeName();
        // must not be empty
        if (typeName.length() == 0) {
            return new Status(IStatus.ERROR, EJUIPlugin.getID(), "Form name is empty.");
        }

        IStatus result = ResourcesPlugin.getWorkspace().validateName(typeName, IResource.FILE);
        if (!result.isOK()) {
            return result;
        }

        IPackageFragment packageFragment = getPackageFragment();

        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();

        IFolder folder = root.getFolder(packageFragment.getPath());
        final IFile formFile = folder
                .getFile(new Path(typeName + "." + EJDevConstants.FORM_PROPERTIES_FILE_SUFFIX));
        if (folder.exists() && formFile.exists()) {

            return new Status(IStatus.ERROR, EJUIPlugin.getID(), "Form already exists.");

        }

        URI location = formFile.getLocationURI();
        if (location != null) {
            try {
                IFileStore store = EFS.getStore(location);
                if (store.fetchInfo().exists()) {
                    return new Status(IStatus.ERROR, EJUIPlugin.getID(),
                            "Form with same name but different case exists.");
                }
            } catch (CoreException e) {
                new Status(IStatus.ERROR, EJUIPlugin.getID(), e.getMessage());
            }
        }

        return new Status(IStatus.OK, EJUIPlugin.getID(), "");
    }

    protected IStatus formTitleChanged() {

        String typeName = getTitleText();
        // must not be empty
        if (typeName == null || typeName.length() == 0) {
            return new Status(IStatus.ERROR, EJUIPlugin.getID(), "Form title is empty.");
        }

        return new Status(IStatus.OK, EJUIPlugin.getID(), "");
    }

    @Override
    protected IStatus containerChanged() {
        refreshFormRenderers();
        return super.containerChanged();
    }

    protected IStatus formRendererChanged() {
        IJavaProject javaProject = getJavaProject();
        if (javaProject != null) {
            try {
                EntirejPropertiesUtils.varifyEntirejProperties(javaProject);
            } catch (CoreException e) {
                return new Status(IStatus.ERROR, EJUIPlugin.getID(), e.getMessage());
            }
        }
        if (formRenderer == null) {
            return new Status(IStatus.ERROR, EJUIPlugin.getID(), "Please choose a form renderer.");
        }
        return new Status(IStatus.OK, EJUIPlugin.getID(), "");
    }

    public void setFormName(String fname) {
        setTypeName(fname, true);

    }

    public static Control createEmptySpace(Composite parent, int span) {
        Label label = new Label(parent, SWT.LEFT);
        GridData gd = new GridData();
        gd.horizontalAlignment = GridData.BEGINNING;
        gd.grabExcessHorizontalSpace = false;
        gd.horizontalSpan = span;
        gd.horizontalIndent = 0;
        gd.widthHint = 0;
        gd.heightHint = 0;
        label.setLayoutData(gd);
        return label;
    }

    public void createForm(IConfigurationElement configElement, IProgressMonitor monitor) {
        try {
            IJavaProject project = getJavaProject();
            if (project != null) {
                IPackageFragment packageFragment = getPackageFragment();
                String formName = getTypeName();

                // create a sample file
                monitor.beginTask("Creating Form " + formName, 2);
                IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();

                IFolder folder = root.getFolder(packageFragment.getPath());
                if (!folder.exists()) {
                    folder.create(false, true, monitor);
                }

                final IFile formFile = folder
                        .getFile(new Path(formName + "." + EJDevConstants.FORM_PROPERTIES_FILE_SUFFIX));

                String formTitle = getTitleText();
                String rendererName = formRenderer.getAssignedName();
                String actionProcessor = getSuperClass();

                EJPluginFormProperties formProperties = new EJPluginFormProperties(formName, project);
                formProperties.setFormRendererName(rendererName);
                formProperties.setFormTitle(formTitle);
                if (actionProcessor != null && actionProcessor.length() > 0) {
                    formProperties.setActionProcessorClassName(actionProcessor);
                }

                int height = EJPropertyRetriever.getIntValue(project.getProject(), P_FORM_HEIGHT);
                int width = EJPropertyRetriever.getIntValue(project.getProject(), P_FORM_WIDTH);

                formProperties.setFormHeight(height);
                formProperties.setFormWidth(width);
                formProperties.setNumCols(1);

                FormPropertiesWriter writer = new FormPropertiesWriter();
                writer.saveForm(formProperties, formFile, monitor);
                folder.refreshLocal(IResource.DEPTH_ONE, monitor);
                getShell().getDisplay().asyncExec(new Runnable() {
                    public void run() {
                        IWizard iWizard = getWizard();
                        if (iWizard instanceof NewWizard) {
                            NewWizard wizard = (NewWizard) iWizard;
                            wizard.selectAndReveal(formFile);
                            wizard.openResource(formFile);
                        }
                    }
                });
            }

        } catch (Exception e) {
            EJCoreLog.logException(e);
        }
    }
}