/******************************************************************************* * Copyright (c) 2000, 2009 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 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 (new SelectionAdapter () { @Override public void widgetDefaultSelected (SelectionEvent 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, new Listener () { @Override public void handleEvent (Event 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); } } } } }