<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Eclipse Papercuts &#187; JavaScript</title>
	<atom:link href="http://www.vogella.de/blog/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.vogella.de/blog</link>
	<description>Tips around Java, Eclipse and Web programming</description>
	<lastBuildDate>Tue, 31 Aug 2010 09:48:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Browser Tales &#8211; Java to JavaScript and vice versa with the SWT Browser Widget</title>
		<link>http://www.vogella.de/blog/2009/12/21/javascript-swt/</link>
		<comments>http://www.vogella.de/blog/2009/12/21/javascript-swt/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 16:54:21 +0000</pubDate>
		<dc:creator>Lars Vogel</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[SWT]]></category>

		<guid isPermaLink="false">http://www.vogella.de/blog/?p=1675</guid>
		<description><![CDATA[The SWT Browser widget makes it very easy to run HTML a [...]]]></description>
			<content:encoded><![CDATA[<!--S-ButtonZ 1.1.5 Start--><div style="float: right; width: 42px; padding-right: 10px; margin: 0 0 0 10px;">
		<script type="text/javascript">
		<!--
		var dzone_url = "http://www.vogella.de/blog/2009/12/21/javascript-swt/";
		var dzone_title = "Browser Tales &#8211; Java to JavaScript and vice versa with the SWT Browser Widget";
		var dzone_style = "1";
		var dzone_blurb = "";
		//-->
		</script>
		<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script></div><!--S-ButtonZ 1.1.5 End--><p>The SWT Browser widget makes it very easy to run HTML and JavaScript within Eclipse. This widget encapsulates a browser (system dependent) into a SWT widget. </p>
<p>The following screenshot is from the second example below. This example is based on a <a href="http://eclipsesource.com/blogs/2009/06/16/eclipse-galileo-feature-top-10-list-number-9/">blog entry from Ian Bull</a> and <a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet307.java?view=co">SWT Snippet 307</a>.</p>
<p><a href="http://www.vogella.de/blog/wp-content/uploads/2009/12/swtexample.gif"><img src="http://www.vogella.de/blog/wp-content/uploads/2009/12/swtexample.gif" alt="swtexample" width="661" height="608" class="aligncenter size-full wp-image-1688" /></a></p>
<p>The following coding will be defining views for <a href="http://www.vogella.de/articles/RichClientPlatform/article.html">Eclipse RCP</a> or via <a href="http://www.vogella.de/articles/EclipsePlugIn/article.html">Eclipse plugins</a> so I assume you are familiar with these topics. </p>
<p>Lets start with a simple example. Via the following coding you can setup a View in your Eclipse RCP and inject some JavaScript from your Java Code.</p>
<pre class="brush: java;">
package de.vogella.javascript.simple;

import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.ProgressEvent;
import org.eclipse.swt.browser.ProgressListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;

public class View extends ViewPart {
	public static final String ID = &quot;de.vogella.javascript.simple.view&quot;;

	public void createPartControl(Composite parent) {
		// You need XULRunner installed to use this line
//		final Browser b = new Browser(parent, SWT.MOZILLA);
		final Browser b = new Browser(parent, SWT.NONE); // Uses IE on MS Windows
		b.setUrl(&quot;http://www.vogella.de&quot;);
		b.addProgressListener(new ProgressListener() {
			@Override
			public void completed(ProgressEvent event) {
				System.out.println(&quot;Page loaded&quot;);
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				// Execute JavaScript in the browser
				b.execute(&quot;alert(\&quot;JavaScript, called from Java\&quot;);&quot;);
			}
			@Override
			public void changed(ProgressEvent event) {
			}
		});
	}

	/**
	 * Passing the focus request to the viewer's control.
	 */
	public void setFocus() {
	}
}
</pre>
<p>The next example is a bit more complex (it is the example from the screenshot).  This demonstarte how JavaScript can also call back to your Java Code. </p>
<pre class="brush: java;">

package de.vogella.javascript.maps;

import java.io.File;

import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.BrowserFunction;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.List;
import org.eclipse.ui.part.ViewPart;

public class View extends ViewPart {

	public static final String ID = &quot;de.vogella.javascript.maps.view&quot;;
	private static List list;

	public void createPartControl(Composite parent) {
		SashForm sash = new SashForm(parent, SWT.HORIZONTAL);

		File f = new File(&quot;C:/temp/demofile/map.html&quot;);
		final Browser browser = new Browser(parent, SWT.NONE); // Uses IE on MS

		browser.addControlListener(new ControlListener() {
			public void controlResized(ControlEvent e) {
				// Use Javascript to set the browser width and height
				browser
						.execute(&quot;document.getElementById('map_canvas').style.width= &quot;
								+ (browser.getSize().x - 20) + &quot;;&quot;);
				browser
						.execute(&quot;document.getElementById('map_canvas').style.height= &quot;
								+ (browser.getSize().y - 20) + &quot;;&quot;);
			}

			public void controlMoved(ControlEvent e) {
			}
		});

		 new CustomFunction (browser, &quot;theJavaFunction&quot;);

		    Composite c = new Composite(sash, SWT.BORDER);
		    c.setLayout(new GridLayout(2, true));
		    Button b = new Button(c, SWT.PUSH);
		    b.setText(&quot;Where Am I ?&quot;);
		    b.addSelectionListener(new SelectionAdapter() {
		        public void widgetSelected(SelectionEvent e) {
		            double lat = ((Double) browser.evaluate(&quot;return map.getCenter().lat();&quot;)).doubleValue();
		            double lng = ((Double) browser.evaluate(&quot;return map.getCenter().lng();&quot;)).doubleValue();
		            list.add(lat + &quot; : &quot; + lng);
		        }
		    });

		    Button addMarker = new Button(c, SWT.PUSH);
		    addMarker.setText(&quot;Add Marker&quot;);
		    addMarker.addSelectionListener(new SelectionAdapter() {
		        public void widgetSelected(SelectionEvent e) {
		            browser.evaluate(&quot;createMarker();&quot;);

		        }
		    });
		    list = new List(c, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
		    GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
		    gridData.horizontalSpan=2;
		    list.setLayoutData(gridData);

		    browser.setUrl(f.toURI().toString());
//		    sash.setWeights(new int[] {4,1});
	}

	/**
	 * Passing the focus request to the viewer's control.
	 */
	public void setFocus() {

	}

	 // Called by JavaScript
	 class CustomFunction extends BrowserFunction {
	    CustomFunctionData data = new CustomFunctionData(null);

		CustomFunction (Browser browser, String name) {
	        super (browser, name);
	        this.data.browser = browser;
	    }
	    public Object function (Object[] arguments) {
	        double lat = ((Double) arguments[0]).doubleValue();
	        double lng = ((Double) arguments[1]).doubleValue();
	        list.add(lat + &quot; : &quot; + lng);
	        data.browser.execute(&quot;document.getElementById('map_canvas').style.width= &quot;+ (data.browser.getSize().x - 20) + &quot;;&quot;);
	        data.browser.execute(&quot;document.getElementById('map_canvas').style.height= &quot;+ (data.browser.getSize().y - 20) + &quot;;&quot;);
	        return null;
	    }
	 }
}
</pre>
<p>The coding above reads a HTML (with some JavaScript code) file &#8220;C:/temp/demofile/map.html&#8221;. If you save it somewhere else you need to adjust line 28 in the coding above. </p>
<pre class="brush: xml;">
&lt;!DOCTYPE html &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; 

 &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;

&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;

  &lt;head&gt;

    &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-8&quot;/&gt;

    &lt;title&gt;Google Maps JavaScript API Example&lt;/title&gt;

    &lt;script src=&quot;http://maps.google.com/maps?file=api&amp;amp;v=2&amp;amp;key=abcdefg&amp;sensor=false&quot;
            type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot;&gt;

	var map;

    function initialize() {
      if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById(&quot;map_canvas&quot;));
        map.setCenter(new GLatLng(37.4419, -122.1419), 13);
        map.setUIToDefault();

		// Callback to Java from JavaScript
	    theJavaFunction(map.getCenter().lat(), map.getCenter().lng());

      }

    }

    function createMarker(){
		var lat = map.getCenter().lat();
		var lng = map.getCenter().lng();
        var point = new GLatLng(lat,lng);
		var d=new Date();

		var marker = new GMarker(point, {draggable: true});

		GEvent.addListener(marker, &quot;dragstart&quot;, function() {
			map.closeInfoWindow();
		});

		GEvent.addListener(marker, &quot;dragend&quot;, function() {
		});

		map.addOverlay(marker);
		addMassiveData();

    }

	function addMassiveData(){
	// Add 10 markers to the map at random locations
		var bounds = map.getBounds();
        var southWest = bounds.getSouthWest();
        var northEast = bounds.getNorthEast();
        var lngSpan = northEast.lng() - southWest.lng();
        var latSpan = northEast.lat() - southWest.lat();
        for (var i = 0; i &lt; 100; i++) {
         var point = new GLatLng(southWest.lat() + latSpan * Math.random(),
               southWest.lng() + lngSpan * Math.random());
        map.addOverlay(new GMarker(point));
		}
	}

    &lt;/script&gt;

  &lt;/head&gt;

  &lt;body onload=&quot;initialize()&quot; &gt;

    &lt;div id=&quot;map_canvas&quot; style=&quot;width: 600px; height: 400px&quot;&gt;&lt;/div&gt;

  &lt;/body&gt;

&lt;/html&gt;
</pre>
<p>This should demonstrate how easy you can integrate HTML and JavaScript into Eclipse. This is something the <a href="http://wiki.eclipse.org/E4/OpenSocialGadgets">Eclipse E4 OpenSocial Gadget</a> project also targets. </p>
<p>Check it out! The <a href="http://www.vogella.de/articles/OpenSocialGadgets/article.html">Open Social Gadgets with Eclipse E4 &#8211; Tutorial</a> tries to give a little introduction. </p>
<div style="clear:both;">&nbsp;</div>]]></content:encoded>
			<wfw:commentRss>http://www.vogella.de/blog/2009/12/21/javascript-swt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
