/*******************************************************************************
 * Copyright (c) 2018 Red Hat 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:
 *     Red Hat - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.tests.gtk.snippets;


import java.util.Properties;

import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

/**
 * Copied and adapted from Snippet128
 * 
 * Web-Browser that loads a static HTML page.
 * Then it uses some JavaScript to modify background.
 * @author lufimtse
 *
 */

public class Bug430538_JS_Set_Background {
	public static void main(String[] args) {
		Display display = new Display();
		final Shell shell = new Shell(display);
		GridLayout gridLayout = new GridLayout();
		gridLayout.numColumns = 1;
		shell.setLayout(gridLayout);
		
		Button executeJS = new Button(shell, SWT.PUSH);
		executeJS.setText("Execute JS (Red background)");
		
		Button evauateJS = new Button(shell, SWT.PUSH);
		evauateJS.setText("Evaluate JS (Green with return val)");
		
		Button evaluateGetId = new Button(shell, SWT.PUSH);
		evaluateGetId.setText("Get paragraph content");
		
		Button execDefineMethod = new Button(shell, SWT.PUSH);
		execDefineMethod.setText("Define a method");
		
		Button execUseNewlyDefineMethod = new Button(shell, SWT.PUSH);
		execUseNewlyDefineMethod.setText("Use newly defined method");
		
		final Browser browser = new Browser(shell, SWT.WEBKIT);
		GridData gd = new GridData();
		gd.horizontalAlignment = GridData.FILL;
		gd.verticalAlignment = GridData.FILL;
		gd.grabExcessHorizontalSpace = true;
		gd.grabExcessVerticalSpace = true;
		browser.setLayoutData(gd);
		String html = "<body>Hello<br>world</body>";
		browser.setText(html);
		
		// Append Webkit version into snippet title.
		String SWT_WEBKITGTK_VERSION = "org.eclipse.swt.internal.webkitgtk.version"; //$NON-NLS-1$
		Properties sp = System.getProperties();
		String webkitGtkVer = sp.getProperty(SWT_WEBKITGTK_VERSION);
		shell.setText("Webkit version: " + webkitGtkVer);
		
		// EXECUTE 
		executeJS.addListener(SWT.MouseDown, ev -> {
			String script = "document.body.style.backgroundColor = 'red'; function hullo() {return 'hi'}; hullo()";
			browser.execute(script);
		});
		
		
		// EVALUATE << NOT EXECUTE.
		evauateJS.addListener(SWT.MouseDown, ev -> {
			String script = "return 1 + 2; document.body.style.backgroundColor = 'green'; function hullo() {return 'hi'}; hullo()";
			String result = (String) browser.evaluate(script);
			System.out.println("Java: returned: " + result);
		});

		evaluateGetId.addListener(SWT.MouseDown, ev -> { 
			String script = "function hullo() {return document.getElementById('myid').childNodes[0].nodeValue;}; hullo()";
			String result = (String) browser.evaluate(script);
			System.out.println("Java: returned: " + result);
		});
		
		execDefineMethod.addListener(SWT.MouseDown, ev -> { 
			String script = "function myNewFunc() {document.body.style.backgroundColor = 'red';return 'hello world'}";
			browser.execute(script);
		});
		execUseNewlyDefineMethod.addListener(SWT.MouseDown, ev -> { 
			String script = "myNewFunc()";
			browser.execute(script);
		});
		
		
 	    shell.open();
	    while (!shell.isDisposed ()) {
	        if (!display.readAndDispatch ()) display.sleep ();
	    }
	    display.dispose ();
	}
}
