/*******************************************************************************
 * Copyright (c) 2000, 2013 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.swt.snippets;

/*
 * Browser example snippet: View DOM tree and edit node values in a Mozilla Browser
 * 
 * IMPORTANT: For this snippet to work properly all of the requirements
 * for using JavaXPCOM in a stand-alone application must be satisfied
 * (see http://www.eclipse.org/swt/faq.php#howusejavaxpcom).
 * 
 * For a list of all SWT example snippets see
 * http://www.eclipse.org/swt/snippets/
 * 
 * @since 3.3
 */
import static org.eclipse.swt.events.SelectionListener.*;

import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.mozilla.interfaces.*;

public class Snippet323 {

public static void main (String[] args) {
	new Snippet323 ().run ();
}

void run () {
	final Display display = new Display ();
	final Shell shell = new Shell (display);
	shell.setBounds (10,10,500,500);
	shell.setLayout (new FillLayout ());
	final Browser browser = new Browser (shell, SWT.MOZILLA);
	browser.setUrl ("http://www.google.com");
	browser.addProgressListener (new ProgressAdapter () {
		@Override
		public void completed (ProgressEvent event) {
			nsIWebBrowser webBrowser = (nsIWebBrowser)browser.getWebBrowser ();
			nsIDOMWindow domWindow = webBrowser.getContentDOMWindow ();
			nsIDOMDocument document = domWindow.getDocument ();
			nsIDOMElement documentElement = document.getDocumentElement ();
			DOMEditor domEditor = new DOMEditor (shell);
			domEditor.populate (documentElement);
		}
	});

	shell.open ();
	while (!shell.isDisposed ()) {
		if (!display.readAndDispatch ()) display.sleep ();
	}
	display.dispose ();
}

class DOMEditor {
	Tree tree;

	public DOMEditor (Shell parent) {
		super ();
		Shell shell = new Shell (parent, SWT.SHELL_TRIM);
		shell.setText ("DOM Editor");
		shell.setBounds (510,10,400,400);
		shell.setLayout (new FillLayout ());

		tree = new Tree (shell, SWT.NONE);
		shell.open ();
		final TreeItem[] lastItem = new TreeItem[1];
		final TreeEditor editor = new TreeEditor (tree);
		tree.addSelectionListener (widgetDefaultSelectedAdapter(e -> {
			final TreeItem item = (TreeItem)e.item;
			final nsIDOMNode node = (nsIDOMNode)item.getData ();
			if (node == null) return; 	/* not editable */
			if (item != null && item == lastItem[0]) {
				final Composite composite = new Composite (tree, SWT.NONE);
				final Text text = new Text (composite, SWT.NONE);
				final int inset = 1;
				composite.addListener (SWT.Resize, e -> {
					Rectangle rect = composite.getClientArea ();
					text.setBounds (rect.x + inset, rect.y + inset, rect.width - inset * 2, rect.height - inset * 2);
				});
				Listener textListener = new Listener () {
					@Override
					public void handleEvent (final Event e) {
						switch (e.type) {
							case SWT.FocusOut:
								String string = text.getText ();
								node.setNodeValue (string);
								item.setText ("Node Value: " + node.getNodeValue ());
								composite.dispose ();
								break;
							case SWT.Verify:
								String newText = text.getText ();
								String leftText = newText.substring (0, e.start);
								String rightText = newText.substring (e.end, newText.length ());
								GC gc = new GC (text);
								Point size = gc.textExtent (leftText + e.text + rightText);
								gc.dispose ();
								size = text.computeSize (size.x, SWT.DEFAULT);
								editor.horizontalAlignment = SWT.LEFT;
								Rectangle itemRect = item.getBounds (), rect = tree.getClientArea ();
								editor.minimumWidth = Math.max (size.x, itemRect.width) + inset * 2;
								int left = itemRect.x, right = rect.x + rect.width;
								editor.minimumWidth = Math.min (editor.minimumWidth, right - left);
								editor.minimumHeight = size.y + inset * 2;
								editor.layout ();
								break;
							case SWT.Traverse:
								switch (e.detail) {
									case SWT.TRAVERSE_RETURN:
										string = text.getText ();
										node.setNodeValue (string);
										item.setText ("Node Value: " + node.getNodeValue ());
										//FALL THROUGH
									case SWT.TRAVERSE_ESCAPE:
										composite.dispose ();
										e.doit = false;
								}
								break;
						}
					}
				};
				text.addListener (SWT.FocusOut, textListener);
				text.addListener (SWT.Traverse, textListener);
				text.addListener (SWT.Verify, textListener);
				editor.setEditor (composite, item);
				String nodeValue = node.getNodeValue ();
				text.setText (nodeValue == null ? "null" : nodeValue);
				text.selectAll ();
				text.setFocus ();
			}
			lastItem [0] = item;
		}));
	}

	public void populate (nsIDOMElement element) {
		tree.removeAll ();
		TreeItem root = new TreeItem (tree, SWT.NONE);
		root.setText ("Root: " + element.getTagName ());
		populate (root, element);
	}

	void populate (TreeItem parentItem, nsIDOMNode node) {
		String nodeName = node.getNodeName ();
		if (nodeName.length () > 0) {
			new TreeItem (parentItem, SWT.NONE).setText ("Node Name: " + nodeName);
		}
		String localName = node.getLocalName ();
		if (localName != null && localName.length () > 0) {
			new TreeItem (parentItem, SWT.NONE).setText ("Local Name: " + localName);			
		}

		TreeItem valueItem = new TreeItem (parentItem, SWT.NONE);
		String nodeValue = node.getNodeValue ();
		valueItem.setText ("Node Value: " + nodeValue);
		if (node != null) {
			valueItem.setData (node);
			Color red = parentItem.getDisplay ().getSystemColor (SWT.COLOR_RED);
			valueItem.setForeground (red);
		}

		String prefix = node.getPrefix ();
		if (prefix != null && prefix.length () > 0) {
			new TreeItem (parentItem, SWT.NONE).setText ("Prefix: " + prefix);			
		}
		String namespaceURI = node.getNamespaceURI ();
		if (namespaceURI != null && namespaceURI.length () > 0) {
			new TreeItem (parentItem, SWT.NONE).setText ("Namespace URI: " + namespaceURI);			
		}

		nsIDOMNamedNodeMap attributes = node.getAttributes ();
		if (attributes != null) {
			int count = (int)attributes.getLength ();
			if (count > 0) {
				for (int i = 0; i < count; i++) {
					TreeItem attributeItem = new TreeItem (parentItem, SWT.NONE);
					nsIDOMNode child = attributes.item (i);
					attributeItem.setText ("Attribute " + i + " (" + child.getNodeName () + ")");
					populate (attributeItem, child);
				}
			}
		}
		String typeString;
		switch (node.getNodeType ()) {
			case 1: typeString = "ELEMENT_NODE"; break;
			case 2: typeString = "ATTRIBUTE_NODE"; break;
			case 3: typeString = "TEXT_NODE"; break;
			case 4: typeString = "CDATA_SECTION_NODE"; break;
			case 5: typeString = "ENTITY_REFERENCE_NODE"; break;
			case 6: typeString = "ENTITY_NODE"; break;
			case 7: typeString = "PROCESSING_INSTRUCTION_NODE"; break;
			case 8: typeString = "COMMENT_NODE"; break;
			case 9: typeString = "DOCUMENT_NODE"; break;
			case 10: typeString = "DOCUMENT_TYPE_NODE"; break;
			case 11: typeString = "DOCUMENT_FRAGMENT_NODE"; break;
			case 12: typeString = "NOTATION_NODE"; break;
			default: typeString = "unknown?!?";
		}
		new TreeItem (parentItem, SWT.NONE).setText ("Type: " + typeString);

		nsIDOMNodeList children = node.getChildNodes ();
		int count = (int)children.getLength ();
		if (count > 0) {
			for (int i = 0; i < count; i++) {
				TreeItem childItem = new TreeItem (parentItem, SWT.NONE);
				nsIDOMNode child = children.item (i);
				childItem.setText ("Child " + i + " (" + child.getNodeName () + ")");
				populate (childItem, child);
			}
		}
	}
}

}
