Package com.dubture.twig.ui.wizards

Source Code of com.dubture.twig.ui.wizards.TwigNewFileWizardPage

/*******************************************************************************
* This file is part of the Twig eclipse plugin.
*
* (c) Robert Gruendler <r.gruendler@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
******************************************************************************/
package com.dubture.twig.ui.wizards;

import java.util.List;

import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.dltk.core.IProjectFragment;
import org.eclipse.dltk.core.IScriptFolder;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.internal.core.ProjectFragment;
import org.eclipse.dltk.ui.dialogs.StatusInfo;
import org.eclipse.dltk.ui.wizards.NewSourceModulePage;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
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.layout.GridData;
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.ContainerSelectionDialog;

import com.dubture.twig.core.TwigNature;
import com.dubture.twig.core.log.Logger;
import com.dubture.twig.ui.extension.ExtensionManager;

/**
* 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 (twig).
*/

@SuppressWarnings("restriction")
public class TwigNewFileWizardPage extends NewSourceModulePage
{
    private Text containerText;

    private Text fileText;

    private ISelection selection;

    private String filename = "";

    private List<ITemplateProvider> extensions;



    /**
     * Constructor for SampleNewWizardPage.
     *
     * @param pageName
     */
    public TwigNewFileWizardPage(ISelection selection)
    {
        this.selection = selection;
    }

    @Override
    protected void createContentControls(Composite container, int nColumns)
    {

        Label label = new Label(container, SWT.NULL);
        label.setText("&Source folder:");

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

        Button button = new Button(container, SWT.PUSH);
        button.setText("Browse...");
        button.addSelectionListener(new SelectionAdapter()
        {
            public void widgetSelected(SelectionEvent e)
            {
                handleBrowse();
            }
        });
        label = new Label(container, SWT.NULL);
        label.setText("&File name:");

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

        Label label2 = new Label(container, SWT.NONE);
        label2.setVisible(false);

        extensions = ExtensionManager.getInstance().getTemplateProviders();

        Logger.debugMSG("Creating extension controls");
        for (ITemplateProvider provider : extensions) {
            provider.createContentControls(getScriptFolder(), container);
        }

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

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

    private void initialize()
    {
        Logger.debugMSG("Initializing twig file wizard");

        if (selection != null && selection.isEmpty() == false
                && selection instanceof IStructuredSelection) {

            IStructuredSelection ssel = (IStructuredSelection) selection;

            if (ssel.size() > 1) {
                Logger.debugMSG("Selection container more than one elements.");
                return;
            }

            Object obj = ssel.getFirstElement();

            if (obj instanceof IScriptFolder) {

                Logger.debugMSG("Selection is scriptfolder");

                IScriptFolder folder = (IScriptFolder) obj;
                try {
                    String fullPath = folder.getUnderlyingResource().getFullPath().toString();
                    Logger.debugMSG("Setting container text to " + fullPath);
                    containerText.setText(fullPath);
                } catch (ModelException e) {
                    Logger.logException(e);
                }
            } else if (obj instanceof ProjectFragment) {

                IProjectFragment fragment = (IProjectFragment) obj;
                Logger.debugMSG("Selection is projectfragment");

                try {
                    String fullPath = fragment.getUnderlyingResource().getFullPath().toString();
                    Logger.debugMSG("Setting container text to " + fullPath);
                    containerText.setText(fullPath);
                } catch (ModelException e) {
                    Logger.logException(e);
                }

            } else if (obj instanceof IScriptProject) {
                IScriptProject proj = (IScriptProject) obj;
                Logger.debugMSG("Selection is scriptproject");
                containerText.setText(proj.getPath().toString());

            } else if (obj instanceof IFolder) {
                IFolder folder = (IFolder) obj;
                Logger.debugMSG("Selection is folder");
                containerText.setText(folder.getFullPath().toString());
            } else {
                Logger.debugMSG("Could not determine selection type");
                if (obj != null) {
                    Logger.debugMSG("type was " + obj.getClass());
                } else {
                    Logger.debugMSG("type was null");
                }
            }
        } else {
            Logger.debugMSG("File wizard couldn't retrieve selection");
        }

        Logger.debugMSG("Final container text: " + containerText.getText());

        fileText.setText("template.twig");
        fileText.forceFocus();
        fileText.setSelection(0, 8);

    }

    /**
     * Uses the standard container selection dialog to choose the new value for
     * the container field.
     */

    private void handleBrowse()
    {
        ContainerSelectionDialog dialog = new ContainerSelectionDialog(
                getShell(), ResourcesPlugin.getWorkspace().getRoot(), false,
                "Select new folder");
        if (dialog.open() == ContainerSelectionDialog.OK) {
            Object[] result = dialog.getResult();
            if (result.length == 1) {
                containerText.setText(((Path) result[0]).toString());
            }
        }
    }

    /**
     * Ensures that both text fields are set.
     */

    private void dialogChanged()
    {
        IResource container = ResourcesPlugin.getWorkspace().getRoot()
                .findMember(new Path(getContainerName()));
        String fileName = getFileName();

        if (getContainerName().length() == 0) {
            updateStatus("Folder must be specified");
            return;
        }
        if (container == null
                || (container.getType() & (IResource.PROJECT | IResource.FOLDER)) == 0) {
            updateStatus("Folder must exist");
            return;
        }
        if (!container.isAccessible()) {
            updateStatus("Project must be writable");
            return;
        }
        if (fileName.length() == 0) {
            updateStatus("File name must be specified");
            return;
        }
        if (fileName.replace('\\', '/').indexOf('/', 1) > 0) {
            updateStatus("File name must be valid");
            return;
        }
        // int dotLoc = fileName.lastIndexOf('.');
        // if (dotLoc != -1) {
        // String ext = fileName.substring(dotLoc + 1);
        // if (ext.equalsIgnoreCase("twig") == false) {
        // updateStatus("File extension must be \"twig\"");
        // return;
        // }
        // }
        updateStatus(new IStatus[]{new StatusInfo()});
    }

    private void updateStatus(String message)
    {
        setErrorMessage(message);
        setPageComplete(message == null);
    }

    public String getContainerName()
    {
        return getScriptFolderText();
    }

    public String getFileName()
    {
        return filename;
    }

    @Override
    protected String getPageTitle()
    {
        return "New Twig template";
    }

    @Override
    protected String getPageDescription()
    {
        return "Create a new twig template.";
    }

    @Override
    protected String getRequiredNature()
    {
        return TwigNature.NATURE_ID;
    }

    @Override
    protected String getFileContent(ISourceModule module) throws CoreException
    {

        if (extensions == null || extensions.size() == 0) {
            return "";
        }

        String content = "";

        for (ITemplateProvider provider : extensions) {
            content += provider.getContents();
        }
        return content;

    }
}
TOP

Related Classes of com.dubture.twig.ui.wizards.TwigNewFileWizardPage

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.