/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.examples.readmetool;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.dialogs.PropertyPage;
import org.eclipse.ui.help.WorkbenchHelp;

/**
 * This page will be added to the property page dialog
 * when "Properties..." popup menu item is selected
 * for Readme files. 
 *
 * This page demonstrates conditional property pages which look
 * different depending on the state of the element. In this example,
 * the arbitrary condition chosen is whether the Readme file is
 * greater than 256 bytes in length. If it is smaller than 256 bytes
 * in length, this will be a placeholder page containing 
 * a simple message. If it is 256 bytes or larger, additional 
 * information will be provided. This information is determined at
 * runtime.
 *
 * This class may be reused to implement a conditional property page.
 * The getPageIndex() method tests the condition and returns the
 * index of the page to create. The createPage*() methods are called
 * upon to create the actual pages.
 */
public class ReadmeFilePropertyPage2 extends PropertyPage {

    /**
     * Utility method that creates a new composite and
     * sets up its layout data.
     *
     * @param parent  the parent of the composite
     * @param numColumns  the number of columns in the new composite
     * @return the newly-created composite
     */
    protected Composite createComposite(Composite parent, int numColumns) {
        Composite composite = new Composite(parent, SWT.NULL);
        GridLayout layout = new GridLayout();
        layout.numColumns = numColumns;
        composite.setLayout(layout);
        GridData data = new GridData();
        data.verticalAlignment = GridData.FILL;
        data.horizontalAlignment = GridData.FILL;
        composite.setLayoutData(data);
        return composite;
    }

    /** (non-Javadoc)
     * Method declared on PreferencePage
     */
    public Control createContents(Composite parent) {
        // ensure the page has no special buttons
        noDefaultAndApplyButton();
        Composite panel = createComposite(parent, 2);

        WorkbenchHelp.setHelp(getControl(),
                IReadmeConstants.PROPERTY_PAGE2_CONTEXT);

        // layout the page
        int page = getPageIndex();
        switch (page) {
        case 1:
            createPageOne(panel);
            break;
        case 2:
            createPageTwo(panel);
            break;
        default:
        }
        return new Canvas(panel, 0);
    }

    /**
     * Utility method that creates a new label and sets up
     * its layout data.
     *
     * @param parent  the parent of the label
     * @param text  the text of the label
     * @return the newly-created label
     */
    protected Label createLabel(Composite parent, String text) {
        Label label = new Label(parent, SWT.LEFT);
        label.setText(text);
        GridData data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        label.setLayoutData(data);
        return label;
    }

    /**
     * Creates the first version of the page. This is a placeholder page which
     * notified the user that the page is not available.
     *
     * @param panel  the panel in which to create the page
     */
    protected void createPageOne(Composite panel) {
        Label l = createLabel(panel, MessageUtil
                .getString("Additional_Readme_properties_not_available.")); //$NON-NLS-1$
        GridData gd = (GridData) l.getLayoutData();
        gd.horizontalSpan = 2;
        gd.grabExcessHorizontalSpace = true;
        l = createLabel(
                panel,
                MessageUtil
                        .getString("This_illustrates_a_property_page_that_is_dynamically_determined")); //$NON-NLS-1$
        gd = (GridData) l.getLayoutData();
        gd.horizontalSpan = 2;
        gd.grabExcessHorizontalSpace = true;
        l = createLabel(
                panel,
                MessageUtil
                        .getString("not_to_be_available_based_on_the_state_of_the_object.")); //$NON-NLS-1$
        gd = (GridData) l.getLayoutData();
        gd.horizontalSpan = 2;
        gd.grabExcessHorizontalSpace = true;
    }

    /**
     * Creates the second version of the page. This page might contain more information
     * about the file or other information.
     *
     * @param panel  the panel in which to create the page
     */
    protected void createPageTwo(Composite panel) {
        Label l = createLabel(
                panel,
                MessageUtil
                        .getString("The_size_of_the_Readme_file_is_at_least_256_bytes.")); //$NON-NLS-1$
        GridData gd = (GridData) l.getLayoutData();
        gd.horizontalSpan = 2;
        gd.grabExcessHorizontalSpace = true;
        l = createLabel(
                panel,
                MessageUtil
                        .getString("Had_it_been_less_than_256_bytes_this_page_would_be_a_placeholder_page.")); //$NON-NLS-1$
        gd = (GridData) l.getLayoutData();
        gd.horizontalSpan = 2;
        gd.grabExcessHorizontalSpace = true;
        l = createLabel(panel, MessageUtil.getString("Additional_information")); //$NON-NLS-1$
        gd = (GridData) l.getLayoutData();
        gd.horizontalSpan = 2;
        gd.grabExcessHorizontalSpace = true;
        l = createLabel(
                panel,
                MessageUtil
                        .getString("This_illustrates_a_property_page_that_is_dynamically_determined")); //$NON-NLS-1$
        gd = (GridData) l.getLayoutData();
        gd.horizontalSpan = 2;
        gd.grabExcessHorizontalSpace = true;
        l = createLabel(panel, MessageUtil
                .getString("to_be_available_based_on_the_state_of_the_object.")); //$NON-NLS-1$
        gd = (GridData) l.getLayoutData();
        gd.horizontalSpan = 2;
        gd.grabExcessHorizontalSpace = true;
    }

    /**
     * Returns which page to display. This implementation
     * answers 1 if the size of the Readme file is less than 256 bytes
     * and 2 otherwise.
     *
     * @return the index of the page to display
     */
    protected int getPageIndex() {
        IResource resource = (IResource) getElement();

        if (resource.getType() == IResource.FILE) {
            InputStream contentStream = null;
            int length = 0;
            try {
                IFile file = (IFile) resource;

                if (file.isLocal(IResource.DEPTH_ZERO)) {
                    contentStream = file.getContents();
                    Reader in = new InputStreamReader(contentStream);
                    int chunkSize = contentStream.available();
                    StringBuffer buffer = new StringBuffer(chunkSize);
                    char[] readBuffer = new char[chunkSize];
                    int n = in.read(readBuffer);

                    while (n > 0) {
                        buffer.append(readBuffer);
                        n = in.read(readBuffer);
                    }

                    contentStream.close();
                    length = buffer.length();
                }
            } catch (CoreException e) {
                length = 0;
            } catch (IOException e) {
            } finally {
                if (contentStream != null) {
                    try {
                        contentStream.close();
                    } catch (IOException e) {
                    }
                }
            }

            if (length < 256)
                return 1;
            else
                return 2;
        }

        return 0;
    }

    /** (non-Javadoc)
     * Method declared on PreferencePage
     */
    public boolean performOk() {
        // nothing to do - read-only page
        return true;
    }
}