/*******************************************************************************
 * 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.*;

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.*;
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;
}
}
