org.eclipselabs.spray.xtext.ui.wizard.SprayWizardNewProjectCreationPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipselabs.spray.xtext.ui.wizard.SprayWizardNewProjectCreationPage.java

Source

/** ****************************************************************************
 * Copyright (c)  The Spray Project.
 * 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:
 *     Spray Dev Team - initial API and implementation
 **************************************************************************** */
package org.eclipselabs.spray.xtext.ui.wizard;

import java.net.URL;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.PojoObservables;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
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.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.WizardNewProjectCreationPage;
import org.eclipse.wb.swt.ResourceManager;
import org.eclipselabs.spray.xtext.ui.internal.SprayActivator;

public class SprayWizardNewProjectCreationPage extends WizardNewProjectCreationPage {
    private DataBindingContext m_bindingContext;
    // constants; same as in super class
    private static final int SIZING_TEXT_FIELD_WIDTH = 250;

    // widgets
    Text diagramTypeNameField;
    Text projectNameField;
    MetamodelSelectionComposite metamodelSelectionComposite;

    private SprayProjectInfo projectInfo;

    public SprayWizardNewProjectCreationPage(String pageName) {
        super(pageName);
        setImageDescriptor(ResourceManager.getPluginImageDescriptor("org.eclipselabs.spray.xtext.ui",
                "icons/Spray-Logo-Project-Wizard.png"));
    }

    @Override
    public void createControl(Composite parent) {
        //        Composite c = new Composite(parent, SWT.NULL);
        //        c.setLayout(new GridLayout());
        super.createControl(parent);

        Composite clientComposite = parent.getChildren().length > 0
                ? (Composite) parent.getChildren()[parent.getChildren().length - 1]
                : parent;
        //        if (clientComposite == null)
        //        clientComposite = parent;
        projectNameField = getProjectNameField(clientComposite);
        clientComposite.setLayout(new GridLayout(1, true));

        createSprayGroup(clientComposite);
        metamodelSelectionComposite = new MetamodelSelectionComposite(clientComposite, SWT.NONE, getProjectInfo());
        GridData gd = new GridData();
        gd.grabExcessHorizontalSpace = true;
        SprayActivator.getInstance().getInjector("org.eclipselabs.spray.xtext.Spray")
                .injectMembers(metamodelSelectionComposite);
        //        Composite verticalFiller = new Composite(clientComposite, SWT.NULL);
        //        GridData gd_verticalFiller = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1);
        //        gd_verticalFiller.heightHint = 140;
        //        verticalFiller.setLayoutData(gd_verticalFiller);
        setDeriveDiagramTypeFromProjectName(true);
        m_bindingContext = initDataBindings();

        setPageComplete(false);

        addPageCompleteListeners();
    }

    private void createSprayGroup(Composite parent) {
        // project specification group
        Composite group = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        group.setLayout(layout);
        group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        final Button btnTakeLastSegment = new Button(group, SWT.CHECK);
        btnTakeLastSegment.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
        btnTakeLastSegment.setSelection(true);
        btnTakeLastSegment.setText("Take last segment from project name");

        Label lblDiagramName = new Label(group, SWT.NONE);
        lblDiagramName.setText("Diagram type name:");

        // new project name entry field
        diagramTypeNameField = new Text(group, SWT.BORDER);
        diagramTypeNameField.setEnabled(false);
        GridData data = new GridData(GridData.FILL_HORIZONTAL);
        data.grabExcessHorizontalSpace = false;
        data.widthHint = 100;
        diagramTypeNameField.setLayoutData(data);
        diagramTypeNameField.setFont(parent.getFont());

        btnTakeLastSegment.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                setDeriveDiagramTypeFromProjectName(btnTakeLastSegment.getSelection());
            }
        });
    }

    /**
     * Returns the value of the diagram type field
     * with leading and trailing spaces removed.
     * 
     * @return the project name in the field
     */
    private String getProjectNameFieldValue() {
        if (diagramTypeNameField == null) {
            return ""; //$NON-NLS-1$
        }

        return diagramTypeNameField.getText().trim();
    }

    @Override
    public Image getImage() {
        URL url = null;
        url = SprayActivator.getInstance().getBundle().getEntry("/icons/Spray-Logo-Project-Wizard.png");
        ImageDescriptor imgDesc = ImageDescriptor.createFromURL(url);
        Image img = imgDesc.createImage(true);
        return img;
    }

    public SprayProjectInfo getProjectInfo() {
        return projectInfo;
    }

    public void setProjectInfo(SprayProjectInfo projectInfo) {
        this.projectInfo = projectInfo;
    }

    private Text getProjectNameField(Composite parent) {
        Composite c = parent;
        while (c.getChildren().length > 0 && c.getChildren()[0] instanceof Composite) {
            c = (Composite) c.getChildren()[0];
        }
        Text projectNameField = (Text) c.getChildren()[1];
        return projectNameField;
    }

    final ModifyListener modifyListener = new ModifyListener() {
        @Override
        public void modifyText(ModifyEvent e) {
            String lastSegment = getProjectName().indexOf('.') > 0
                    ? getProjectName().substring(getProjectName().lastIndexOf('.') + 1)
                    : getProjectName();
            diagramTypeNameField.setText(lastSegment);
        }
    };

    protected void setDeriveDiagramTypeFromProjectName(boolean derive) {
        if (projectNameField == null || diagramTypeNameField == null)
            return;
        if (derive) {
            String lastSegment = getProjectName().indexOf('.') > 0
                    ? getProjectName().substring(getProjectName().lastIndexOf('.') + 1)
                    : getProjectName();
            diagramTypeNameField.setEnabled(false);
            diagramTypeNameField.setText(lastSegment);
            projectNameField.addModifyListener(modifyListener);
        } else {
            diagramTypeNameField.setEnabled(true);
            projectNameField.removeModifyListener(modifyListener);
        }
    }

    private void addPageCompleteListeners() {
        ModifyListener listener = new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                setPageComplete(metamodelSelectionComposite.isComplete());
            }
        };
        metamodelSelectionComposite.getTxtUri().addModifyListener(listener);
        metamodelSelectionComposite.getTxtGenmodelUri().addModifyListener(listener);
        metamodelSelectionComposite.getTxtModelType().addModifyListener(listener);
        metamodelSelectionComposite.getTxtFileExtension().addModifyListener(listener);
    }

    protected DataBindingContext initDataBindings() {
        DataBindingContext bindingContext = new DataBindingContext();
        //
        IObservableValue diagramTypeNameFieldObserveTextObserveWidget = SWTObservables
                .observeText(diagramTypeNameField, SWT.Modify);
        IObservableValue projectInfoDiagramTypeNameObserveValue = PojoObservables.observeValue(projectInfo,
                "diagramTypeName");
        bindingContext.bindValue(diagramTypeNameFieldObserveTextObserveWidget,
                projectInfoDiagramTypeNameObserveValue, null, null);
        //
        IObservableValue projectNameFieldTextObserveValue = PojoObservables.observeValue(projectNameField, "text");
        IObservableValue projectInfoProjectNameObserveValue = PojoObservables.observeValue(projectInfo,
                "projectName");
        bindingContext.bindValue(projectNameFieldTextObserveValue, projectInfoProjectNameObserveValue, null, null);
        //
        return bindingContext;
    }
}