org.eclipse.e4.internal.tools.wizards.project.E4NewProjectWizard.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.e4.internal.tools.wizards.project.E4NewProjectWizard.java

Source

/*******************************************************************************
 * Copyright (c) 2006, 2013 Soyatec(http://www.soyatec.com) 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:
 *     Soyatec - initial API and implementation
 *     IBM Corporation - ongoing enhancements
 *     Sopot Cela - ongoing enhancements
 *     Lars Vogel - ongoing enhancements
 *     Wim Jongman - ongoing enhancements
 *******************************************************************************/
package org.eclipse.e4.internal.tools.wizards.project;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.e4.ui.model.application.MAddon;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.MApplicationFactory;
import org.eclipse.e4.ui.model.application.commands.MBindingContext;
import org.eclipse.e4.ui.model.application.commands.MBindingTable;
import org.eclipse.e4.ui.model.application.commands.MCommand;
import org.eclipse.e4.ui.model.application.commands.MCommandsFactory;
import org.eclipse.e4.ui.model.application.commands.MHandler;
import org.eclipse.e4.ui.model.application.commands.MKeyBinding;
import org.eclipse.e4.ui.model.application.ui.advanced.MAdvancedFactory;
import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective;
import org.eclipse.e4.ui.model.application.ui.advanced.MPerspectiveStack;
import org.eclipse.e4.ui.model.application.ui.basic.MBasicFactory;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.model.application.ui.basic.MPartSashContainer;
import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
import org.eclipse.e4.ui.model.application.ui.basic.MTrimBar;
import org.eclipse.e4.ui.model.application.ui.basic.MTrimmedWindow;
import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem;
import org.eclipse.e4.ui.model.application.ui.menu.MHandledToolItem;
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
import org.eclipse.e4.ui.model.application.ui.menu.MMenuFactory;
import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.pde.core.build.IBuildEntry;
import org.eclipse.pde.core.plugin.IMatchRules;
import org.eclipse.pde.core.plugin.IPluginElement;
import org.eclipse.pde.core.plugin.IPluginExtension;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.core.plugin.IPluginReference;
import org.eclipse.pde.internal.core.ICoreConstants;
import org.eclipse.pde.internal.core.build.WorkspaceBuildModel;
import org.eclipse.pde.internal.core.bundle.WorkspaceBundlePluginModel;
import org.eclipse.pde.internal.core.plugin.WorkspacePluginModelBase;
import org.eclipse.pde.internal.core.project.PDEProject;
import org.eclipse.pde.internal.core.util.CoreUtility;
import org.eclipse.pde.internal.ui.PDEPlugin;
import org.eclipse.pde.internal.ui.PDEUIMessages;
import org.eclipse.pde.internal.ui.wizards.IProjectProvider;
import org.eclipse.pde.internal.ui.wizards.plugin.NewPluginProjectWizard;
import org.eclipse.pde.internal.ui.wizards.plugin.NewProjectCreationOperation;
import org.eclipse.pde.internal.ui.wizards.plugin.PluginFieldData;
import org.eclipse.pde.ui.IBundleContentWizard;
import org.eclipse.pde.ui.IFieldData;
import org.eclipse.pde.ui.templates.PluginReference;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.FileEditorInput;
import org.osgi.framework.Bundle;
import org.osgi.framework.Version;

/**
 * @author jin.liu (jin.liu@soyatec.com)
 */
public class E4NewProjectWizard extends NewPluginProjectWizard {

    private static final String PLUGIN_XML = "plugin.xml";
    private static final String MODEL_EDITOR_ID = "org.eclipse.e4.tools.emf.editor3x.e4wbm";
    private static final String APPLICATION_MODEL = "Application.e4xmi";
    private PluginFieldData fPluginData;
    private NewApplicationWizardPage fApplicationPage;
    private IProjectProvider fProjectProvider;
    private PluginContentPage fContentPage;
    private boolean isMinimalist;

    public E4NewProjectWizard() {
        fPluginData = new PluginFieldData();
    }

    @Override
    public void addPages() {
        fMainPage = new E4NewProjectWizardPage("main", fPluginData, false, getSelection()); //$NON-NLS-1$
        fMainPage.setTitle(PDEUIMessages.NewProjectWizard_MainPage_title);
        fMainPage.setDescription(PDEUIMessages.NewProjectWizard_MainPage_desc);
        String pname = getDefaultValue(DEF_PROJECT_NAME);
        if (pname != null)
            fMainPage.setInitialProjectName(pname);
        addPage(fMainPage);

        fProjectProvider = new IProjectProvider() {
            public String getProjectName() {
                return fMainPage.getProjectName();
            }

            public IProject getProject() {
                return fMainPage.getProjectHandle();
            }

            public IPath getLocationPath() {
                return fMainPage.getLocationPath();
            }
        };

        fContentPage = new PluginContentPage("page2", fProjectProvider, fMainPage, fPluginData); //$NON-NLS-1$

        fApplicationPage = new NewApplicationWizardPage(fProjectProvider, fPluginData);

        addPage(fContentPage);
        addPage(fApplicationPage);
    }

    @Override
    @SuppressWarnings("restriction")
    public boolean performFinish() {
        try {
            fMainPage.updateData();
            fContentPage.updateData();
            IDialogSettings settings = getDialogSettings();
            if (settings != null) {
                fMainPage.saveSettings(settings);
                fContentPage.saveSettings(settings);
            }

            // Create the project
            getContainer().run(false, true,
                    new NewProjectCreationOperation(fPluginData, fProjectProvider, new ContentWizard()) {
                        private WorkspacePluginModelBase model;

                        @Override
                        protected void setPluginLibraries(WorkspacePluginModelBase model) throws CoreException {
                            this.model = model;
                            super.setPluginLibraries(model);
                        }
                    });

            // Add Project to working set
            IWorkingSet[] workingSets = fMainPage.getSelectedWorkingSets();
            if (workingSets.length > 0)
                getWorkbench().getWorkingSetManager().addToWorkingSets(fProjectProvider.getProject(), workingSets);

            this.createProductsExtension(fProjectProvider.getProject());

            this.createApplicationResources(fProjectProvider.getProject(), new NullProgressMonitor());

            // Add the resources to build.properties
            adjustBuildPropertiesFile(fProjectProvider.getProject());

            // Open the model editor
            openEditorForApplicationModel();

            return true;
        } catch (InvocationTargetException e) {
            PDEPlugin.logException(e);
        } catch (InterruptedException e) {
        } catch (CoreException e) {
            PDEPlugin.logException(e);
        }
        return false;
    }

    /**
     * Opens the model editor after the project was created.
     * 
     * @throws PartInitException
     */
    private void openEditorForApplicationModel() throws PartInitException {
        IFile file = fProjectProvider.getProject().getFile(APPLICATION_MODEL);
        if (file != null) {
            FileEditorInput input = new FileEditorInput(file);
            IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
            IWorkbenchPage page = window.getActivePage();
            page.openEditor(input, MODEL_EDITOR_ID);
        }
    }

    /**
     * Adds other resources to the build.properties file.
     * 
     * @param project
     * @throws CoreException
     */
    private void adjustBuildPropertiesFile(IProject project) throws CoreException {
        IFile file = PDEProject.getBuildProperties(project);
        if (file.exists()) {
            WorkspaceBuildModel model = new WorkspaceBuildModel(file);
            IBuildEntry e = model.getBuild().getEntry(IBuildEntry.BIN_INCLUDES);

            e.addToken(PLUGIN_XML);
            e.addToken(APPLICATION_MODEL);

            // Event though an icons directory is always created
            // it seems appropriate to only add it if it contains
            // some content
            if (!isMinimalist) {
                e.addToken("icons/");
            }

            Map<String, String> map = fApplicationPage.getData();
            String cssEntry = map.get(NewApplicationWizardPage.APPLICATION_CSS_PROPERTY);
            if (cssEntry != null) {
                e.addToken(cssEntry);
            }

            model.save();
        }
    }

    /**
     * create products extension detail
     * 
     * @param project
     */
    @SuppressWarnings("restriction")
    public void createProductsExtension(IProject project) {
        Map<String, String> map = fApplicationPage.getData();
        if (map == null || map.get(NewApplicationWizardPage.PRODUCT_NAME) == null)
            return;

        WorkspacePluginModelBase fmodel = new WorkspaceBundlePluginModel(
                project.getFile(ICoreConstants.BUNDLE_FILENAME_DESCRIPTOR),
                project.getFile(ICoreConstants.PLUGIN_FILENAME_DESCRIPTOR));
        IPluginExtension extension = fmodel.getFactory().createExtension();
        try {
            String productName = map.get(NewApplicationWizardPage.PRODUCT_NAME);
            String applicationName = map.get(NewApplicationWizardPage.APPLICATION);

            String cssValue = map.get(NewApplicationWizardPage.APPLICATION_CSS_PROPERTY);
            if (cssValue != null) {
                cssValue = "platform:/plugin/" + fPluginData.getId() + "/" + cssValue;
                map.put(NewApplicationWizardPage.APPLICATION_CSS_PROPERTY, cssValue);
            }

            extension.setPoint("org.eclipse.core.runtime.products");
            extension.setId("product");
            IPluginElement productElement = fmodel.getFactory().createElement(extension);

            productElement.setName("product");
            if (applicationName != null) {
                productElement.setAttribute("application", applicationName);
            } else {
                productElement.setAttribute("application", NewApplicationWizardPage.E4_APPLICATION);
            }
            productElement.setAttribute("name", productName);

            Set<Entry<String, String>> set = map.entrySet();
            if (set != null) {
                Iterator<Entry<String, String>> it = set.iterator();
                if (it != null) {
                    while (it.hasNext()) {
                        Entry<String, String> entry = it.next();
                        String value = entry.getValue();
                        if (value == null || value.trim().length() == 0) {
                            continue;
                        }

                        if (entry.getKey().equals(NewApplicationWizardPage.PRODUCT_NAME)
                                || entry.getKey().equals(NewApplicationWizardPage.APPLICATION)
                                || entry.getKey().equals(NewApplicationWizardPage.richSample)
                                || entry.getKey().equals(NewApplicationWizardPage.CLEAR_PERSISTED_STATE)) {
                            continue;
                        }
                        IPluginElement element = fmodel.getFactory().createElement(productElement);
                        element.setName("property");
                        element.setAttribute("name", entry.getKey());
                        element.setAttribute("value", value);
                        productElement.add(element);
                    }
                }
            }
            extension.add(productElement);
            fmodel.getPluginBase().add(extension);
            fmodel.save();

        } catch (CoreException e) {
            PDEPlugin.logException(e);
        }
    }

    /**
     * create products extension detail
     * 
     * @param project
     */
    @SuppressWarnings("restriction")
    public void createApplicationResources(IProject project, IProgressMonitor monitor) {
        Map<String, String> map = fApplicationPage.getData();
        isMinimalist = !map.get(NewApplicationWizardPage.richSample).equalsIgnoreCase("TRUE");
        if (map == null || map.get(NewApplicationWizardPage.PRODUCT_NAME) == null)
            return;

        // If the project has invalid characters, the plug-in name would replace
        // them with underscores, product name does the same
        String pluginName = fPluginData.getId();

        // If there's no Activator created we create default package
        if (!fPluginData.doGenerateClass()) {
            String packageName = fPluginData.getId();
            IPath path = new Path(packageName.replace('.', '/'));
            if (fPluginData.getSourceFolderName().trim().length() > 0)
                path = new Path(fPluginData.getSourceFolderName()).append(path);

            try {
                CoreUtility.createFolder(project.getFolder(path));
            } catch (CoreException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        IJavaProject javaProject = JavaCore.create(project);
        IPackageFragment fragment = null;

        try {
            for (IPackageFragment element : javaProject.getPackageFragments()) {
                if (element.getKind() == IPackageFragmentRoot.K_SOURCE) {
                    fragment = element;
                }
            }
        } catch (JavaModelException e1) {
            e1.printStackTrace();
        }

        createApplicationModel(project, pluginName, fragment);

        String cssPath = map.get(NewApplicationWizardPage.APPLICATION_CSS_PROPERTY);
        if (cssPath != null && cssPath.trim().length() > 0) {
            IFile file = project.getFile(cssPath);

            try {
                prepareFolder(file.getParent(), monitor);

                URL corePath = ResourceLocator.getProjectTemplateFiles("css/default.css");
                file.create(corePath.openStream(), true, monitor);
            } catch (Exception e) {
                PDEPlugin.logException(e);
            }
        }

        String template_id = "common";
        Set<String> binaryExtentions = new HashSet<String>();
        binaryExtentions.add(".gif");
        binaryExtentions.add(".png");

        Map<String, String> keys = new HashMap<String, String>();
        keys.put("projectName", pluginName);
        keys.put("productFileName", map.get(NewApplicationWizardPage.PRODUCT_NAME));
        String elementName = fragment.getElementName();
        keys.put("packageName", (elementName.equals("") ? "" : elementName + ".") + "handlers");
        keys.put("packageName2", (elementName.equals("") ? "" : elementName + ".") + "parts");
        keys.put("programArgs",
                "true".equalsIgnoreCase(map.get(NewApplicationWizardPage.CLEAR_PERSISTED_STATE))
                        ? "-clearPersistedState"
                        : "");
        try {
            URL corePath = ResourceLocator.getProjectTemplateFiles(template_id);
            IRunnableWithProgress op = new TemplateOperation(corePath, project, keys, binaryExtentions,
                    isMinimalist);
            getContainer().run(false, true, op);
        } catch (Exception e) {
            PDEPlugin.logException(e);
        }
        if (!isMinimalist) {
            try {
                URL corePath = ResourceLocator.getProjectTemplateFiles("src");
                IRunnableWithProgress op = new TemplateOperation(corePath, (IContainer) fragment.getResource(),
                        keys, binaryExtentions, isMinimalist);
                getContainer().run(false, true, op);
            } catch (Exception e) {
                PDEPlugin.logException(e);
            }
        }
    }

    private void createApplicationModel(IProject project, String pluginName, IPackageFragment fragment) {
        Map<String, String> map = fApplicationPage.getData();
        boolean isMinimalist = !map.get(NewApplicationWizardPage.richSample).equalsIgnoreCase("TRUE");
        if (APPLICATION_MODEL != null && APPLICATION_MODEL.trim().length() > 0) {

            // Create a resource set
            //
            ResourceSet resourceSet = new ResourceSetImpl();

            // Get the URI of the model file.
            //
            URI fileURI = URI.createPlatformResourceURI(project.getName() + "/" + APPLICATION_MODEL, true);

            // Create a resource for this file.
            //
            Resource resource = resourceSet.createResource(fileURI);

            MApplication application = MApplicationFactory.INSTANCE.createApplication();

            application.setElementId("org.eclipse.e4.ide.application");

            MAddon addon = MApplicationFactory.INSTANCE.createAddon();
            addon.setElementId("org.eclipse.e4.core.commands.service");
            addon.setContributionURI(
                    "bundleclass://org.eclipse.e4.core.commands/org.eclipse.e4.core.commands.CommandServiceAddon");
            application.getAddons().add(addon);

            addon = MApplicationFactory.INSTANCE.createAddon();
            addon.setElementId("org.eclipse.e4.ui.contexts.service");
            addon.setContributionURI(
                    "bundleclass://org.eclipse.e4.ui.services/org.eclipse.e4.ui.services.ContextServiceAddon");
            application.getAddons().add(addon);

            addon = MApplicationFactory.INSTANCE.createAddon();
            addon.setElementId("org.eclipse.e4.ui.bindings.service");
            addon.setContributionURI(
                    "bundleclass://org.eclipse.e4.ui.bindings/org.eclipse.e4.ui.bindings.BindingServiceAddon");
            application.getAddons().add(addon);

            addon = MApplicationFactory.INSTANCE.createAddon();
            addon.setElementId("org.eclipse.e4.ui.workbench.commands.model");
            addon.setContributionURI(
                    "bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.CommandProcessingAddon");
            application.getAddons().add(addon);

            addon = MApplicationFactory.INSTANCE.createAddon();
            addon.setElementId("org.eclipse.e4.ui.workbench.handler.model");
            addon.setContributionURI(
                    "bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.HandlerProcessingAddon");
            application.getAddons().add(addon);

            addon = MApplicationFactory.INSTANCE.createAddon();
            addon.setElementId("org.eclipse.e4.ui.workbench.contexts.model");
            addon.setContributionURI(
                    "bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.ContextProcessingAddon");
            application.getAddons().add(addon);

            addon = MApplicationFactory.INSTANCE.createAddon();
            addon.setElementId("org.eclipse.e4.ui.workbench.bindings.model");
            addon.setContributionURI(
                    "bundleclass://org.eclipse.e4.ui.workbench.swt/org.eclipse.e4.ui.workbench.swt.util.BindingProcessingAddon");
            application.getAddons().add(addon);
            MTrimmedWindow mainWindow = MBasicFactory.INSTANCE.createTrimmedWindow();
            application.getChildren().add(mainWindow);
            mainWindow.setLabel(pluginName);
            mainWindow.setWidth(500);
            mainWindow.setHeight(400);
            resource.getContents().add((EObject) application);
            MBindingContext rootContext = MCommandsFactory.INSTANCE.createBindingContext();
            rootContext.setElementId("org.eclipse.ui.contexts.dialogAndWindow");
            rootContext.setName("In Dialog and Windows");

            MBindingContext childContext = MCommandsFactory.INSTANCE.createBindingContext();
            childContext.setElementId("org.eclipse.ui.contexts.window");
            childContext.setName("In Windows");
            rootContext.getChildren().add(childContext);

            childContext = MCommandsFactory.INSTANCE.createBindingContext();
            childContext.setElementId("org.eclipse.ui.contexts.dialog");
            childContext.setName("In Dialogs");
            rootContext.getChildren().add(childContext);

            application.getRootContext().add(rootContext);
            application.getBindingContexts().add(rootContext);
            if (!isMinimalist) {

                // Create Quit command
                MCommand quitCommand = createCommand("org.eclipse.ui.file.exit", "quitCommand", "QuitHandler",
                        "M1+Q", pluginName, fragment, application);

                MCommand openCommand = createCommand(pluginName + ".open", "openCommand", "OpenHandler", "M1+O",
                        pluginName, fragment, application);

                MCommand saveCommand = createCommand("org.eclipse.ui.file.save", "saveCommand", "SaveHandler",
                        "M1+S", pluginName, fragment, application);

                MCommand aboutCommand = createCommand("org.eclipse.ui.help.aboutAction", "aboutCommand",
                        "AboutHandler", "M1+A", pluginName, fragment, application);

                MMenu menu = MMenuFactory.INSTANCE.createMenu();
                mainWindow.setMainMenu(menu);
                menu.setElementId("menu:org.eclipse.ui.main.menu");

                MMenu fileMenuItem = MMenuFactory.INSTANCE.createMenu();
                menu.getChildren().add(fileMenuItem);
                fileMenuItem.setLabel("File");
                {
                    MHandledMenuItem menuItemOpen = MMenuFactory.INSTANCE.createHandledMenuItem();
                    fileMenuItem.getChildren().add(menuItemOpen);
                    menuItemOpen.setLabel("Open");
                    menuItemOpen.setIconURI("platform:/plugin/" + pluginName + "/icons/sample.png");
                    menuItemOpen.setCommand(openCommand);

                    MHandledMenuItem menuItemSave = MMenuFactory.INSTANCE.createHandledMenuItem();
                    fileMenuItem.getChildren().add(menuItemSave);
                    menuItemSave.setLabel("Save");
                    menuItemSave.setIconURI("platform:/plugin/" + pluginName + "/icons/save_edit.png");
                    menuItemSave.setCommand(saveCommand);

                    MHandledMenuItem menuItemQuit = MMenuFactory.INSTANCE.createHandledMenuItem();
                    fileMenuItem.getChildren().add(menuItemQuit);
                    menuItemQuit.setLabel("Quit");
                    menuItemQuit.setCommand(quitCommand);
                }
                MMenu helpMenuItem = MMenuFactory.INSTANCE.createMenu();
                menu.getChildren().add(helpMenuItem);
                helpMenuItem.setLabel("Help");
                {
                    MHandledMenuItem menuItemAbout = MMenuFactory.INSTANCE.createHandledMenuItem();
                    helpMenuItem.getChildren().add(menuItemAbout);
                    menuItemAbout.setLabel("About");
                    menuItemAbout.setCommand(aboutCommand);
                }

                // PerspectiveStack
                MPerspectiveStack perspectiveStack = MAdvancedFactory.INSTANCE.createPerspectiveStack();
                mainWindow.getChildren().add(perspectiveStack);

                MPerspective perspective = MAdvancedFactory.INSTANCE.createPerspective();
                perspectiveStack.getChildren().add(perspective);
                {
                    // Part Container
                    MPartSashContainer partSashContainer = MBasicFactory.INSTANCE.createPartSashContainer();
                    perspective.getChildren().add(partSashContainer);

                    MPartStack partStack = MBasicFactory.INSTANCE.createPartStack();
                    partSashContainer.getChildren().add(partStack);

                    MPart part = MBasicFactory.INSTANCE.createPart();
                    partStack.getChildren().add(part);
                    part.setLabel("Sample Part");
                    part.setContributionURI("bundleclass://" + pluginName + "/" + fragment.getElementName()
                            + ".parts" + ".SamplePart");

                }

                // WindowTrim
                MTrimBar trimBar = MBasicFactory.INSTANCE.createTrimBar();
                mainWindow.getTrimBars().add(trimBar);

                MToolBar toolBar = MMenuFactory.INSTANCE.createToolBar();
                toolBar.setElementId("toolbar:org.eclipse.ui.main.toolbar");
                trimBar.getChildren().add(toolBar);

                MHandledToolItem toolItemOpen = MMenuFactory.INSTANCE.createHandledToolItem();
                toolBar.getChildren().add(toolItemOpen);
                toolItemOpen.setIconURI("platform:/plugin/" + pluginName + "/icons/sample.png");
                toolItemOpen.setCommand(openCommand);

                MHandledToolItem toolItemSave = MMenuFactory.INSTANCE.createHandledToolItem();
                toolBar.getChildren().add(toolItemSave);
                toolItemSave.setIconURI("platform:/plugin/" + pluginName + "/icons/save_edit.png");
                toolItemSave.setCommand(saveCommand);
            }
            Map<Object, Object> options = new HashMap<Object, Object>();
            options.put(XMLResource.OPTION_ENCODING, "UTF-8");
            try {
                resource.save(options);
            } catch (IOException e) {
                PDEPlugin.logException(e);

            }
        }
    }

    private MCommand createCommand(String commandId, String name, String className, String keyBinding,
            String projectName, IPackageFragment fragment, MApplication application) {
        MCommand command = MCommandsFactory.INSTANCE.createCommand();
        command.setCommandName(name);
        command.setElementId(commandId);
        application.getCommands().add(command);
        {
            // Create handler for command
            MHandler handler = MCommandsFactory.INSTANCE.createHandler();
            handler.setCommand(command);
            String elementName = fragment.getElementName();
            handler.setContributionURI("bundleclass://" + projectName + "/"
                    + (elementName.equals("") ? "" : elementName + ".") + "handlers." + className);
            handler.setElementId(projectName + ".handler." + name);
            application.getHandlers().add(handler);

            // create binding for the command
            MKeyBinding binding = MCommandsFactory.INSTANCE.createKeyBinding();
            binding.setKeySequence(keyBinding);
            binding.setCommand(command);
            List<MBindingTable> tables = application.getBindingTables();
            if (tables.size() == 0) {
                MBindingContext rootContext = null;
                if (application.getRootContext().size() > 0) {
                    rootContext = application.getRootContext().get(0);
                } else {
                    rootContext = MCommandsFactory.INSTANCE.createBindingContext();
                    rootContext.setElementId("org.eclipse.ui.contexts.dialogAndWindow");
                    rootContext.setName("In Dialog and Windows");
                    application.getRootContext().add(rootContext);
                }
                MBindingTable table = MCommandsFactory.INSTANCE.createBindingTable();
                table.setBindingContext(rootContext);
                tables.add(table);
            }
            tables.get(0).getBindings().add(binding);
        }
        return command;
    }

    private void prepareFolder(IContainer container, IProgressMonitor monitor) throws CoreException {
        IContainer parent = container.getParent();
        if (parent instanceof IFolder) {
            prepareFolder(parent, monitor);
        }
        if (!container.exists() && container instanceof IFolder) {
            IFolder folder = (IFolder) container;
            folder.create(true, true, monitor);
        }
    }

    @Override
    public String getPluginId() {
        return fPluginData.getId();
    }

    @Override
    public String getPluginVersion() {
        return fPluginData.getVersion();
    }

    private class ContentWizard extends Wizard implements IBundleContentWizard {

        String[] dependencies = new String[] { "javax.inject", "org.eclipse.core.runtime", "org.eclipse.swt",
                "org.eclipse.e4.ui.model.workbench", "org.eclipse.jface", "org.eclipse.e4.ui.services",
                "org.eclipse.e4.ui.workbench", "org.eclipse.e4.core.di", "org.eclipse.e4.ui.di",
                "org.eclipse.e4.core.contexts", };

        public void init(IFieldData data) {
        }

        public IPluginReference[] getDependencies(String schemaVersion) {
            ArrayList<IPluginReference> result = new ArrayList<IPluginReference>(dependencies.length);
            for (String dependency : dependencies) {
                Bundle bundle = Platform.getBundle(dependency);
                String versionString = "0.0.0";
                if (dependency != null) {
                    Version version = bundle.getVersion();
                    versionString = version.getMajor() + "." + version.getMinor() + "." + version.getMicro();
                }
                result.add(new PluginReference(dependency, versionString, IMatchRules.GREATER_OR_EQUAL));
            }
            return result.toArray(new IPluginReference[0]);
        }

        public String[] getNewFiles() {
            return new String[0];
        }

        public boolean performFinish(IProject project, IPluginModelBase model, IProgressMonitor monitor) {
            return true;
        }

        public String[] getImportPackages() {
            return new String[] {};
        }

        @Override
        public boolean performFinish() {
            return true;
        }

    }
}