/*******************************************************************************
 * Copyright (c) 2000, 2017 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.ui.examples.readmetool;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

import org.eclipse.core.resources.IFile;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
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.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
import org.eclipse.ui.ide.IDE;

/**
 * This class is the only page of the Readme file resource creation wizard.
 * It subclasses the standard file resource creation page class,
 * and consequently inherits the file resource creation functionality.
 *
 * This page provides users with the choice of creating sample headings for
 * sections and subsections.  Additionally, the option is presented to open
 * the file immediately for editing after creation.
 */
public class ReadmeCreationPage extends WizardNewFileCreationPage {
    private IWorkbench workbench;

    // widgets
    private Button sectionCheckbox;

    private Button subsectionCheckbox;

    private Button openFileCheckbox;

    // constants
    private static int nameCounter = 1;

    /**
     * Creates the page for the readme creation wizard.
     *
     * @param workbench  the workbench on which the page should be created
     * @param selection  the current selection
     */
    public ReadmeCreationPage(IWorkbench workbench,
            IStructuredSelection selection) {
        super("sampleCreateReadmePage1", selection); //$NON-NLS-1$
        this.setTitle(MessageUtil.getString("Create_Readme_File")); //$NON-NLS-1$
        this.setDescription(MessageUtil
                .getString("Create_a_new_Readme_file_resource")); //$NON-NLS-1$
        this.workbench = workbench;
    }

    @Override
	public void createControl(Composite parent) {
        // inherit default container and name specification widgets
        super.createControl(parent);
        Composite composite = (Composite) getControl();

        PlatformUI.getWorkbench().getHelpSystem().setHelp(composite,
				IReadmeConstants.CREATION_WIZARD_PAGE_CONTEXT);

        this.setFileName("sample" + nameCounter + ".readme"); //$NON-NLS-1$ //$NON-NLS-2$

        // sample section generation group
        Group group = new Group(composite, SWT.NONE);
        group.setLayout(new GridLayout());
        group.setText(MessageUtil
                .getString("Automatic_sample_section_generation")); //$NON-NLS-1$
        group.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
                | GridData.HORIZONTAL_ALIGN_FILL));

        // sample section generation checkboxes
        sectionCheckbox = new Button(group, SWT.CHECK);
        sectionCheckbox.setText(MessageUtil
                .getString("Generate_sample_section_titles")); //$NON-NLS-1$
        sectionCheckbox.setSelection(true);
        sectionCheckbox.addListener(SWT.Selection, this);

        subsectionCheckbox = new Button(group, SWT.CHECK);
        subsectionCheckbox.setText(MessageUtil
                .getString("Generate_sample_subsection_titles")); //$NON-NLS-1$
        subsectionCheckbox.setSelection(true);
        subsectionCheckbox.addListener(SWT.Selection, this);

        // open file for editing checkbox
        openFileCheckbox = new Button(composite, SWT.CHECK);
        openFileCheckbox.setText(MessageUtil
                .getString("Open_file_for_editing_when_done")); //$NON-NLS-1$
        openFileCheckbox.setSelection(true);

        setPageComplete(validatePage());

    }

    /**
     * Creates a new file resource as requested by the user. If everything
     * is OK then answer true. If not, false will cause the dialog
     * to stay open.
     *
     * @return whether creation was successful
     * @see ReadmeCreationWizard#performFinish()
     */
    public boolean finish() {
        // create the new file resource
        IFile newFile = createNewFile();
        if (newFile == null)
            return false; // ie.- creation was unsuccessful

        // Since the file resource was created fine, open it for editing
        // if requested by the user
        try {
            if (openFileCheckbox.getSelection()) {
                IWorkbenchWindow dwindow = workbench.getActiveWorkbenchWindow();
                IWorkbenchPage page = dwindow.getActivePage();
                if (page != null) {
                    IDE.openEditor(page, newFile, true);
                }
            }
        } catch (PartInitException e) {
            e.printStackTrace();
            return false;
        }
        nameCounter++;
        return true;
    }

    /**
     * The <code>ReadmeCreationPage</code> implementation of this
     * <code>WizardNewFileCreationPage</code> method
     * generates sample headings for sections and subsections in the
     * newly-created Readme file according to the selections of self's
     * checkbox widgets
     */
    @Override
	protected InputStream getInitialContents() {
        if (!sectionCheckbox.getSelection())
            return null;

        StringBuilder sb = new StringBuilder();
        sb.append(MessageUtil.getString("SAMPLE_README_FILE")); //$NON-NLS-1$
        sb.append(MessageUtil.getString("SECTION_1")); //$NON-NLS-1$
        sb.append(MessageUtil.getString("SECTION_1_BODY_1")); //$NON-NLS-1$

        if (subsectionCheckbox.getSelection()) {
            sb.append(MessageUtil.getString("Subsection_1_1")); //$NON-NLS-1$
            sb.append(MessageUtil.getString("Subsection_1_1_Body_1")); //$NON-NLS-1$
        }

        sb.append(MessageUtil.getString("SECTION_2")); //$NON-NLS-1$
        sb.append(MessageUtil.getString("SECTION_2_BODY_1")); //$NON-NLS-1$
        sb.append(MessageUtil.getString("SECTION_2_BODY_2")); //$NON-NLS-1$

        if (subsectionCheckbox.getSelection()) {
            sb.append(MessageUtil.getString("Subsection_2_1")); //$NON-NLS-1$
            sb.append(MessageUtil.getString("Subsection_2_1_BODY_1")); //$NON-NLS-1$
            sb.append(MessageUtil.getString("Subsection_2_2")); //$NON-NLS-1$
            sb.append(MessageUtil.getString("Subsection_2_2_BODY_1")); //$NON-NLS-1$
        }

        return new ByteArrayInputStream(sb.toString().getBytes());
    }

    @Override
	protected String getNewFileLabel() {
        return MessageUtil.getString("Readme_file_name"); //$NON-NLS-1$
    }

    @Override
	public void handleEvent(Event e) {
        Widget source = e.widget;

        if (source == sectionCheckbox) {
            if (!sectionCheckbox.getSelection())
                subsectionCheckbox.setSelection(false);
            subsectionCheckbox.setEnabled(sectionCheckbox.getSelection());
        }

        super.handleEvent(e);
    }
}
