/*******************************************************************************
 * Copyright (c) 2004 IBM Corporation.
 * 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
 *******************************************************************************/

import org.eclipse.swt.*;
import org.eclipse.swt.browser.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import java.io.*;
import java.net.*;

public class DocumentationViewer {

static Browser browser;
static String[] urls;
static String[] titles;
static int index;

public static void main(String argv[]) {
	Display display = new Display();
	final Shell shell = new Shell(display);
	shell.setText("SWT Browser - Documentation Viewer");
	shell.setLayout(new GridLayout());
	Composite compTools = new Composite(shell, SWT.NONE);
	GridData data = new GridData(GridData.FILL_HORIZONTAL);
	compTools.setLayoutData(data);
	compTools.setLayout(new GridLayout(2, false));
	ToolBar tocBar = new ToolBar(compTools, SWT.NONE);
	ToolItem openItem = new ToolItem(tocBar, SWT.PUSH);
	openItem.setText("Browse");
	ToolBar navBar = new ToolBar(compTools, SWT.NONE);
	navBar.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_END));
	final ToolItem back = new ToolItem(navBar, SWT.PUSH);
	back.setText("Back");
	back.setEnabled(false);
	final ToolItem forward = new ToolItem(navBar, SWT.PUSH);
	forward.setText("Forward");
	forward.setEnabled(false);
	
	Composite comp = new Composite(shell, SWT.NONE);
	data = new GridData(GridData.FILL_BOTH);
	comp.setLayoutData(data);
	comp.setLayout(new FillLayout());
	final SashForm form = new SashForm(comp, SWT.HORIZONTAL);
	form.setLayout(new FillLayout());

	final List list = new List(form, SWT.SINGLE);
	try {
		browser = new Browser(form, SWT.NONE);
	} catch (SWTError e) {
		MessageBox messageBox = new MessageBox(shell, SWT.ICON_ERROR | SWT.OK);
		messageBox.setMessage("Closing application. The Browser could not be initialized.");
		messageBox.setText("Fatal error - application terminated");
		messageBox.open();
		System.exit(-1);
	}
	back.addListener(SWT.Selection, new Listener() {
		public void handleEvent(Event event) {
			browser.back();
		}
	});
	forward.addListener(SWT.Selection, new Listener() {
		public void handleEvent(Event event) {
			browser.forward();
		}
	});
	list.addListener(SWT.Selection, new Listener() {
		public void handleEvent(Event e) {
			int index = list.getSelectionIndex();
			browser.setUrl(urls[index]);
		}
	});
	final LocationListener locationListener = new LocationListener() {
		public void changed(LocationEvent event) {
			Browser browser = (Browser)event.widget;
			back.setEnabled(browser.isBackEnabled());
			forward.setEnabled(browser.isForwardEnabled());
		}
		public void changing(LocationEvent event) {
		}
	};
	/* Build a table of contents. Open each HTML file
	 * found in the given folder to retrieve their title.
	 */
	final TitleListener tocTitleListener = new TitleListener() {
		public void changed(TitleEvent event) {
			titles[index] = event.title;
		}
	};
	final ProgressListener tocProgressListener = new ProgressListener() {
		public void changed(ProgressEvent event) {
		}
		public void completed(ProgressEvent event) {
			Browser browser = (Browser)event.widget;
			index++;
			boolean tocCompleted = index >= titles.length;
			if (tocCompleted) {
				browser.dispose();
				browser = new Browser(form, SWT.NONE);
				DocumentationViewer.browser = browser;
				form.layout(true);
				browser.addLocationListener(locationListener);
				list.removeAll();
				for (int i = 0; i < titles.length; i++) list.add(titles[i]);
				list.select(0);
				browser.setUrl(urls[0]);
				shell.setText("SWT Browser - Documentation Viewer");
				return;
			}
			shell.setText("Building index "+index+"/"+urls.length);
			browser.setUrl(urls[index]);
		}
	};
	openItem.addListener(SWT.Selection, new Listener() {
		public void handleEvent(Event e) {
			DirectoryDialog dialog = new DirectoryDialog(shell);
			String folder = dialog.open();
			if (folder == null) return;
			File file = new File(folder);
			File[] files = file.listFiles(new FilenameFilter() {
				public boolean accept(File dir, String name) {
					return name.endsWith(".html") || name.endsWith(".htm");
				}
			});
			if (files.length == 0) return;
			urls = new String[files.length];
			titles = new String[files.length];
			index = 0;
			for (int i = 0; i < files.length; i++) {
				try {
					String url = files[i].toURL().toString();
					urls[i] = url;
				} catch (MalformedURLException ex) {}
			}
			shell.setText("Building index");
			browser.addTitleListener(tocTitleListener);
			browser.addProgressListener(tocProgressListener);
			if (urls.length > 0) browser.setUrl(urls[0]);
		}
	});
	shell.open();
	while (!shell.isDisposed()) {
		if (!display.readAndDispatch()) display.sleep();
	}
	display.dispose();
}
}

