org.eclipse.xtext.ui.wizard.template.NewProjectWizardTemplateSelectionPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.xtext.ui.wizard.template.NewProjectWizardTemplateSelectionPage.java

Source

/*******************************************************************************
 * Copyright (c) 2017, 2018 itemis AG (http://www.itemis.de) 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
 *******************************************************************************/
package org.eclipse.xtext.ui.wizard.template;

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

import org.apache.log4j.Logger;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ISelection;
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.TableViewer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
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.ui.forms.widgets.FormText;

import com.google.common.annotations.Beta;

/**
 * Page of the new project wizard to present a list of templates to the user. The user can select a template and press finish. If the
 * template is configurable the variables can be configured in the following page, the {@link TemplateParameterPage}.
 * 
 * @author Arne Deutsch - Initial contribution and API
 * @since 2.14
 */
@Beta
public class NewProjectWizardTemplateSelectionPage extends WizardPage {

    private static final String PROJECT_TEMPLATE_PROVIDER_EXTENSION_POINT_ID = "org.eclipse.xtext.ui.projectTemplate"; //$NON-NLS-1$
    private static final String PROJECT_TEMPLATE_PROVIDER_ID = "projectTemplateProvider"; //$NON-NLS-1$
    private static final String PROJECT_TEMPLATE_PROVIDER_GRAMMAR_NAME_ATTRIBUTE = "grammarName"; //$NON-NLS-1$
    private static final String PROJECT_TEMPLATE_PROVIDER_GRAMMAR_CLASS_ATTRIBUTE = "class"; //$NON-NLS-1$

    private static final Logger logger = Logger.getLogger(NewProjectWizardTemplateSelectionPage.class);

    private TemplateLabelProvider labelProvider;
    private AbstractProjectTemplate selectedTemplate;
    private String grammarName;

    public NewProjectWizardTemplateSelectionPage(String pageName, String grammarName,
            TemplateLabelProvider labelProvider) {
        super(pageName);
        this.grammarName = grammarName;
        this.labelProvider = labelProvider;
    }

    @Override
    public void createControl(Composite parent) {
        Composite main = new Composite(parent, SWT.NONE);
        main.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        main.setLayout(new GridLayout(1, false));

        Label availableTemplatesLabel = new Label(main, SWT.NONE);
        availableTemplatesLabel.setText(Messages.NewProjectWizardTemplateSelectionPage_available_templates);
        availableTemplatesLabel.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, true, false));

        SashForm sash = new SashForm(main, SWT.HORIZONTAL);
        GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
        data.widthHint = 400;
        sash.setLayoutData(data);

        TableViewer templateTable = new TableViewer(sash, SWT.BORDER);
        templateTable.setContentProvider(new ArrayContentProvider());
        templateTable.setLabelProvider(labelProvider);
        templateTable.setInput(loadTemplatesFromExtensionPoint());

        FormText text = new FormText(sash, SWT.BORDER);
        text.setText("", false, false); //$NON-NLS-1$
        text.setBackground(templateTable.getTable().getBackground());

        templateTable.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                ISelection selection = event.getSelection();
                if (selection instanceof IStructuredSelection) {
                    IStructuredSelection structuredSelection = (IStructuredSelection) selection;
                    Object element = structuredSelection.getFirstElement();
                    if (element instanceof AbstractProjectTemplate) {
                        selectedTemplate = (AbstractProjectTemplate) element;
                        setPageComplete(true);
                        String content = "<form>" + selectedTemplate.getDescription() + "</form>"; //$NON-NLS-1$ //$NON-NLS-2$
                        try {
                            text.setText(content, true, true);
                        } catch (Exception e) {
                            text.setText(e.getMessage(), false, false);
                        }
                    } else {
                        selectedTemplate = null;
                        text.setText("", false, false); //$NON-NLS-1$
                        setPageComplete(false);
                    }
                } else {
                    selectedTemplate = null;
                    text.setText("", false, false); //$NON-NLS-1$
                    setPageComplete(false);
                }
            }
        });

        templateTable.setSelection(new StructuredSelection(templateTable.getElementAt(0)));

        setControl(main);
    }

    private AbstractProjectTemplate[] loadTemplatesFromExtensionPoint() {
        List<AbstractProjectTemplate> result = new ArrayList<>();
        for (IConfigurationElement element : Platform.getExtensionRegistry()
                .getConfigurationElementsFor(PROJECT_TEMPLATE_PROVIDER_EXTENSION_POINT_ID)) {
            if (PROJECT_TEMPLATE_PROVIDER_ID.equals(element.getName())
                    && grammarName.equals(element.getAttribute(PROJECT_TEMPLATE_PROVIDER_GRAMMAR_NAME_ATTRIBUTE))) {
                try {
                    IProjectTemplateProvider provider = (IProjectTemplateProvider) element
                            .createExecutableExtension(PROJECT_TEMPLATE_PROVIDER_GRAMMAR_CLASS_ATTRIBUTE);
                    result.addAll(Arrays.asList(provider.getProjectTemplates()));
                } catch (CoreException e) {
                    logger.error(
                            "Can not instantiate '" //$NON-NLS-1$
                                    + element.getAttribute(PROJECT_TEMPLATE_PROVIDER_GRAMMAR_CLASS_ATTRIBUTE) + "'", //$NON-NLS-1$
                            e);
                }
            }
        }
        return result.toArray(new AbstractProjectTemplate[0]);
    }

    public AbstractProjectTemplate getSelectedTemplate() {
        return selectedTemplate;
    }

}