com.ebmwebsourcing.petals.common.internal.wizards.JbiXmlNewWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for com.ebmwebsourcing.petals.common.internal.wizards.JbiXmlNewWizardPage.java

Source

/******************************************************************************
 * Copyright (c) 2009-2013, Linagora
 *
 * 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:
 *       Linagora - initial API and implementation
 *******************************************************************************/

package com.ebmwebsourcing.petals.common.internal.wizards;

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

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
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.TreeViewer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;

import com.ebmwebsourcing.petals.common.internal.Messages;
import com.ebmwebsourcing.petals.common.internal.PetalsCommonPlugin;

/**
 * The only required page to create a new 'jbi.xml' file.
 * @author Vincent Zurczak - EBM WebSourcing
 */
public class JbiXmlNewWizardPage extends WizardPage {

    /**
     * The selected container for the target file.
     */
    private IContainer selectedContainer;

    /**
     * True to overwrite an existing file, false otherwise.
     */
    private boolean overwriteExistingFile = false;

    /**
     * Constructor.
     * @param pageName
     * @param selection
     */
    public JbiXmlNewWizardPage(String pageName, IStructuredSelection selection) {
        super(pageName);
        setTitle(Messages.NewJbiXmlWizardPage_0);
        setDescription(Messages.NewJbiXmlWizardPage_1);

        if (selection != null) {
            Object o = (selection).getFirstElement();
            if (o instanceof IContainer)
                this.selectedContainer = (IContainer) o;
        }
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.dialogs.IDialogPage
     * #createControl(org.eclipse.swt.widgets.Composite)
     */
    @Override
    public void createControl(Composite parent) {

        // Create the composite container and define its layout
        final Composite container = new Composite(parent, SWT.NONE);

        GridLayout layout = new GridLayout();
        layout.marginLeft = layout.marginRight = 15;
        layout.marginTop = 15;
        container.setLayout(layout);
        container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        // Container viewer
        new Label(container, SWT.NONE).setText(Messages.NewJbiXmlWizardPage_2);
        final Text folderPathText = new Text(container, SWT.SINGLE | SWT.BORDER);
        folderPathText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        TreeViewer viewer = new TreeViewer(container, SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL | SWT.HIDE_SELECTION);
        GridData layoutData = new GridData(GridData.FILL_BOTH);
        layoutData.heightHint = 100;
        viewer.getTree().setLayoutData(layoutData);
        viewer.setLabelProvider(new WorkbenchLabelProvider());
        viewer.setContentProvider(new WorkbenchContentProvider() {

            /*
             * (non-Javadoc)
             * @see org.eclipse.ui.model.BaseWorkbenchContentProvider
             * #getChildren(java.lang.Object)
             */
            @Override
            public Object[] getChildren(Object o) {

                if (o instanceof IProject && !((IProject) o).isOpen())
                    return new Object[0];

                List<IResource> children = new ArrayList<IResource>();
                if (o instanceof IContainer) {
                    try {
                        IResource[] members = ((IContainer) o).members();
                        for (IResource member : members) {
                            if (member instanceof IContainer
                                    || (member instanceof IFile && member.getName().equals("jbi.xml"))) //$NON-NLS-1$
                                children.add(member);
                        }
                    } catch (CoreException e) {
                        PetalsCommonPlugin.log(e, IStatus.ERROR);
                    }
                }

                return children.toArray(new IResource[0]);
            }

            /*
             * (non-Javadoc)
             * @see org.eclipse.ui.model.BaseWorkbenchContentProvider
             * #hasChildren(java.lang.Object)
             */
            @Override
            public boolean hasChildren(Object element) {
                return getChildren(element).length > 0;
            }
        });

        // Set page input
        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
        viewer.setInput(root);
        if (this.selectedContainer != null) {
            viewer.setSelection(new StructuredSelection(this.selectedContainer), true);
            viewer.expandToLevel(this.selectedContainer, 1);
        }

        viewer.addPostSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                Object o = ((IStructuredSelection) event.getSelection()).getFirstElement();
                if (o instanceof IContainer)
                    JbiXmlNewWizardPage.this.selectedContainer = (IContainer) o;
                else
                    JbiXmlNewWizardPage.this.selectedContainer = ((IFile) o).getParent();

                String path = JbiXmlNewWizardPage.this.selectedContainer.getFullPath().toOSString();
                String fileSeparator = System.getProperty("file.separator"); //$NON-NLS-1$
                if (path.startsWith(fileSeparator))
                    path = path.substring(fileSeparator.length());
                folderPathText.setText(path);
                validate();
            }
        });

        // Overwrite existing file ?
        final Button overwriteButton = new Button(container, SWT.CHECK);
        overwriteButton.setText(Messages.NewJbiXmlWizardPage_5);
        overwriteButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                JbiXmlNewWizardPage.this.overwriteExistingFile = overwriteButton.getSelection();
                validate();
            }
        });

        // Set control
        setControl(container);
    }

    /**
     * Validates the page entries.
     */
    private void validate() {

        String errorMsg = null;
        boolean isComplete = true;

        if (this.selectedContainer == null) {
            isComplete = false;
            errorMsg = Messages.NewJbiXmlWizardPage_6;
        } else {
            IFile f = this.selectedContainer.getFile(new Path("jbi.xml")); //$NON-NLS-1$
            if (f.exists() && !this.overwriteExistingFile) {
                isComplete = false;
                errorMsg = Messages.NewJbiXmlWizardPage_8;
            }
        }

        setErrorMessage(errorMsg);
        setPageComplete(isComplete);
    }

    /**
     * Gets the content of the created jbi.xml file.
     * @return the content as an input stream
     */
    public InputStream getInitialContents() {

        String jbiXmlTemplate = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" //$NON-NLS-1$
                + "<jbi:jbi\n" //$NON-NLS-1$
                + "\tversion=\"1.0\"\n" //$NON-NLS-1$
                + "\txmlns=\"http://java.sun.com/xml/ns/jbi\"\n" //$NON-NLS-1$
                + "\txmlns:jbi=\"http://java.sun.com/xml/ns/jbi\">\n\n" //$NON-NLS-1$
                + "</jbi:jbi>"; //$NON-NLS-1$

        InputStream inputStream = new ByteArrayInputStream(jbiXmlTemplate.getBytes());
        return inputStream;
    }

    /**
     * Creates the new 'jbi.xml' file at the selected location.
     * @return the created {@link IFile}
     * @throws CoreException if something went wrong
     */
    public IFile createNewFile() throws CoreException {

        final IFile file = this.selectedContainer.getFile(new Path("jbi.xml")); //$NON-NLS-1$
        IWorkspaceRunnable op = new IWorkspaceRunnable() {
            @Override
            public void run(IProgressMonitor monitor) throws CoreException {
                try {
                    if (file.exists())
                        file.setContents(getInitialContents(), true, true, monitor);
                    else
                        file.create(getInitialContents(), true, monitor);

                } finally {
                    monitor.done();
                }
            }
        };

        ResourcesPlugin.getWorkspace().run(op, new NullProgressMonitor());
        return file;
    }

    /**
     * @return the selectedContainer
     */
    public IContainer getSelectedContainer() {
        return this.selectedContainer;
    }
}