org.eclipse.xtend.shared.ui.wizards.XtendXpandProjectWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.xtend.shared.ui.wizards.XtendXpandProjectWizardPage.java

Source

/*******************************************************************************
 * Copyright (c) 2005, 2007 committers of openArchitectureWare and others.
 * 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:
 *     committers of openArchitectureWare - initial API and implementation
 *******************************************************************************/
package org.eclipse.xtend.shared.ui.wizards;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
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.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
import org.eclipse.xtend.shared.ui.Messages;
import org.eclipse.xtend.shared.ui.core.metamodel.Contributor;
import org.eclipse.xtend.shared.ui.core.metamodel.MetamodelContributorRegistry;
import org.eclipse.xtend.shared.ui.core.properties.MetamodelContributorsPropertyAndPreferencePage;

/**
 * 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 (xtxt).
 */
public class XtendXpandProjectWizardPage extends WizardPage {
    private Text projectText;

    private Button generateSimpleExample;
    private Button useWorkspaceDefinedMetaModels;
    private Button useProjectSpecificMetaModels;

    private Button downButton;
    private Button upButton;
    private List<Contributor> availableMetamodelContributors;
    private Table table;
    private Composite tableContainer;
    private CheckboxTableViewer checkboxTableViewer;
    private String storeString;

    public String getStoreString() {
        return storeString;
    }

    /**
     * Renders a human readable representation of the meta model contributors.
     */
    class TableLabelProvider extends LabelProvider implements ITableLabelProvider {
        public String getColumnText(final Object element, final int columnIndex) {
            if (element instanceof Contributor) {
                final Contributor contributor = (Contributor) element;
                return contributor.getDisplayName();
            }
            return element.toString();
        }

        public Image getColumnImage(final Object element, final int columnIndex) {
            return null;
        }
    }

    private List<Contributor> getMetamodelContributors(final boolean includeDisabled) {
        final Map<String, Contributor> availableMetamodelContributors = MetamodelContributorRegistry
                .getRegisteredMetamodelContributors();

        final List<Contributor> result = new ArrayList<Contributor>();

        if (includeDisabled) {
            for (final Contributor contributor : availableMetamodelContributors.values()) {
                if (!result.contains(contributor)) {
                    result.add(contributor);
                }
            }
        }

        return result;
    }

    private void updateButtonStates() {
        final int index = table.getSelectionIndex();
        if (index == 0) {
            upButton.setEnabled(false);
        } else {
            upButton.setEnabled(true);
        }
        if (index >= checkboxTableViewer.getTable().getItemCount() - 1) {
            downButton.setEnabled(false);
        } else {
            downButton.setEnabled(true);
        }
        storeString = MetamodelContributorsPropertyAndPreferencePage
                .createStoreString(checkboxTableViewer.getCheckedElements());
    }

    private void enableMetamodelContributorTable(final boolean enabled) {
        checkboxTableViewer.setAllGrayed(!enabled);
        checkboxTableViewer.getTable().deselectAll();
        tableContainer.setEnabled(enabled);
        upButton.setEnabled(enabled);
        downButton.setEnabled(enabled);
        if (enabled)
            updateButtonStates();
    }

    /**
     * Constructor for SampleNewWizardPage.
     * 
     * @param pageName
     */
    public XtendXpandProjectWizardPage() {
        super(Messages.XtendXpandProjectWizardPage_Name);
        setTitle(Messages.XtendXpandProjectWizardPage_Title);
        setDescription(Messages.XtendXpandProjectWizardPage_Description);
    }

    /**
     * @see IDialogPage#createControl(Composite)
     */
    public void createControl(Composite parent) {
        Composite container = new Composite(parent, SWT.NULL);
        GridLayout layout = new GridLayout();
        container.setLayout(layout);
        layout.numColumns = 2;
        layout.verticalSpacing = 9;
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);

        Label label = new Label(container, SWT.NULL);
        label.setText(Messages.XtendXpandProjectWizardPage_ProjectLabel);

        projectText = new Text(container, SWT.BORDER | SWT.SINGLE);
        gd = new GridData(GridData.FILL_HORIZONTAL);
        projectText.setLayoutData(gd);
        projectText.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                dialogChanged();
            }
        });

        final Group mm_list = new Group(container, SWT.SHADOW_IN);
        layout = new GridLayout();
        layout.numColumns = 2;
        layout.marginHeight = 0;
        layout.horizontalSpacing = 0;
        layout.marginWidth = 0;
        mm_list.setLayout(layout);
        gd = new GridData();
        gd.horizontalSpan = 2;
        gd.horizontalAlignment = SWT.FILL;
        gd.grabExcessHorizontalSpace = true;
        gd.verticalAlignment = SWT.FILL;
        gd.grabExcessVerticalSpace = true;
        mm_list.setLayoutData(gd);
        mm_list.setText("Meta Models");

        useWorkspaceDefinedMetaModels = new Button(mm_list, SWT.RADIO);
        label = new Label(mm_list, SWT.NULL);
        label.setText("Use workspace defaults");

        useProjectSpecificMetaModels = new Button(mm_list, SWT.RADIO);
        label = new Label(mm_list, SWT.NULL);
        label.setText("Use project specific metamodels:");

        tableContainer = new Composite(mm_list, SWT.NULL);
        gd = new GridData();
        gd.horizontalSpan = 2;
        gd.horizontalIndent = 22;
        layout = new GridLayout();
        layout.numColumns = 2;
        layout.marginHeight = 0;
        layout.horizontalSpacing = 0;
        layout.marginWidth = 0;
        tableContainer.setLayoutData(gd);
        tableContainer.setLayout(layout);

        checkboxTableViewer = CheckboxTableViewer.newCheckList(tableContainer, SWT.BORDER);
        checkboxTableViewer.setLabelProvider(new TableLabelProvider());
        checkboxTableViewer.setContentProvider(new ArrayContentProvider());
        table = checkboxTableViewer.getTable();
        table.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                updateButtonStates();
                dialogChanged();
            }

        });
        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        final Composite composite = new Composite(tableContainer, SWT.NONE);
        composite.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, false, false));
        final GridLayout gridLayout_1 = new GridLayout();
        composite.setLayout(gridLayout_1);

        upButton = new Button(composite, SWT.NONE);
        upButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                final ISelection selection = checkboxTableViewer.getSelection();
                if (selection instanceof IStructuredSelection) {
                    final IStructuredSelection structuredSelection = (IStructuredSelection) selection;
                    final Object firstElement = structuredSelection.getFirstElement();
                    if (firstElement instanceof Contributor) {
                        final Contributor contributor = (Contributor) firstElement;
                        final int index = availableMetamodelContributors.indexOf(contributor);
                        availableMetamodelContributors.remove(contributor);
                        availableMetamodelContributors.add(index - 1, contributor);
                        checkboxTableViewer.refresh();
                    }
                }
                updateButtonStates();
            }
        });
        final GridData gridData_1 = new GridData(SWT.FILL, SWT.CENTER, false, false);
        gridData_1.widthHint = 75;
        upButton.setLayoutData(gridData_1);
        upButton.setText(Messages.MetamodelContributorsPropertyAndPreferencePage_UpButton);

        downButton = new Button(composite, SWT.NONE);
        downButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                final ISelection selection = checkboxTableViewer.getSelection();
                if (selection instanceof IStructuredSelection) {
                    final IStructuredSelection structuredSelection = (IStructuredSelection) selection;
                    final Object firstElement = structuredSelection.getFirstElement();
                    if (firstElement instanceof Contributor) {
                        final Contributor contributor = (Contributor) firstElement;
                        final int index = availableMetamodelContributors.indexOf(contributor);
                        availableMetamodelContributors.remove(contributor);
                        availableMetamodelContributors.add(index + 1, contributor);
                        checkboxTableViewer.refresh();
                    }
                }
                updateButtonStates();
            }
        });
        final GridData gridData = new GridData(SWT.FILL, SWT.CENTER, false, false);
        gridData.widthHint = 75;
        downButton.setLayoutData(gridData);
        downButton.setText(Messages.MetamodelContributorsPropertyAndPreferencePage_DownButton);

        generateSimpleExample = new Button(mm_list, SWT.RADIO);
        label = new Label(mm_list, SWT.NULL);
        label.setText("Generate a sample EMF based Xpand project");

        generateSimpleExample.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(SelectionEvent e) {
                dialogChanged();
                enableMetamodelContributorTable(false);
            }

            public void widgetSelected(SelectionEvent e) {
                dialogChanged();
                enableMetamodelContributorTable(false);
            }

        });

        useWorkspaceDefinedMetaModels.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(SelectionEvent e) {
                dialogChanged();
                enableMetamodelContributorTable(false);
            }

            public void widgetSelected(SelectionEvent e) {
                dialogChanged();
                enableMetamodelContributorTable(false);
            }

        });

        useProjectSpecificMetaModels.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(SelectionEvent e) {
                dialogChanged();
                enableMetamodelContributorTable(true);
            }

            public void widgetSelected(SelectionEvent e) {
                dialogChanged();
                enableMetamodelContributorTable(true);
            }

        });

        setupData();
        initialize();
        dialogChanged();
        setControl(container);
    }

    /**
     * Fills the table viewer with a list of available metamodel contributors
     * and visually checks the ones that are enabled.
     */
    private void setupData() {
        availableMetamodelContributors = getMetamodelContributors(true);
        checkboxTableViewer.setInput(availableMetamodelContributors);

        final Collection<Contributor> enabledMetamodelContributors = getMetamodelContributors(false);
        checkboxTableViewer.setCheckedElements(enabledMetamodelContributors.toArray());

    }

    /**
     * Tests if the current workbench selection is a suitable container to use.
     */

    private void initialize() {
        projectText.setText(Messages.XtendXpandProjectWizardPage_DefaultFileName);
        tableContainer.setEnabled(false);
        useWorkspaceDefinedMetaModels.setSelection(true);
    }

    /**
     * Ensures that both text fields are set.
     */
    void dialogChanged() {

        if (projectText.getText().trim().length() == 0) {
            setErrorMessage(Messages.XtendXpandProjectWizardPage_ProjectName_Error);
            return;
        }
        if (useProjectSpecificMetaModels.getSelection() && checkboxTableViewer.getCheckedElements().length == 0) {
            setErrorMessage(Messages.XtendXpandProjectWizardPage_NoMMSelected_Error);
            return;
        }
        setErrorMessage(null);
        setPageComplete(true);
    }

    public String getProjectName() {
        return projectText.getText();
    }

    public boolean isCreateExample() {
        return generateSimpleExample.getSelection();
    }

    public boolean isUseWorkspaceDefinedMM() {
        return useWorkspaceDefinedMetaModels.getSelection();
    }

    public boolean isProjectSpecificMM() {
        return useProjectSpecificMetaModels.getSelection();
    }
}