/*******************************************************************************
 * 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.*;
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 the "Properties..." popup menu item is selected
 * for Readme files. 
 */
public class ReadmeFilePropertyPage 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_PAGE_CONTEXT);

	// layout the page

	IResource resource = (IResource) getElement();
	IStatus result = null;
	if (resource.getType() == IResource.FILE) {
		Label l = createLabel(panel, MessageUtil.getString("File_name")); //$NON-NLS-1$
		l = createLabel(panel, resource.getName());
		grabExcessSpace(l);

		//
		createLabel(panel, MessageUtil.getString("Path")); //$NON-NLS-1$
		l = createLabel(panel, resource.getFullPath().setDevice(null).toString());
		grabExcessSpace(l);

		//
		createLabel(panel, MessageUtil.getString("Size")); //$NON-NLS-1$
		InputStream contentStream = null;
		try {
			IFile file = (IFile) resource;
			if (!file.isLocal(IResource.DEPTH_ZERO))
				l = createLabel(panel,MessageUtil.getString("<file_contents_not_local>")); //$NON-NLS-1$
			else {
				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();
				l = createLabel(panel, Integer.toString(buffer.length()));
			}
		} catch (CoreException e) {
			result = e.getStatus();
			String message = result.getMessage();
			if (message == null)
				l = createLabel(panel, MessageUtil.getString("<Unknown>")); //$NON-NLS-1$
			else
				l = createLabel(panel, message);
		} catch (IOException e) {
			l = createLabel(panel, MessageUtil.getString("<Unknown>")); //$NON-NLS-1$
		} finally {
			if (contentStream != null) {
				try {
					contentStream.close();
				} catch (IOException e) {
				}
			}
		}
		grabExcessSpace(l);
		createLabel(panel, MessageUtil.getString("Number_of_sections")); //$NON-NLS-1$
		// We will get the sections property and simply
		// report number of elements found.
		IAdaptable sections = getSections(resource);
		if (sections instanceof AdaptableList) {
			AdaptableList list = (AdaptableList)sections;
			l = createLabel(panel, String.valueOf(list.size()));
			grabExcessSpace(l);
		}
	}

	//
	Label l = createLabel(panel, MessageUtil.getString("Additional_information")); //$NON-NLS-1$
	grabExcessSpace(l);
	GridData gd = (GridData) l.getLayoutData();
	gd.horizontalSpan = 2;
	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;
}
/**
 * Returns the readme sections for this resource, or null
 * if not applicable (resource is not a readme file).
 */
private AdaptableList getSections(IAdaptable adaptable) {
	if (adaptable instanceof IFile)
		return ReadmeModelFactory.getInstance().getSections((IFile)adaptable);
	else
		return null;
}
/**
 * Sets this control to grab any excess horizontal space
 * left in the window.
 *
 * @param control  the control for which to grab excess space
 */
private void grabExcessSpace(Control control) {
	GridData gd = (GridData) control.getLayoutData();
	if (gd != null) {
		gd.grabExcessHorizontalSpace = true;
	}
}
/** (non-Javadoc)
 * Method declared on PreferencePage
 */
public boolean performOk() {
	// nothing to do - read-only page
	return true;
}
}
