org.whole.lang.ui.wizards.WholeModelWizardPage1.java Source code

Java tutorial

Introduction

Here is the source code for org.whole.lang.ui.wizards.WholeModelWizardPage1.java

Source

/**
 * Copyright 2004-2014 Riccardo Solmi. All rights reserved.
 * This file is part of the Whole Platform.
 *
 * The Whole Platform is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * The Whole Platform is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>.
 */
package org.whole.lang.ui.wizards;

import static org.whole.lang.ui.util.ResourceUtils.defineResourceBindings;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
import org.eclipse.ui.ide.IDE;
import org.whole.lang.codebase.IPersistenceKit;
import org.whole.lang.codebase.IPersistenceProvider;
import org.whole.lang.codebase.StringPersistenceProvider;
import org.whole.lang.e4.ui.E4CompatibilityPlugin;
import org.whole.lang.model.IEntity;
import org.whole.lang.reflect.ILanguageKit;
import org.whole.lang.reflect.ReflectionFactory;
import org.whole.lang.resources.IResourceRegistry;
import org.whole.lang.templates.ITemplateManager;
import org.whole.lang.util.ResourceUtils;
import org.whole.lang.util.StringUtils;

/**
 * @author Riccardo Solmi
 */
public class WholeModelWizardPage1 extends WizardNewFileCreationPage {
    private List<ILanguageKit> languageKits;
    private ITemplateManager templateFactory;
    private String[] templates;
    private List<IPersistenceKit> persistenceKits;

    private IWorkbench workbench;
    private static int exampleCount = 1;
    private Combo languageCombo;
    private Combo templateCombo;
    private Combo saveAsCombo;

    public WholeModelWizardPage1(IWorkbench aWorkbench, IStructuredSelection selection) {
        super("sampleModelPage1", selection);
        this.setTitle("Whole Model");
        this.setDescription("Create a new Whole Model");
        this.setImageDescriptor(ImageDescriptor.createFromFile(E4CompatibilityPlugin.class, "images/banner.png"));
        this.workbench = aWorkbench;
    }

    public void createControl(Composite parent) {
        super.createControl(parent);
        Composite composite = (Composite) getControl();

        Group group = new Group(composite, SWT.NONE);
        group.setLayout(new GridLayout());
        group.setText("Choose options");
        group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 2;
        group.setLayout(gridLayout);

        new Label(group, SWT.LEFT).setText("Language:");
        languageCombo = new Combo(group, SWT.DROP_DOWN | SWT.READ_ONLY);
        languageCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        new Label(group, SWT.LEFT).setText("Template:");
        templateCombo = new Combo(group, SWT.DROP_DOWN | SWT.READ_ONLY);
        templateCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        new Label(group, SWT.LEFT).setText("Save As:");
        saveAsCombo = new Combo(group, SWT.DROP_DOWN | SWT.READ_ONLY);
        saveAsCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        IResourceRegistry<ILanguageKit> registry = ReflectionFactory.getLanguageKitRegistry();
        languageKits = new ArrayList<ILanguageKit>(registry.getResources(false, ResourceUtils.SIMPLE_COMPARATOR));
        for (ILanguageKit languageKit : languageKits)
            languageCombo.add(ResourceUtils.SIMPLE_NAME_PROVIDER.toString(registry, languageKit));

        languageCombo.addSelectionListener(new SelectionListener() {
            public void widgetDefaultSelected(SelectionEvent e) {
            }

            public void widgetSelected(SelectionEvent e) {
                ILanguageKit languageKit = languageKits.get(languageCombo.getSelectionIndex());
                fireLanguageSelected(languageKit);
            }
        });
        languageCombo.select(0);
        ILanguageKit languageKit = languageKits.get(0);
        fireLanguageSelected(languageKit);

        saveAsCombo.addSelectionListener(new SelectionListener() {
            public void widgetDefaultSelected(SelectionEvent e) {
            }

            public void widgetSelected(SelectionEvent e) {
                String name = getFileName();
                name = StringUtils.replaceExtension(name, getPersistenceKit(saveAsCombo).getFileExtension());
                //TODO mediated by languageKit
                setFileName(name);
            }
        });

        setPageComplete(validatePage());
    }

    protected void fireLanguageSelected(ILanguageKit languageKit) {
        setFileName("ModelExample" + exampleCount + "." + languageKit.getDefaultFileExtension());

        templateFactory = languageKit.getTemplateManager();
        templates = templateFactory.names().toArray(new String[0]);
        templateCombo.setItems(templates);
        templateCombo.select(0);

        persistenceKits = new ArrayList<IPersistenceKit>(languageKit.getPersistenceKits());
        saveAsCombo.setItems(new String[0]);
        for (IPersistenceKit persistenceKit : persistenceKits)
            saveAsCombo.add(persistenceKit.getDescription());
        int selectionIndex = persistenceKits.indexOf(languageKit.getDefaultPersistenceKit());
        saveAsCombo.select(selectionIndex);
    }

    protected IFile fileHandle;

    protected IFile createFileHandle(IPath filePath) {
        return fileHandle = super.createFileHandle(filePath);
    }

    protected IPersistenceKit persistenceKit;

    protected InputStream getInitialContents() {
        IEntity model = templateFactory.create(templates[templateCombo.getSelectionIndex()]);
        persistenceKit = getPersistenceKit(saveAsCombo);

        try {
            IPersistenceProvider pp = new StringPersistenceProvider();
            defineResourceBindings(pp.getBindings(), fileHandle);
            persistenceKit.writeModel(model, pp);
            return pp.openInputStream();
        } catch (Exception e) {
            throw new IllegalStateException("error writing file contents", e);
        }
    }

    private IPersistenceKit getPersistenceKit(Combo saveAsCombo) {
        return persistenceKits.get(saveAsCombo.getSelectionIndex());
    }

    public boolean finish() {
        try {
            IFile newFile = createNewFile();

            String editorID = ReflectionFactory.getEditorIdFromPersistenceKit(persistenceKit);
            IDE.setDefaultEditor(newFile, editorID);

            IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
            IWorkbenchPage page = window.getActivePage();
            IDE.openEditor(page, newFile, true);

            exampleCount++;
            return true;
        } catch (Exception e) {
            E4CompatibilityPlugin.reportError(getShell(), "Create model error", "Unable to create a new model.", e);
            return false;
        }
    }
}