/*******************************************************************************
 * Copyright (c) 2003, 2007 IBM Corporation and others.
 * 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:
 *     IBM Corporation - Initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.internet.monitor.ui.internal.viewers;

import java.io.ByteArrayInputStream;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.wst.internet.monitor.ui.internal.Messages;
import org.eclipse.wst.internet.monitor.ui.internal.MonitorUIPlugin;
import org.eclipse.wst.internet.monitor.ui.internal.provisional.ContentViewer;
/**
 * An image viewer.
 */
public class ImageViewer extends ContentViewer {
	protected static final byte CR = '\r';
	protected static final byte LF = '\n';

	protected ScrolledComposite scroll;
	protected Label messageLabel;

	protected byte[] content;

	/** (non-Javadoc)
	 * @see ContentViewer#init(Composite)
	 */
	public void init(Composite parent) {
		scroll = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
		messageLabel = new Label(scroll, SWT.NONE);
		messageLabel.setText(Messages.imageViewInvalid);
		messageLabel.setFont(parent.getFont());
		messageLabel.setSize(messageLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT));
		scroll.setContent(messageLabel);
	}

	/** (non-Javadoc)
	 * @see ContentViewer#setContent(byte[])
	 */
	public void setContent(byte[] b) {
		content = b;
		if (b == null || b.length == 0) {
			messageLabel.setImage(null);
		} else {
			b = MonitorUIPlugin.unzip(b);
			
			int trimFront = 0;
			int trimBack = 0;
			int len = b.length - 1;
			while (trimFront < b.length && b[trimFront] == CR || b[trimFront] == LF)
				trimFront++;
			while (trimBack < b.length && b[len - trimBack] == CR || b[len - trimBack] == LF)
				trimBack++;
			
			if (trimFront + trimBack > 0) {
				if (trimFront + trimBack > b.length) {
					b = new byte[0];
				} else {
					byte[] temp = b;
					b = new byte[temp.length - trimBack - trimFront];
					for (int i = trimFront; i < temp.length - trimBack; i++) {
						b[i - trimFront] = temp[i];
					}
				}
			}
			
			try {
				ImageData imgD = new ImageData(new ByteArrayInputStream(b));
				Image img = new Image(null, imgD);
				messageLabel.setImage(img);
			} catch(Exception e) {
				messageLabel.setImage(null);
				messageLabel.setText(Messages.imageViewInvalid);
			}
		}
		
		messageLabel.setSize(messageLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT));
	}

	/**
	 * @see ContentViewer#getContent()
	 */
	public byte[] getContent() {
		return content;
	}

	/** (non-Javadoc)
	 * @see ContentViewer#dispose()
	 */
	public void dispose() {
		scroll.dispose();
		scroll = null;
		messageLabel = null;
		content = null;
	}
}
